2017-05-27 18 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