MATLAB Answers

SampleRateConvertion error in plugin

5 views (last 30 days)
Hi
I´m trying to implement a x4 oversampling process but I´m having difficulties on how let the SampleRateConverter sytem object knows about sample rate used.
When compiling the example attached for plugin generation, the following error shows up: “Failed to compute constant value for nontunable property 'SampleRate'. In code generation, nontunable properties can only be assigned constant values.”
I'd really appreciate if someone can give me a hint on how fix/treat this.
Br
Pablo
classdef (StrictDefaults)DistoLab_Test2 < matlab.System & audioPlugin
properties
GainDisto=0;
Input=0;
Volume=0;
end
properties (Constant, Hidden)
% Define the plugin interface
PluginInterface = audioPluginInterface( ...
'InputChannels',2,...
'OutputChannels',2,...
'PluginName','DistoLab_Test2',...
audioPluginParameter('Volume', ...
'DisplayName', 'Out', ...
'DisplayNameLocation','none',...
'Label','dB', ...
'Mapping', { 'lin', -15, 15}, ...
'Style', 'rotaryknob', 'Layout', [4 6]),...
audioPluginParameter('Input', ...
'DisplayName', 'In', ...
'DisplayNameLocation','none',...
'Label','dB', ...
'Mapping', { 'lin', -5, 5}, ...
'Style', 'rotaryknob', 'Layout', [4 3]),...
audioPluginParameter('GainDisto', ...
'DisplayName', 'Saturation', ...
'DisplayNameLocation','none',...
'Style', 'rotaryknob', 'Layout', [4,5],...
'Mapping', { 'lin', 0, 10}, ...
'Filmstrip','knob_67_black.png', ... %<--
'FilmstripFrameSize',[80,80]), ...
audioPluginGridLayout('RowHeight', [30 90 10 100 37], ...
'ColumnWidth', [30 100 100 20 100 100 20 80 80 80 60], 'Padding', [10 10 10 10]));
end
properties (Access = private)
Up4;
Down4;
end
methods
% Constructor
function plugin = DistoLab_Test2
plugin.Up4=dsp.SampleRateConverter;
plugin.Down4=dsp.SampleRateConverter;
calculateSampleRates(plugin);
end
end
methods(Access = protected)
function out = stepImpl(plugin, in)
inadjusted=in*(10^(plugin.Input/20)); % Incoming signal adjusted by Input Gain
%SampleRateConverter x4 process
v=step(plugin.Up4,inadjusted);
disto=(v*plugin.GainDisto).^5; % input distorted
outdisto=(disto)*(10^(plugin.Volume/20));
out = step(plugin.Down4,outdisto);
end
function resetImpl(plugin)
reset(plugin.Up4);
reset(plugin.Down4);
end
function calculateSampleRates(plugin)
plugin.Up4.InputSampleRate=getSampleRate(plugin);
plugin.Up4.OutputSampleRate=4*getSamplerate(plugin);
plugin.Down4.InputSampleRate=4*getSampleRate(plugin);
plugin.Down4.OutputSampleRate=getSampleRate(plugin);
end
end
end

Accepted Answer

Jimmy Lapierre
Jimmy Lapierre on 23 Nov 2020
Hi Pablo,
There are some limitations with codegen and the resampling objects. If you have a hard-coded ratio of 4, the easiest way around it might be to use a nominal sample rate, such as 48kHz. The added benefit is that avoid calls to getSampleRate will be faster.
function calculateSampleRates(plugin)
sampleRate = 48000; % use a nominal rate
plugin.Up4.InputSampleRate=sampleRate;
plugin.Up4.OutputSampleRate=4*sampleRate;
plugin.Down4.InputSampleRate=4*sampleRate;
plugin.Down4.OutputSampleRate=sampleRate;
end
The following challenge will be that the input of the sample rate converter will be of unknown size. You can get around that by looping over partitions of a maximum size (like 4096). Something like this might work for you:
% Replaces out = step(plugin.Down4,outdisto);
out = zeros(size(in));
for ii = 1:4096:size(in,1)
endIdx = min(ii+4095,size(in,1));
xin = outdisto(4*ii-3:4*endIdx,:);
assert(size(xin,1)<=4*4096); % Tell codegen xin won't be larger than 4x4096
out(ii:endIdx,:) = step(plugin.Down4,xin);
end
  7 Comments
Jimmy Lapierre
Jimmy Lapierre on 2 Feb 2021
Replace all the "4*" by a constant named "OSF" (oversampling factor) and set it to 4, 8 or 16.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!