一 原理:

  主动降噪就是通过反相检测麦克风的声音或噪声来减弱周围环境的噪声让扬声器出来的声音听起来更清晰。主动降噪技术的目标就是通过一个自适应滤波器把不想要的噪声反相从而把噪声约束到固定的范围内。该系统必须要把扬声器到麦克风的二阶误差考虑进去。主动降噪用到的主要原理是:FxLMS(过滤的最小均方差滤波器)。这个算法的会让输入到滤波器的错误信号急速锐减,从而达到降噪的目的。这个错误信号在期望值和FxLMS滤波器输出值之间是有差异的。

我们可以看一下这个算法的模型:

输入参数:

  • 参考输入: 就是要消除的噪声
  • 错误输入:降噪引入的噪声加扬声器的输出声音
  • 适配开关
  • 参考滤波输入:二级路径的参考滤波信号,所谓的二级路径就是FxLMS滤波器输出值反馈到FxLMS滤波器的错误输入。

模型的输出:

  • 降噪后的结果

可调参数:

  • 自适应滤波器长度
  • 自适应步长
  • 泄漏因子

下面的这个图应该能够很好的诠释了这个流程:

输出y(n) 和输入x(n)之间有个适量因子W,W的参数是通过下面公式计算出来的:
  W = (1- alpha * Leakage)* W + alpha * error(n) * XFilterd/ energy
这里的因子的含义:
  * XFilterd:滤波后的参数输入矢量
  * alpha:步长参数
  * Leakage:泄漏因子
  * error(n): 本帧的错误采样
  * energy:滤波后的参考矢量的平方值
下图是经过LxLMS滤波器后的效果图:第一个是输入噪声,第三个为反相信号,中间的为滤波器的输出信号。

二 仿真:

  为了清晰的展现主动降噪的原理,我找到了一份matlab代码,这份代码能够很清晰的说明ANC的效果和作用。及实现原理:代码比较简单,我就不一一赘述了。有兴趣的朋友可以运行一下试试。尝试改一下参数,就知道效果了。
这里使用滤波器长度为44ms的,步长为0.0001的信号来仿真这些信号统计。

  下面是源码:

 % FIR Filter to be used to model primary propagation path
primaryPathGenerator = dsp.FIRFilter('Numerator',primaryPathCoeffs.'); % Filtered-X LMS adaptive filter to control the noise
L = 350;
muW = 0.0001;
noiseController = dsp.FilteredXLMSFilter('Length',L,'StepSize',muW, ...
'SecondaryPathCoefficients',SecondaryPathCoeffsEst); % Sine wave generator to synthetically create the noise
A = [.01 .01 .02 .2 .3 .4 .3 .2 .1 .07 .02 .01];
La = length(A);
F0 = 60;
k = 1:La;
F = F0*k;
phase = rand(1,La); % Random initial phase
sine = audioOscillator('NumTones', La, 'Amplitude',A,'Frequency',F, ...
'PhaseOffset',phase,'SamplesPerFrame',512,'SampleRate',Fs); % Audio player to play noise before and after cancellation
player = audioDeviceWriter('SampleRate',Fs); % Spectrum analyzer to show original and attenuated noise
scope = dsp.SpectrumAnalyzer('SampleRate',Fs,'OverlapPercent',80, ...
'SpectralAverages',20,'PlotAsTwoSidedSpectrum',false, ...
'ShowLegend',true, ...
'ChannelNames', {'Original noisy signal', 'Attenuated noise'});
for m = 1:400
% Generate synthetic noise by adding sine waves with random phase
x = sine();
d = primaryPathGenerator(x) + ... % Propagate noise through primary path
0.1*randn(size(x)); % Add measurement noise
if m <= 200
% No noise control for first 200 iterations
e = d;
else
% Enable active noise control after 200 iterations
xhat = x + 0.1*randn(size(x));
[y,e] = noiseController(xhat,d);
end
player(e); % Play noise signal
scope([d,e]); % Show spectrum of original (Channel 1)
% and attenuated noise (Channel 2)
end
release(player); % Release audio device
release(scope); % Release spectrum analyzer

  

  为了区分这种差别,在前200个迭代因子里面不加主动降噪。从参考麦克风里面获取噪声,这些噪声就是典型的机器轰鸣声。
一旦算法开启,仿真里面使用的是5s的算法稳定时间。通过在频域里比较残余误差信号和原始信号的差别,可以看出大多数周期性的信号都已经大面积的衰减了。从下图中可以看出,在不同的频率上,降噪性能的表现是不同的。这就是现实世界中所说的主动降噪技术。

  

三 参考信息

1 wiki详细的解释了原理:https://en.wikipedia.org/wiki/Active_noise_control

2 仿真效果和原理: https://ww2.mathworks.cn/help/audio/examples/active-noise-control-using-a-filtered-x-lms-fir-adaptive-filter.html

3 概念流程:https://wiki.analog.com/resources/tools-software/sigmastudio/toolbox/filters/filterednlmsfilter

主动降噪技术(ANC)的前生今世--原理仿真的更多相关文章

  1. 揭秘 BPF map 前生今世

    揭秘 BPF map 前生今世 本文地址:https://www.ebpf.top/post/map_internal 1. 前言 众所周知,map 可用于内核 BPF 程序和用户应用程序之间实现双向 ...

  2. Java NIO 的前生今世 之四 NIO Selector 详解

    Selector Selector 允许一个单一的线程来操作多个 Channel. 如果我们的应用程序中使用了多个 Channel, 那么使用 Selector 很方便的实现这样的目的, 但是因为在一 ...

  3. 主动降噪技术(ANC)的前生今世--概念历史

    一 概念 假如使用一句通俗的语言来概述ANC的原理的话,那就是:通过发出与噪声相位相反,频率.振幅相同的声波与噪声干涉实现相位抵消. 使用比较正式的语言来解释就是:动降噪通过降噪系统产生与外界噪音相等 ...

  4. 月光宝盒之时间魔法--java时间的前生今世

    月光宝盒花絮 “曾经有一份真诚的爱情摆在我的面前,但是我没有珍惜,等到了失去的时候才后悔莫及,尘世间最痛苦的事莫过于此.如果可以给我一个机会再来一次的话,我会跟那个女孩子说我爱她,如果非要把这份爱加上 ...

  5. 主动降噪技术(ANC)的前生今世–行业分析

    一 原始玩家 1978年,创始人Amar G. Bose博士在从欧洲飞往波士顿的飞机上,发现飞机引擎的噪音扫净了他戴耳机欣赏音乐的兴致.这激发了他在BOSE公司进行一项消噪科技的研究.弹指之间,十年过 ...

  6. RPC 原理的前生今世

    (如果感觉有帮助,请帮忙点推荐,添加关注,谢谢!你的支持是我不断更新文章的动力.本博客会逐步推出一系列的关于大型网站架构.分布式应用.设计模式.架构模式等方面的系列文章) 在校期间大家都写过不少程序, ...

  7. RCNN,Fast RCNN,Faster RCNN 的前生今世:(2)R-CNN

    Region CNN(RCNN)可以说是利用深度学习进行目标检测的开山之作.作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,2010年更带领团队获得终身成就奖,如今供职于 ...

  8. HTML 5 History API的”前生今世”

    History是有趣的,不是吗?在之前的HTML版本中,我们对浏览历史记录的操作非常有限.我们可以来回使用可以使用的方法,但这就是一切我们能做的了. 但是,利用HTML 5的History API,我 ...

  9. RCNN,Fast RCNN,Faster RCNN 的前生今世:(4) Fast RCNN 算法详解

    继2014年的RCNN之后,Ross Girshick在15年推出Fast RCNN,构思精巧,流程更为紧凑,大幅提升了目标检测的速度.在Github上提供了源码. 同样使用最大规模的网络,Fast ...

随机推荐

  1. CAD数据分块,偏移校准,加载到百度地图、高德地图、谷歌等地图上

    前面分享过一篇如何将CAD海量数据显示在百度地图上(百度地图Canvas实现十万CAD数据秒级加载),但是很多开发者在CAD数据提取时遇到了问题,所以接下来的文章将介绍如何将CAD数据提取. 准备软件 ...

  2. ES6之解构

    1.ES6允许按照一定的模式,从数组中和对象中提取值,对变量进行赋值,这种称为解构(Distructuring): let [a,b,c] = [3,5,6];// 相当于 a=3,b=5,c=6 本 ...

  3. Spring Cloud Alibaba | Nacos动态网关路由

    Spring Cloud Alibaba | Gateway基于Nacos动态网关路由 本篇实战所使用Spring有关版本: SpringBoot:2.1.7.RELEASE Spring Cloud ...

  4. 关于AndroidStudio在真机安装的apk闪退(无法打开)的解决方案

    问题描述: 重新安装AndroidStudio之后 1.发现在真机上安装apk时显示的是应用包名. 2.在真机上安装的apk无法打开,一直闪退. 如图: 解决方案: 关闭AndroidStudio的I ...

  5. 【百度之星】【思维】hdu 6724Totori's Switching Game

    思维题,最后只要判断每个点的度数>=k即可. #pragma comment(linker, "/STACK:1024000000,1024000000") #pragma ...

  6. 牛客第五场多校 A gpa 分数规划(模板)

    链接:https://www.nowcoder.com/acm/contest/143/A来源:牛客网 Kanade selected n courses in the university. The ...

  7. CF999C Alphabetic Removals 思维 第六道 水题

    Alphabetic Removals time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. 详解JAVA字符串类型switch的底层原理

    基础 我们现在使用的Java的版本,基本上是都支持String类型的.当然除了String类型,还有int.char.byte.short.enum等等也都是支持的.然而在其底部实现中,还是基于 整型 ...

  9. Springboot集成swagger2生成接口文档

    [转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11509884.html    作者:jstarseven    码字挺辛苦的.....   一 ...

  10. python判断一个数是否为整数