В этом примере показано, как к передатчику модели OFDM, аддитивному белому Гауссову шуму (AWGN) и алгоритмам оборудования приемника OFDM в MATLAB® как шаги к разработке реализации Simulink® для оборудования. HDL OFDM пример Ссылок MATLAB устраняет разрыв между математическим алгоритмом и его аппаратной реализацией. Этот пример обеспечивает ссылки MATLAB HDL Передатчик OFDM, HDL AWGN и HDL алгоритмы Приемника OFDM. Можно использовать эти ссылки MATLAB, чтобы сгенерировать тестовые векторы для проверки реализации HDL HDL Передатчик OFDM, Реализация HDL Генератора AWGN и модели HDL OFDM Receiver 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. -------------------------
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 Transmitter форма волны выхода. Для подробного объяснения структуры системы координат смотрите HDL пример Передатчика OFDM.
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 HDL AWGN.
Эта ссылка MATLAB используется для оценки результатов деятельности HDL Передатчик OFDM и алгоритмы Приемника. HDL AWGN ссылка MATLAB генерирует AWGN путем принятия отношения сигнал-шум (SNR) в децибеле (дБ) и наборах seed. Для получения дополнительной информации смотрите Реализацию HDL Генератора 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.
Эта ссылка MATLAB включает синхронизацию времени, оценку CFO и коррекцию, демодуляцию 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
— Эта функция восстанавливает информацию о заголовке путем выполнения демодуляции символа, устранения чередования и декодирования Viterbi. Состояние CRC указывает на успешность или неуспешность восстановления информации о заголовке. Это состояние CRC восстановления заголовка дано как выход приемника, чтобы указать на потерю системы координат или восстановление. Когда проверка CRC перестала работать, состоянием CRC заголовка является 1
. В противном случае это - 0
.
OFDMDataRecovery
— Эта функция выполняет демодуляцию символа, устранение чередования, depuncturing, декодирование 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
В этом разделе, HDL Simulink Передатчик OFDM, генератор AWGN и HDL Simulink Приемник OFDM, реализованный в фиксированной точке, по сравнению с эквивалентными образцами модели HDL MATLAB, реализованными в плавающей точке.
Модель 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
Проверьте HDL Simulink передатчик OFDM с HDL MATLAB передатчик 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');
Проверьте HDL Simulink генератор AWGN с HDL MATLAB AWGN
В этом разделе постройте действительные и мнимые части HDL MATLAB, который 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');
Проверьте HDL Simulink приемник OFDM с HDL MATLAB приемник 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');