测试采样率变化对音频的影响

news/2024/11/13 2:17:36/文章来源:https://www.cnblogs.com/lilpig/p/18335384

SRC(Sample Rate Convert,采样率转换)是hifi发烧友老生常谈的一个问题。为了让多个来源的音频可以同时输出给设备,操作系统会将全部的音频转换为同一采样率,比如Android设备会将音频采样率统一转换为48kHz。这篇文章测试了不同安卓设备和版本之间的音频重采样:2021年Android设备SRC(采样率转换)现状观察

发烧友们认为,SRC转换是会极大影响音质的,且无法接受的,而我也一直认为会影响音质,并且几乎一直尽力的使用USB独占或ASIO来播放音乐,甚至最近动了买一个播放器的念头。

但真的会影响吗?或者说真的会产生人耳可闻的影响吗?我开始思考这个问题。

理论分析

先说一下什么是采样率。

声音由如下图中的振动产生,振动的幅度处于不断的连续变化之中,但要将其转换到数字系统中时,则必须进行离散化,比如一秒钟之内我对原始振幅采样48000次,来模拟这种现实世界中连续的变化。

img

img

采样率就是一秒钟有多少个采样点来描述音频的振幅。

再说采样率转换,理论上来说,采样率转换对音质的影响和转换算法有非常大的关系。

先考虑整数倍向上转换,比如48kHz转换成96kHz,如下图所示,原来的两个频点中间会多出一个频点,该频点如何选择是采样率算法决定的,比如它可以选择两点之间的均值,也可以选择和上一个点完全一致,目前的常见的插值算法有:一阶保持FOH、零阶保持ZOH、三次样条函数spline和sinc函数。对这些转换算法的讨论目前受限于本人能力水平,无法做到。

img

整数倍向上转换至少会保持转换前的采样点,非整数倍转换则会丢失这些原始采样点,下面我画个简单的图示意一下:

img

下面是同一个音乐经过采样率转换后(48000->44100)的波形对比,可以根据目前竖线的位置来判断,采样点之间已经发生变化。

img

这是从时域上的分析,我们知道时域的变化将直接影响频域,但这里的影响应该不会那么明显,采样点足够多,对振幅走势的模拟应该不会有很大变化。从频谱图上几乎也看不出啥,硬要说区别,可能就是极高频有些区别,毕竟48000kHz的截断频率是24kHz,44100则是22.05kHz,但这里的区别人耳不可闻。

img

理论上:

  • 无论是整数倍还是非整数倍,都和采样率转换算法有很大关系
  • 整数倍的向上转换,会保留原始采样点,插入新的采样点
  • 整数倍的向下转换,会保留部分原始采样点
  • 非整数倍的向上向下转换,会生成很多新的采样点

实践

48000->44100

在Reaper中将48kHz和44.1kHz的音频一起播放,并反相其中一个,可以看到在响度较大的部分总轨偶尔会有声音出现,这一部分是否是不可闻的极高频呢?

img

通过pro-q的波形展示,我们可以看到几乎是从10k之前一点都有很微弱的声音变化,小于-100db,这块不用担心是否可闻,这和你回放设备的THD几乎在同一水平线。而20k这块一直都很高,这是理所应当的,因为44100高频的截止点更低,这是预期之中的。

img

这里我会怀疑,ProQ的示波会不会不准,于是我又打开了另一个频率图监测的插件,这次可以看到几乎是在全频段都有声音出现,但大部分小于-114db,无需考虑它们会不会影响到声音,你的解码器、放大器、耳机等带来的失真可能都会比这个级别高。

img

48000->44100->48000

如果经过多次转换呢?我们担心若整个听音链路中经过多次采样率转换,会不会造成可闻的失真。

我们把48000的音频转换为44100再转换回48000,然后和原始的48000音频对比,可以看到音频之间的差异更大了,但经过两次转换,除了截止频率之外,依然没有任何频率达到-100dB的声压级(中频高频部分偶尔有点危险了)

img

ABX双盲听测试

暂时没时间做,有时间开搞,我觉得不可能听出来

测试流程

  1. 从网易云下载音频,得到48khz/16bits的原始音频
  2. 导入到Reaper,以44.1khz/16bits导出,得到转换后的音频
  3. 将转换后的音频导入,反相

结论

我们进行了48000到44100最终再转回48000的采样率转换,最终的结论是有差异,但微乎其微,人耳几乎不可闻。

但本次的实验充满了各种不严谨因素:

  • 采样率算法的不同,安卓或windows平台的重采样算法可能不同
  • 测试软件Reaper是否可靠,比如它是否会将导入的音频直接进行二次重采样,这样实际上我们看到的结果就不仅仅经历了两次重采样了;再比如它两个轨道间的播放是否存在延时?这样的话我们看到的区别可能不完全是采样率转换带来的
  • 频谱图插件靠谱吗?

参考

  • 梳理一下各大平台使用的sample rate convert算法
  • 2021年Android设备SRC(采样率转换)现状观察

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/775970.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐一款基于人工智能驱动的无代码自动化测试平台!

今天给大家推荐一款基于人工智能驱动的无代码自动化测试平台:testRigor! 1、testRigor介绍 简单来说,testRigor是一款基于人工智能驱动的无代码自动化测试平台,它能够通过分析应用的行为模式,智能地生成测试用例,并自动执行这些测试,无需人工编写测试脚本。可以用于Web、…

获取安卓中加密数据库的密钥

带大家过一遍如何分析常见java层的数据库加密密钥确定数据库是否加密,找到数据库路径,对于有度这个样本,其数据库位于/data/data/im.xinda.youdu/files/youdu/db/路径下,该路径会存在1个或多个文件夹,用于存储不同用户的数据,其格式为buin_用户uin_user_用户gid,其中uin…

C#/.NET/.NET Core优秀项目和框架2024年7月简报

前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项…

Linux 端口排查小结

检查网络端口排查思路:首先进行ping测试,如果ping测试不同检查ICMP协议是否开通和防火墙设置。 如果ping测试通的话 3.telnet ip 端口 ,检查是否可以测通,如果测不通,首先进入服务器检查监听端口和对应开放的IP: netstat -tunlp |grep 224、如果还不通 检查防火墙 和 i…

破案了

看来以后发犇犇要小心点了,不然就被学弟翻到了😰

2024.8.1 鲜花

QQQwwwQQQRe:End of a dream鞅的停时定理 感觉学起来还挺简单的,就是有太灵活逆天的式子。 这里不放鞅的定义了,可以看 百度百科 这里指的是连续鞅。 停时定理: 若满足一下三个条件之一: \[P\{ T < \infty \}=1\\ \]\[E[|M_T|]<\infty\\ \]\[\lim_{n\to \infty} E[|M…

Golang语言文件操作快速入门篇

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.文件的读取操作1.什么是文件2.IO流类型概述3.文件的基本操作3.1 打开和关闭文件3.2 带缓冲大小读取文件内容3.3 循环读取4.ioutil包一次性读取小文件4.1 ioutil包概述4.2 ioutil读取整个文件5.bufio包…

GO语言文件操作快速入门篇

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.文件的读取操作1.什么是文件2.IO流类型概述3.文件的基本操作3.1 打开和关闭文件3.2 带缓冲大小读取文件内容3.3 循环读取4.ioutil包一次性读取小文件4.1 ioutil包概述4.2 ioutil读取整个文件5.bufio包…

[SWPUCTF 2021 新生赛]re1

我们一起来看一下这道逆向题吧! 1.检查一下是几位的程序,并查看是否有壳。看图可以知道它是64位的程序,并没有壳,可以放心反汇编啦! 2.让我们来看一下它的伪C代码:这题的代码也是浅显易懂呀,主要就是输入一个Flag,再将这个Flag进行处理,处理后将得到的字符串与程序中已…

通过模型划分进行分布式训练

通过模型划分进行分布式训练 https://siboehm.com/articles/22/pipeline-parallel-training 流水线并行性使得训练不适合单个GPU内存的大型模型成为可能。示例:Hugginface的BLOOM模型是一个175B参数的Transformer模型。将权重存储为bfloat16需要350GB,但他们用来训练BLOOM的G…

[vue3] Vue3 自定义指令及原理探索

这篇文章记录了在Vue3中如何在全局或者组件内部注册自定义事件,并通过阅读源码探索自定义事件的实现原理。Vue3除了内置的v-on、v-bind等指令,还可以自定义指令。 注册自定义指令 全局注册 const app = createApp({})// 使 v-focus 在所有组件中都可用 app.directive(focus, …

关于在windows系统下使用Linux子系统

今天意外刷到一个短视频,介绍了如何在windows下方便的使用系统自带的Linux子系统,本人抱着好奇的心理,也因为最近碰到了只使用windows操作系统解决不了的问题,还有想到以后测试项目大概率也要在Linux系统下进行。除此之外,本人之前也尝试过使用类似于Vmware等大型虚拟机来…