exponenta event banner

Преобразование частоты дискретизации для приемника LTE

В этом примере показано, как проектировать и внедрять преобразование частоты дискретизации для фронтэнда приемника LTE. Модель совместима с эталонными приложениями беспроводного HDL Toolbox™ приемника и поддерживает генерацию кода HDL с HDL Coder™.

Введение

Для эталонных приложений LTE HDL Cell Search, LTE HDL MIB Recovery и LTE HDL SIB1 Recovery требуется входная частота дискретизации 30,72 мс. На практике частота дискретизации, представляемая аппаратным средствам, может отличаться от этой, например, из-за выбора компонентов или решений о конструкции системы. Следовательно, преобразование частоты дискретизации может потребоваться для интеграции этих эталонных приложений в более крупную систему. Модель, показанная в этом примере, преобразует от 125 до 30,72 мс с помощью двух фильтров децимации FIR и преобразователя скорости Farrow. Изменение скорости от 125 мс до 30,72 мс было намеренно выбрано, потому что это не является тривиальным для реализации, но представляет собой пример типа изменения скорости, часто требуемого в радиоприемнике.

Обзор конструкции преобразователя частоты дискретизации

Преобразование 125 мс в 30,72 мс соответствует коэффициенту изменения скорости, равному 0,24576. Это реализовано с показанной цепочкой фильтров. Во-первых, входной сигнал прореживается на два (то есть изменение скорости 1/2) с использованием полуполосного фильтра. Затем используется преобразователь скорости Фэрроу для точной регулировки частоты дискретизации с коэффициентом 1565/1592 = 0,983. Наконец, децимирующий фильтр FIR реализует заключительный этап прореживания на два.

Этот выбор фильтров объясняется следующими причинами:

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

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

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

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

В этом примере тактовая частота составляет 125 МГц, а входная частота дискретизации - 125 мс, поэтому совместное использование ресурсов на первом этапе фильтрации не осуществляется. Этапы 2 и 3 имеют минимум два цикла на выборку, поэтому совместное использование ресурсов в два раза реализуется в частях преобразователя скорости Farrow и на заключительной стадии децимации FIR. Это приблизительно вдвое уменьшает количество множителей, необходимых для реализации этих этапов, по сравнению с полностью параллельной реализацией.

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

Параметры верхнего уровня

Сконфигурируйте параметры верхнего уровня преобразователя частоты дискретизации. FsADC - входная скорость, в то время как FsLTERx - выходная скорость; то есть вход в приемник LTE. Fpass является частотой отсечки полосы пропускания и устанавливается в 10 МГц для обеспечения максимально возможной полосы пропускания LTE 20 МГц. Fstop устанавливается на скорость Найквиста, однако может регулироваться, если требуется большее отклонение внеполосного сигнала. Ast - затухание полосы останова в дБ, и Ap - желаемое количество пульсации полосы пропускания.

FsADC   = 125e6;
FsLTERx = 30.72e6;
Fpass   = 10e6;
Fstop   = FsLTERx/2;
Ast     = 60;
Ap      = 0.1;

Преобразователь скорости Farrow

Преобразователь скорости Фэрроу состоит из (i) фильтра дробной задержки, реализованного с использованием структуры Фэрроу, и (ii) управляющей логики для определения, когда генерировать выходные выборки, и с какой фазой дискретизации. В этом примере фильтр дробной задержки Фэрроу аппроксимирует импульсную характеристику пользовательского фильтра прототипа, используя набор многочленов 3-го порядка. Прототип фильтра разработан с учетом полосы пропускания сигнала и частоты дискретизации на выходе, что позволяет минимизировать длину фильтра, избегая при этом наложения в интересующем сигнале. Структура фильтра Фэрроу аналогична используемой в dsp.VariableIntegerDelay(Панель системных инструментов DSP) и dsp.FarrowRateConverter(Панель системных инструментов DSP) Системные объекты. Обратите внимание, что системные объекты не использовались здесь, поскольку они не поддерживают создание кода HDL от Simulink.

Определите ключевые параметры преобразователя скорости Farrow. numTaps - количество отводов в каждом фиксированном коэффициенте FIR структуры Farrow. Это также число многочленов, используемых в приближении. FsIn и FsOut - входная и выходная скорости соответственно. Fsig - полоса пропускания представляющего интерес сигнала. Фильтр предназначен для предотвращения наложения псевдонимов в пределах этой области. sps - количество выборок на секцию (также известное как коэффициент избыточной выборки), используемое при проектировании фильтра прототипа.

farrow.numTaps = 6;
farrow.FsIn    = FsADC/2;
farrow.FsOut   = 2*FsLTERx;
farrow.Fsig    = Fpass;
farrow.sps     = 16;

Создайте прототип фильтра и аппроксимируйте его набором многочленов. Класс помощника под названием FarrowDesignUtils содержит набор методов, используемых для проектирования и анализа фильтра дробной задержки. Эти способы подробно не обсуждаются. Дополнительные сведения см. в исходном коде.

farrow.prototype   = FarrowDesignUtils.designFilterPrototype(farrow);
farrow.polynomials = FarrowDesignUtils.generatePolynomialCoefficients(farrow);

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

[protoInterp,ta] = FarrowDesignUtils.evaluateApproximation(farrow.polynomials,100);

srcPlots.FarrowIR = figure;
tp = ((0:length(farrow.prototype)-1) - floor(length(farrow.prototype)/2))/farrow.sps;
stem(tp,farrow.prototype,'.'); hold on;
plot(ta,protoInterp);

SRCTestUtils.setPlotNameAndTitle('Farrow Impulse Response');
ylabel('p[k]');
xlabel('Discrete time index, k');
legend('Prototype filter','Piece-wise polynomial approximation');

Сравните аппроксимацию с фильтром прототипа в частотной области. Реконструкция выполняется с 16 выборками на секцию, чтобы соответствовать частоте выборки прототипа фильтра и облегчить сравнение. График также выделяет спектральные компоненты, которые будут наложены поверх интересующего сигнала, как только он будет преобразован в выходную скорость. Это показывает, что никакого значительного наложения не произойдет.

protoApprox = FarrowDesignUtils.evaluateApproximation(farrow.polynomials,farrow.sps);

srcPlots.FarrowFreq = figure; clf;

Fsover = farrow.sps  * farrow.FsIn;
Nfft   = 2048;
f      = Fsover*(-Nfft/2:Nfft/2-1)/Nfft;
plot(f/1e6,20*log10(abs(fftshift(fft(farrow.prototype/farrow.sps,Nfft)))),'g'); hold on;
plot(f/1e6,20*log10(abs(fftshift(fft(protoApprox/farrow.sps,Nfft)))),'b');
ax = axis;
axis([ax(1) ax(2) -80 30]);
FarrowDesignUtils.plotSignalImages(farrow.FsOut);

SRCTestUtils.setPlotNameAndTitle('Farrow Frequency Response');
xlabel('Frequency [MHz]');
ylabel('Magnitude [dB]');
legend('Prototype filter','Approximation','Spectral images at FsOut');

Децимирующие фильтры FIR

Проектирование первой и последней ступеней КИХ-фильтра. Оба фильтра используют 16-битные коэффициенты. Для удобства определяется тип данных коэффициентов.

FIRCoeffsDT = numerictype(1,16,15);

Полуполосный прореживатель

Создайте полуполосный фильтр для эффективного прореживания входного сигнала на 2.

hbParams.FsIn                = FsADC;
hbParams.FsOut               = FsADC/2;
hbParams.TransitionWidth     = hbParams.FsOut - 2*Fpass;
hbParams.StopbandAttenuation = Ast + 10;

hbSpec = fdesign.decimator(2,'halfband',...
    'Tw,Ast',...
    hbParams.TransitionWidth, ...
    hbParams.StopbandAttenuation,...
    hbParams.FsIn);

halfband = design(hbSpec,'SystemObject',true);

halfband.FullPrecisionOverride = false;
halfband.CoefficientsDataType  = 'Custom';
halfband.CustomCoefficientsDataType = numerictype([],...
    FIRCoeffsDT.WordLength,FIRCoeffsDT.FractionLength);

Постройте график частотной характеристики фильтра, включая квантованную характеристику.

srcPlots.halfband = fvtool(halfband,'arithmetic','fixed');
SRCTestUtils.setPlotNameAndTitle('Halfband FIR');
legend('Quantized filter','Reference filter','Design constraints');

Конечный дециматор FIR

Спроектировать заключительную ступень децимации на 2 КИХ.

finalSpec = fdesign.decimator(2,'lowpass',...
    'Fp,Fst,Ap,Ast',Fpass,Fstop,Ap,Ast,farrow.FsOut);

finalFilt = design(finalSpec,'equiripple','SystemObject',true);

finalFilt.FullPrecisionOverride = false;
finalFilt.CoefficientsDataType  = 'Custom';
finalFilt.CustomCoefficientsDataType = numerictype([],...
    FIRCoeffsDT.WordLength,FIRCoeffsDT.FractionLength);

Постройте график частотной характеристики фильтра, включая квантованную характеристику.

srcPlots.finalFilt = fvtool(finalFilt,'arithmetic','fixed');
SRCTestUtils.setPlotNameAndTitle('Final Decimating FIR');
legend('Quantized filter','Reference filter','Design constraints');

Внедрение Simulink HDL

Откройте модель и обновите схему. Отображается верхний уровень модели. Код HDL может быть сгенерирован для подсистемы преобразователя скорости выборки.

stopTime  = 0;
dataIn    = 0;
validIn   = false;
modelName = 'SampleRateConversionHDL';
open_system(modelName);
set_param(modelName,'SimulationCommand','Update');
set_param(modelName, 'Open','on');

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

set_param([modelName '/Sample Rate Converter'],'Open','on');

Полуполосный КИХ реализуется с использованием блока оптимизации HDL дискретного КИХ-фильтра и функционального блока MATLAB для реализации прореживания на 2. Блок КИХ использует транспонированную структуру фильтра, которая оптимизирует коэффициенты симметрии и нуля.

set_param([modelName '/Sample Rate Converter/Halfband Filter'],'Open','on');

Преобразователь скорости Farrow содержит блок фильтров с фиксированным коэффициентом FIR, контроллер выборок для генерирования выходной синхронизации и цепочку суммарных продуктов для вычисления конечных выходных выборок. Контроллер-образец использует validOut сигнал для указания суммарной цепочки продуктов, когда необходимо сгенерировать новую выходную выборку. Он также проходит новую фазу отбора проб в виде фракции, rho, где 0 < =rho < 1.

set_param([modelName '/Sample Rate Converter/Farrow Rate Converter'],'Open','on');

Подсистема банка фильтров реализована с четырьмя блоками HDL-оптимизированного дискретного фильтра FIR. Каждый блок сконфигурирован для совместного использования ресурсов в соответствии с Min cycles between valid input samples параметр подсистемы Farrow Fate Converter, который в данном случае имеет значение 2. Задержка FIR может отличаться друг от друга из-за симметрии и оптимизации нулевого коэффициента, поэтому каждый фильтр также имеет связанный блок согласования задержки (задержки) для компенсации любых разностей. Дополнительная задержка, необходимая для компенсации задержки каждого фильтра, вычисляется посредством getSubFilterMatchingLatencies функция. getSubFilterMatchingLatencies вызывается во время инициализации модели и назначается переменной с именем matchLatencies. Чтобы увидеть это, отредактируйте маску подсистемы преобразователя скорости Farrow и перейдите на вкладку Initialization. В этом примере все фильтры имеют одинаковую задержку, поэтому все устройства согласования задержки имеют нулевую задержку. Если коэффициенты Farrow изменяются через блочную маску, задержки FIR могут изменяться, и latency matcher блоки автоматически компенсируют любые различия. Наконец, все четыре выхода фильтра выводятся в векторе.

set_param([modelName '/Sample Rate Converter/Farrow Rate Converter/Filter Bank'],'Open','on');

Суммарная производственная цепочка объединяет четыре вывода FIR с rho для генерации выходных выборок в соответствии со структурой Фэрроу.

set_param([modelName '/Sample Rate Converter/Farrow Rate Converter/Sum Product Chain'],'Open','on');

Проверка и проверка

Тестовый сигнал LTE генерируется на 125 мс и проходит через преобразователь скорости. Затем выполняется измерение величины вектора ошибки (EVM), подтверждающее, что блок повторной дискретизации пригоден для использования в приемнике LTE. Для сравнения используются три различных метода для повторной выборки сигнала до 30,72 мс и сравнения их результатов EVM. Тремя методами являются:

  1. Функция повторной выборки MATLAB.

  2. Модель MATLAB преобразователя скорости.

  3. Модель Simulink HDL преобразователя скорости.

Кроме того, для подтверждения правильной работы реализации ЛПВП вычисляется среднеквадратическая ошибка между выходами моделей преобразователя скорости MATLAB и Simulink.

Генерация тестового сигнала LTE 20 МГц, дискретизированного на скорости 125 мс.

rng(0);
enb              = lteRMCDL('R.9');
enb.TotSubframes = 2;
[tx, ~, sigInfo] = lteRMCDLTool(enb,randi([0 1],1000,1));
dataIn = resample(tx,FsADC,sigInfo.SamplingRate);
dataIn  = 0.95 * dataIn / max(abs(dataIn));
validIn = true(size(dataIn));

Используйте resample функция для повторной выборки принятого сигнала со скорости передачи АЦП на 30,72 мс. Это обеспечивает хороший эталон качества для сравнения с преобразователем скорости.

resampleOut = resample(dataIn,FsLTERx,FsADC);

Пропустите сигнал через модель MATLAB преобразователя скорости.

halfbandOut       = halfband(dataIn);
farrowOut         = FarrowDesignUtils.convertSampleRate(farrow,halfbandOut);
farrowOut         = farrowOut(1:length(farrowOut)-mod(length(farrowOut),2));
floatResamplerOut = finalFilt(farrowOut);

Передача сигнала через модель реализации Simulink HDL с фиксированной точкой.

stopTime       = (length(dataIn)+1000)/FsADC;
simOut         = sim(modelName);
fiResamplerOut = simOut.dataOut(simOut.validOut);
fiResamplerOut = fiResamplerOut(1:length(floatResamplerOut));

График validIn и validOut для отображения общего изменения скорости преобразователя частоты дискретизации. validIn всегда HIGH, тогда как validOut ВЫСОКАЯ примерно четверть (0,24576%) времени.

srcPlots.validSignals = figure;
Ns = 300;
validInSlice = validIn(1:Ns);
validOutSlice = simOut.validOut(1:Ns);
subplot(2,1,1);
plot((0:Ns-1)/FsADC,validInSlice);
axis([0 (Ns-1)/FsADC -0.1 1.2]);
ylabel('validIn');
xlabel('time');
subplot(2,1,2);
plot((0:Ns-1)/FsADC,validOutSlice);
axis([0 (Ns-1)/FsADC -0.1 1.2]);
ylabel('validOut');
xlabel('time');

Вычислите среднеквадратическую ошибку между выходами моделей MATLAB и Simulink преобразователя скорости

e = floatResamplerOut-fiResamplerOut;
rootMeanSquareError = sqrt((e' * e)/length(e));
disp(['Root-mean-square error: ' num2str(rootMeanSquareError)]);
Root-mean-square error: 9.4529e-05

Измерьте EVM всех трех методов повторной выборки.

results.resampleEVM                    = SRCTestUtils.MeasureEVM(sigInfo,resampleOut,FsLTERx);
results.floatPointSRCEVM               = SRCTestUtils.MeasureEVM(sigInfo,floatResamplerOut,FsLTERx);
[results.fixedPointSRCEVM,fiEqSymbols] = SRCTestUtils.MeasureEVM(sigInfo,fiResamplerOut,FsLTERx);

disp('LTE Error Vector Magnitude (EVM) Measurements');
disp(['     resample function RMS EVM: '  num2str(results.resampleEVM.RMS*100,3) ' %']);
disp(['    resample function Peak EVM: ' num2str(results.resampleEVM.Peak*100,3) ' %']);
disp(['    floating point SRC RMS EVM: '  num2str(results.floatPointSRCEVM.RMS*100,3) ' %']);
disp(['   floating point SRC Peak EVM: ' num2str(results.floatPointSRCEVM.Peak*100,3) ' %']);
disp(['   fixed point HDL SRC RMS EVM: '  num2str(results.fixedPointSRCEVM.RMS*100,3) ' %']);
disp(['  fixed point HDL SRC Peak EVM: ' num2str(results.fixedPointSRCEVM.Peak*100,3) ' %']);
LTE Error Vector Magnitude (EVM) Measurements
     resample function RMS EVM: 0.0138 %
    resample function Peak EVM: 0.0248 %
    floating point SRC RMS EVM: 0.0403 %
   floating point SRC Peak EVM: 0.11 %
   fixed point HDL SRC RMS EVM: 0.0486 %
  fixed point HDL SRC Peak EVM: 0.144 %

Убедитесь, что качество сигнала высокое, построив график выровненных пилот-символов из измерения EVM реализации HDL. Заметим, что почти не видно размытия точек созвездия.

srcPlots.scatterPlot = scatterplot(fiEqSymbols);
SRCTestUtils.setPlotNameAndTitle('Equalized Cell RS');

Создание кодов HDL и внедрение FPGA

Для создания кода HDL в этом примере необходимо иметь лицензию HDL Coder™. Используйте makehdl и makehdltb команды для генерации кода HDL и средства тестирования HDL для подсистемы преобразователя скорости выборки. Полученный код HDL синтезировали на оценочной плате Xilinx ® Zynq ® -7000 ZC706. Результаты использования ресурсов post place и route показаны в таблице. Конструкция отвечала таймингу с тактовой частотой 200 МГц.

disp(table(...
    categorical({'LUT'; 'LUTRAM'; 'FF'; 'BRAM'; 'DSP'}),...
    categorical({'1553'; '46'; '5629'; '0'; '60'}),...
    'VariableNames',{'Resource','Usage'}));
    Resource    Usage
    ________    _____

     LUT        1553 
     LUTRAM     46   
     FF         5629 
     BRAM       0    
     DSP        60