什么是' zf'在MATLAB函数过滤器中

时间:2014-12-03 15:07:32

标签: matlab filtering signal-processing

我知道为了在chuncks中过滤大量数据,可以使用具有适当滤波器系数的函数'filter', 并将最终条件'zf'传递给下一个块作为其初始条件'zi'。

我很困惑。 什么是'zf'的内容?

它是否包含最后的相关输入样本? (在纯FIR滤波器中) 最后的相关输出样本? (在IIR中) 当最后输入和最后输出都相关时它能保持什么?

非常感谢

2 个答案:

答案 0 :(得分:4)

如果我们有大量数据或内存不足,zfzi选项会派上用场。

例如,我们可以将数据分为两部分xnewx,并使用filter函数,例如,

[y,zf] = filter(b,a,x);
newy = filter(b,a,newx,zf); 

对于ab的过滤器,

enter image description here

我们将回顾length(a) -1 y length(b) -1x样本的max(length(a),length(b)) -1个样本。

因此,为了在下半场继续我们的过滤器,我们需要从上半场开始y[n] = x[n] + 2 * x[n-1] + 3 * x[n-2]; 次来电。

示例1

a = 1;
b = [1 2 3];

是,

x = [1     2     3     4     5     6     7     8     9];
y = [1     4    10    16    22    28    34    40    46];
zf = [42  27]';

示例输入和输出是,

newx

newy[1] = newx[1] + 2*9 + 3*8 = newx[1] + 42 = newx[1] + zf[1]; newy[2] = newx[2] + 2 * newx[1] + 3*9 = newx[2] + 2 * newx[1] + zf[2]; 实施过滤器,对于前两个样本,

x = 1 : 9;
b = [1 1 1];
a = [1 2];
[y,zf] = filter(b,a,x);

示例2

y[n] = x[n] + x[n-1] + x[n-2] - 2*y[n-1]

这相当于 x = [1 2 3 4 5 6 7 8 9]; y = [1 1 4 1 10 -5 28 -35 94]; zf = [-171 9]';

输入和输出是:

newy[1] = newx[1] + 9 + 8 - 2 * 94 = newx[1] - 171 = newx[1] + zf(1);
newy[2] = newx[2] + newx[1] + 9 - 2*newy[1] = newx[2] + newx[1] + zf(2) - 2*newy[1];

现在是下半场的第一个值:

zf

所以我认为现在很明显,{{1}}如何运作。

答案 1 :(得分:1)

zf中的值包含IIR滤波器的内部状态。这些滤波器在实践中有多种实现方式,但在所有这些滤波器中都有一些延迟元素,它们将一些值传递给下一次迭代。请参阅维基百科条目中有关数字滤波器的this section。在直接形式1'中,有一些延迟元素用于保存最后几个输入,还有一些其他延迟元素用于保存最后几个输出。在'直接形式2'中,延迟元素包含一些中间结果。与确切的实现无关,应该恢复这些存储器位置,以便在处理数据块时不会在输出中产生任何毛刺。

在处理数据块时,您应该使用filter函数,如下所示:

filter_state = []; % start with empty state

for i = 1:num_chunks
    input_chunk = get_chunk(i);
    [output_chunk, filter_state] = filter(b, a, input_chunk, filter_state);
    save_chunk(i, output_chunk)
end