Этот пример показывает, как несколько несущих нисходящей линии связи могут быть сгенерированы, агрегированы и дополнительно демодулированы с использованием LTE Toolbox™.
Этот пример моделирует сигнал LTE Release 12 с агрегированием несущей (CA). Количество поднесущих и их пропускная способность могут быть заданы как параметр. Рассматривается внутриполосный смежный случай CA.
Чтобы сгенерировать агрегированный сигнал нисходящей линии связи, eNodeB сконфигурирован для каждой несущей компонента. Параметры несущей компонента вычисляются и используются, чтобы сгенерировать модулированную форму волны для каждого строения eNodeB. Все модулированные CC формы волны повторно дискретизированы с общей частотой дискретизации, поэтому они могут быть объединены, чтобы создать агрегированную форму волны.
Векторное NDLRB
определяет количество ресурсных блоков (RB) для каждой несущей компонента (CC). Длина этого вектора соответствует количеству CCs. Элементы NDLRB
должен находиться в наборе {6, 15, 25, 50, 75, 100} RB. В таблице 5.6A.1-1 [1] TS 36.101 перечислены допустимые комбинации полос пропускания для агрегирования несущей.
% Configure the set of NDLRB values to describe the carriers to be % aggregated NDLRB = [50 75 100]; % Establish the number of component carriers numCC = numel(NDLRB); if numCC<2 error('Please specify more than one CC bandwidth value.'); end
Структура строения генерируется для каждого CC, используя lteRMCDL
. Структуры строения для всех CC хранятся в массиве ячеек.
% Configure the number of subframes to generate numSubframes = 10; % CC configuration enb = cell(1,numCC); for i = 1:numCC switch NDLRB(i) case 6 enb{i} = lteRMCDL('R.4'); case 15 enb{i} = lteRMCDL('R.5'); case 25 enb{i} = lteRMCDL('R.6'); case 50 enb{i} = lteRMCDL('R.7'); case 75 enb{i} = lteRMCDL('R.8'); case 100 enb{i} = lteRMCDL('R.9'); otherwise fprintf('Not a valid number of resource blocks: %d\n',... NDLRB(i)); return end enb{i}.NDLRB = NDLRB(i); enb{i}.Bandwidth = hNRBToBandwidth(NDLRB(i)); enb{i}.TotSubframes = numSubframes; enb{i}.PDSCH.PRBSet = (0:enb{i}.NDLRB-1).'; enb{i}.PDSCH.RVSeq = 0; enb{i}.NCellID = 10; end
Блок оценки канала на конце приемника параметризован с помощью структуры cec
определено ниже.
cec = struct; % Channel estimation config structure cec.PilotAverage = 'UserDefined'; % Type of pilot symbol averaging cec.FreqWindow = 15; % Frequency window size cec.TimeWindow = 15; % Time window size cec.InterpType = 'Cubic'; % 2D interpolation type cec.InterpWindow = 'Centered'; % Interpolation window type cec.InterpWinSize = 1; % Interpolation window size
Для выполнения агрегации несущих вычисляются частотные параметры, описанные в TS 36.101, разделах 5.6 и 5.7 [1]. Эти параметры суммированы на следующем рисунке.
Это приводит к трем переменным:
F_c
- вектор, содержащий центральную частоту каждого CC
ccSpacing
содержит интервал между CC в МГц
BW_channel_CA
- агрегированная пропускная способность канала всех CC
В коде ниже мы сначала вычисляем значение для всех CCs, предполагая, что нижний из них центрирован в полосе частот (0 Гц). Один раз в BW_channel_CA
вычисляется, что все значения сдвинуты, поэтому центр агрегированной полосы пропускания расположен в полосе частот базовых частот (0 Гц).
% Define Delta_f1 parameter in MHz for nominal guard band and frequency % offset calculations. In the downlink Delta_f1 is the subcarrier spacing % (TS 36.101, Table 5.6A-1) Delta_f1 = 0.015; % in MHz, LTE subcarrier spacing in MHz maxBW = hNRBToBandwidth(max(NDLRB)); F_c = zeros(1,numCC); ccSpacing = zeros(1,numCC-1); % CC spacing % Calculate nominal guard band, TS 36.101 5.6A-1 nominalGuardBand = 0.05*maxBW-0.5*Delta_f1; % Initially assume lower carrier frequency is at baseband F_c(1) = 0; % Calculate CC spacing and carrier values for k = 2:numCC ccSpacing(k-1) = hCarrierAggregationChannelSpacing( ... enb{k-1}.Bandwidth, enb{k}.Bandwidth); F_c(k) = F_c(k-1) + ccSpacing(k-1); end % Calculate lower and higher frequency offsets, TS 36.101 5.6A F_offset_low = (0.18*NDLRB(1)+Delta_f1)/2 + nominalGuardBand; F_offset_high = (0.18*NDLRB(end)+Delta_f1)/2 + nominalGuardBand; % Calculate lower and higher frequency edges, TS 36.101 5.6A F_edge_low = F_c(1) - F_offset_low; F_edge_high = F_c(end) + F_offset_high; % Calculate aggregated channel bandwidth, TS 36.101 5.6A BW_channel_CA = F_edge_high - F_edge_low; fprintf('BW_channel_CA: %0.4f MHz\n',BW_channel_CA); % Calculate shift to center baseband shiftToCenter = -1*(BW_channel_CA/2 + F_edge_low); % Aggregated bandwidth centered at baseband F_c = F_c + shiftToCenter; F_edge_low = F_c(1) - F_offset_low; F_edge_high = F_c(end) + F_offset_high; % Display frequency band edges fprintf('F_edge_low: %0.4f MHz\n',F_edge_low); fprintf('F_edge_high: %0.4f MHz\n',F_edge_high); fprintf('F_offset_low: %0.4f MHz\n',F_offset_low); fprintf('F_offset_high: %0.4f MHz\n',F_offset_high); % Display carrier frequencies fprintf('\n'); for i = 1:numCC fprintf('Component Carrier %d:\n',i); fprintf(' Fc: %0.4f MHz\n', F_c(i)); end
BW_channel_CA: 44.6000 MHz F_edge_low: -22.3000 MHz F_edge_high: 22.3000 MHz F_offset_low: 5.5000 MHz F_offset_high: 10.0000 MHz Component Carrier 1: Fc: -16.8000 MHz Component Carrier 2: Fc: -4.8000 MHz Component Carrier 3: Fc: 12.3000 MHz
Необходимые коэффициенты избыточной дискретизации для каждой несущей OSRs
вычисляются для общей частоты дискретизации для агрегированного сигнала.
% Bandwidth utilization of 85% bwfraction = 0.85; % Calculate sampling rates of the component carriers CCSR = zeros(1,numCC); for i = 1:numCC info = lteOFDMInfo(enb{i}); CCSR(i) = info.SamplingRate; end % Calculate overall sampling rate for the aggregated signal % Calculate the oversampling ratio (for the largest BW CC) to make sure the % signal occupies 85% (bwfraction) of the total bandwidth OSR = (BW_channel_CA/bwfraction)/(max(CCSR)/1e6); % To simplify the resampling operation choose an oversampling ratio which % is a power of 2: calculate the next power of two above OSR OSR = 2^ceil(log2(OSR)); SR = OSR*max(CCSR); fprintf('\nOutput sample rate: %0.4f Ms/s\n\n',SR/1e6); % Calculate individual oversampling factors for the component carriers OSRs = SR./CCSR;
Output sample rate: 61.4400 Ms/s
lteRMCDLTool
используется для генерации формы волны для каждого CC. Каждый из них повторно дискретизируется с общей частотой дискретизации, частота модулируется с соответствующей центральной частотой и, наконец, складывается вместе, чтобы сформировать совокупный сигнал.
% Generate component carriers tx = cell(1,numCC); for i = 1:numCC tx{i} = lteRMCDLTool(enb{i},randi([0 1],1000,1)); tx{i} = resample(tx{i},OSRs(i),1)/OSRs(i); tx{i} = hCarrierAggregationModulate(tx{i},SR,F_c(i)*1e6); end % Superpose the component carriers waveform = tx{1}; for i = 2:numCC waveform = waveform + tx{i}; end
Спектр степени агрегированного сигнала несущей отображается с помощью hCarrierAggregationPlotSpectrum.m. В спектре видны отдельные полосы пропускания несущей. Обратите внимание, что центр агрегированной полосы пропускания расположен в полосе модулирующих сигналов (0 Гц), т.е. в этом примере сигнал не модулируется в RF.
specPlot = hCarrierAggregationPlotSpectrum(waveform,SR,... 'Power Spectrum of Carrier Aggregation',{'Signal spectrum'});
В этом разделе выполняется демодуляция, фильтрация и понижение дискретизации одного из CC. Следующие шаги:
Демодулируйте интересующий CC и доведите его до основной полосы (0 Гц).
Отфильтровывайте соседние CC и downsample. Подходящий фильтр предназначен для удаления нежелательных соседних СС в процессе понижающей дискретизации. Создание фильтра окажет влияние на качество и EVM восстановленного сигнала. Для демодуляции фильтров может потребоваться изменение различных значений полосы пропускания и CC.
Начнем с выбора CC для демодуляции и разработки соответствующего фильтра понижающей дискретизации. Вычисляют частоты полосы пропускания и полосы упора.
% Select CC to demodulate CCofInterest = 1; if CCofInterest > numCC || CCofInterest <= 0 error('Cannot demodulate CC number %d, there are %d CCs\n',... CCofInterest, numCC) ; end % Define downsampling filter order filterOrder = 201; % Precalculate passband and stopband values for all CC firPassbandVec = (0.18*NDLRB+Delta_f1)/2 / (SR/1e6/2); firStopbandVec = hCarrierAggregationStopband(ccSpacing,NDLRB,SR); % Define passband and stopband for carrier of interest firPassband = firPassbandVec(CCofInterest); firStopband = firStopbandVec(CCofInterest); % Extract and decode CC of interest fprintf(1,'Extracting CC number %d: \n', CCofInterest); % Pad signal with zeros to take into account filter transient response % length waveform = [waveform; zeros(filterOrder+1,size(waveform,2))]; % Demodulate carrier of interest demodulatedCC = ... hCarrierAggregationModulate(waveform,SR,-F_c(CCofInterest)*1e6); % Downsampling is done in two stages if the filter is too narrow. This % eases the filter design requirements. If this is the case an initial % downsampling factor of 4 is applied. You may want to consider a different % filter design in this initial stage if the quality of the resulting % signal is not acceptable. if (firStopband < 0.1) % Down-sample by 4 SRC = 4; demodulatedCC = resample(demodulatedCC,1,SRC); % Update pass and stopband to take first downsampling into account firPassband = firPassband * SRC; firStopband = firStopband * SRC; else % No pre-filter SRC = 1; end % Design lowpass filter to filter out CC of interest frEdges = [0 firPassband firStopband 1]; firFilter = dsp.FIRFilter; firFilter.Numerator = firpm(filterOrder,frEdges,[1 1 0 0]);
Extracting CC number 1:
Отображается ответ проектируемого фильтра.
fvtool(firFilter,'Analysis','freq');
Демодулированную форму волны затем фильтруют, чтобы извлечь интересующий CC. Строят график спектра демодулированной формы волны до и после фильтрации.
% Filter the signal to extract the component of interest rxWaveform = firFilter(demodulatedCC); % Plot the demodulated and filtered signal spectra filteredSpecPlot = ... hCarrierAggregationPlotSpectrum([demodulatedCC, rxWaveform],SR,... 'Demodulated and Filtered Waveform Power Spectrum',... {'Carrier aggregated signal' 'Filtered signal'});
На данной точке отфильтрованная форма волны может быть понижена до своей скорости основной полосы частот.
rxWaveform = downsample(rxWaveform,OSRs(CCofInterest)/SRC);
Синхронизация применяется к полученному сигналу.
% Parameters for CC of interest eNodeB = enb{CCofInterest}; PDSCH = eNodeB.PDSCH; % Synchronize received waveform offset = lteDLFrameOffset(eNodeB, rxWaveform); rxWaveform = rxWaveform(1+offset:end, :);
Приведенный ниже код обеспечивает каждый подрамник и средние измерения EVM. Также отображаются графики с EVM от времени, ресурсного блока и поднесущих.
PDSCH восстановленного сигнала декодируется, и полученный CRC проверяется на наличие ошибок.
% channel estimation structure for EVM measurement cecEVM = cec; cecEVM.PilotAverage = 'TestEVM'; [evmmeas, plots] = hPDSCHEVM(enb{CCofInterest},cecEVM,rxWaveform); % OFDM demodulation rxGrid = lteOFDMDemodulate(eNodeB,rxWaveform); % Get the number of received subframes and OFDM symbols per subframe dims = lteOFDMInfo(eNodeB); samplesPerSubframe = dims.SamplingRate/1000; nRxSubframes = floor(size(rxWaveform, 1)/samplesPerSubframe); eNodeB.TotSubframes = 1; resGridSize = lteResourceGridSize(eNodeB); L = resGridSize(2); disp('Decode transmitted subframes and check CRC.'); for n=0:nRxSubframes-1 % extract subframe rxSubframe = rxGrid(:,(1:L)+(n*L),:); % transport block size for current subframe eNodeB.NSubframe = n; trBlkSize = PDSCH.TrBlkSizes(n+1); % Channel estimation [estChannelGrid, noiseEst] = lteDLChannelEstimate( ... eNodeB, cec, rxSubframe); % Perform deprecoding, layer demapping, demodulation and descrambling % on the received data using the channel estimate [rxEncodedBits, pdschsymbols] = ltePDSCHDecode(eNodeB,PDSCH, ... rxSubframe*(10^(-PDSCH.Rho/20)),estChannelGrid,noiseEst); % Decode DownLink Shared Channel (DL-SCH) [decbits,crc] = ... lteDLSCHDecode(eNodeB,PDSCH,trBlkSize,rxEncodedBits{1}); if crc disp(['Subframe ' num2str(n) ': CRC failed']); else disp(['Subframe ' num2str(n) ': CRC passed']); end end
Low edge EVM, subframe 0: 0.647% High edge EVM, subframe 0: 0.629% Low edge EVM, subframe 1: 0.682% High edge EVM, subframe 1: 0.650% Low edge EVM, subframe 2: 0.680% High edge EVM, subframe 2: 0.676% Low edge EVM, subframe 3: 0.676% High edge EVM, subframe 3: 0.641% Low edge EVM, subframe 4: 0.640% High edge EVM, subframe 4: 0.648% Low edge EVM, subframe 6: 0.698% High edge EVM, subframe 6: 0.642% Low edge EVM, subframe 7: 0.645% High edge EVM, subframe 7: 0.649% Low edge EVM, subframe 8: 0.700% High edge EVM, subframe 8: 0.647% Low edge EVM, subframe 9: 0.694% High edge EVM, subframe 9: 0.685% Averaged low edge EVM, frame 0: 0.674% Averaged high edge EVM, frame 0: 0.652% Averaged EVM frame 0: 0.674% Averaged overall EVM: 0.674% Decode transmitted subframes and check CRC. Subframe 0: CRC passed Subframe 1: CRC passed Subframe 2: CRC passed Subframe 3: CRC passed Subframe 4: CRC passed Subframe 5: CRC passed Subframe 6: CRC passed Subframe 7: CRC passed Subframe 8: CRC passed Subframe 9: CRC passed
Этот пример использует следующие вспомогательные функции:
3GPP TS 36.101 «Радиопередача и прием пользовательского оборудования (UE)»