2017-01-23 20 views
0

Буферы с плавающей запятой, которые я получаю от nAudio, кажутся действительно странными, когда я воспроизвожу звук, но звук в графическом виде отображает изображение, которое в основном похоже на шум. Мне потребовалось некоторое время, но я думаю, что я немного продвинулся, но я немного застрял.nAudio нечетные значения буфера из файлов воспроизведения

Выходящий массив с плавающей точкой имеет выравнивание по блоку 8, поэтому 4 поплавка на образец (я записываю на 16 бит, поэтому один плавающий элемент должен легко удерживать это. Однако есть 2 и часто 3 (для загрузки) поплавка за один образец. Я закончил рисовать его - Charts of Data. Верхнее изображение - это самое близкое, что я могу получить, чтобы восстановить волну, нижняя волна записана, а середина - это диаграмма необработанных данных.

Кажется, что каждый float просто держит байтовое значение, но я очень смущен относительно первого значения, которое, по-видимому, является своего рода масштабирующим фактором.

Прежде чем я углубится в подробности о том, что я нашел, я мог бы просто оставьте это, надеясь, что Марк точно узнает, как/почему я это вижу.

Моя самая лучшая попытка декодирования этих данных состоит в том, чтобы преобразовать числа в байты, а затем сдвинуть их влево, что обеспечивает верхнюю диаграмму присоединенного. Я уверен, что есть еще кое-что.

ответ

1

ОК, так что после немного более тонкой настройки я понял, что массив float был фактически массивом байтов от поплавков. Не уверен, что это имеет смысл, каждый «плавающий» в 4 поплавках на образец был сырыми битами, которые составляли поплавки.

В итоге это сделало невероятно легким переработку буфера в массив поплавков следующим образом;

_samplesToProcess = floatsIn.Length/WaveFormat.BlockAlign * WaveFormat.Channels; 
    if (_rawFloatsOut.Length < _samplesToProcess) 
     _rawFloatsOut = new float[_samplesToProcess]; 

    Buffer.BlockCopy(floatsIn, 0, _rawFloatsOut, 0, floatsIn.Length); 

    BufferProcessor(_rawFloatsOut);