⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comb2.m

📁 OFDM系统的仿真---基于梳状导频的信道估计
💻 M
字号:
%author:liuqingwei May 12th 2006 9:40 PM.%OFDM Channel Estimation Based on Comb Pilot%IFFT_bin_length: IFFT和FFT的点数%carrier_count: 子载波个数%bits_per_symbol: 每符号上的比特数%symbols_per_carrier: 每桢的OFDM符号数%X:欲发送的二进制比特流clear all;clc;IFFT_bin_length=128;carrier_count=100;bits_per_symbol=2;symbols_per_carrier=12;LI=7 ; %导频之间的间隔Np=ceil(carrier_count/LI)+1;%导频数 %加1的原因:使最后一列也是导频N_number=carrier_count*symbols_per_carrier*bits_per_symbol;carriers=1:carrier_count+Np;GI=8;             % guard interval lengthN_snr=40;          % 每比特信噪比snr=8;             %信噪比间隔%------------------------------------------------------------% vector initializationX=zeros(1,N_number);X1=[];X2=[];X3=[];X4=[];X5=[];X6=[];X7=[];Y1=[];Y2=[];Y3=[];Y4=[];Y5=[];Y6=[];Y7=[];XX=zeros(1,N_number);dif_bit=zeros(1,N_number);dif_bit1=zeros(1,N_number);dif_bit2=zeros(1,N_number);dif_bit3=zeros(1,N_number);X=randint(1,N_number);%产生二进制随即序列(非0即1)%--------------------------------------------------------%QPSK调制:(1 1)->pi/4;(0 1)->3*pi/4;(0 0)->-3*pi/4;(1,0)->-pi/4;s=(X.*2-1)/sqrt(2);sreal=s(1:2:N_number);simage=s(2:2:N_number);X1=sreal+j.*simage;%---------------------------------------------------------%产生随机导频信号%--------------------------------------------------------train_sym=randint(1,2*symbols_per_carrier);t=(train_sym.*2-1)/sqrt(2);treal=t(1:2:2*symbols_per_carrier);timage=t(2:2:2*symbols_per_carrier);training_symbols1=treal+j.*timage;training_symbols2=training_symbols1.';training_symbols=repmat(training_symbols2,1,Np);%disp(training_symbols)pilot=1:LI+1:carrier_count+Np;if length(pilot)~=Np    pilot=[pilot,carrier_count+Np];end%--------------------------------------------------------%串并转换X2=reshape(X1,carrier_count,symbols_per_carrier).';%---------------------------------------------------------%插入导频signal=1:carrier_count+Np;signal(pilot)=[];X3(:,pilot)=training_symbols;X3(:,signal)=X2;%X3=cat(1,training_symbols,X2);IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);IFFT_modulation(:,carriers)=X3;%IFFT_modulation(:,conjugate_carriers)=conj(X3);X4=ifft(IFFT_modulation,IFFT_bin_length,2);%X5=X4.';%加保护间隔(循环前缀)for k=1:symbols_per_carrier;   for i=1:IFFT_bin_length;      X6(k,i+GI)=X4(k,i);   end   for i=1:GI;      X6(k,i)=X4(k,i+IFFT_bin_length-GI);       endend%---------------------------------------------------------%并串转换X7=reshape(X6.',1,symbols_per_carrier*(IFFT_bin_length+GI));%---------------------------------------------------------%信道模型:带多普勒频移的瑞利衰落信道fd=100; %多普勒频移r=6;   %多径数a=[0.123 0.3 0.4 0.5 0.7 0.8]; %多径的幅度d=[2 3 4 5 9 13]; %各径的延迟T=1;  %系统采样周期th=[90 0 72 144 216 288]*pi./180;%相移h=zeros(1,carrier_count);hh=[];    for k=1:r        %deta=[zeros(1,d(k)-1),1,zeros(1,carrier_count-d(k))];        h1=a(k)*exp(j*((2*pi*T*fd*d(k)/carrier_count)));        %h1=a(k)*exp(j*((2*pi*T*fd*d(k)/carrier_count)));        hh=[hh,h1];    end    h(d+1)=hh;%noise=randn(1,length(X7))+j.*randn(1,length(X7)); %--------------------------------------------------------channel1=zeros(size(X7));channel1(1+d(1):length(X7))=hh(1)*X7(1:length(X7)-d(1));channel2=zeros(size(X7));channel2(1+d(2):length(X7))=hh(2)*X7(1:length(X7)-d(2));channel3=zeros(size(X7));channel3(1+d(3):length(X7))=hh(3)*X7(1:length(X7)-d(3));channel4=zeros(size(X7));channel4(1+d(4):length(X7))=hh(4)*X7(1:length(X7)-d(4));channel5=zeros(size(X7));channel5(1+d(5):length(X7))=hh(5)*X7(1:length(X7)-d(5));channel6=zeros(size(X7));channel6(1+d(6):length(X7))=hh(6)*X7(1:length(X7)-d(6));%---------------------------------------------------------------Tx_data=X7+channel1+channel2+channel3+channel4;%---------------------------------------------------------------%---------------------------------------------------------------%----------------------------------------------------------------%加高斯白噪声Error_ber=[];%误比特率Error_ber1=[];Error_ber2=[];%误比特率Error_ber3=[];%Error_ser=[];%误符号率for snr_db=0:snr:N_snr    code_power=0;    code_power=[norm(Tx_data)]^2/(length(Tx_data));%信号的符号功率    %bit_power=var(Tx_data);    bit_power=code_power/bits_per_symbol;%比特功率     noise_power=10*log10((bit_power/(10^(snr_db/10))));%噪声功率    noise=wgn(1,length(Tx_data),noise_power,'complex');%产生GAUSS白噪声信号        Y7=Tx_data+noise;%-------------------------------------------------------  %串并变换   Y6=reshape(Y7,IFFT_bin_length+GI,symbols_per_carrier).';     %去保护间隔    for k=1:symbols_per_carrier;       for i=1:IFFT_bin_length;           Y5(k,i)=Y6(k,i+GI);       end    end     Y4=fft(Y5,IFFT_bin_length,2);     Y3=Y4(:,carriers); %-------------------------------------------------------------    %LS信道估计  H=[];  Y2=Y3(:,signal);  Rx_training_symbols=Y3(:,pilot);  Rx_training_symbols0=reshape(Rx_training_symbols,symbols_per_carrier*Np,1);    training_symbol0=reshape(training_symbols,1,symbols_per_carrier*Np);  training_symbol1=diag(training_symbol0);  %disp(training_symbols)  training_symbol2=inv(training_symbol1);  Hls=training_symbol2*Rx_training_symbols0;  Hls1=reshape(Hls,symbols_per_carrier,Np);  HLs=[];  HLs1=[]; if ceil(carrier_count/LI)==carrier_count/LI     for k=1:Np-1        HLs2=[];           for t=1:LI           HLs1(:,1)=(Hls1(:,k+1)-Hls1(:,k))*(t-1)./LI+Hls1(:,k);           HLs2=[HLs2,HLs1];        end       HLs=[HLs,HLs2];    endelse    for k=1:Np-2        HLs2=[];        for t=1:LI           HLs1(:,1)=(Hls1(:,k+1)-Hls1(:,k))*(t-1)./LI+Hls1(:,k);           HLs2=[HLs2,HLs1];        end       HLs=[HLs,HLs2];    end    HLs3=[];    for t=1:mod(carrier_count,LI)        HLs1(:,1)=(Hls1(:,Np)-Hls1(:,Np-1))*(t-1)./LI+Hls1(:,Np-1);        HLs3=[HLs3,HLs1];    end;    HLs=[HLs,HLs3];end  %Hls1=Hls.';  %H=repmat(Hls1,symbols_per_carrier,1);%将导频扩展成symbols_per_carrier*carrier_count矩阵  Y1=Y2./HLs;    %-------------------------------------------------------------------                                  %-------------------------------------------------------------  %并串变换  YY=reshape(Y2.',1,N_number/bits_per_symbol);  YY1=reshape(Y1.',1,N_number/bits_per_symbol); %------------------------------------------------------------%QPSK解调   y_real=sign(real(YY));   y_image=sign(imag(YY));   y_re=y_real./sqrt(2);   y_im=y_image./sqrt(2);    y_real1=sign(real(YY1));   y_image1=sign(imag(YY1));   y_re1=y_real1./sqrt(2);   y_im1=y_image1./sqrt(2);     r00=[];   r01=[];   r10=[];   r11=[];   for k=1:length(y_real);     r00=[r00,[y_real(k),y_image(k)]];  end;  for k=1:length(y_real1);     r10=[r10,[y_real1(k),y_image1(k)]];  end;  for k=1:length(y_re);     r01=[r01,[y_re(k),y_im(k)]]; end; for k=1:length(y_re1);     r11=[r11,[y_re1(k),y_im1(k)]]; end;    XX(find(r01>0))=1;%-------------------------------------------------------------%计算在不同信噪比下的误比特率并作图 dif_bit=s-r01;  dif_bit1=s-r11;  ber_snr=0;    %纪录误比特数    for k=1:N_number;       if dif_bit(k)~=0;         ber_snr=ber_snr+1;       end   end; ber_snr1=0;    %纪录误比特数    for k=1:N_number;       if dif_bit1(k)~=0;          ber_snr1=ber_snr1+1;      end    end  Error_ber=[Error_ber,ber_snr]; Error_ber1=[Error_ber1,ber_snr1];endBER=zeros(1,length(0:snr:N_snr));BER1=zeros(1,length(0:snr:N_snr));BER=Error_ber./N_number;BER1=Error_ber1./N_number;%-------------------------------------------------------------%------------------------------------------------------------- i=0:snr:N_snr;semilogy(i,BER,'-*r');hold on;semilogy(i,BER1,'-og');hold on;grid on;legend('No Channel Estimation','LS Channel Estimation');hold off			   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -