dsp.FIRFilter Объект в фиксированную точку с помощью приложения конвертера фиксированных точекПреобразовать a dsp.FIRFilter System object™, который фильтрует высокочастотный синусоидальный сигнал, в фиксированную точку с помощью приложения Fixed-Point Converter. Этот пример требует лицензий Fixed-Point Designer™ и DSP System Toolbox™.
Создать myFIRFilter функция из dsp.FIRFilter Системный объект.
По умолчанию системные объекты настроены на использование арифметики с фиксированной точкой полной точности. Чтобы собрать данные диапазона и получить предложения по типу данных из приложения Fixed-Point Converter, настройте объект System на использование параметров «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
Откройте приложение Конвертер фиксированных точек.
MATLAB ® Toolstrip: На вкладке Приложения в разделе Создание кода щелкните значок приложения.
командная строка MATLAB: Enter
fixedPointConverter
Добавление функции точки входа myFIRFilter в проект, перейдите к файлу myFIRFilter.mи нажмите кнопку Открыть.
По умолчанию приложение сохраняет информацию и параметры этого проекта в текущей папке в файле с именем myFirFilter.prj.

Нажмите кнопку Далее (Next), чтобы перейти к шагу Определить типы ввода (Define Input Types).
Экраны приложений myFIRFilter.m по нарушениям кода и вопросам готовности. Приложение не находит проблем в myFIRFilter.m.
На странице Определить типы ввода (Define Input Types), чтобы добавить myFIRFilter_tb в качестве тестового файла перейдите к myFIRFilter_tb.mи нажмите кнопку Автоопределить типы ввода.
Приложение определяет из тестового файла тип input является double(1024 x 1) и тип num является double(1 x 131).

Нажмите кнопку Далее (Next), чтобы перейти к шагу Преобразовать в фиксированную точку (Convert to Fixed Point).
На странице Преобразовать в фиксированную точку (Convert to Fixed Point) щелкните Смоделировать (Simulate), чтобы собрать информацию о диапазоне.
На вкладке Переменные (Variables) отображаются собранные данные диапазона и предложения по типам. При необходимости вручную отредактируйте предложения по типу данных.

На вкладке Переменные в поле Предлагаемый тип для lowpassFIR.CustomProductDataType является Full Precision. Приложение Fixed-Point Converter не предложило тип данных для этого поля, так как 'ProductDataType' параметр не установлен в значение 'Custom'.
Нажмите кнопку Преобразовать, чтобы применить предлагаемые типы данных к функции.
Приложение 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