我知道为了在chuncks中过滤大量数据,可以使用具有适当滤波器系数的函数'filter', 并将最终条件'zf'传递给下一个块作为其初始条件'zi'。
我很困惑。 什么是'zf'的内容?
它是否包含最后的相关输入样本? (在纯FIR滤波器中) 最后的相关输出样本? (在IIR中) 当最后输入和最后输出都相关时它能保持什么?
非常感谢
答案 0 :(得分:4)
如果我们有大量数据或内存不足,zf
和zi
选项会派上用场。
例如,我们可以将数据分为两部分x
和newx
,并使用filter
函数,例如,
[y,zf] = filter(b,a,x);
newy = filter(b,a,newx,zf);
对于a
和b
的过滤器,
我们将回顾length(a) -1
y
length(b) -1
个x
样本的max(length(a),length(b)) -1
个样本。
因此,为了在下半场继续我们的过滤器,我们需要从上半场开始y[n] = x[n] + 2 * x[n-1] + 3 * x[n-2];
次来电。
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);
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