% QPSK SER/BER simulation in Rayleigh fading channels
clc;
close all;
clear all;
nSims=100; % Number of simulation runs per SNR
EbN0dB=0:2:20; % Eb/N0 [in dB]
dataLen=100; % Number of symbols to transmit per simulation run
const.s = [1 j -1 -j]; % Signal constellation
const.map = [0 1 3 2]; % Bit to symbol mapping
M = length(const.s); % Lenght of signal constellation
Eb = 1/log2(M); % Energy per bit
rndData = zeros(1,dataLen*log2(M)); % Source bits
modData = zeros(1,dataLen); % Modulated Symbols
gNoise = zeros(1,dataLen); % Additive white gaussian noise
detData = zeros(1,dataLen); % Detected symbols
detDat = zeros(1,dataLen*log2(M)); % Detected bits
simBER = 0;
dimSER = 0;
avgBER = zeros(1,length(EbN0dB)); % Average BER
avgSER = zeros(1,length(EbN0dB)); % Average SER
for nSnr=1:length(EbN0dB)
N0 = Eb/db2lin(EbN0dB(nSnr)); % N0 for noise
sigma = sqrt(N0/2); % Noise variance (N0/2)
simSER=0;
simBER=0;
for nIter=1:nSims
rndData = round(rand(1,dataLen*log2(M))); % Generate random source bits
km=1;
for k=1:log2(M):dataLen*log2(M)
decDat = 2*rndData(k) + rndData(k+1); % Make symbols
modData(km) = const.s(find(const.map==decDat)); % Map bits-to-symbols
km = km + 1;
end
gNoise = (sigma) * (randn(1,dataLen) + j *randn(1,dataLen)); % Generate AWGN
h = sqrt(1/2) * (randn(1,dataLen) + j*randn(1,dataLen)); % Generate Rayleigh fading
rxData = h.*modData + gNoise; % Make received signal
km=1;
for k=1:dataLen % Maximum Likelihood detection
d1 = sed(h(k)*const.s(1),rxData(k));
d2 = sed(h(k)*const.s(2),rxData(k));
d3 = sed(h(k)*const.s(3),rxData(k));
d4 = sed(h(k)*const.s(4),rxData(k));
[dmin, dminI] = min([d1 d2 d3 d4]);
detData(k) = const.s(dminI);
switch dminI
case 1
st = dec2bin(const.map(1),2);
detDat(km) = str2num(st(1));
detDat(km+1) = str2num(st(2));
case 2
st = dec2bin(const.map(2),2);
detDat(km) = str2num(st(1));
detDat(km+1) = str2num(st(2));
case 3
st = dec2bin(const.map(3),2);
detDat(km) = str2num(st(1));
detDat(km+1) = str2num(st(2));
case 4
st = dec2bin(const.map(4),2);
detDat(km) = str2num(st(1));
detDat(km+1) = str2num(st(2));
end
km = km + log2(M);
end
simBER = simBER + sum(abs(detDat-rndData))/(dataLen*log2(M)); % Calculate BER
simSER = simSER + findSER(detDat, rndData, log2(M)); % Calculate SER
end
avgBER(nSnr) = simBER / nSims; % Average BER
avgSER(nSnr) = simSER / nSims; % Average SER
prntMsg = sprintf('Done SNR = %g, @ BER = %g\n',EbN0dB(nSnr),avgBER(nSnr));
disp(prntMsg);
end
% Plotting
semilogy(EbN0dB,avgBER,'-ro'); grid on; hold on;
semilogy(EbN0dB,avgSER,'-bs'); grid on; hold on;
xlabel('EbN0 [dB]');
ylabel('Average Error Probability');
title('QPSK Rayleigh fading');
legend({'BER','SER'},1);
simQPSK.zip_Sybol_random_simulate qpsk
版权申诉
53 浏览量
2022-07-15
03:04:09
上传
评论
收藏 2KB ZIP 举报
钱亚锋
- 粉丝: 88
- 资源: 1万+
最新资源
- IMG_0694.GIF
- 基于图像的三维模型重建C++源代码+文档说明(高分课程设计)
- 基于聚焦法的工件立体测量方案,根据数据进行三维重建 使用HALCON处理图像,MATLAB拟合数据+源代码+数据集+效果图
- 锄战三国村 修改:货币使用不减 v1.10(2) 原创 (中文).apk
- 基于python实现的单目双目视觉三维重建+源代码+图像图片(高分课程设计)
- 基于C+++OPENCV的全景图像拼接源码(课程设计)
- 基于Python+OpenCV对多张图片进行全景图像拼接,消除鬼影,消除裂缝+源代码+文档说明+界面截图(高分课程设计)
- 基于C++实现的全景图像拼接源码(课程设计)
- 基于SIFT特征点提取和RASIC算法实现全景图像拼接python源码+文档说明+界面截图+详细注释(95分以上课程大作业)
- 基于matlab实现眼部判别的疲劳检测系统+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈