Преобразование dsp.FIRFilter Объект к фиксированной точке с помощью приложения Fixed-Point Converter

Преобразуйте dsp.FIRFilter Системный object™, который фильтрует высокочастотный синусоидальный сигнал, в фиксированную точку с помощью приложения Fixed-Point Converter. Этот пример требует лицензий Fixed-Point Designer™ и DSP System Toolbox™.

Создайте функцию filter DSP и испытательный стенд

Создайте myFIRFilter функция из dsp.FIRFilter Системный объект.

По умолчанию системные объекты сконфигурированы так, чтобы использовать арифметику с фиксированной точностью. Чтобы собрать данные области значений и получить предложения по типам данных из приложения Fixed-Point Converter, сконфигурируйте Системный объект, чтобы использовать настройки «Custom».

Сохраните функцию в локальную папку с возможностью записи.

function output = myFIRFilter(input, num)
    
    persistent lowpassFIR;
    if isempty(lowpassFIR)
        lowpassFIR  = dsp.FIRFilter('NumeratorSource', 'Input port', ...
            'FullPrecisionOverride', false, ...
            'ProductDataType', 'Full precision', ... % default
            'AccumulatorDataType', 'Custom', ...
            'CustomAccumulatorDataType', numerictype(1,16,4), ...
            'OutputDataType', 'Custom', ...
            'CustomOutputDataType', numerictype(1,8,2));
    end
    output = lowpassFIR(input, num);
    
end
Создайте испытательный стенд, myFIRFilter_tb, для фильтра. Испытательный стенд генерирует сигнал, который собирает информацию о области значений для преобразования. Сохраните испытательный стенд.
% Test bench for myFIRFilter
% Remove high-frequency sinusoid using an FIR filter.

% Initialize
f1 = 1000;
f2 = 3000;
Fs = 8000;
Fcutoff = 2000;

% Generate input
SR = dsp.SineWave('Frequency',[f1,f2],'SampleRate',Fs,...
    'SamplesPerFrame',1024);

% Filter coefficients
num = fir1(130,Fcutoff/(Fs/2));

% Visualize input and output spectra
plot = dsp.SpectrumAnalyzer('SampleRate',Fs,'PlotAsTwoSidedSpectrum',...
    false,'ShowLegend',true,'YLimits',[-120 30],...
    'Title','Input Signal (Channel 1) Output Signal (Channel 2)');

% Stream
for k = 1:100
    input = sum(SR(),2); % Add the two sinusoids together
    filteredOutput = myFIRFilter(input, num); % Filter
    plot([input,filteredOutput]); % Visualize
end

Преобразуйте функцию в фиксированную точку

  1. Откройте приложение Fixed-Point Converter.

    • MATLAB® Панель инструментов: На вкладке Apps, в разделе Code Generation, нажмите значок приложения.

    • Командная строка MATLAB: Ввод

      fixedPointConverter

  2. Чтобы добавить функцию точки входа myFIRFilter в проект перейдите к файлу myFIRFilter.m, а затем нажмите Open.

    По умолчанию приложение сохраняет информацию и настройки для этого проекта в текущей папке в файле с именем myFirFilter.prj.

  3. Щелкните Next, чтобы перейти к Define Input Types шагу.

    Окно приложения myFIRFilter.m для нарушений кода и проблем готовности преобразования с фиксированной точкой. Приложение не находит проблемы в myFIRFilter.m.

  4. На странице Define Input Types, чтобы добавить myFIRFilter_tb в качестве тестового файла просмотрите myFIRFilter_tb.m, а затем нажмите Autodefine Input Types.

    Приложение определяет из тестового файла, какой тип input является double(1024 x 1) и тип num является double(1 x 131).

  5. Щелкните Next, чтобы перейти к Convert to Fixed Point шагу.

  6. На странице Convert to Fixed Point щелкните Simulate, чтобы собрать информацию о области значений.

    На вкладке Variables отображаются собранная информация о области значений и предложения по типам. При необходимости отредактируйте предложения по типам данных вручную.

    На вкладке Variables поле Proposed Type для lowpassFIR.CustomProductDataType является Full Precision. Приложение Fixed-Point Converter не предложило тип данных для этого поля, поскольку его 'ProductDataType' установка не установлена на 'Custom'.

  7. Щелкните Convert, чтобы применить предложенные типы данных к функции.

    Приложение Fixed-Point Converter применяет предложенные типы данных и генерирует функцию с фиксированной точкой, myFIRFilter_fixpt.

    function output = myFIRFilter_fixpt(input, num)
        
        fm = get_fimath();
    
        persistent lowpassFIR;
        if isempty(lowpassFIR)
            lowpassFIR  = dsp.FIRFilter('NumeratorSource', 'Input port', ...
                'FullPrecisionOverride', false, ...
                'ProductDataType', 'Full precision', ... % default
                'AccumulatorDataType', 'Custom', ...
                'CustomAccumulatorDataType', numerictype(1, 16, 14), ...
                'OutputDataType', 'Custom', ...
                'CustomOutputDataType', numerictype(1, 8, 6));
        end
        output = fi(lowpassFIR(input, num), 1, 16, 14, fm);
        
    end
    
    
    function fm = get_fimath()
    	fm = fimath('RoundingMethod', 'Floor', 'OverflowAction', 'Wrap',..
     'ProductMode', 'FullPrecision', 'MaxProductWordLength', 128, 'SumMode',..
     'FullPrecision', 'MaxSumWordLength', 128);
    end

Похожие темы