Лаб. 4
.docxМинистерство Цифрового Развития, Связи и Массовых Коммуникаций Российской Федерации Федеральное Государственное Бюджетное Образовательное Учреждение Высшего Образования Ордена Трудового Красного знамени «Московский технический университет связи и информатики»
Кафедра Информационная Безопасность
Лабораторный практикум №5
Снижение вычислительной сложности алгоритмов демодуляции
Москва, 2021
Цель работы: получить навыки работы с программой MATLAB, ознакомиться с различными способами снижения вычислительной сложности алгоритмов.
Код программы:
clc;
clear;
SNR=1:2:50;
Modulator = comm.PSKModulator('ModulationOrder', 4,'BitInput', true, 'PhaseOffset', 0);
Demodulator = comm.PSKDemodulator('ModulationOrder', 4,'BitOutput', true, 'PhaseOffset', 0);
res(2, Modulator, Demodulator, SNR)
function result = res(bits, Modulator, Demodulator, SNR)
N = 4;
M = 4;
rang = min(N, M);
SNR_linear=10.^(SNR/10);
noiseVar = 1./SNR_linear;
allBits = de2bi(0:2^(bits* N)-1, 'left-msb')';
allTrans = reshape(step(Modulator, allBits(:)), N, 2^(bits* N));
result_zf=zeros(1, length(SNR));
result_mmse=zeros(1, length(SNR));
result_ml=zeros(1, length(SNR));
result1=zeros(1,20);
result2=zeros(1,20);
result3=zeros(1,20);
n = 1;
for n=1:length(SNR)
disp(n);
nn = 1;
for nn=1:1000
numErr_zf=0;
numErr_mmse=0;
numErr_ml=0;
numBits_zf=0;
numBits_mmse=0;
numBits_ml=0;
while numErr_zf<10 && numBits_zf<1e5
msg =randi([0 1],[N * bits, 1]);
symbol_msg = step(Modulator, msg);
H = (randn(M, N)+1i* randn(M, N))/sqrt(2);
y_ZF = awgn(H* symbol_msg, SNR(n),'measured');
H_decorr_ZF = pinv(H);
demodulate_msg_ZF = step(Demodulator, H_decorr_ZF* y_ZF);
[count1 probability1] = biterr(msg, demodulate_msg_ZF);
numErr_zf = numErr_zf+count1;
numBits_zf = numBits_zf+(N* bits);
end
while numErr_mmse<10 && numBits_mmse<1e5
msg =randi([0 1],[N * bits, 1]);
symbol_msg = step(Modulator, msg);
H = (randn(M, N)+1i* randn(M, N))/sqrt(2);
y_MMSE=awgn(H* symbol_msg, SNR(n),'measured');
H_mmse = (H'*H + noiseVar(n)*eye(N)) \ H';
demodulate_msg_mmse = step(Demodulator, H_mmse* y_MMSE);
[count2 probability2] = biterr(msg, demodulate_msg_mmse);
numErr_mmse = numErr_mmse+count2;
numBits_mmse = numBits_mmse+(N* bits);
end
while numErr_ml<10 && numBits_ml<1e5
msg =randi([0 1],[N * bits, 1]);
symbol_msg = step(Modulator, msg);
H = (randn(M, N)+1i* randn(M, N))/sqrt(2);
y = awgn(H* symbol_msg, SNR(n),'measured');
[~, k] = min(sum(abs(repmat(y,[1, 2 ^ (bits * N)]) - H* allTrans).^2));
estML = allBits(:, k);
[count3 probability3] = biterr(msg, estML);
numErr_ml = numErr_ml+count3;
numBits_ml = numBits_ml+(N* bits);
end
result1(nn)=numErr_zf/numBits_zf;
result2(nn)=numErr_mmse/numBits_mmse;
result3(nn)=numErr_ml/numBits_ml;
nn = nn + 1;
end
result_zf(n) = sum(result1)/20;
result_mmse(n) = sum(result2)/20;
result_ml(n) = sum(result3)/20;
n = n + 1;
end
semilogy(SNR, result_zf)
hold on
semilogy(SNR, result_mmse)
semilogy(SNR, result_ml)
grid on
xlabel('SNR, dB');
ylabel('BER');
end
Рисунок 1. График зависимости BER от ОСШ
Вывод: наиболее помехоустойчивым методом демодуляции является ML, однако он проигрывает алгоритмам ZF и MMSE по вычислительной сложности. Наиболее оптимальным вариантом является использование метода MMSE (МСКО) – при равной ZF вычислительной сложности, он выигрывает по помехоустойчивости.