音频 频道

失真什么的最讨厌了 如何减少音频失真

  非整数倍重采样失真

  首先,kk要先介绍一个概念,就是“非整数倍重采样失真”。关于采样频率的概念,请看kk写的第一篇文章:http://www.hexieshe.com/Jimmy/626843.Html

  比如cd的采样频率是44.1kHz,将44.1kHz重新采样到48kHz,或者48kHz到44.1kHz时,这就是非整数倍重采样;而48kHz到96kHz甚至到192kHz,都是整数倍重采样。非整数倍采样造成的后果是波形失真,特别是比较糟糕的重采样算法,造成的失真非常明显,比如原始的44.1kHz的正弦波,重采样到48kHz后会出现锯齿。(kk手头没有好的示波器,所以只好无图有真相了)总之“非整数倍重采样”是数字音频中非常忌讳的一种重采样方式。

  那么“非整数倍重采样失真”和我们有关系吗?kk很遗憾的告诉各位,非常有关系,而且如果各位用的不是专业级别的声卡,那么听音乐时候的“非整数倍重采样失真”是不可避免的。

  在windows vista 之前的windows系统里,所有通过direct sound或者waveout播放的声音都会经过一个叫kernel mixer的东西,出于同步的考量,微软会把所有的声音重新采样到24kHz的整数倍,如果你播放的是44.1kHz的纯音乐,那么就发生了“非整数倍重采样”。

  说到这里,也许很多朋友会说,只要绕过kernel mixer就行了。的确,将播放器的输出设备换成kernel stream或者asio的话,就可以绕过kernel mixer,这样就避免了内核级别的重采样。(这里需要澄清一下,ASIO DirectX Full Duplex 仍然会通过kernel mixer,而且延迟超高,这玩意儿只是模拟asio而已,目的是为了让一些专业软件在没有专业声卡的情况下工作。)


流程图

  即使绕过了kernel mixer,声音在被进入声卡时仍然会被重采样到24kHz的整数倍,这是因为普通的民用声卡只有一颗晶振,而且只支持24kHz的整数倍频率。

  看到这里各位是不是对这个无法避免非整数倍重采样的世界绝望了呢?别灰心,既然无法避免那就想办法将失真减到最小。声卡的重采样算法不是很靠谱(kernel mixer可以绕过,这里就无视了)那就干脆用相对专业的重采样算法预先在播放的时候把44.1kHz的音频信号转成48kHz。这个工作一般就交给播放器的DSP插件来完成。

  以foobar为例,选择file—>preference—>dsp manager,找到里面的resampler(重采样器),双击激活后按configure selected调出设置界面,选择48000Hz,至于边上的Ultra mode,也许是更高级算法模式,会消耗更多的cpu资源,请酌情使用。设置完毕,按ok即可。


DSP


resampler

  如此设置之后,foobar播放音乐时会第一时间使用这个dsp插件将音频重采样至48kHz,之后音频就不会再被流程中的其他部分重采样了。(这样做的目的仅仅是为了确保音频可控、可见地被重采样,而不是在内核或者声卡部分被不知道什么算法重新采样。)

  像winamp,甚至千千静听都支持dsp插件,相信也可以找到类似的重采样插件。

0
相关文章