zoukankan      html  css  js  c++  java
  • 基于MCRAOMLSA的语音降噪(二):实现

    上篇文章(基于MCRA-OMLSA的语音降噪(一):原理)讲了基于MCRA-OMLSA降噪的原理,本篇讲怎么做软件实现。软件实现有多种方式。单纯看降噪效果可用python,因为python有丰富的库可用,可节省不少时间,把主要精力放在降噪效果提升上。如果要把算法用在产品上就得用其他语言。我们是芯片公司,且我们team偏底层,最常用的语言是C,所以我又用C实现了该算法。本文先讲讲在python下的实现,再讲讲在C下的实现。

    一,python下的实现

    Python有丰富的库,音频文件读取的librosa/soundfile等,数学库的numpy(里面也包含了信号处理的fft等),连算指数积分的都有了(scipy.special.exp1)。算法原理搞清楚了后先画软件流程图,如下图:

     

    根据流程图并且基于现成的python库很快就能把算法实现了。关键是调优,要有好的降噪效果。算法里参数较多,主要有αp、αs、αd等,其中有些有推荐的经验值,有些需要自己tuning。参数tuning过程中降噪效果评估依旧用权威的PESQ。将干净语音和噪声以指定的SNR(通常有0db/5db/10db/15db等)叠加后得到带噪语音,用降噪算法对这个带噪语音做降噪得到降噪后的语音。用PESQ工具分别将带噪语音和降噪后的语音与原来的干净语音做比较,可以得到MOS分提高了多少。花了一些时间tuning后有了一个相对不错的降噪效果,以叠加的是白噪声为例,降噪后在各种SNR下的MOS分提升如下表:

    二,C语言下的实现

    C语言下的实现要用在产品中,算法的运算量(即 CPU load)是一个要重点考虑的因素。实现通常分两个阶段。第一阶段是基于C中已有数学库的浮点实现,在参数值一样的情况下降噪效果要和python实现的保持一致。如果运算量较大或者处理器不支持浮点运算,需要进入第二阶段。首先将用到的数学库函数用自己写的函数(函数里只有加减乘除等)代替,然后再将整个算法定点化,使运算量降下来。

    1,第一阶段

    首先根据算法和流程图定义结构体和API。这里简单把API列一下,如下图:

    从上图看出,MCRA和OMLSA各有两个API,相对简洁,一个是初始化,一个是算法处理。实现时遇到的第一个问题是C语言数学库里没有提供指数积分函数,需要自己实现。在网上搜了下,书《常用算法程序集(C语言)第三版》的14.15节讲了怎么算指数积分,这里简单介绍下。令

    其中γ为欧拉常数(γ = 0.577215664901532860606512)。

    可以通过该书9.7节的勒让德-高斯求积分法来求。对勒让德-高斯求积分法感兴趣的可以找相关资料来看,这里就不详细介绍了。把Ei(x)求出后再取反就是算法中所要的的值。取几个值比较这个实现与python里scipy.special.exp1的结果,如下表,可以看出精度还是挺高的。

    算法代码写好后,还需要FFT相关的代码才能调试,FFT相关的选用了CMSIS里浮点实现的代码。调试时带噪语音文件依旧用的是python实现调试的那个,这样结果好对齐,方便比较各个环节的输出,如FFT的输出、噪声估计的输出等。调试时要一级一级的调,在误差允许的范围内,如果上一级的输出一致而本级的输出不一致,则问题就出在这一级里。在这个方法下很快就调试好了,在误差允许的范围内,每帧各个频点降噪后的幅度谱与python里的保持一致。

    2,第二阶段

    第二阶段可分两个子阶段,一是把数学库的函数用自己写的函数(函数里只有加减乘除等运算)替代,二是把整个算法定点化。目前第一个子阶段已完成,第二个子阶段完成后有机会也会写怎么对算法做定点化的。

    算法用到的数学库函数主要是自然指数(exp())和一般指数(pow()),再加上做完FFT后是复数,需要用求平方根(sqrt())算得幅度谱,所以需要写出这几个库函数对应的函数。对于一般的求指数而言,它可以转换成求自然指数和自然对数,具体关系如下:,所以只要实现了自然指数和自然对数就可以了。这样最终实现的函数是3个:自然指数,自然对数,求平方根。至于怎么实现的这3个函数,细节较多,会在后面专门写一篇文章讲。实现完这些函数后与标准库里的做比较,误差在允许的范围内即可。再把这些函数用在算法中,拿降噪后的幅度谱与python里的比较,误差也在允许的范围内。

  • 相关阅读:
    leetcode33. Search in Rotated Sorted Array
    pycharm 设置sublime text3 monokai主题
    django class Meta
    leetcode30, Substring With Concatenation Of All Words
    Sublime text3修改tab键为缩进为四个空格,
    sublime text3 python打开图像的问题
    安装上imesupport输入法依然不跟随的解决办法,
    sublime text3 的插件冲突弃用问题,
    sublime text3 BracketHighlighter括号匹配的设置
    windows 下wget的使用
  • 原文地址:https://www.cnblogs.com/talkaudiodev/p/15737338.html
Copyright © 2011-2022 走看看