实验一OFDM传输系统仿真实验目的、1.熟悉OFDM传输系统的整个设计流程,加深对16-QAM调制、FFT、IFFT、多径衰落信道的理解。2.熟悉时域、频域离散信号的特性。二、 实验内容1、以前缀CP、多径衰落+AWGN噪声设计的OFDM传输系统%OFDM_baisc.mclear all%+++++++++++++++++++++++++NgType=1;%前缀CPCh=1;%多径衰落x%++++++++++++++++++++++++target_neb=500;%figure(Ch+1),clf%setupfigure,andcutoffthisfigurePowerdB=[0-8-17-21-25];%信道抽头功率特性,dBDelay=[03568];%信道时延Power=10.^(PowerdB/10):%信道抽头功率特性线性尺度Ntap=length(PowerdB):%信道抽头数Lch=Delay(end)+1:%信道长度Nbps=4;M=2^Nbps;%调制阶数=2/4/6;QPSK/16-QAM/64-QAMNfft=64;%FFT大小Ng=Nfft/4:%GI的长度,没保护间隔时,Ng=0Nsym=Nfft+Ng:%符号周期Nvc=Nfft/4;%Nvc=0.没有VCNused=Nfft-Nvc;EbNO=0:5:20;%Eb/NO;Niter=1e3;%每一EbNO的迭代次数++++++++++Nframe=3;%每一祯的符号数sigPow=O;%初始信号功率%file_name='OFDM_BER.dat';%fid=fopen(file_name,'w+);norms=[1sqrt(2)0sqrt(10) 0sqrt(42)]:%BPSK 4-QAM 16-QAMber=zeros(1,length(EbNO);1/5
1 / 5 实验一 OFDM 传输系统仿真 一、 实验目的 1.熟悉 OFDM 传输系统的整个设计流程,加深对 16-QAM 调制、FFT、IFFT、多径衰落信 道的理解。 2.熟悉时域、频域离散信号的特性。 二、 实验内容 1、以前缀 CP、多径衰落+AWGN 噪声设计的 OFDM 传输系统 % OFDM_baisc.m clear all %++++++++++++++++++++++++ NgType=1; %前缀 CP + Ch=1; %多径衰落 + %++++++++++++++++++++++++ target_neb=500; %figure(Ch+1), clf % setup figure, and cut off this figure PowerdB=[0 -8 -17 -21 -25]; %信道抽头功率特性,dB Delay =[0 3 5 6 8]; %信道时延 Power= 10.^(PowerdB/10); %信道抽头功率特性 线性尺度 Ntap=length(PowerdB); %信道抽头数 Lch= Delay(end)+1; %信道长度 Nbps=4; M=2^Nbps; %调制阶数=2/4/6;QPSK/16-QAM/64-QAM Nfft=64; %FFT 大小 Ng= Nfft/4; %GI 的长度,没保护间隔时,Ng=0 Nsym= Nfft+Ng; %符号周期 Nvc = Nfft/4; %Nvc=0, 没有 VC Nused= Nfft-Nvc; EbN0=0:5:20; %Eb/N0; N_iter=1e3; %每一 EbN0 的迭代次数 ++++++++++ Nframe=3; %每一祯的符号数 sigPow=0; %初始信号功率 %file_name = 'OFDM_BER.dat'; %fid= fopen(file_name, 'w+'); norms=[1 sqrt(2) 0 sqrt(10) 0 sqrt(42)]; % BPSK 4-QAM 16-QAM ber=zeros(1,length(EbN0));
for i=0:length(EbN0) %0 510 1520randn('state',0):rand('state',0):%Ber2=berawgn(EbN0,'qam,M): % BER+++++++++++Neb=0;%初始化错误比特数Ntb=0:%初始化总比特数%++++++++form=1:N_iter% TX%X=randint(1Nused*Nframe,M);%bit整数向量1X144数值小于16X= randi([0 15].1,Nused*Nframe);Xmod=qammod(X,M,0,'gray)/norms(Nbps);%16QAM调制48*3if NgType~=2%x_GI240个数据x_G/=zeros(1,Nframe*Nsym):elseifNgType==2x_Gl=zeros(1,Nframe*Nsym+Ng);%x_GI240+16个数据endkk1=1:Nused/2;kk2=Nused/2+1:Nusedkk3=1:Nfft;kk4=1:Nsym;fork=1:Nframeif Nvc~=0X_shift=[0Xmod(kk2)zeros(1,Nvc-1)Xmod(kk1)];%第一个符号48个调制数据重新布置%第一个不else用,回避直流,其它零,总量64子载波X_shift=[Xmod(kk2) Xmod(kk1)];end%逆变换64个数据x= ifft(X shift):%x_GI(kk4)=guard_interval(Ng, Nfft, NgType, x);if NgType==1%16个 CP+64个x(n)x_GI(kk4)=[x(Nfft-Ng+1:Nfft) x(1:Nfft)];elseif Ng Type==22/5
2 / 5 for i=0:length(EbN0) %0 5 10 15 20 randn('state',0); rand('state',0); %Ber2=berawgn(EbN0,'qam',M); % BER +++++++++++++++ Neb=0; %初始化错误比特数 Ntb=0; %初始化总比特数 %++++++++++++++++++++++++++++++++++++++++++++ for m=1:N_iter % TX_ %X= randint(1, Nused*Nframe, M); % bit 整数向量 1X144 数值小于 16 X= randi([0 15],1,Nused*Nframe); Xmod=qammod(X,M,0,'gray')/norms(Nbps); % 16QAM 调制 48*3 if NgType~=2 x_GI=zeros(1,Nframe*Nsym); % x_GI 240 个数据 elseif NgType==2 x_GI=zeros(1,Nframe*Nsym+Ng); % x_GI 240+16 个数据 end kk1=1:Nused/2; kk2=Nused/2+1:Nused; kk3=1:Nfft; kk4=1:Nsym; for k=1:Nframe if Nvc~=0 X_shift=[0 Xmod(kk2) zeros(1,Nvc-1) Xmod(kk1)]; % 第一个符号 48 个调制数据重新布置 else % 第一个不 用,回避直流,其它零,总量 64 子载波 X_shift=[Xmod(kk2) Xmod(kk1)]; end x= ifft(X_shift); %逆变换 64 个数据 %x_GI(kk4)=guard_interval(Ng, Nfft, NgType, x); if NgType==1 x_GI(kk4)=[x(Nfft-Ng+1:Nfft) x(1:Nfft)]; %16 个 CP+64 个 x(n) elseif NgType==2
x_GI(kk4)=[zeros(1,Ng) x(1:Nfft)];:endkk1=kk1+Nused;kk2=kk2+Nused;kk3=kk3+Nfft:kk4=kk4+Nsym;%重复3次,×_GT包含3个符号,每个符号80个数据,其中16个CP+64IFFT,共240个数据end%+++++++++if Ch==0y=x_GI;%无信道else%多径衰落信道channel=(randn(1,Ntap)+1i*randn(1,Ntap)).*sqrt(Power/2)h=zeros(1,Lch);%信道脉冲响应h(Delay+1)=channel;%h响应长度为9:与240个y=conv(x_GI,h):输入数据卷积,输出248个数据end%+++++++++++++++if i==0%测量信号功率y1=y(1:Nframe*Nsym):%有用的240个数据,计算总能量sigPow=sigPow+y1*y1';%continue;Niter次的信号功率总和,等待i变为1~5运行下面程序end%++++++++%加AWGN噪声snr=EbN0(i)+10*log10(Nbps*(Nused/Nfft));noise_mag=sqrt(10.(-snr/10)*sigPow/2);y_Gl=y+noise_mag*(randn(size(y)+1irandn(size(y));%y_GI248个加入噪声的数据%Rxkk1=(NgType==2)*Ng+1:Nsym; %kk 1:80kk2=1:Nfft:%1:643/5
3 / 5 x_GI(kk4)=[zeros(1,Ng) x(1:Nfft)]; end kk1=kk1+Nused; kk2=kk2+Nused; kk3=kk3+Nfft; kk4=kk4+Nsym; %重复 3 次,x_GT 包含 3 个符号,每个符号 80 个数 据,其中 16 个 CP+64IFFT,共 240 个数据 end %++++++++++++++++++++++++++++++++++ if Ch==0 y= x_GI; %无信道 else %多径衰落信道 channel=(randn(1,Ntap)+1i*randn(1,Ntap)).*sqrt(Power/2); h= zeros(1,Lch); %信道脉冲响应 h(Delay+1)=channel; y=conv(x_GI,h); % h 响应长度为 9;与 240 个 输入数据卷积,输出 248 个数据 end %++++++++++++++++++++++++++++++++++ if i==0 %测量信号功率 y1=y(1:Nframe*Nsym); %有用的 240 个数据,计算总能量 sigPow=sigPow+y1*y1'; continue; % N_iter 次的信号功率总和,等待 i 变为 1~5, 运行下面程序 end %++++++++++++++++++++++++++++++++++ %加 AWGN 噪声 snr=EbN0(i)+10*log10(Nbps*(Nused/Nfft)); noise_mag=sqrt((10.^(-snr/10))*sigPow/2); y_GI=y+noise_mag*(randn(size(y))+1i*randn(size(y))); % y_GI 248 个加入噪 声的数据 %Rx_ kk1=(NgType==2)*Ng+1:Nsym; %kk 1:80 kk2=1:Nfft; % 1:64
kk3=1:Nused; % 1:48kk4=Nused/2+Nvc+1:Nfft;%24+16+1:64kk5=2:Nused/2+1;%1:24%kk5=(Nvc~=0)+0:Nused/2;%1:24对应输入的偏移,对应得到输出,原来有错,已改H_shift=zeros(1,Nused):if Ch==1H=fft([h zeros(1,Nfft-Lch);H_shift(kk3)=[H(kk4) H(kk5)]:%1241524凑齐48个数据end%+++Y=zeros(1,Nfft);Xmod_r=zeros(1,Nframe*Nused):%3*48个数据fork=1:Nframequcp1=y_GI(k-1)*Nsym+Ng+1:kNsym);%取每组有效数据64个数据Y(kk2)=fft(qucp1):Y_shift=[Y(kk4)Y(kk5)];%得到历经多信道影响+噪声影响的调制信息if Ch==0Xmod_r(kk3)=Y_shift;elseXmod_r(kk3)=Y_shift./H_shift;%去除多信道影响,只剩噪声干扰endkk3=kk3+Nusedend%++++++++X_r=qamdemod(Xmod_rnorms(Nbps),M,o,'gray);Neb=Neb+sum(sum(de2bi(X_r,Nbps)~=de2bi(X,Nbps);%已验证Ntb=Ntb+Nused*Nframe*Nbps;%if Neb>target_neb,break;%endend%选代结束%++4/5
4 / 5 kk3=1:Nused; % 1:48 kk4=Nused/2+Nvc+1:Nfft; % 24+16+1:64 kk5=2:Nused/2+1; % 1:24 %kk5=(Nvc~=0)+0:Nused/2; % 1:24 对应输入的偏移,对应得到输出, 原来有错,已改 H_shift=zeros(1,Nused); if Ch==1 H=fft([h zeros(1,Nfft-Lch)]); H_shift(kk3)=[H(kk4) H(kk5)]; % 1 24 15 24 凑齐 48 个数据 end %++++++++++++++++++++++++++++++++++++++++++++++++++++++ Y=zeros(1,Nfft); Xmod_r=zeros(1,Nframe*Nused); %3*48 个数据 for k=1:Nframe qucp1=y_GI((k-1)*Nsym+Ng+1:k*Nsym); %取每组有效数据 64 个数据 Y(kk2)=fft(qucp1); Y_shift=[Y(kk4) Y(kk5)]; %得到历经多信道影响+噪声影响的调制信息 if Ch==0 Xmod_r(kk3)=Y_shift; else Xmod_r(kk3)=Y_shift./H_shift; %去除多信道影响,只剩噪声干扰 end kk3=kk3+Nused; end %++++++++++++++++++++++++++++++++++++++++++++++ X_r=qamdemod(Xmod_r*norms(Nbps),M,0,'gray'); Neb=Neb+sum(sum(de2bi(X_r,Nbps)~=de2bi(X,Nbps))); %已验证 Ntb=Ntb+Nused*Nframe*Nbps; %if Neb>target_neb, break; %end end %迭代 结束 %++++++++++++++++++++++++++++++++++++
if i==0sigPow=sigPow/Nsym/Nframe/N_iter;elseber(i)=Neb/Ntb;end%++++++++++++++++++++++++end2、运行结果BER,其中第一图L图1代码RRRO5/5
5 / 5 if i==0 sigPow=sigPow/Nsym/Nframe/N_iter; else ber(i)=Neb/Ntb; end %+++++++++++++++++++++++++++++++++++ end 2、运行结果 BER,其中第一图 图 1 代码 图 2 信噪比初值 图 3 不同信噪比设置下运行的误码率 BER 结果