2017-05-03 8 views
0

私はdspライブラリとdsp.biquad関数を使ってバターワースIIRフィルタを実装しています。私は、フィルタを作成するときに、以下のように私は、初期値を設定しています:初期値を持つdspバイカッドフィルタリセット

function [lowpassIIR_minutes] = createLowpassIIR_minutes(initialValue) 

% The following code was used to design the filter coefficients: 
% 
% N = 1;   % Order 
% F3dB = 8.67e-05; % 3-dB Frequency 
% Fs = 1;   % Sampling Frequency 
% 
% h = fdesign.lowpass('n,f3db', N, F3dB, Fs); 
% 
% Hd = design(h, 'butter', ... 
%  'SystemObject', true); 

lowpassIIR_minutes = dsp.BiquadFilter(... 
    'Structure', 'Direct form II', ... 
    'SOSMatrix', [1 1 0 1 -0.999455396157461 0], ... 
    'ScaleValues', [0.00027230192126942; 1],... 
    'InitialConditions', initialValue./2); 

私は定期的にフィルターをリセットしたいと私は行うとき、初期値が異なることになります。バイカッドのリセット機能では初期値を渡すことができませんので、私は上記を呼び出してフィルタを再作成するだけです。

しかし、これは少し遅いかもしれません。私はそれを測定していませんが、それはかなり頻繁に呼び出されます。誰もが任意の初期値にフィルタをリセットする方法を提案することはできますか?あるいは私にこれをさせる別の図書館がありますか?

答えて

0

dsp.BiquadFilterのリリースメソッドを呼び出して、InitialConditionsを別の値に設定できます。次回出力を計算するときは、新しいInitialConditions値を自動的に取得する必要があります。これは、リリースメソッドを呼び出さない場合に比べて、少し遅くなります。しかし、これはオブジェクトを再作成するよりも速くなければなりません。

lowpassIIR_minutes = dsp.BiquadFilter(... 
    'Structure', 'Direct form II', ... 
    'SOSMatrix', [1 1 0 1 -0.999455396157461 0], ... 
    'ScaleValues', [0.00027230192126942; 1],... 
    'InitialConditions', initialValue./2); 
out = lowpassIIR_minutes(in); 
release(lowpassIIR_minutes); 
lowpassIIR_minutes.InitialConditions = initialValue/5; 
out = lowpassIIR_minutes(in); % Uses new InitialConditions 
+0

こんにちはNavan、ありがとう、素晴らしい答え。入力としてパラメータを指定してフィルタオブジェクトを呼び出すことはできませんが、それらを 'step(lowpassIIR_minutes、value);と置き換えるとうまくいきます。また、初期値で分周器を変更しようとしましたか? –

+0

入力データでフィルタオブジェクトを呼び出す方が新しい構文です。古いバージョンの場合は、stepメソッドを呼び出す必要があります。初期値の設定を変更するだけで、分周器を初期値に変更しました。 – Navan

関連する問題