Этот пример показывает системы Multiple Входа Выхода (MIMO), которые используют несколько антенн в концах передатчика и приемника системы радиосвязи. Системы MIMO все чаще внедряются в системы связи для потенциального усиления емкости, которую они реализуют при использовании нескольких антенн. Несколько антенн используют пространственную размерность в сложение со временем и таковыми частоты, не меняя требований к полосе пропускания системы.
Для типовой ссылки связи этот пример фокусируется на разнесении передачи вместо традиционного разнесения приема. Используя плоско-замирающий канал Релея, он иллюстрирует концепцию ортогонального пространственно-временного блочного кодирования, которая используется, когда используется несколько антенн передатчика. Здесь принято, что канал подвергается независимому замиранию между несколькими парами передающая-приемная антенна.
Для выбранной системы это также обеспечивает меру снижения эффективности, когда канал неидеально оценен в приемнике, по сравнению со случаем идеального знания канала в приемнике.
Использование приема с разнесением является хорошо известным методом для смягчения эффектов затухания по линии связи. Тем не менее, он в основном был отправлен в конец приемника. В [1] Аламути предлагает схему разнесения передачи, которая предлагает аналогичные коэффициенты усиления разнесения, используя несколько антенн в передатчике. Это было задумано как более практичное, так как, пример, это потребует только нескольких антенн в базовой станции по сравнению с несколькими антеннами для каждой мобильной станции в сотовой коммуникационной системе.
В этом разделе освещается это сравнение разнесения передачи и приема путем симуляции когерентной двоичной фазовой манипуляции (BPSK) модуляции по плоско-замирающим Релейским каналам. Для разнесения передачи мы используем две передающие антенны и одну приемную антенну (2x1 нотационально), в то время как для разнесения приема мы используем одну передающую антенну и две приемные антенны (1x2 нотационно).
Симуляция охватывает сквозную систему, показывающую закодированный и/или переданный сигнал, модель канала, а также прием и демодуляцию принимаемого сигнала. Это также предоставляет ссылку без разнесения (один корпус приемно-передающей антенны) и теоретическая эффективность ссылки разнесения второго порядка для сравнения. Здесь принято, что канал прекрасно известен в приемнике для всех систем. Мы запускаем симуляцию в области значений точек Eb/No, чтобы сгенерировать результаты BER, которые позволяют нам сравнивать различные системы.
Начнем с определения некоторых распространенных параметров симуляции
frmLen = 100; % frame length numPackets = 1000; % number of packets EbNo = 0:2:20; % Eb/No varying to 20 dB N = 2; % maximum number of Tx antennas M = 2; % maximum number of Rx antennas
и настройте симуляцию.
% Create comm.BPSKModulator and comm.BPSKDemodulator System objects(TM) P = 2; % modulation order bpskMod = comm.BPSKModulator; bpskDemod = comm.BPSKDemodulator('OutputDataType','double'); % Create comm.OSTBCEncoder and comm.OSTBCCombiner System objects ostbcEnc = comm.OSTBCEncoder; ostbcComb = comm.OSTBCCombiner; % Create two comm.AWGNChannel System objects for one and two receive % antennas respectively. Set the NoiseMethod property of the channel to % 'Signal to noise ratio (Eb/No)' to specify the noise level using the % energy per bit to noise power spectral density ratio (Eb/No). The output % of the BPSK modulator generates unit power signals; set the SignalPower % property to 1 Watt. awgn1Rx = comm.AWGNChannel(... 'NoiseMethod', 'Signal to noise ratio (Eb/No)', ... 'SignalPower', 1); awgn2Rx = clone(awgn1Rx); % Create comm.ErrorRate calculator System objects to evaluate BER. errorCalc1 = comm.ErrorRate; errorCalc2 = comm.ErrorRate; errorCalc3 = comm.ErrorRate; % Since the comm.AWGNChannel System objects as well as the RANDI function % use the default random stream, the following commands are executed so % that the results will be repeatable, i.e., same results will be obtained % for every run of the example. The default stream will be restored at the % end of the example. s = rng(55408); % Pre-allocate variables for speed H = zeros(frmLen, N, M); ber_noDiver = zeros(3,length(EbNo)); ber_Alamouti = zeros(3,length(EbNo)); ber_MaxRatio = zeros(3,length(EbNo)); ber_thy2 = zeros(1,length(EbNo));
% Set up a figure for visualizing BER results fig = figure; grid on; ax = fig.CurrentAxes; hold(ax,'on'); ax.YScale = 'log'; xlim(ax,[EbNo(1), EbNo(end)]); ylim(ax,[1e-4 1]); xlabel(ax,'Eb/No (dB)'); ylabel(ax,'BER'); fig.NumberTitle = 'off'; fig.Renderer = 'zbuffer'; fig.Name = 'Transmit vs. Receive Diversity'; title(ax,'Transmit vs. Receive Diversity'); set(fig, 'DefaultLegendAutoUpdate', 'off'); fig.Position = figposition([15 50 25 30]); % Loop over several EbNo points for idx = 1:length(EbNo) reset(errorCalc1); reset(errorCalc2); reset(errorCalc3); % Set the EbNo property of the AWGNChannel System objects awgn1Rx.EbNo = EbNo(idx); awgn2Rx.EbNo = EbNo(idx); % Loop over the number of packets for packetIdx = 1:numPackets % Generate data vector per frame data = randi([0 P-1], frmLen, 1); % Modulate data modData = bpskMod(data); % Alamouti Space-Time Block Encoder encData = ostbcEnc(modData); % Create the Rayleigh distributed channel response matrix % for two transmit and two receive antennas H(1:N:end, :, :) = (randn(frmLen/2, N, M) + ... 1i*randn(frmLen/2, N, M))/sqrt(2); % assume held constant for 2 symbol periods H(2:N:end, :, :) = H(1:N:end, :, :); % Extract part of H to represent the 1x1, 2x1 and 1x2 channels H11 = H(:,1,1); H21 = H(:,:,1)/sqrt(2); H12 = squeeze(H(:,1,:)); % Pass through the channels chanOut11 = H11 .* modData; chanOut21 = sum(H21.* encData, 2); chanOut12 = H12 .* repmat(modData, 1, 2); % Add AWGN rxSig11 = awgn1Rx(chanOut11); rxSig21 = awgn1Rx(chanOut21); rxSig12 = awgn2Rx(chanOut12); % Alamouti Space-Time Block Combiner decData = ostbcComb(rxSig21, H21); % ML Detector (minimum Euclidean distance) demod11 = bpskDemod(rxSig11.*conj(H11)); demod21 = bpskDemod(decData); demod12 = bpskDemod(sum(rxSig12.*conj(H12), 2)); % Calculate and update BER for current EbNo value % for uncoded 1x1 system ber_noDiver(:,idx) = errorCalc1(data, demod11); % for Alamouti coded 2x1 system ber_Alamouti(:,idx) = errorCalc2(data, demod21); % for Maximal-ratio combined 1x2 system ber_MaxRatio(:,idx) = errorCalc3(data, demod12); end % end of FOR loop for numPackets % Calculate theoretical second-order diversity BER for current EbNo ber_thy2(idx) = berfading(EbNo(idx), 'psk', 2, 2); % Plot results semilogy(ax,EbNo(1:idx), ber_noDiver(1,1:idx), 'r*', ... EbNo(1:idx), ber_Alamouti(1,1:idx), 'go', ... EbNo(1:idx), ber_MaxRatio(1,1:idx), 'bs', ... EbNo(1:idx), ber_thy2(1:idx), 'm'); legend(ax,'No Diversity (1Tx, 1Rx)', 'Alamouti (2Tx, 1Rx)',... 'Maximal-Ratio Combining (1Tx, 2Rx)', ... 'Theoretical 2nd-Order Diversity'); drawnow; end % end of for loop for EbNo % Perform curve fitting and replot the results fitBER11 = berfit(EbNo, ber_noDiver(1,:)); fitBER21 = berfit(EbNo, ber_Alamouti(1,:)); fitBER12 = berfit(EbNo, ber_MaxRatio(1,:)); semilogy(ax,EbNo, fitBER11, 'r', EbNo, fitBER21, 'g', EbNo, fitBER12, 'b'); hold(ax,'off'); % Restore default stream rng(s);
Система разнесения передачи имеет сложность расчетов, очень сходную с сложностью вычислений системы разнесения приема.
Получившиеся результаты симуляции показывают, что использование двух передающих антенн и одной приемной антенны обеспечивает тот же порядок разнесения, что и объединенная система с максимальным отношением (MRC) одной передающей антенны и двух приемных антенн.
Также обратите внимание, что разнесение передачи имеет недостаток 3 дБ по сравнению с разнесением приема MRC. Это потому, что мы смоделировали общую передаваемую степень, чтобы она была одинаковой в обоих случаях. Если мы калибруем переданную степень так, чтобы мощность приемника для этих двух случаев была одинаковой, то эффективность была бы идентичной. Теоретическая эффективность ссылки разнесения второго порядка совпадают с системой разнесения передачи, когда она нормализует общую степень во всех ветвях разнесения.
Сопутствующие функциональные скрипты, mrc1m.m и ostbc2m.m помогают заинтересованным пользователям в дальнейшем изучении.
Основываясь на теории ортогональных проектов, Tarokh et al. [2] обобщила схему разнесения передачи Аламути к произвольному числу антенн передатчика, приводя к концепции пространственно-временных блочных кодов. Для сложных сигнальных созвездий они показали, что схема Аламути является единственной полноскоростной схемой для двух передающих антенн.
В этом разделе мы изучаем эффективность такой схемы с двумя приемными антеннами (то есть системой 2x2) с оценкой канала и без нее. В реалистичном сценарии, когда информация о состоянии канала не известна в приемнике, это должно быть извлечено из принятого сигнала. Мы принимаем, что блок оценки канала выполняет это, используя ортогональные пилот-сигналы, которые подготовлены к каждому пакету [3]. Принято, что канал остается неизменным для длины пакета (то есть он подвергается медленному замиранию).
Здесь используется симуляция, подобная описанной в предыдущем разделе, которая приводит нас к оценке эффективности BER для пространственно-временной блочной системы с использованием двух передающих и двух приемных антенн.
Снова начнем с определения общих параметров симуляции
frmLen = 100; % frame length maxNumErrs = 300; % maximum number of errors maxNumPackets = 3000; % maximum number of packets EbNo = 0:2:12; % Eb/No varying to 12 dB N = 2; % number of Tx antennas M = 2; % number of Rx antennas pLen = 8; % number of pilot symbols per frame W = hadamard(pLen); pilots = W(:, 1:N); % orthogonal set per transmit antenna
и настройте симуляцию.
% Create a comm.MIMOChannel System object to simulate the 2x2 spatially % independent flat-fading Rayleigh channel chan = comm.MIMOChannel( ... 'MaximumDopplerShift', 0, ... 'SpatialCorrelationSpecification', 'None', ... 'NumTransmitAntennas', N, ... 'NumReceiveAntennas', M, ... 'PathGainsOutputPort', true); % Change the NumReceiveAntennas property value of the hAlamoutiDec System % object to M that is 2 release(ostbcComb); ostbcComb.NumReceiveAntennas = M; % Release the hAWGN2Rx System object release(awgn2Rx); % Set the global random stream for repeatability s = rng(55408); % Pre-allocate variables for speed HEst = zeros(frmLen, N, M); ber_Estimate = zeros(3,length(EbNo)); ber_Known = zeros(3,length(EbNo));
% Set up a figure for visualizing BER results fig = figure; grid on; ax = fig.CurrentAxes; hold(ax,'on'); ax.YScale = 'log'; xlim(ax,[EbNo(1), EbNo(end)]); ylim(ax,[1e-4 1]); xlabel(ax,'Eb/No (dB)'); ylabel(ax,'BER'); fig.NumberTitle = 'off'; fig.Name = 'Orthogonal Space-Time Block Coding'; fig.Renderer = 'zbuffer'; title(ax,'Alamouti-coded 2x2 System'); set(fig,'DefaultLegendAutoUpdate','off'); fig.Position = figposition([41 50 25 30]); % Loop over several EbNo points for idx = 1:length(EbNo) reset(errorCalc1); reset(errorCalc2); awgn2Rx.EbNo = EbNo(idx); % Loop till the number of errors exceed 'maxNumErrs' % or the maximum number of packets have been simulated while (ber_Estimate(2,idx) < maxNumErrs) && ... (ber_Known(2,idx) < maxNumErrs) && ... (ber_Estimate(3,idx)/frmLen < maxNumPackets) % Generate data vector per frame data = randi([0 P-1], frmLen, 1); % Modulate data modData = bpskMod(data); % Alamouti Space-Time Block Encoder encData = ostbcEnc(modData); % Prepend pilot symbols for each frame txSig = [pilots; encData]; % Pass through the 2x2 channel reset(chan); [chanOut, H] = chan(txSig); % Add AWGN rxSig = awgn2Rx(chanOut); % Channel Estimation % For each link => N*M estimates HEst(1,:,:) = pilots(:,:).' * rxSig(1:pLen, :) / pLen; % assume held constant for the whole frame HEst = HEst(ones(frmLen, 1), :, :); % Combiner using estimated channel decDataEst = ostbcComb(rxSig(pLen+1:end,:), HEst); % Combiner using known channel decDataKnown = ostbcComb(rxSig(pLen+1:end,:), ... squeeze(H(pLen+1:end,:,:,:))); % ML Detector (minimum Euclidean distance) demodEst = bpskDemod(decDataEst); % estimated demodKnown = bpskDemod(decDataKnown); % known % Calculate and update BER for current EbNo value % for estimated channel ber_Estimate(:,idx) = errorCalc1(data, demodEst); % for known channel ber_Known(:,idx) = errorCalc2(data, demodKnown); end % end of FOR loop for numPackets % Plot results semilogy(ax,EbNo(1:idx), ber_Estimate(1,1:idx), 'ro'); semilogy(ax,EbNo(1:idx), ber_Known(1,1:idx), 'g*'); legend(ax,['Channel estimated with ' num2str(pLen) ' pilot symbols/frame'],... 'Known channel'); drawnow; end % end of for loop for EbNo % Perform curve fitting and replot the results fitBEREst = berfit(EbNo, ber_Estimate(1,:)); fitBERKnown = berfit(EbNo, ber_Known(1,:)); semilogy(ax,EbNo, fitBEREst, 'r', EbNo, fitBERKnown, 'g'); hold(ax,'off'); % Restore default stream rng(s)
Для моделируемой системы 2x2 порядок разнесения отличается от того, который наблюдается для систем 1x2 или 2x1 в предыдущем разделе.
Обратите внимание, что с 8 пилотными символами для каждого 100 символов данных оценка канала вызывает ухудшение эффективности на 1 дБ для выбранной области значений Eb/No. Это улучшается с увеличением количества пилотных символов на систему координат, но добавляет к служебной информации ссылки. В этом сравнении мы сохраняем переданное ОСШ на символ одинаковым в обоих случаях.
Сопутствующий функциональный скрипт ostbc2m_e.m способствует дальнейшему экспериментированию для заинтересованных пользователей.
В этом заключительном разделе мы представляем некоторые результаты эффективности для ортогонального пространственно-временного блочного кодирования с использованием четырех передающих антенн (система 4x1) с использованием кода с половинной скоростью, G4, согласно [4].
Мы ожидаем, что система будет предлагать порядок разнесения 4 и сравнить его с системами 1x4 и 2x2, которые также имеют одинаковый порядок разнесения. Чтобы позволить справедливое сравнение, мы используем четвертичный PSK с G4 кодом с половинной скоростью для достижения той же скорости передачи 1 бит/сек/Гц.
Эти результаты занимают некоторое время, чтобы сгенерироваться на одном ядре. Если у вас нет установленного Parallel Computing Toolbox™ (PCT), мы загружаем результаты предыдущей симуляции. Включен функциональный скрипт ostbc4m.m, который наряду с mrc1m.m и ostbc2m.m использовался для генерации этих результатов. Если PCT установлен, эти симуляции выполняются параллельно. В этом случае используются функциональные скрипты ostbc4m_pct.m, mrc1m_pct.m и ostbc2m_pct.m. Пользователю предлагается использовать эти скрипты как начальная точка для изучения других кодов и систем.
[licensePCT,~] = license( 'checkout' , 'Distrib_Computing_Toolbox'); if (licensePCT && ~isempty(ver('parallel'))) EbNo = 0:2:20; [ber11, ber14, ber22, ber41] = mimoOSTBCWithPCT(100,4e3,EbNo); else load ostbcRes.mat; end % Set up a figure for visualizing BER results fig = figure; grid on; ax = fig.CurrentAxes; hold(ax,'on'); fig.Renderer = 'zbuffer'; ax.YScale = 'log'; xlim(ax,[EbNo(1), EbNo(end)]); ylim(ax,[1e-5 1]); xlabel(ax,'Eb/No (dB)'); ylabel(ax,'BER'); fig.NumberTitle = 'off'; fig.Name = 'Orthogonal Space-Time Block Coding(2)'; title(ax,'G4-coded 4x1 System and Other Comparisons'); set(fig,'DefaultLegendAutoUpdate','off'); fig.Position = figposition([30 15 25 30]); % Theoretical performance of fourth-order diversity for QPSK BERthy4 = berfading(EbNo, 'psk', 4, 4); % Plot results semilogy(ax,EbNo, ber11, 'r*', EbNo, ber41, 'ms', EbNo, ber22, 'c^', ... EbNo, ber14, 'ko', EbNo, BERthy4, 'g'); legend(ax,'No Diversity (1Tx, 1Rx), BPSK', 'OSTBC (4Tx, 1Rx), QPSK', ... 'Alamouti (2Tx, 2Rx), BPSK', 'Maximal-Ratio Combining (1Tx, 4Rx), BPSK', ... 'Theoretical 4th-Order Diversity, QPSK'); % Perform curve fitting fitBER11 = berfit(EbNo, ber11); fitBER41 = berfit(EbNo(1:9), ber41(1:9)); fitBER22 = berfit(EbNo(1:8), ber22(1:8)); fitBER14 = berfit(EbNo(1:7), ber14(1:7)); semilogy(ax,EbNo, fitBER11, 'r', EbNo(1:9), fitBER41, 'm', ... EbNo(1:8), fitBER22, 'c', EbNo(1:7), fitBER14, 'k'); hold(ax,'off');
Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 6).
Как ожидалось, аналогичные наклоны кривых BER для систем 4x1, 2x2 и 1x4 указывают на идентичный порядок разнесения для каждой системы.
Также наблюдайте штраф в 3 дБ для системы 4x1, который можно отнести к тому же общему допущению передаваемой степени, сделанному для каждой из трех систем. Если мы калибруем переданную степень так, чтобы мощность приемника для каждой из этих систем была одинаковой, то три системы будут работать одинаково. Снова, теоретическая эффективность соответствует эффективности симуляции системы 4x1, поскольку общая степень нормирована для ветвей разнесения.
В этом примере используются следующие вспомогательные функции:
С. М. Аламути, «Простой метод разнесения передачи для радиосвязей», Журнал IEEE ® о выбранных областях в коммуникациях, том 16, № 8, октябрь 1998, стр. 1451-1458.
В. Тарох, Х. Джафархами, и А. Р. Калдербанк, «Пространственно-временные блочные коды из ортогональных проектов», Транзакции IEEE по теории информации, том 45, № 5, июль 1999, стр. 1456-1467.
А. Ф. Нагиб, В. Тарох, Н. Шешадри и А. Р. Калдербанк, «Пространственные коды для беспроводной связи с высокой скоростью передачи данных: анализ несоответствия», Труды Международной конференции IEEE по связи, стр. 309-313, июнь 1997 года.
В. Тарох, Х. Джафархами, и А. Р. Калдербанк, «Пространственно-временные блочные коды для беспроводной связи: Результаты эффективности», Журнал IEEE по отдельным областям в коммуникациях, том 17, № 3, Мар. 1999, стр. 451-460.