单发射单接受
image.png

1 均匀分布产生比特序列 c

2 将比特序列映射成 N 个 QPSK 信号 x = (x1; x2; · · · ; xN)

  1. ![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)
  1. len = 100000; %测试的len对比特数(长度:len*2
  2. %%%%%%%%%%%%% 产生比特序列 %%%%%%%%%%%%%
  3. data=randi([0 1],1, len*2); %产生随机的01比特序列(1X(len*2)的矩阵)
  4. %按序列下标奇数偶数分割序列
  5. a1=data(1:2:length(data)); %下标为奇数作为信号序列的实部
  6. b1=data(2:2:length(data)); %下标为偶数作为信号序列的虚部
  7. s = a1+b1*i; %长度为len
  8. %%%%%%%%%%%%% 将比特序列映射成NQPSK信号 %%%%%%%%%%%%%
  9. q1=0+0*i; %5pi/4
  10. q2=0+1*i; %3pi/4
  11. q3=1+1*i; %pi/4
  12. q4=1+0*i; %7pi/4
  13. sig=zeros(1,len); % sig表示原始信号(1Xlen)
  14. for i=1: len %将比特序列映射成QPSK信号
  15. x=sqrt(2)/2; y=sqrt(2)/2;
  16. if (s(i)==q1)
  17. sig(i)=-x-y*1i;
  18. end
  19. if (s(i)==q2)
  20. sig(i)=-x+y*1i;
  21. end
  22. if (s(i)==q3)
  23. sig(i)=x+y*1i;
  24. end
  25. if (s(i)==q4)
  26. sig(i)=x-y*1i;
  27. end
  28. 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)

  1. ![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) image.png

  1. %%%%%%%%%%%%% 产生噪声序列z、瑞利信道衰落序列H。合成发送信号序列Y %%%%%%%%%%%%%
  2. SNR_db = (0:30); %SNR取值0~30
  3. for p=1:31 %循环31SNR
  4. error=0;%错误的个数
  5. SNR_w=10.^(SNR_db(p)/10); %单位转换:dBw
  6. noisePower=1/SNR_w; %noisePower=Sigma^2
  7. z = sqrt(noisePower/2)* (randn(1,length(sig)) + 1i*randn(1,length(sig))); %产生高斯噪声序列z
  8. H = sqrt(1/2)*(randn(1,length(sig)) + 1i*randn(1,length(sig)));%产生瑞利信道衰落序列H
  9. Y = sig.*H+z; %合成发送信号序列Y

3.1matlab产生复高斯分布

  1. ![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矩阵叉乘、点乘

image.png

5.利用最小欧式距准则检测符号序列 x^

6 解映射恢复比特序列 c^

7 统计错误比特数 num BE,则 BER = num2NBE

  1. ![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)
  1. for t = 1: len %循环所有的信号
  2. for w = 1:4 % 检查距离
  3. distance(w) = norm(Y(t) - H(t)*text(w))^2;%接收到的信号到所有星座点的距离
  4. end
  5. position= find(distance == min(distance));%找到最小距离的的位置
  6. detect(t) = text(position); %解调后的符号
  7. if (detect(t)~= sig(t)) %计算错误个数
  8. error = error + 1;
  9. end
  10. end
  11. BEP(p) = error/ len; %QPSK仿真的误码率

8.根据不同 SNR 统计相应 BER,并画 BER 曲线

  1. semilogy(SNR_db,BEP,'b*-','linewidth',2) %semilogy函数实现单轴对数坐标转换
  2. grid on
  3. xlabel('SNR(dB)') %x轴标题
  4. ylabel('BEP') %y轴标题
  5. title('Bit error probability for differnet SNR'); %图片标题

8.1 semilogy函数

拟合函数:实现单轴对数坐标转换,使曲线看起来更平滑
https://ww2.mathworks.cn/help/matlab/ref/semilogy.html

自然状态下,用plot画的是折线,而不是平滑曲线。

有两种方法可以画平滑曲线,第一种是拟合的方法,第二种是用spcrv,其实原理应该都一样就是插值。
用loglog函数可以实现双对数坐标转换,用semilogx和semilogy函数可以实现单轴对数坐标转换。

  1. clc;clear;close all;
  2. x = 0:.1:10;
  3. y = 2*x+3;
  4. z=log(2*x+3);
  5. subplot(311);
  6. plot(x,y);
  7. title('plot(x,y)');
  8. grid on
  9. subplot(312);
  10. semilogy(x,y);
  11. title('semilogy(x,y)');
  12. grid on
  13. subplot(313);
  14. plot(x,z);
  15. title('plot(x,log(y))');
  16. grid on

image.png
第二个图和第三个图的曲线其实是一致的。semilogy函数其实是对坐标轴数据的改变,将第三个图的y坐标改成了第一图的数据,这样生成了第二个图,也就是semilogy的图。
简单来说,就是第二个图,是第三个图的曲线+第一个图的纵坐标,即semilogy函数。

大作业:

  1. subplot(211);
  2. plot(SNR_db,BEP);
  3. title('plot(x,y)');
  4. grid on
  5. subplot(212);
  6. semilogy(SNR_db,BEP);
  7. title('semilogy(x,y)');
  8. grid on

image.png

9.总

  1. clc;
  2. close all;
  3. len = 10000; %测试的len对比特数(长度:len*2
  4. %%%%%%%%%%%%% 产生比特序列 %%%%%%%%%%%%%
  5. data=randi([0 1],1, len*2); %产生随机的01比特序列
  6. %按序列下标奇数偶数分割序列
  7. a1=data(1:2:length(data)); %下标为奇数作为信号序列的实部
  8. b1=data(2:2:length(data)); %下标为偶数作为信号序列的虚部
  9. s = a1+b1*i; %长度为len
  10. %%%%%%%%%%%%% 将比特序列映射成NQPSK信号 %%%%%%%%%%%%%
  11. q1=0+0*i; %5pi/4
  12. q2=0+1*i; %3pi/4
  13. q3=1+1*i; %pi/4
  14. q4=1+0*i; %7pi/4
  15. sig=zeros(1,len); % sig表示原始信号
  16. for i=1: len %将比特序列映射成QPSK信号
  17. x=sqrt(2)/2; y=sqrt(2)/2;
  18. if (s(i)==q1)
  19. sig(i)=-x-y*1i;
  20. end
  21. if (s(i)==q2)
  22. sig(i)=-x+y*1i;
  23. end
  24. if (s(i)==q3)
  25. sig(i)=x+y*1i;
  26. end
  27. if (s(i)==q4)
  28. sig(i)=x-y*1i;
  29. end
  30. end
  31. distance=zeros(4,1); %表示距离
  32. detect=zeros(len,1); %检测值
  33. BEP=zeros(1,length(SNR_db)); %表示不同信噪比下的误码率
  34. text =zeros(4,1); %理论上的发射机星座点
  35. text(1)=-(sqrt(2)/2)-1i*(sqrt(2)/2);
  36. text(2)=-(sqrt(2)/2)+1i*(sqrt(2)/2);
  37. text(3)=(sqrt(2)/2)+1i*(sqrt(2)/2);
  38. text(4)=(sqrt(2)/2)-1i*(sqrt(2)/2);
  39. %%%%%%%%%%%%% 产生噪声序列z、瑞利信道衰落序列H。合成发送信号序列Y %%%%%%%%%%%%%
  40. SNR_db = (0:30); %SNR取值0~30
  41. for p=1:31 %循环31SNR
  42. error=0;%错误的个数
  43. SNR_w=10.^(SNR_db(p)/10); %单位转换:dBw
  44. noisePower=1/SNR_w; %noisePower=Sigma^2
  45. z = sqrt(noisePower/2)* (randn(1,length(sig)) + 1i*randn(1,length(sig))); %产生高斯噪声序列z
  46. H = sqrt(1/2)*(randn(1,length(sig)) + 1i*randn(1,length(sig)));%产生瑞利信道衰落序列H
  47. Y = sig.*H+z; %合成发送信号序列Y
  48. %%%%%%%%%%%%% 用最小欧式距准则检测符号序列 %%%%%%%%%%%%%
  49. for t = 1: len %循环所有的信号
  50. for w = 1:4 % 检查距离
  51. distance(w) = norm(Y(t) - H(t)*text(w))^2;%接收到的信号到所有星座点的距离
  52. end
  53. position= find(distance == min(distance));%找到最小距离的的位置
  54. detect(t) = text(position); %解调后的符号
  55. if (detect(t)~= sig(t)) %计算错误个数
  56. error = error + 1;
  57. end
  58. end
  59. BEP(p) = error/ len; %QPSK仿真的误码率
  60. end
  61. %%%%%%%%%%%%% 画图 %%%%%%%%%%%%%%%
  62. semilogy(SNR_db,BEP,'b*-','linewidth',2) %semilogy函数实现单轴对数坐标转换
  63. grid on
  64. xlabel('SNR(dB)') %x轴标题
  65. ylabel('BEP') %y轴标题
  66. title('Bit error probability for differnet SNR'); %图片标题