ドキュメンテーション センター

  • 評価版
  • 製品アップデート

このページは前リリースの情報です。該当の英語のページはこのリリースで更新されています。このリリースの英語のドキュメンテーションを参照するには、言語設定を United States に変更してください。

音響ノイズ キャンセリング (LMS)

この例では、最小二乗平均 (LMS) アルゴリズムを使用して入力信号からノイズを除去する方法を示します。この例では、固定小数点データ型を使用します。

はじめに

LMS 適応フィルターは基準信号と目的の信号を使用して、フィルター応答を自動的に一致させます。適切なフィルター モデルに収束すると、フィルター処理されたノイズが除去され、誤差信号に元の信号のみが含まれるはずです。

目的の信号は、カラード ノイズと .wav ファイルからのオーディオ信号で構成されます。適応フィルターへの最初の入力信号はホワイト ノイズです。この例では、適応フィルターを使用して信号出力からノイズを除去します。例を実行すると、ノイズとドラムの演奏の両方が聞こえます。やがて、モデル内の適応フィルターがノイズを除去するため、ドラムの演奏のみが聞こえるようになります。

ノイズ源として動作する関数 randn の乱数発生器をシードします。

rng(0);

Fi オブジェクトを作成して、ノイズ源を固定小数点データ型に変換します。

noise = fi(ones(40,1),true,16,13);

ランダム ホワイト ノイズをフィルター処理してカラード ノイズを作成する、固定小数点 FIR デジタル フィルターの System object を作成し、設定します。

hfilt = dsp.DigitalFilter('TransferFunction', 'FIR (all zeros)', ...
  'Numerator', fir1(39, .25));

% Specify fixed-point attributes of the filter.
hfilt.RoundingMethod = 'Floor';
hfilt.OverflowAction = 'Wrap';

System object の固定小数点プロパティ データ型を指定できます。たとえば、NumeratorCoefficientsDataType プロパティを 'Custom' に設定して、CustomNumeratorCoefficientsDataType プロパティを numerictype([],16,17) に設定できます。Numerictype オブジェクトを使用して、分子係数が、語長が 16 ビットで小数部の長さが 17 ビットの固定小数点になるよう指定します。

hfilt.NumeratorCoefficientsDataType  = 'Custom';
hfilt.CustomNumeratorCoefficientsDataType  = numerictype([],16,17);

FIR フィルターの固定小数点属性を指定します。

hfilt.ProductDataType           = 'Custom';
hfilt.CustomProductDataType     = numerictype([],32,30);
hfilt.AccumulatorDataType       = 'Custom';
hfilt.CustomAccumulatorDataType = numerictype([],32,30);
hfilt.OutputDataType            = 'Same as input';

フィルター処理したノイズと元信号の和のデータ型変換を行う Fi オブジェクトを作成します。

desired = fi(zeros(size(noise)),noise.numerictype);

指定したオーディオ ファイル dspafxf_8000.wav から入力信号を読み取る、オーディオ ファイル リーダー System object を作成し、設定します。

hsigsource = dsp.AudioFileReader('dspafxf_8000.wav',  ...
              'SamplesPerFrame', 40, ...
              'PlayCount', Inf,...
              'OutputDataType', 'int16');

LMS 適応フィルターの System object を作成し、設定します。

hlms = dsp.LMSFilter(40,'Method', 'Normalized LMS', ...
    'StepSize', .002);

適応フィルターの固定小数点属性を指定します。

hlms.RoundingMethod                        = 'Nearest';
hlms.OverflowAction                        = 'Saturate';
hlms.StepSizeDataType                      = 'Custom';
hlms.CustomStepSizeDataType                = numerictype([],16,15);
hlms.LeakageFactorDataType                 = 'Custom';
hlms.CustomLeakageFactorDataType           = numerictype([],16,14);
hlms.WeightsDataType                       = 'Custom';
hlms.CustomWeightsDataType                 = numerictype([],16,17);
hlms.EnergyProductDataType                 = 'Custom';
hlms.CustomEnergyProductDataType           = numerictype([],32,20);
hlms.EnergyAccumulatorDataType             = 'Custom';
hlms.CustomEnergyAccumulatorDataType       = numerictype([],32,20);
hlms.ConvolutionProductDataType            = 'Custom';
hlms.CustomConvolutionProductDataType      = numerictype([],32,20);
hlms.ConvolutionAccumulatorDataType        = 'Custom';
hlms.CustomConvolutionAccumulatorDataType  = numerictype([],32,20);
hlms.StepSizeErrorProductDataType          = 'Custom';
hlms.CustomStepSizeErrorProductDataType    = numerictype([],32,20);
hlms.WeightsUpdateProductDataType          = 'Custom';
hlms.CustomWeightsUpdateProductDataType    = numerictype([],32,20);
hlms.QuotientDataType                      = 'Custom';
hlms.CustomQuotientDataType                = numerictype([],32,20);

オーディオ信号を再生する、サンプルレートが 8,000 Hz のオーディオ プレーヤーの System object を作成し、設定します。

haudioout = dsp.AudioPlayer('SampleRate', 8000);

フィルター係数 40 の 5 トレースを表示する、ウォーターフォール プロットを設定します。

hplot = plotancdata('DSPANC_FIXPT: Acoustic Noise Cancellation', ...
  5, 40);

ストリーム処理ループ

LMS 適応フィルターは処理ループで係数を更新してデジタル フィルターをモデル化し、信号からカラード ノイズを除去できるようにします。この例はオーディオ信号を 3 回再生します。

numplays = 0;
T = numerictype(true,16,15);
while numplays < 3
  [y, eof]      = step(hsigsource);      % Read from audio file
  y             = reinterpretcast(y, T);
  noise(:)      = randn(40,1);           % Produce random data and convert
  noisefilt     = step(hfilt, noise);    % Filter the random data
  desired       = accumpos(noisefilt,y);         % Construct LMS 'desired' input
  [out, err, w] = step(hlms, noise, desired); % Run the LMS filter
  step(haudioout, double(err));          % Play the output signal
  hplot(w);                              % Plot the weights
  numplays = numplays + eof;             % Update number of plays
end

Release

ここでは System object に対して release メソッドを呼び出し、開いているファイルと装置を閉じます。

release(hsigsource);
release(haudioout);

まとめ

信号処理 System object を使用して入力信号からノイズを除去する方法について紹介しました。

付録

この例では次の補助関数が使用されています。

この情報は役に立ちましたか?