AntFFT - небольшой набор функций для быстрого преобразования Фурье.

Библиотека предназначена для тех, кто не владеет C++, но хочет попробовать свои силы в использовании FFT.


Краткое описание API на русском языке: AntFFTapi.htm

Текущая версия: 1.0 Build: 23

Исходные тексты на C++: AntFFTsrc-1.0.23.zip (1 869 965 байт)

Компилированная библиотека .DLL: AntFFTdll-1.0.23.zip (125 218 байт)

Пример использования библиотеки на Delphi: testFFTdelphi.zip (6 745 байт)


Небольшое предисловие:

Разглядывая картинки в Спектралабе с результатами работы разных кодеров, возникла мысль: а не написать ли мне какую-нибудь программулину, которая бы упростила бы анализ кодеров. У меня были наброски проекта для одной задачи, который в дело не пошел, но в нем использовалась библиотека быстрого преобразования Фурье FFTW (http://www.fftw.org/). Достал исходники, немного покромсал их и стал гонять мой любимый Lame на разных режимах. Исходный Wav - это небольшой кусок моей любимой "Shine on you crazy diamond" из Pink Floyd. Результаты загнал в таблицу (см. описание тестовой программы), и так мне захотелось поделиться с кем-нибудь "достигнутым", что я не удержался, и недолго думая, послал результаты Александру Радзишевскому. В ответ получил заинтересованное письмо с предложением развить идею.

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

  1. считать WAV
  2. разложить по FFT
  3. получить амплитудные составляющие

А потом уже, с использованием ее написать что-нибудь посерьезнее. А может быть кто-нибудь раньше меня сможет это сделать.


Задача:

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

Александр предложил: вычесть амплитудные значения кодированного сигнала из некодированного сигнала и представить это в графике, где за 0 (прямая линия) будут взяты значения оригинального сигнала, а разница (в большую или меньшую сторону) будет отображаться соответствующими кривыми. (Остальные идеи он, видимо, предложит сам)

А здесь - место для других вариантов анализа


Тестовая программа на C++:

Это консольное приложение, написанное на VC 6.0

  1. Читает WAV, если указана оконная функция - накладывает соответствующее окно на считанные данные
  2. раздельно по каждому каналу получает спектр в комплексном виде
  3. Для каждой полосы рассчитывает амплитуду ( abs ) и угол ( arg ). Если указан ключик -F, то выводит результаты в файл
  4. Суммирует значения амплитуд. Делит количество частот на указанное ключиком -D (по умолчанию - 8) и выводит в файл результаты для каждого диапазона частот.
  5. По окончании расчетов, выводит в файл значение постоянной составляющей, суммы амплитуд и частоту с максимальной амплитудой

 

Опции командной строки:

testFFT.exe WavFileName.ext [options]
where options is:

-N -FFT size (default=65536)
-F|f -Print all data (F-on,f-off(default))
-S|s -Print sum by ranges(S-on(default),s-off)
-D -Number of ranges (default=8)
-W -windows function, may be: hamming,hanning,triangular or welch
else - no windows function

 


Тестовая программа на Delphi 5.0:

Я просто перенес исходный текст из C на Delphi, с соответствующими изменениями в синтаксисе. А заодно добавлены всякие кнопочки, которые в консольном варианте как опции командной строки.

Должен заметить, что я небольшой знаток Delphi (да и C тоже), так, пописываю по мелочи. И мои исходники вряд ли могут быть образцом для подражания. Да я и не сильно напрягался.

И еще, для вывода результатов я использовал TMemo, но он, видимо, имеет ограничения на объем выводимой информации, и если ее много - он перестает ее принимать.

 


Для функций работы с .WAV файлами использована библиотека libsndfile http://www.zip.com.au/~erikd/libsndfile/.

Для функций FFT-преобразования использована библиотека FFTW http://www.fftw.org/.

 

Если лень компилировать тесты - то можете взять уже компилированные testFFTexe.zip

Примечание: Результат FFT-преобразования без использования оконных функций практически идентичен Спектралабовскому "Uniform". А с использованием указанных функций - результат почти в два раза меньше. Причину я пока не понял.

 

Если возникнут вопросы, пишите мне: mailto:ant@kmbank.kuban.ru
Анатолий