阅读 25

【通信】基于matlab Alamouti空频编码【含Matlab源码 801期】

一、简介

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、源代码

clc
clear all
L=10000;   % 符号周期数
N=256;     % OFDM字载波个数
G=32;      % CP长度
M=2;       % 便于调制
Nt=3 ;      % 多径信道数 3
Nr=26;     % 多径信道数 26
snr=0:2:30;% 信噪比
%% 原始数据流
x_gene_bit= floor(rand(1,L*N*M)*2);
x_QPSK_in=reshape(x_gene_bit,M,L*N);
   for n_snr=1:length(snr)
       n_snr
       cnt=0;
 %% QPSK星座映射
   for ii=1:L*N
      if x_QPSK_in(:,ii)==[0 0]'
          x_QPSK(ii)=(1+1i)/sqrt(2);
      elseif x_QPSK_in(:,ii)==[0 1]'
          x_QPSK(ii)=(-1+1i)/sqrt(2);
      elseif x_QPSK_in(:,ii)==[1 0]'
          x_QPSK(ii)=(1-1i)/sqrt(2);
      elseif x_QPSK_in(:,ii)==[1 1]'
          x_QPSK(ii)=(-1-1i)/sqrt(2);
      end     
   end
   %% 串并变换
   x_OFDM_in=reshape(x_QPSK,N,L);
   for ii=1:L
       %% 基于Alamouti的编码
       x_transmitter1(1:2:N)=x_OFDM_in(1:2:N,ii);               %第一个发射天线
       x_transmitter1(2:2:N)=-conj(x_OFDM_in(2:2:N,ii));
       x_transmitter2(1:2:N)=x_OFDM_in(2:2:N,ii);               %第二个发射天线
       x_transmitter2(2:2:N)=conj(x_OFDM_in(1:2:N,ii));
      %%  分别在第一个天线和第二个天线上进行OFDM  x_transmitter1  x_transmitter1;
      %% IFFT
       X_IFFT_1=sqrt(N)*ifft(x_transmitter1);                    % 功率归一化 *sqrt(N)
       X_IFFT_2=sqrt(N)*ifft(x_transmitter2);                    % 功率归一化 *sqrt(N)
       %% 加循环前缀
       X_add_cp_1=[X_IFFT_1([end-31:end]) X_IFFT_1];        
       X_add_cp_2=[X_IFFT_2([end-31:end]) X_IFFT_2];   
       %% 产生瑞利衰落的信道系数
        h_1=(1/(sqrt(2*Nt)))*(randn(1,Nt) + j*randn(1,Nt));      %产生Nt个信道系数
        h_2=(1/(sqrt(2*Nt)))*(randn(1,Nt) + j*randn(1,Nt));      %产生Nt个信道系数
        H_1=fft(h_1,N)/sqrt(N);                                  %对信道系数做FFT
        H_2=fft(h_2,N)/sqrt(N);
       %% 输出的信号
        Yy=conv(X_add_cp_1,h_1)+conv(X_add_cp_2,h_2)+normrnd(0,sqrt(10^((-snr(n_snr))/10)/2),1,N+Nt+G-1)+1i*normrnd(0,sqrt(10^((-snr(n_snr))/10)/2),1,N+Nt+G-1);
       %% 去循环前缀
        Y_de_cp=Yy(33:288);                
        y_FFT=(1/sqrt(N))*fft(Y_de_cp);        
       %% 类似于Alamouti 解码的线性解码算法解调符号     
       y_FFT_odd= y_FFT(1:2:N);
       y_FFT_even= y_FFT(2:2:N);
       H_1_odd=H_1(1:2:N);   %第一个发射天线信道的坐标为奇数
       H_1_even=H_1(2:2:N);  %第一个发射天线信道的坐标为偶数
       H_2_odd=H_2(1:2:N);   %第二个发射天线信道的坐标为奇数
       H_2_even=H_2(2:2:N);  %第二个发射天线信道的坐标为偶数
       h_1 = abs(H_1_odd).^2 + abs(H_2_even).^2;            
       H2 = abs(H_1_even).^2 + abs( H_2_odd).^2; 
       x_est1 = (conj(H_1_odd).*y_FFT_odd +  H_2_even.*conj(y_FFT_even))./h_1;  
       x_est2 = (conj(H_2_odd).*y_FFT_odd - H_1_even.*conj(y_FFT_even))./H2;  
       xx(1:2:N) = x_est1;                                                    % 接收到的符号 
       xx(2:2:N) = x_est2;
      %% 解调
      x_de_QPSK_in=reshape(xx,1,N);
     for k=1:N
      if real(x_de_QPSK_in(k))>0&&imag(x_de_QPSK_in(k))>0
          x_de_QPSK(:,k)=[0 0].';
      elseif real(x_de_QPSK_in(k))>0&&imag(x_de_QPSK_in(k))<0
          x_de_QPSK(:,k)=[1 0].';
      elseif real(x_de_QPSK_in(k))<0&&imag(x_de_QPSK_in(k))>0
          x_de_QPSK(:,k)=[0 1].';
      elseif real(x_de_QPSK_in(k))<0&&imag(x_de_QPSK_in(k))<0
          x_de_QPSK(:,k)=[1 1].';
      end
     end
     %% 计算比特错误数
     error=length(find(x_QPSK_in(:,((ii-1)*N+1):ii*N)~=x_de_QPSK));
      cnt=cnt+error;
   end
   ber1(n_snr)=cnt/L/M/N;
   end
%%  多径数为26   
for n_snrr=1:length(snr)
       n_snrr
       cnt=0;
   %% QPSK星座映射
   for ii=1:L*N
      if x_QPSK_in(:,ii)==[0 0]'
          x_QPSK(ii)=(1+1i)/sqrt(2);
      elseif x_QPSK_in(:,ii)==[0 1]'
          x_QPSK(ii)=(-1+1i)/sqrt(2);
      elseif x_QPSK_in(:,ii)==[1 0]'
          x_QPSK(ii)=(1-1i)/sqrt(2);
      elseif x_QPSK_in(:,ii)==[1 1]'
          x_QPSK(ii)=(-1-1i)/sqrt(2);
      end     
   end
   %% 串并变换
   x_OFDM_in=reshape(x_QPSK,N,L);
   for ii=1:L
       %% 基于Alamouti的编码
       xx_transmitter1(1:2:N)=x_OFDM_in(1:2:N,ii);               %第一个发射天线
       xx_transmitter1(2:2:N)=-conj(x_OFDM_in(2:2:N,ii));
       xx_transmitter2(1:2:N)=x_OFDM_in(2:2:N,ii);               %第二个发射天线
       xx_transmitter2(2:2:N)=conj(x_OFDM_in(1:2:N,ii));
      %%  分别在第一个天线和第二个天线上进行OFDM  x_transmitter1  x_transmitter2;
      %% IFFT
       X_IFFT_1=sqrt(N)*ifft(xx_transmitter1);                   % 功率归一化 *sqrt(N)
       X_IFFT_2=sqrt(N)*ifft(xx_transmitter2);                   % 功率归一化 *sqrt(N)
       %% 加循环前缀
       X_add_cp_1=[X_IFFT_1([end-31:end]) X_IFFT_1];        
       X_add_cp_2=[X_IFFT_2([end-31:end]) X_IFFT_2];   
       %% 产生瑞利衰落的信道系数
        h_1=(1/(sqrt(2*Nr)))*(randn(1,Nr) + j*randn(1,Nr));      %产生Nr个信道系数
        h_2=(1/(sqrt(2*Nr)))*(randn(1,Nr) + j*randn(1,Nr));      %产生Nr个信道系数
        H_1=fft(h_1,N)/sqrt(N);                                  %对信道系数做FFT
        H_2=fft(h_2,N)/sqrt(N); 
       %% 输出的信号
         Y=conv(X_add_cp_1,h_1)+conv(X_add_cp_2,h_2)+normrnd(0,sqrt(10^((-snr(n_snrr))/10)/2),1,N+Nr+G-1)+1i*normrnd(0,sqrt(10^((-snr(n_snrr))/10)/2),1,N+Nr+G-1);
       %% 去循环前缀
        Y_de_cp=Y(33:288);                
        y_FFT=(1/sqrt(N))*fft(Y_de_cp);        
       %% 类似于Alamouti 解码的线性解码算法解调符号     
       y_FFT_odd= y_FFT(1:2:N);
       y_FFT_even= y_FFT(2:2:N);
       H_1_odd=H_1(1:2:N);   %第一个发射天线信道的坐标为奇数
       H_1_even=H_1(2:2:N);  %第一个发射天线信道的坐标为偶数
       H_2_odd=H_2(1:2:N);   %第二个发射天线信道的坐标为奇数
       H_2_even=H_2(2:2:N);  %第二个发射天线信道的坐标为偶数
       h_1 = abs(H_1_odd).^2 + abs(H_2_even).^2;            
       H2 = abs(H_1_even).^2 + abs( H_2_odd).^2; 
       x_est1 = (conj(H_1_odd).*y_FFT_odd +  H_2_even.*conj(y_FFT_even))./h_1;  
       x_est2 = (conj(H_2_odd).*y_FFT_odd - H_1_even.*conj(y_FFT_even))./H2;   
       xx(1:2:N) = x_est1;                                                      % 接收到的符号 
       xx(2:2:N) = x_est2;
      %% 解调
      x_de_QPSK_in=reshape(xx,1,N);
     for k=1:N
      if real(x_de_QPSK_in(k))>0&&imag(x_de_QPSK_in(k))>0
          x_de_QPSK(:,k)=[0 0].';
      elseif real(x_de_QPSK_in(k))>0&&imag(x_de_QPSK_in(k))<0
          x_de_QPSK(:,k)=[1 0].';
      elseif real(x_de_QPSK_in(k))<0&&imag(x_de_QPSK_in(k))>0
          x_de_QPSK(:,k)=[0 1].';
      elseif real(x_de_QPSK_in(k))<0&&imag(x_de_QPSK_in(k))<0
          x_de_QPSK(:,k)=[1 1].';
      end
     end
      error=length(find(x_QPSK_in(:,((ii-1)*N+1):ii*N)~=x_de_QPSK));
      cnt=cnt+error;
   end
   ber2(n_snrr)=cnt/L/M/N;
    end
复制代码

三、运行结果

在这里插入图片描述

四、备注

版本:2014a

文章分类
人工智能
文章标签