필터 지우기
필터 지우기

Composite System Object for Code Generation or use in Simulink

조회 수: 2 (최근 30일)
Constantin Runge
Constantin Runge 2018년 11월 27일
댓글: Honglei Chen 2018년 11월 27일
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?

채택된 답변

Honglei Chen
Honglei Chen 2018년 11월 27일
편집: Honglei Chen 2018년 11월 27일
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
Constantin Runge
Constantin Runge 2018년 11월 27일
Thank you very much. Where can I find the objects implementation?
Yes, the Discrete FIR Filter Block does support multiple filters. But only for sample-based processing. I am working in a frame-based domain. Thus I believe I have to implement my own multi-channel FIR.
Honglei Chen
Honglei Chen 2018년 11월 27일
Oh, sorry, I mean the doc
See where they talked about NumeratorSource.
HTH

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Get Started with DSP System Toolbox에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by