c# waveform - как отображать данные микрофона

Я пытаюсь отобразить сигнал (я записал себя в микрофон).

Хранить данные в массиве byte.

Кроме того, моя частота дискретизации составляет 44100, а размер выборки 16 бит.

Мой массив содержит только положительные значения, но в некоторых примерах я видел значения от -1,0 до 1,0. Почему это? Кроме того, если мой размер выборки составляет 16 бит и я использую массив байтов, мне нужно выполнить преобразование. Это то, что я пытался сделать до сих пор:

    double[] x = new double[Arc.Buffer.Count / 2];
    byte[] y = new byte[2];

                for (i = 0; i < Arc.Buffer.Count; i++)
                {
                    Array.Copy(Arc.Buffer.ToArray(), 2*i, y, 0, 2);
                    x[i] = (double)((y[1] << 8) | (y[0] & 0x00FF));
                }                

Но после этого кода мой массив x содержит огромные значения (а не от -1,0 до 1,0).

Я новичок в этой теме, и я буду признателен за любую помощь! (:


person user3162308    schedule 02.10.2015    source источник
comment
Я не знаю, почему вы получаете огромные значения, но для отображения данных в виде кривой я могу порекомендовать Oxyplot. Я использовал его раньше, и у него много классных и хорошо работающих функций.   -  person Breeze    schedule 02.10.2015
comment
У меня есть библиотека для отображения. я просто хочу знать, неверна ли моя логика... в моем примере я преобразовываю каждые 2 байта (потому что я использую размер выборки 16 бит) в удвоение. Я прав?   -  person user3162308    schedule 02.10.2015
comment
Извините, но у меня нет опыта работы с байтами. Вы отлаживали код, чтобы увидеть, что именно происходит?   -  person Breeze    schedule 02.10.2015
comment
Ну, это сводится к тому, что вы должны знать, как данные хранятся в массиве байтов. Это может быть shorts или short без знака, или сжатый вид с плавающей запятой небольшого диапазона или что-то еще. Простое приведение байтовых данных к double может привести или не привести к тому, что вам нужно, в зависимости от того, как выглядят исходные данные. Если бы мне пришлось угадывать, вероятно, нет. Прежде чем вы определитесь с исходным форматом данных, мы не можем дать вам много советов.   -  person Frank J    schedule 02.10.2015


Ответы (2)


Предполагая, что это данные PCM, возможно несколько форматов WAV/RIFF. Если ваш размер выборки составляет 16 бит, значения, которые вы читаете, будут подписаны между -32 768 и 32 767.

Быстрый поиск по запросу «форматы wav riff» обнаружил ресурс, посвященный синтаксическому анализу цифровые аудиоданные.

person redman    schedule 02.10.2015

Поскольку вы обрабатываете 16-битные выборки со знаком, значения будут находиться в диапазоне от -32768 до 32767. Чтобы получить двойную точность в диапазоне от -1,0 до 1,0, вам нужно разделить на 32768,0.

double[] x = new double[Arc.Buffer.Count / 2];
byte[] y = new byte[2];

for (i = 0; i < Arc.Buffer.Count; i++)
{
    Array.Copy(Arc.Buffer.ToArray(), 2*i, y, 0, 2);
    x[i] = ((y[1] << 8) | (y[0] & 0x00FF)) / 32768.0;
}          
person jaket    schedule 02.10.2015