我们常用的手机、消费类摄像头等产品的麦克风所采集的原始声音信号中往往包含了比较多的背景噪音,不仅影响用户录音和回放的使用体验,而且这些噪声数据还会降低音频编码的压缩效率,因此有必要对音频底噪进行抑制处理,这就是ANS(Auto Noise Suppression)功能的用武之地。

音频3A中对于环境噪音的控制,除了以上的自动噪声抑制ANS技术以外,还存在一个主动噪声消除ANC(Active Noise Cancellation)的环节。ANS与ANC的区别主要在于,前者是采用被动降噪的方式,分析环境噪声中频率成分针对性的对其滤波处理,尽可能保留清晰的语音部分,并提高音质;而后者常见于目前市场上非常流行的主动降噪耳机,针对环境中存在的噪音,对噪声声波的频率相位等分析,产生与噪声相位相反的声音信号来实现噪声抵消的效果。因此两者主要的区别就在于,ANS采用被动滤波的方式进行降噪,ANC则采用主动产生与噪声波形相位相反的方式来实现与噪声的相互抵消。一般而言,在消费类摄像头领域中,对于摄像头麦克风所采集声音数据的处理只会用到ANS,因此本文仅关注ANS方式的被动降噪处理机制。

1. 音频背景噪音的来源

一般来说,对于模拟系统来讲,噪声可产生于系统的各个环节之中,因此模拟系统更容易受到干扰而产生噪声,而对于数字设备而言,抗干扰和噪声的性能要好很多,噪声串入的薄弱环节总是设备中的A/D、D/A转换部分。在消费类电子领域,从成本等角度考虑,目前模拟音频元件和处理电路仍然是应用中的主流,所以该类型产品中因为各种干扰所造成的背景噪声等方面的声音质量劣化往往是产品开发中的难点所在。

总的来讲,消费类Camera产品的音频噪声主要来源于以下几个方面:

  • • 设备电子元器件运行中的固有噪声。例如,电子元器件(电容、电阻等)在高频运行下本身就会产生细微的白噪声,这些噪声很容易被附近灵敏度高的麦克风拾取、放大后变得清晰可闻。
  • • 电磁干扰。电路在高频开关切换的运行过程中,尤其设备内部空间中有无线通信电路功能运行时,所产生的高频电磁波辐射干扰,通过音频传输线路串入模拟音频信号之中,从而产生电磁干扰噪声。
  • • 电源干扰和接地回路噪声。电源电路中的尖峰、脉冲、浪涌等,通过电源线路串入音频线路,以及不同电路部分的地线接地电位差导致电流环路,这些电源和接地方面的噪声会对音频的小模拟信号产生显著影响。

从以上音频噪声的来源总结可以看到,这些音频噪声大多数来源于硬件设备相关的设计和实现,其中部分噪声来源是可以优化的,例如通过优化电源接地设计,以及调整布局改善音频线路处理模块的电磁干扰状况,但是不可否认的是,消费类电子产品的结构和电子设计方面的局限性,会导致部分干扰因素无法从硬件层面完全解决。此时就要想办法利用Audio Codec中的音频增强功能甚至软件层面上的音频噪声过滤算法来提升音频采集的质量。

2. 噪声的典型分类及其处理

从总体上,音频背景噪声可以分为两类:平稳噪声和瞬时噪声。

平稳噪声的最大特点就是其统计特性((如均值、方差、频谱分布)不随时间变化。

  • • 平稳噪声在时域上,振幅波动较小,呈现出规律性分布(如高斯分布)。
  • • 在频域方面,其频谱连续且稳定,例如白噪声会覆盖全频带。
  • • 比较典型的平稳噪声场景包括:高斯白噪声、电子设备的热噪声、量化噪声、持续的背景环境噪声(如空调声、风扇声等)。

瞬时噪声则是突发性强、持续时间短(毫秒至秒级)的噪声,其统计特性一般会随时间剧烈变化。

  • • 在时域方面,瞬时噪声一般具有高幅值、短时间冲击的特性。
  • • 在频域方面,其能量一般集中在高频或者特定的频段。
  • • 典型的瞬时噪声包括脉冲噪声(敲击键盘声音、敲门声、开关)、机械冲击声、不规则的电磁干扰(如静电放电)等。

总的来讲,对于平稳噪声的处理,因为其统计特性及其频谱分布相对比较稳定,容易识别,因此可以根据噪声的频谱特性和具体的信号特征进行针对性抑制,相对容易处理。但是瞬时噪声在时域上突发性很强,而且频谱基本上总是和正常语音的频谱混叠在一起,很难进行抑制,因此技术上对于瞬时噪声如何有效的抑制缺乏好的解决方案

3. 典型音频降噪算法

下图是典型的音频降噪算法的处理流程图。无论是传统的信号处理算法,还是基于AI增强处理的思路,最终都是要对音频噪声的类型进行检测,对噪声模型进行建模,然后基于噪声的模型针对性的进行处理。

以下以两个常用的传统音频数字信号处理模式的音频降噪算法,即谱减法和自适应LMS滤波法对音频降噪的流程进行解释和说明。

3.1. 谱减法

谱减法是一种基于频域的噪声抑制技术,也就是通过对噪声频谱的估计和建模,在频域中从包含噪音的混合信号中减去噪声成分的处理方式。既然是基于频域的处理方式,那么总体的处理流程中,就不可避免地要使用FFT把时域中采集的音频采用数据序列转换成频域的频谱序列 ,在频域中进行处理后,再通过IFFT把处理后的信号转换回时域。这样的处理流程自然就涉及到加大的运算量。

谱减法的整体工作原理是,在语音静默段(也就是仅含噪声的时间里面)估计和建立噪声功率谱模板,然后从包含噪声信号在内的混合信号的功率谱中减去噪声模板的功率谱,从而达到只保留语音成分的目的。

基于谱减法进行音频噪声消除的工作流程大致如下:

  • • 首先对音频在时域中的采样数据序列分片处理,分片的时长固定并与要计算FFT的点数相一致,例如在16KHz音频采样,进行512点FFT计算的情况下,以32ms为单位进行音频数据的分片,一个音频分片单位就是一个音频帧。
  • • 对这个音频帧进行FFT计算,得到其频谱数据。
  • • 通过一个独立的VAD检测模块,检测当前是否处于语音静默期。在当前处于语音静默期的情况下,基于当前通过FFT计算得到的频谱序列对噪声功率谱模板进行动态的更新,使之与当前的噪声频谱状态相一致。
  • • 针对当前音频帧的频谱数据序列,在频域执行谱减运算:也就是把当前音频帧的频谱数据,与当前噪声功率谱模块的同频数据进行相减,在当前音频帧的频谱上减去噪声的功率谱,得到仅保留通话语音成分的频域数据。
  • • 最后再通过IFFT把处理过的数据从频域转换回到时域,重新合并为音频数据序列,恢复为时域的连续音频采样信号。

3.2. 自适应LMS滤波算法

不同于在频域工作的谱减法,LMS滤波算法是一种在时域工作的自适应滤波器算法,通过动态比较音频实时采样的数据序列与滤波器的输出,通过其计算误差迭代调整滤波器系数,来实现最小化期望信号与滤波器输出之间的均方误差。

自适应LMS滤波器主要有两个参数:

  • • 滤波器阶数L:用于建模的噪声长度,用于匹配噪声的时间相关性。L越大,意味着对于每个音频采样的过滤会参考越多的历史采样数据,计算量也越大。典型值为64-256之间。
  • • 补偿μ:主要用于控制噪声变化跟踪的收敛速度和稳定性,典型值为0.001-0.01之间。

自适应LMS滤波算法的执行流程:

  • • 首先把当前要进行过滤的音频采样数据input,以及该采样之前的L-1个历史音频采样数据放在缓冲区History中。
  • • 基于History历史缓冲区数据以及LMS滤波器的当前参数W,计算LMS滤波器的输出值Y:累加历史采样数据History[i]与滤波器参数W[i]的乘积。
  • • 计算当前音频采样数据input与以上计算出来的LMS滤波器输出Y的差值E,这个差值E就是经过LMS自适应过滤的值。
  • • 基于以上差值E、历史缓冲区中的采样数据History[i]、LMS滤波器的μ对滤波器系统的运行参数W[i]进行更新。
  • • 返回以上计算出来的差值E。

以下是一段进行自适应LMS滤波算法处理的参考代码,可以配合理解以上的执行流程:

#define L 128  //阶数为128阶
#define FRAME_SIZE 256
#define MU 0.002f   //μ为0.002ffloat w[L]={0};// 滤波器系数
float x_history[L]={0};// 音频采样数据的历史缓冲区voidprocess_frame(float*input,float*output){for(int n =0; n < FRAME_SIZE; n++){// 1. 更新输入历史(FIFO)// 每次计算都把当前最新的音频采样数据放在x_history缓冲区的开头memmove(x_history +1, x_history,(L-1)*sizeof(float));x_history[0]= input[n];// 2. 计算滤波器输出yfloat y =0.0f;for(int i =0; i < L; i++){y += w[i]* x_history[i];}// 3. 计算误差e,实际上就是执行滤波处理float e = input[n]- y;// 4. 更新滤波器系数for(int i =0; i < L; i++){w[i]+= MU * e * x_history[i];}// 5. 输出降噪结果output[n]= e;}
}

LMS自适应滤波算法在应用中还经常会配合双麦克风来实现更好的降噪效果。主麦克风靠近人的嘴部用于采集人说话的声音,副麦克风远离嘴部并放在噪声源附近(如耳机外侧)用于采集环境噪声,工作的过程中用副麦克风采集的环境噪声数据训练和更新LMS滤波器的参数,然后对主麦克风的音频采样数据进行过滤。这种方式对对周期性噪声(发动机声、风扇声)的抑制效果极佳。

  • • 当然,如果要使用主副麦克风的话,以上LMS过滤算法的执行流程和对应的代码,就需要增加一个参考音频信号(来自副麦克风)的采样序列,History和LMS滤波器的输出及其参数更新基于副麦克风的采样数据进行计算,对于主麦克风采样数据的过滤则使用主麦克风的采样数据减去LMS滤波器的输出即可。

从以上的谱减法和自适应LMS滤波算法的实现比较来看,谱减法要涉及到频域和时域之间的两次相互转换,因此数据的计算量是比较大的,但是对于一帧音频数据进行一次运算;而自适应LMS滤波算法是直接在时域中进行运算,但是针对每个采样都需要执行两次与滤波器阶数相同的浮点数运算,分别用于计算滤波器输出和更新滤波器的运行参数,所以如果滤波器阶数比较高的话,计算量也会比较可观。但是总的来说,后者对于计算资源的要求更低,更适合用于资源有限的嵌入式系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92105.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92105.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/92105.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 使用期物处理并发(使用concurrent.futures模块启动 进程)

使用concurrent.futures模块启动进程 concurrent.futures 模块的文档 &#xff08;https://docs.python.org/3/library/concurrent.futures.html&#xff09;副标题 是“Launching parallel tasks”&#xff08;执行并行任务&#xff09;。这个模块实现的是真正 的并行计算&…

【系统全面】Linux内核原理——基础知识介绍

理解内核&#xff1a;内核原理 计算机系统的软件分层 不同于单片机中使用代码直接与硬件交互&#xff0c;对于这种方式的缺点深有&#xff1a; &#xff08;1&#xff09;复杂度高&#xff0c;调用难度高&#xff0c;需要深入理解硬件的工作原理和细节。 &#xff08;2&#xf…

Oracle自治事务——从问题到实践的深度解析

一、引言&#xff1a;当“关键操作”遇上主事务的“生死绑定”​先问大家一个问题&#xff1a;假设你在开发一个用户管理系统&#xff0c;核心功能是“用户注册”&#xff0c;同时需要记录“操作日志”。某天&#xff0c;用户提交注册信息时&#xff0c;数据库突然因磁盘空间不…

广播(Broadcast)和组播(Multicast)对比

概述 广播&#xff08;Broadcast&#xff09;和组播&#xff08;Multicast&#xff09;是计算机网络中两种重要的一对多通信方式&#xff0c;用于高效地将数据同时分发给多个接收者&#xff0c;它们的核心区别在于目标接收者的范围和控制精度&#xff0c;基于业务对效率、规模和…

在 HTTP GET 请求中传递参数有两种标准方式

方法 1&#xff1a;URL 查询参数&#xff08;Query Parameters&#xff09;格式&#xff1a;?参数名值&参数名2值2示例请求http://localhost:8080/hello?name张三&age25后端接收方式GetMapping("/hello") public String sayHello(RequestParam String name…

pycharm windows/linux/mac快捷键

适用于mac的快捷键 适用于windows和linux的快捷键 参考资料&#xff1a; https://www.jetbrains.com/zh-cn/help/pycharm/mastering-keyboard-shortcuts.html

前端包管理工具深度对比:npm、yarn、pnpm 全方位解析

前言&#xff1a;为什么我们需要包管理工具&#xff1f; 在现代前端开发中&#xff0c;模块化已成为标配。一个中型项目可能依赖数百个第三方包&#xff0c;手动管理这些依赖几乎是不可能的任务。包管理工具应运而生&#xff0c;它们不仅解决了依赖安装问题&#xff0c;还提供了…

调试Claude code的正确姿势

随着kimi k2的发布&#xff0c;Claude code的使用频率愈发的频繁&#xff0c;在发现moonshot官方提供了调试工具之后&#xff0c;我对claude code的交互过程愈发好奇。 moonpalace的安装 官方moonpalace仓库地址 go语言编写&#xff0c;可以直接下载二进制二进制文件&#x…

【常见分布及其特征(5)】连续型随机变量-连续均匀分布

概率密度函数&#xff08;PDF&#xff09;与概率质量函数&#xff08;PMF&#xff09;说明 基本概念区分 对于连续型随机变量&#xff0c;通常使用 概率密度函数 (Probability Density Function, PDF) 进行描述&#xff1b;这与离散型随机变量使用的 概率质量函数 (Probabili…

FAN-UNET:用于生物医学图像分割增强模型

目录 一、论文结构概述 二、创新点详解 三、创新点结构与原理 &#xff08;1&#xff09;Vision-FAN Block&#xff1a;全局与周期特征的融合引擎 &#xff08;2&#xff09;FANLayer2D&#xff1a;周期性建模的核心 四、代码复现思路 五、仿真结果分析 &#xff08;1&…

基于SpringBoot的篮球运动员体测数据分析及训练管理系统论文

第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行业&#xff0c;尤其是规模较大的企业和学校等…

矩阵算法题

矩阵算法题1、矩阵置零2、螺旋矩阵3、旋转图像4、搜索二维矩阵1、矩阵置零 解题思路&#xff1a;这道题核心是要确定哪些行和哪些列要置零。所以定义两个数组&#xff0c;一个记录要置零的行&#xff0c;一个记录要置零的列。遍历整个矩阵&#xff0c;如果当前位置是0的话&…

Spring底层(二)Spring IOC容器加载流程原理

一、怎么理解SpringIoc IOC&#xff1a;Inversion Of Control&#xff0c;即控制反转&#xff0c;是一种设计思想。之前对象又程序员自己new自己创建&#xff0c;现在Spring注入给我们&#xff0c;这样的创建权力被反转了。 所谓控制就是对象的创建、初始化、销毁。 创建对象…

UDP中的单播,多播,广播

文章目录UDP 简单回顾一、单播&#xff08;Unicast&#xff09;定义特点应用举例二、广播&#xff08;Broadcast&#xff09;定义特点应用三、多播&#xff08;Multicast&#xff09;定义特点应用UDP 单播、广播、多播的对比总结额外说明代码简要示例&#xff08;C&#xff09;…

数据库练习3

一、建立product表&#xff0c;操作方式operate表要求&#xff1a;1.定义触发器实现在产品表(product)中每多一个产品,就在操作表(operate)中记录操作方式和时间以及编号记录。注&#xff1a;操作说明&#xff1a;标记执行delete 、insert、 update2.定义触发器实现在产品表(pr…

pycharm和anaconda安装,并配置python虚拟环境

1、pycharm和anaconda安装 PyCharm与Anaconda超详细安装配置教程_anaconda pycharm安装-CSDN博客https://blog.csdn.net/qq_32892383/article/details/116137730 2、pycharm汉化 PyCharm汉化&#xff1a;简单两步搞定&#xff01;PyCharm怎么设置中文简体&#xff0c;为什么…

EP04:【Python 第一弹】函数编程

一、定义 函数指将一组语句的集合通过一个变量名封装起来&#xff0c;调用这个函数变量名&#xff0c;就可以执行函数。 二、特点 减少重复逻辑代码的编写将程序中的逻辑可以进行扩展维护项目程序的代码更简单 三、创建 def 函数名():逻辑代码1逻辑代码2return 结果 函数名…

linux安装Mysql后添加mysql的用户和密码

在 MySQL 中创建用户并设置密码的完整指南如下&#xff1a; 方法 1&#xff1a;使用 CREATE USER 语句&#xff08;推荐&#xff09; -- 创建新用户并设置密码 CREATE USER newuserlocalhost IDENTIFIED BY your_password;-- 授予权限&#xff08;示例&#xff1a;授予所有数据…

React hooks——memo

一、简介React.memo 是 React 提供的一个高阶组件&#xff08;Higher-Order Component&#xff09;&#xff0c;用于优化函数组件的渲染性能&#xff0c;它通过浅比较&#xff08;shallow compare&#xff09;props 的变化来决定是否重新渲染组件。1.1 基本用法const MyCompone…

leetcode15.三数之和题解:逻辑清晰带你分析

介绍 题源 分析 1.双指针固定一个数 首先明白一点&#xff0c;我们有三个数&#xff0c;我们想使用双指针&#xff0c;那就必须固定一个数。 2.二分 本题还涉及二分&#xff0c;双指针经常和二分结合使用&#xff08;二分本质就是双指针&#xff0c;仔细思考这思考这句话&…