从PCM数据中获取音频信息

4
我从未理解过音频数据是如何存储的。但我想知道一种找到PCM数据音高的方法。比如说,我录制了钢琴上敲击单个键的声音,在给定采样率下以16位单声道PCM格式进行录制。那么我该如何找到这段音频的频率(以赫兹为单位)?对我来说,获取平均频率的简单代码就足够了,但更详细的解释如何更好地理解这种格式会更理想。
谢谢!
1个回答

9

PCM音频并不是以一系列音高的形式存储的。要计算出这个,您需要进行快速傅里叶变换(FFT)。请参见https://stackoverflow.com/search?q=pitch+detection,已经有数十篇关于此的帖子。

想象一下音频波形。PCM编码只是按每秒特定次数对该波形进行采样,并使用特定数量的采样位数。

Waveform

图片来自http://en.wikipedia.org/wiki/Pulse-code_modulation

44.1kHz的16位单声道PCM意味着每秒将存储44100次表示在采样时刻波形的16位值(2字节)。 44.1kHz足够快,可以存储接近22kHz的频率(请参见奈奎斯特频率)。

FFT将这些样本从时间域转换为频率域。也就是说,您可以找到特定时间段内所有频率的级别。查看的频段越多,计算强度就越大。


谢谢!我已经为此苦恼了一段时间,音频存储通常对我来说是一个封闭的门。 - Drew DeVault
所以我能够实现我在这里找到的代码,但是我得到了不准确的结果。例如,在钢琴上演奏中央C音符(无论是虚拟的还是真实的),它报告的频率约为484 Hz,而实际上中央C音符更接近于261 Hz。你有什么想法为什么会出现这种情况? - Drew DeVault
1
@Drew:音高检测非常棘手 - 大多数乐器具有复杂的功率谱,而且通常基频不是最强的成分 - 耳朵根据谐波信息“填补”基频音高。在SO上搜索“pitch detection”,因为这个主题已经有很多问题和好答案了。 - Paul R
1
@Drew,我建议你花些时间看一下频谱分析仪,以更好地了解你所看到的内容。除非你在看正弦波,否则你听到的实际上由许多音高组成,这些音高赋予声音其声学特性,例如音色。心理声学也发挥着作用。 - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接