speex降噪算法流程介绍与算法原理

2023-10-20 02:10

本文主要是介绍speex降噪算法流程介绍与算法原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、speex降噪流程介绍

本文对speex去噪算法步骤做一些简要整理和介绍,以提供给对该算法感兴趣的读者参考。

1)preprocess_analysis()包括两部分,主要是加窗交叠傅立叶(fft)变换等常用的信号处理算法。
1.1)预处理
      信号输入,加窗,交叠(overlap),时频傅立叶变换(fft)
1.2)计算能量
      计算频域能量ps,而filterbnak_compute_bank32()计算基于Bark带(临界频带)内的带噪信号能量。
2)update_noise_prob()更新噪声能量,使用的方法比较简单,即一般的固定迭代因子平滑算法;
3)更新mel噪声谱能量;
4)计算后验信噪比和进行先验信噪比更新:
post_SNR = ps/noise - 1;
gamma = 0.1 + 0.89*(old/(old+noise))^2;
priori_SNR= gamma*max(0,post) + (1-gamma)*old_ps/noise;
5)先验信噪比平滑(zeta[i]),用于本底增益计算,计算范围包括fft域和Bark域(Bark域计算后没有用到)。 
6)计算Bark带(临界频带)内的EM算法增益和线性频域上的EM算法增益。
{注:EM(YARIV EPHRAIM 和 DAVID MALAH) 是语音增强领域的泰斗。}
考虑到在临界频带内幅度谱并不一定符合高斯随机分布,所以EM算法在Bark带内不能严格适用,这一点JEAN-MARC也在c代码中做了说明, 所以此处只以线性频率上的EM增益为例进行说明。
    6.1 )   weiner 滤波:prior_snr=   prior_snr /(   prior_snr +1);
    6.2 )  超几何分布增益参数 theta= prior_snr *(1+post_snr);
    6.3)   超几何分布增益 MM=exp(-theta/2)*[(1+theta)*I0(theta/2)+theta*I1(theta/2)];其中I0和I1是贝塞尔函数。
    6.4)   增益 g=min(1,prior_ratio*mm);
    6.5)   p=gain2[i];gain2是由临界频率计算后的增益扩展到线性频域后的增益。
    6.6)   约束增益:如果 g/3>st->gain  则 g=3*st->gain  ;
    6.7)  gain=g;     如果 gain<gain_floor  则  gain =gain_floor  ;
    6.8) 最终幅度谱增益
             gain2={p*sqrt(g)+(1-p)*sqrt(st->gain_floor  )}^2;
  7)将幅度谱增益gain2作用于fft幅度谱

   8)后处理,包括反傅立叶变换(ifft)、加合成窗函数、交叠相加,最终得到去噪以后的时域信号

二、降噪算法原理介绍

    speex降噪算法采用一种基于MMSE短时谱幅度估计的语音增强算法,即STSA-MMSE. 该算法利用了人耳对语音相位变换不敏感的特性,估算得到短时幅度谱之后,利用带噪语音相位信息,合成增强语音。另外spee还应用了MCRA算法进行噪声跟踪,此处不讨论。以下是STSA-MMSE算法原理推导:





三、算法优化思路

 1、优化先验信噪比的估计,先验信噪比能反映声场噪声的变化,其反应速度越灵敏,消噪效果越好。speex中是采用的”直接判决法“估计先验信噪比,该方法中平滑因子是固定的,可以采用自适应变化的平滑因子提高估计准确度。

 2、优化噪声谱跟踪算法,更精准的噪声跟踪对消噪能力提升明显。

 3、优化能量谱计算



这篇关于speex降噪算法流程介绍与算法原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/243905

相关文章

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)

《MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)》掌握多表联查(INNERJOIN,LEFTJOIN,RIGHTJOIN,FULLJOIN)和子查询(标量、列、行、表子查询、相关/非相关、... 目录第一部分:多表联查 (JOIN Operations)1. 连接的类型 (JOIN Types)

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

Pytorch介绍与安装过程

《Pytorch介绍与安装过程》PyTorch因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究和开发的主流工具之一,本文给大家介绍Pyto... 目录1、Pytorch介绍1.1、核心理念1.2、核心组件与功能1.3、适用场景与优势总结1.4、优

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe