В этом примере показано, как к преобразованию частоты дискретизации разработки и реализации для фронтэнда приемника LTE. Модель совместима с примерами готовых узлов приемника Wireless HDL Toolbox™ и поддерживает генерацию HDL-кода с HDL Coder™.
Поиск Ячейки HDL LTE, Восстановление MIB HDL LTE и примеры готовых узлов LTE HDL SIB1 Восстановления требуют входной частоты дискретизации 30.72 членов Шотландского парламента. На практике частота дискретизации, представленная оборудованию, может отличаться от этого, например, из-за выбора решений разработки системы или компонентов. Поэтому преобразование частоты дискретизации может потребоваться, чтобы интегрировать эти приложения готовых узлов в большую систему. Модель, показанная в этом примере, преобразует от 125 членов Шотландского парламента в 30.72 членов Шотландского парламента, использующих два КИХ-Децимирующих фильтра и Неоплодотворенный конвертер уровня. Изменение уровня от 125 членов Шотландского парламента 30.72 членам Шотландского парламента было сознательно выбрано, потому что это не тривиально, чтобы реализовать, все же представляет пример типа изменения уровня, часто требуемого в радиоприемнике.
Преобразование от 125 членов Шотландского парламента 30.72 членам Шотландского парламента соответствует фактору изменения уровня 0,24576. Это реализовано с показанной цепью фильтра. Во-первых, входной сигнал подкошен два (i.e. изменение уровня 1/2) использование полуленточного фильтра. Затем Неоплодотворенный конвертер уровня используется, чтобы внести точную корректировку в частоту дискретизации на коэффициент 1565/1592 = 0.983. Наконец, КИХ-фильтр десятикратного уменьшения реализует финал decimate-two этап.
Причины позади этого выбора фильтров следующие:
Первый этап фильтра может быть сделан эффективно с полуленточным фильтром. Последующий фильтр затем имеет два цикла в наличии на входную выборку, чтобы реализовать разделение ресурсов.
Неоплодотворенный конвертер уровня был выбран, чтобы реализовать этап точной настройки из-за разрешения изменения высокого показателя, достижимого с этим подходом. Это приводит к гибкому проекту, который может быть с готовностью изменен, чтобы реализовать другие изменения уровня.
Неоплодотворенные конвертеры уровня являются дорогими в терминах множителей. Этот блок занял второе место в цепи фильтра, когда эта опция привела к наименьшему количеству использования ресурса, все еще соответствие спецификация. Если фильтр был первым в цепи, ширина ее полосы перехода, возможно, была ослаблена, ведя к более короткому фильтру, однако никакое разделение ресурсов не будет возможно. Если бы фильтр был последним в цепи, он потребовал бы более узкого продвижения полосы перехода к более длинному фильтру, однако больше разделения ресурсов будет возможно.
Это затем следует за этим, последняя стадия является КИХ-фильтром десятикратного уменьшения, который может использовать разделение ресурсов на коэффициент два.
В этом примере тактовая частота составляет 125 МГц, и входная частота дискретизации является 125 членами Шотландского парламента, поэтому никакое разделение ресурсов не реализовано на первом этапе фильтра. Этапы два и три имеют минимум двух циклов на доступную выборку, поэтому разделение ресурсов на коэффициент два реализовано в частях Неоплодотворенного Конвертера Уровня, и на итоговом КИХ-этапе децимации. Это приблизительно половины количество множителей, требуемых реализовывать эти этапы по сравнению с полностью параллельной реализацией.
Все этапы фильтра имеют допустимые сигналы ввода и вывода. Эти сигналы используются, чтобы представлять различные частоты дискретизации в цепи фильтра. Для конвертера уровня Фэрроу важно иметь допустимый выходной сигнал, потому что это реализует изменение уровня нецелого числа. Однако обеспечение допустимого входного сигнала в первой стадии означает, что не необходимо передать новые данные в конвертер частоты дискретизации на каждом цикле. Это релевантно в сценариях, где аппаратная тактовая частота больше входной частоты дискретизации.
Сконфигурируйте параметры верхнего уровня конвертера частоты дискретизации. FsADC
входной уровень, в то время как FsLTERx
норма выработки; то есть, вход к приемнику LTE. Fpass
частота среза полосы пропускания и собирается в 10 МГц вместить максимальную возможную пропускную способность LTE 20 МГц. Fstop
установлен в уровень Найквиста, однако может быть настроен, если больше внеполосного отклонения сигнала требуется. Ast
затухание в полосе задерживания в dBs и Ap
желаемая сумма неравномерности в полосе пропускания.
FsADC = 125e6; FsLTERx = 30.72e6; Fpass = 10e6; Fstop = FsLTERx/2; Ast = 60; Ap = 0.1;
Конвертер уровня Фэрроу состоит из с помощью (i) дробного фильтра задержки, реализованного с помощью структуры Фэрроу и (ii) управляющей логики, чтобы определить, когда сгенерировать выходные выборки, и с который выборка фазы. В этом примере Фэрроу дробный фильтр задержки аппроксимирует импульсную характеристику пользовательского прототипного фильтра с помощью набора 3-х полиномов порядка. Прототипный фильтр спроектирован, беря пропускную способность сигнала и выходную частоту дискретизации во внимание, позволив длине фильтра быть минимизированным при предотвращении искажающий в сигнале интереса. Структура фильтра Фэрроу эквивалентна, который использовал в dsp.VariableIntegerDelay
(DSP System Toolbox) и dsp.FarrowRateConverter
(DSP System Toolbox) Системные объекты. Обратите внимание на то, что Системные объекты не использовались здесь, когда они не поддерживают генерацию HDL-кода от Simulink.
Задайте основные параметры конвертера уровня Фэрроу. numTaps
количество касаний в каждом КИХ фиксированного коэффициента неоплодотворенной структуры. Это - также количество полиномов, используемых в приближении. 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);
Полуполоса 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');
Итоговый КИХ Decimator
Спроектируйте финал decimate-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');
Откройте модель и обновите схему. Верхний уровень модели показывают. 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');
Полуполоса FIR реализована с помощью блока Discrete FIR Filter HDL Optimized и блока MATLAB function, чтобы реализовать децимацию 2. Блок FIR использует транспонированную структуру фильтра, которая оптимизирует для симметрии и нулевых коэффициентов.
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');
Подсистема Набора фильтров реализована с четырьмя Дискретными КИХ-HDL Фильтра Оптимизированные блоки. Каждый блок сконфигурирован, чтобы совместно использовать ресурсы согласно Min cycles between valid input samples
параметр Неоплодотворенной подсистемы Конвертера Судьбы, которая установлена в 2 в этом случае. Задержка ЕЛЕЙ может отличаться друг от друга из-за симметрии и обнулить содействующую оптимизацию, поэтому каждый фильтр также имеет связанную задержку matcher (задержка) блок, чтобы компенсировать любые различия. Дополнительная задержка должна была компенсировать задержку каждого фильтра, вычисляется getSubFilterMatchingLatencies
функция. getSubFilterMatchingLatencies
назван во время инициализации модели и присвоен переменной под названием matchLatencies
. Чтобы видеть это, отредактируйте Неоплодотворенную маску подсистемы Конвертера Уровня и перейдите к вкладке Initialization. В этом примере все фильтры имеют равную задержку, поэтому вся задержка matcher имеет задержку нуля. Если Неоплодотворенные коэффициенты изменяются через маску блока, КИХ-задержки могут измениться и 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) затем выполняется, подтверждая, что resampler подходит для использования в приемнике LTE. Для ссылки три различных метода используются, чтобы передискретизировать сигнал 30.72 членам Шотландского парламента и их сравненным результатам EVM. Эти три метода:
MATLAB передискретизирует функцию.
Модель MATLAB конвертера уровня.
Модель Simulink HDL конвертера уровня.
Кроме того, чтобы подтвердить правильную операцию реализации 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
функция, чтобы передискретизировать полученный сигнал от уровня ADC до 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);
Передайте сигнал через фиксированную точку модель реализации HDL Simulink.
stopTime = (length(dataIn)+1000)/FsADC; simOut = sim(modelName); fiResamplerOut = simOut.dataOut(simOut.validOut); fiResamplerOut = fiResamplerOut(1:length(floatResamplerOut));
Постройте validIn
и validOut
показать изменение общего уровня конвертера частоты дискретизации. validIn
всегда HIGH, тогда как validOut
HIGH приблизительно четверть (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.0439 % floating point SRC Peak EVM: 0.158 % fixed point HDL SRC RMS EVM: 0.0515 % fixed point HDL SRC Peak EVM: 0.176 %
Подтвердите, что качество сигнала высоко путем графического вывода компенсируемых экспериментальных символов от измерения EVM реализации HDL. Обратите внимание на то, что почти никакое размывание точек созвездия не отображается.
srcPlots.scatterPlot = scatterplot(fiEqSymbols);
SRCTestUtils.setPlotNameAndTitle('Equalized Cell RS');
Чтобы сгенерировать HDL-код для этого примера, у вас должна быть лицензия HDL Coder™. Используйте makehdl
и makehdltb
команды, чтобы сгенерировать HDL-код и испытательный стенд HDL для подсистемы Конвертера Частоты дискретизации. Получившийся 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