无法使用 Matlab Coder 将 Matlab 代码转换为 C 代码
Cannot convert Matlab code to C code using Matlab Coder
我有一个如下所示的 MATLAB 代码。我正在尝试使用 MATLAB Coder 将此代码转换为 C 代码,但我遇到了错误。
Expected either a logical, char, int, fi, single, or double. Found an mxArray. MxArrays are returned from calls to the MATLAB interpreter and are not supported inside expressions. They may only be used on the right-hand side of assignments and as arguments to extrinsic functions.
% 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
这个问题可能是重复的,但我在互联网上搜索并没有找到任何相关的帖子。有什么办法可以解决这个错误吗?
您已将 tic, toc
声明为外部的,这是正确的,因为代码生成不支持它们。由于它们是外部的,因此这些函数的结果不能直接用于其他表达式。编码器在 运行 时不知道这些结果的内容。但是您可以通过将结果分配给已知变量来提供有关它们类型的提示。您应该替换行
while toc < 60
包含以下几行
tElapsed = 0;
tElapsed = toc;
while tElapsed < 60
由于我们将 tElapsed 初始化为 0,因此它是一种已知类型的双标量。 toc的输出在赋值给tElapsed时会转换成这种类型。
另请注意,当您使用 MATLAB Coder 生成 mex 文件时,您的代码可以正常工作。但是你不能从中生成独立代码,因为外部函数需要 MATLAB 到 运行.
我有一个如下所示的 MATLAB 代码。我正在尝试使用 MATLAB Coder 将此代码转换为 C 代码,但我遇到了错误。
Expected either a logical, char, int, fi, single, or double. Found an mxArray. MxArrays are returned from calls to the MATLAB interpreter and are not supported inside expressions. They may only be used on the right-hand side of assignments and as arguments to extrinsic functions.
% 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
这个问题可能是重复的,但我在互联网上搜索并没有找到任何相关的帖子。有什么办法可以解决这个错误吗?
您已将 tic, toc
声明为外部的,这是正确的,因为代码生成不支持它们。由于它们是外部的,因此这些函数的结果不能直接用于其他表达式。编码器在 运行 时不知道这些结果的内容。但是您可以通过将结果分配给已知变量来提供有关它们类型的提示。您应该替换行
while toc < 60
包含以下几行
tElapsed = 0;
tElapsed = toc;
while tElapsed < 60
由于我们将 tElapsed 初始化为 0,因此它是一种已知类型的双标量。 toc的输出在赋值给tElapsed时会转换成这种类型。
另请注意,当您使用 MATLAB Coder 生成 mex 文件时,您的代码可以正常工作。但是你不能从中生成独立代码,因为外部函数需要 MATLAB 到 运行.