2012-02-25 57 views
2

我想使用filtfilt命令與matlab編碼器,但我遇到了麻煩。Matlab編碼器和filtfilt()

如果我以正常的方式運行程序一切運行良好,但是當我嘗試構建c代碼時,會顯示以下錯誤消息:「數據的長度必須超過過濾器順序的3倍」。我在某處讀到這可能是因爲filtfilt函數需要知道整個信號(隨着時間的推移),這可能與matlab編碼器不兼容。然而,這似乎是不正確的,MATLAB名單filtfilt作爲代碼生成支持的功能 - http://www.mathworks.se/help/toolbox/signal/ug/br7exek-1.html

我的電話是:

y_filt = filtfilt(B,A,Y);

我只是調用之前變量具有以下屬性:

名字大小..........字節......類

一個...... 1x9 ........... 72 ........... double
b ...... 1x9 ........... 72 ... ........ double
y ...... 1499400x1 11995200 double

有沒有人有關於如何解決這個問題的建議?

+0

這似乎你已經證明了它不是'filtfilt'功能,可以提供更多的代碼或多個錯誤的描述? – macduff 2012-02-25 23:46:47

+0

好吧,我很難理解它還能做什麼。爲了得到(b,a)黃油在[b,a] =黃油(8,0.045,高)之前執行。 – 2012-02-26 17:25:25

回答

1

我明白你的失望。我認爲這個問題是由於爲了使用filtfilt您預先分配了大量的數據。當我嘗試類似的操作時,我的機器被視爲服務器類,內存不足。我會建議看看你的要求,並確保filtfilt是唯一能滿足他們的功能。我意識到filtfilt的零相位特性非常適合在Matlab編碼器中進行分配,但內存需求可能會讓您更加頭疼。如果您想討論其他選擇,請告訴我。謝謝!

+0

**感謝您的回答!**我嘗試的做法是在一個方向上使用filter()。然後'flipud()'。然後我再次過濾(),最後再過濾()。作爲第一步,我還用_er作爲黃油(a或b)返回時間最長的兩倍,然後__刪除我已添加的長度_作爲最後一步。 **您看到這個解決方案有什麼問題?** – 2012-02-27 20:47:44

+0

我認爲這聽起來很好。令人沮喪的是'過濾器'會起作用,而不是'filtfilt',但只要輸出符合您的預期即可。我遇到了這個http://www.scipy.org/Cookbook/FiltFilt,我知道它適用於Python,但我認爲它仍然具有一定的價值。 – macduff 2012-02-27 21:34:47

+0

**我終於解決了它**,以便我可以運行'filtfilt()'!問題是我沒有指定波形文件的長度大於a或b。這意味着即使運行'whos',matlab編碼器也不會看到長度。然而,一個新的問題已經到來,因爲我不知道如何在代碼中指定常量。 'coder.constant'不起作用。我已經在這個鏈接上提出了單獨的問題[constants-and-matlab-coder](http://stackoverflow.com/questions/9467573/constants-and-matlab-coder)。 **你還知道這個嗎?** – 2012-02-29 15:52:53

0

你在這裏使用Buuterwroth-Filter。這是一個IIR濾波器。要求的過濾器訂單可以遠遠高於過濾器選項卡的數量。信號長度應該是過濾器的訂單的三倍,而不是過濾器長度!

問候, Tchekov