C# 从PCM数据获取音频信息

C# 从PCM数据获取音频信息,c#,audio,frequency,pcm,C#,Audio,Frequency,Pcm,我一直无法理解音频数据是如何存储的。但是,我想知道一种找到PCM数据基音的方法。比如说,我记录了钢琴上敲击的一个键,以16位单声道PCM格式,以给定的采样率。我怎样才能找到音频的频率,以赫兹为单位?获取平均频率的简单代码对我来说很有用,但更详细地解释如何更好地理解格式将是理想的 谢谢 PCM音频不会存储为一系列音调。为了弄清楚这一点,你需要一个快速傅立叶变换,或FFT。看,已经有10多篇关于这个的帖子了 想象一下音频波形。PCM编码是简单的采样,即每秒波动一定次数,并使用每个采样的特定位数 来

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


谢谢

PCM音频不会存储为一系列音调。为了弄清楚这一点,你需要一个快速傅立叶变换,或FFT。看,已经有10多篇关于这个的帖子了

想象一下音频波形。PCM编码是简单的采样,即每秒波动一定次数,并使用每个采样的特定位数

来自

44.1kHz的16位单声道PCM意味着每秒将存储44100次16位值(2字节),该值表示采样特定时间的波形。44.1kHz的速度足以存储接近22kHz的频率(请参阅)


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

谢谢!我已经为此绞尽脑汁了一段时间,音频存储对我来说通常是一扇关闭的门。所以我能够实现我找到的代码,但我得到了不准确的结果。例如,当在钢琴上弹奏中间C(虚拟和现实世界中)时,它报告的频率约为484 Hz,而实际上中间C接近261 Hz。你知道为什么会这样吗?@Drew:基音检测相当棘手——大多数乐器都有复杂的功率谱,基音往往不是最强的成分——耳朵根据谐波信息“填充”基音基音。搜索“音高检测”,因为在这整个主题上已经有很多问题有很好的答案了。@Drew,我建议你花些时间看看频谱分析仪,以便更好地了解你在看什么。除非你看到的是正弦波,否则你听到的实际上是由许多音高组成的,这些音高赋予声音音质特征,比如音色。心理声学开始发挥作用。