Реализация HDL цифрового повышающего преобразователя для LTE

В этом примере показано, как спроектировать цифровой повышающий преобразователь (DUC) для приложений радиосвязи, таких как LTE и сгенерировать HDL-код.

Введение

ДЮКИ широко используются в передатчиках цифровой связи, чтобы преобразовать сгенерированные модулированные сигналы в сигналы промежуточной частоты (IF) или радиочастоту (RF). Операция DUC увеличивает частоту дискретизации сигнала и переключает его к более высокой частоте, чтобы упростить последующие этапы обработки. DUC в этом примере выполняет преобразование частоты дискретизации с помощью четырехэтапной цепи фильтра, сопровождаемой комплексным переводом частоты. Пример запускается путем разработки DUC с функциями DSP System Toolbox™ в плавающей точке. Затем каждый этап преобразуется в фиксированную точку и используется в модели Simulink®, которая генерирует синтезируемый HDL-код. Пример использует эти два тестовых сигнала, чтобы продемонстрировать и проверить операцию DUC:

  • Синусоида, которая модулируется на несущую IF на 32 МГц.

  • Сигнал нисходящего канала LTE с полосой пропускания 1,4 МГц, модулируемых на несущую IF на 32 МГц.

Пример downconverts выходные параметры ДЮКОВ и фиксированной точки с плавающей точкой, и сравнивает качество сигнала этих двух выходных параметров.

Наконец, пример представляет реализацию цепи фильтра для FPGAs и результаты синтеза.

Этот пример использует DUCTestUtils, класс помощника, который содержит функции для генерации стимула и анализа DUC выход. Для получения дополнительной информации смотрите DUCTestUtils.m файл.

Структура DUC

DUC состоит из цепи фильтра интерполяции, генератора с программным управлением (NCO) и микшера. Цепь фильтра состоит из интерполятора lowpass, интерполятора полуполосы, интерполятора компенсации CIC (КИХ), интерполятор CIC и коррекция усиления CIC.

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

Первый интерполятор lowpass реализует точный Fpass и Fstop характеристики DUC. Полуленточный фильтр является промежуточным интерполятором. Чем более низкие частоты дискретизации в начале цепочечного среднего значения, тем более ранние фильтры могут оптимизировать использование ресурса путем совместного использования множителей. Интерполятор компенсации CIC улучшает спектральный ответ путем компенсации позже свисание CIC при интерполяции на два. Интерполятор CIC обеспечивает большой коэффициент интерполяции, который удовлетворяет цепь фильтра повышающая дискретизация требований.

Этот рисунок показывает блок-схему DUC.

Частота дискретизации входа к DUC является 1.92 членами Шотландского парламента, и выходная частота дискретизации является 122.88 членами Шотландского парламента. Эти уровни дают полный коэффициент интерполяции 64. Приемники LTE используют 1.92 членов Шотландского парламента в качестве типичной частоты дискретизации для поиска ячейки и восстановления основного блока информации (MIB). Фильтры DUC спроектированы, чтобы удовлетворить этому приложению. DUC оптимизирован, чтобы запуститься на тактовой частоте 122,88 МГц.

Проект DUC

Этот раздел объясняет, как спроектировать DUC с помощью операций с плавающей точкой и функций создания фильтра в MATLAB®. Объект DUC позволяет вам задать несколько характеристик, которые задают ответ каскада для четырех фильтров, включая полосу пропускания и частоты полосы задерживания, неравномерность в полосе пропускания и затухание в полосе задерживания.

Параметры DUC

Этот пример проектирует характеристики фильтра DUC, чтобы соответствовать этим желаемым значениям отклика для данной входной частоты дискретизации и несущей частоты.

FsIn = 1.92e6;      % Sampling rate at input to DUC
Fc = 32e6;          % Carrier frequency
Fpass = 540e3;      % Passband frequency, equivalent to 36*15kHz LTE subcarriers
Fstop = 700e3;      % Stopband frequency
Ap = 0.1;           % Passband ripple
Ast = 60;           % Stopband attenuation

Первый интерполятор Lowpass

Этот фильтр интерполирует два и действует на самой низкой частоте дискретизации цепи фильтра. Низкая частота дискретизации означает, что этот фильтр может использовать разделение ресурсов для эффективной аппаратной реализации.

lowpassParams.FsIn = FsIn;
lowpassParams.InterpolationFactor = 2;
lowpassParams.FsOut = FsIn*lowpassParams.InterpolationFactor;

lowpassSpec = fdesign.interpolator(lowpassParams.InterpolationFactor, ...
    'lowpass','Fp,Fst,Ap,Ast',Fpass,Fstop,Ap,Ast,lowpassParams.FsOut);
lowpassFilt = design(lowpassSpec,'SystemObject',true)
lowpassFilt = 

  dsp.FIRInterpolator with properties:

    InterpolationFactor: 2
        NumeratorSource: 'Property'
              Numerator: [0.0020 0.0021 4.9115e-04 -0.0027 -0.0050 ... ]

  Use get to show all properties

Отобразите ответ величины фильтра lowpass без коррекции усиления.

ducPlots.lowpass = fvtool(lowpassFilt,'Fs',FsIn*2,'Legend','off');
DUCTestUtils.setPlotNameAndTitle('Lowpass Interpolator');

Второй интерполятор полуполосы

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

 hbParams.FsIn = lowpassParams.FsOut;
 hbParams.InterpolationFactor = 2;
 hbParams.FsOut = lowpassParams.FsOut*hbParams.InterpolationFactor;
 hbParams.TransitionWidth = hbParams.FsIn - 2*Fstop;
 hbParams.StopbandAttenuation = Ast;

 hbSpec = fdesign.interpolator(hbParams.InterpolationFactor,'halfband', ...
          'TW,Ast', ...
          hbParams.TransitionWidth, ...
          hbParams.StopbandAttenuation, ...
          hbParams.FsOut);

hbFilt = design(hbSpec,'SystemObject',true)
hbFilt = 

  dsp.FIRInterpolator with properties:

    InterpolationFactor: 2
        NumeratorSource: 'Property'
              Numerator: [0.0178 0 -0.1129 0 0.5953 1 0.5953 0 -0.1129 0 ... ]

  Use get to show all properties

Визуализируйте ответ величины интерполяции полуполосы.

ducFilterChain = dsp.FilterCascade(lowpassFilt,hbFilt);
ducPlots.hbFilt = fvtool(lowpassFilt,hbFilt,ducFilterChain, ...
                           'Fs',[FsIn*2,FsIn*4,FsIn*4]);
legend( ...
       'Lowpass interpolator', ...
       'Halfband interpolator', ...
       'Lowpass and halfband');

DUCTestUtils.setPlotNameAndTitle('Halfband Interpolator');

Интерполятор компенсации CIC

Поскольку ответ величины последнего CIC-фильтра имеет значительное свисание в области полосы пропускания, пример использует основанный на КИХ фильтр компенсации свисания, чтобы сгладить ответ полосы пропускания. Компенсатор свисания имеет те же свойства как интерполятор CIC. Этот фильтр реализует интерполяцию на коэффициент два, таким образом, необходимо также задать bandlimiting характеристики для фильтра. Кроме того, задайте свойства интерполятора CIC, которые используются для этого фильтра компенсации, а также позже интерполятор CIC.

Используйте design функционируйте, чтобы возвратить Системный объект фильтра с заданными характеристиками.

compParams.FsIn = hbParams.FsOut;
compParams.InterpolationFactor = 2;                                 % CIC compensation interpolation factor
compParams.FsOut = compParams.FsIn*compParams.InterpolationFactor;  % New sampling rate
compParams.Fpass = 1/2*compParams.FsIn + Fpass;                     % CIC compensation passband frequency
compParams.Fstop = 1/2*compParams.FsIn + 1/4*compParams.FsIn;       % CIC compensation stopband frequency
compParams.Ap = Ap;                                                 % Same passband ripple as overall filter
compParams.Ast = Ast;                                               % Same stopband attenuation as overall filter

cicParams.InterpolationFactor = 8;  % CIC interpolation factor
cicParams.DifferentialDelay = 1;    % CIC interpolator differential delay
cicParams.NumSections = 3;          % CIC interpolator number of integrator and comb sections

compSpec = fdesign.interpolator(compParams.InterpolationFactor,'ciccomp', ...
           cicParams.DifferentialDelay, ...
           cicParams.NumSections, ...
           cicParams.InterpolationFactor, ...
           'Fp,Fst,Ap,Ast', ...
           compParams.Fpass,compParams.Fstop,compParams.Ap,compParams.Ast, ...
           compParams.FsOut);
compFilt = design(compSpec,'SystemObject',true)
compFilt = 

  dsp.FIRInterpolator with properties:

    InterpolationFactor: 2
        NumeratorSource: 'Property'
              Numerator: [-0.0012 0.0078 0.0030 -0.0141 0.0125 0.0118 ... ]

  Use get to show all properties

Постройте ответ интерполятора компенсации CIC.

ducFilterChain = dsp.FilterCascade(lowpassFilt,hbFilt,compFilt);
ducPlots.cicComp = fvtool(lowpassFilt,hbFilt,compFilt,ducFilterChain, ...
                           'Fs',[FsIn*2,FsIn*4,FsIn*8,FsIn*8]);
legend( ...
       'Lowpass interpolator', ...
       'Halfband interpolator', ...
       'CIC compensation interpolator', ...
       'Lowpass, halfband, and CIC compensation');
DUCTestUtils.setPlotNameAndTitle('CIC Compensation Interpolator');

Интерполятор CIC

Последний этап фильтра реализован как интерполятор CIC из-за этого типа способности фильтра эффективно реализовать большой фактор децимации. Ответ CIC-фильтра похож на каскад фильтров скользящего среднего значения, но CIC-фильтр не использует умножения или деления. В результате CIC-фильтр имеет большое усиление DC.

cicParams.FsIn = compParams.FsOut;
cicParams.FsOut = cicParams.FsIn*cicParams.InterpolationFactor;

cicFilt = dsp.CICInterpolator(cicParams.InterpolationFactor, ...
          cicParams.DifferentialDelay,cicParams.NumSections) %#ok<*NOPTS>
cicFilt = 

  dsp.CICInterpolator with properties:

    InterpolationFactor: 8
      DifferentialDelay: 1
            NumSections: 3
     FixedPointDataType: 'Full precision'

Визуализируйте ответ величины интерполяции CIC. CIC-фильтры используют вычисления с фиксированной точкой внутренне, таким образом, fvtool графики и квантованные и неквантованные ответы.

ducFilterChain = dsp.FilterCascade(lowpassFilt,hbFilt,compFilt,cicFilt);
ducPlots.cicInter = fvtool(lowpassFilt,hbFilt,compFilt,cicFilt,ducFilterChain, ...
                      'Fs',[FsIn*2,FsIn*4,FsIn*8,FsIn*64,FsIn*64]);

legend( ...
       'First halfband interpolator', ...
       'Second halfband interpolator', ...
       'CIC compensation interpolator', ...
       'CIC interpolator: quantized', ...
       'CIC interpolator: reference', ...
       'Overall response: quantized', ...
       'Overall response: reference');
DUCTestUtils.setPlotNameAndTitle('Lowpass, Halfband, CIC Compensation, and CIC Interpolator');

Каждый интерполятор имеет усиление DC, которое определяется его коэффициентом интерполяции. Интерполятор CIC имеет большее усиление, чем другие фильтры. Вызовите gain функция, чтобы получить фактор усиления этого фильтра.

% Because the CIC gain is a power of two, a hardware implementation can easily
% correct for the gain factor by using a shift operation.
% For analysis purposes, the example represents the gain correction by using
% a one-tap |dsp.FIRFilter| System object. Combine the filter chain and the
% gain correction filter into a |dsp.FilterCascade| System object.

cicGain = gain(cicFilt)
Gain = lowpassParams.InterpolationFactor* ...
    hbParams.InterpolationFactor*compParams.InterpolationFactor* ...
    cicParams.InterpolationFactor*cicGain;
GainCorr = dsp.FIRFilter('Numerator',1/Gain)
cicGain =

    64


GainCorr = 

  dsp.FIRFilter with properties:

            Structure: 'Direct form'
      NumeratorSource: 'Property'
            Numerator: 2.4414e-04
    InitialConditions: 0

  Use get to show all properties

Постройте полный цепочечный ответ с и без коррекции усиления.

ducPlots.overallResponse = fvtool(ducFilterChain,dsp.FilterCascade(ducFilterChain,GainCorr), ...
                           'Fs',[FsIn*64,FsIn*64]);
legend( ...
       'No gain correction (quantized)', ...
       'No gain correction (reference)', ...
       'Gain correction (quantized)', ...
       'Gain correction (reference)');
DUCTestUtils.setPlotNameAndTitle('Overall DUC Chain Response');

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

Частотная характеристика цепи фильтра DUC с плавающей точкой теперь выполняет спецификации. Затем квантуйте каждый этап фильтра, чтобы использовать фиксированные точки и анализировать их, чтобы подтвердить, что цепь фильтра все еще выполняет спецификации.

Отфильтруйте квантование

Этот пример использует 16-битные коэффициенты, которые достаточны, чтобы выполнить спецификации. Используя меньше чем 18 битов для коэффициентов минимизирует количество блоков DSP, которые требуются для реализации FPGA. Вход к цепи фильтра DUC является 16-битными данными с 15 дробными битами. Выходные параметры фильтра являются 18-битными значениями, которые обеспечивают дополнительную высоту и точность в промежуточных сигналах.

% First Lowpass Interpolator
lowpassFilt.FullPrecisionOverride = false;
lowpassFilt.CoefficientsDataType = 'Custom';
lowpassFilt.CustomCoefficientsDataType = numerictype([],16,15);
lowpassFilt.ProductDataType = 'Full precision';
lowpassFilt.AccumulatorDataType = 'Full precision';
lowpassFilt.OutputDataType = 'Custom';
lowpassFilt.CustomOutputDataType = numerictype([],18,14);

% Halfband
hbFilt.FullPrecisionOverride = false;
hbFilt.CoefficientsDataType = 'Custom';
hbFilt.CustomCoefficientsDataType = numerictype([],16,14);
hbFilt.ProductDataType = 'Full precision';
hbFilt.AccumulatorDataType = 'Full precision';
hbFilt.OutputDataType = 'Custom';
hbFilt.CustomOutputDataType = numerictype([],18,14);

% CIC Compensation Interpolator
compFilt.FullPrecisionOverride = false;
compFilt.CoefficientsDataType = 'Custom';
compFilt.CustomCoefficientsDataType = numerictype([],16,14);
compFilt.ProductDataType = 'Full precision';
compFilt.AccumulatorDataType = 'Full precision';
compFilt.OutputDataType = 'Custom';
compFilt.CustomOutputDataType = numerictype([],18,14);

Для интерполятора CIC, выбор 'Minimum section word lengths' опция типа данных с фиксированной точкой автоматически оптимизирует внутренний wordlengths на основе выхода wordlength и других параметров CIC.

cicFilt.FixedPointDataType = 'Minimum section word lengths';
cicFilt.OutputWordLength = 18;

Сконфигурируйте свойства фиксированной точки коррекции усиления и основанных на КИХ Системных объектов. Объект использует RoundingMethod по умолчанию и OverflowAction значения свойств ('Floor' и 'Wrap' соответственно).

% CIC Gain Correction
GainCorr.FullPrecisionOverride = false;
GainCorr.CoefficientsDataType = 'Custom';
GainCorr.CustomCoefficientsDataType = numerictype(fi(GainCorr.Numerator,1,16));
GainCorr.OutputDataType = 'Custom';
GainCorr.CustomOutputDataType = numerictype(1,18,14);

Анализ фиксированной точки

Смотрите эффекты квантования с fvtool. Можно анализировать фильтры индивидуально или в каскаде. fvtool показывает квантованные и неквантованные (ссылочные) ответы overlayed. Например, этот рисунок показывает эффект квантования первого КИХ-этапа фильтра.

ducPlots.quantizedFIR = fvtool(lowpassFilt, ...
    'Fs',lowpassParams.FsIn*2,'arithmetic','fixed');
DUCTestUtils.setPlotNameAndTitle('Lowpass Interpolator');
legend('quantized', 'reference');

Переопределите ducFilterChain расположите каскадом объект включать свойства фиксированной точки отдельных фильтров. Затем используйте fvtool анализировать целую цепь фильтра и подтвердить, что квантованный DUC все еще выполняет спецификации.

ducFilterChain = dsp.FilterCascade(lowpassFilt,hbFilt,compFilt,cicFilt,GainCorr);
ducPlots.quantizedDUCResponse = fvtool(ducFilterChain, ...
    'Fs',FsIn*64,'Arithmetic','fixed');

DUCTestUtils.setPlotNameAndTitle('DUC Filter Chain');
legend('quantized', 'reference');

Оптимизированная HDL модель Simulink

Следующий шаг в процессе проектирования должен реализовать DUC в блоках использования Simulink та генерация HDL-кода поддержки.

Настройка модели

Модель использует переменные в рабочем пространстве MATLAB, чтобы сконфигурировать блоки и настройки. Это использует те же переменные цепи фильтра, заданные ранее в примере.

Вход к DUC прибывает из ducIn переменная. На данный момент присвойте фиктивное значение для ducIn так, чтобы модель могла вычислить свои типы данных. Во время тестирования, ducIn предоставляет входные данные модели.

ducIn = 0; %#ok<NASGU>

Структура модели

Этот рисунок показывает верхний уровень модели DUC Simulink. Модель импортирует ducIn переменная из рабочего пространства MATLAB при помощи блока Signal From Workspace, преобразует сигнал в 16-битные значения и применяет сигнал к DUC. Можно сгенерировать HDL-код от HDL_DUC подсистема.

modelName = 'DUCforLTEHDL';
open_system(modelName);
set_param(modelName,'Open','on');

Реализация DUC в HDL_DUC подсистема.

set_param([modelName '/HDL_DUC'],'Open','on');

Отфильтруйте параметры блоков

Все фильтры сконфигурированы, чтобы наследовать свойства соответствующих Системных объектов. Каждый блок также имеет набор HDL Properties, которые используются, чтобы оптимизировать получившийся HDL-код. Lowpass, полуполоса и фильтры компенсации CIC действуют на частотах дискретизации, которые ниже, чем тактовая частота (Fclk) факторами 32, 16, и 8, соответственно. Эти фильтруют, блокирует методы сериализации использования (разделение ресурсов), чтобы минимизировать использование аппаратного ресурса.

Например, потому что частота дискретизации входа с блоком Lowpass Interpolation является Fclk/32, 32 такта доступны, чтобы обработать каждую входную выборку. Когда вы генерируете HDL-код для DUC, файл журнала перечисляет весь SerialPartition значения свойств, доступные для блоков фильтра, на основе их коэффициентов. Эти значения применяются, когда вы устанавливаете параметр Архитектуры на Partly Serial. Самое большое значение в каждом SerialPartition вектор представляет фактор совместного использования фильтра. Фактор совместного использования означает, что множители совместно используются во время в фильтре и потребностях фильтра что много циклов, чтобы работать с каждой выборкой. Для блока Lowpass Interpolation в этой модели минимальное количество множителей происходит когда SerialPartition свойством является 17. Эта установка означает, что фильтр может обработать одну выборку каждые 17 тактов. Поскольку одна выборка прибывает в этот фильтр каждые 32 цикла, фильтр имеет циклы в наличии, чтобы использовать фактор совместного использования 17, чтобы уменьшать аппаратные ресурсы. Рисунки показывают параметры блоков и настройки HDL Properties для блока Lowpass Interpolation.

Для получения дополнительной информации смотрите SerialPartition (HDL Coder) и Архитектуры Фильтра HDL (HDL Coder).

Получите коррекцию

Коррекция усиления делит выход на 4 096, который эквивалентен сдвигу прямо на 12 битов. Поскольку сигналы ввода и вывода коррекции усиления, каждый описывается 18 битами, модель, реализуют этот сдвиг путем иного толкования типу данных выходного сигнала. Блок Conversion дает иное толкование 12-битному номеру, чтобы иметь 20 дробных битов, а не 8 дробных битов.

set_param([modelName '/HDL_DUC/Gain Correction'],'Open','on');

Параметры блоков NCO

Блок NCO HDL Optimized генерирует комплексный фазовращатель в несущей частоте. Этот сигнал переходит к микшеру, который умножает фазовращатель с выходным сигналом. Выход микшера производится в 122.88 членах Шотландского парламента.

Задайте желаемое разрешение частоты. Вычислите количество двоичных разрядов аккумулятора, требуемых достигнуть нужного разрешения и задать количество квантованных двоичных разрядов аккумулятора. NCO использует квантованный выход аккумулятора, чтобы обратиться к интерполяционной таблице синуса. Также вычислите шаг фазы, который NCO должен использовать, чтобы сгенерировать заданную несущую частоту. NCO применяет dither фазы к двоичным разрядам аккумулятора, которые удалены во время квантования.

nco.Fd = 1;
nco.AccWL = nextpow2(FsIn*64/nco.Fd) + 1;
nco.QuantAccWL = 12;
nco.PhaseInc = round((Fc*2^nco.AccWL)/(FsIn*64));
nco.NumDitherBits = nco.AccWL-nco.QuantAccWL;

Блок NCO в модели сконфигурирован параметрами, заданными в nco структура. Этот рисунок показывает обе вкладки HDL NCO Оптимизированное диалоговое окно параметров блоков.

Синусоида на тесте несущей

Чтобы протестировать DUC, передайте синусоиду на 40 кГц через DUC и модулируйте выходной сигнал на несущую частоту. Демодулируйте и передискретизируйте сигнал. Затем измерьте свободный от паразитных составляющих динамический диапазон (SFDR) получившегося тона и SFDR NCO выход.

% Initialize random seed before executing any simulations.
rng(0);

% Generate a 40kHz test tone.
ducIn = DUCTestUtils.GenerateTestTone(40e3);

% Upconvert the test signal with the floating-point DUC.
ducTx = DUCTestUtils.UpConvert(ducIn,FsIn*64,Fc,ducFilterChain);
release(ducFilterChain);

% Down convert the output of DUC.
ducRx = DUCTestUtils.DownConvert(ducTx,FsIn*64,Fc);

% Upconvert the test signal by running the fixed-point Simulink model.
simOut = sim(modelName);

% Downconvert the output of DUC.
simTx = simOut.ducOut;
simRx = DUCTestUtils.DownConvert(simTx,FsIn*64,Fc);

% Measure the SFDR of the NCO, floating point DUC, and fixed-point DUC outputs.
results.sfdrNCO = sfdr(real(simOut.ncoOut),FsIn);
results.sfdrFloatDUC = sfdr(real(ducRx),FsIn);
results.sfdrFixedDUC = sfdr(real(simRx),FsIn);

disp('SFDR Measurements');
disp(['   Floating-point DUC SFDR: ',num2str(results.sfdrFloatDUC) ' dB']);
disp(['   Fixed-point NCO SFDR: ',num2str(results.sfdrNCO) ' dB']);
disp(['   Fixed-point DUC SFDR: ',num2str(results.sfdrFixedDUC) ' dB']);
fprintf(newline);

% Plot the SFDR of the NCO and fixed-point DUC outputs.
ducPlots.ncoOutSDFR = figure;
sfdr(real(simOut.ncoOut),FsIn);
DUCTestUtils.setPlotNameAndTitle(['NCO Output Signal ' get(gca,'Title').String]);

ducPlots.ducOutSDFR = figure;
sfdr(real(simRx),FsIn);
DUCTestUtils.setPlotNameAndTitle(['Fixed-Point DUC Output Signal ' get(gca,'Title').String]);
SFDR Measurements
   Floating-point DUC SFDR: 287.7399 dB
   Fixed-point NCO SFDR: 86.0718 dB
   Fixed-point DUC SFDR: 92.8885 dB

Тест сигнала LTE

Можно использовать тестовый сигнал LTE, чтобы выполнить более строгое тестирование DUC. Сгенерируйте стандартную совместимую форму волны LTE при помощи функций LTE Toolbox™. Затем upconvert форма волны с моделью DUC. Используйте функции LTE Toolbox, чтобы измерить величину вектора ошибок (EVM) получившихся сигналов.

rng(0);
% Execute this test only if you have the LTE Toolbox product.
if license('test','LTE_Toolbox')

    % Generate an LTE test signal by using LTE Toolbox functions.
    [ducIn, sigInfo] = DUCTestUtils.GenerateLTETestSignal();

    % Upconvert the signal with the floating-point DUC and modulate onto carrier.
    ducTx = DUCTestUtils.UpConvert(ducIn,FsIn*64,Fc,ducFilterChain);
    release(ducFilterChain);

    % Add noise to the transmit signal.
    ducTxAddNoise = DUCTestUtils.AddNoise(ducTx);

    % Downconvert the received signal.
    ducRx = DUCTestUtils.DownConvert(ducTxAddNoise,FsIn*64,Fc);

    % Upconvert the signal by using the Simulink model.
    simOut = sim(modelName);

    % Add noise to the transmit signal.
    simTx = simOut.ducOut;
    simTxAddNoise = DUCTestUtils.AddNoise(simTx);

    % Downconvert the received signal.
    simRx = DUCTestUtils.DownConvert(simTxAddNoise,FsIn*64,Fc);

    results.evmFloat = DUCTestUtils.MeasureEVM(sigInfo,ducRx);
    results.evmFixed = DUCTestUtils.MeasureEVM(sigInfo,simRx);

    disp('LTE EVM Measurements');
    disp(['   Floating-point DUC RMS EVM: '  num2str(results.evmFloat.RMS*100,3) '%']);
    disp(['   Floating-point DUC Peak EVM: ' num2str(results.evmFloat.Peak*100,3) '%']);
    disp(['   Fixed-point DUC RMS EVM: '     num2str(results.evmFixed.RMS*100,3) '%']);
    disp(['   Fixed-point DUC Peak EVM: '    num2str(results.evmFixed.Peak*100,3) '%']);
    fprintf(newline);

end
LTE EVM Measurements
   Floating-point DUC RMS EVM: 0.782%
   Floating-point DUC Peak EVM: 2.42%
   Fixed-point DUC RMS EVM: 0.755%
   Fixed-point DUC Peak EVM: 2.76%

Генерация HDL-кода и реализация FPGA

Чтобы сгенерировать HDL-код для этого примера, у вас должен быть продукт HDL Coder™. Используйте makehdl и makehdltb команды, чтобы сгенерировать HDL-код и испытательный стенд HDL для HDL_DUC подсистема. DUC синтезировался на оценочной плате Xilinx® Zynq®-7000 ZC706. Таблица показывает результаты использования ресурса места-и-маршрута сообщения. Проект соответствовал синхронизации с тактовой частотой 188 МГц.

T = table(...
    categorical({'LUT'; 'LUTRAM'; 'FF'; 'BRAM'; 'DSP'}),...
    categorical({'3497'; '370'; '4871'; '0.5'; '10'}),...
    'VariableNames',{'Resource','Usage'})
T =

  5x2 table

    Resource    Usage
    ________    _____

     LUT        3497 
     LUTRAM     370  
     FF         4871 
     BRAM       0.5  
     DSP        10   

Для просмотра документации необходимо авторизоваться на сайте