
%实现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
起因是这样的。最近刚写完专利,脑壳巨大无比,所以想写点文章陶冶下情 *** 。但是我这个大老粗爷们也写不来言情小说,搞得我很是痛苦。我唯一会的也就只有 matlab了,, 所以写一篇文章自我陶醉一下,哈哈哈。。
最近也是天气晴朗,雾霾飘香。最痛苦的是下周OFDM的通信系统测试。想必同学们也是脑壳比我还大,也有很多同学问我这个 OFDM咋个做哦。我也简单的说下在高斯信道下的 OFDM系统,其实也讲了讲瑞利,莱斯信道下的 OFDM。 但是不要求嘛 ,确实那个有点难。
他们我们通信就是装点宽带啊,电线啊,但是不然。我们要自奋强大,还是要懂点小常识
信源编码:着重对信号容量压缩,提高传输效率
信道编码:针对多变的信道插入冗余信息,增加传输稳定性(设计的OFDM插入的CP(循环前缀),引频信号就是冗余信息)。
信号调制:将比特流转换成稳定的波形进行传输
比如: sint 和 sin2t 为一对正交信号,因为 sint*sin2t 在区间[0,2 pi]上的积分为0.
sint和 sin2t是用来承载信号的,我们称为子载波
加入 sint 信号传送信号a ,采用AM调制,它变为 asint
加入 sin2t信号传送信号b,采用AM调制,它变为 bsin2t
那么我们的和信号就变成 xn = asint+ bsin2t
接收a信号时候:将xn * sint 再通过[0,2pi]积分,sin2t的分量信号就变为了0,只剩下带有a的信号
接收b信号时候:将xn * sin2t 再通过[0,2pi]积分,sint的分量信号就变为了0,只剩下带有b的信号
%还不晓得的话,动一动笔写一下就明白了。
我们将sint离散化 就变成了 sin(2*pi*Δf*K*T) 其中K = 1,2,3.....
Δf为子载波间间隔.
我们的f(t) 则可以变成
f(t) = a1·sin(2π·Δf·t) +
a2·sin(2π·Δf·2t) +
a3·sin(2π·Δf·3t) .....
因为sint 和 cost 是正交的。 对吧
f(t) = b1·cos(2π·Δf·t) +
b2·cos(2π·Δf·2t) +
b3·cos(2π·Δf·3t) .....
那么f(t)就可以找到合适的系数ak,和bk,将
f(t) = a1·sin(2π·Δf·t) +
a2·sin(2π·Δf·2t) +
a3·sin(2π·Δf·3t) +
...
ak·sin(2π·Δf·kt) +
b1·cos(2π·Δf·t) +
b2·cos(2π·Δf·2t) +
b3·cos(2π·Δf·3t) +
...
bk·cos(2π·Δf·kt)
综上f(t)=∑ak·sin(2π·Δf·kt) + ∑bk·cos(2π·Δf·kt)
对f(t)进行复数化 :f(t) =∑Fk·e(j·2π·Δf·kt)
这个啥子!!!!这是这就是 傅里叶级数,是不是很 magical .
设计一段晓得bit流,使其分别进行ifft后 与 f(t) =∑Fk·e(j·2π·Δf·kt)公式 两种方法进行对比
现在假定待发送序列00011011,OFDM符号时长为1s,调制方式为QPSK
输入信号 IQ信号 输出信号相位
%00 1/2,1/2 pi/4
%01 -1/2,1/2 3pi/4
%10 -1/2,-1/2 5pi/4
%11 1/2,-1/2 7pi/4
根据 QPSK 的映射关系,求出输入函数:
d1 = 1/2+1i*1/2
d2 = -1/2+1i*1/2
d3 = 1/2+1i*(-1/2)
d4 = -1/2 + 1i*(-1/2)
对输入序列进行IFFT
xk = [0,d1,d2,d3,d4,0,0,0] %输入序列xk
sn = ifft(xk) %IFFT后输出的sn序列
即可得到输入序列后的IFFT曲线
%////////////////////////////////////////////////////////////////////////////////////////////////////
采用公式法: f(t) =∑Fk·e(j·2π·Δf·kt)
我们 QPSK调制 ,则一个 OFDM符号里有2个bit
(一个OFDM符号与调制方式对应的bit数目:(QPSK:2),(16QAM:4),(64QAM:6) )
根据公式求出子载波
%子载波
e1 = exp(1i*2*pi*f*t)
e2 = exp(1i*2*pi*f*t*2)
e3 = exp(1i*2*pi*f*t*3)
e4 = exp(1i*2*pi*f*t*4)
OFDM基带复信号表达式
st = d1*e1 + d2*e2 + d3*e3 + d4*e4 %将上述公式展开
画出st的图像
我们将上述的st与sn图像进行对比
(上图形为实部,下图形为虚部)
可以惊讶的发现: IFFT后的图形就是公式图形的离散值!所以OFDM系统和傅里叶级数有种亲密而不可分离的感情,如同牛郎和织女,杨贵妃和唐玄宗,葫芦娃和爷爷。。。。。 好像有点奇怪
所以 IFFT模块的功能相当于说:别麻烦发送N个子载波信号了,我直接算出你们在空中会叠加成啥样子吧 ; FFT模块的功能相当于说:别用老式的积分方法来去除其余的正交子载波了,我帮你一次把N个携带信号全算出来吧
终于要进行设计了,前面一大堆,我打字都打累了。原来写文章那么辛苦,我觉得司马迁好牛比。。
我们先从最简单的高斯信道说起走嘛。
前面说了傅里叶变化在OFDM系统中的举足轻重的作用,所以我们OFDM系统的仿真才使用IFFT和FFT算法
高斯信号就是在信号通过此信道中加入高斯白噪声。
在maltab通信系统仿真中我们用awgn(TrData1,SNR,'measured')函数来给信号TrData1添加高斯白噪声
信号通过无线信道之后,其信号幅度是随机的,即“衰落”,并且其包络服从瑞利分布.
接受信号具有四种效应:1.阴影 2.远近 3.多径 4.多普勒频移
简单的说莱斯信道比瑞利信道多了一条直流分量。
就是我们所谓的循环前缀,为什么要加入CP循环前缀这个冗余信息呢。 为了抵抗由于多径效应带来的ICI(载波间干扰),设计的时候也要注意下:一个CP占用了每个OFDM符号约的1/15的资源
插入引频信号通过训练序列的信息,实时估计信道,从而再做信号的矫正,从而再解调的时候减少误码率之类。
发送端:
第一步:产生随机数列 Signal=rand(1,para*Ns*2)>0.5
其中我们所设置的 para为并行传输的子载波个数
Ns为一个祯结构中OFDM信号的个数
第二步:进行串并转化
串并转化为十分重要的函数reshape函数
其用法为:SigPara = reshape(Signal,para,Ns*2)将原始信号Signal 信号转化为para 行 Ns*2列的信号
reshape(a,m,n)先把矩阵a按列拆分,然后拼接成一个大小为m*n的向量。
第三步:进行QPSK调制
(1)将数据分为两个通道 即i通道和q通道
函数如下:
for j=1:Ns
ich(:,j)=SigPara(:,2*j-1)
qch(:,j)=SigPara(:,2*j)
end
(2)根据QPSK映射关系,求出输入后的数据
kmod=1./sqrt(2)
ich1=ich.*kmod
qch1=qch.*kmod %QPSK映射关系
第四步:插入保护间隔
ich3=[ich2(fl-gl+1:fl,:)ich2]
qch3=[qch2(fl-gl+1:fl,:)qch2]
我们选取gl = 32:将信号的最后32组数据进行复制,加入到原始信号中 -- 加强容错性
第五步:并串变换
ich4=reshape(ich3,1,(fl+gl)*Ns)
qch4=reshape(qch3,1,(fl+gl)*Ns)
形成复发射数据:TrData1=ich4+qch4.*sqrt(-1)
第六步:发射数据加入高斯白噪声
ReData=awgn(TrData1,SNR,'measured')
%///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
接受端:
第一步:移去保护间隔
(1)进行数据的复式化
idata=real(ReData) %加入噪声后的实部
qdata=imag(ReData) %加入噪声后的虚部
(2)对数据进行串并转化
idata1 = reshape(idata,fl+gl,Ns)
qdata1 = reshape(qdata,fl+gl,Ns)
(3)移去保护间隔
idata2=idata1(gl+1:gl+fl,:)
qdata2=qdata1(gl+1:gl+fl,:)
取idata1的每一列的gl+1 到gl+fl的数据形成iadta2
第二步:FFT
第三步:QPSK解调:
(1)将fft转化后的数据/komd
(2)并串转化
(3)重组信号
第四步:抽样判决
ReSig = Res >0.5将上述重组后的信号进行分析,大于0.5的信号赋值为1,小于0.5的赋值为0
第五步:计算错误的概率
err = 0
for i = 1:para*Ns*2
if (Signal(i)~=ReSig(i))
err = err + 1 %得到误码的个数
end
end
Pe = err / (para*Ns*2)
取多组SNR值,加入高斯信道我们可以得到snr-Pe曲线
%///////////////////////////////////////////////////////////////////////////////////////
图为加入瑞利信道后的OFDM(没有做信道估计)
可见当加入了多径和多普勒频移后的信道 误码率从3%上升到了30%左右,瑞利信道完全破坏了信号的传输
引频信号的引入
我们在加入列引频和行引频
A=[Ar]插行 A=[A c]插列
列间加入引频:
ich2= [zeros(fl,1) ich21(:,[1:Ns/2]) zeros(fl,1) ich21(:,[Ns/2+1:Ns]) zeros(fl,1)]
行间加入引频:
ich2 = [zeros(1,(Ns+3)) ich2(1:fl/2,:) zeros(1,(Ns+3)) ich2((fl/2)+1:fl,:) zeros(1,(Ns+3))]
加入的结果:
加入引频信号后可以通过LS算法来 做信道估计
LS算法基本原理:Y = HX + N 其中N为噪声信号,H为信道的频率响应,Y,X为输出,输入信号的响应
在理想信道下: H' = Y/X 输入除以输出(其中Y为通过瑞利信道后的信号) ,可以得到频率响应H的估计H'
我们用所得到的H'再反过来推算出X的估计:X' = Y/H' 得到新的输入。对X’再进行去引频的后续处理
for j = 1:(Ns+3)
for i = 1:(para+3)
Hls(i,j) = idata21(i,j)./ich2(i,j)
ixg(i,j) = idata21(i,j) ./ Hls(i,j)
hls(i,j) = qdata21(i,j)./qch2(i,j)
qxg(i,j) = qdata21(i,j)./ hls(i,j)
end
end
加入信道估计后误码率的图示:
OFDM系统中 :OFDM系统在只有高斯白噪声的情况下影响较小,OFDM设计在高斯信道下的优势很小
但是在瑞利信道中,OFDM引频信号,CP,信道估计对传输的信号起到了保护的作用。使其在收到多径,多普勒频移的条件下,能够有效的恢复出原信号。
在没有信道估计得OFDM--瑞利系统,多径,远近,阴影,多普勒频偏对信号造成了严重的干扰。使其不能够正常传输,有着严重的误码率。
。。。。。。。打字都打累了,可能里面会有些错误,请各位指正。
clearclc
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系统框图对照理解,希望能帮到你。
这不是我写的,引用自通信西电人
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)