有没有人知道是否可以将先前的输出值传递给Matlab中的FIR滤波器?我想这样做是因为我有大量数据(> 300Gb),我想过滤和下采样。如果我在FIR函数中使用标准[b,a]系数集,那么前几个样本将是不正确的,因为它们取决于初始条件。
这是问题所在,因为我想通过采用较小的块来过滤我的大数据集但是如果我使用标准方式来执行它,那么在每个块的开头都会出现错误(这会因为传播而传播)它是一个FIR滤波器。)
任何想法都将不胜感激!
答案 0 :(得分:4)
filter命令可以将初始条件作为输入,并将最终条件作为第二个输出返回。您需要使用它们来过滤较小的数据块。例如,
b = fir1(10, 0.5);
Zi = zeros(numel(b)-1,1);
while moreData
[y Zi] = filter(b, 1, data, Zi);
end
如果您有DSP系统工具箱,您还可以使用dsp.DigitalFilter System对象来管理状态。例如,上面的代码可以成为
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 :(得分:3)
您可以使用'filter'命令的'zi','zf'功能: http://www.mathworks.com/help/techdoc/ref/filter.html
这允许您设置过滤器的初始条件。
答案 2 :(得分: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');