Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 以前的输出作为FIR滤波器的输入_Matlab_Filtering_Signal Processing - Fatal编程技术网

Matlab 以前的输出作为FIR滤波器的输入

Matlab 以前的输出作为FIR滤波器的输入,matlab,filtering,signal-processing,Matlab,Filtering,Signal Processing,有人知道在Matlab中是否可以将以前的输出值传递给FIR滤波器吗?我之所以愿意这样做,是因为我有大量的数据(>300Gb),我想对这些数据进行过滤和下采样。如果我在FIR函数中使用一组标准的[b,a]系数,那么前几个样本将是不正确的,因为它们取决于初始条件 这是一个问题,因为我想通过取较小的数据块来过滤我的大数据集,但如果我使用标准方法进行过滤,那么在每个数据块的开头都会出现错误(由于它是FIR过滤器,因此会传播) 任何想法都将不胜感激 在这种情况下,您可以使用,它实现零相位过滤,即,它处理数

有人知道在Matlab中是否可以将以前的输出值传递给FIR滤波器吗?我之所以愿意这样做,是因为我有大量的数据(>300Gb),我想对这些数据进行过滤和下采样。如果我在FIR函数中使用一组标准的[b,a]系数,那么前几个样本将是不正确的,因为它们取决于初始条件

这是一个问题,因为我想通过取较小的数据块来过滤我的大数据集,但如果我使用标准方法进行过滤,那么在每个数据块的开头都会出现错误(由于它是FIR过滤器,因此会传播)


任何想法都将不胜感激

在这种情况下,您可以使用,它实现零相位过滤,即,它处理数据一次向前,一次向后,不会产生净延迟。但是,您应该注意,有效过滤器顺序是
b
指定的两倍

以下是文档中的一个示例(绘图已修改):


您可以使用“filter”命令的“zi”、“zf”功能:


这允许您设置过滤器的初始条件。

过滤器命令可以将初始条件作为输入,并将最终条件作为第二个输出返回。您需要使用这些来过滤较小的数据块。比如说,

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

是的,我知道
filtfilt
,但这并不能解决我试图解决的问题,即数据的剪切量,并能够以分片的方式对其进行过滤。@mor22:我不是建议您通过它运行整个数据:)我的意思是,如果您按分片操作并加入它,这将为您提供所需的内容,而不会在块的开头出现错误。无论如何,我认为在下面的答案中使用
zi
zf
更好,你应该先试试。我就把这个放在这里作为一个选择。我会试试看,看起来很有希望!谢谢:-)
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