Matlab实现OFDM调制

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Matlab实现OFDM调制

一、实验目的

1、进一步加深对matlab的了解和使用,熟练掌握matlab的相关库函数。

2、学习OFDM调制的原理,通过实验加深对其理解。

3、学会用matlab实现BPSK调制和QPSK调制。

二、实验原理

OFDM调制原理:

OFDM ——OFDM(Orthogonal Frequency Division Multiplexing)即正交频分复用技术,实际上OFDM是MCM Multi-CarrierModulation,多载波调制的一种。其主要思想是:将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进行传输。正交信号可以通过在接收端采用相关技术来分开,这样可以减少子信道之间的相互干扰 ICI 。每个子信道上的信号带宽小于信道的相关带宽,因此每个子信道上的可以看成平坦性衰落,从而可以消除符号间干扰。而且由于每个子信道的带宽仅仅是原信道带宽的一小部分,信道均衡变得相对容易。在向B3G/4G演进的过程中,OFDM 是关键的技术之一,可以结合分集,时空编码,干扰和信道间干扰抑制以及智能天线技术,最大限度的提高了系统性能。包括以下类型:V-OFDM,W-OFDM,F-OFDM,MIMO-OFDM,多带-OFDM。

三、实验内容

实验要求:(1)不加噪声时,调制出来的信号与原信号进行对比。(2)加噪声时的误码率曲线图。

1、

解调的原理框图

2、BPSK调制:f(0)=1,f(1)=-1

代码:

original=randint(1,512*100,2); %源为0和1的随机序列,为1行51200列;用512个子载波,做100次

bpsk=(-1).^original; %BPSK调制,将源中的0替换为-1,生成1行51200列的1和-1序列

m=1;

ioriginal=zeros(1,512*100); %生成零矩阵,定义变量初值

ofdm=zeros(100,512);

iofdm=zeros(100,512);

iiofdm=zeros(1,512*100);

cp=zeros(100,512+10);

cpsend=zeros(1,(512+10)*100);

icp=zeros(100,512);

ibpsk=zeros(1,512*100);

while m~=101

ofdm(m,:)=bpsk(((m-1)*512+1):(m*512)); %将bpsk矩阵转化为100行512列的矩阵ofdm

ofdm(m,:)=ifft(ofdm(m,:),512); %OFDM调制,返回512点的逆向DFT cp(m,1:10)=ofdm(m,503:512); %添加长度为10的循环前缀,

cp(m,11:end)=ofdm(m,:); %生成矩阵cp为100*(512+10)

cpsend(((m-1)*(512+10)+1):(m*(512+10)))=cp(m,:);%cpspend为1*((512+10)*100)

m=m+1;

end

cp1=cpsend; %没有添加噪声是调制生成的矩阵

snr=-2:1:5; %信噪比

ber=zeros(1,length(snr));

light=1;

for t=-2:1:5

m=1; %解调

while m~=101

icp(m,:)=cpsend(((m-1)*512+m*10+1):(m*(512+10))); %去前缀10

iofdm(m,:)=fft(icp(m,:),512); %将icp做返回512点的DFT iiofdm(((m-1)*512+1):(m*512))=iofdm(m,:); %iiofdm为1*(512*100)

m=m+1;

end

for n=1:(512*100)

real_iiofdm=real(iiofdm(n));

image_iiofdm=imag(iiofdm(n));

distance1=sqrt((real_iiofdm+1)^2+image_iiofdm^2); %根据距

离来判断是0还是1

distance0=sqrt((real_iiofdm-1)^2+image_iiofdm^2);

if distance1>=distance0

ibpsk(n)=0;

else

ibpsk(n)=1;

end

end

ioriginal=ibpsk; %计算误码率

flag=(original==ioriginal); %相等时flag为1,不相等时flag为0 error=numel(find(flag==0)); %统计0的个数

ber(light)=error/51200; %计算误码率

light=light+1;

end

semilogy(snr,ber)

BPSK调制的误码率曲线图:

3、QPSK调制: f(00)= (1+i)/sqrt(2),

f(01)= (-1+i)/sqrt(2), f(10)= (-1-i)/sqrt(2),

f(11) =(1-i)/sqrt(2)。

代码:

source=randint(1,512*100,2);

sqpsk=source;

qpsk=zeros(1,512*50);

m=1;

n=1;

while m~=(512*100+1)

if sqpsk(1,m:(m+1))==[0,0]

qpsk(1,n)=1/sqrt(2)*(1+i);

elseif sqpsk(1,m:(m+1))==[0,1]

qpsk(1,n)=1/sqrt(2)*(-1+i);

elseif sqpsk(1,m:(m+1))==[1,0]

qpsk(1,n)=1/sqrt(2)*(-1-i);

else qpsk(1,n)=1/sqrt(2)*(1-i);

end

m=m+2;

n=n+1;

end

m=1;

ssource=zeros(1,512*100);

ofdm=zeros(50,512);

oofdm=zeros(50,512);

ooofdm=zeros(1,512*50);

cp=zeros(50,512+10);

cpsend=zeros(1,(512+10)*50);

ccp=zeros(50,512);

qqpsk=zeros(1,512*100);

for m=1:50

ofdm(m,:)=qpsk(((m-1)*512+1):(m*512));

ofdm(m,:)=ifft(ofdm(m,:),512);

cp(m,1:10)=ofdm(m,503:512);

cp(m,11:end)=ofdm(m,:);

cpsend(((m-1)*(512+10)+1):(m*(512+10)))=cp(m,:); end

cp1=cpsend;

snr=-2:1:5;

ber=zeros(1,length(snr));

as=1;

for t=-2:1:5

相关文档
最新文档