一 原理:

  主动降噪就是通过反相检测麦克风的声音或噪声来减弱周围环境的噪声让扬声器出来的声音听起来更清晰。主动降噪技术的目标就是通过一个自适应滤波器把不想要的噪声反相从而把噪声约束到固定的范围内。该系统必须要把扬声器到麦克风的二阶误差考虑进去。主动降噪用到的主要原理是: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. Liunx学习总结(九)--防火墙

    防火墙的作用 防火墙作为一个边界防御工具,其监控流量要么允许它.要么屏蔽它. 多年来,防火墙的功能不断增强,现在大多数防火墙不仅可以阻止已知的一些威胁.执行高级访问控制列表策略,还可以深入检查流量中的 ...

  2. 2019icpc南京网络赛_F_Greedy Sequence

    题意 题意不明,队友告诉我对于每个\(i\),所在下标\(p[i]\),在\([p[i]-k,p[i]+k]\)中找到小于\(i\)的最大数\(x\),然后\(ans[i]=ans[x]+1\)即可. ...

  3. 文件系统【图片处理】(基于thumbnailator)典藏版-壹

    很多系统开发中都会碰到文件相关的处理,最近顺手开发一个小型文件系统的过程中碰到图片缩略图的需求,需要在显示的时候提供缩略图,下载的时候提供原图,大家直接想到的可能是java自带的图片处理类,但是处理过 ...

  4. Python AttributeError: 'Module' object has no attribute 'STARTF_USESHOWINDOW'

    夫学须志也,才须学也,非学无以广才,非志无以成学.--诸葛亮 生活有度,自得慈铭 --杜锦阳 今天新来的同事安装环境遇到个莫名其妙的问题: AttributeError: 'Module' objec ...

  5. EAS webservice安全模式

    1.启用安全控制: isRomoteLocate=false 2.请求添加头部: <soapenv:Header> <SessionId xmlns="http://log ...

  6. Could not delete D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/platform/WEB-INF/lib

    再把之前的maven工程删掉时,出现了如下错误: Could not delete D:/workspace/.metadata/.plugins/org.eclipse.wst.server.cor ...

  7. 搭建Nuget服务器(Nuget私服)

    一.前言 对公司或者对个人来说,经过一段时间的沉淀之后,都会有一些框架或者模块,为了对这些框架或者模块进行更好的管理和维护,也为了方便后面的开发或者其他同事,我们可以在我们本地或者内网搭建一个Nuge ...

  8. JS枚举对象属性的方法及其区别

    愉快的中秋节要过去了,国庆倒计时两个周!!! 闲话不多说,那今天我们来看一看JS中枚举对象属性的方法有哪些以及他们的区别 首先在JS里面枚举对象属性一共有三种方法 for in: 会遍历对象中所有的可 ...

  9. Springboot国际化信息(i18n)解析

    国际化信息理解 国际化信息也称为本地化信息 . Java 通过 java.util.Locale 类来表示本地化对象,它通过 “语言类型” 和 “国家/地区” 来创建一个确定的本地化对象 .举个例子吧 ...

  10. 深入理解three.js中光源

    前言: Three.js 是一个封装了 WebGL 接口的非常好的库,简化了 WebGL 很多细节,降低了学习成本,是当前前端开发者完成3D绘图的得力工具,那么今天我就给大家详细讲解下 Three.j ...