C ++ Является ли обработка звука в реальном времени PCM fft с помощью OpenAL?

Я работаю над проектом, который будет включать обработку аудиоданных PCM через fft во время воспроизведения, желательно синхронно. Я использую компилятор linux g ++ и в настоящее время читаю и воспроизводю аудиоданные с помощью OpenAL.

У меня такой вопрос: есть ли лучший способ обрабатывать аудиоданные PCM с помощью fft live, когда звук воспроизводится, а затем с использованием потоков? Если нет, то какую библиотеку потоков лучше всего использовать для этих целей.

это моя функция, которая загружает волновые данные в массив байтов, которые позже могут быть преобразованы в целые числа для обработки, и все, что я использую для воспроизведения данных, - это OpenAL.

    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;
}

спасибо за любую помощь.

изменить: всем, кто может быть заинтересован, я написал функцию, используя this как ссылка, чтобы узнать, как форматируется файл WAV


person ritual_code    schedule 15.02.2014    source источник
comment
Почему вас беспокоит, что потоки не будут работать? Что именно вас беспокоит?   -  person Pace    schedule 15.02.2014


Ответы (1)


Вы надеетесь выполнить БПФ с помощью OpenAL? Не знаю, возможно ли это. Ваш код, скорее всего, будет выполнять БПФ.

Вам не нужно явно настраивать какие-либо потоки. Однако ваша библиотека вывода звука, вероятно, сделает это от вашего имени. Я не знаком с OpenAL, но способ работы многих аудиобиблиотек заключается в том, что вы можете указать обратный вызов, который будет передавать больше звука на вывод. Таким образом, ваша основная программа будет загружать звук из аудиофайла, помещать его в буфер (вероятно, защищенный мьютексом) для чтения обратным вызовом аудио, вычислять БПФ над звуковым окном и, возможно, визуализировать данные для пользователя.

Опять же, звуковая библиотека, вероятно, будет управлять потоковой передачей, поэтому вам не нужно беспокоиться о точной реализации или библиотеке потоковой передачи. Но не забудьте правильно управлять общими данными с помощью мьютекса.

person Multimedia Mike    schedule 15.02.2014
comment
Кстати, знаете ли вы, могу ли я просто передать байтовый массив данных PCM в алгоритм БПФ как есть? - person ritual_code; 15.02.2014
comment
Все зависит от того, что хочет видеть функция БПФ. Если функции требуется массив коротких замыканий на C (16-битные числа со знаком), то это, вероятно, хорошо согласуется с данными из WAV-файла, находящегося на диске, при условии, что у вас небольшой процессор с прямым порядком байтов (и у вас, вероятно, есть). Если, однако, функция БПФ хочет получить массив из чисел C с плавающей запятой (32-битные числа с плавающей запятой одинарной точности), вам нужно сначала выполнить последовательность преобразований. - person Multimedia Mike; 15.02.2014
comment
Это WAV требует, чтобы он был проанализирован определенным образом? - person ritual_code; 15.02.2014
comment
В файле WAV может храниться множество различных типов данных. Вам нужно будет принять это во внимание при чтении файла WAV (отвергайте типы данных, которые вы не знаете, как анализировать). - person Multimedia Mike; 16.02.2014
comment
Не бойтесь задавать новые вопросы, углубляющиеся в эту тему. Как видно из моей ручки, я люблю говорить об этом. - person Multimedia Mike; 16.02.2014
comment
Ну .. вообще-то что-то есть. openal.org/documentation/openal-1.1-specification.pdf на В верхней части страницы 47 есть атрибут AL_FREQUENCY, в документе говорится, что к этому значению можно получить доступ через буфер, но это частота, которая мне нужна для обработки в реальном времени, или это неизменное число, описывающее WAV в целом? edit: также ли это та же частота, которую я получил бы, если бы передавал данные через fft? - person ritual_code; 16.02.2014
comment
В зависимости от контекста, в котором появляется AL_FREQUENCY (вместе с AL_BITS, AL_SIZE и AL_CHANNELS), он описывает частоту дискретизации (измеряемую в Гц, которая является мерой частоты) в буфере выборки. - person Multimedia Mike; 16.02.2014
comment
Как мне извлечь данные типа частотного спектра из моей переменной данных char *? - person ritual_code; 16.02.2014
comment
Пропустите данные через функцию БПФ. Эта цепочка становится немного длинной, и если вам нужно больше советов по этому поводу, вероятно, было бы лучше открыть новый вопрос, который потенциально может привлечь больше внимания. - person Multimedia Mike; 16.02.2014
comment
Спасибо за вашу помощь! Я играю с разными сгенерированными 1-секундными образцами для сравнения данных. - person ritual_code; 16.02.2014