开源无线网络-OSRAN

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1469|回复: 0
打印 上一主题 下一主题

从波束赋形到OAM(四)

[复制链接]

38

主题

38

帖子

166

积分

注册会员

Rank: 2

积分
166
跳转到指定楼层
楼主
发表于 2023-6-22 21:50:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Haiwen 于 2023-6-22 21:52 编辑

端到端的OAM-OFDM
在本篇文章中,我们将通过UCA天线发送不同拓扑荷的OAM-OFDM信号。为切实感受一下一个端到端的OAM-OFDM通信系统,本文仿真中详细包含了OAM-OFDM的各个环节,包括 基带数据生成、信道编码、OFDM调制、上变频(加载波)、多拓扑荷OAM信号、下变频(去载波)、解OFDM、信道译码等部分。
首先初始化OFDM的各项参数,本文使用256QAM调制。
  1. f_sc = 250 * 10^3; %子载波间隔
  2. f_c = 1.6e9;
  3. N_sample= 4; % 对载波的采样
  4. N_sc=52;      %系统子载波
  5. N_fft=64;            % FFT 长度
  6. sample_rate = f_sc * N_fft;
  7. N_cp=16;             % 循环前缀长度
  8. N_symbo=N_fft+N_cp;        % 1个完整的OFDM长度
  9. N_c=53;             % 包含直流载波的子载波数
  10. M=256;               % 256QAM调制
  11. SNR=20:5:30;         %仿真信噪比
  12. N_frm=20;            % 仿真的帧数
  13. Nd=6;               % 每帧OFDM符号
  14. P_f_inter=6;      %导频间隔
  15. data_station=[];    %导频位置
  16. L=7;                %卷积码长度
  17. tblen=6*L;          %Viterbi译码深度?
  18. stage = 3;          % m序列的阶数
  19. ptap1 = [1 3];      % m序列的寄存器连接方式
  20. regi1 = [1 1 1];    % m序列寄存器初始值
  21. 接下来生成基带信号,并进行OFDM调制:

  22. %% 基带数据生成
  23. P_data=randi([0 1],1,N_sc*Nd*N_frm);

  24. %% 信道编码(卷积码、或交织器)
  25. %卷积码:前向纠错非线性码
  26. %交织:使突发错误最大限度的分散化
  27. trellis = poly2trellis(7,[133 171]);      
  28. code_data=convenc(P_data,trellis);

  29. %% 256QAM调制
  30. data_temp1= reshape(code_data,log2(M),[])';            
  31. data_temp2= bi2de(data_temp1);                          
  32. %modu_data=pskmod(data_temp2,M,pi/M);   % 复数   
  33. modu_data=qammod(data_temp2,M,"bin");
  34. %figure(1);
  35. scatterplot(modu_data);               

  36. %% 插入导频
  37. P_f=3+3*1i;                       %Pilot frequency
  38. P_f_station=[1:P_f_inter:N_fft];%导频位置,P_f_inter 导频间隔,为6。
  39. pilot_num=length(P_f_station);%导频数量

  40. for img=1:N_fft                        %数据位置
  41.     if mod(img,P_f_inter)~=1          %mod(a,b)就是求的是a除以b的余数
  42.         data_station=[data_station,img];
  43.     end
  44. end
  45. %data_station 是存放数据的位置,表示了数据位置的index

  46. data_row=length(data_station);
  47. data_col=ceil(length(modu_data)/data_row);

  48. pilot_seq=ones(pilot_num,data_col)*P_f;%将导频放入矩阵
  49. data=zeros(N_fft,data_col);%预设整个矩阵
  50. data(P_f_station(1:end),:)=pilot_seq;  %对pilot_seq按行取, 对应的行全是导频数据

  51. if data_row*data_col>length(modu_data)
  52.     data2=[modu_data;zeros(data_row*data_col-length(modu_data),1)];%将数据矩阵补齐,补0是虚载频~
  53. end

  54. %% 串并转换
  55. data_seq=reshape(data2,data_row,data_col);
  56. data(data_station(1:end),:)=data_seq;%将导频与数据合并

  57. %% IFFT
  58. ifft_data=ifft(data);

  59. %% 插入保护间隔、循环前缀
  60. Tx_cd=[ifft_data(N_fft-N_cp+1:end,:);ifft_data];%把ifft的末尾N_cp个数补充到最前面
  61. plot(abs(Tx_cd(:,1)));

  62. %% 并串转换
  63. Tx_data=reshape(Tx_cd,[],1);%由于传输需要
  64. Txdata中的数据即为调制后的时域数据,接下来需要做的事情就是把Tx_data调制到载波上,并通过UCA天线发送出去。

  65. for mode =1:7  % 在同一个UCA天线上发送不同的模式
  66. for jj=1:length(SNR)  %% 经过信道

  67.     disp(sprintf('Running in Mode=%d, SNR=%d',mode, SNR(jj)));
  68.     N = f_c /sample_rate * N_sample; % 每个符号对应载波的采样点数;
  69.     i_data = zeros(1, length(Tx_data * N));
  70.     q_data = zeros(1, length(Tx_data * N));
  71.    
  72.     %% 发送端8跟天线
  73.     freq = f_c;
  74.     c = 3e8;
  75.     lamda = c/freq;
  76.     bias = [0,45,90,135];
  77.     x = zeros(8,3);
  78.     x(1,:)=[0.269375, 0,0];
  79.     x(2,:) = [0.190477, 0.190477,0];
  80.     x(3,:) = [0, 0.269375,0];
  81.     x(4,:) = [-0.190477, 0.190477,0];
  82.     x(5,:) = [-0.269375, 0,0];
  83.     x(6,:) = [-0.190477, -0.190477,0];
  84.     x(7,:) = [0, -0.269375,0];
  85.     x(8,:) = [0.190477, -0.190477,0];
  86.     phase_in_mode = [0:pi/4:7*pi/4; 0:2*pi/4:7*2*pi/4; 0:3*pi/4:3*7*pi/4; 0:4*pi/4:4*7*pi/4; 0:5*pi/4:7*5*pi/4; 0:6*pi/4:7*6*pi/4; 0:7*pi/4:7*7*pi/4];
  87.     %% 接收端8根天线
  88.     ant_dix = zeros(8,3);
  89.     target = [0 0 5];
  90.     for i =1:8
  91.         ant_dix(i,:) = 3*x(i,:)+target;
  92.     end
  93.     tx_channel_data = zeros(8,8,length(Tx_data)*N);
  94.    
  95.     for m = 1:8% 8个接收天线
  96.         for n = 1:8 % 对应8个发送天线
  97.             dist = norm(ant_dix(m,:)-x(n,:));
  98.             N = f_c /sample_rate * N_sample; % 每个符号对应载波的采样点数;
  99.             i_data = zeros(1, length(Tx_data * N));
  100.             q_data = zeros(1, length(Tx_data * N));
  101.             
  102.                 for i = 1:length(Tx_data)
  103.                     j = 1: N;
  104.                     % 把7中拓扑荷的数据叠加在一起;
  105.                     i_data(N * (i-1)+j) =sum((cos(phase_in_mode(1:7,n)) * real( Tx_data(i))) * cos ( 2* pi * j /N_sample + dist/c * 2*pi*freq));
  106.                     q_data(N * (i-1)+j) =sum((-1*cos(phase_in_mode(1:7,n)) *imag( Tx_data(i))) * sin ( 2* pi * j /N_sample+ dist/c * 2*pi*freq));                     
  107.                 end
  108.                 tx_channel_data(m,n,:) = awgn((i_data + q_data),SNR(jj),'measured');
  109.         end
  110.     end
  111.     oam_rx_channel_data =  squeeze(sum(tx_channel_data,2));
  112. oam_rx_channel_data即为信道中发送的带有多种拓扑荷的数据,接下来使用UCA天线完成各拓扑荷数据的接收解调。

  113. %%  接收端

  114. rx_i_data = zeros(length(Tx_data),1);
  115. rx_q_data = zeros(length(Tx_data),1);
  116. rx_channel = zeros(length(Tx_data),8);
  117. for rx_idx=1:8 % 分别取出8个天线上的数据
  118.     for i = 1:length(Tx_data)
  119.         j = 1: N;
  120.         I_temp(j) = oam_rx_channel_data(rx_idx,N * (i-1)+j) .* cos ( 2* pi * j /N_sample);
  121.         Q_temp(j) = -1* oam_rx_channel_data(rx_idx,N * (i-1)+j) .* sin ( 2* pi * j /N_sample);
  122.         rx_i_data(i) = cos(phase_in_mode(mode,rx_idx)) * sum(I_temp);
  123.         rx_q_data(i) = cos(phase_in_mode(mode,rx_idx)) * sum(Q_temp);
  124.     end
  125.     rx_channel(:,rx_idx) =  rx_i_data + rx_q_data * 1i;
  126. end
  127. % 将接收到的信号叠加(积分),非目标拓扑荷数据将为0。
  128. sumed_rx_channel = sum(rx_channel,2);

  129. %% 串并转换
  130.     Rx_data1=reshape(sumed_rx_channel,N_fft+N_cp,[]);
  131.    
  132. %% 去掉保护间隔、循环前缀
  133.     Rx_data2=Rx_data1(N_cp+1:end,:);

  134. %% FFT
  135.     fft_data=fft(Rx_data2);
  136.    
  137. %% 信道估计与插值(均衡)
  138.     data3=fft_data(1:N_fft,:);
  139.     Rx_pilot=data3(P_f_station(1:end),:); %接收到的导频
  140.     h=Rx_pilot./pilot_seq;
  141.     H=interp1( P_f_station(1:end)',h,data_station(1:end)','linear','extrap');%分段线性插值:插值点处函数值由连接其最邻近的两侧点的线性函数预测。对超出已知点集的插值点用指定插值方法计算函数值

  142. %% 信道校正
  143.     data_aftereq=data3(data_station(1:end),:)./H;
  144. %% 并串转换
  145.     data_aftereq=reshape(data_aftereq,[],1);
  146.     data_aftereq=data_aftereq(1:length(modu_data));
  147.     data_aftereq=reshape(data_aftereq,N_sc,length(data_aftereq)/N_sc);
  148.    
  149. %% 没有使用解扩,直接赋值过来了
  150.     demspread_data = data_aftereq;      
  151.    
  152. %% 256QAM
  153.     demodulation_data=qamdemod(demspread_data,M,"bin");  
  154.     De_data1 = reshape(demodulation_data,[],1);
  155.     De_data2 = de2bi(De_data1);
  156.     De_Bit = reshape(De_data2',1,[]);

  157. %% (解交织)
  158. %% 信道译码(维特比译码)
  159.     trellis = poly2trellis(7,[133 171]);
  160.     rx_c_de = vitdec(De_Bit,trellis,tblen,'trunc','hard');   

  161. %% 计算误码率
  162.     [err,Ber2(jj)] = biterr(De_Bit(1:length(code_data)),code_data);
  163.     [err, Ber(mode,jj)] = biterr(rx_c_de(1:length(P_data)),P_data);

  164. end   % 对应for jj=1:length(SNR) , 每个拓扑荷计算在不同SNR的误码率
  165. end   % 对应 for mode =1:7,不同模式遍历一遍
  166. 做出误码率图:

  167. semilogy(SNR,Ber(1,:),'b-s');
  168. hold on;
  169.   semilogy(SNR,Ber(2,:),'k-o');
  170.   hold on;
  171.    semilogy(SNR,Ber(3,:),'r-*');
  172. hold on;
  173.   semilogy(SNR,Ber(4,:),'b-o');
  174.   hold on;
  175.    semilogy(SNR,Ber(5,:),'k-s');
  176. hold on;
  177.   semilogy(SNR,Ber(6,:),'r-o');
  178.   hold on;
  179.    semilogy(SNR,Ber(7,:),'r-+');
  180. hold on;
  181. legend('M=1','M=2','M=3','M=4','M=5','M=6','M=7');
  182. hold on;
  183. xlabel('SNR');
  184. ylabel('BER');
  185. title('AWGN信道下不同拓扑荷误比特率')
复制代码

误码率对比图如下,可以看到拓扑荷Mode=4时误码率较高,近乎达到了50%,Mode=1和Mode=7时误码率最低,Mode=2和6误码率接近,Mode=3和Mode=5误码率接近。提升SNR或降低调制阶数,误码率会有明显改善。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|OpenXG  

Copyright © 2001-2013 Comsenz Inc.Template by Comsenz Inc.All Rights Reserved.

Powered by Discuz!X3.2

快速回复 返回顶部 返回列表