我知道,爲了過濾大量的數據塊,可以使用函數'filter'和相應的濾波器係數 並通過最終條件'zf'作爲其初始條件'zi'的下一個塊。MATLAB函數過濾器中'zf'的內容究竟是什麼
我很困惑。 'zf'的內容究竟是什麼?
它是否保存最後的相關輸入樣本? (在純FIR濾波器中) 上次相關的輸出採樣? (在IIR中) 當最後一個輸入和最後一個輸出都相關時,它會保持什麼?
非常感謝
我知道,爲了過濾大量的數據塊,可以使用函數'filter'和相應的濾波器係數 並通過最終條件'zf'作爲其初始條件'zi'的下一個塊。MATLAB函數過濾器中'zf'的內容究竟是什麼
我很困惑。 'zf'的內容究竟是什麼?
它是否保存最後的相關輸入樣本? (在純FIR濾波器中) 上次相關的輸出採樣? (在IIR中) 當最後一個輸入和最後一個輸出都相關時,它會保持什麼?
非常感謝
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
在情況下,我們有一個大的數據集或我們缺少在內存中的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
sampl es的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
作品。
非常感謝我真的很喜歡你的答案和例子,但是在最後一種情況下,長度(a)> 1和長度(b)> 1,zf的具體內容是什麼? – 2014-12-04 17:24:13
@Day_Dreamer,檢查編輯,現在好多了,希望它適合你。 – Rashid 2014-12-05 19:10:03
@Rashid很好的答案 – 2017-10-24 09:07:52