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

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

Введение

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

Проект конвертера скорости дискретизации

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

Причины такого выбора фильтров заключаются в следующем:

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

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

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

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

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

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

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

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

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

Конвертер ставок Farrow

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

Определите ключевые параметры конвертера ставок Farrow. numTaps - количество отводов в каждой конечной импульсной характеристике с фиксированным коэффициентом структуры 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');

Децимирование конечная импульсная характеристика

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

FIRCoeffsDT = numerictype(1,16,15);

Halfband Decimator

Спроектируйте полуполосный фильтр, чтобы эффективно децимировать вход на 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');

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

Спроектируйте окончательный этап фильтрации конечной импульсной характеристики децимирования на 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-код может быть сгенерирован для подсистемы Sample Rate Converter.

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

Полудиапазон конечной импульсной характеристики реализован с помощью блока Discrete конечной импульсной характеристики Filter HDL Optimized и Блок MATLAB function для реализации десятикратного уменьшения на 2. Блок конечных импульсных характеристик использует транспонированную структуру фильтра, которая оптимизирует для симметрии и нулевых коэффициентов.

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

Преобразователь скорости Фэрроу содержит Банк Фильтров с фиксированным коэффициентом конечных импульсных характеристик, Контроллер Выборки для генерации синхронизации выхода и Цепи Суммы Продукта для вычисления конечных выборок выхода. Контроллер образцов использует validOut сигнал, чтобы сообщить цепи суммарного продукта, когда сгенерировать новую выходную выборку. Он также проходит новую фазу дискретизации как дробь, rho, где 0 < = rho < 1.

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

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

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

Цепь суммарных продуктов объединяет четыре выхода конечной импульсной характеристики с rho чтобы сгенерировать выходные выборки согласно структуре Farrow.

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

Валидация и верификация

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

  1. Функция resample MATLAB.

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

  3. Модель Simulink HDL конвертера ставок.

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

Сгенерируйте тестовый сигнал 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 Msps. Это обеспечивает хорошее качество ссылки для сравнения с конвертером скорости.

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 всегда ВЫСОКО, в то время как 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-теста для подсистемы Sample Rate Converter. Получившийся HDL-код был синтезирован на оценочной доске Xilinx ® Zynq ® -7000 ZC706. Результаты использования ресурсов по месту и маршруту показаны в таблице. Тайминг проекта встретил с тактовой частотой 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