В этом примере показано, как симулировать основную систему связи, в которой сигнал является первым модулируемым 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
Заметьте, что существует хорошее соглашение между симулированными и теоретическими данными.