是的,可以做到。
您所需要的只是一个快速的 FFT 算法!
首先确定您想要的频率分辨率,例如您可以将麦克风的采样率设置为 8000hz,现在选择一个块大小(如 1024 或 2048)从麦克风中捕获。
如果您选择 2048 点和 8000 采样率,您会得到频率分辨率 = 3.9063 (8000 /2048)。
在 2048 个点上应用一个窗口函数,然后应用 FFT 并获得幅度!
记住奈奎斯特定理采样率 = 8000 / 2 = 4000,现在你知道你的 FFT 可以在 4000 Hz 时获得 3.9063 Hz 之间的频率吗?
对应频率的FFT Bin:
1 -> 3,90625 hz
2 -> 7,8125 hz
3 -> 11,71875 hz
...
1024 -> 4000 hz
...
2048 - > 8000 hz
为此,您只需要 FFT 的前半部分值,在本例中为 1024。
现在,如果您从 FFT 中绘制此数据,您将获得一个频谱!
编辑
伪代码:
#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