转载_ANC降噪学习

版权声明:转载请注明出处 https://blog.****.net/weixin_42183571/article/details/80615660

概述

      ANC,英文名称:Active Noise Control,主动降噪。其原理是降噪系统电路产生降噪MIC接收的外界环境噪音相等的反相信号,将噪声抵消。

 

核心算法

     ANC降噪实现核心算法为:FxLMS(最小均方差算法)。最小均方差算法以均方误差为代价函数,并使误差降到最小的算法。 具体算法推导这里不做具体介绍,这里直接列出表达式:

                                                    转载_ANC降噪学习

 

      其中, x(k)为输入信号矩阵,W(k)为调整权值矩阵,d(k)为目标(理想)输出信号矩阵,y(k)为实际输出信号矩阵,e(k)为误差信号矩阵,第3个公式为权值调整公式,mu为收敛因子(值为随机的,0<mu<x(k)的相关矩阵最大特征值的倒数)

 

Matlab仿真LMS滤波器

根据表达式设计滤波器

 
  1. function [yn,W,en]=LMS(xn,dn,M,mu,itr)

  2. % LMS(Least Mean Squre)算法

  3. % 输入参数:

  4. % xn 输入的信号序列 (列向量)

  5. % dn 所期望的响应序列 (列向量)

  6. % M 滤波器的阶数 (标量) 滤波器的阶数,就是指过滤谐波的次数,其阶数越高,滤波效果就越好

  7. % mu 收敛因子(步长) (标量) 要求大于0,小于xn的相关矩阵最大特征值的倒数

  8. % itr 迭代次数 (标量) 默认为xn的长度,M<itr<length(xn)

  9. % 输出参数:

  10. % W 滤波器的权值矩阵 (矩阵)

  11. % 大小为M : itr,

  12. % en 误差序列(itr : 1) (列向量)

  13. % yn 实际输出序列 (列向量)

  14.  
  15. % 参数个数必须为4个或5个

  16. if nargin == 4 % 4个时递归迭代的次数为xn的长度

  17. itr = length(xn);

  18. elseif nargin == 5 % 5个时满足M<itr<length(xn)

  19. if itr>length(xn) || itr<M

  20. error('迭代次数过大或过小!');

  21. end

  22. else

  23. error('请检查输入参数的个数!');

  24. end

  25.  
  26. % 初始化参数

  27. en = zeros(itr,1); % 误差序列,en(k)表示第k次迭代时预期输出与实际输入的误差

  28. W = zeros(M,itr); % 每一行代表一个加权参量,每一列代表-次迭代,初始为0

  29.  
  30. % 迭代计算

  31. for k = M:itr % 第k次迭代

  32. x = xn(k:-1:k-M+1); % 滤波器M个抽头的输入

  33. y = W(:,k-1).' * x; % 滤波器的输出

  34. en(k) = dn(k) - y ; % 第k次迭代的误差

  35. % 滤波器权值计算的迭代式

  36. W(:,k) = W(:,k-1) + 2*mu*en(k)*x;

  37. end

  38.  
  39. % 求最优时滤波器的输出序列

  40. yn = inf * ones(size(xn));

  41. for k = M:length(xn)

  42. x = xn(k:-1:k-M+1);

  43. yn(k) = W(:,end).'* x;

  44. end

调用LMS函数仿真

 
  1. close all

  2. % 正弦信号的产生

  3. t=0:199;

  4. xs=5*sin(0.3*t);

  5. figure;

  6. subplot(2,1,1);

  7. plot(t,xs);grid;

  8. ylabel('幅值');

  9. title('{输入正弦波信号}');

  10.  
  11. % 随机噪声信号的产生

  12. randn('state',sum(100*clock));

  13. xn=randn(1,200);

  14. zn=randn(1,200);

  15. xn=xn+zn;

  16. subplot(2,1,2);

  17. plot(t,xn);grid;

  18. ylabel('幅值');

  19. xlabel('时间');

  20. title('{输入随机噪声信号}');

  21.  
  22. % 信号滤波

  23. xn = xs+xn;

  24. xn = xn.' ; % 输入信号序列

  25. dn = xs.' ; % 预期理想结果序列

  26. M = 23 ; % 滤波器的阶数

  27. rho_max = max(eig(xn*xn.')); % 输入信号相关矩阵的最大特征值

  28. mu = rand()*(1/rho_max) ; % 收敛因子 0 < mu < 1/rho_max

  29. [yn,W,en] = LMS(xn,dn,M,mu);

  30.  
  31. % 绘制滤波器输入信号

  32. figure;

  33. subplot(2,1,1);

  34. plot(t,xn);grid;

  35. ylabel('幅值');

  36. xlabel('时间');

  37. title('{滤波器输入信号}');

  38. % 绘制自适应滤波器输出信号

  39. subplot(2,1,2);

  40. plot(t,yn);grid;

  41. ylabel('幅值');

  42. xlabel('时间');

  43. title('{自适应滤波器输出信号}');

  44. % 绘制自适应滤波器输出信号,预期输出信号和两者的误差

  45. figure

  46. plot(t,yn,'b',t,dn,'g',t,dn-yn,'r',t,xn,'m');grid;

  47. legend('自适应滤波器输出','预期输出','误差','自适应滤波器输入');

  48. ylabel('幅值');

  49. xlabel('时间');

  50. title('{自适应滤波器}');

  51. %绘制最优权值点

  52. figure

  53. mm=0:M-1;

  54. plot(mm,W(:,end)','m*');grid;

  55. title('{最优权值点}');

实验效果图

                    转载_ANC降噪学习

                     转载_ANC降噪学习

                     转载_ANC降噪学习

 

结果分析

      输入信号为正弦信号加噪声的混合信号,可见正弦信号受噪声影响失真较大;实验输出信号失真较小,噪声信号已经很小,这里可以调节M滤波器阶数来调节ANC降噪效果。可见,LMS算法可实现ANC降噪功能。

 

际应用分析   

      实际应用中,ANC降噪对2KHZ以下的信号噪声降噪效果比较好,对高频噪声降噪效果很差。原因为高频信号波长短,对相位偏差也比较敏感,导致ANC对高频噪声降噪效果差。一般高频噪声可以被耳机物理的遮蔽屏蔽掉,这种降噪被称为被动降噪。       总结,一般2KHz噪声信号使用ANC,高频信号没有必要使用ANC。实际测试中的应用,测试步骤:1.关闭ANC时,声学测试软件测试声学参数FR;2.打开ANC时,声学测试软件测试声学参数FR,这里通过调节gain值,来调节降噪效果,使降噪效果适中。因为降噪效果差,达不到降噪的目的;降噪效果如果太好,噪声信号趋近于0,会使耳机产生自激。

    通过书籍资料及网上资源学习,以上就是我对ANC的理解,如有什么不妥之处,还请指正。