FXLMS アクティブ ノイズ リダクションの Simulink モデリングとシミュレーション

**
**

FXLMS アクティブ ノイズ リダクションの Simulink モデリングとシミュレーション

**
**

最近、アクティブ ノイズ リダクションというテーマについて研究しています。その探索と学習の過程で、いくつかの予備知識を共有したいと思います。

**FXLMS アルゴリズムは、LMS アルゴリズムをベースにセカンダリ チャネル補償の方向に改良されたアルゴリズムであり、simulink でモデル化およびシミュレーションしました。一緒に勉強している友人の役に立てば幸いです。
**
以下は私のシミュレーション図です:
FXLMS アルゴリズムのシミュレーション図
周波数 80HZ と 110HZ の 2 つの正弦波信号を使用して、シミュレートされたノイズ信号を重ね合わせています。一次チャネル伝達関数は仮定された値であり、フィルター関数に置き換えられています。

セカンダリチャネル伝達関数もフィルタを使用して想定される値です。

セカンダリ チャネルの伝達関数推定値はセカンダリ チャネルの推定値であり、実際にはオンライン識別またはオフライン識別によって取得できますが、ここでは理想的なセカンダリ チャネル推定値がセカンダリ チャネルと同じであると仮定します。

FXLMS フィルタは、S 関数ブロックで記述された適応フィルタで、3 つの入力と 2 つの出力があります。

入力 1: 初期ノイズ信号
入力 2: 二次チャネル伝達関数推定によって補償されたノイズ信号
入力 3: ノイズキャンセル後のエラー信号、理想的には 0

出力 1: LMS アルゴリズムによって重みが計算された後の適応フィルターの出力。ノイズを相殺するために使用されます。 出力 2:
LMS アルゴリズムによって計算された重み

function test(block)

  setup(block);
%endfunction

function setup(block)
  
  %% Register dialog parameter: LMS step size 
  block.NumDialogPrms = 1;
  block.DialogPrmsTunable = {'Tunable'};
  % block.DialogPrm(1).Name = 'StepSize';
  % block.DialogPrm(1).DataTypeId = 0;
  
  %% Regieste number of input and output ports
  block.NumInputPorts  = 3;
  block.NumOutputPorts = 2;

  %% Setup functional port properties to dynamically
  %% inherited.
  block.SetPreCompInpPortInfoToDynamic;
  block.SetPreCompOutPortInfoToDynamic;

  block.InputPort(1).Complexity   = 'Real'; 
  block.InputPort(1).DataTypeId   = 0;
  block.InputPort(1).SamplingMode = 'Sample';
  block.InputPort(1).Dimensions   = 1;
  
  block.InputPort(2).Complexity   = 'Real';
  block.InputPort(2).DataTypeId   = 0;
  block.InputPort(2).SamplingMode = 'Sample';
  block.InputPort(2).Dimensions   = 1;
  
  block.InputPort(3).Complexity   = 'Real';
  block.InputPort(3).DataTypeId   = 0;
  block.InputPort(3).SamplingMode = 'Sample';
  block.InputPort(3).Dimensions   = 1;
  
  block.OutputPort(1).Complexity   = 'Real';
  block.OutputPort(1).DataTypeId   = 0;
  block.OutputPort(1).SamplingMode = 'Sample';
  block.OutputPort(1).Dimensions   = 1;

  block.OutputPort(2).Complexity   = 'Real';
  block.OutputPort(2).DataTypeId   = 0;
  block.OutputPort(2).SamplingMode = 'Sample';
  block.OutputPort(2).Dimensions   = 1;
  
  %% Set the block simStateCompliance to default (i.e., same as a built-in block)
  block.SimStateCompliance = 'DefaultSimState';

  %% Register methods
  block.RegBlockMethod('CheckParameters',         @CheckPrms);
  block.RegBlockMethod('ProcessParameters',       @ProcessPrms);
  block.RegBlockMethod('PostPropagationSetup',    @DoPostPropSetup);
  block.RegBlockMethod('Start',                   @Start);  
  block.RegBlockMethod('WriteRTW',                @WriteRTW);
  block.RegBlockMethod('Outputs',                 @Outputs);
  
  %% Block runs on TLC in accelerator mode.
  block.SetAccelRunOnTLC(true);
  
%endfunction

function CheckPrms(block)
  mu = block.DialogPrm(1).Data;
  
  if mu <= 0 || mu > 1
    error(message('simdemos:adapt_lms:stepSize'));
  end
  
%endfunction

function DoPostPropSetup(block)

  %% Setup Dwork  
  N = 32;                    %% Filter length   
  block.NumDworks = 3;
  block.Dwork(1).Name = 'X'; %% u[n],...,u[n-31]
  block.Dwork(1).Dimensions      = N;
  block.Dwork(1).DatatypeID      = 0;
  block.Dwork(1).Complexity      = 'Real';
  block.Dwork(1).UsedAsDiscState = true;
  
  block.Dwork(2).Name = 'H'; %% Filter coefficients
  block.Dwork(2).Dimensions      = N;
  block.Dwork(2).DatatypeID      = 0;
  block.Dwork(2).Complexity      = 'Real';
  block.Dwork(2).UsedAsDiscState = true;
  
  block.Dwork(3).Name = 'l'; %% Filter coefficients
  block.Dwork(3).Dimensions      = N;
  block.Dwork(3).DatatypeID      = 0;
  block.Dwork(3).Complexity      = 'Real';
  block.Dwork(3).UsedAsDiscState = true;
  

  %% Register all tunable parameters as runtime parameters.
  block.AutoRegRuntimePrms;

%endfunction

function ProcessPrms(block)

  block.AutoUpdateRuntimePrms;
 
%endfunction

function Start(block)
  
  %% Initialize Dwork 
  block.Dwork(1).Data = zeros(1, 32);
  block.Dwork(2).Data = zeros(1, 32);
  block.Dwork(3).Data = zeros(1, 32);
  
%endfunction

function Outputs(block)
  
  mu = block.RuntimePrm(1).Data;
  N  = 32;
  
  u = block.InputPort(1).Data;
  e = block.InputPort(3).Data;
  r = block.InputPort(2).Data;
  
  X = block.Dwork(1).Data;
  H = block.Dwork(2).Data;
  l = block.Dwork(3).Data;
  
  %%
  %% H^(n+1)[i] = H^(n)[i]+mu*(d(n)-y(n))*u(n-i) 
  %% 
  X(2:N) = X(1:N-1);
  X(1)   = u;  
  l(2:N) = l(1:N-1);
  l(1)   = r;
  y      = X'*H;    
  H      = H+mu*e*l;

  block.Dwork(1).Data = X;
  block.Dwork(2).Data = H;
  block.Dwork(3).Data = l;
  block.OutputPort(1).Data = y;
  block.OutputPort(2).Data = norm(H);

実行結果:
ノイズ信号とノイズ除去された信号
青はノイズ信号、黄色はノイズ低減後の信号で、明らかなノイズ低減効果がわかります。

重み
写真は LMS アルゴリズムによって計算された重みを示しています

同時に、我々はこの問題に直面しています. 負帰還中、初期段階では ERRO エラー信号が 0 であるため、ノイズ除去の初期段階では不安定な状態に現れます. 遅延モジュールは当初、これを除去するために追加されました初期のエラー状態を修正できる代数ループです。状況は改善されていません。誰かが私に適切な指導や提案を与えてくれることを願っています。これが私の最初の投稿です。不正確なところはご容赦ください。ありがとうございます。

おすすめ

転載: blog.csdn.net/qq_33618544/article/details/100566328