请用软件编程实现OFDM调制。
请用软件编程实现OFDM调制。
-
每个OFDM符号是多个经过调制的子载波信号之和,其中每个子载波的调制方式可以选择相移键控(PSK)或者正交幅度调制(QAM)。如果用N表示子信道的个数,T表示OFDM符号的宽度,di(i=0,1,…,N-1)表示分配给每个子信道的数据符号,fc表示载波频率,则从t=ts开始的OFDM符号可以表示为
(6.3.1)
式(6.3.1)的实部和虚部分别对应于OFDM符号的同相和正交分量,在实际中可以分别与相应子载波的cos分量和sin分量相乘,构成最终的子信道信号和合成的OFDM符号。图6.3.6给出了OFDM系统调制和解调的框图,图中假定ts=0。
实际上,式中定义的OFDM复等效基带信号可以采用离散逆傅里叶变换(IDFT)来实现。令式(6.3.1)中的ts=0,t=kT/N(k=0,1,…,N-1),则可以得到
(6.3.2)

式中,s(k)即为di的IDFT运算。在接收端,为了恢复出原始的数据符号di,可以对s(k)进行DFT变换,得到
OFDM系统的调制和解调可以分别由IDFT/DFT来代替。通过N点IDFT运算,把频域数据符号d,变换为时域数据符号S(k),经过载波调制之后,发送到信道中。在接收端,将接收信号6进行相干解调,然后将基带信号进行N点DFT运算,即可获得发送的数据符号di。在OFDM系统的实际应用中,可以采用更加方便、快捷的快速傅里叶变换(FFT/IFFT)来实现调制和解调。N点IDFT运算需要实施N2次的复数乘法,而IFFT可以显著地降低运算的复杂度。N=16,s(k)=1+j(0≤k≤N-1),调制程序如下:
#include<iostream.h>
#include<math.h>
class complex
{
public:
complex(double xx=0.0,double yy=0.0){x=xx;y=yy;)
complex operator*(complex);
complex operator+(complex);
void display( );
private:
double x;
double y;
};
complex complex::operator*(complex b)
{
complex temp;
temp. x=x*b. x-y*b.)y;
temp.y=x*b.y+y*b.x;
return temp;
}
complex complex::operator+(complex b)
{
complex temp;
temp.x=x+b.x:
temp.y=y+b.y;
return temp;
}
void complex::display( )
{
cout<<"("<<x<<")"<<"+"<<"("<<y<<")"<<"j"<<end1;
}
void main( )
{ for(int n=0;n<=15;n++)
{ for(int k=0;k<=15;k++)
{double c,s,pi;
pi=4.*atan(1.);
c=cos(-2*n*k*pi/16);
s=sin(-2*n*k*pi/16);
complex a(1.0,1.0);
complex b(c,s);
complex d;
complex e(0.0,0.0);
d=a*b:
e=e+d;
if(k==15、
e.display( );
}
}
}
16点IDFT运行结果如图6.3.7所示。

