Ответ 1
Сложные данные чередуются с реальными компонентами при четных индексах и мнимыми компонентами при нечетных индексах, т.е. действительные компоненты имеют индекс 2*i
, мнимые компоненты имеют индекс 2*i+1
.
Чтобы получить величину спектра в индексе i, вы хотите:
re = fft[2*i];
im = fft[2*i+1];
magnitude[i] = sqrt(re*re+im*im);
Тогда вы можете построить величину [i] для я = 0 до N/2, чтобы получить спектр мощности. В зависимости от характера вашего аудиовхода вы должны увидеть один или несколько пиков в спектре.
Чтобы получить приблизительную частоту любого заданного пика, вы можете преобразовать индекс пика следующим образом:
freq = i * Fs / N;
где:
freq = frequency in Hz
i = index of peak
Fs = sample rate (e.g. 44100 Hz or whatever you are using)
N = size of FFT (e.g. 1024 in your case)
Примечание. Если вы ранее не применяли подходящую функцию окна для входных данных во временной области, тогда вы получите определенное количество спектральная утечка, и спектр мощности будет выглядеть довольно "размазанным".
Чтобы подробнее остановиться на этом, вот псевдокод для полного примера, где мы берем аудиоданные и идентифицируем частоту наибольшего пика:
N = 1024 // size of FFT and sample window
Fs = 44100 // sample rate = 44.1 kHz
data[N] // input PCM data buffer
fft[N * 2] // FFT complex buffer (interleaved real/imag)
magnitude[N / 2] // power spectrum
capture audio in data[] buffer
apply window function to data[]
// copy real input data to complex FFT buffer
for i = 0 to N - 1
fft[2*i] = data[i]
fft[2*i+1] = 0
perform in-place complex-to-complex FFT on fft[] buffer
// calculate power spectrum (magnitude) values from fft[]
for i = 0 to N / 2 - 1
re = fft[2*i]
im = fft[2*i+1]
magnitude[i] = sqrt(re*re+im*im)
// find largest peak in power spectrum
max_magnitude = -INF
max_index = -1
for i = 0 to N / 2 - 1
if magnitude[i] > max_magnitude
max_magnitude = magnitude[i]
max_index = i
// convert index of largest peak to frequency
freq = max_index * Fs / N