请用软件编程实现OFDM调制。

大学 软件 已帮助 人

请用软件编程实现OFDM调制。

热搜:a的ascii码值用十进制是65,请用二进制描述

答案解析

难度★★☆ 搜索
  • 每个OFDM符号是多个经过调制的子载波信号之和,其中每个子载波的调制方式可以选择相移键控(PSK)或者正交幅度调制(QAM)。如果用N表示子信道的个数,T表示OFDM符号的宽度,di(i=0,1,…,N-1)表示分配给每个子信道的数据符号,fc表示载波频率,则从t=ts开始的OFDM符号可以表示为
       latex.action?latex=cyh0KT1cc3VtIF97aT0tTi8yfV57Ti8yLTF9ZF9pK1xmcmFje059ezJ9ZXhwXGxlZnRbIGoyXHBp%0D%0AIFxmcmFje2l9e1R9KHQtdF9zKSBccmlnaHRd  (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),则可以得到
       latex.action?latex=cyhrKT1zXGxlZnQoIFxmcmFje2tUfXtOfSBccmlnaHQpPVxzdW0gX3tpPTB9XntOLTF9ZF9pZXhw%0D%0AXGxlZnQoIGpcZnJhY3syXHBpIGtpfXtOfSBccmlnaHQp44CAKDBcbGVxIGtcbGVxIE4tMSk%3D  (6.3.2)
       f1.B01276.jpg
       式中,s(k)即为di的IDFT运算。在接收端,为了恢复出原始的数据符号di,可以对s(k)进行DFT变换,得到
       latex.action?latex=ZF9pPVxzdW0gX3trPTB9XntOLTF9cyhrKWV4cCBcbGVmdCggLWpcZnJhY3syXHBpIGtpfXtOfSBc%0D%0AcmlnaHQp44CAKDBcbGVxIGlcbGVxIE4tMSk%3D
       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所示。
       f1.B68799.jpg