2011-06-03 242 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