SRC(Sample Rate Convert,采样率转换)是hifi发烧友老生常谈的一个问题。为了让多个来源的音频可以同时输出给设备,操作系统会将全部的音频转换为同一采样率,比如Android设备会将音频采样率统一转换为48kHz。这篇文章测试了不同安卓设备和版本之间的音频重采样:2021年Android设备SRC(采样率转换)现状观察
发烧友们认为,SRC转换是会极大影响音质的,且无法接受的,而我也一直认为会影响音质,并且几乎一直尽力的使用USB独占或ASIO来播放音乐,甚至最近动了买一个播放器的念头。
但真的会影响吗?或者说真的会产生人耳可闻的影响吗?我开始思考这个问题。
理论分析
先说一下什么是采样率。
声音由如下图中的振动产生,振动的幅度处于不断的连续变化之中,但要将其转换到数字系统中时,则必须进行离散化,比如一秒钟之内我对原始振幅采样48000次,来模拟这种现实世界中连续的变化。
采样率就是一秒钟有多少个采样点来描述音频的振幅。
再说采样率转换,理论上来说,采样率转换对音质的影响和转换算法有非常大的关系。
先考虑整数倍向上转换,比如48kHz转换成96kHz,如下图所示,原来的两个频点中间会多出一个频点,该频点如何选择是采样率算法决定的,比如它可以选择两点之间的均值,也可以选择和上一个点完全一致,目前的常见的插值算法有:一阶保持FOH、零阶保持ZOH、三次样条函数spline和sinc函数。对这些转换算法的讨论目前受限于本人能力水平,无法做到。
整数倍向上转换至少会保持转换前的采样点,非整数倍转换则会丢失这些原始采样点,下面我画个简单的图示意一下:
下面是同一个音乐经过采样率转换后(48000->44100)的波形对比,可以根据目前竖线的位置来判断,采样点之间已经发生变化。
这是从时域上的分析,我们知道时域的变化将直接影响频域,但这里的影响应该不会那么明显,采样点足够多,对振幅走势的模拟应该不会有很大变化。从频谱图上几乎也看不出啥,硬要说区别,可能就是极高频有些区别,毕竟48000kHz的截断频率是24kHz,44100则是22.05kHz,但这里的区别人耳不可闻。
理论上:
- 无论是整数倍还是非整数倍,都和采样率转换算法有很大关系
- 整数倍的向上转换,会保留原始采样点,插入新的采样点
- 整数倍的向下转换,会保留部分原始采样点
- 非整数倍的向上向下转换,会生成很多新的采样点
实践
48000->44100
在Reaper中将48kHz和44.1kHz的音频一起播放,并反相其中一个,可以看到在响度较大的部分总轨偶尔会有声音出现,这一部分是否是不可闻的极高频呢?
通过pro-q的波形展示,我们可以看到几乎是从10k之前一点都有很微弱的声音变化,小于-100db,这块不用担心是否可闻,这和你回放设备的THD几乎在同一水平线。而20k这块一直都很高,这是理所应当的,因为44100高频的截止点更低,这是预期之中的。
这里我会怀疑,ProQ的示波会不会不准,于是我又打开了另一个频率图监测的插件,这次可以看到几乎是在全频段都有声音出现,但大部分小于-114db,无需考虑它们会不会影响到声音,你的解码器、放大器、耳机等带来的失真可能都会比这个级别高。
48000->44100->48000
如果经过多次转换呢?我们担心若整个听音链路中经过多次采样率转换,会不会造成可闻的失真。
我们把48000的音频转换为44100再转换回48000,然后和原始的48000音频对比,可以看到音频之间的差异更大了,但经过两次转换,除了截止频率之外,依然没有任何频率达到-100dB的声压级(中频高频部分偶尔有点危险了)
ABX双盲听测试
暂时没时间做,有时间开搞,我觉得不可能听出来
测试流程
- 从网易云下载音频,得到48khz/16bits的原始音频
- 导入到Reaper,以44.1khz/16bits导出,得到转换后的音频
- 将转换后的音频导入,反相
结论
我们进行了48000到44100最终再转回48000的采样率转换,最终的结论是有差异,但微乎其微,人耳几乎不可闻。
但本次的实验充满了各种不严谨因素:
- 采样率算法的不同,安卓或windows平台的重采样算法可能不同
- 测试软件Reaper是否可靠,比如它是否会将导入的音频直接进行二次重采样,这样实际上我们看到的结果就不仅仅经历了两次重采样了;再比如它两个轨道间的播放是否存在延时?这样的话我们看到的区别可能不完全是采样率转换带来的
- 频谱图插件靠谱吗?
参考
- 梳理一下各大平台使用的sample rate convert算法
- 2021年Android设备SRC(采样率转换)现状观察