我想为我的 mp3 播放器制作一个 16 波段图形均衡器。
但是,我不知道从哪里开始,因为我没有音频处理方面的经验。
所以,我真的不知道从哪里开始从 mp3 格式中提取频段(?)。
有人可以建议我一个简单的解决方案吗?
啊,还有,有没有开源的mp3播放器,易于修改和构建为windows应用程序?
我想为我的 mp3 播放器制作一个 16 波段图形均衡器。
但是,我不知道从哪里开始,因为我没有音频处理方面的经验。
所以,我真的不知道从哪里开始从 mp3 格式中提取频段(?)。
有人可以建议我一个简单的解决方案吗?
啊,还有,有没有开源的mp3播放器,易于修改和构建为windows应用程序?
我认为您正在寻找的是频谱分析仪。它显示了整个音频频谱中不同频率范围的瞬时能量水平。对于大多数人来说,它基本上是养眼的。它不会修改信号。
另一方面,图形均衡器允许您增强或减弱各种频段的音频能量。它肯定会修改信号。大多数人使用图形均衡器来增强部分频谱以获得效果,例如增强低音。
发烧友通常使用连接到麦克风(而不是放大器)的频谱分析仪来监控通过图形均衡器播放白噪声的房间的响应。然后他们调整均衡器以使频率响应变平,从而补偿房间的声学效果,让您听到更纯净的录制音频。如果您随后弄乱了他们的均衡器设置,这些人通常会非常沮丧。:)
您可以查看流行的 Linux mp3 播放器,例如 RhythmBox、Banshee、VLC,甚至 Audacity。如果你想自己写,这里有一些说明。假设您知道如何在 Windows 上编写 GUI 程序,并且您只想要一个好的频谱分析仪,那么您真正需要做的事情如下:
在解码阶段之后接入信号路径。
将音频缩混为单声道,这通常意味着只需将左右样本相加。小心在音频中使用浮点数(应该缩放到 +/- 1),或者在添加之前将(大概是 16 位)样本转换为 32 位整数,以避免在添加短裤时溢出。
测量一些样本(称为窗口),通常为 512、1024 或 2048(始终选择 2 的幂)。在分辨率(更大的窗口具有更高的分辨率)、成本(更多的样本需要更多的时间来处理)和响应能力(更大的窗口需要更多的时间来积累,从而降低分析器的帧速率)之间存在权衡。
通过快速傅里叶变换 (FFT) 运行这些样本。请查阅您使用的 FFT 库的文档(FFTW是一个很好的库),但输出通常是一个复数数组,关于中间对称。
如果输出是对称的,则只使用前半部分。如果它不是对称的,那么就使用整个东西。从头到尾(或中间)的每个复数都以从 0 Hz 到音频采样率的一半的线性间隔频率对正弦曲线的能量和相位进行编码。如果音频为 44.1 kHz,并且您在 FFT 中选择了 1024 个样本,则每个数字代表 22050 Hz / 512 = 43 Hz。
取每个复数并将其实部和虚部平方,然后将这些数字相加。您最终将得到每个箱中的功率(即能量平方),这是一个实数和正数。
通过相加将 FFT bin 分组到频带中。例如,如果您在上面的示例中使用 512 个 bin 并将它们按 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 赫兹)等
您现在可以直接显示功率总和,或者计算每个波段的平均值,然后取其平方根(RMS 能量)并绘制它。要以分贝为单位显示值,请计算 RMS 能量,然后绘制此图:20 * log10(RMS / 32768)
。对于 16 位音频,值从 0 dB(满量程)到 -90 dB(静音)。
不断重复步骤 2-8,每次都更新您的显示。
去打动你的朋友。
祝你好运。如果您在 16 kHz 以上没有看到太多能量,请不要惊慌。mp3 编码算法过滤掉 16 kHz 以上的所有内容以帮助压缩。
ps 如果你真的很好,并且有解码器的源,那么你可以在解码器的频域中访问音频并将其用于频谱分析仪。您必须采用解码器在窗口大小方面为您提供的内容,但您的计算成本几乎为零。请注意,mp3 使用离散余弦变换而不是傅立叶变换来将音频移入和移出频域,因此您的能量值将与使用适当的 FFT 不同。