
%本程序用于OFDM基本原理仿真
%数据调制采用QPSK
clear allclc
%*****************参数设置部分**********************
SNR=10 %信噪比取值,dB为单位
fl=128 %设置FFT长度
Ns=6 %设置一个帧结构中OFDM信号的个数
para=128%设置并行传输的子载波个数
gl=32 %设置保护时隙的长度
%***************发送端部分*************************
Signal=rand(1,para*Ns*2)>0.5 %产生0,1随机数列,符号个数为para*2*Ns
%for i=1:para
%for j=1:Ns*2
% SigPara(i,j)=Signal(i*j)错误的,作者是傻X
%串并转换,将随机产生的二进制矩阵变换为行数为para,列数为2*Ns的矩阵
%end
%end
SigPara=reshape(Signal,para,2*Ns)
%***********进行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=ich1+qch1.*sqrt(-1) %产生复信号
y=ifft(x) %通过傅里叶反变换,将频域数据转换为时域数据
ich2=real(y)%I信道取变换后的实部
qch2=imag(y) %I信道取变换后的虚部
%*******************插入保护间隔*******************
ich3=[ich2(fl-gl+1:fl,:)ich2]
qch3=[qch2(fl-gl+1:fl,:)qch2]
%******************并串转换*********************
ich4=reshape(ich3,1,(fl+gl)*Ns)
qch4=reshape(qch3,1,(fl+gl)*Ns)
%*****************形成复数发射数据***************
TrData=ich4+qch4.*sqrt(-1)
ReData=awgn(TrData,SNR,'measured')
%接收端 移去保护时隙
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)
%符号抽样判决
ReSig=ReSig>0.5
figure
subplot(2,1,1)
stem(ReSig(1:1000))
legend('输出数据')
grid
subplot(2,1,2)
stem(Signal(1:1000))
legend('输入数据')
grid
%end of script file
这是我做的一个OFDM系统仿真。供你参考。呵呵。
clear
clc
carr=256 %子载波个数
sym_c=10 %每个子载波含有的OFDM符号数
bit_sym=2 %每个符号含有的比特数,QPSK调制
IFFT_n=256%IFFT点数
r=1/10%保护间隔和OFDM数据的比例;
SNR=10%信噪比 dB
%产生信号
sum=carr*sym_c*bit_sym
colume=sum/(2*carr)
signal=rand(1,sum)>0.5 %初始信号
%QPSK调制,QPSK_sig里面存放的是调制后的信号,数目sumQ
sumQ=sum/2
imag=sqrt(-1) % 虚部 j
QPSK=[-1+imag,-1-imag,1+imag,1-imag] %创建QPSK 映射表
SIGNAL=zeros(1,sumQ) %计算并存放调制前的十进制数据
QPSK_sig=zeros(1,sumQ) %存放调制后的QPSK信号
for n=1:sumQ
SIGNAL(n)=signal(2*n-1)*2+signal(2*n)%将二进制换算成十进制
end
for i=1:sumQ
if SIGNAL(i)==0
QPSK_sig(i)=QPSK(1)
elseif SIGNAL(i)==1
QPSK_sig(i)=QPSK(2)
elseif SIGNAL(i)==2
QPSK_sig(i)=QPSK(3)
elseif SIGNAL(i)==3
QPSK_sig(i)=QPSK(4)
end
end
%串/并转换 计算第i个载波上面的信号to_par(i,:)
colume=sumQ/carr
for i=1:carr % carr载波个数
for j=1:colume
to_par(i,j)=QPSK_sig(carr*(j-1)+i)
end
end
colume=sumQ/carr
% % to_par=reshape(QPSK_sig,carr,colume)
%每个子载波上进行 IFFT变换 (调制后的QPSK信号进行IFFT)
for j=1:colume
y(:,j)=ifft(to_par(:,j))
end
% % y=ifft(to_par)
yr=real(y) %实部
yi=(y-yr)*sqrt(-1)*(-1)
%加入保护间隔
CP_len=r*colume %保护间隔长度
yr=[yr(:,colume-CP_len+1:colume),yr]
yi=[yi(:,colume-CP_len+1:colume),yi]
% 并/串 转换
% % y_=yr+yi*sqrt(-1) %并联的复信号
% % colume=sum/(2*carr)
% % for i=1:carr % carr载波个数
% % for j=1:colume
% % y_series(carr*(j-1)+i)=y_(i,j)
% % end
% % end
y_=yr+yi*sqrt(-1)
y_series=reshape(y_,1,(colume+CP_len)*carr)
%加入高斯白噪声
y_s_noi=awgn(y_series,SNR,'measured')
% 串/并 转换
% % for i=1:carr
% % for j=1:colume
% % y_par(i,j)=y_s_noi(carr*(j-1)+i)
% % end
% % end
y_par=reshape(y_s_noi,carr,colume+CP_len)
%去掉保护间隔
y_r=real(y_par)
y_i=(y_par-y_r)*(-1)*sqrt(-1)
y_r=y_r(:,CP_len+1:colume+CP_len)
y_i=y_i(:,CP_len+1:colume+CP_len)
%FFT变换
y_complex=y_r+y_i*sqrt(-1)
% % for i=1:carr
% % y_fft(i,:)=fft(y_complex(i,:))
% % end
for j=1:colume
y_fft(:,j)=fft(y_complex(:,j))
end
%并/串 转换
% % for i=1:carr
% % for j=1:colume
% % y_receive(carr*(j-1)+i)=y_fft(i,j)
% % end
% % end
y_receive=reshape(y_fft,1,sumQ)
%下面注释掉的部分是验证调制后的QPSK和接收到的复信号对比。
% % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% % % % figure(1)
% % % % subplot(2,1,1),stem(QPSK_sig(1:50)),grid minor
% % % % title('The Original Signal')
% % % % xlabel('x'),ylabel('y')
% % % %
% % % % subplot(2,1,2),stem(y_receive(1:50)),grid minor
% % % % title('The Final Signal')
% % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% QPSK逆映射
QPSK=[-1+imag,-1-imag,1+imag,1-imag]
Y_r=real(y_receive)
Y_i=(y_receive-Y_r)*(-1)*sqrt(-1)
for i=1:sumQ
if Y_r(i)<0
Y_r(i)=0
else
Y_r(i)=1
end
end
for i=1:sumQ
if Y_i(i)<0
Y_i(i)=1
else
Y_i(i)=0
end
end
for i=1:sumQ
Y(2*i-1)=Y_r(i)
Y(2*i)=Y_i(i)
end
check=signal-Y
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(1)
subplot(3,1,1),stem(signal(1:50)),grid minor
title('The Original Signal')
xlabel('x'),ylabel('y')
subplot(3,1,2),stem(Y(1:50)),grid minor
title('The Final Signal')
subplot(3,1,3),stem(check(1:50)),grid minor
title('发端与收端的误差')
matlab是要学习的,最起码你要会建立文件,会对其进行仿真。下面的程序可以直接复制到一个新的m文件中进行仿真。clear
clc
SNR=10 % 信噪比
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(i*j)%串并变换
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=ich1+qch1.*sqrt(-1) %频域数据变时域
y=ifft(x)
ich2=real(y)
qch2=imag(y)
%插入保护间隔
ich3=[ich2(fl-gl+1:fl,:)ich2]
qch3=[qch2(fl-gl+1:fl,:)qch2]
%并串变换
ich4=reshape(ich3,1,(fl+gl)*Ns)
qch4=reshape(qch3,1,(fl+gl)*Ns)
%形成复数发射数据
TrData=ich4+qch4.*sqrt(-1)
%接收机
%加入高斯白噪声
ReData=awgn(TrData,SNR,'measured')
%接收端
%移去保护间隔
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)
%符号抽样判决
ReSig=ReSig>0.5
figure(1)
subplot(2,1,1),stem(ReSig(1:20)),grid minor
title('resignal')
xlabel('x'),ylabel('y')
subplot(2,1,2),stem(Signal(1:20)),grid
title('signal')
这是一个最基本的OFDM系统仿真,可以与OFDM系统框图对照理解,希望能帮到你。
另外,团IDC网上有许多产品团购,便宜有口碑
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)