我可以在Internet上找到的所有示例都只是将函数computeSpectrum
的结果数组可视化,但是我要承担其他任务。
我生成一个音符,我需要通过分析结果数组来说出正在播放的音符。我发现我需要将函数调用“FFTMode”的第二个参数设置为true,然后它返回声音频率。我认为实际上它应该只返回一个非零值,我可以用它来确定使用Math.sin函数生成的音符,但事实并非如此。
有人可以建议我如何完成任务吗?必须使用soundMixer.computeSpectrum,因为稍后我将分析更复杂的声音。
最佳答案
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
是该基频或其分频器。这样,您将只获得谐波正弦波的一个峰值。简化计算。