Модулируйте и демодулируйте потоковые выборки OFDM

Эта модель примера показывает, как использовать блоки OFDM Modulator и OFDM Demodulator. В этой модели модулятор OFDM и блок демодулятора OFDM соединяются друг с другом. Исходный параметр параметров OFDM в этих блоках установлен в Input port, что позволяет динамически изменять входные значения этих блоков. Изменить эти значения можно с помощью скрипта в этом примере. Эти блоки поддерживают скалярные и векторные входы. Чтобы проверить функциональность этих блоков, вход, предоставленный блоку OFDM Modulator, сравнивается с выходом блока OFDM Demodulator. HDL-подсистема OFDMModDemod в этой модели примера поддерживает генерацию HDL-кода.

Установите параметры входных данных

Настройте эти переменные рабочей области для модели, которая будет использоваться. Эти значения можно изменить в соответствии с вашими требованиями. Пример модели использует эти переменные рабочей области dataIn, validIn, fftLen, maxFFTLen, cpLen, numLG, numRG, numSymb, и DCNull конфигурирование блоков модулятора OFDM и демодулятора OFDM.

fftLen = 64;
maxFFTLen = 128;
cpLen = 16;
numLG = 6;
numRG = 5;
numSymb = 2;
DCNull = 1; % 1 or 0
vecLen = 8; % 1, 2, 4, 8, 16, 32, or 64
if DCNull==1
    numActData = fftLen - (numLG+numRG+1);
else
    numActData = fftLen - (numLG+numRG);
end

Сгенерируйте Входные данные системы координат

Сгенерируйте случайные системы координат комплексных входных данных и управляющего сигнала, который указывает контуры системы координат.

rng default;
dataIn = complex(randn(numActData*numSymb,1),randn(numActData*numSymb,1));
dataVec = []; % Store data arranged in vector form
presentSymbDataStartIndex = 0;
for ii = 1:numSymb
    counter = 0;
    for jj = 1:ceil(numActData/vecLen)
        if jj == ceil(numActData/vecLen)
            numZerosTobeAppended = vecLen - (numActData-counter);
            dataVec = [dataVec [dataIn(presentSymbDataStartIndex+counter+(1:vecLen-numZerosTobeAppended));zeros(1,numZerosTobeAppended).']];
        else
            dataVec = [dataVec dataIn(presentSymbDataStartIndex+counter+(1:vecLen))];
        end
        counter = counter + vecLen;
    end
    presentSymbDataStartIndex = presentSymbDataStartIndex + numActData;
end

data = dataVec.';
valid = boolean(ones(size(data,1),1)); % Valid signal generation

sampling_time = 1;
stoptime = maxFFTLen*6*numSymb;

Запуск модели Simulink ®

Запустите модель, чтобы импортировать переменные входного сигнала dataIn, validIn, fftLen, maxFFTLen, cpLen, numLG, numRG, numSymb, и DCNull из рабочей области в блок OFDM Modulator. Блок OFDM Modulator возвращает OFDM-модулированные выходные выборки и управляющий сигнал. Эти OFDM-модулированные выборки подаются на блок OFDM Demodulator, который возвращает OFDM демодулированные выборки.

open_system('genhdlOFDMModDemodExample')
sim('genhdlOFDMModDemodExample');

% Store valid data from Simulink model
dataOut1 = dataOut.data;
simOut = dataOut1(:,:,validOut);
simOut = simOut(:);

Сравнение входов модулятора OFDM с выходами демодулятора OFDM

Сравните входные данные, предоставленные блоку OFDM Modulator, с выходными данными, сгенерированными блоком OFDM Demodulator.

figure('units','normalized','outerposition',[0 0 1 1])
subplot(2,1,1);
plot(real(dataIn(1:size(simOut))));
hold on
plot(squeeze(real(simOut)));
legend('Real part of reference data','Real part of demodulated data');
title('Comparison of OFDM Modulator Input with OFDM Demodulator Output - Real Part');
xlabel('OFDM Subcarriers');
ylabel('Real Part');

subplot(2,1,2)
plot(imag(dataIn(1:size(simOut))));
hold on
plot(squeeze(imag(simOut)))
legend('Imaginary part of reference data','Imaginary part of demodulated data');
title('Comparison of OFDM Modulator Input with OFDM Demodulator Output - Imaginary Part');
xlabel('OFDM Subcarriers');
ylabel('Imaginary Part');

См. также

Блоки