一 原理:
主動降噪就是通過反相檢測麥克風的聲音或噪聲來減弱周圍環境的噪聲讓揚聲器出來的聲音聽起來更清晰。主動降噪技術的目標就是通過一個自適應濾波器把不想要的噪聲反相從而把噪聲約束到固定的范圍內。該系統必須要把揚聲器到麥克風的二階誤差考慮進去。主動降噪用到的主要原理是: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的信號來仿真這些信號統計。
下面是源碼:
1 % FIR Filter to be used to model primary propagation path 2 primaryPathGenerator = dsp.FIRFilter('Numerator',primaryPathCoeffs.'); 3 4 % Filtered-X LMS adaptive filter to control the noise 5 L = 350; 6 muW = 0.0001; 7 noiseController = dsp.FilteredXLMSFilter('Length',L,'StepSize',muW, ... 8 'SecondaryPathCoefficients',SecondaryPathCoeffsEst); 9 10 % Sine wave generator to synthetically create the noise 11 A = [.01 .01 .02 .2 .3 .4 .3 .2 .1 .07 .02 .01]; 12 La = length(A); 13 F0 = 60; 14 k = 1:La; 15 F = F0*k; 16 phase = rand(1,La); % Random initial phase 17 sine = audioOscillator('NumTones', La, 'Amplitude',A,'Frequency',F, ... 18 'PhaseOffset',phase,'SamplesPerFrame',512,'SampleRate',Fs); 19 20 % Audio player to play noise before and after cancellation 21 player = audioDeviceWriter('SampleRate',Fs); 22 23 % Spectrum analyzer to show original and attenuated noise 24 scope = dsp.SpectrumAnalyzer('SampleRate',Fs,'OverlapPercent',80, ... 25 'SpectralAverages',20,'PlotAsTwoSidedSpectrum',false, ... 26 'ShowLegend',true, ... 27 'ChannelNames', {'Original noisy signal', 'Attenuated noise'}); 28 for m = 1:400 29 % Generate synthetic noise by adding sine waves with random phase 30 x = sine(); 31 d = primaryPathGenerator(x) + ... % Propagate noise through primary path 32 0.1*randn(size(x)); % Add measurement noise 33 if m <= 200 34 % No noise control for first 200 iterations 35 e = d; 36 else 37 % Enable active noise control after 200 iterations 38 xhat = x + 0.1*randn(size(x)); 39 [y,e] = noiseController(xhat,d); 40 end 41 player(e); % Play noise signal 42 scope([d,e]); % Show spectrum of original (Channel 1) 43 % and attenuated noise (Channel 2) 44 end 45 release(player); % Release audio device 46 release(scope); % Release spectrum analyzer
為了區分這種差別,在前200個迭代因子里面不加主動降噪。從參考麥克風里面獲取噪聲,這些噪聲就是典型的機器轟鳴聲。
一旦算法開啟,仿真里面使用的是5s的算法穩定時間。通過在頻域里比較殘余誤差信號和原始信號的差別,可以看出大多數周期性的信號都已經大面積的衰減了。從下圖中可以看出,在不同的頻率上,降噪性能的表現是不同的。這就是現實世界中所說的主動降噪技術。
三 參考信息
1 wiki詳細的解釋了原理:https://en.wikipedia.org/wiki/Active_noise_control
3 概念流程:https://wiki.analog.com/resources/tools-software/sigmastudio/toolbox/filters/filterednlmsfilter