从mp3格式中提取10波段均衡信息的方法

Foo*_*oly 1 audio

我想为我的mp3播放器制作一个16频段图形均衡器.

但是,我不知道从哪里开始,因为我没有音频处理经验.

所以,我真的不知道从哪里开始从mp3格式中提取频段(?).

有人请建议我一个简单的解决方案吗?

啊,还有,是否有任何开源MP3播放器易于修改和构建为Windows应用程序?

Ran*_*ook 8

我认为您正在寻找的是频谱分析仪.它显示了音频频谱中各种频率范围内的瞬时能量水平.对于大多数人来说,它基本上是眼睛糖果.它不会修改信号.

另一方面,图形均衡器允许您在各种频带上增强或衰减音频的能量.它肯定会修改信号.大多数人使用图形均衡器来增强光谱的部分效果,例如提升低音.

发烧友通常使用连接到麦克风(不是放大器)的频谱分析仪来监控通过图形均衡器播放白噪声的房间的响应.然后,他们调整均衡器以平坦化频率响应,从而补偿房间的声学效果,让您更加纯粹地听到录制的音频.如果你那么混乱他们的均衡器设置,这些人通常会非常沮丧.:)

您可以查看流行的Linux mp3播放器,如RhythmBox,Banshee,VLC,甚至是Audacity.如果你想自己编写,这里有一些说明.假设您知道如何在Windows上编写GUI程序,并且您只需要一个不错的频谱分析仪,那么您真正需要做的是:

  1. 在解码阶段之后接入信号路径.

  2. 将音频缩混为单声道,这通常意味着只将左侧和右侧样本添加到一起.注意要么使用浮点数作为音频(应该缩放到+/- 1),要么在添加之前将(可能是16位)采样转换为32位整数,以避免在添加短路时溢出.

  3. 测量一些样本(称为窗口),通常为512,1024或2048(总是选择2的幂).分辨率(较大的窗口具有较高的分辨率),成本(更多的样本需要更多的时间来处理)和响应性(较大的窗口需要更多的时间来累积,降低分析仪的帧速率)之间存在权衡.

  4. 通过快速傅里叶变换(FFT)运行这些样本.请参考您使用的FFT库的文档(FFTW是一个很好的文档),但输出通常是一个复数的数组,关于中间对称.

  5. 如果输出是对称的,请仅使用前半部分.如果它不对称,那么使用整个东西.从开始到结束(或中间)的每个复数编码正弦波的能量和相位,线性间隔频率从0Hz到音频采样率的一半.如果音频为44.1 kHz,并且您在FFT中选择了1024个样本,则每个数字代表22050 Hz/512 = 43 Hz.

  6. 取每个复数并对其实部和虚部进行平方并添加这些数字.你最终会得到每个箱子的功率(即能量平方),这是一个真实的正数.

  7. 通过将FFT分区加起来将它们分组到频带中.例如,如果您在上面的示例中使用512个分档并将它们分组为51,那么您将拥有10个2196 Hz的波段.这在低频中提供的分辨率太低,因此人们通常使用对数间隔的频带:0(0-43 Hz),1(43-86 Hz),2-3(86-172 Hz),4-7(172- 344赫兹),8-15(344-688赫兹)等

  8. 您现在可以直接显示功率和,或计算每个波段的平均值,然后取平方根(RMS能量)并绘制.要在分贝显示值,计算RMS能量,然后绘制这样的:20 * log10(RMS / 32768).对于16位音频,值从0 dB(满量程)到-90 dB(无声).

  9. 连续重复步骤2-8,每次都更新显示.

  10. 去打动你的朋友.

祝你好运.如果你没有看到16 kHz以上的能量,请不要惊慌.mp3编码算法过滤掉16 kHz以上的所有内容,以帮助进行压缩.

ps如果你真的很好,并且有解码器的来源,那么当它仍然在解码器的频域中时你可以访问音频并将其用于频谱分析仪.您将不得不采用解码器为窗口大小提供的内容,但您的计算成本几乎为零.请注意,mp3使用离散余弦变换而不是傅里叶变换来将音频移入和移出频域,因此您的能量值将与使用适当的FFT不同.