📄 untitled33.m
字号:
%ofdm.m
%QPSK仿真实现OFDM传输系统
%---------定义参数--------
para=128; %并行传输的信道数(点数)
fftlen=128; %FFT长度
noc=128; %子载波数
%nd=6; %每次循环含有的OFDM 符号数
ml=2; %调制电平:QPSK(二电平)
Tu=224e-6; % OFDM 有效帧长度:224us
T=Tu/2048; % 基带符号长度:224/2048us
G=0; %保护长度选择项:choice of 1/4, 1/8, 1/16, and 1/32
delta=G*Tu; % 保护长度:guard band duration
Ts=delta+Tu; %总OFDM帧长度:delta+Tu; total OFDM symbol period
Kmax=1705; %子载波数目:1706 ;number of subcarriers
Kmin=0; %Kmax为最高载波频率,Kmin为最低载波频率;
FS=4096; %傅里叶变换长度:IFFT/FFT length
q=10; %carrier period to elementary period ratio
fc=q*1/T; %载波频率:carrier frequency
Rs=4*fc; %仿真频率:simulation period
t=0:1/Rs:Tu;
%------------主循环部分---------
nloop2=100; %仿真循环次数
noe=0; %误码率
nod=0; %传输的数据数量
eop=0; %误组数
nop=0; %传输的分组数
snr=0; %信噪比
nloop1=input('nloop1=');
for jjj=1:nloop1
snr=snr+1;
for iii=1:nloop2
%--------------发送部分--------
%--------------产生数据--------
seldata=rand(1,para*ml)>0.5;%(均匀分布的随机矩阵函数;para*ml每次产生的数据个数)
%seldata得到的实际上是右边那个逻辑表达式的结果,rand产生的值如果大于0.5,则seldata为1,如果小于0.5,则seldata为0
%---------------------串并变换-------------
paradata=reshape(seldata,para,ml);
%变换方式:前128bit变为第一列,随后的128bit为第二列,依此类推
%----------------------QPSK调制-------------
x=qpskmod(paradata,para,ml); % 实现QPSK调制,并规一化
%-------------IFFT--------------
y=ifft(x,fftlen) ;
%-----------并串转换--------
paradata1=reshape(y,1,para);
ich2=real(paradata1);
qch2=imag(paradata1);
%------------插入保护间隔----------
[ich3,qch3]=giins(ich2,qch2,para,gilen);
para1=para+gilen;
paradata2=ich3+qch3.*i;
%----------D/A仿真----------
%Data generator (A)
A=length(paradata2);
info=zeros(FS,1);
info(1:(A/2)) = [ paradata2(1:(A/2)).']; %Zero padding
info((FS-((A/2)-1)):FS) = [ paradata2(((A/2)+1):A).'];
%Subcarriers generation (B)
carriers=FS.*ifft(info,FS); %用ifft进行调制,得到时域信号:由虚部和实部组成
tt=0:T/2:Tu;
figure(1);
subplot(2,1,1);
stem(tt(1:20),real(carriers(1:20))); %显示实部
subplot(2,1,2);
stem(tt(1:20),imag(carriers(1:20))); %显示虚部
figure(2);
f=(2/T)*(1:(FS))/(FS); %频率
subplot(2,1,1);
plot(f,abs(fft(carriers,FS))/FS); %计算和显示调制信号的频谱
%subplot(2,1,2);
%pwelch(carriers,[],[],[],2/T);
%D/A 仿真
L = length(carriers);
chips = [ carriers.';zeros((2*q)-1,L)];
p=1/Rs:1/Rs:T/2;
g=ones(length(p),1); %pulse shape
figure(3);
stem(p,g);
dummy=conv(g,chips(:));
u=[dummy(1:length(t))]; % (C)
figure(4);
subplot(211);
plot(t(1:400),real(u(1:400)));
subplot(212);
plot(t(1:400),imag(u(1:400)));
figure(5);
ff=(Rs)*(1:(q*FS))/(q*FS);
subplot(211);
plot(ff,abs(fft(u,q*FS))/FS);
subplot(212);
%pwelch(u,[],[],[],Rs);
[b1,a1] = butter(13,1/20); %reconstruction filter
[H,F] = freqz(b1,a1,FS,Rs);
figure(6);
%plot(F,20*log10(abs(H)));
plot(F,abs(H));
uoft = filter(b1,a1,u); %baseband signal (D)
figure(7);
subplot(2,1,1);
plot(t(80:480),real(uoft(80:480)));
subplot(2,1,2);
plot(t(80:480),imag(uoft(80:480)));
figure(8);
subplot(2,1,1);
plot(ff,abs(fft(uoft,q*FS))/FS);
subplot(212);
%pwelch(uoft,[],[],[],Rs);
%---------------上变频-----------
delay=0;
s_tilde=(uoft(delay+(1:length(t))).').*exp(1i*2*pi*fc*t);
s=real(s_tilde);
%--------------加入加性高斯白噪声--------------
paradata3=awgn(s,snr,'measured');
%--------------接收部分-------------
%----------下变频----------
r_tilde=exp(-1i*2*pi*fc*t).*real(paradata3);
[B,AA] = butter(3,1/2);
r_info=2*filter(B,AA,r_tilde);
%-------------A/D仿真----------
r_data=real(r_info(1:(2*q):length(t)))... %Baseband signal, discrete-time
+i*imag(r_info(1:(2*q):length(t))); % (H)
%-----------------移除保护间隔---------------
ich4=real(r_data);
qch4=imag(r_data);
[ich5temp,qch5temp]=girem(ich4,qch4,para1,gilen);
%-----------------串并转换--------
ich5=reshape(ich5temp,para,1);
qch5=reshape(qch5temp,para,1);
%----------------FFT----------------
rx=ich5+qch5.*i;
ry=fft(rx,fftlen);
ich6=real(ry);
qch6=imag(ry);
%---------------QPSK解调-----------
[demodata]=qpskdemod(ich6,qch6,para);
%------------------并串转换-------------
demodata1=reshape(demodata,1,para*ml);
%-------------------误比特率(BER)-------------
%即使的误码和数据
noe2=sum(abs(demodata1-seldata));
%将接受解调后的信号与原始信号相比较,累计不一样的
nod2=length(seldata); %发送信号总长度
%累计误码数和总的数据
noe=noe+noe2;
%因为是进行了nloop次的循环,所以把每次循环的数据和误码数积累起来
nod=nod+nod2;
%计算误组率(PER)(每次循环作为一个分组)
end
ber=noe/nod %总的误码率
noe=0;
nod=0;
xsnr(jjj)=snr;
yber(jjj)=ber;
end
%-----------画图------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -