(参考)基于matlab的OFDM信号调制解调与多径传输

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

基于matlab的OFDM信号调制和多径传输仿真
一、OFDM信号的调制
OFDM系统实现的基本步骤为:首先是对待发送的序列进行串并转换,然后进行映射,再对其进行IFFT,即为OFDM信号的调制,加入循环前缀,然后发送。

接收端接收到信号首先去掉循环前缀,然后进行FFT,即为OFDM信号的解调,然后在进行并串转换,最后进行判决得到接收序列。

1、产生发送序列:可以通过matlab的round(rand(1,N))命令来产生一个随机
的发送序列。

2、串并转换:通过matlab的reshape命令进行串并转换,需要注意的是转换后的
结果是以列为单位的,不是以行为单位的。

3、16QAM调制:一般可以用QPSK、M-QAM等调制方式,本次试验使用16QAM
调制方式。

在实验中利用所编的qam.m(自己编的)子函数来进行16QAM调
制。

4、调制:OFDM信号的调制是利用IFFT来实现的,注意使用matlab的IFFT命令
时,是对矩阵的列向量进行变换,而不是对行向量进行变换,这样经过变换后每一行的元素的频率就是一样的,而正好每一行频率都是正交的,而每一行是属于同一个子载波。

5、加入循环前缀:将IFFT变换后的后面gl个元素复制到前面,作为循环前缀,
这样能抵抗由于多径时延引起的码间干扰的影响,如果循环前缀的长度大于最大时延扩展,则在理论上说能完全消除码间干扰的影响。

6、并串转换后送入信道进行传输,信号在信道中会产生多径、频偏、相偏等现
象。

7、接收端进行串并转换(同(2));
8、去循环前缀;
9、FFT:去循环前缀之后的信号进行FFT,使用matlab的FFT命令;
10、信道估计:在此实验中是利用多径时延信道进行信息传送的,因此信号在信道
中传输的过程中会出现多径时延,多普勒频移等现象,所以接收到的信号会产生严重的失真,但是如果我们知道信道对信号的影响,在接收端对信号进行恢复,从而减弱甚至抵消信道对信号的影响。

本实验中使用基于LS算法的信道
估计。

11、 16QAM 解调:在实验中利用deqam.m (自己编的)子函数进行16QAM 解调。

二、 仿真结果 1、
产生的发送序列:随机产生的0—1序列,总数为25600个,此处只画出它的前50个值;
序号
幅度
图1
2、
经过符号的星座映射后产生的星座图:该实验中使用16QAM 进行数字调制;
产生的复信号的星座图
图2
3、 发送信号:
-0.4
-0.3-0.2-0.100.10.20.30.4
-0.4-0.3-0.2-0.100.10.20.3
0.4加入噪声的发送信号
图3
4、
接收信号:信号在信道中传输,不仅会受到噪声的影响,还会产生多径时延、多普勒频移等现象,所以信号会出现严重的失真;
-0.4-0.3-0.2-0.100.10.20.30.40.5接收信号
图4
5、 信道估计后信号的星座图:
-2
-1.5-1-0.500.51 1.52
-2-1.5-1-0.500.511.5
2信道估计后的信号矢量图(最大时延为23个数据单位)
图5
图6
6、 接收序列:所得的接收序列应该也是一个长度为25600的0—1序列,此处只画出它的前50个值;
序号
幅度
图7
多径时延信道对信号的一个重要影响就是会使信号产生多径时延,如图8、9、10分别列出了最大时延为16、33和41个数据单位时信道估计后的信号的矢量图;
-2
-1.5-1-0.500.51 1.52
-2-1.5-1-0.500.511.5
2信道估计后的信号矢量图(最大时延为16个数据单位)
图8
信道估计后的信号矢量图(最大时延为33个数据单位)
-3-2-10123
图9
信道估计后的信号矢量图(最大时延为41个数据单位)
图10
从图8、9、10可以看出,随着最大时延的增大,信道估计后的信号的矢量图的离散性越来越大。

所以说最大时延和误码率有关。

最大时延和误码率的关系
最大时延 [单个数据单位]
误码率
图11
以上所涉及的都是4-path Rayleigh Fading channel,下图是多径的条数和系统误码率的关系;
1011121314
151617181920
10
10
10
10
10
SNR(dB)
B E R
OFDM Simulation
图12
从图12可以看出,在相同的信噪比下,随着信道多径条数的增大,系统的误码率也随之增大。

当信道多径的条数一定时,系统的误码率随着信噪比的增大而减小。

下面分析系统误码率和信噪比的关系(以多径条数为4为例)
图13、14和15分别给出了当系统的信噪比为20,15,10dB时,信道估计后的信号的矢量图;
信道估计后的信号矢量图(SNR=20dB)
-2.5-2-1.5-1-0.500.51 1.52 2.5
图13
信道估计后的信号矢量图(SNR=15dB)
图14
-3-2
-1
1
2
3
信道估计后的信号矢量图(SNR=10dB )
图15
从图13、14、15可以看出,随着系统信噪比的减小,信道估计后的信号与发送信号的区别越来越大。

下图为基于4-path Rayleigh Fading channel 的系统的信噪比和误码率的关系;
10
10
10
10
10
OFDM Simulation
SNR[dB]
B E R
图16
附:本次实验用到的程序
clc;
clear all;
rand('state',4);
SNR=15;%信噪比取值,单位为db
fl=128;%fft的长度
Ns=50;%设置一个帧结构中OFDM信号的个数
para=128;%设置并行传输的子载波个数
sr=250000;%设置符号速率
br=sr*2;%设置每个子载波的比特率
gl=32;%设置保护时隙的长度
an=[1,0.7,0.3,0.5];%每条多径的幅度增益
% tn=[0,1,2,3];%每条路径的相对时延,单位为us
wn=rand(1,4).*10;%每条路径的多普勒频移
% an=rand(1,4)*2;
tn=fix(rand(1,4)*0);
% wn=round(rand(1,4)*10);
sita=rand(1,4).*2*pi;%设置相偏
%************信源发生器****************************************
signal=round(rand(1,para*Ns*4));
figure(1);
stem(signal(1:50));
title('产生的序列');
%*************16QAM调制***********************************
x1=qam(signal);
x=reshape(x1,para,Ns);
figure(2);
plot(x,'o');
title('产生的复信号的星座图');
%***************加入训练序列*******************************************
training_symbols=qam(round(rand(1,para*4)));
training_symbols=training_symbols';
training_symbols_2=cat(2,training_symbols,training_symbols);
training_symbols_4=cat(2,training_symbols_2,training_symbols_2);
training_symbols_8=cat(2,training_symbols_4,training_symbols_4);
x=cat(2,training_symbols_8,x);
%**********************IFFT****************************************
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+8));
qch4=reshape(qch3,1,(fl+gl)*(Ns+8));
Trdata=ich4+qch4.*sqrt(-1);%形成复数发射数据
%***************************加入噪声*********************************** Trdata_power=var(Trdata)+mean(Trdata)*mean(Trdata);
linear_SNR=10^(SNR/10);
noise_sigma=Trdata_power/linear_SNR;
noise_factor=sqrt(noise_sigma);
noise=randn(1,length(Trdata))*noise_factor;
redata=Trdata+noise;
% redata=Trdata;
figure(3)
plot(redata,'o');
title('加入噪声的发送信号');
%****************************建立信道*************************************** %*******得到信道的响应函数,然后令输入信号和信道响应做卷积得到输出信号
q=0:max(tn);
h=zeros(4,max(tn)+1);
for p=1:4
h(p,:)=an(p).*exp(sqrt(-1).*(wn(p).*q)).*exp(sqrt(-1)*sita(p)).*(dirac(q-tn(p))>1);
end
h=sum(h);
s2=conv(redata,h);
s3=s2(1:length(redata));
figure(4)
plot(s3,'o');
title('接收信号')
%***********************接收端,去掉循环前缀,fft***********
idata=real(s3);
qdata=imag(s3);
idata1=reshape(idata,fl+gl,Ns+8);
qdata1=reshape(qdata,fl+gl,Ns+8);
idata2=idata1(gl+1:gl+fl,:);
qdata2=qdata1(gl+1:gl+fl,:);
Rx_data=idata2+qdata2*sqrt(-1);
Rx_carriers=fft(Rx_data);
Rx_training_symbols=Rx_carriers(:,(1:8));
Rx_carriers=Rx_carriers(:,(9:(Ns+8)));
%************************信道估计*******************
training_symbols=cat(2,training_symbols,training_symbols);
training_symbols=cat(2,training_symbols,training_symbols);
training_symbols=cat(2,training_symbols,training_symbols);
Rx_training_symbols=Rx_training_symbols./training_symbols;
Rx_training_symbols_deno=Rx_training_symbols.^2;
Rx_training_symbols_deno=Rx_training_symbols_deno(:,1)+Rx_training_symbols_deno(:,2)+Rx_trainin g_symbols_deno(:,3)+Rx_training_symbols_deno(:,4)+Rx_training_symbols_deno(:,5)+Rx_training_sy mbols_deno(:,6)+Rx_training_symbols_deno(:,7)+Rx_training_symbols_deno(:,8);
Rx_training_symbols_nume=Rx_training_symbols(:,1)+Rx_training_symbols(:,2)+Rx_training_symbols( :,3)+Rx_training_symbols(:,4)+Rx_training_symbols(:,5)+Rx_training_symbols(:,6)+Rx_training_symb ols(:,7)+Rx_training_symbols(:,8);
% Rx_training_symbols_nume=conj(Rx_training_symbols_nume);
Rx_training_symbols=Rx_training_symbols_nume./Rx_training_symbols_deno;
Rx_training_symbols2=cat(2,Rx_training_symbols,Rx_training_symbols);
Rx_training_symbols4=cat(2,Rx_training_symbols2,Rx_training_symbols2);
Rx_training_symbols8=cat(2,Rx_training_symbols4,Rx_training_symbols4);
Rx_training_symbols16=cat(2,Rx_training_symbols8,Rx_training_symbols8);
Rx_training_symbols32=cat(2,Rx_training_symbols16,Rx_training_symbols16);
Rx_training_symbols48=cat(2,Rx_training_symbols32,Rx_training_symbols16);
Rx_training_symbols50=cat(2,Rx_training_symbols48,Rx_training_symbols2);
Rx_carriers=Rx_training_symbols50.*Rx_carriers;
%**********进行傅里叶变换****************
ry=reshape(Rx_carriers,1,para*Ns);
figure(5);
plot(ry,'o');
title('经过fft之后的信号矢量图');
%*************************16QAM解调************************************ resignal=deqam(ry);
figure(6)
stem(resignal(1:50),'k');
hold on
stem(signal(1:50),'r');
title('接收到的序列')
[wumageshu,wumalv]=biterr(signal,resignal);
wumageshu
wumalv
素材资料从网络收集整理而来,供参考!。

相关文档
最新文档