Linux/ALSA下SRC(Sample Rate Convertion)引起的音质问题和解决方案

上一篇 / 下一篇  2008-02-09 20:13:06 / 个人分类:GNU/Linux

    这里不涉及基本音质问题,所以如果你有爆音的问题请参考论坛里如何设置PCM音量以避免增益带来的削波失真的文章;或者你有背景噪声,请尝试关闭声卡的录音和与你所需输出声道无关的接口。此外数字输出和外置解码器不在讨论范围。如果你有一片过得去的声卡,音质在感觉上已经不错了,那么你可以看看下面。当然如果你只是疑惑Linux是否真有音质问题,或者是怎么发生的,也可以参考。

    最近在使用一块Terratec DMX 6Fire LT(音频I/O控制器是 Ice1712[Envy24])的时候,我发现envy24control这个功能强大的控制软件面板上总是显示这片声卡正在使用48KHz的模式,我的音源库基本是从CD转换的FLAC和WAV,采样率都是44.1KHz。DMX 6Fire是一片双晶振的声卡,板上有24.576MHz和22.5792MHz两颗晶体,可以直接支持44.1KHz和48KHz等模式而无需转换。我尝试直接播放一片普通CD,依然自动跳到了48Khz上,真是奇怪。于是我松开了自动Reset频率的选项,手动锁定到44.1KHz,然后播放,没想到声音出来像是慢放的效果,肯定有什么地方不对了。

    我使用Amarok管理音乐库,因此想到是否是Xine后端做了自动升频处理,改用ALSA命令行工具aplay播放一段44.1KHz的WAV后,问题依旧。排除了Xine,下面就是ALSA(我使用Xine的ALSA输出插件)本身了,最底层的驱动模块应该没有问题,因为我可以手动锁定到任何改卡规格上支持的模式,只是播放效果不正常。逐渐地我想到了一个问题,Evny24是一个音频I/O芯片,并没有CS46xx一类DSP的计算处理能力,应该不支持硬件混音。表现到计算机上,就是多个音频流无法同时开启,你不能在播放音乐的同时再去开一个电影播放器,甚至IM软件的消息通知音都无法播放。但是在我的系统下同时开出一打的音频程序确实又没有问题,最终我把目光放到了ALSA的软件混音插件DMix上。

    由于从前我的声卡使用CS4630芯片或者EMU10K,dsp具有硬件多音频流和SRC功能,因此不太使用DMix。但现在我决定还是去掉DMix看看是否有用。在/usr/share/alsa/cards/下,我找到了ICE1712芯片声卡的预设文件ICE1712.conf。并注释掉了开头一段dmix相关的项目。然后我用aplay播放一段44.1KHz的WAV,声卡终于自动跳转到了正确的模式!当然作为代价,相应地我暂时失去了软件混音的功能。

# default with dmix & dsnoop
ICE1712.pcm.default {
    @args [ CARD ]
    @args.CARD {
        type string
    }
    type asym
    playback.pcm {
        type plug
        slave.pcm {
            @func concat
            strings [ "dmix:" $CARD ",FORMAT=S32_LE" ]
        }
    }
    capture.pcm {
        type plug
        slave.pcm {
            @func concat
            strings [ "dsnoop:" $CARD ",FORMAT=S32_LE" ]
        }
    }
}

    结论很清楚,现在的ALSA默认已经为不具备硬件多音频流混音功能的声卡默认开启了DMix,而因为DMix需要混音,也就是把多个可能是不同取样率的音频流混合输出,因此它需要一个较高的常用取值作为基准。默认会采用48KHz的Sample Rate,若是低于此频率,则升频到48KHz。接下去的问题是,DMix在SRC之后,是否影响听感?在我看来,是有一定影响的,比如小提琴的高音延展会不足,而较为纤细的泛音被DMix做SRC之后也会被削弱或模糊。因此如果你有双晶震声卡,并对44.1KHz回放的音质有所不满,那么你可以考虑在欣赏音乐的时候关闭DMix,这样可以完全发挥双晶振声卡应有的实力。当然如果你只重视44.1KHz音源例如从CD抓轨的APE/FLAC/WAV,而对DVD或者其他视频相对来说无所谓一些,同时不想失去软件多音频流支持,那么你也可以只把DMix设定到默认44.1KHz,享受音乐,迁就视频。

    将DMix的默认输出频率设定到44.1KHz,可参考以下~/.asoundrc作出自己的设定:

pcm.!default {
    type plug
    slave.pcm "dmixer"
}
pcm.dsp0 {
    type plug
    slave.pcm "dmixer"
}
pcm.dmixer {
    type dmix
    ipc_key 1024
    slave {
        pcm "hw:0,0"
        period_time 0
        period_size 1024
        buffer_size 8192
        rate 44100
     }
     bindings {
        0 0
        1 1
     }
}
ctl.mixer0 {
    type hw
    card 0
}

    除此之外,有些声卡只有单晶振,无法支持两种频率,必须透过SRC。如此情况下,高品质的SRC至少可以降低失真。ALSA考虑到这种情形,允许通过插件调用外部高品质SRC库进行转换运算。为了使用外部SRC,你需要libasound2-plugins,libsamplerate0等软件包(源中均有)。安装完毕后,在~.asoundrc 中加入default.pcm.rate_converter "samplerate_best"来启用最佳SRC算法。

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2008-10-07  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 1278
  • 日志数: 6
  • 建立时间: 2007-11-18
  • 更新时间: 2008-02-09

RSS订阅

Open Toolbar