В этом примере показано, как несколько нисходящих несущих могут быть сгенерированы, агрегировали и далее демодулировали использование LTE Toolbox™.
Этот пример демонстрирует форму волны Релиза 12 LTE с Агрегацией несущей (CA). Количество поднесущих и их полосы пропускания может быть задано в качестве параметра. Внутриполоса непрерывный случай CA рассматривается.
Чтобы сгенерировать агрегированную нисходящую форму волны, eNodeB сконфигурирован для каждой несущей компонента. Параметры несущей компонента вычисляются и используются, чтобы сгенерировать модулируемую форму волны для каждой eNodeB настройки. Модулируемые формы волны всего CC передискретизируются к общей частоте дискретизации, таким образом, они могут быть объединены, чтобы создать агрегированную форму волны.
Векторный NDLRB
задает количество блоков ресурса (RBS) для каждой несущей компонента (CC). Длина этого вектора соответствует количеству CCS. Элементы NDLRB
должен быть в наборе {6, 15, 25, 50, 75, 100} RBS. Таблица 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
. Конфигурационные структуры для всего CCS хранятся в массиве ячеек.
% 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
агрегированная полоса пропускания канала всего CCS
В коде ниже мы сначала вычисляем значение для всего 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. Каждый из них передискретизируется к общей частоте дискретизации. Наконец, Многополосный Объединитель используется к частоте, модулируют каждый 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); end % Aggregate all CC. comm.MultibandCombiner applies the frequency offsets % and adds the resulting signals together. sigAggregator = comm.MultibandCombiner(InputSampleRate = SR, ... FrequencyOffsets = F_c*1e6, ... OutputSampleRateSource = 'Property', ... OutputSampleRate = SR); waveform = sigAggregator([tx{:}]);
Спектр мощности несущей агрегировался, сигнал отображен с помощью hPlotSpectrum.m. В спектре отображаются отдельные полосы пропускания несущей. Обратите внимание на то, что центр агрегированной полосы пропускания расположен в основной полосе (0 Гц), i.e. в этом примере сигнал не модулируется к RF.
specPlot = hPlotSpectrum(waveform,SR,... 'Power Spectrum of Carrier Aggregation',{'Signal spectrum'});
Этот раздел демодулирует, фильтрует и прореживает один из CCS. Выполненные шаги:
Демодулируйте CC интереса и принесите его к основной полосе (0 Гц).
Отфильтруйте соседний CCS и проредите. Подходящий фильтр спроектирован, чтобы удалить нежелательный соседний CCS в процессе субдискретизации. Создание фильтра окажет влияние на качество и 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 = ... hPlotSpectrum([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) и прием"