📄 gan.m
字号:
%*******OFDM系统仿真*******clear;clc;%******参数设置************SNR=10; % 信噪比为10dBMu=2; % 调制水平Ndata=256; % 复值符号个数Sdata=64; % 每次64个复值符号进行IFFT/FFT、子载波个数fl=128; % IFFT/FFT长、并行子信道数Nsym=Ndata/Sdata; % OFDM符号数GIlen=144; % 加循环前缀后的符号长GI=16; % 循环前缀(取IFFT长的1/8)Tu=64e-6; % 一个有用符号周期BW=1/Tu ; %系统带宽T=Tu/64; % 基带码元周期 %*****列向量初始化***X=zeros(Ndata,1);Y1=zeros(Ndata,1);Y2=zeros(Ndata,1);Y3=zeros(fl,1);z0=zeros(fl,1);z1=zeros(Nsym*fl,1); g=zeros(GIlen,1);z2=zeros(GIlen*Nsym,1); z3=zeros(GIlen*Nsym,1);TR=zeros(1,GIlen*Nsym);%******发射端(调制部分)******signal=rand(1,Ndata*Mu)>0.5; % 随机信号(0、1)zh=2*signal-ones(1,Ndata*Mu); % 转化为双极性码序列data=reshape(zh,Sdata,Nsym*Mu); % 串并转换,行数Sdata,列数为Nsym*2%******QPSK调制*****for j=1:Nsym ich1(:,j)=data(:,2*j-1); qch1(:,j)=data(:,2*j); % 把数据分为两个通道endkmod=1/sqrt(2); I1=ich1.*kmod;Q1=qch1.*kmod; % QPSK调制时,要乘上1/sqrt(2)系数FX=I1+Q1.*i; % 产生复信号figure(1);plot(FX,'k.');grid; % QPSK调制星座图,'k.'表示矢量为黑点text(kmod,kmod,'11');text(-kmod,kmod,'01');text(-kmod,-kmod,'00');text(kmod,-kmod,'10'); % 矢量表示的意义xlabel('x轴');ylabel('y轴');title('QPSK调制星座图');Y2=reshape(FX,Ndata,1); % 把FX变为一列放Y2for j=1:Nsym; for h=1:Sdata; Y3(h+fl/2-Sdata/2,1)=Y2(h+(j-1)*Sdata,1); % 补零 end z0=ifft(Y3); %******IFFT***** for s=1:fl; z1(((j-1)*fl)+s,1)=z0(s,1); % IFFT后的的总序列 end %****插入循环前缀** for m=1:fl; g(m+16,1)=z0(m,1); end for m=1:GI; g(m,1)=z0(m+fl-GI,1); % 把z0后16个符号复制放到前面 end for d=1:GIlen; z2(((j-1)*GIlen)+d,1)=g(d,1); %插入循环前缀后的总序列 end end%*****OFDM信号时域图形*****figure(2);ff = -1:1:512;df=abs(z1);plot(ff(1:512),df(1:512));gridxlabel('符号长度');ylabel('幅值');title('插入循环前缀前的幅值图形');figure(3);f = -1:1:576;y=abs(z2);y1=y(1:16);y2=y(129:144);y3=y(145:160);y4=y(273:288);y5=y(289:304);y6=y(417:432);y7=y(433:448);y8=y(561:576);plot(f(1:576),y(1:576),...f(1:16),y1,'r',f(129:144),y2,'r',...f(145:160),y3,'k',f(273:288),y4,'k',...f(289:304),y5,'m',f(417:432),y6,'m',...f(433:448),y7,'g',f(561:576),y8,'g');grid % 画循环前缀位置xlabel('符号长度');ylabel('幅值');title('插入循环前缀后的幅值图形');%********OFDM信号频域图形***Y4 =fft(z1); %画频谱for j=1:Ndata/Sdata*fl;if abs(Y4(j)) < 0.01 Y4(j)=0.01; % 若Y4 is 小于 0.01, Y4=0.01endendY4 = 10*log10(abs(Y4));figure(4);f = linspace(-(fl/2)/Tu,(fl/2)/Tu,length(Y4/Tu));plot(f,Y4);gridaxis([-(fl/2)/Tu (fl/2)/Tu -20 20]);xlabel('带宽(Hz)');ylabel('峰值(dB)');title('未插入循环前缀的频谱图形');%Y5=fft(z2); %画频谱for j=1:Ndata/Sdata*GIlen;if abs(Y5(j)) < 0.01 % 若 Y4 is小于 0.01, Y4=0.01 Y5(j)=0.01;endendY5= 10*log10(abs(Y5));figure(5);f = linspace(-(GIlen/2)/Tu,(GIlen/2)/Tu,length(Y5/Tu));plot(f,Y5);gridaxis([-(GIlen/2)/Tu (GIlen/2)/Tu -20 20]);xlabel('带宽(Hz)');ylabel('峰值(dB)');title('插入循环前缀后的频谱图形');figure(6)subplot(211),pwelch(z1,[],[],[],2/T); % 画功率谱密度subplot(212),pwelch(z2,[],[],[],2/T);%TR=reshape(z2,1,GIlen*Nsym); % 并串转换,发射串行复信号%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -