2017-03-05 51 views
0

我正在使用Web Audio API來獲取來自麥克風的聲音的頻率。爲此我在這個github倉庫中找到了一些有用的代碼:https://gist.github.com/giraj/250decbbc50ce091f79eWeb Audio API - 獲取正確的頻率

現在我的問題是,我得到了很多不同的頻率,只有一個小小的聲音。這聲音可能來自我的聲音或來自樂器。

這些頻率像90到4000Hz之間。但是據我所知,一個人的聲音或者一個樂器的音符只能以Hz爲單位有一個單一的頻率。我很確定,我只是在演奏一種單調。

那麼我怎麼能知道,每個音的3或4個頻率中的哪個頻率是我正在搜索的頻率。我需要這個值,從他們的頻率中識別C,D,E等音符。我希望這個問題不是脫離主題,因爲我真的很努力地找到一個解決方案,我不知道這是API本身的一個可解決的問題,還是我不得不消除一些頻率。我將不勝感激任何形式的幫助。

編輯:我想補充說,我從來沒有達到這個頻率列表中列出的相同的音符值:http://www.phy.mtu.edu/~suits/notefreqs.html。我正在使用鋼琴應用程序,該應用程序始終在Play商店的頻率應用程序上提供正確的頻率。所以我甚至懷疑我收到的結果。

+0

聲音幾乎從不是單一頻率 - 唯一(很少)是人爲的。我們認爲音調的東西實際上是由一個頻率爲f的內容組成的(這就是所謂的基礎,就是你所想的)和一系列「諧波」,它們的內容都是f '('2f,3f,4f,5f等)。要確定正在播放的音符,您必須考慮到這一點。一種方法是查找譜圖中諧波之間的距離('f')。 – Linuxios

+0

感謝這個建議,以前不知道。我會考慮這個問題。 – Kuhfleisched

回答

0

我一直在搞同一個問題,並有一些有趣的部分答案。這個網站http://www.phy.mtu.edu/~suits/Physicsofmusic.html有大量的數據解釋音樂的信息,是超級有用的。

我寫了一個使用網絡音頻分析器的東西,並且通過音樂音調簡單地將fft結果存儲到容器中 - 它給出了fft結果的圖形,並且可以指示聲音中實際的頻率。它在https://aerik.github.io/NoteDetector.htm

在我開始之後,我發現了另一個使用「自動關聯」來檢測基礎的代碼。這可能更接近你要找的東西:https://github.com/cwilso/PitchDetect我遇到的問題是,雖然它對於相當純的音色效果很好,但它仍然有很多噪音。

我想通過比較自相關結果和來自fft的信號強度,將他的方法與我的方法結合起來。

這是一個有趣的項目,但我不認爲有任何簡單的答案。

0

我是一名專業的歌手,鋼琴家和語音老師,他們過渡爲代碼,所以我想我可以談談您在這裏得到的一些令人困惑的結果。底線:當您在樂器上唱歌或彈奏音符時,您實際上會同時產生許多不同的頻率,因此您看到的結果很可能是準確的。然而,你所瞄準的是幾乎可以肯定的基本音調,這是最低的一個。

更長,更復雜的物理回答:除非你正在看正弦波(聽起來像是一個機械的嘟嘟聲,而不會從一個體面的樂器中出來),你聽到的聲音可能包含很多不同的頻率。聲音由基本音高(最低頻率,通常是我們在討論音樂時指出的音高)和大量的泛音(其他更高的頻率組成樂器,還是歌手,甚至是元音)。

讓我們選一個易於使用的數字:想象一下您的基本音高是100Hz。爲了方便討論音樂含義(儘管它實際上不是C),我們將這個C1稱爲方便,並且這些數字表示八度音程從C範圍到B的跳躍範圍。您可能會在以下任何音調中具有泛音:200hz( C2),300hz(G2),400hz(C3),500hz(E3),600hz(G3),700hz(Bb3),800hz(C4),900hz(D4),1000hz(E4)等。一些泛音比其他泛音更突出,或者完全跳過其中的一些(許多泛音會跳過其他所有泛音),但是所有泛音都將在這種模式之內。

請注意,所有泛音都是基數的倍數。這意味着你可以在你看到的所有其他音高中使用該模式來找出底下的基本音高。從音樂的角度來看,您可能還會注意到,您在這個泛音系列中首先看到的音調是我們認爲最輔音的音調 - 八度音階,完美五分音符,三分音符,主要三元音符。這不是巧合,泛音與這些其他音高一致的方式幾乎可以肯定我們覺得他們非常喜歡聽的原因。

把所有這些都歸結爲你如何確定基本音調,假設一系列泛音可能來源於相同的基本原理:你基本上是在尋找你將會看到的各種頻率的最大公因數。它可能也是您檢測到的最低頻率,但要小心這種啓發式算法,因爲您的信號中可能有無關的噪聲。任何不屬於你的好的倍數列表可能是噪音。

所有這些變得複雜得多,當然,當你一次播放多個(基本)音高時。我自己在思考和絃檢測,並在尋找人們已經在這方面做了什麼以及如何建立它時發現了你的問題。