Этот пример показывает, как смоделировать передатчик OFDM, аддитивный белый Гауссов шум (AWGN) и аппаратные алгоритмы приемника OFDM в MATLAB ® как шаги к разработке реализации Simulink ® для оборудования. Пример HDL OFDM MATLAB References преодолевает разрыв между математическим алгоритмом и его аппаратной реализацией. Этот пример предоставляет ссылки MATLAB на HDL OFDM Transmitter, HDL AWGN и HDL OFDM Receiver алгоритмы. Можно использовать эти ссылки MATLAB, чтобы сгенерировать тестовые векторы для проверки реализации HDL передатчика OFDM HDL, реализации HDL генератора AWGN и моделей HDL приемника OFDM Simulink.
В этом разделе описывается ссылка MATLAB на передатчик HDL OFDM.
Эта ссылка MATLAB принимает порядок модуляции, индекс кодовой скорости, количество систем координат и бит данных, которые должны быть переданы как txParam
структура или массив структур. txParam
имеет эти поля.
modOrder
- Задайте 2, 4, 16 или 64 для 'BPSK', 'QPSK', '16QAM' и '64QAM', соответственно. Значение по умолчанию является 4 ('QPSK').
codeRateIndex
- Задайте 0, 1, 2 или 3 для ставок '1/2', '2/3', '3/4' и '5/6' соответственно. Значение по умолчанию 0 ('1/2').
numFrames
- Задайте положительное целое число. Значение по умолчанию является 5.
txDataBits
- Задайте двоичные значения в строке или векторе-столбце длины trBlkSize
x txParam.numFrames
. Значение по умолчанию является вектором-столбцом, содержащей случайным образом сгенерированные двоичные значения длины trBlkSize
x txParam.numFrames
.
Вычислите размер транспортного блока (trBlkSize
) при помощи этих параметров.
numSubCar
- Количество поднесущих на символ
pilotsPerSym
- Количество пилотов на символ
numDataOFDMSymbols
- Количество символов OFDM данных
bitsPerModSym
- Количество битов на модулируемый символ
codeRate
- Скорость прокалывания кода
dataConvK
- Длина ограничения сверточного энкодера
dataCRCLen
- длина CRC
trBlkSize = ((numSubCar - pilotsPerSym) x numDataOFDMSymbols x bitsPerModSym x codeRate) - (dataConvK-1) - dataCRCLen
Для примера, чтобы сгенерировать сигнал OFDM во временной области 5 систем координат со схемой модуляции 16QAM и скорости кода 1/2, используя случайные биты данных в транспортном блоке, форматируйте входы как структуру.
txParam.modOrder = 16; % Modulation order corresponding to 16-QAM txParam.codeRateIndex = 0; % Code rate index corresponding to 1/2 txParam.numFrames = 5; % Number of frames to be generated % Calculate transport block size (trBlkSize) using parameters numSubCar = 72; % Number of subcarriers per symbol pilotsPerSym = 12; % Number of pilots per symbol numDataOFDMSymbols = 32; % Number of data OFDM symbols bitsPerModSym = log2(txParam.modOrder); % Bits per modulated symbol codeRate = 1/2; % Punctured code rate dataConvK = 7; % Constraint length of convolutional code polynomial dataCRCLen = 32; % Data CRC length trBlkSize = ((numSubCar-pilotsPerSym)*numDataOFDMSymbols* ... bitsPerModSym*codeRate) - (dataConvK-1) - dataCRCLen; txParam.txDataBits = randi([0 1],txParam.numFrames*trBlkSize,1); % Generate complex baseband transmitter waveform fprintf('\n-------------------------\n'); fprintf('\n Transmitting %d frames ...\n',txParam.numFrames); [txWaveform,txGrid,txDiagnostics] = whdlexamples.OFDMTx(txParam); fprintf('\n Transmission successful.\n'); fprintf('\n-------------------------\n');
------------------------- Transmitting 5 frames ... Transmission successful. -------------------------
The whdlexamples.OFDMTx
функция возвращает аргументы txWaveform
, txGrid
, и txDiagnostics
.
txWaveform
- сгенерированный сигнал временной области и возвращается как вектор-столбец длины ((fftLen
+ cpLen
) x txParam.numFrames
x numSymPerFrame
), где:
fftLen
- длина БПФ.
cpLen
- длина циклического префикса.
txParam.numFrames
количество сгенерированных систем координат OFDM.
numSymPerFrame
количество символов OFDM на систему координат.
Если txParam
- массив структур, затем в выражении txParam.numFrames
заменяется суммой всех numFrames
атрибуты, существующие в массиве. Система координат сгенерированной формы волны временной области txWaveform
аналогичен выходному сигналу Simulink HDL OFDM. Подробное объяснение структуры системы координат смотрите в примере HDL OFDM Transmitter.
txGrid
- выход сетки передатчика и возвращается как матрица размера numSubCar
-by- (txParam.numFrames
x numSymPerFrame
), где numSubCar
- количество активных поднесущих.
txDiagnostics
является структурой или массивом структур и состоит из этих трех полей:
headerBits
представляет биты заголовка как вектор-столбец размера 14, которая включает 3 бита для индекса длины БПФ, 2 бита для типа модуляции символов, 2 бита для индекса скорости кода и 7 резервных бит.
dataBits
представляет фактические биты данных, переданные в заданном количестве систем координат (txParam.numFrames
). Это поле является двоичной строкой или вектором-столбцом длины, равной (txParam.numFrames
x trbBlkSize
). Будь то dataBits
является строка или вектор-столбец зависит от размерности txParam.dataBits
. Размер по умолчанию является вектором-столбцом длины, равной txParam.numFrames
x trbBlkSize
.
ofdmModOut
представляет выход модулятора OFDM как вектор-столбец длины, равную (fftLen
+ cpLen
) x txParam.numFrames
x numSymPerFrame
.
OFDMTx
whdlexamples.OFDMTx
функция используется для генерации формы волны передатчика OFDM с синхронизацией, ссылкой, заголовком, пилотами и сигналами данных. Эта функция возвращает txWaveform
, txGrid
, и txDiagnostics
использование параметров передатчика txParam
. Эта функция внутренне вызывает эти отдельные функции.
generateOFDMSyncSignal
- Эта функция генерирует сигнал синхронизации SyncSignal
. Эта функция использует последовательность Задова-Чу с корневым индексом 25 и длиной 62.
generateOFDMRefSignal
- Эта функция генерирует уставку refSignal
для заданной длины БПФ fftLen
. Эта функция использует BPSK-модулированную псевдослучайную двоичную последовательность.
generateOFDMPilotSignal
- Эта функция генерирует пилот-сигнал pilot
. Эта функция использует BPSK-модулированную псевдослучайную двоичную последовательность.
OFDMSymbolModulate
- эта функция модулирует входные биты к комплексным символам модуляции на основе заданной схемы модуляции BPSK, QPSK, 16QAM и 64QAM.
Постройте график ресурсной сетки формы волны передатчика. График указывает изменения величины каждого элемента ресурсной сетки.
plotResourceGrid(txGrid);
В этом разделе описывается ссылка MATLAB на HDL AWGN.
Эта ссылка MATLAB используется для оценки эффективности алгоритмов HDL OFDM передатчика и приемника. HDL AWGN MATLAB генерирует AWGN путем принятия отношения сигнал/шум (ОСШ) в децибеле (дБ) и наборах начальных чисел. Для получения дополнительной информации смотрите реализацию генератора AWGN. Сгенерированный AWGN добавляется к выходу HDL OFDM Transmitter.
FFTLen = 128; CPLen = 32; usedSubCarr = 72; % Out of 128 subcarriers, 72 subcarriers are loaded with data SNRdB = 30; SNRdBSimInput = SNRdB*ones(length(txWaveform)+633,1); seedsURNG1 = [121 719 511]; % Seeds for TausURNG1 seedsURNG2 = [2343 323 833]; % Seeds for TausURNG2 txScaleFactor = FFTLen/sqrt(usedSubCarr); awgnNoise = whdlexamples.hdlawgn(SNRdBSimInput,seedsURNG1,seedsURNG2); rxWaveform = txWaveform + (1/txScaleFactor)*awgnNoise(634:end); fprintf('\n Applying the AWGN channel at %d dB...\n', SNRdB);
Applying the AWGN channel at 30 dB...
В этом разделе описывается ссылка MATLAB на HDL OFDM Receiver.
Эта ссылка MATLAB включает в себя синхронизацию времени, оценку и коррекцию CFO, демодуляцию OFDM, восстановление заголовка, оценку и коррекцию CPE и восстановление данных.
The whdlexamples.OFDMRx
функция принимает rxWaveform
Переданная форма волны прошла через канал AWGN.
The whdlexamples.OFDMRx
функция возвращает декодированные биты rxBits
и массив структур, rxDiagnostics
, состоящий из этих восьми полей.
estCFO
- Оценка смещения частоты несущей
rxConstellationHeader
- Демодулированные символы созвездия заголовков
rxConstellationData
- Демодулированные символы созвездия данных
softLLR
- Демодулированные мягкие биты LLR
decodedCodeRateIndex
- Декодированный индекс кодовой скорости из заголовка
decodedModOrder
- Декодированный порядок модуляции из заголовка
headerCRCErrorFlag
- Состояние CRC заголовка
dataCRCErrorFlag
- Состояние данных CRC
OFDMRx
The whdlexamples.OFDMRx
функция используется для демодуляции и декодирования принятых rxWaveform
. Эта функция внутренне вызывает эти отдельные функции.
OFDMFrequencyOffset
- эта функция оценивает смещение частоты несущей на основе метода циклического префикса (CP). Циклический фрагмент префикса принятой формы волны временной области коррелируется, чтобы оценить смещение частоты.
OFDMFrequencyCorrect
- Эта функция корректирует смещение несущей частоты на принятой форме волны, используя оцененное смещение частоты.
OFDMFrameSync
- Эта функция синхронизирует принятую форму волны путем выполнения корреляции с использованием уставки. Этот шаг уменьшает межсимвольную интерференцию при демодуляции принятой формы волны.
OFDMDemodulation
Эта функция преобразует форму волны во временной области в форму волны в частотном диапазоне для последующего декодирования. Объект dsp.HDLFFT
используется для реализации HDL приемника.
OFDMChannelEstimation
- Эта функция выполняет оценку канала, используя два опорных сигналов. Он использует метод оценки методом наименьших квадратов (LS). Оценки LS усредняются, чтобы улучшить точность оценки канала.
OFDMChannelEqualization
- Эта функция выполняет эквализацию с нулем (ZF), используя оцененный канал. Затем принимаемую форму волны, свободную от канала, используют для восстановления заголовка и восстановления данных.
OFDMHeaderRecovery
- эта функция восстанавливает информацию заголовка путем выполнения демодуляции символов, обращенного перемежения и декодирования Viterbi. Состояние CRC указывает на успешность или отказ восстановления информации заголовка. Этот статус CRC восстановления заголовка задается как выход приемника, чтобы указать потерю или восстановление системы координат. Когда проверка CRC прекращается, состояние CRC заголовка 1
. В противном случае это 0
.
OFDMDataRecovery
- Эта функция выполняет демодуляцию символов, перемежение, депункционирование, декодирование Viterbi и дескремблирование. Функция обрабатывает данные только при прохождении проверки CRC заголовка. После дескремблирования декодированных данных проверка CRC выполняется на восстановленных битах данных, чтобы указать, является ли пакет ошибочным. Когда проверка CRC прекращается, состояние CRC заголовка 1
. В противном случае это 0
.
fprintf('\n Receiving process started...\n'); [rxDataBits,rxDiagnostics] = whdlexamples.OFDMRx(rxWaveform); fprintf('\n Reception completed\n\n'); % Plot constellation of header and data scatterplot(rxDiagnostics.rxConstellationHeader(:),1,0,'b.') title('Header Constellation') axisObj = gca; axisObj.XColor = 'w'; axisObj.YColor = 'w'; scatterplot(rxDiagnostics.rxConstellationData(:),1,0,'b.') title('Data Constellation'); axisObj = gca; axisObj.XColor = 'w'; axisObj.YColor = 'w';
Receiving process started... Estimating carrier frequency offset ... First four frames are used for carrier frequency offset estimation. Estimated carrier frequency offset is -1.913549e-01 Hz. Detected and processing frame 5 ------------------------------------------ Header CRC passed Modulation: 16QAM, codeRate=1/2 and FFT Length=128 Data CRC passed Data decoding completed ------------------------------------------ Reception completed
В этом разделе Simulink HDL OFDM Transmitter, генератор AWGN и Simulink HDL OFDM Receiver, реализованный в фиксированной точке, сравниваются с эквивалентными образцами модели MATLAB HDL, реализованными в плавающей точке.
Модель Simulink состоит из передатчика OFDM, который генерирует форму волны во временной области для заданных пользователем порядка модуляции и скорости кода. Форма волны во временной области затем передается через канал AWGN, который вводит шум AWGN желаемого ОСШ в дБ. Затем приемник OFDM используется для демодуляции и декодирования информационных бит. Выходы модели Simulink проверяются с помощью ссылки MATLAB на каждом этапе.
open HDLOFDMTxRx; sim HDLOFDMTxRx;
### Starting serial model reference simulation build ### Successfully updated the model reference simulation target for: whdlOFDMRx ### Successfully updated the model reference simulation target for: whdlOFDMTx Build Summary Simulation targets built: Model Action Rebuild Reason ================================================================================ whdlOFDMRx Code generated and compiled whdlOFDMRx_msf.mexa64 does not exist. whdlOFDMTx Code generated and compiled whdlOFDMTx_msf.mexa64 does not exist. 2 of 2 models built (0 models already up to date) Build duration: 0h 10m 7.9205s
Проверьте Simulink HDL OFDM передатчик с MATLAB HDL OFDM передатчик
В этом разделе постройте график действительной и мнимой частей HDL OFDM передатчика MATLAB вывода опорной функции txWaveform
и сравните с выходами блока HDL OFDM Transmitter.
matlabTxWaveform = txWaveform; simulinkTxWaveform = simTxOut; figure; plot(real(matlabTxWaveform),'-bo') hold on plot(real(simulinkTxWaveform(1:length(matlabTxWaveform))),'-r.') legend('MATLAB Tx waveform','Simulink Tx waveform'); title('Comparison of MATLAB Tx and Simulink Tx (Real Part)'); ylim([-0.2 0.2]); xlabel('Time-Domain Samples'); ylabel('Amplitude'); figure; plot(imag(matlabTxWaveform),'-bo') hold on plot(imag(simulinkTxWaveform(1:length(matlabTxWaveform))),'-r.') legend('MATLAB Tx waveform','Simulink Tx waveform'); title('Comparison of MATLAB Tx and Simulink Tx (Imaginary Part)'); ylim([-0.2 0.2]); xlabel('Time-Domain Samples'); ylabel('Amplitude');
Проверьте генератор Simulink HDL AWGN с MATLAB HDL AWGN
В этом разделе постройте график действительной и мнимой частей MATLAB HDL AWGN сравнивается с выходом блока Simulink AWGN Generator.
matlabChannelOut= rxWaveform; simulinkChannelOut = simChannelOut; figure; plot(real(matlabChannelOut),'-bo'); hold on; plot(real(simulinkChannelOut(1:length(matlabChannelOut))),'-r.'); legend('MATLAB channel output','Simulink channel output'); title('Comparison of MATLAB Channel and Simulink Channel (Real Part)'); ylim([-0.2 0.2]); xlabel('Time-Domain Samples'); ylabel('Amplitude'); figure; plot(imag(matlabChannelOut),'-bo'); hold on; plot(imag(simulinkChannelOut(1:length(matlabChannelOut))),'-r.'); legend('MATLAB channel output','Simulink channel output'); title('Comparison of MATLAB Channel and Simulink Channel (Imaginary Part)'); ylim([-0.2 0.2]); xlabel('Time-Domain Samples'); ylabel('Amplitude');
Проверьте Simulink HDL OFDM Receiver с MATLAB HDL OFDM Receiver
В этом разделе постройте график декодированных битов приемника MATLAB по сравнению с декодированными битами приемника Simulink.
matlabRxOut= rxDataBits; simulinkRxOut = simRxDataBits; figure; plot(rxDataBits,'-bo'); hold on; plot(simulinkRxOut(1:length(rxDataBits)),'-r.'); legend('MATLAB Rx bits','Simulink Rx bits'); title('MATLAB and Simulink Decoded Bits'); ylim([-0.25 1.25]); xlabel('Time-domain Samples'); ylabel('Amplitude');