2017-05-27 40 views
0

我可以在互联网上找到的所有示例只是将函数computeSpectrum的结果数组可视化,但我负责其他任务。让声音更有意义Mixer.computeSpectrum

我生成一个音乐笔记,我需要通过分析结果数组来说出哪些音符正在播放。我发现我需要将函数调用'FFTMode'的第二个参数设置为true,然后返回声音频率。我认为它应该只返回一个非零值,我可以用它来确定使用Math.sin函数生成的注释,但事实并非如此。

有人可以提出一种方式,我可以完成任务吗?使用soundMixer.computeSpectrum是一项要求,因为我将在稍后分析更复杂的声音。

+0

你能告诉我们你到目前为止尝试过的吗? – crizzis

+0

是的,我当然可以,但没有错误。我复制了代码生成一个注释和代码用于可视化文档中的声音。不幸的是,没有用于分析数据的代码,也没有关于如何去做的任何解释,或者......也许我错过了一些东西。所以,这个问题更多的是理论上的问题,而不是一个错误。 – Graizik

+0

对不起,代码在这里提供的时间太长了,但你可以在文档中找到它。再次,我想使用computeSpectrum函数的结果来计算出与生成的声音相对应的一个主频率 – Graizik

回答

2

FFT将你的信号窗口转变为集奈奎斯特正弦波所以除非440Hz就是其中之一,你将获得的不仅仅是一个非零值更多!对于单个正弦波,由于混叠,您将获得2个频率。下面一个例子:

aliasing

正如你可以看到确切的奈奎斯特频率的FFT响应是单峰,但附近的频率有更多的峰值。

由于信号的形状,您可以获得具有峰值而不是离散值的连续谱。

频率i-th样品是f(i)=i*samplerate/Ni={0,1,2,3,4,...(N/2)-1}哪里是采样索引(第一个是DC偏移,从而不频率0)和N是传递给FFT样品的计数。

因此,如果你想检测一些谐波(单倍频基频)然后设置samplerateN所以samplerate/N是它的基本频率或分频器。这样你就可以获得谐波正弦波的一个峰值。缓和计算。

+0

我是否需要从FFT数组中取出最大值和其索引 - 它将是f(i)并计算采样率,即f(i)/ i * N? – Graizik

+0

@Graizik'samplerate'是声音采样的频率(在SoundCard或其他方面),因此通常是11025或44100或48000或192000 Hz我不知道您是否可以在您的平台上进行更改,'N'是可调整的,但** FFT **仅使用2的幂(如1,2,4,8,16,32,...)。所以你需要找到尽可能接近你的基本频率的'samplerate/N'组合。然后找到FFT结果中的最大峰值,那应该没问题。如果出现锯齿(你知道你只有一个音调,但有两个峰值,那么音调频率在两者之间) – Spektre

+0

@Graizik你的价值是什么? ...'采样率,N,音调频率,'峰值'i'(从0开始计数)?并且是单独的高峰还是不是? – Spektre