Этот пример показывает, как моделировать аппаратные алгоритмы OFDM передатчика, аддитивного белого гауссова шума (AWGN) и OFDM приемника в MATLAB ® в качестве шагов к разработке реализации Simulink ® для аппаратного обеспечения. Пример ссылок на МАТЛАБ МДПВП перекрывает разрыв между математическим алгоритмом и его аппаратной реализацией. В этом примере приводятся ссылки MATLAB на алгоритмы передатчика OFDM HDL, AWGN HDL и приемника OFDM HDL. Эти ссылки MATLAB можно использовать для генерации тестовых векторов для проверки реализации HDL передатчика OFDM HDL, реализации HDL генератора AWGN и моделей Simulink приемника OFDM HDL.

В этом разделе описывается ссылка MATLAB передатчика OFDM HDL.
Эта ссылка 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. -------------------------
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.
txGrid является выходом сетки передатчика и возвращается в виде матрицы размера numSubCarоколо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 на AWGN HDL.
Эта ссылка MATLAB используется для оценки рабочих характеристик алгоритмов передатчика и приемника OFDM HDL. Эталон AWGN MATLAB HDL генерирует AWGN, принимая отношение сигнал/шум (SNR) в децибелах (дБ) и наборах начальных чисел. Для получения дополнительной информации см. Внедрение HDL генератора AWGN. Сгенерированный AWGN добавляется к выходному сигналу передатчика OFDM HDL.
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 на приемник OFDM HDL.
Эта ссылка MATLAB включает в себя временную синхронизацию, оценку и коррекцию финансового директора, демодуляцию OFDM, восстановление заголовка, оценку и коррекцию CPE и восстановление данных.
whdlexamples.OFDMRx функция принимает rxWaveformпередаваемый сигнал, проходящий через канал AWGN.
whdlexamples.OFDMRx функция возвращает декодированные биты rxBits и ряд структур, rxDiagnostics, состоящий из этих восьми полей.
estCFO - Расчетное смещение несущей частоты
rxConstellationHeader - Демодулированные символы совокупности заголовков
rxConstellationData - Демодулированные символы совокупности данных
softLLR - Демодулированные мягкие биты LLR
decodedCodeRateIndex - Декодированный индекс кодовой скорости из заголовка
decodedModOrder - Порядок декодирования модуляции из заголовка
headerCRCErrorFlag - Состояние CRC заголовка
dataCRCErrorFlag - Состояние CRC данных
OFDMRx
whdlexamples.OFDMRx используется для демодуляции и декодирования принятого rxWaveform. Эта функция вызывает эти отдельные функции.
OFDMFrequencyOffset - Эта функция оценивает смещение несущей частоты на основе метода циклического префикса (CP). Часть циклического префикса принятого сигнала временной области коррелируется для оценки сдвига частоты.
OFDMFrequencyCorrect - Эта функция корректирует смещение несущей частоты в принятой форме сигнала, используя оцененное смещение частоты.
OFDMFrameSync - Эта функция синхронизирует принятый сигнал посредством выполнения корреляции с использованием опорного сигнала. Этот этап уменьшает межсимвольные помехи при демодуляции принятого сигнала.
OFDMDemodulation Эта функция преобразует форму сигнала временной области в форму сигнала частотной области для дальнейшего декодирования. Объект dsp.HDLFFT используется для реализации HDL приемника.
OFDMChannelEstimation - Эта функция выполняет оценку канала с использованием двух опорных сигналов. Он использует метод оценки наименьших квадратов (LS). Оценки LS усредняются для улучшения точности оценки канала.
OFDMChannelEqualization - Эта функция выполняет выравнивание нулевого форсирования (ZF) с использованием расчетного канала. Затем принятый сигнал, который свободен от канала, используется для восстановления заголовка и данных.
OFDMHeaderRecovery - Эта функция восстанавливает информацию заголовка, выполняя демодуляцию символов, обратное перемежение и декодирование Витерби. Состояние CRC указывает на успешное или неуспешное восстановление информации заголовка. Это состояние CRC восстановления заголовка задается как выходной сигнал приемника для указания потери кадра или восстановления. Если проверка CRC завершается неуспешно, то состояние CRC заголовка имеет значение 1. В противном случае это 0.
OFDMDataRecovery - Эта функция выполняет демодуляцию символов, обратное перемежение, депунктирование, декодирование Витерби и дескремблирование. Функция обрабатывает данные только при прохождении проверки 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


В этом разделе передатчик OFDM HDL Simulink, генератор AWGN и приемник OFDM HDL Simulink, реализованные в фиксированной точке, сравниваются с эквивалентными эталонными моделями MATLAB HDL, реализованными в плавающей точке.
Модель Simulink состоит из передатчика OFDM, который генерирует сигнал временной области для определенного пользователем порядка модуляции и скорости кодирования. Форма сигнала временной области затем проходит через канал AWGN, который вводит шум AWGN требуемого SNR в дБ. Затем приемник 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 передатчика
В этом разделе постройте график действительной и мнимой частей вывода опорной функции передатчика OFDM MATLAB HDL txWaveform и сравнивают с выходом блока OFDM передатчика HDL.
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');


Проверить генератор HDL AWGN Simulink с помощью 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 приемника с MATLAB HDL OFDM приемника
В этом разделе постройте график декодированных битов приемника 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');
