help for using simulink and usrp

1 vue (au cours des 30 derniers jours)
Volkan
Volkan le 5 Fév 2013
I want transmit an image using Simulink and USRP. I have the following code
%if true
function msg = genMsg
persistent imgmatRows imgmatCols imgvec msgBin msgBinRows msgBinCols msgTmp;
coder.extrinsic('imread');
if isempty(imgvec)
imgmat = imread('cameraman.tif');
[imgmatRows, imgmatCols] = size(imgmat);
imgvec = reshape(imgmat, 1, imgmatRows * imgmatCols);
msgBin = de2bi(int8(imgvec), 7, 'left-msb');
[msgBinRows, msgBinCols] = size(msgBin);
msgTmp = reshape(double(msgBin).', msgBinRows*msgBinCols, 1);
end
msg = msgTmp;
When I run this code it produces the following error message:
"Function output 'msg' cannot be an mxArray in this context. Consider preinitializing the output variable with a known type."
How can I fix this problem?

Réponse acceptée

Ryan G
Ryan G le 5 Fév 2013
You are calling imread extrinsically and it will return a variable of type mxArray back to the MATLAB function. This cannot be done since Simulink cannot use mxArray datatypes.
To fix this, define imgmat as a double before calling imread like this:
imgmat = zeros(pixelwidth,pixelheight,cdata);
imgmat = imread('cameraman.tif');
That will force the coder to generate imgmat as a type double. When you call imread it will store the result in a double. You will also need to know the size of the image before running this as the result will be placed in a defined matrix. I would run the imread in MATLAB first to determine what imgmat should be defined as.
  2 commentaires
Volkan
Volkan le 7 Fév 2013
Hi Ryan, I did the changes you mentioned in the answer but after that another error was occured. New error is:
Data 'msg' (#24) is inferred as a variable size matrix, while its specified type is something else.
How can I fix this?
Ryan G
Ryan G le 7 Fév 2013
There are 2 things you can do here.
1) Define msg like you did with imgmat. In other words, you need to make msg a non-variable size matrix. That is a limitation of simulink compared to matlab as it will generate c-code for this function and c does not handle the variable sized matrix like MATLAB.
2) Since you are already calling part of the function extrinsically, you could go ahead and write the entire contents to a function and call the whole thing extrinsically. This would save you that hassle of defining imgmat and you would only need to define msg. The downside is your model will run slower and you can't generate code.
However, you can't generate code anyway right now (since imread is extrinsic) and the slowdown may be negligible for your application.
Of course an alternative would involve computer vision system toolbox as it would allow you to import the image directly.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Communications Toolbox dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by