我正在用C ++编写一个文件压缩器实用程序,我希望支持PCM WAV文件,但是我希望将其保留为PCM编码,只需将其转换为较低的采样率,并将其从立体声更改为单声道(如果适用)产生较小的文件大小。
我理解WAV文件标题,但是我没有实际声音数据如何工作的经验或知识。所以我的问题是,以编程方式操作WAV文件中的“数据”子块以将其转换为另一个采样率并更改通道编号是否相对容易,或者我会更好地使用现有的库来实现它?如果是,那怎么办呢?提前谢谢。
答案 0 :(得分:4)
PCM仅意味着在等距时间点对原始信号的值进行采样。
对于立体声,这些值有两个序列。要将它们转换为单声道,您只需采用两个序列的分段平均值。
以较低的采样率重新采样信号有点棘手 - 您必须从信号中滤除高频,以防止产生别名(虚假的低频信号)。
答案 1 :(得分:2)
我同意avakar和nico,但我想补充一点解释。降低PCM音频的采样率并非易事,除非有两件事情是真的:
您的信号仅包含低于新采样率(Nyquist rate)1/2的重要频率。在这种情况下,您不需要抗锯齿滤波器。
您按整数值进行下采样。在这种情况下,N的下采样只需要保留每个第N个样本并丢弃其余的样本。
如果这些都是真的,您可以定期删除样本以进行下采样。但是,如果你处理合成信号以外的任何事情,它们可能都不正确。
要解决问题1,您必须使用低通滤波器过滤音频样本,以确保结果信号仅包含高达新采样率1/2的频率内容。如果不这样做,高频将无法准确表示,并且会混叠回可以正确表示的频率,从而导致严重失真。有关别名的说明,请查看此维基百科文章的critical frequency部分。具体来说,请参见图7,其中显示3种不同的信号,由于采样率太低,因此只能与样本区分开来。
解决问题二可以通过多种方式完成。有时它分两步执行:上采样后跟下采样,从而实现采样率的合理变化。它也可以使用插值或其他技术来完成。基本上必须解决的问题是新信号的样本没有及时与原始信号的样本对齐。
正如您所看到的,重新采样音频可能非常复杂,因此我会采用nico的建议并使用现有的库。过滤步骤需要您学习很多有关信号处理和频率分析的知识。你不必是专家,但需要一些时间。
答案 2 :(得分:1)
我认为没有必要重新发明轮子(除非你想为个人学习做这件事)。 例如,您可以尝试使用libsnd