我目前正在尝试设计一个非常粗略但功能正常的循环缓冲区,用于实时信号处理。为清楚起见,我没有DSP工具箱许可证。
现在,我们的想法是在1xN窗口内缓冲一部分信号,然后进一步后处理。为实现这一点,我一直在考虑Simulink块,如下图所示。
问题如下:如果MATLAB函数是
function y = fcn(Signal,DelayedBuffer,BufferSize)
%#codegen
% y = zeros(1,BufferSize);
persistent Buffer;
Buffer = [Signal DelayedBuffer(1:59-1)];
y = Buffer;
end
一切顺利。 但是,将函数写为
时function y = fcn(Signal,DelayedBuffer,BufferSize)
%#codegen
% y = zeros(1,BufferSize);
persistent Buffer;
Buffer = [Signal DelayedBuffer(1:BufferSize-1)];
y = Buffer;
end
我收到以下错误:
数据' y' (#32)被推断为可变大小矩阵,而它的 指定的类型是别的。
您对如何抑制此错误有任何宝贵的提示吗?
答案 0 :(得分:1)
MATLAB功能块的工作原理是为您输入的MATLAB代码生成编译代码。为了生成代码,块需要知道您使用的所有输入和变量的大小,类型和复杂性。它根据输入的大小推断变量和输出的大小。使用
创建缓冲区时Buffer = [Signal DelayedBuffer(1:59-1)];
很容易看出Buffer的大小是59个元素(假设Signal是标量)。 MATLAB功能块可以推断出这个大小,并且还可以识别分配缓冲区的y也具有相同的大小。在第二种情况下,
Buffer = [Signal DelayedBuffer(1:BufferSize-1)];
BufferSize来自输入,MATLAB功能块在编译时不知道该值。因此,必须假设此值可以更改,从而导致可变大小的数据。即在编译时无法确定缓冲区的大小。分配缓冲区的'y'也被推断为可变大小的数据。错误消息表明您可能已将块参数中的输出大小指定为固定大小。博客的“端口和数据管理器”对话框中有一个复选框,表示输出端口是可变大小。您可以选中该框以查看其有效。但在你的情况下,对于循环缓冲区,最好使用持久变量,它给你固定大小的数据。
您的BufferSize不需要在一次模拟中更改尝试将其用作MATLAB功能块的参数而不是输入。您也可以通过“端口和数据管理器”对话框执行此操作。