【问题标题】:Getting audio information from PCM data从 PCM 数据中获取音频信息
【发布时间】:2011-07-28 21:18:09
【问题描述】:

我一直无法理解音频数据是如何存储的。但是,我想知道一种找到 PCM 数据音高的方法。例如,假设我以给定的采样率以 16 位单声道 PCM 格式录制了钢琴上敲击的单个键。我怎样才能找到音频的频率(以赫兹为单位)?获取平均频率的简单代码对我有用,但更详细的说明如何更好地理解格式将是理想的。

谢谢!

【问题讨论】:

    标签: c# audio frequency pcm


    【解决方案1】:

    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 将这些样本从时域转换到频域。也就是说,您可以找到特定时间段内所有频率的电平。您查看的波段越多,计算量就越大。

    【讨论】:

    • 谢谢!我已经为此烦恼了一段时间,音频存储通常对我来说是一扇关闭的门。
    • 所以我能够实现我找到的代码here,但我得到的结果不准确。例如,在钢琴上弹奏中间 C 时(无论是在虚拟世界中还是在现实世界中),它报告的频率约为 484 Hz,而实际上中间 C 接近 261 Hz。知道为什么会这样吗?
    • @Drew:音高检测非常棘手——大多数乐器都有复杂的功率谱,而且基音通常不是最强的分量——耳朵根据来自谐波的信息“填充”基本音高。搜索“音高检测”,因为在整个主题上已经有很多问题有很好的答案。
    • @Drew,我建议花一些时间查看频谱分析仪,以更好地了解您正在查看的内容。除非您正在查看正弦波,否则您所听到的实际上是由许多音高组成的,这些音高赋予声音其声音特征,例如音色。心理声学开始发挥作用。
    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2011-10-06
    相关资源
    最近更新 更多