适应动态仿真模块的输入/输出向量金宝app

18视图(30天)
Sharlina Keshava”class=
Sharlina Keshava 2015年6月4日
评论道: rizwan阿扎姆2021年11月26日
我使用仿真软件Matlab金宝app Fcn功能块和越来越错误相关的适应我的输入/输出向量。我有一个功能块,从csv文件中读取一组数据和工作很好。读取的数据是存储在一个数据存储内存块。下一个功能块分区要处理的数据子集的最终功能块过滤的数据(使用filtfilt函数)和两次计数信号峰值的数量。
我的问题是分区数据的功能块。下面的源代码。
函数(停止、subsetAnalyzed) = fcn
% # codegen
全球startVal
全球voltageArray
全球numSubsets
全球sizeLastSubset
% coder.varsize (subsetAnalyzed, 10000, (1);
如果numSubsets ~ = 0
endVal = startVal + 9999
停止= 0
其他的
endVal = startVal + sizeLastSubset
停止= 1
结束
startVal subsetAnalyzed = voltageArray (1: endVal)
startVal = endVal + 1
numSubsets = numSubsets - 1
在港口和数据管理器菜单我已经检查变量的大小选择,和指定输出的上限subsetAnalyzed到10000岁。运行这个收益率以下错误。
计算最大大小的输出函数的findpeaks # 1超过最大允许的元素数量(134217728)。
计算大小(x: 200000000: 200000000)。
函数“filterAndCountPeaks”(# 41.920.923)、线37、列2:“党”
发射诊断报告。
组件:MATLAB函数|类别:编码器误差
我试着使用“coder.varsize (subsetAnalyzed, 10000,(1);“指定上限,但这并不奏效。我的理解是,必须有一个值而不是“1”或一个空白的尺寸部分港口和数据管理器菜单,否则仿真软件将期望价值是标量。金宝app
下面是第三个功能块,过滤器和计数峰值,供您参考。
函数numPksDisp = fcn (subsetAnalyzed)
% # codegen
全球numPks
Z2 = 1:1:大小(subsetAnalyzed, 1);
Z2 = Z2 ';
total2 =大小(Z2, 1);
length2 =大小(subsetAnalyzed, 1);
time2 = Z2 (1:1: length2, 1);
% %过滤部分
disp (第1部分“过滤器”)
fs = 14.4 e3;
Wp = 2 *π* 3 / fs;%通带截止频率
Ws = 2 *π* 12 / fs;%阻带截止频率
Rp = 3;%通带衰减
Rs = 30;%阻带衰减
Omip = Wp /π;省略= Ws /π;
%切比雪夫LP从0到6赫兹不到3 dB的涟漪
从14 Hz %至少30 dB
Omip = Wp /π;省略= Ws /π;
[数控,Wnc] = cheb1ord (Omip、省略、Rp, Rs);
(公元前,ac) = cheby1(数控、Rp Wnc);
过滤= filtfilt(公元前,ac, subsetAnalyzed);%过滤信号%
afterc2 = -subsetAnalyzed +过滤;
disp (第2部分“过滤”)
[Nc2, Wnc2] = cheb1ord (2 * 20 / fs, 2 * 100 / fs, Rp, Rs);
[bc2, ac2] = cheby1 (Rp, Nc2 Wnc2);
filtered2 = filtfilt (bc2, ac2, afterc2);%过滤信号%
afterc2 = filtered2;
numPksDisp = 0;
disp (“发现峰”)
(pks, loc) = findpeaks (afterc2,“MINPEAKHEIGHT”,-0.02375);
图(3)
情节(time2 afterc2);
情节(time2 (loc),“k ^”,“markerfacecolor”(1 0 0))
标题(“峰识别”);
pksValuec2 = afterc2 (time2 (loc));
numPks = numPks +大小(pksValuec2, 1)
numPksDisp = numPks;
你能帮我解决这个问题已经困扰我一个学期的一半吗?我读过无数Mathworks和Stackoverflow关于这个问题的帖子,没有结论性的解决方案。金宝搏官方网站
这是一个模型的截图: http://imgur.com/UkRp2ix F6eDq6K
这是我截图的港口和数据经理配置设置: http://imgur.com/UkRp2ix F6eDq6K # 1
非常感谢你的帮助!

答案(1)

拉达克里希纳Maddukuri”class=
拉达克里希纳Maddukuri 2015年6月9日
如果一个MATLAB功能块中使用一个模型,它生成一个墨西哥人函数模型模拟。这意味着在底层模型使用MATLAB编码器生成墨西哥人的功能。
使用MATLAB编码器时,您可以选择使用动态内存或静态内存用于创建数组。如果你决定使用静态内存,你仍然可以有大小可变的数组,但是数组的大小必须是有界的一些数量,这样我们才能生成代码的“最坏情况”数组一样大的有界的大小。如果尺寸是无界的,或者最坏的情况下阵列大小是有界的,但原因有超过134217728的元素(1024 * 1024 * 128;一个无证上限),则抛出一个错误和代码生成。这些限制不存在动态分配的数组。
然而,目前不支持动态分配的内存为MATLAB函数块,这里提到的文档:金宝app
有一些解决方法:
1。从MATLAB生成一个静态或动态库函数,调用“partitionData”函数与coder.ceval MATLAB功能块(),和链接的Simulink仿真模型库的定制代码面板配置参数。金宝app请注意,这确实需要一点努力。
2。试图重写代码以这样一种方式,最坏的情况下静态数组大小不超过最大限制。现在,
(pks, loc) = findpeaks (afterc2 MINPEAKHEIGHT, -0.02375);
有一个坏的情况下计算的大小(x: 200000000: 200000000)。
脚本可以重写打破了数组,分别计算和将他们带回MATLAB然后连接它们。
3所示。从MATLAB调用生成的墨西哥人文件编码器在一个解释MATLAB功能块(或定期与coder.extrinsic MATLAB功能块())。这不是一个有效的选择如果你想从你的模型生成代码。
我希望你找到这些解决方法有用。
1评论
rizwan阿扎姆”class=
rizwan阿扎姆 2021年11月26日
谢谢你详细的回答,它帮助很多了解MATLAB功能块的工作原理。我目前有一个问题,也许你可以摆脱一些lite:
我有一个在仿真软件matlab函数命名节点,与一个名为xr输出。金宝appxr实际上是一个可变大小的数组与最大尺寸11 x1。在另一个MATLAB函数,我需要提取指数从2:6值。然而仿真软件不允金宝app许我来提取这种范围和给一个错误” 运行时发生一个错误造成的模拟和仿真终止:
  • 代码生成假设违反大小。意想不到的运行矢量预测方向改变。

登录置评。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!