2011-06-03 93 views
1

有誰知道是否有可能將先前的輸出值傳遞給Matlab中的FIR濾波器?我想這樣做是因爲我有大量的數據(> 300Gb),我想要過濾和下載樣本。如果我在一個FIR函數中使用一組標準的[b,a]係數,那麼前幾個採樣將是不正確的,因爲它們取決於初始條件。以前的輸出作爲FIR濾波器的輸入

這是問題所在,因爲我想通過採用較小的塊來過濾大型數據集,但是如果使用標準方式執行,那麼在每個塊的開始處都會出現錯誤(它將通過due它是一個FIR濾波器)。

任何想法將不勝感激!

回答

3

過濾命令可以將初始條件作爲輸入並返回最終條件作爲第二個輸出。您需要使用這些來過濾較小的數據塊。例如,

b = fir1(10, 0.5); 
Zi = zeros(numel(b)-1,1); 
while moreData 
    [y Zi] = filter(b, 1, data, Zi); 
end 

如果你有DSP系統工具箱,你也可以dsp.DigitalFilter系統對象將管理狀態爲您服務。例如,上面的代碼可以成爲

b = fir1(10, 0.5); 
h = dsp.DigitalFilter('TransferFunction', 'FIR (all zeros)', 'Structure', 'Direct form transposed', 'Numerator', b); 
while moreData 
    y = step(h, data); 
end 
1

在這種情況下,您可以使用filtfilt,它實現了零相位濾波,即它一次處理數據一次,一次處理後退,因此不會產生淨延遲。但是,您應該注意有效的過濾器順序是b指定的順序的兩倍。

下面是從文檔的例子(該地塊已被修改):

x=ecg(500)'+0.25*randn(500,1); %'#noisy waveform 
h=fdesign.lowpass('Fp,Fst,Ap,Ast',0.15,0.2,1,60); 
d=design(h,'equiripple'); %#Lowpass FIR filter 
y=filtfilt(d.Numerator,1,x); %#zero-phase filtering 
y1=filter(d.Numerator,1,x); %#conventional filtering 

figure(1) 
h=plot([x y y1]); 
set(h(1),'color',[0.8,0.8,0.8]) 
title('Filtered Waveforms'); 
legend('Original waveform', 'Zero-phase Filtering','Conventional Filtering'); 

enter image description here

+0

是的,我知道'filtfilt'但這不解決我試圖解決它是數據的剪切量,並能夠對其進行過濾的問題以零食的方式。 – mor22 2011-06-06 09:03:37

+0

@ mor22:我並不是建議你通過它來運行整個數據:)我的意思是,如果你明智地做到了,並加入它,這會給你想要的東西,而不會在塊的開頭出現錯誤。無論如何,我認爲在下面的答案中使用'zi'和'zf'會更好,你應該先嚐試它們。我會在這裏把它作爲一個替代方案。 – abcd 2011-06-06 12:57:16