在音频软件实现中经常会遇到两个模块采样率不一致的情况,比如语音通话时采集到的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。

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

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

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

扫频文件这样就做好了。再做重采样应用程序,各种系统下都可以做,我一般是在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. 原始扫频文件频谱如下:

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

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

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

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

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

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

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

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

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

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

从上面两图看出,用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有点高,可以通过选择滤波器个数少或者优化的方法解决。

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

  1. [zz] 音频开源代码中重采样算法的评估与选择

    在音频软件实现中经常会遇到两个模块采样率不一致的情况,比如语音通话时采集到的PCM信号是16k Hz的,但编码时codec是AMR-NB(AMR-NB是8k Hz采样),这时就需要把16k Hz采样的 ...

  2. 命令模式在开源代码中的应用

    命令模式的作用:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开. 案例 JDK 中的线程 java.lang.Thread,使用了命令模式. Thread 类的构造方法可以接收实现 ...

  3. 苹果开源代码中惊现“wechat”,老外注释的吐槽亮了!

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 每个科技大厂的开源项目,几乎都是各领域开发者最重要的研究学习 ...

  4. C语言系列(二):最近重拾C语言的想法,谈到C中易错点,难点;以及开源代码中C语言的一些常用技巧,以及如何利用define、typedef、const等写健壮的C程序...

    写在前面的话:本系列主要是自己在c语言运用时,对一些不了解,但开源代码中常用的技巧,和一些c语言中偏门和易错点进行解析. 加入了自己的分析,如果不到位请多海涵,另外,引用一些非常好的文章(都有引用li ...

  5. 5中排序算法(冒泡,选择,插入,快速,归并)

    1冒泡排序 比较相邻的元素,将小的放到前面,(每一轮找出数组中最大的放在后面,后面排好序的数组元素不参与下轮排序). 下面将数组[7,8,5,1,3]里面的元素进行排序. 7 8 5 1 3 1.1: ...

  6. 在GreenDao开源代码中添加FTS4全文检索功能

    GreenDao并不支持全文检索,导致在大量数据中的查询效率低下.本文介绍了如何在GreenDao中添加支持全文检索的功能,希望对GreenDao粉有所帮助. 本文基于GreenDao V3.2.3 ...

  7. Java注释 link_开源代码中注释中的那些a link p @ 是给什么编辑器用的????

    比如下面spring源码中的这段注释 * Servlet-based {@link org.springframework.web.multipart.MultipartResolver} imple ...

  8. 基于DM642的X264开源代码实现的研究

    基于DM642的X264开源代码实现的研究 文章发表于:2008-09-08 11:24 作者:谭超 王库 傅颖 来源:微计算机信息 摘要:本文概述了H.264视频压缩编码标准的主要特性,简要介绍了当 ...

  9. “熊孩子”乱敲键盘攻破 Linux 桌面;苹果开源代码被发现包含兼容微信的代码;网传蚂蚁启用OKR替代KPI | EA周报...

    EA周报 2021年1月22日 每个星期7分钟,元宝带你喝一杯IT人的浓缩咖啡,了解天下事.掌握IT核心技术. 周报看点 1.Flutter 在鸿蒙系统上成功运行 2."熊孩子"乱 ...

最新文章

  1. 怎么把快捷键改成eclipse_Java IDE超好用的10个快捷键
  2. python GIL :全局解释器
  3. T-Sql(七)用户权限操作(grant)
  4. java常用技术名词解析
  5. 数据库连接出错,请检查连接字串"的多种问题解决办法
  6. 操作系统03进程管理Process_Scheduling
  7. 在ASP.NET 3.5中使用新的ListView控件(5)
  8. python线性拟合numpypolyfit_python – 具有适配参数的numpy.polyfit
  9. 藏在兰州拉面里精益管理秘诀
  10. Android应用内存泄露分析以及优化方案
  11. uoj #298. 【CTSC2017】网络
  12. C语言实现成语接龙完整版
  13. php不使用第三变量互换,总结PHP不用第三个变量交换两个变量的值的几种方法
  14. 洛谷 P2071 座位安排 (最大流 + 建图)
  15. 布尔类型(boolean)常量与变量
  16. 为什么微软推出“阉割版”onenote?一篇文章快速入门onenote uwp
  17. 懒人必备 自动识别语音给视频添加字幕
  18. glb转obj文件及构建简单obj文件
  19. 《华林科纳-半导体工艺》 浸涂法制备氧化锌薄膜
  20. 一家企业项目管理做不好,原因就在这里了,看看你们企业是不是有这些问题

热门文章

  1. 快速了解GO语言9 - 包
  2. 经典的机器学习200道面试题(附参考答案)
  3. 第6周作业1-闰年之循环判断
  4. 《计算机是怎样跑起来的》小结
  5. 使用正确的报表软件做统计,帮助企业提高统计报表的质量
  6. 网卡扫盲三:以太网芯片MAC和PHY的关系
  7. JavaScript 迭代器 迭代对象
  8. babun - zsh theme
  9. 手把手教你创建专属个人助理,GitHub免费的
  10. VirtualBox导入ova文件报错E_INVALIDARG (0x80070057)