2017-01-15 69 views
1

我嘗試在android平臺上開發吉他遊戲。Android中的吉他音高檢測

我需要做實時音高檢測來獲得吉他和絃/弦的頻率。

我會從話筒輸入,然後分析輸入(輸入播放,其種類吉他弦/弦)

我找到兩種方法,我可以使用,一個是尹,另一一個是FFT。

哪種方法可以獲得更好的性能和準確的結果?

+3

你的問題不屬於這裏。也許可以在這裏找到:http://sound.stackexchange.com/ –

+1

沒有明確的答案 - 音調檢測很難找到正確的答案,並且有許多方法可供人們結合使用來指導。原因是我們所說的像A4這樣的音調在440赫茲時有一個基本頻率,而在880(和220!)赫茲以及更多的諧波處。真正的數據示例:http://stackoverflow.com/questions/39230595/how-to-get-the-fundamental-frequency-using-harmonic-product-spectrum理想情況下,你可以找到一個Android庫/ SDK來做到這一點您。 –

+0

我會從麥克風得到輸入,然後分析輸入(輸入播放哪種吉他弦/和絃),我該怎麼做? @艾哈邁德法西 – paul9508

回答

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)確定,則通過檢查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

下面是一個對數DFT的圖像吉他獨奏3秒和絃MP3錄音(我的C++軟件創建的)。它演示瞭如何在演奏獨奏時爲吉他上的單個音符顯示諧波。對於這個對數DFT的每一個音符,我們都可以看到它的多重諧波垂直延伸,因爲每個諧波都有相同的時間寬度。在音符的八度音確定之後,我們知道基頻的頻率。

enter image description here

下圖展示了我發展到選擇正確的倍頻候選音符(即正確的基礎),一旦該注意ScalePitch已經確定了八度檢測算法。那些希望在C++中看到該方法的人應該去到名爲FundCandidCalcer.cpp的文件中的Calc_Best_Octave_Candidate()函數,該文件包含在我的GitHub源代碼中。

enter image description here