我可以在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 的样本计数。

因此,如果要检测一些谐波(单个基频的倍数),则设置samplerateN,以便samplerate/N是该基频或其分频器。这样,您将只获得谐波正弦波的一个峰值。简化计算。

09-17 15:35