2017-05-03 1 views
0

Ich benutze die dsp Bibliothek und die dsp.biquad Funktion, um einen Butterworth IIR Filter zu implementieren. Ich gründe einen Anfangswert, wenn ich die Filter zu erstellen, wie unten dargestellt:dsp biquad Filter zurückgesetzt mit anfänglichen Werten

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

Ich mag die Filter regelmäßig zurückgesetzt, und wenn ich das tut, werden die Anfangswerte unterschiedlich sein. Die Biquad-Reset-Funktion erlaubt es mir nicht, einen Anfangswert zu übergeben, daher erstelle ich den Filter gerade neu, indem ich das obige aufrufe.

Allerdings denke ich, dass dies ein bisschen langsam sein könnte. Ich habe es nicht gemessen, aber es wird ziemlich häufig genannt. Kann jemand vorschlagen, den Filter auf einen beliebigen Anfangswert zurückzusetzen? Oder gibt es eine andere Bibliothek, die mir das erlauben würde?

Antwort

0

Sie können die Freigabemethode für dsp.BiquadFilter aufrufen und anschließend die InitialConditions auf einen anderen Wert setzen. Wenn Sie die Ausgabe das nächste Mal berechnen, sollte der neue InitialConditions-Wert automatisch übernommen werden. Dies wird eine geringfügige Verlangsamung im Vergleich zu dem Nichtaufruf der Freigabemethode verursachen. Dies sollte jedoch schneller sein als das erneute Erstellen des Objekts.

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

Hallo Navan, danke, tolle Antwort. Der Aufruf des Filterobjekts mit der Eingabe als Parameter funktioniert bei mir nicht, aber wenn ich diese durch 'step (lowpassIIR_minutes, value); 'ersetze, dann funktioniert es gut. Wollten Sie auch den Teiler auf den Anfangswert ändern? –

+0

Das Aufrufen des Filterobjekts mit den Eingabedaten ist eine neuere Syntax. Bei älteren Versionen müssen Sie die Schrittmethode aufrufen. Ich habe den Teiler im Anfangswert geändert, nur um die Einstellung des unterschiedlichen Anfangswertes anzuzeigen. – Navan

Verwandte Themen