2012-02-25 58 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