%*******OFDM系统仿真*******
clear;
clc;
%******参数设置************
SNR=10; % 信噪比为10dB
Mu=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); % 把数据分为两个通道
end
kmod=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变为一列放Y2
for 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));grid
xlabel('符号长度');
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.01
end
end
Y4 = 10*log10(abs(Y4));
figure(4);
f = linspace(-(fl/2)/Tu,(fl/2)/Tu,length(Y4/Tu));
plot(f,Y4);grid
axis([-(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;
end
end
Y5= 10*log10(abs(Y5));
figure(5);
f = linspace(-(GIlen/2)/Tu,(GIlen/2)/Tu,length(Y5/Tu));
plot(f,Y5);grid
axis([-(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); % 并串转换,发射串行复信号
%
评论1