2017-05-03 55 views
0

我正在使用dsp庫和dsp.biquad函數來實現butterworth IIR濾波器。當我創建過濾我設置的初始值,如下圖所示:dsp biquad filter使用初始值重置

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); 

我想定期重新設置過濾器,當我這樣做,初始值會有所不同。 biquad重置函數不允許我傳遞一個初始值,所以此刻我只是通過調用上述來重新創建過濾器。

但是,我認爲這可能有點慢。我沒有測量它,但它被頻繁地調用。任何人都可以提出一種方法來重置過濾器爲任意初始值?還是有另一個圖書館讓我這樣做?

回答

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 method。我改變了初始值的分頻器,以顯示不同初始值的設置。 – Navan