无法使用 Matlab Coder 将 Matlab 代码转换为 C 代码

Posted

技术标签:

【中文标题】无法使用 Matlab Coder 将 Matlab 代码转换为 C 代码【英文标题】:Cannot convert Matlab code to C code using Matlab Coder 【发布时间】:2019-05-05 21:28:17 【问题描述】:

我有一个 MATLAB 代码,如下所示。我正在尝试使用 MATLAB Coder 将此代码转换为 C 代码,但遇到了错误。

预期为逻辑、char、int、fi、single 或 double。找到一个 mxArray。 MxArrays 从对 MATLAB 解释器的调用中返回,并且在表达式中不受支持。它们只能用于赋值的右侧以及作为外部函数的参数。

% Applies A-weighted filtering to sound and draws it's plot
% in a figure as output.
function A_filtering
coder.extrinsic('tic')
coder.extrinsic('toc')
coder.extrinsic('display')
sampleRate = 44100;
reader = dsp.AudioFileReader('Jet_Flypast.wav');
fs = 44100;
weightFilter = weightingFilter('A-weighting',fs);
% fileWriter = dsp.AudioFileWriter('SampleRate',fs);
% visualize(weightFilter,'class 1')
scope = dsp.SpectrumAnalyzer('SampleRate',fs,...
    'PlotAsTwoSidedSpectrum',false,...
    'FrequencyScale','Log',...
    'FrequencyResolutionMethod','WindowLength',...
    'WindowLength',sampleRate,...
    'Title','A-weighted filtering',...
    'ShowLegend',true,...
    'ChannelNames','Original Signal','Filtered Signal');

tic
while toc < 60
    x = reader();
    y = weightFilter(x);
    scope([x(:,1),y(:,1)])
    display(x(:,1))
end

release(scope);
release(weightFilter);
release(reader);
end

这个问题可能是重复的,但我搜索了互联网并找不到任何相关的帖子。有没有办法解决这个错误?

【问题讨论】:

【参考方案1】:

您已将 tic, toc 声明为外部的,这是正确的,因为代码生成不支持它们。由于它们是外在的,因此这些函数的结果不能直接用于其他表达式。 Coder 在运行时不知道这些结果的内容。但是您可以通过将结果分配给已知变量来提供有关其类型的提示。你应该换行

while toc < 60

以下几行

tElapsed = 0;
tElapsed = toc;
while tElapsed < 60

由于我们用 0 初始化 tElapsed,它是一种已知类型的双标量。 toc 的输出在赋值给 tElapsed 时会转换为该类型。

另请注意,当您使用 MATLAB Coder 生成 mex 文件时,您的代码可以正常工作。但是您不能从中生成独立代码,因为外部函数需要 MATLAB 才能运行。

【讨论】:

以上是关于无法使用 Matlab Coder 将 Matlab 代码转换为 C 代码的主要内容,如果未能解决你的问题,请参考以下文章

确定输入“conscalc: calc”的类型时出错。无法将 coder.StructTypes 与不同的字段集联合

具有外部 C++ 函数的 Matlab:coder.ceval 将结构传递给函数

使用 Matlab Coder 将 C 字符数组转换为 Matlab 字符串

为啥 strel 在 MATLAB Coder 中失败

在 MATLAB Coder 中将 mxarrays 与 step 函数一起使用的问题

MATLAB 到 C++:MATLAB Coder 不支持 csvread()