Этот пример показывает, как несколько нисходящих поставщиков услуг могут быть сгенерированы, агрегированы и далее демодулировали использование 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. Каждый из них передискретизируется к общему уровню выборки, частота, модулируемая к соответствующей центральной частоте, и наконец добавил вместе, чтобы сформировать агрегированный сигнал.
% 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 Гц), т.е. в этом примере сигнал не модулируется в РФ.
specPlot = hCarrierAggregationPlotSpectrum(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 = ... 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.681% High edge EVM, subframe 1: 0.649% Low edge EVM, subframe 2: 0.680% High edge EVM, subframe 2: 0.676% Low edge EVM, subframe 3: 0.675% High edge EVM, subframe 3: 0.641% Low edge EVM, subframe 4: 0.639% High edge EVM, subframe 4: 0.647% 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.648% 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.684% 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) и прием"