2012-02-10 72 views
3

我一直在研究吉他調諧器Java應用程序很長一段時間,並最終設法使用FFT和諧波來精確確定輸入的基頻(pitch)(基頻)檢測。產品範圍。當我使用我的MacBook Pro的默認麥克風時,儘管信號有點嘈雜,但是我最好喜歡使用直接插入電吉他的外部USB音頻聲音接口(Lexicon Lambda)。使用完全適用於麥克風輸入的完全相同的代碼嘗試了此操作,但檢測到的音高不同。這裏是我爲每個琴絃檢測到的基礎知識的結果(吉他已經調音)。Java音頻輸入不一致

採樣率= 8000個
樣品取= 16000
頻率分辨率= 0.5Hz的

ë - 麥克風:82.5Hz - 詞彙LAMBDA:124.5Hz
A - 麥克風:110.0Hz - 詞彙LAMBDA:165.5赫茲
d - 麥克風:147.0Hz - 詞彙LAMBDA:221.5Hz
ģ - 麥克風:196.0Hz - 詞彙LAMBDA:293.5Hz
乙 - 麥克風:247.0Hz - 詞彙LAMBDA:371.0Hz
ë - 麥克風:329.5赫茲 - 詞彙羔羊da:495.0Hz

我用這些數字搞混了一下,看起來使用Lexicon Lambda的結果通常約爲精確結果大小的1.5倍。但是,除了增加這個額外的計算來獲得正確的數字之外,我希望能夠使得獲得音頻數據的兩種方法都能夠返回準確的結果。

有沒有人知道這種不一致的原因可能是什麼?

編輯

所以我敢肯定,這個問題是使用24比特深度由於LAMBDA,而我的程序(和麥克風輸入)與16相反的位深工作不僅僅是改變它來處理24位數據,有沒有人知道一種方法來檢測當前音頻設備的可用位深度?

使用Lambda是首要任務,因爲信號噪音較小;但是,我剛纔試圖讓事情的指定位深度爲24,我得到IllegalArgumentException「無行匹配接口TargetDataLine支持格式PCM_SIGNED 8000.0 Hz,24位,單聲道,3字節/幀,小尾數支持「。我也嘗試使用44.1kHz以及我得到了同樣的錯誤,這表明Lambda實際上並沒有使用24位音頻,也許還有另一個問題。有沒有人有使用Java Sound中的24位音頻的經驗?似乎可能還有更多需要考慮的事情,而不是僅僅爲了完成這項工作而改變位深度。

由於

+0

*「完全相同的代碼」*什麼代碼?爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2012-02-10 15:35:56

+0

我還沒有試過這個,但是你確定你的Lamdba驅動支持8kHz採樣率嗎?實際上很少見 – guitarflow 2012-02-10 15:39:26

+0

+1 @nihilo有趣的項目 – therobyouknow 2012-02-10 16:15:43

回答

2

1想法


樣品比特率可能是關鍵! 默認情況下,專業音頻接口使用24位,16位是80年代的標準,在消費類電子產品中仍然使用很多。

如果您的FFT需要16位值並且您傳遞了24位,則您的聲音將「拉伸」。 (想象一下正弦波使其更清晰)

這解釋了頻率漂移完美! 因此,您應該將24位轉換爲16位或重寫FFT。

第二個想法


我發現了Lexikon網站的界面只是支持44.1 kHz和48千赫。 所以我猜Lambda默認設置爲48 kHz。 如果您要求8 kHz的採樣率,則接口無法處理,並保持在48 kHz,我想。

因此,只需在兩個設備上嘗試一個通用採樣率並再次比較即可。

+1

我嘗試了兩個44.1kHz,結果是一樣的。但我會盡量使用24位樣本。事實上,24 = 1.5 * 16和Lambda的結果是1.5 *準確的讀數是一個很大的線索。我認爲你是在編輯之前。 – nihilo90 2012-02-10 17:26:56

+0

@ nihilo90好,已編輯。一旦你知道它會感興趣。 – guitarflow 2012-02-10 19:03:10

3

MIC值是詞彙LAMBDA,例如66%的E - Mic:329.5Hz除以Lexicon Lambda:495.0Hz =大約0.66。不知道這是否意義重大?

麥克風的採樣率和Lexicon Lambda的採樣率是否相同?

位深度是否相同?我想知道它們是不同的,例如一個是16位,另一個是24位?這可能解釋了計算中66%的價值如何...

0

我對你有一個甜蜜的理論,但進一步認爲它是完整的BS。在其他新聞中,我只想提到,對於頻率檢測而言,FFT的精度要比麥克風採樣的精度或噪聲重要得多。麥克風上的量化噪聲會在整個頻譜上增加噪聲,而不會對FFT峯值造成太大影響,背景噪聲也有望遠遠低於檢測到的FFT峯值,並且不會對結果產生太大影響。

我在android上有一個調諧器應用程序,我在FFT中進行了固定點優化,但結果很糟糕。另一方面,即使你遠離手機和蹩腳的麥克風硬件,該應用程序也能很好地工作,所以我認爲你並不需要你的詞典中的所有24位數據,只要確保你使用的分辨率與FFT乘法和加法可能(雙倍,最好)。

+0

使用16位就足夠了,但似乎Lexicon Lambda不能用於16位採樣。這是我試圖讓它能夠真正使用24位樣本的唯一原因。目前沒有成功:( – nihilo90 2012-02-12 22:56:31