Composite System Object for Code Generation or use in Simulink
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
Constantin Runge
el 27 de Nov. de 2018
Comentada: Honglei Chen
el 27 de Nov. de 2018
I've built a composite System Object with the goal, to provide a 'parallel' FIR filter with a parameterizable number of parallel channels to my Simulink model:
classdef ParallelFIR < matlab.System
% parallel_fir takes a matrix of taps and applies them to matrices of
% inputs, where each matrix column is a channel
% Public, tunable properties
properties
Taps = [0.5 0.5; 0.5 0.5];
end
properties(Access = private)
fir_channel
end
methods
function obj = ParallelFIR(varargin)
if nargin == 1
setProperties(obj, 2, 'Taps', varargin{1});
else
setProperties(obj, nargin, varargin{:});
end
end
end
methods(Access = protected)
function setupImpl(obj)
c = size(obj.Taps, 1);
obj.fir_channel = cell(c, 1);
for i = 1:c
obj.fir_channel{i} = dsp.FIRFilter(obj.Taps(i,:));
end
end
function validateInputsImpl(obj, in)
assert(size(in, 1) == size(obj.Taps, 1), "taps and input are required to have the same number of channels");
end
function y = stepImpl(obj,u)
y = zeros(size(u));
for i = 1:size(obj.Taps, 1)
y(i,:) = step(obj.fir_channel{i}, u(i,:));
end
end
function resetImpl(obj)
for i = 1:size(obj.Taps, 1)
reset(obj.fir_channel{i});
end
end
end
end
Whenever I try to use the system object in a Simulink MATLAB System Block or to generate C++ code for a script using the system object, I get the following error:
Cannot compute constant value for argument #1 for this System object constructor. All arguments to the constructor of this System object must be constants for code generation. One way to supply a constant value is to pass it to the main function using Simulink non-tunable parameters (for MATLAB Function block) or coder.newtype('constant',...) (for MATLAB Coder). The error occurred for MATLAB System block 'Subsystem/MATLAB System'. See line 29, column 38 in file 'ParallelFIR.m'.
Line 29 is the one with
obj.fir_channel{i} = dsp.FIRFilter(obj.Taps(i,:));
How can I implement the parallel FIR to be usable for Simulink System Blocks?
0 comentarios
Respuesta aceptada
Honglei Chen
el 27 de Nov. de 2018
Editada: Honglei Chen
el 27 de Nov. de 2018
If you don't intend to change your Taps during the simulation, you may want to consider setting it as Nontunable, like
properties (Nontunable)
Taps = [0.5 0.5; 0.5 0.5];
end
Also it may be helpful to share your code generation script as well as your code generation command.
HTH
4 comentarios
Honglei Chen
el 27 de Nov. de 2018
Oh, sorry, I mean the doc
See where they talked about NumeratorSource.
HTH
Más respuestas (0)
Ver también
Categorías
Más información sobre Get Started with DSP System Toolbox en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!