В этом примере показано, как к передатчику модели OFDM, аддитивному белому Гауссову шуму (AWGN) и алгоритмам оборудования приемника OFDM в MATLAB как шаг к разработке реализации Simulink® HDL. Пример HDL OFDM MATLAB® References устраняет разрыв между математическим алгоритмом и его аппаратной реализацией. Этот пример обеспечивает ссылки MATLAB HDL Передатчик OFDM, HDL AWGN и HDL алгоритмы Приемника OFDM, которые можно реализовать на оборудовании. Можно использовать эти ссылки MATLAB, чтобы сгенерировать тестовые векторы для проверки реализации HDL этих моделей Simulink, HDL Передатчик OFDM, Реализация HDL Генератора AWGN и HDL Приемник OFDM.
В этом разделе описываются ссылку 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
* txParam.numFrames
. Значением по умолчанию является вектор-столбец, содержащий случайным образом сгенерированные двоичные значения длины trBlkSize
* txParam.numFrames
.
Вычислите транспортный размер блока (trBlkSize
) при помощи этих параметров.
numSubCar
— Количество поднесущих на символ
pilotsPerSym
— Количество пилотов на символ
numDataOFDMSymbols
— Количество данных символы OFDM
bitsPerModSym
— Количество битов на модулируемый символ
codeRate
— Проколотый уровень кода
dataConvK
— Продолжительность ограничения сверточного энкодера
dataCRCLen
— Продолжительность CRC
trBlkSize = ((numSubCar-pilotsPerSym)*numDataOFDMSymbols*bitsPerModSym*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',sum(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
) + (txFilterLen
- 1)), где
fftLen
длина БПФ.
cpLen
длина циклического префикса.
numSymPerFrame
количество символов OFDM на систему координат.
txFilterLen
длина фильтра передатчика.
Если txParam
массив структур, затем txParam.numFrames
заменяется суммой всего numFrames
атрибуты, существующие в массиве. Структура системы координат сгенерированной формы волны временного интервала txWaveform
похоже на Simulink HDL OFDM Transmitter форма волны выхода. Для подробного объяснения структуры системы координат смотрите HDL Передатчик OFDM.
2. txGrid
сетка передатчика выход и возвращена как матрица размерности numSubCar
- (txParam.numFrames
x numSymPerFrame
).
3. txDiagnostics
структура или массив структур и состоит из этих трех полей.
headerBits
— Это поле представляет биты заголовка как вектор-столбец размера 22, который включает 3 бита для индекса длины БПФ, 2 бита для типа модуляции символа, 2 бита для индекса уровня кода и 15 запасных битов.
dataBits
— Это поле представляет фактические биты данных, переданные в данном количестве систем координат (txParam.numFrames
). Это поле является строкой двоичных знаков или вектор-столбцом длины (txParam.numFrames
x trbBlkSize
). Строка или вектор-столбец зависят от размерности txparam.dataBits
. Размер по умолчанию является вектор-столбцом длины txParam.numFrames
x trbBlkSize
.
ofdmModOut
— Это поле epresents модулятор OFDM выход как вектор-столбец длины (fftLen
+ cpLen
) x txParam.numFrames
x numSymPerFrame
.
OFDMTx
whdlexamples.ofdmTx
функция используется, чтобы сгенерировать форму волны передатчика OFDM с синхронизацией, ссылкой, заголовком, пилотами и сигналами данных. Эта функция возвращает txWaveform
, txGrid
, и диагностика с помощью параметров передатчика 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
— Эта функция восстанавливает информацию о заголовке путем выполнения демодуляции символа, дескремблирования и декодирования. Успешность или неуспешность восстановления информации о заголовке обозначается состоянием CRC. Это состояние CRC восстановления заголовка дано как выход к приемнику, чтобы указать на потерю системы координат или восстановление. Когда проверка CRC перестала работать, состоянием CRC заголовка является 1
. В противном случае это - 0
.
OFDMDataRecovery
— Эта функция выполняет демодуляцию символа, декодирование Viterbi, depuncturing, и дескремблирование. Данные обрабатываются только, когда проверка 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(:)) title('Header Constellation') scatterplot(rxDiagnostics.rxConstellationData(:)) title('Data Constellation');
Receiving process started... Estimating carrier frequency offset ... First four frames are used for carrier frequency offset estimation. Estimated carrier frequency offset is -2.218976e-04 KHz. 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 9m 10.754s
Проверьте 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 Block 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 Block 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');