QPSK и OFDM с системными объектами MATLAB

Этот пример показов, как симулировать основную систему связи, в которой сигнал сначала модулируется QPSK, а затем подвергается ортогональной частоте Деления мультиплексированию. Затем сигнал передается через аддитивный канал белого Гауссова шума перед демультиплексированием и демодуляцией. Наконец, количество битовых ошибок вычисляется. В примере показано использование MATLAB ® System objects™.

Установите параметры симуляции.

M = 4;                 % Modulation alphabet
k = log2(M);           % Bits/symbol
numSC = 128;           % Number of OFDM subcarriers
cpLen = 32;            % OFDM cyclic prefix length
maxBitErrors = 100;    % Maximum number of bit errors
maxNumBits = 1e7;      % Maximum number of bits transmitted

Создайте Системные объекты, необходимые для симуляции: QPSK модулятор, QPSK демодулятор, OFDM модулятор, OFDM демодулятор, канал AWGN и калькулятор частоты ошибок. Используйте пары "имя-значение", чтобы задать свойства объекта.

Установите модулятор QPSK и демодулятор так, чтобы они приняли двоичные входы.

qpskMod = comm.QPSKModulator('BitInput',true);
qpskDemod = comm.QPSKDemodulator('BitOutput',true);

Установите пару модулятора OFDM и демодулятора согласно параметрам симуляции.

ofdmMod = comm.OFDMModulator('FFTLength',numSC,'CyclicPrefixLength',cpLen);
ofdmDemod = comm.OFDMDemodulator('FFTLength',numSC,'CyclicPrefixLength',cpLen);

Установите NoiseMethod свойство объекта канала AWGN, чтобы Variance и определите VarianceSource свойство, чтобы степень шума могла быть установлен из порта входа.

channel = comm.AWGNChannel('NoiseMethod','Variance', ...
    'VarianceSource','Input port');

Установите ResetInputPort свойство к true чтобы включить сброс калькулятора частоты ошибок во время симуляции.

errorRate = comm.ErrorRate('ResetInputPort',true);

Используйте info функция ofdmMod объект для определения входа и выходных размерностей модулятора OFDM.

ofdmDims = info(ofdmMod)
ofdmDims = struct with fields:
    DataInputSize: [117 1]
       OutputSize: [160 1]

Определите количество поднесущих данных от ofdmDims структурная переменная.

numDC = ofdmDims.DataInputSize(1)
numDC = 117

Определите формат кадра OFDM (в битах) из количества поднесущих данных и количества битов на символ.

frameSize = [k*numDC 1];

Установите вектор ОСШ на основе желаемой области значений Eb/No, количества бит на символ и отношения количества поднесущих данных к общему количеству поднесущих.

EbNoVec = (0:10)';
snrVec = EbNoVec + 10*log10(k) + 10*log10(numDC/numSC);

Инициализируйте BER и массивы статистики ошибок.

berVec = zeros(length(EbNoVec),3);
errorStats = zeros(1,3);

Моделируйте ссылку связи в области значений значений Eb/No. Для каждого значения Eb/No симуляция выполняется до любого из них maxBitErrors регистрируются или общее количество переданных бит превышает maxNumBits.

for m = 1:length(EbNoVec)
    snr = snrVec(m);
    
    while errorStats(2) <= maxBitErrors && errorStats(3) <= maxNumBits
        dataIn = randi([0,1],frameSize);              % Generate binary data
        qpskTx = qpskMod(dataIn);                     % Apply QPSK modulation
        txSig = ofdmMod(qpskTx);                      % Apply OFDM modulation
        powerDB = 10*log10(var(txSig));               % Calculate Tx signal power
        noiseVar = 10.^(0.1*(powerDB-snr));           % Calculate the noise variance
        rxSig = channel(txSig,noiseVar);              % Pass the signal through a noisy channel
        qpskRx = ofdmDemod(rxSig);                    % Apply OFDM demodulation
        dataOut = qpskDemod(qpskRx);                  % Apply QPSK demodulation
        errorStats = errorRate(dataIn,dataOut,0);     % Collect error statistics
    end
    
    berVec(m,:) = errorStats;                         % Save BER data
    errorStats = errorRate(dataIn,dataOut,1);         % Reset the error rate calculator
end

Используйте berawgn функция для определения теоретического BER для системы QPSK.

berTheory = berawgn(EbNoVec,'psk',M,'nondiff');

Постройте график теоретических и моделируемых данных на том же графике, чтобы сравнить результаты.

figure
semilogy(EbNoVec,berVec(:,1),'*')
hold on
semilogy(EbNoVec,berTheory)
legend('Simulation','Theory','Location','Best')
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')
grid on
hold off

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Simulation, Theory.

Заметьте, что существует хорошее согласие между моделируемыми и теоретическими данными.

Для просмотра документации необходимо авторизоваться на сайте