我可以在互联网上找到的所有示例都只是可视化函数computeSpectrum
的结果数组,但我的任务是其他任务。
我生成一个音符,我需要通过分析结果数组来说出正在播放的音符。我想我需要设置函数调用的第二个参数' FFTMode'为真,然后它返回声音频率。我认为它应该只返回一个非零值,我可以用它来确定我使用Math.sin函数生成的音符,但事实并非如此。
有人可以建议我如何完成任务吗?使用soundMixer.computeSpectrum是一项要求,因为我将在稍后分析更复杂的声音。
答案 0 :(得分:2)
FFT 会将您的信号窗口转换为一组奈奎斯特正弦波,所以除非440Hz
是其中之一,否则您将获得的不仅仅是一个非零值!对于单个正弦波,由于混叠,您将获得2个频率。这是一个例子:
正如您所看到的精确奈奎斯特频率,FFT响应是单峰值,但对于附近频率,峰值更多。
由于信号的形状,您可以获得具有峰值而不是离散值的连续光谱。
i-th
样本的频率为f(i)=i*samplerate/N
,其中i={0,1,2,3,4,...(N/2)-1}
为样本索引(第一个为 DC 偏移,因此不是0
的频率)和N
是传递给 FFT 的样本数。
因此,如果您想要检测某些谐波(单个基频的倍数),请设置samplerate
和N
,以便samplerate/N
是它的基频或分频器。这样你就可以获得谐波sinwaves的一个峰值。放宽计算。