1 均匀分布产生比特序列 c
2 将比特序列映射成 N 个 QPSK 信号 x = (x1; x2; · · · ; xN)
![image.png](https://cdn.nlark.com/yuque/0/2020/png/1238082/1593442465000-41b06f38-92ae-4ccb-9619-eb791ac70ec9.png#align=left&display=inline&height=24&margin=%5Bobject%20Object%5D&name=image.png&originHeight=40&originWidth=772&size=24179&status=done&style=none&width=463)<br /> ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1238082/1593440507045-9a87e076-ccdd-483c-ac5b-f01b5df9e246.png#align=left&display=inline&height=144&margin=%5Bobject%20Object%5D&name=image.png&originHeight=251&originWidth=917&size=263949&status=done&style=none&width=525)<br /> ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1238082/1593440547878-736f31db-67dd-439e-9ccb-ecbaf8b690bf.png#align=left&display=inline&height=282&margin=%5Bobject%20Object%5D&name=image.png&originHeight=563&originWidth=657&size=51256&status=done&style=none&width=328.5)
len = 100000; %测试的len对比特数(长度:len*2)
%%%%%%%%%%%%% 产生比特序列 %%%%%%%%%%%%%
data=randi([0 1],1, len*2); %产生随机的01比特序列(1X(len*2)的矩阵)
%按序列下标奇数偶数分割序列
a1=data(1:2:length(data)); %下标为奇数作为信号序列的实部
b1=data(2:2:length(data)); %下标为偶数作为信号序列的虚部
s = a1+b1*i; %长度为len
%%%%%%%%%%%%% 将比特序列映射成N个QPSK信号 %%%%%%%%%%%%%
q1=0+0*i; %5pi/4
q2=0+1*i; %3pi/4
q3=1+1*i; %pi/4
q4=1+0*i; %7pi/4
sig=zeros(1,len); % sig表示原始信号(1Xlen)
for i=1: len %将比特序列映射成QPSK信号
x=sqrt(2)/2; y=sqrt(2)/2;
if (s(i)==q1)
sig(i)=-x-y*1i;
end
if (s(i)==q2)
sig(i)=-x+y*1i;
end
if (s(i)==q3)
sig(i)=x+y*1i;
end
if (s(i)==q4)
sig(i)=x-y*1i;
end
end
1.1产生01序列
Matlab randint()函数用法https://blog.csdn.net/yimixgg/article/details/87875103
MATLAB中randint与randi的区别
%%新函数2randi([0,1],2,1)-1等价于老函数2randint(2,1)-1
函数形式:randi([imin,imax],m,n)
参数解释:
[imin,imax]表示生成的伪随机数为闭区间[imin,imax]上的所有整数
m,n表示生成伪随机矩阵是m*n维
3.产生 N 个噪声序列 z = (z1; z2; · · · ; zN) 及瑞利信道衰落序列 h = (h1; h2; · · · ; hN)
![image.png](https://cdn.nlark.com/yuque/0/2020/png/1238082/1593442632687-2ff2ff2f-d027-4338-9b74-ad45ad03b8f0.png#align=left&display=inline&height=66&margin=%5Bobject%20Object%5D&name=image.png&originHeight=117&originWidth=791&size=57322&status=done&style=none&width=448)<br /> ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1238082/1593442746827-01f89634-8223-4a32-a7e9-05f3b8280b83.png#align=left&display=inline&height=55&margin=%5Bobject%20Object%5D&name=image.png&originHeight=110&originWidth=710&size=30147&status=done&style=none&width=355)
4 收到序列 Y= (y1; y2; · · · ; yN)
%%%%%%%%%%%%% 产生噪声序列z、瑞利信道衰落序列H。合成发送信号序列Y %%%%%%%%%%%%%
SNR_db = (0:30); %SNR取值0~30
for p=1:31 %循环31个SNR
error=0;%错误的个数
SNR_w=10.^(SNR_db(p)/10); %单位转换:dB转w
noisePower=1/SNR_w; %noisePower=Sigma^2
z = sqrt(noisePower/2)* (randn(1,length(sig)) + 1i*randn(1,length(sig))); %产生高斯噪声序列z
H = sqrt(1/2)*(randn(1,length(sig)) + 1i*randn(1,length(sig)));%产生瑞利信道衰落序列H
Y = sig.*H+z; %合成发送信号序列Y
3.1matlab产生复高斯分布
![image.png](https://cdn.nlark.com/yuque/0/2020/png/1238082/1593442864821-d91cf5b7-88b3-42a5-bc03-268de5315491.png#align=left&display=inline&height=76&margin=%5Bobject%20Object%5D&name=image.png&originHeight=121&originWidth=684&size=20118&status=done&style=none&width=432)<br />高斯噪声(方差=Sigma^2)<br />瑞利信道(方差=1)![image.png](https://cdn.nlark.com/yuque/0/2020/png/1238082/1593443059530-c170b90b-864b-4713-9c74-014a407fedf8.png#align=left&display=inline&height=36&margin=%5Bobject%20Object%5D&name=image.png&originHeight=53&originWidth=374&size=14006&status=done&style=none&width=253)
3.2矩阵叉乘、点乘
5.利用最小欧式距准则检测符号序列 x^
6 解映射恢复比特序列 c^
7 统计错误比特数 num BE,则 BER = num2NBE
![image.png](https://cdn.nlark.com/yuque/0/2020/png/1238082/1593443497264-02f38530-66b8-48fa-8f48-a537a073afa1.png#align=left&display=inline&height=175&margin=%5Bobject%20Object%5D&name=image.png&originHeight=279&originWidth=817&size=82116&status=done&style=none&width=511)
for t = 1: len %循环所有的信号
for w = 1:4 % 检查距离
distance(w) = norm(Y(t) - H(t)*text(w))^2;%接收到的信号到所有星座点的距离
end
position= find(distance == min(distance));%找到最小距离的的位置
detect(t) = text(position); %解调后的符号
if (detect(t)~= sig(t)) %计算错误个数
error = error + 1;
end
end
BEP(p) = error/ len; %QPSK仿真的误码率
8.根据不同 SNR 统计相应 BER,并画 BER 曲线
semilogy(SNR_db,BEP,'b*-','linewidth',2) %semilogy函数实现单轴对数坐标转换
grid on
xlabel('SNR(dB)') %x轴标题
ylabel('BEP') %y轴标题
title('Bit error probability for differnet SNR'); %图片标题
8.1 semilogy函数
拟合函数:实现单轴对数坐标转换,使曲线看起来更平滑
https://ww2.mathworks.cn/help/matlab/ref/semilogy.html
自然状态下,用plot画的是折线,而不是平滑曲线。
有两种方法可以画平滑曲线,第一种是拟合的方法,第二种是用spcrv,其实原理应该都一样就是插值。
用loglog函数可以实现双对数坐标转换,用semilogx和semilogy函数可以实现单轴对数坐标转换。
clc;clear;close all;
x = 0:.1:10;
y = 2*x+3;
z=log(2*x+3);
subplot(311);
plot(x,y);
title('plot(x,y)');
grid on
subplot(312);
semilogy(x,y);
title('semilogy(x,y)');
grid on
subplot(313);
plot(x,z);
title('plot(x,log(y))');
grid on
第二个图和第三个图的曲线其实是一致的。semilogy函数其实是对坐标轴数据的改变,将第三个图的y坐标改成了第一图的数据,这样生成了第二个图,也就是semilogy的图。
简单来说,就是第二个图,是第三个图的曲线+第一个图的纵坐标,即semilogy函数。
大作业:
subplot(211);
plot(SNR_db,BEP);
title('plot(x,y)');
grid on
subplot(212);
semilogy(SNR_db,BEP);
title('semilogy(x,y)');
grid on
9.总
clc;
close all;
len = 10000; %测试的len对比特数(长度:len*2)
%%%%%%%%%%%%% 产生比特序列 %%%%%%%%%%%%%
data=randi([0 1],1, len*2); %产生随机的01比特序列
%按序列下标奇数偶数分割序列
a1=data(1:2:length(data)); %下标为奇数作为信号序列的实部
b1=data(2:2:length(data)); %下标为偶数作为信号序列的虚部
s = a1+b1*i; %长度为len
%%%%%%%%%%%%% 将比特序列映射成N个QPSK信号 %%%%%%%%%%%%%
q1=0+0*i; %5pi/4
q2=0+1*i; %3pi/4
q3=1+1*i; %pi/4
q4=1+0*i; %7pi/4
sig=zeros(1,len); % sig表示原始信号
for i=1: len %将比特序列映射成QPSK信号
x=sqrt(2)/2; y=sqrt(2)/2;
if (s(i)==q1)
sig(i)=-x-y*1i;
end
if (s(i)==q2)
sig(i)=-x+y*1i;
end
if (s(i)==q3)
sig(i)=x+y*1i;
end
if (s(i)==q4)
sig(i)=x-y*1i;
end
end
distance=zeros(4,1); %表示距离
detect=zeros(len,1); %检测值
BEP=zeros(1,length(SNR_db)); %表示不同信噪比下的误码率
text =zeros(4,1); %理论上的发射机星座点
text(1)=-(sqrt(2)/2)-1i*(sqrt(2)/2);
text(2)=-(sqrt(2)/2)+1i*(sqrt(2)/2);
text(3)=(sqrt(2)/2)+1i*(sqrt(2)/2);
text(4)=(sqrt(2)/2)-1i*(sqrt(2)/2);
%%%%%%%%%%%%% 产生噪声序列z、瑞利信道衰落序列H。合成发送信号序列Y %%%%%%%%%%%%%
SNR_db = (0:30); %SNR取值0~30
for p=1:31 %循环31个SNR
error=0;%错误的个数
SNR_w=10.^(SNR_db(p)/10); %单位转换:dB转w
noisePower=1/SNR_w; %noisePower=Sigma^2
z = sqrt(noisePower/2)* (randn(1,length(sig)) + 1i*randn(1,length(sig))); %产生高斯噪声序列z
H = sqrt(1/2)*(randn(1,length(sig)) + 1i*randn(1,length(sig)));%产生瑞利信道衰落序列H
Y = sig.*H+z; %合成发送信号序列Y
%%%%%%%%%%%%% 用最小欧式距准则检测符号序列 %%%%%%%%%%%%%
for t = 1: len %循环所有的信号
for w = 1:4 % 检查距离
distance(w) = norm(Y(t) - H(t)*text(w))^2;%接收到的信号到所有星座点的距离
end
position= find(distance == min(distance));%找到最小距离的的位置
detect(t) = text(position); %解调后的符号
if (detect(t)~= sig(t)) %计算错误个数
error = error + 1;
end
end
BEP(p) = error/ len; %QPSK仿真的误码率
end
%%%%%%%%%%%%% 画图 %%%%%%%%%%%%%%%
semilogy(SNR_db,BEP,'b*-','linewidth',2) %semilogy函数实现单轴对数坐标转换
grid on
xlabel('SNR(dB)') %x轴标题
ylabel('BEP') %y轴标题
title('Bit error probability for differnet SNR'); %图片标题