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

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

Введение

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

  1. Синусоида модулируется на поставщика услуг IF на 32 МГц.

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

Пример измеряет качество сигнала вниз преобразующим выход ДЮКОВ и фиксированной точки с плавающей точкой и сравнивает два. Наконец, результаты реализации FPGA представлены.

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

Структура DUC

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

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

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

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

Проект DUC

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

Параметры DUC

Желаемый ответ DUC задан входной частотой дискретизации, несущей частотой и характеристиками фильтра. Изменение этого желаемого ответа фильтра может потребовать изменений в HDL Block Properties блоков фильтра в модели Simulink. HDL Block Properties обсуждена позже в примере.

FsIn  = 1.92e6;     % Sampling rate at input to DUC
Fc    = 32e6;	    % Carrier frequency
Fpass = 540e3;      % Passband frequency, equivalent to 36x15kHz 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:

        NumeratorSource: 'Property'
              Numerator: [1x69 double]
    InterpolationFactor: 2

  Use get to show all properties

Используйте fvtool чтобы отобразить ответ величины 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:

        NumeratorSource: 'Property'
              Numerator: [1x11 double]
    InterpolationFactor: 2

  Use get to show all properties

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

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

legend(...
       'Lowpass Interpolator', ...
       'Halfband Interpolator', ...
       'Lowpass+Halfband');

DUCTestUtils.setPlotNameAndTitle('Halfband Interpolator');

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

Ответ величины последнего CIC-фильтра имеет значительное свисание в области полосы пропускания, поэтому основанный на КИХ фильтр компенсации свисания используется, чтобы сгладить ответ полосы пропускания. Компенсатор сконфигурирован теми же параметрами как интерполятор CIC. Этот фильтр также реализует интерполяцию на коэффициент два, поэтому ее bandlimiting характеристики заданы. Задайте требования фильтра и затем используйте 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 comp passband frequency
compParams.Fstop                = 1/2 * compParams.FsIn + 1/4 * compParams.FsIn;       % CIC comp stopband frequency
compParams.Ap                   = Ap;                                                  % Same Ap as overall filter
compParams.Ast                  = Ast;                                                 % Same Ast as overall filter

Структура фильтра компенсации CIC также соответствует позже интерполяции CIC. Таким образом, некоторые параметры интерполятора CIC заданы здесь.

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:

        NumeratorSource: 'Property'
              Numerator: [1x36 double]
    InterpolationFactor: 2

  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 Comp Interpolator', ...
       'Lowpass+Halfband+CIC Comp');

DUCTestUtils.setPlotNameAndTitle('CIC Comp Interpolator');

Интерполятор 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 Comp + CIC Interpolator');

Для каждого интерполятора существует усиление DC, определенное его коэффициентом интерполяции. Для интерполятора CIC, из-за его реализации, это имеет большее усиление, чем другие фильтры. Используйте gain получить усиление интерполятора CIC. Общий доход является степенью двойки, поэтому он может быть легко откорректирован в оборудовании с операцией сдвига. В аналитических целях коррекция усиления представлена в MATLAB dsp.FIRFilter с одним касанием Системный объект. Объедините цепь фильтра и фильтр коррекции усиления в dsp.FilterCascade Системный объект.

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]);

DUCTestUtils.setPlotNameAndTitle('Overall DUC Chain Response');

legend(...
       'Overall Response: No Gain Correction (Quantized)',...
       'Overall Response: No Gain Correction (Reference)',...
       'Overall Response: Gain Correction (Quantized)',...
       'Overall Response: Gain Correction (Reference)');

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

Частотная характеристика цепи фильтра 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('Quantized Lowpass Interpolator');

legend(...
       'Lowpass Interpolator: Quantized', ...
       'Lowpass Interpolator: Reference');

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

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

DUCTestUtils.setPlotNameAndTitle('Quantized DUC Filter Chain');

legend(...
       'DUC filter chain: Quantized', ...
       'DUC filter chain: Reference');

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

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

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

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

Вход к 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, HDL Coder перечисляет весь SerialPartition опции, доступные для блоков фильтра, на основе их коэффициентов. Самое большое значение в SerialPartition вектор представляет фактор совместного использования фильтра. В этом примере HDL Coder перечисляет минимальное использование множителя, достигает когда SerialPartition из Lowpass Interpolation блок установлен в 17, так, чтобы это использовало 17 тактов, доступных для него. Для получения дополнительной информации смотрите SerialPartition и Архитектуры Фильтра HDL.

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

Коррекция усиления делит выход на 4 096, который эквивалентен сдвигу прямо на 12 битов. Количество битов в обоих, ввод и вывод коррекции усиления составляет 18 битов, поэтому этот сдвиг, реализовано путем простого иного толкования типу данных как показано.

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

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

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

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 структура. Обе вкладки диалогового окна параметра блока показывают.

Синусоида на тесте поставщика услуг и верификации

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

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

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

% Up convert 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);

% Up convert the test signal by executing the fixed-point Simulink model with the sim function.
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 the fixed-point DUC outputs.
results.sfdrNCO      = sfdr(real(simOut.ncoOut),FsIn);
results.sfdrFloatDUC = sfdr(real(ducRx),FsIn);
results.sfdrFixedDUC = sfdr(real(simRx),FsIn);

disp('Spurious Free Dynamic Range (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 Out ' get(gca,'Title').String]);

ducPlots.ducOutSDFR = figure;
sfdr(real(simRx),FsIn);
DUCTestUtils.setPlotNameAndTitle(['Fixed-Point DUC Out ' get(gca,'Title').String]);
Spurious Free Dynamic Range (SFDR) Measurements
   Floating point DUC SFDR: 287.7185 dB
   Fixed-point NCO SFDR: 86.0718 dB
   Fixed-point DUC SFDR: 92.8885 dB

Тест LTE и верификация

Тестовый сигнал LTE используется, чтобы выполнить более строгое тестирование DUC. LTE Toolbox™ используется, чтобы сгенерировать стандартную совместимую форму волны LTE. Форма волны преобразуется с DUC и затем модулируется на поставщика услуг. LTE Toolbox используется, чтобы измерить Величину вектора ошибок (EVM) получившихся сигналов.

% Only execute this test if an LTE Toolbox license is present.
if license('test','LTE_Toolbox')

    % Generate a LTE test signal with LTE Toolbox
    [ducIn, sigInfo] = DUCTestUtils.GenerateLTETestSignal();

    % Upconvert with a MATLAB Floating Point Model and modulate onto carrier
    ducTx = DUCTestUtils.UpConvert(ducIn,FsIn*64,Fc,ducFilterChain);
    release(ducFilterChain);

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

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

    % Upconvert using Simulink model
    simOut = sim(modelName);

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

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

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

    disp('LTE Error Vector Magnitude (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 Error Vector Magnitude (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. Место сообщения и результаты использования ресурса маршрута показывают в таблице. Проект соответствовал синхронизации с тактовой частотой 158 МГц.

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