版權聲明:轉載請註明出處 https://blog.csdn.net/weixin_42183571/article/details/80615660
概述
ANC,英文名稱:Active Noise Control,主動降噪。其原理是降噪系統電路產生降噪MIC接收的外界環境噪音相等的反相信號,將噪聲抵消。
核心算法
ANC降噪實現核心算法爲:FxLMS(最小均方差算法)。最小均方差算法以均方誤差爲代價函數,並使誤差降到最小的算法。 具體算法推導這裏不做具體介紹,這裏直接列出表達式:
其中, x(k)爲輸入信號矩陣,W(k)爲調整權值矩陣,d(k)爲目標(理想)輸出信號矩陣,y(k)爲實際輸出信號矩陣,e(k)爲誤差信號矩陣,第3個公式爲權值調整公式,mu爲收斂因子(值爲隨機的,0<mu<x(k)的相關矩陣最大特徵值的倒數)
Matlab仿真LMS濾波器
根據表達式設計濾波器
-
function [yn,W,en]=LMS(xn,dn,M,mu,itr)
-
% LMS(Least Mean Squre)算法
-
% 輸入參數:
-
% xn 輸入的信號序列 (列向量)
-
% dn 所期望的響應序列 (列向量)
-
% M 濾波器的階數 (標量) 濾波器的階數,就是指過濾諧波的次數,其階數越高,濾波效果就越好
-
% mu 收斂因子(步長) (標量) 要求大於0,小於xn的相關矩陣最大特徵值的倒數
-
% itr 迭代次數 (標量) 默認爲xn的長度,M<itr<length(xn)
-
% 輸出參數:
-
% W 濾波器的權值矩陣 (矩陣)
-
% 大小爲M : itr,
-
% en 誤差序列(itr : 1) (列向量)
-
% yn 實際輸出序列 (列向量)
-
% 參數個數必須爲4個或5個
-
if nargin == 4 % 4個時遞歸迭代的次數爲xn的長度
-
itr = length(xn);
-
elseif nargin == 5 % 5個時滿足M<itr<length(xn)
-
if itr>length(xn) || itr<M
-
error('迭代次數過大或過小!');
-
end
-
else
-
error('請檢查輸入參數的個數!');
-
end
-
% 初始化參數
-
en = zeros(itr,1); % 誤差序列,en(k)表示第k次迭代時預期輸出與實際輸入的誤差
-
W = zeros(M,itr); % 每一行代表一個加權參量,每一列代表-次迭代,初始爲0
-
% 迭代計算
-
for k = M:itr % 第k次迭代
-
x = xn(k:-1:k-M+1); % 濾波器M個抽頭的輸入
-
y = W(:,k-1).' * x; % 濾波器的輸出
-
en(k) = dn(k) - y ; % 第k次迭代的誤差
-
% 濾波器權值計算的迭代式
-
W(:,k) = W(:,k-1) + 2*mu*en(k)*x;
-
end
-
% 求最優時濾波器的輸出序列
-
yn = inf * ones(size(xn));
-
for k = M:length(xn)
-
x = xn(k:-1:k-M+1);
-
yn(k) = W(:,end).'* x;
-
end
調用LMS函數仿真
-
close all
-
% 正弦信號的產生
-
t=0:199;
-
xs=5*sin(0.3*t);
-
figure;
-
subplot(2,1,1);
-
plot(t,xs);grid;
-
ylabel('幅值');
-
title('{輸入正弦波信號}');
-
% 隨機噪聲信號的產生
-
randn('state',sum(100*clock));
-
xn=randn(1,200);
-
zn=randn(1,200);
-
xn=xn+zn;
-
subplot(2,1,2);
-
plot(t,xn);grid;
-
ylabel('幅值');
-
xlabel('時間');
-
title('{輸入隨機噪聲信號}');
-
% 信號濾波
-
xn = xs+xn;
-
xn = xn.' ; % 輸入信號序列
-
dn = xs.' ; % 預期理想結果序列
-
M = 23 ; % 濾波器的階數
-
rho_max = max(eig(xn*xn.')); % 輸入信號相關矩陣的最大特徵值
-
mu = rand()*(1/rho_max) ; % 收斂因子 0 < mu < 1/rho_max
-
[yn,W,en] = LMS(xn,dn,M,mu);
-
% 繪製濾波器輸入信號
-
figure;
-
subplot(2,1,1);
-
plot(t,xn);grid;
-
ylabel('幅值');
-
xlabel('時間');
-
title('{濾波器輸入信號}');
-
% 繪製自適應濾波器輸出信號
-
subplot(2,1,2);
-
plot(t,yn);grid;
-
ylabel('幅值');
-
xlabel('時間');
-
title('{自適應濾波器輸出信號}');
-
% 繪製自適應濾波器輸出信號,預期輸出信號和兩者的誤差
-
figure
-
plot(t,yn,'b',t,dn,'g',t,dn-yn,'r',t,xn,'m');grid;
-
legend('自適應濾波器輸出','預期輸出','誤差','自適應濾波器輸入');
-
ylabel('幅值');
-
xlabel('時間');
-
title('{自適應濾波器}');
-
%繪製最優權值點
-
figure
-
mm=0:M-1;
-
plot(mm,W(:,end)','m*');grid;
-
title('{最優權值點}');
實驗效果圖
結果分析
輸入信號爲正弦信號加噪聲的混合信號,可見正弦信號受噪聲影響失真較大;實驗輸出信號失真較小,噪聲信號已經很小,這裏可以調節M濾波器階數來調節ANC降噪效果。可見,LMS算法可實現ANC降噪功能。
實際應用分析
實際應用中,ANC降噪對2KHZ以下的信號噪聲降噪效果比較好,對高頻噪聲降噪效果很差。原因爲高頻信號波長短,對相位偏差也比較敏感,導致ANC對高頻噪聲降噪效果差。一般高頻噪聲可以被耳機物理的遮蔽屏蔽掉,這種降噪被稱爲被動降噪。 總結,一般2KHz噪聲信號使用ANC,高頻信號沒有必要使用ANC。實際測試中的應用,測試步驟:1.關閉ANC時,聲學測試軟件測試聲學參數FR;2.打開ANC時,聲學測試軟件測試聲學參數FR,這裏通過調節gain值,來調節降噪效果,使降噪效果適中。因爲降噪效果差,達不到降噪的目的;降噪效果如果太好,噪聲信號趨近於0,會使耳機產生自激。
通過書籍資料及網上資源學習,以上就是我對ANC的理解,如有什麼不妥之處,還請指正。