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

电脑杂谈  发布时间:2020-05-22 03:28:33  来源:网络整理

pcm编码转换lpcm软件_转换pcm_pcm 采样率转换 算法

在音频软件的实现中,经常会遇到两个模块的采样率不一致的情况. 例如,语音通话期间收集的PCM信号为16k Hz,但编码时编为AMR-NB(AMR-NB为8k Hz采样),则需要将16k Hz采样的PCM值转换为PCM的. 8k Hz采样(这称为下采样或下采样),然后进行AMR-NB编码. 另一个示例是音乐源在音乐播放过程中以44.1k Hz采样率编码,但在播放过程中以48k Hz采样率编码. 这需要将44.1k Hz采样率的解码PCM值转换为48k Hz采样的PCM值(此称为上采样或上采样),然后发送到编芯片进行播放. 采样率转换器(SRC)或重采样有多种方法,简单的方法包括线性插值(简单算法,小负载,但平均性能),复杂的方法包括sinc方法(复杂算法,大负载,但性能更好). 许多音频源代码都有重新采样实现,例如PJSIP和FFMPEG. 重采样的原理将不在此处详细介绍. 有兴趣的人可以阅读相关文章. 今天,我们正在讨论如何评估这些开放源代码中的重采样实现并选择最合适的实现. 评估主要基于频率响应特性,然后是CPU负载. 评估的开源实现是我使用的PJSIP和SILK编. PJSIP中有两种重采样实现方式(线性插值和Sinc),一种是通过开关控制选择的. SILK中的重新采样使用三次插值方法. 其他开源实现的评估也与此类似.

在评估之前,必须做一些准备工作,包括使用CoolEdit生成10秒的扫描文件以及包含重采样算法的应用程序. 扫频文件用作应用程序的输入,而输出是重新采样的PCM文件. 看一下它的光谱特性. 以下是创建频率扫描文件的步骤:

1. 在CoolEdit中以指定的采样率创建一个新的单声道文件. 如下图所示,采样率指定为16k Hz.

2. 在“生成”菜单中选择“音调”pcm 采样率转换 算法,然后删除“固定设置”√,它变为“初始设置”和“结束设置”. 首先是初始设置,因为它的采样率为16k Hz,频率范围为50〜7k Hz. 在初始设置中,将基本频率设置为50Hz,并将持续时间设置为10秒,如下所示:

pcm编码转换lpcm软件_pcm 采样率转换 算法_转换pcm

再次选择“结束设置”,将基本频率设置为8k Hzpcm 采样率转换 算法,其他使用默认设置. 选择“确定”(如下所示),然后将准备一个扫描文件.

3. 单击“频谱”按钮,以查看具有从50Hz到8000Hz的非常好的频谱的扫描文件,如下所示:

已完成扫描文件的准备. 重采样应用可以在各种系统下完成. 我通常在Ubuntu下进行. 这是相对简单的,因此在这里我将不做详细介绍. 扫描文件和重新采样应用程序准备就绪后,评估开始. 我当时使用的场景是,播放侧固定为48k样本,而8k / 16k / 44.1k被上采样为48k. 制作了三个扫频文件,分别为8k样本/ 16k样本/44.1k样本. 首先来看一下8k-> 48k和16k-> 48k下SILK中重采样的性能和PJSIP中的线性插值方法,如下所示:

1、8k到48k: 最初是8k窄带采样,范围是300〜3400,我制作的扫描文件的频率范围是200〜4000. 原始扫描文件的频谱如下:

pcm编码转换lpcm软件_pcm 采样率转换 算法_转换pcm

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

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

从上两张图片中可以看到,上采样后光谱特性不好.

转换pcm_pcm 采样率转换 算法_pcm编码转换lpcm软件

2,从16k到48k: 最初是16k宽带采样,范围是50〜7000,我制作的扫描文件的频率范围是50〜8000. 原始扫描文件的频谱如下:

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

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

pcm 采样率转换 算法_pcm编码转换lpcm软件_转换pcm

从上两张图片中可以看到,上采样后光谱特性不好.

在44.1k-> 48k下查看PJSIP中sinc方法的性能. 使用sinc方法还有两种选择,分别是large_filter(过滤器数量达到8192,负载大)和small_filter(过滤器数量达到1536,负载相对小). 详细信息如下: 44.1k至48k,范围为20〜20000,我制作的扫频文件的频率范围为20〜20000. 原始扫频文件的频谱如下:

1)文件的频谱在large_filter下变为48000Hz,如下所示:

2)在small_filter下变为48000Hz的文件的频谱,如下所示:

从上面的两张图片中可以看出,使用large_filter进行升采样后的频谱特性仍然非常好,而使用small_filter进行升采样后的频谱特性在高频下有些不好.

从上述频谱特性可以看出,在回放侧将采样向上采样到48k时,最好使用sinc的large_filter方法. 它的光谱特性是最好的,但是负载会很高. sinc的small_filter方法后面是频谱特性,在高频下它只是一点点差,这是可以接受的. 线性插值方法的光谱特性不是很好. 总而言之,在这种情况下,如果CPU负载不是问题,则可以使用sinc的large_filter方法. 如果无法使用CPU负载,则可以使用sinc的small_filter方法. 不推荐使用线性插值,因为其频谱特性较差. 当时我们在400MHz处理器上实现它,负载更加敏感,最后选择了Sinc的small_filter方法.

对于其他场景,方法是相似的,所以我就不多说了. 最后,sinc方法是目前公认的最佳音频重采样方法,也就是说,CPU负载有点高,可以通过选择少量滤波器或优化方法来解决.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-218423-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 刘丹
        刘丹

        那是替我们大陆人秀的

      • 方玉鹏
        方玉鹏

        刚好可以在那试验爆炸

      • 李秘
        李秘

        绝大多数的人都不理解谢教授的真正用意

      热点图片
      拼命载入中...