老师布置的作业,在网上四处搜索,稍作修改后学习总结如下,仅供个人学习参考使用:
一、
0:公共信息,假设qpsk调制解调的映射图为下图,
close all
clear
sum=20;
data= randsrc(sum,2,[0 1]); %使用[0 1]生成20 * 2随机矩阵,sum行,2列
[a1,b1]=find(data(:,1)==0&data(:,2)==0); %find返回返回不为0的元素的位置索引
%[a1,b1]为矩阵中非零元素的行和列的索引值
message(a1)=-1-j; % map [ 0 0] to 225° %把message的第a1行的数据写为-1-j
[a2,b2]=find(data(:,1)==0&data(:,2)==1);
message(a2)=-1+j; % map [ 0 1] to 135°
[a3,b3]=find(data(:,1)==1&data(:,2)==0);
message(a3)=1-j; % map [ 1 0] to 275°
[a4,b4]=find(data(:,1)==1&data(:,2)==1);
message(a4)=1+j;% map [ 1 1] to 45°
disp(message);
scatterplot(message);
axis([-1.2,1.2,-1.2,1.2]);
title('qpsk的星座图');
clear all
n=40;
bit=randint(1,n);%随机产生0 1
s=reshape(bit,20,2);%分成两列
%调制
for i=1:20
y(i)=cos(pi+s(i,1)*pi)+j*sin((3/2)*pi+s(i,2)*pi);%加pi改变了iq向量图的位移
end
disp(y);
scatterplot(y);%散点图
title('发射信号星座图');xlabel('同相分量');ylabel('正交分量');
运行结果
(3)使用MATLAB自带的pskmod函数,星型星座图,调制后复数为0.7071 + 0.7071i 这种(但是结果是四十个复数??)
clear all;
msg = randi([0,1],1,40); % 40个随机0/1 ,生成(1 x 40)的[0, 1]的随机数
figure(1);stem(msg);
msg1 = pskmod(msg,4,pi/4); % 4psk调制 初始相位为 pi/4
disp(msg1);
scatterplot(msg1); axis([-1.2,1.2,-1.2,1.2]);% 画星座图
hold on;
rectangle('Position',[-1, -1, 2, 2],'Curvature',[1, 1]);axis equal; % 画圆
运行结果
2. 依旧还是上述那40bit,调制得到20个符号后,假定每个符号的发射时间间隔为50us,进一步通过2条多径,多径信息为,功率:【0 0】dB,时延为:【0 100】us,试求出接收端此时得到的接收复数值,并在I/Q平面上标出复数位置,并与1的结果对比,理解多径产生码间干扰的过程。
(1)在通信上码间干扰就是卷积,卷积是线性叠加。根据题意,发射时间间隔是50,第二个时延是100,就相当于是间隔两个单位的卷积。将第一题的代码融合了一下,如下:
%多径产生码间干扰
clear
sum=10000;
data= randsrc(sum,2,[0 1]); %使用[0 1]生成20 * 2随机矩阵
%调制
for i=1:20
message(i)=cos(pi+data(i,1)*pi)+j*sin((3/2)*pi+data(i,2)*pi);%加pi改变了iq向量图的位移
end
scatterplot(message); axis([-2,2,-2,2]); title('发射信号星座图');
%加多径
w=conv(message,[1 0 1]);%将原信号卷积,时延100,发射间隔50 ,即101,时移为2
scatterplot(w); axis([-3,3,-3,3]); title('多径下接收信号星座图');
(2)运行结果
3. 基于蒙特卡洛统计法,仿真QPSK调制/解调系统,通过高斯白噪声信道的误符号率和误码率曲线,其中SNR范围为:【-10:2:10】dB。~注:为了统计稳定,建议每个snr下,bit数不得少于20000bit。
(1)我也不知道蒙特拉蒙统计法是啥=-=?
%QPSK调制/解调
close all
clear
SNR_DB=[-10:2:10]; %信噪比逐渐提高
sum=10000;
data= randsrc(sum,2,[0 1]); %使用[0 1]生成10000 * 2随机矩阵
% 调制
for i=1:sum
message(i)=cos(pi+data(i,1)*pi)+j*sin((3/2)*pi+data(i,2)*pi);%加pi改变了iq向量图的位移
end
%加噪
i=0;
for SNR = -10:2:10
i=i+1;
%在原始信号中添加高斯白噪声
receive = awgn(message,SNR);
resum=0;
total=0;
m1=find(angle(receive)<=pi/2&angle(receive)>0); %0~90° :解调[1 1]模式
% find返回不为0的元素的位置索引==>相当于找到0~90°的复数,重新定义
remessage(1,m1)=1+j; %重新定义复数
redata(m1,1)=1; %重新定义数据,以备对照原数据
redata(m1,2)=1; %比如第m1行的两个数都为1
m2= find( angle(receive)>pi/2&angle(receive)<=pi); %解调[0 1]模式
remessage(1,m2)=-1+j;
redata(m2,1)=0;
redata(m2,2)=1;
m3=find( angle(receive)>-pi&angle(receive)<=-pi/2); %解调[0 0]模式
remessage(1,m3)=-1-j;
redata(m3,1)=0;
redata(m3,2)=0;
m4=find( angle(receive)>-pi/2&angle(receive)<=0); %解调[1 0]模式
remessage(1,m4)=1-j;
redata(m4,1)=1;
redata(m4,2)=0;
[resum,ratio1]=symerr(data,redata); % symerr计算符号错误数(相当于bit数,[1,1]逐bit比较的)和符号错误率
pbit(i)=resum/(sum*2); %错误bit数/总bit数,误比特率
[total,ratio2]=symerr(message,remessage); %计算符号错误数和符号错误率([1+j],逐个比较)
pe(i)=total/sum; %错误复数/总复数,误码率
end
%Pe=1-(1-1/2*erfc(sqrt(10.^(SNR_DB/10)/2))).^2;
%Pbit=1/2*erfc(sqrt(10.^(SNR_DB/10)/2));
figure(3);
%semilogy(SNR_DB,pe,':s',SNR_DB,Pe,'-*',SNR_DB,pbit,'-o',SNR_DB,Pbit,':+');
%legend('QPSK仿真误码率','QPSK理论误码率','QPSK仿真误比特率','QPSK理论误比特率',1);
semilogy(SNR_DB,pe,':s',SNR_DB,pbit,'-o');
legend('QPSK仿真误码率','QPSK仿真误比特率',1);
xlabel('信噪比/dB');
ylabel('概率P');
grid on
(2)运行结果
.进一步,假如QPSK调制信号先通过2中定义的多径信道,然后再通过3中定义的高斯噪声,试重新仿真此时的误块率和误码率曲线。
(1)把二三题结合了一下,我也不知道结果对不对
%多径,噪声
close all
clear
sum =10000;
data= randsrc(sum,2,[0 1]); %使用[0 1]生成1000 * 2随机矩阵
message=[];
rec1message=[];
%调制
for i=1:sum
message(i)=cos(pi+data(i,1)*pi)+j*sin((3/2)*pi+data(i,2)*pi);%加pi改变了iq向量图的位移
recmessage=conv(message,[1 0 1]); %将原信号卷积,时延100,发射间隔50 ,即101,时移为2
rec1message=[rec1message,recmessage(i)]; %按行存储
end
scatterplot(message); axis([-2,2,-2,2]); title('发射信号星座图');
scatterplot(rec1message); axis([-3,3,-3,3]); title('多径接收信号星座图');
%加噪
i=0;
for SNR = -10:2:10
i=i+1;
%在原始信号中添加高斯白噪声
receive = awgn(message,SNR);
resum=0;
total=0;
m1=find(angle(receive)<=pi/2&angle(receive)>0); %解调[1 1]模式
remessage(1,m1)=1+j;
redata(m1,1)=1;
redata(m1,2)=1;
m2= find( angle(receive)>pi/2&angle(receive)<=pi); %解调[0 1]模式
remessage(1,m2)=-1+j;
redata(m2,1)=0;
redata(m2,2)=1;
m3=find( angle(receive)>-pi&angle(receive)<=-pi/2); %解调[0 0]模式
remessage(1,m3)=-1-j;
redata(m3,1)=0;
redata(m3,2)=0;
m4=find( angle(receive)>-pi/2&angle(receive)<=0); %解调[1 0]模式
remessage(1,m4)=1-j;
redata(m4,1)=1;
redata(m4,2)=0;
[resum,ratio1]=symerr(data,redata); % 'symerr'计算符号错误数和符号错误率
pbit(i)=resum/(sum*2); %10000个符号-> 20000个位QPSK:每个符号2个bit位
[total,ratio2]=symerr(message,remessage); %计算符号错误数和符号错误率
pe(i)=total/sum; %根据定义计算
end
%Pe=1-(1-1/2*erfc(sqrt(10.^(SNR_DB/10)/2))).^2; %计算理论误码率
%Pbit=1/2*erfc(sqrt(10.^(SNR_DB/10)/2)); %计算理论误比特率
figure;
%semilogy(SNR_DB,pe,':s',SNR_DB,Pe,'-*',SNR_DB,pbit,'-o',SNR_DB,Pbit,':+')
%legend('QPSK仿真误码率','QPSK理论误码率','QPSK仿真误比特率','QPSK理论误比特率',1)
semilogy(SNR_DB,pe,':s',SNR_DB,pbit,'-o');
legend('QPSK仿真误码率','QPSK仿真误比特率',1);
xlabel('信噪比/dB')
ylabel('概率P')
grid on
二、另一个同学做的作业
(1)一二题
clc
clear all
len = 40;
bitStream = randi([0 1], 1, len);
qpskMod = [];
for i=1:2:len
if bitStream(i) == 0
if bitStream(i + 1) == 0
qpskMod = [qpskMod exp(j * 5 * pi / 4)];
else
qpskMod = [qpskMod exp(j * 3 * pi / 4)];
end
else
if bitStream(i + 1) == 0
qpskMod = [qpskMod exp(j * 7 * pi / 4)];
else
qpskMod = [qpskMod exp(j * pi / 4)];
end
end
end
scatterplot(qpskMod);
title('发射信号星座图');xlabel('同相分量');ylabel('正交分量');
qpskMod1 = conv(qpskMod,[1 0 1]);
for i=1:len/2
out(i) = qpskMod1(i);
end
scatterplot(out);
title('接收信号星座图');
xlabel('同相分量');ylabel('正交分量');
clc
clear
len = 20000; M = 4;
bitStream = randi([0 1], 1, len);
qpskMod = [];
for i=1:2:len
if bitStream(i) == 0
if bitStream(i + 1) == 0
qpskMod = [qpskMod exp(j * 5 * pi / 4)];
else
qpskMod = [qpskMod exp(j * 3 * pi / 4)];
end
else
if bitStream(i + 1) == 0
qpskMod = [qpskMod exp(j * 7 * pi / 4)];
else
qpskMod = [qpskMod exp(j * pi / 4)];
end
end
end
scatterplot(qpskMod);
title('发射信号星座图');xlabel('同相分量');ylabel('正交分量');
for SNR = -10:2:10
qpskMod1 = conv(qpskMod,[1 0 1]);
for i=1:len/2
out(i) = qpskMod1(i);
end
qpskDemod = awgn(out,SNR);
bitStreamDemod = [];
for i=1:length(qpskDemod)
if real(qpskDemod(i)) >= 0
if imag(qpskDemod(i)) >= 0
bitStreamDemod = [bitStreamDemod 1 1];
else
bitStreamDemod = [bitStreamDemod 1 0];
end
else
if imag(qpskDemod(i)) >= 0
bitStreamDemod = [bitStreamDemod 0 1];
else
bitStreamDemod = [bitStreamDemod 0 0];
end
end
end
scatterplot(qpskDemod); hold on;axis;
title(['SNR = ',num2str(SNR)])
xlabel('同相分量');ylabel('正交分量');
figure(13)
[errorBit,BER] = biterr(bitStream,bitStreamDemod,log2(M));
[errorSym,SER] = symerr(bitStream,bitStreamDemod);
hold on;
semilogy(SNR,BER,'-r*',SNR,SER,'-b*');
legend('BER','SER');
title('QPSK在AWGN信道下的性能');
xlabel('信噪比(dB)');ylabel('误符号率和误比特率');
end
参考博客如下: