当前位置:   article > 正文

基础OFDM调制解调系统的matlab误码率仿真,包括4QAM映射,加入删除CP等

qam映射

目录

1. OFDM调制

2. 4QAM映射

3. 循环前缀的添加和删除

4. MATLAB仿真


       正交频分复用(Orthogonal Frequency Division Multiplexing,OFDM)是一种高效的无线通信技术,广泛应用于现代通信系统中,如Wi-Fi、4G/5G蜂窝网络等。OFDM通过将高速数据流分割成多个低速子数据流,并在多个正交子载波上并行传输,从而有效对抗多径衰落和频率选择性衰落。在OFDM系统中,通常还会使用诸如4QAM(4-Quadrature Amplitude Modulation,四元幅度调制)这样的调制方案来增加频谱效率。循环前缀(Cyclic Prefix,CP)的添加和删除是OFDM中的关键步骤,用于消除符号间干扰(Inter-Symbol Interference,ISI)和子载波间干扰(Inter-Carrier Interference,ICI)。

1. OFDM调制

        在传统的单载波调制系统中,数据符号的传输速率通常受到信道带宽的限制。而在OFDM系统中,高速数据流被分割成多个低速子数据流,每个子数据流都使用不同的子载波进行调制。这些子载波在频域上是正交的,即它们在一个OFDM符号周期内整数倍频点上的交叉点处相互正交,从而允许它们在接收端被无干扰地分离。

       在OFDM调制中,高速数据流首先被分割成多个低速子数据流。每个子数据流都使用不同的子载波进行调制。这些子载波在频域上是正交的,从而允许它们在接收端被无干扰地分离。OFDM符号的形成可以通过逆快速傅里叶变换(IFFT)来实现。OFDM调制可以表示为:

       在OFDM调制过程中,输入的比特流首先经过星座映射(如QAM、PSK等)转换成复数符号序列。然后,通过串并转换将高速数据流分割成多个低速子数据流。接下来,对每个子数据流进行逆快速傅里叶变换(IFFT)操作,将频域的子载波映射到时域上,形成OFDM符号。最后,在每个OFDM符号前添加循环前缀(CP),以消除多径传播引起的符号间干扰(ISI)和子载波间干扰(ICI)。

        OFDM解调过程是调制的逆过程。首先,去除接收到的OFDM符号的循环前缀。然后,对剩余的符号进行快速傅里叶变换(FFT),将时域信号转换回频域。在频域上,由于子载波的正交性,可以无干扰地分离出每个子载波上的数据。最后,通过并串转换和星座逆映射恢复出原始的比特流。

2. 4QAM映射

       4QAM是一种数字调制方案,其中每个符号携带2比特的信息。在4QAM中,根据输入比特的不同组合,选择四个不同的幅度和相位组合之一来表示该符号。

3. 循环前缀的添加和删除

       循环前缀是通过将OFDM符号的最后一部分复制到符号的前面来形成的。这样做的好处是,即使信号在传输过程中发生了时延,只要时延不超过循环前缀的长度,接收端仍然可以通过移除循环前缀来恢复原始的OFDM符号,从而避免ISI和ICI。添加循环前缀的操作可以表示为:

在接收端,循环前缀被简单地丢弃,以恢复原始的OFDM符号:

4. MATLAB仿真

在MATLAB中进行OFDM系统的误码率仿真通常涉及以下步骤:

1.生成随机比特流。

2.使用4QAM或其他调制方案将比特流映射到复数符号。

3.构建OFDM符号,包括IFFT操作、添加循环前缀等。

4.通过信道模型,模拟信号在无线环境中的传输,包括添加噪声和其他干扰。

5.在接收端,执行与发送端相反的操作:去除循环前缀、FFT操作、解调和比特判决。

6.计算并记录误码率。

  1. ..........................................................................
  2. % 生成随机的二进制比特流用于发送测试
  3. BitsTx = floor(rand(1,NumLoop*NumSubc)*2);
  4. % 将比特流重组成2位一组的符号,并进行2进制到10进制的转换
  5. SymQAMtmp = reshape(BitsTx,2,NumLoop*NumSubc/2).';
  6. SymQAMtmptmp = bi2de(SymQAMtmp,2,'left-msb');
  7. % 利用查表法进行QAM星座映射
  8. QAMTable = [-1-i -1+i 1-i 1+i];
  9. SymQAM = QAMTable(SymQAMtmptmp+1);
  10. % IFFT变换
  11. SymIFFT = zeros(NumSubc,NumLoop);
  12. SymIFFTtmp = reshape(SymQAM,NumSubc/2,NumLoop);
  13. SymIFFTtmptmp = zeros(NumSubc,NumLoop);
  14. SymIFFTtmptmp(1,:) = real(SymIFFTtmp(1,:)); % 实数
  15. SymIFFTtmptmp(NumSubc/2+1,:) = imag(SymIFFTtmp(1,:)); % 实数
  16. % 这么安排矩阵的目的是为了构造共轭对称矩阵
  17. SymIFFTtmptmp(2:NumSubc/2,:) = SymIFFTtmp(2:NumSubc/2,:);
  18. SymIFFTtmptmp((NumSubc/2+2):NumSubc,:) = flipdim(conj(SymIFFTtmp(2:NumSubc/2,:)),1);
  19. SymIFFT = ifft(SymIFFTtmptmp,NumSubc,1);%按列做ifft
  20. % 添加循环前缀
  21. NumAddPrefix = NumSubc + NumCP;
  22. % 通过信道传输
  23. SymCP = zeros(NumAddPrefix,NumLoop);
  24. RowPrefix = (NumSubc - NumCP + 1):NumSubc;% 转置成矢量
  25. SymCP = [SymIFFT(RowPrefix,:);SymIFFT];
  26. SymCh = zeros(1,(NumSubc + NumCP)*NumLoop);
  27. SymChtmp = SymCP(:).'; % 进行这个转置操作之后就成了一个矢量
  28. Ch = [1 1/2 1/4];% 多径信道系数
  29. SymChtmptmp = filter(Ch,1,SymChtmp);
  30. % 添加加性高斯白噪声 (AWGN)
  31. BerSnrTable = zeros(20,3);
  32. for snr=0:30% SNR范围
  33. BerSnrTable(snr+1,1) = snr;
  34. SymCh = awgn(SymChtmptmp,snr,'measured');
  35. % 移除循环前缀
  36. SymDeCP = zeros(NumSubc,NumLoop);
  37. SymDeCPtmp = reshape(SymCh,NumSubc + NumCP,NumLoop);
  38. SymDeCP = SymDeCPtmp((NumCP+1+SyncDelay):NumAddPrefix+SyncDelay,:);
  39. % FFT变换
  40. SymFFT = fft(SymDeCP,NumSubc,1);
  41. % 决策解码(包括DeQAM)
  42. SymDec = zeros(NumSubc,NumLoop);
  43. SymEqtmp(1,:) = SymFFT(1,:)+i*SymFFT(NumSubc/2+1,:);
  44. SymEqtmp(2:NumSubc/2,:) = SymFFT(2:NumSubc/2,:);
  45. for m = 1:NumLoop
  46. for n = 1:NumSubc/2
  47. Real = real(SymEqtmp(n,m));
  48. Imag = imag(SymEqtmp(n,m));
  49. if( abs((Real -1)) < abs((Real +1)))
  50. SymDec(2*n-1,m) = 1;
  51. else
  52. SymDec(2*n-1,m) = 0;
  53. end
  54. if( abs((Imag -1)) < abs((Imag +1 )) )
  55. SymDec(2*n,m) = 1;
  56. else
  57. SymDec(2*n,m) = 0;
  58. end
  59. end
  60. end
  61. % -------------------------------------------------------------------------
  62. TestSymDec = zeros(NumSubc,NumLoop);
  63. TestSymEqtmp(1,:) = SymFFT(1,:)+i*SymFFT(NumSubc/2+1,:);
  64. TestSymEqtmp(2:NumSubc/2,:) = SymFFT(2:NumSubc/2,:);
  65. TestSymEqtmp1 = reshape(TestSymEqtmp,1,NumSubc*NumLoop/2);
  66. min_d = zeros(size(TestSymEqtmp1));
  67. min_ddd = zeros(1,NumSubc*NumLoop);
  68. d = zeros(4,1);
  69. min_index = 0;
  70. for ii = 1:1:(NumSubc*NumLoop/2)
  71. for jj = 1:4
  72. d(jj) = abs(TestSymEqtmp(ii) - QAMTable(jj));
  73. end
  74. [min_d(ii),min_index] = min(d);
  75. switch min_index
  76. case 1
  77. min_ddd(2*ii-1) = 0 ;
  78. min_ddd(2*ii) = 0 ;
  79. case 2
  80. min_ddd(2*ii-1) = 0 ;
  81. min_ddd(2*ii) = 1 ;
  82. case 3
  83. min_ddd(2*ii-1) = 1 ;
  84. min_ddd(2*ii) = 0 ;
  85. case 4
  86. min_ddd(2*ii-1) = 1 ;
  87. min_ddd(2*ii) = 1 ;
  88. otherwise
  89. fprintf('Impossible error!!! \n\n');
  90. end
  91. end
  92. % 将解码后的符号转换为比特流,并计算误码率
  93. BitsRx = zeros(1,NumSubc*NumLoop);
  94. BitsRx = SymDec(:).';
  95. [Num,Ber] = symerr(BitsTx,BitsRx)
  96. BerSnrTable(snr+1,2) = Num ;
  97. BerSnrTable(snr+1,3) = Ber ;
  98. end
  99. % 绘制误码率曲线
  100. figure(1);
  101. semilogy(BerSnrTable(:,1),BerSnrTable(:,3),'b-o');
  102. up4017

误码率仿真结果如下所示:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/507412
推荐阅读
相关标签
  

闽ICP备14008679号