2011-04-04 167 views
2

我從未能夠理解音頻數據的存儲方式。但是,我想知道一種方法來查找PCM數據的音高。比方說,例如,我以一個給定的採樣率以16位單聲道PCM格式記錄了一個在鋼琴上被敲擊的單個琴鍵。我怎麼能找到音頻的頻率(赫茲)?獲得平均頻率的簡單代碼適用於我,但如何更好地理解格式的更詳細的解釋將是理想的。從PCM數據獲取音頻信息

謝謝!

回答

5

PCM音頻不存儲爲一系列音高。爲了解決這個問題,你需要一個快速傅里葉變換或FFT。見https://stackoverflow.com/search?q=pitch+detection,已有10多篇關於此的文章。

想想音頻波形。 PCM編碼只是簡單地每秒鐘對該波形進行一定次數的採樣,並且每個採樣使用特定數量的比特。

Waveform

圖片從http://en.wikipedia.org/wiki/Pulse-code_modulation

16位單聲道PCM 44.1kHz的在意味着每秒44,100次,一個16位的值(2個字節)將被存儲的是表示在特定的波形抽樣時間。 44.1kHz速度足以存儲接近22kHz的頻率(請參閱Nyquist Frequency)。

FFT將這些採樣從時域轉換到頻域。也就是說,你可以找到特定時間段內所有頻率的水平。你看的頻段越多,它的計算密集度就越高。

+0

謝謝!一直以來,我一直在嘲笑我的頭髮,音頻存儲通常是對我來說關閉的門。 – 2011-04-04 02:41:59

+0

所以我能夠實現代碼我發現[這裏](http://www.codeproject.com/KB/audio-video/FftGuitarTuner.aspx),但我得到不準確的結果。例如,當在鋼琴上演奏中間C(虛擬和現實世界)時,它報告頻率約爲484Hz,實際上中間C接近261Hz。任何想法爲什麼會這樣? – 2011-04-04 03:15:22

+1

@Drew:音高檢測相當棘手 - 大多數樂器都有複雜的功率譜,而且基本不是最強的組件 - 耳朵根據諧波信息「填充」基本音高。搜索所以「音高檢測」,因爲已經有很多問題在整個主題上都有很好的答案。 – 2011-04-04 06:46:32