Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

help for using simulink and usrp

Asked by Volkan on 5 Feb 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?

0 Comments

Volkan

Products

No products are associated with this question.

1 Answer

Answer by Ryan G on 5 Feb 2013
Accepted answer

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 Comments

Volkan on 7 Feb 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 on 7 Feb 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.

Ryan G

Contact us