2012-03-08 103 views
1

我已經研究過快速傅里葉變換,並且還沒有能夠看到一種方法來解碼來自一個信號的多個頻率。是否有辦法分解fft計算的結果,以便我們可以看到和絃中的單個音高,或者可以根據fft的結果計算最可能的和絃?多音高檢測:FFT還是其他?

如果不是,還有另一種音高檢測方法可以檢測現場設置中的多個音高嗎?

編輯:我試圖做一次不超過六個音高,因爲我正在用吉他寫軟件;在節目使用者有七絃吉他的情況下,它需要能夠最多拾取七個音高。

既然如此,是一個能夠從單個麥克風信號處理這個問題的FFT(或其他方法),還是必須製作一個吉他拾取器來逐個讀取每個字符串?

+2

多少音調或正弦波是我們在原始信號在說什麼?如果它只是少數(例如DTMF信號中的2個核心音),則FFT可能工作。只要搜索高峯。否則,對於音樂而言,這通常被認爲是計算機科學和信號處理中的難題。您可以在「自動音樂轉錄」上進行互聯網搜索,並且您可能會發現一些嘗試執行此操作的軟件程序或代碼。 – selbie 2012-03-08 06:50:02

+0

有一個名爲Melodyne的着名軟件可以處理複雜的聲音。 – cmannett85 2012-03-08 07:45:54

+0

這個問題可能重複:http://stackoverflow.com/questions/4337487/chord-detection-algorithms/4339225#4339225 – hotpaw2 2012-03-08 08:22:25

回答

2

參數譜估計有兩種衆所周知的統計技術。一個是MUSIC ,另一個是ESPRIT。如果您可以將您的信號表示爲加權復指數(即正弦曲線)的總和,則可以應用其中任何一個。此外,相關矩陣的特徵分解還會告訴你信號中的頻率數量,所以你甚至不應該知道這一點。 ESPRIT比MUSIC更好,因爲您不應該在頻域中搜索峯值。頻率直接作爲結果給你。但是,MUSIC被認爲更強大。

+0

這幾乎是我在找的;是否足夠快以產生實時結果(即向吉他手提供實時反饋)? – Adam 2012-03-14 15:58:52

+0

取決於您的數據大小。我更喜歡ESPRIT,在這種情況下,你應該做兩個特徵分解。對於M乘M自相關矩陣,這對應於M^3操作。問題是你的M應該比K大(K是信號中的頻率數)。所以我認爲這不會是一個大問題,因爲你沒有太多的頻率。 – YBE 2012-03-14 19:09:30

+1

@YBE:當人們不知道所涉及的指數的確切數量時,MUSIC和ESPRIT的表現會很差,而吉他可能會爲每個弦產生大量不同數量的泛音(可能是幾十個),其中一些可能會略微不和諧。 – hotpaw2 2012-04-03 20:01:56

1

可能需要隔離每根琴絃的吉他拾音器。否則,解開所有泛音可能是一個非常困難的問題。

1

您需要先了解'節距'究竟是什麼(請參閱下面的維基百科鏈接)。當在吉他或鋼琴上製作單個音符時,我們所聽到的不僅僅是聲音振動的一個頻率,而是以不同數學相關頻率發生的多個聲音振動的組合。這種不同頻率振動複合的元素被稱爲諧波或部分。例如,如果我們按鋼琴上的中間C鍵,組合諧波的單個頻率將以261.6 Hz爲基頻,523 Hz爲第二諧波,785 Hz爲第三諧波,1046 Hz爲是第四諧波等。後面的諧波是基頻261.6Hz(例如:2×261.6 = 523,3×261.6 = 785,4×261.6 = 1046)的整數倍。

下面,在GitHub.com上,是我設計的一個不尋常的兩階段算法的C++源代碼,它可以在Windows上播放時對多音MP3文件進行實時音高檢測。這個免費的應用程序(PitchScope Player,網上可用)經常用於在MP3錄製時檢測吉他或薩克斯管獨奏的音符。您可以下載Windows的可執行文件,以查看我的算法,以處理您選擇的MP3文件。該算法旨在在MP3或WAV音樂文件中的任何特定時刻檢測最主要的音調(音符)。注意在MP3錄製過程中,在任何特定時刻,最主要的音調(音符)會發生變化,從而精確地推斷音色。

我使用修改後的DFT對數變換(類似於FFT)首先通過查找具有峯值電平的頻率來檢測這些可能的諧波(參見下圖)。由於我爲修改後的Log DFT收集數據的方式,我不必對信號應用窗口函數,也不需要添加和重疊。而且我創建了DFT,因此它的頻率通道是對數定位的,以便直接與由吉他,薩克斯管等上的音符創建諧波的頻率對齊。我的音高檢測算法實際上是一個兩階段過程:a)首先檢測到ScalePitch('ScalePitch'有12個可能的音高值:{E,F,F#,G,G#,A,A#,B,C ,C#,D,D#})b),並確定ScalePitch後,通過檢查4個可能的八度候選音符的所有諧波來計算八度。該算法被設計用於在多音MP3文件中的任何給定時刻檢測最主要的音調(音符)。這通常對應於器樂獨奏的音符。對我的Two Stage Pitch Detection算法的C++源代碼感興趣的人可能想從GitHub.com的SPitchCalc.cpp文件中的Estimate_ScalePitch()函數開始。

https://github.com/CreativeDetectors/PitchScope_Player

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

enter image description here