2015-12-15 10 views
0

это первый раз, когда я работаю с волновыми файлами. Проблема в том, что я не совсем понимаю, как правильно читать сохраненные данные. Мой код для чтения:Прочитайте данные из файла wav перед применением FFT

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 битами на выборку и частоты дискретизации 11025Hz.

Выходные данные дают мне (после обновлений) значения от 0 до 255, поэтому значения являются правильными значениями PCM для 8-битной модуляции. Но, любая идея, что BUFFER_SIZE было бы желательно правильно прочитать эти значения?

WAV файлов я использую: http://www.wavsource.com/movies/2001.htm (daisy.wav)

TXT выход: https://paste.ee/p/pXGvm

+2

Вы имели в виду от -128 до 127 (вместо 172)? И причина, по которой вы видите подписанные значения, заключается в том, что вы сохраняете их в int8, который подписан. uint8 is unsigned – Borgleader

+0

true, я виноват, я изменил свой код. Теперь он дает мне четыре разных значения: 128, 127, 87, 0. Тем не менее я точно не знаю, как это правильно? – user3038744

+1

У нас нет данных, поэтому я не вижу, как мы можем знать, правильны ли эти значения или нет. – Borgleader

ответ

0

У вас есть две общие ситуации. Во-первых, где WAV-файл представляет собой короткий образец звука, и вы хотите прочитать все это в памяти и манипулировать им. Таким образом, BUFFER_SIZE является переменной. В основном вы ищете конец файла, чтобы получить его размер, а затем загрузите его.

Вторая распространенная ситуация заключается в том, что WAV-файл представляет собой довольно долгую запись звука, и вы хотите обрабатывать его кусочно, часто, записывая на устройство вывода в реальном времени. Таким образом, BUFFER_SIZE должен быть достаточно большим, чтобы держать кусок размером с укусом, но не такой большой, что вам требуется чрезмерная память. Теперь часто размер «кадра» аудио предоставляется самим устройством вывода, он ожидает, что 25 выборок в секунду синхронизируются с видео или что-то подобное. Обычно вам нужен двойной буфер, чтобы гарантировать, что вы всегда сможете удовлетворить спрос на большее количество образцов, когда заканчивается ЦАП (цифро-аналоговый преобразователь). Затем при выдаче образца вы загружаете следующий фрагмент данных с диска. Иногда нет никакого «правильного» значения для размера куска, вы просто должны пойти с чем-то довольно разумным, который уравновешивает объем памяти в зависимости от количества вызовов.

Если вам нужно сделать FFT, нормально использовать размер буфера, который является мощностью двух, чтобы упростить преобразование. Размер, который вам нужен, зависит от самой низкой частоты, которую вы интересуете.