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