SampleRateConvertion error in plugin
    6 ビュー (過去 30 日間)
  
       古いコメントを表示
    
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
0 件のコメント
採用された回答
  Jimmy Lapierre
    
 2020 年 11 月 23 日
        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 件のコメント
  Adrian Alexander
 2021 年 2 月 2 日
				Hi i realy like the oversampling code. 
I want to change the code to some other oversamplingfactor like x8 or x16 
what would change in the second part ? i dont realy know how it works.
ut = 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
thanks
  Jimmy Lapierre
    
 2021 年 2 月 2 日
				Replace all the "4*" by a constant named "OSF" (oversampling factor) and set it to 4, 8 or 16.
その他の回答 (0 件)
参考
カテゴリ
				Help Center および File Exchange で Audio Plugin Creation and Hosting についてさらに検索
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


