音频开源代码中重采样算法的评估与选择

摘要:
许多开源音频代码都有重采样实现,例如PJSIP和FFMPEG。今天我们讨论的是如何评估这些开源代码中的重采样实现,并选择最合适的实现。SILK中的重采样使用三次插值。在评估之前,应该做一些准备,包括使用CoolEdit生成10秒扫描文件以及包含重采样算法的应用程序。扫描文件和重新采样应用程序完成后,评估开始。最后,sinc方法被公认为目前最佳的音频重采样方法,即CPU负载有点高,这可以通过选择更少的滤波器或优化方法来解决。

在音频软件实现中经常会遇到两个模块采样率不一致的情况,比如语音通话时采集到的PCM信号是16k Hz的,但编码时codec是AMR-NB(AMR-NB是8k Hz采样),这时就需要把16k Hz采样的PCM值转换成8k Hz采样的PCM值(这叫降采样或者下采样),然后再去做AMR-NB编码。再比如音乐播放时音源是44.1k Hz采样率编码的,但是播放时是48k Hz采样率的,这就需要把解码后的44.1k Hz采样率的PCM值转换成48k Hz采样的PCM值(这叫升采样或者上采样),然后再送给codec芯片播放。采样率转换(sampling rate converter, SRC)或者叫重采样有多种方法,简单的有线性插值法(算法简单,load小,但性能一般),复杂的有sinc方法(算法复杂,load大,但性能较好)。好多的音频类开源代码里都有重采样的实现,比如PJSIP和FFMPEG。重采样的原理这里就不详细介绍了,有兴趣的可以看相关文章。今天我们讲的是如何去评估这些开源代码里的重采样实现以及选择最适合的实现。评估主要基于频响特性,其次看CPU load。评估的开源实现是我用过的PJSIP和SILK codec。PJSIP里的重采样有两种实现(线性插值和sinc),通过开关控制选用哪种。SILK里的重采样用的是三次插值方法。对其他开源实现的评估类似。

在评估前先要做一些准备工作,包括用CoolEdit生成10秒的扫频文件和包含重采样算法的应用程序。扫频文件作为应用程序的输入,输出就是重采样后的PCM文件,再看它的频谱特性。以下就是制作扫频文件的步骤:

1,在CoolEdit里新建一个指定采样率单声道的文件。如下图,采样率指定为16k Hz。

音频开源代码中重采样算法的评估与选择第1张

2,选中“生成”菜单里的“音调”,把“固定设置”√去掉,就变成了“初始设置”和“结束设置”。先初始设置,由于是16k Hz采样率,频率范围是50~7k Hz,在初始设置中设置基础频率为50Hz,同时设置持续时间为10秒,如下图:

音频开源代码中重采样算法的评估与选择第2张

再选择“结束设置”,设置基础频率为8k Hz,其他用默认设置,选择“确定”(如下图),一个扫频文件就做好了。

音频开源代码中重采样算法的评估与选择第3张

3,点击“频谱”按钮可以看到一个从50Hz到8000Hz 频谱都非常好的扫频文件,如下图:

音频开源代码中重采样算法的评估与选择第4张

扫频文件这样就做好了。再做重采样应用程序,各种系统下都可以做,我一般是在Ubuntu下做,比较简单,这里就不具体说了。扫频文件和重采样应用程序都做好后就开始评估了。我当时应用的场景是播放侧固定成48k采样,要把8k/16k/44.1k等升采样到48k。做了三个扫频文件,8k采样/16k采样/44.1k采样。先看SILK里的重采样和PJSIP里的线性插值方法在8k->48k和16k->48k下的表现,具体如下:

1,8k转48k: 初始是8k 窄带采样,范围是300~ 3400, 我做的扫频文件频率范围是200~4000. 原始扫频文件频谱如下:

音频开源代码中重采样算法的评估与选择第5张

1)pjsip 的线性插值方法,把扫频文件从8000上采样到48000,得到PCM文件频谱如下:

音频开源代码中重采样算法的评估与选择第6张

2)silk 的三次插值方法,把扫频文件从8000上采样到48000,得到PCM文件频谱如下:

音频开源代码中重采样算法的评估与选择第7张

从上面两图看出,上采样后频谱特性不好了。

2,16k转48k: 初始是16k 宽带采样,范围是50~7000, 我做的扫频文件频率范围是50~8000. 原始扫频文件频谱如下:

音频开源代码中重采样算法的评估与选择第8张

1)pjsip 的线性插值方法,把扫频文件从16000上采样到48000,得到PCM文件频谱如下:

音频开源代码中重采样算法的评估与选择第9张

2)silk 的三次插值方法,把扫频文件从16000上采样到48000,得到PCM文件频谱如下:

音频开源代码中重采样算法的评估与选择第10张

从上面两图看出,上采样后频谱特性也不好了。

再看PJSIP里的sinc方法在44.1k->48k下的表现。用sinc方法也有两种选择,分别是large_filter(滤波器个数达到8192个,load大)和small_filter(滤波器个数达到1536个,load相对小)。具体如下:44.1k转48k,范围是20~20000, 我做的扫频文件频率范围是20~20000. 原始扫频文件频谱如下:

音频开源代码中重采样算法的评估与选择第11张

1)large_filter下变成48000Hz的文件频谱,如下图:

音频开源代码中重采样算法的评估与选择第12张

2)small_filter下变成48000Hz的文件频谱,如下图:

音频开源代码中重采样算法的评估与选择第13张

从上面两图看出,用large_filter的since上采样后频谱特性依旧很好,用small_filter的since上采样后频谱特性在高频时有些不好。

从上面的频谱特性可以看出在播放侧做上采样到48k时最好用sinc的large_filter方法,它的频谱特性最好,但是load会非常高。sinc的small_filter方法频谱特性次之,只在高频时有点差,可接受。线性插值方法的频谱特性就不太好了。综上在这种情况下如果CPU load 不是问题就可用sinc的large_filter方法,如果CPU load 扛不住就用sinc的small_filter方法,线性插值方法由于频谱特性不好不建议用。我们当时是在400MHz的处理器上上做实现, load较为敏感,最终选择了sinc的small_filter方法。

至于其他的场景,方法类似,就不多说了。最后说一句,sinc方法是目前公认的最好的音频重采样方法,就是CPU load有点高,可以通过选择滤波器个数少或者优化的方法解决。

免责声明:文章转载自《音频开源代码中重采样算法的评估与选择》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇sqlserver用windows方式验证登录踩过的坑redis配置参数简介下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

开源的许可证GPL、LGPL、BSD、Apache 2.0的通俗解释

软件开发者要开源软件,不单单是开放源代码就可以了,选择一种许可证很重要,一个许可证之于软件就相当于价值观之于普通人,代表了这个软件的基本品性。一个错误的许可证选择可能会直接导致整个项目的失败。   各种开源的许可证主要的限制还是在redistribution(发布),所以个人/商业公司开发的软件包含了GPL的代码,只要你不发布,是可以任意使用的。 下面是几...

【C++开源库】Windows 下编译 libcurl 库

一、简介 libcurl 是一个跨平台的网络协议库,支持 http, https, ftp, gopher, telnet, dict, file, 和 ldap 协议。libcurl 同样支持 HTTPS 证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP 基本表单上传,代理,cookies 和用户认证。想要知道更多关于 lib...

携程开源框架Apollo基础学习(一)

工作中经常会遇到许多本菜鸡之前听都没听过的东西...这就是其中之一,为此俺去学习了下基础部分,算是先入个门。 本文知识点主要来自于github的教程&各位csdn/博客园博主的总结。 下面让我娓娓道来~ 参考链接:Github链接:https://github.com/ctripcorp/apollo 部署文档: 1.https://ctripco...

java的(SXSSF)EasyExcel阿里开源excel导出和XSSF导出简单示例

一、EasyExcel阿里开源excel导出(SXSSF) 参考链接:EasyExcel阿里开源excel导出  1、建立映射到excel文件的映射类,然后get和set import com.alibaba.excel.annotation.ExcelProperty; public class DownloadAjgl { @ExcelPro...

基于第三方开源库的OPC服务器开发指南(3)——OPC客户端

本篇将讲解如何编写一个OPC客户端程序测试我们在前文《基于第三方开源库的OPC服务器开发指南(2)——LightOPC的编译及部署》一篇建立的服务器。本指南的目的是熟悉OPC服务器的开发流程,所以客户端部分我就不做过多描述,只是简单讲解几个关键技术细节及其实现函数,完整工程源码请从如下地址获取: https://github.com/Neo-T/OPCDA...

画画板--第三方开源--DrawableView

Android上的第三方开源DrawableView支持手写,类似于写字板。DrawableView支持改变画笔颜色,画笔线条粗细,画布的手势缩放和拖曳显示部分区域。并最终支持将手绘的图保存到本地。在github上的项目主页:https://github.com/PaNaVTEC/DrawableView先把布局文件中写一个DrawableView:...