【发布时间】:2011-07-28 21:18:09
【问题描述】:
我一直无法理解音频数据是如何存储的。但是,我想知道一种找到 PCM 数据音高的方法。例如,假设我以给定的采样率以 16 位单声道 PCM 格式录制了钢琴上敲击的单个键。我怎样才能找到音频的频率(以赫兹为单位)?获取平均频率的简单代码对我有用,但更详细的说明如何更好地理解格式将是理想的。
谢谢!
【问题讨论】:
我一直无法理解音频数据是如何存储的。但是,我想知道一种找到 PCM 数据音高的方法。例如,假设我以给定的采样率以 16 位单声道 PCM 格式录制了钢琴上敲击的单个键。我怎样才能找到音频的频率(以赫兹为单位)?获取平均频率的简单代码对我有用,但更详细的说明如何更好地理解格式将是理想的。
谢谢!
【问题讨论】:
PCM 音频不存储为一系列音高。要解决这个问题,您需要快速傅立叶变换或 FFT。见https://stackoverflow.com/search?q=pitch+detection,关于这个的帖子已经有10s了。
想想音频波形。 PCM 编码只是每秒对该波形进行一定次数的采样,并使用每个样本的特定位数。
图片来自http://en.wikipedia.org/wiki/Pulse-code_modulation
44.1kHz 的 16 位 Mono PCM 意味着每秒 44,100 次,将存储一个 16 位值(2 个字节),表示采样特定时间的波形。 44.1kHz 的速度足以存储接近 22kHz 的频率(请参阅Nyquist Frequency)。
FFT 将这些样本从时域转换到频域。也就是说,您可以找到特定时间段内所有频率的电平。您查看的波段越多,计算量就越大。
【讨论】: