2013-10-14 23 views
1

我有一個傳遞函數,我試圖用來過濾加速度數據。不斷更新傳遞函數

到目前爲止,我已經能夠在大約10秒鐘內用正弦波使用lsim,並且我得到了我期望的結果。但是,我不能如何實時獲取數據。

爲了澄清,每0.1秒我收到一個外部程序的加速度值。我需要過濾這些值以消除數據中的高頻變化。我需要在接收到的每個數據點都發生這種情況,因爲我隨後將當前過濾的加速度值用於其他處理步驟。

如何連續使用傳遞函數並在每次接收到新數據時更新輸出值?

回答

2

這是如何做到這一點與filter一個例子:

filter_state = []; % start with empty filter history 
while not_stopped() 
    x = get_one_input_sample(); 
    [y, filter_state] = filter(B, A, x, filter_state); 
    process_one_output_sample(y); 
end; 

請注意,你需要使用過濾器的擴展形式,在其中您從一個迭代通過過濾器的歷史記錄下一使用變量filter_stateBA是離散濾波器的係數。如果您的過濾器是連續的,則需要先使用c2d左右將其轉換爲離散過濾器。請注意,如果您的過濾器非常複雜,則可能需要分幾步分割過濾器(例如每個過濾器有一個二階階段)以避免數值問題。

+0

你有get_one_input_sample,我假設你從其他地方拉數據。可以從外部程序中知道數據是什麼?更像是推動matlab,而不是拉。或者,最好是像UDP端口一樣發佈當前值並從Matlab中獲取它? – Steve

+0

我想這可以通過推或拉數據來完成,這完全取決於你如何使用matlab與硬件接口。你可能想爲此提出一個單獨的問題。對於過濾部分,這並不重要,它始終是一個樣本,一個樣本出來,同時確保將過濾器的歷史傳遞給下一次迭代。 –

+0

好的,我有一個想法來獲取數據,但它需要什麼格式?它可以只是一個數字嗎?例如,我每0.1秒收到的數據是:0.3,0,0.01,0.1,0.4,0.6,0.6等。我可以只做濾波器(B,A,0.3,filter_state),然後濾波(B,A,0 ,filter_state)等? – Steve