%OFDM基本原理仿真
%依照老师要求采用QPSK调制
clear;clc;
%................................参数设置..............................
SNR=10; %信噪比取值,以分贝(dB)为单位
fl=128; %设置FFT长度
Ns=6; %设置一个帧结构中OFDM信号的个数
para=128; %设置并行传输的子载波个数
sr=250000; %设置符号速率
br=sr.*2; %设置每个子载波的比特率
gl=32; %设置保护时隙的长度
%.................................发送端......................
Signal=rand(1,para*Ns*2)>0.5;
%产生0,1随即数列,符号个数为para*Ns*2(即子信道个数*调制水平*每个子信道中有用符号个数)
for i=1:para
for j=1:Ns*2
SigPara(i,j)=Signal(1,i*j);
%串并变换,将随即产生的二进制矩阵变成行数为para,列数为2*Ns的矩阵
end
end
%进行QPSK数据调制,将数据分成两个通道
for j=1:Ns
ich(:,j)=SigPara(:,2*j-1);
qch(:,j)=SigPara(:,2*j);
end
kmod=1./sqrt(2);
ich1=ich.*kmod;
qch1=qch.*kmod;
x=ich+qch1.*sqrt(-1); %产生复信号
y=ifft(x); %通过傅里叶变换将频域信号转换为时域信号
ich2=real(y); %时域信号实部
qch2=imag(y); %时域信号虚部
%插入循环前缀作为保护间隔,前缀长度为gl
ich3=[ich2(fl-gl+1:fl,:);ich2];%实部
qch3=[qch2(fl-gl+1:fl,:);qch2];%虚部
%并串变换
ich4=reshape(ich3,1,(fl+gl)*Ns);%将ich3中的序列抽出,构成1行(fl+gl)*Ns列的ich4
qch4=reshape(qch3,1,(fl+gl)*Ns);%
%形成复数发射数据
Trdata=ich4+qch4.*sqrt(-1);
figure(1);%%%
subplot(2,1,1),stem(Trdata(1:50)),title('加入AWGN前部分序列样点');
%信道中加入高斯白噪声
Redata=awgn(Trdata,SNR,'measured','linear');%help中awgn的第三种用法
subplot(2,1,2),stem(Redata(1:50)),title('加入AWGN后部分序列样点');
%接收端
idata=real(Redata);
qdata=imag(Redata);
idata1=reshape(idata,fl+gl,Ns);%串并变换
qdata1=reshape(qdata,fl+gl,Ns);
idata2=idata1(gl+1:gl+fl,:);%%去除循环前缀
qdata2=qdata1(gl+1:gl+fl,:);
%FFT
Rex=idata2+qdata2*sqrt(-1);
ry=fft(Rex);
ReIchan=real(ry);
ReQchan=imag(ry);
ReIchan=ReIchan./kmod;
ReQchan=ReQchan./kmod;
%QPSK逆映射
for j=1:Ns
RePara(:,2*j-1)=ReIchan(:,j);
RePara(:,2*j)=ReQchan(:,j);
end
ReSig=reshape(RePara,1,para*Ns*2);
%符号判决
j=0;
for i=1:length(ReSig)
if ReSig(1,i)>0.5
ReSig(1,i)=1;
else
ReSig(1,i)=0;
end
end
ber=sum(abs(Signal-ReSig))/(2*128*6);
fprintf('ber的估计值%d\n',ber);%就是这里的输出,误码率居然40+%
figure(3);%%%
subplot(2,1,1),stem(ReSig(1:100)),title('接收端接收到的序列(前100个点)'),grid;
subplot(2,1,2),stem(Signal(1:100)),title('原始序列(前100个点)'),grid;%但是对比输入输出的图的时候基本没有误码点的
我是小白~~~求各位帮忙,再有几天这个就交了~~实在是有点力不从心了啊
我来回答