请教下OFDM系统在matlab上的仿真程序!

请教下OFDM系统在matlab上的仿真程序!,第1张

%实现OFDM传输的仿真程序

para=128; %并行子信道的个数

fftlen:128; %FFT的长度

paradata=reshape(seldata,para,nd

*m1);

%QPSK调制

[ich,qch]=qpskmod(paradata,para,nd,m1);

kmod=1/sqrt(2);

ichl=ich.*kmod;

qchl=qch.*kmod;

%In叩(离散傅里叶反变换)

X=ichl+qchl.*i:

y=ifft(x);

ich2=real(y);

qch2=imag(y);

%插入保护间隔

[ich3,qch3]=giins(ich2,qch2,fftlen,gilen,nd);

fftlen2=fftlen+gilen;

%衰减计算

spow=suln(ich3.2+qch3.“2)/nd./para;

attn=0.5*spow*sr/br*10.“(.ebn0/10);

attn=sqrt(attn);

%高斯自信道

[ich4,qeh4]=eomb(ich3,qch3,attn);

%接收部分

%去除保护间隔

[ieh5,,qeh5]=girem(ich4,qch4,fftlen2,gilen,

nd);

%FFr(离散傅里叶变换)

IX=ich5+qch5.*i:

ry=fit(Ⅸ);

ich6=real(ry);

qch6=imag(ry);

%QPSK解调

ieh7=ich6./kmod;

qch7=qch6./kmod;

[derrtxtata]=qpskdemod(ich7,qch7,para,nd,m1);

%并串变换

demodatal=reshape(demodata,I,para*nd*rnl);

%比特误码率(BER)

bit—errors=find(seldata~=demodatal);

bit—error—count 2 size(bit—e/TOES,2);

total—bits=size(demodatal,2);

bit—error—rate=bit—error—count/total—bits;

fprintf(7%f\n’,bit—eITor—rate)

%end offile

程序运行结果,输出误码率为:

>>0.037109

OFDM(Orthogonal Frequency Division Multiplexing)即正交频分复用技术,实际上OFDM是MCM(Multi Carrier Modulation),多载波调制的一种。通过频分复用实现高速串行数据的并行传输,它具有较好的抗多径衰落的能力,能够支持多用户接入。

OFDM技术由MCM(Multi-Carrier Modulation,多载波调制)发展而来。OFDM技术是多载波传输方案的实现方式之一,它的调制和解调是分别基于IFFT和FFT来实现的,是实现复杂度最低、应用最广的一种多载波传输方案。

OFDM的发展历史

20世纪70年代,韦斯坦(Weistein)和艾伯特(Ebert)等人应用离散傅里叶变换(DFT)和快速傅里叶方法(FFT)研制了一个完整的多载波传输系统,叫做正交频分复用(OFDM)系统。

OFDM是一种特殊的多载波传输方案。OFDM应用DFT和其逆变换IDFT方法解决了产生多个互相正交的子载波和从子载波中恢复原信号的问题。

这就解决了多载波传输系统发送和传送的难题。应用快速傅里叶变换更使多载波传输系统的复杂度大大降低。从此OFDM技术开始走向实用。但是应用OFDM系统仍然需要大量繁杂的数字信号处理过程,而当时还缺乏数字处理功能强大的元器件,因此OFDM技术迟迟没有得到迅速发展。

你好 希望可以帮到你

%本程序用于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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7951771.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存