2011-06-27 50 views
1

我最近使用FFT進行音高檢測,注意到雖然音符是正確的(例如C,D#等),但有很多音符位於錯誤的八度音階中(例如E2被歸類爲E3,C3被歸類爲C4,總是一個八度)。用於音高檢測的FFT

爲什麼會出現這種情況?我的算法是在計算FFT bin後,我得到最大強度的bin並計算它是哪個頻率。

對此有何幫助?謝謝!

+2

有多近了正確的倍頻和不正確的八度之間的強度? –

+0

什麼是您的數據來源?真實的聲音和樂器會產生泛音,這些泛音在您獲得的頻譜中可見。 –

+0

@Greg,有時很接近,有時候不會太遠......一般來說,錯誤的八度只比正確的八度稍高@Adam我的數據源是一個WAV文件(44.1KHz,單聲道,16位)這是一個原聲吉他的錄音(我只處理單聲道音樂) – user488792

回答

1

聽起來像諧波給我。格雷格的指出的問題似乎是正確的。

如果這是真的,你可以嘗試找到所有桶的統計中位數並找到最接近的,而不是找到統計模式(正如你現在所做的那樣)。

如果你看到在你的輸出變化,你也可以做時間平滑(平均超過時間)。

我知道吉他調音師做了幾個這樣的事情,但仍然斷斷續續地出現錯誤。這是一個混亂的業務:)

說到現場採樣,這取決於你的樣品來源,也有很多異常的考慮,可能是給你意想不到的效果:

  • 含蓄的聲音
  • 聲音中的聽不到的音調

這些將顯示在您的數據中,但您可能無法聽到它們。如果你想與多種音調或和絃相匹配,你的工作將變得更加複雜。

+0

嗨!很抱歉,但你能澄清一下我如何使用統計中位數來解決問題嗎?因爲,按照某種順序排列之後,中位數僅僅是中間點嗎? – user488792

+0

@ user488792:排序。你會把所有桶的重量,所有桶的總和除以桶的數量,然後繞到最近的桶。這與僅考慮所有桶的最大值形成對比,因爲其他桶的數據(不是最大值)不會被「拋出」。 –

2

兩個念頭: -

  1. 如果你的輸入和你的算法總是正好1個八度除了你所期望的那麼你就不能Accpet頭,你校準這樣的,總是減去一個八度?

  2. 當你拿着一把吉他弦時,你總會得到一個高一個八度的高次諧波(二次諧波),這個高度非常大 - 大約和自然(第一次諧波)一樣大。接下來你會得到1個八度以上的七音(三次諧波),但八度諧波真的很明顯。

0

在決定哪個八度音中放置一個音調,嘗試添加到每個桶一些分數是存在於3倍頻率的音頻的量(例如添加到440Hz的桶中的1320Hz的振幅的幾分之一桶)。在大多數儀器中,A440可能具有880Hz,1320Hz,1760Hz,2200Hz,2640Hz等重要分量.A880可能具有880Hz,1760Hz和2640Hz,但不會有明顯的1320Hz分量(也就是2220Hz)物)。因此,如果您的代碼試圖確定筆記是A440還是A880,則查看三次諧波桶(或其他奇數諧波)可能會提供有用的線索。

0

八度檢測可以是非常棘手的,特別是在其中的基本諧波和/或其它諧波缺少一個和絃信號。假設你正確地檢測到「音調」而不是「諧波」(參見下面的維基百科鏈接),那麼你可以使用我開發的八度檢測算法。

爲了進行PitchScope播放器的音高檢測,我決定採用如下工作的2階段算法:a)首先檢測音符的ScalePitch - 'ScalePitch'有12個可能的音高值:{E, F,F#,G,G#,A,A#,B,C,C#,D,D#}。並且在音符的ScalePitch和Time-Width被確定之後,b)然後通過檢查4個可能的Octave-Candidate音符的所有諧波來計算該音符的Octave(基音)。

我的基音檢測應用程序PitchScope Player的完整C++源代碼和可執行文件位於GitHub上(下面的鏈接),您可以編譯並逐步瞭解我的八度檢測算法的工作原理。

您想要關注FundCandidCalcer.cpp文件中的FundCandidCalcer :: Calc_Best_Octave_Candidate()函數,以便在C++中查看該算法。下圖也給出瞭如何計算八度的粗略想法。

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

https://github.com/CreativeDetectors/PitchScope_Player

下圖展示了我發展到選擇正確的倍頻候選音符(即正確的基礎)八度檢測算法,一旦該注意ScalePitch一直決心。

enter image description here