это первый раз, когда я работаю с волновыми файлами.
Проблема в том, что я не совсем понимаю, как правильно читать хранимые данные. Мой код для чтения:
uint8_t* buffer = new uint8_t[BUFFER_SIZE];
std::cout << "Buffering data... " << std::endl;
while ((bytesRead = fread(buffer, sizeof buffer[0], BUFFER_SIZE / (sizeof buffer[0]), wavFile)) > 0)
{
//do sth with buffer data
}
Заголовок файла сэмпла дает мне информацию о том, что данные представляют собой PCM (1 канал) с 8 битами на выборку и частотой дискретизации 11025 Гц.
Выходные данные дают мне (после обновления) значения от 0 до 255, поэтому значения являются правильными значениями PCM для 8-битной модуляции. Но есть идеи, что BUFFER_SIZE предпочтительнее для правильного чтения этих значений?
WAV-файл, который я использую: http://www.wavsource.com/movies/2001.htm (Daisy.wav)
TXT выход: https://paste.ee/p/pXGvm
У вас есть две общие ситуации. Во-первых, файл WAV представляет собой короткий аудиофрагмент, и вы хотите прочитать все это в памяти и манипулировать им. Так что BUFFER_SIZE — это переменная. По сути, вы стремитесь к концу файла, чтобы получить его размер, а затем загружаете его.
Вторая распространенная ситуация заключается в том, что WAV-файл представляет собой довольно длинную аудиозапись, и вы хотите обрабатывать ее по частям, часто путем записи на устройство вывода в реальном времени. Таким образом, BUFFER_SIZE должен быть достаточно большим, чтобы содержать кусок размером с кусочек, но не настолько большим, чтобы вам требовалось чрезмерное количество памяти. Теперь часто размер «кадра» звука задается самим устройством вывода, он ожидает 25 выборок в секунду для синхронизации с видео или чем-то подобным. Как правило, вам нужен двойной буфер, чтобы гарантировать, что вы всегда сможете удовлетворить потребность в большем количестве сэмплов, когда ЦАП (цифро-аналоговый преобразователь) закончится. Затем, выдавая образец, вы загружаете следующую порцию данных с диска. Иногда не существует «правильного» значения для размера чанка, вам просто нужно пойти с чем-то достаточно разумным, которое уравновешивает объем памяти и количество вызовов.
Если вам нужно сделать БПФ, обычно используется размер буфера, который является степенью двойки, чтобы сделать быстрое преобразование проще. Размер, который вам нужен, зависит от самой низкой частоты, которая вас интересует.
Других решений пока нет …