2017-05-03 1 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

관련 문제