Да, это может быть сделано.
Все, что вам нужно, это быстрый алгоритм БПФ!
Сначала определите желаемое частотное разрешение, например, вы можете установить частоту дискретизации с микрофона на 8000 Гц, а теперь выберите один размер фрагмента, например 1024 или 2048, для захвата с микрофона.
Если вы выберете 2048 точек и частоту дискретизации 8000, у вас будет разрешение по частоте = 3,9063 (8000/2048).
Примените одну оконную функцию к вашим 2048 точкам, затем примените БПФ и получите величину!
Помните о частоте дискретизации теоремы Найквиста = 8000/2 = 4000, теперь вы знаете, что ваше БПФ может получать частоты между 3,9063 Гц и 4000 Гц.
Бин FFT соответствующих частот:
1 -> 3,90625 hz
2 -> 7,8125 hz
3 -> 11,71875 hz
...
1024 -> 4000 hz
...
2048 - > 8000 hz
Для этого вам нужны только первые половины значений БПФ, в данном случае 1024.
Теперь, если вы построите эти данные из своего БПФ, у вас будет спектр!
ИЗМЕНИТЬ
Псевдокод:
#construct one hanning window Function
Chunk = 2048;
windowed = [Chunk];
hanning = [Chunk];
for i 1:Chunk:
hanning[i] = ((1 - cos(i*2*pi/Chunk-1))/2)
#start capture from Mic
while true:
#into values capture 2048 points from your mic
values=dataFromMic(Chunk);
#Apply Window hanning = multiply window function(hanning) over your 2048 points
for i 1:Chunk:
windowed[i] = values[i] * hanning[i]
#Apply FFT
fftData=fft(windowed);
#Get Magnitude (linear scale) of first half values
Mag=abs(fftData(1:Chunk/2))
# update/show results
plot(Mag)
end
person
ederwander
schedule
19.08.2013