dsp.FIRFilter
в фиксированную точку Используя приложение Fixed-Point ConverterЭтот пример преобразовывает Систему dsp.FIRFilter
object™, который фильтрует высокочастотный сигнал синусоиды к фиксированной точке с помощью приложения Fixed-Point Converter. Этот пример требует лицензии DSP System Toolbox™ и Fixed-Point Designer™.
Создайте функцию 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
Откройте приложение Fixed-Point Converter.
MATLAB® Toolstrip: На вкладке Apps, под Code Generation, кликают по значку приложения.
Подсказка команды MATLAB: Войти
fixedPointConverter
Чтобы добавить точку входа функционируют myFIRFilter
к проекту, обзор к файлу myFIRFilter.m
, и затем нажать Open.
По умолчанию приложение сохраняет информацию и настройки для этого проекта в текущей папке в файле с именем myFirFilter.prj
.
Нажмите Next, чтобы перейти к шагу Define Input Types.
Экраны приложения myFIRFilter.m
для нарушений регулярной кодовой последовательности и проблем готовности преобразования фиксированной точки. Приложение не находит проблемы в myFIRFilter.m
.
На странице Define Input Types, чтобы добавить myFIRFilter_tb
как тестовый файл, обзор к myFIRFilter_tb.m
, и затем нажать Autodefine Input Types.
Приложение решает от тестового файла, что типом input
является double(1024 x 1)
, и типом num
является double(1 x 131)
.
Нажмите Next, чтобы перейти к шагу Convert to Fixed Point.
На странице Convert to Fixed Point нажмите Simulate, чтобы собрать информацию области значений.
Вкладка Variables отображает собранную информацию области значений и предложения по типу. Вручную отредактируйте предложения по типу данных по мере необходимости.
Во вкладке Variables полем Proposed Type для lowpassFIR.CustomProductDataType
является Full Precision
. Приложение Fixed-Point Converter не предложило типа данных для этого поля, потому что его установка 'ProductDataType'
не установлена в 'Custom'
.
Нажмите 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