从PCM数据获取音频信息

问题描述:

我从未能够理解音频数据的存储方式。但是,我想知道一种方法来查找PCM数据的音高。比方说,例如,我以一个给定的采样率以16位单声道PCM格式记录了一个在钢琴上被敲击的单个琴键。我怎么能找到音频的频率(赫兹)?获得平均频率的简单代码适用于我,但如何更好地理解格式的更详细的解释将是理想的。从PCM数据获取音频信息

谢谢!

PCM音频不存储为一系列音高。为了解决这个问题,你需要一个快速傅里叶变换或FFT。见https://*.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