Решение весьма простое: я генерирую звуковой файл, с тремя гармониками, длительностью несколько секунд. Затем проигрываю его, и снимаю со входов звуковой карты. После чего фурьячу его и смотрю, остались ли гармоники, какая громкость и т.п. Пока всё отлаживаю минуя железо, так сказать просто со звуковым файлом. Файл генерирую так:
float amplitude = 16000; float freq_Hz = 100; /* fill buffer with a sine wave */ for (i=0 ; i<размер_буфера; i++) { buffer[i] = (int)(amplitude/10 * sin((float)(2*M_PI*i*freq_Hz/S_RATE))); buffer[i] +=(int)(amplitude/20 * sin((float)(2*M_PI*i*10*freq_Hz/S_RATE))); buffer[i] +=(int)(amplitude * sin((float)(2*M_PI*i*100*freq_Hz/S_RATE))); } write_wav("test.wav", размер_буфера, buffer, S_RATE);
Обращаю внимание, что базовая амплитуда у нас равна 16 000, первая гармоника равна 1/10 основной амплитуды и составляет 1600 у.е. с частотой 100 Гц, вторая гармоника равна 1/20 основной амплитуды и равна 800 у.е. с частотой 1000 Гц, третья равна амплитуде = 16000 у.е. и частота равна 10 000 Гц.
Можно поглядеть полученный спектр программой Audacity

Спектр такой как должен быть
Немного помучашись с чтением wav-файла, а затем с БПФ получил такую красоту

Этот график для сопоставления с Audacity

Но более наглядный с логарифмическим масштабом по X
Но самый наглядный с логарифмическим масштабом по X и Y

График хоть в учебнике публикуй!
Но есть одна загвоздка, до которой не могу допереть! Это у меня спектр мощности! Я его считаю тривиально, из массива действительных и мнимых величин вычисляю вектор (вспоминаем теорему пифагора): sqrt(re[i]*re[i]+im[i]*im[i+1]) и вывожу его.
А вот не могу понять, как здесь получить реальное значение амплитуды? Именно вот цифры 1600, 800, 16000?
P.S. Долбанный ЖЖ не даёт вписать дефайн BUF_SIZE
UPD. Забыл включить нормирование:
void fft_calc( int p, // показатель двойки (например, для БПФ на 256 точек это 8) const float *c, // массив поворотных множителей БПФ const float *in, // входной массив float *out, // выходной массив int norm) // признак нормировки
Последний параметр был равен нулю. Поставил единице, и всё стало на свои места:
