Целое число аудио буфера, записанное в wav [PCM], создает высокий уровень шума

Я изо всех сил пытался правильно записать данные из аудио буфера в файл волны … Я проверил генерацию синусоидальной волны в файл WAV, и она работает нормально. Однако запись данных аудиобуфера как Int16 в файл wav приводит к постоянному высокому белому шуму. то есть я едва слышу то, что я играл на инструменте (сильно искажено). Аудио буферы берутся из входного буфера ASIO, используя ASIO SDK от Steinberg.

Эта функция вызывается при заполнении каждого входного буфера. Размер буфера составляет 176 сэмплов. Я копирую значение буфера с адреса, возвращенного с него, в указатель, называемый звуком. (Это работает без шума, если я вставлю синусоидальную волну здесь без буферов)

 void bufferSwitch(long index, ASIOBool processNow)   {for(int i=0; i<176; i++) {

memcpy(sound+soundcount,(Int16 *)bi.buffers[index]+i,2);

soundcount++;

}

}

Заголовок волны выглядит следующим образом. Заголовок работает и хорошо играет с синусоидой.

strcpy(WAV->ChunkID, "RIFF");
WAV->ChunkSize = (uint32_t)size - 8;
strcpy(WAV->RIFFType, "WAVE");

strcpy(Format->ChunkID, "fmt ");
Format->ChunkSize = 16;
Format->CompressionCode = 1;
Format->Channels = 1;
Format->SampleRate = (uint32_t)44100;
Format->SigBitsPerSamp = 16;
Format->BlockAlign = 2;
Format->AvgBytesPerSec = Format->BlockAlign * 44100;

strcpy(Datal->ChunkID, "data");
Datal->ChunkSize = 3 * 44100 *2;
sound = (Int16 *)(Datal + 1);

Тип образца, как указано в GetSampleType () из ASIO SDK, равен 16, то есть Int 16 LSB. Поэтому я использовал Int16 в качестве типа данных для образцов. Когда образцы печатаются с использованием printf, это дает низкие значения между +25 и -25 в каждом образце (это низкие значения, так как значения лежат между +32767 и -32767 в 16-битном pcm wav). Я не понимаю, как генерируется высокий шум. Однако при анализе через Audacity файл имеет много пиков, как и ожидалось из-за шума. Куда я иду не так, и проблема с порядком байтов в этом?

РЕДАКТИРОВАТЬ (решено):

Хорошо, я нашел ошибку. Как я уже говорил, вход и буферы были безупречны. Это была ошибка при записи данных. Ранее я использовал fwrite для записи буферов, которые привели к добавлению байтов мусора в файл. Теперь я использовал ofstream для записи данных, и это работает как по волшебству. Я думаю, что что-то не так с методом fwrite.

0

Решение

Я проверил wav-файл из шестнадцатеричного редактора и обнаружил некоторые интересные события. Данные безупречно записаны до 380 байтов. Затем большие целые числа мусора записываются примерно для 400 байтов. Однако, когда я печатаю значения из указателя, зацикливая его, значения точны.

Решением было использование ofstream для записи в файл вместо использования fwrite.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector