c ++ применение БПФ к данным файла wav

Я впервые работаю с файлами wav и fft. Учитывая следующий код:

    char* loadWAV(const char* fn, int& chan, int& samplerate, int& bps, int& size){
        char buffer[4];
        ifstream in(fn, ios::binary);
        in.read(buffer, 4);                                                             //ChunkID "RIFF"
        if(strncmp(buffer, "RIFF", 4) != 0){ 
                cerr << "this is not a valid wave file";
                return NULL;
        }   
        in.read(buffer,4);                                                              //ChunkSize 
        in.read(buffer,4);                                                              //Format "WAVE"
        in.read(buffer,4);                                                              // "fmt "
        in.read(buffer,4);                                                              // 16
        in.read(buffer,2);                                                              // 1
        in.read(buffer,2);                                                              // NUMBER OF CHANNELS
        chan = convertToInt(buffer,2);
        in.read(buffer,4);                                                              // SAMPLE RATE
        samplerate = convertToInt(buffer,4);
        in.read(buffer,4);                                                              // ByteRate
        in.read(buffer,2);                                                              // BlockAlign
        in.read(buffer,2);                                                              // bits per sample
        bps = convertToInt(buffer,2);
        in.read(buffer,4);                                                              // "data"
        in.read(buffer,4);
        size = convertToInt(buffer,4);
        char * data = new char[size];
        in.read(data,size);
        return data;
}

Я предполагаю, что указатель данных содержит нужную мне информацию, но я не знаю, как распознать эту информацию. Я использую это как ссылку, но я не знаю, что сделать из аспекта «правый канал - левый канал» и как подготовить эти данные для использования в БПФ. Если у вас есть какие-либо ссылки на хорошую документацию по этому поводу, я ценю это, мои усилия по поиску пока привели к NILL.

edit: также Если бы кто-нибудь мог указать мне на хорошее руководство по работе с файлами формата wav на этом уровне, я был бы очень признателен. Заранее спасибо.


person ritual_code    schedule 17.02.2014    source источник
comment
Вы знаете, в каком формате вы хотите получить данные? Чего ожидает ваша функция БПФ?   -  person RJFalconer    schedule 18.02.2014
comment
Что касается левого / правого: на сайте говорится, что стерео источник будет иметь двойной размер выборки (см., Как ByteRate умножается на numChannels), и что левый / правый поток будет чередоваться с чередованием (данный фрагмент Subchunk2Size содержит обе стороны).   -  person RJFalconer    schedule 18.02.2014
comment
Я вижу, мне нужно просмотреть файл wavread.m в исходном коде октавы GNU, и он, кажется, принимает во внимание эту логику при его чтении. Я попытаюсь скопировать его в C ++. Я пытаюсь выполнить обнаружение импульсов, и, судя по виду вектора, созданного с помощью функции Octave wavread, мне может не понадобиться БПФ. построение графика зависимости от времени дает мне частоты с течением времени. Теперь мне нужно выяснить, как использовать данные при воспроизведении звука для синхронизации и обнаружения импульсов.   -  person ritual_code    schedule 19.02.2014


Ответы (1)


У вас есть данные в пакетах PCM.

Попробуйте эти вопросы в качестве отправной точки:

Что касается части вашего вопроса, связанной с БПФ, вы можете рассмотреть вопрос https://dsp.stackexchange.com/.

person RJFalconer    schedule 18.02.2014
comment
Я думал об использовании кода в источнике октавы GNU (wavread.m). Он удобно считывает данные в вектор и построение графика дает мне правильные частоты. переводит его в функцию C ++ - путь к успеху? Это означало бы, что мне нужно обработать данные заранее и найти способ синхронизировать поток данных со звуком. следует ли мне использовать многопоточность, если я использую openal для воспроизведения потока wav из отдельного сэмплбуфера? - person ritual_code; 19.02.2014
comment
Я пытаюсь сделать определение пульса, конечная цель - заставить робота танцевать под wav файл. Спасибо. - person ritual_code; 19.02.2014
comment
Это много вопросов. RE: C ++, используйте тот язык, который вам удобнее. C ++ - хороший вариант. RE: синхронизировать потоки, это обычно довольно сложно. RE: многопоточность, скорее всего, но вы должны сосредоточиться на том, чтобы заставить его работать с одним большим буфером, прежде чем переходить на шаблон производитель-потребитель. Надеюсь это поможет. - person RJFalconer; 19.02.2014