??

解决方案 »

  1.   

    《数字信号处理》void CExam2View::SingleFFT(unsigned long ullength, unsigned int fFrameMove)
    {
    CExam2Doc* pDoc = GetDocument();
    pDoc->m_EleFre->SetSize(0);
    pDoc->m_EleFre->SetSize(ullength);
    _complex temp1={0,0};
      _complex temp2={0,0};
      _complex cMultiNum={0,0};
      _complex *fFrameElement;
      fFrameElement=new _complex[ullength];
      for(unsigned int j=0;j<ullength;j++)
      {
      fFrameElement[j].x=pDoc->m_EleTime->GetAt(j);
      fFrameElement[j].y=0;
      }
      Sort(fFrameMove,fFrameElement);
      int step=(int)(log10(fFrameMove)/log10(2));///(double)(log2(2)));
      for(int i=0;i<step;i++)
      {
      for(j=0;j<fFrameMove;j+=(unsigned int)pow(2,i+1))
      {
      for(int k=0;k<(int)pow(2,i);k++)
      {
      cMultiNum.x=cos(double(2*k*PI)/((double)fFrameMove/(double)pow(2,step-i-1)));
      cMultiNum.y=-sin(double(2*k*PI)/((double)fFrameMove/(double)pow(2,step-i-1)));
      temp1.x=fFrameElement[j+k].x+fFrameElement[j+k+(int)pow(2,i)].x*cMultiNum.x-fFrameElement[j+k+(int)pow(2,i)].y*cMultiNum.y;
      temp1.y=fFrameElement[j+k].y+fFrameElement[j+k+(int)pow(2,i)].x*cMultiNum.y+fFrameElement[j+k+(int)pow(2,i)].y*cMultiNum.x;
      temp2.x=fFrameElement[j+k].x-fFrameElement[j+k+(int)pow(2,i)].x*cMultiNum.x+fFrameElement[j+k+(int)pow(2,i)].y*cMultiNum.y;
      temp2.y=fFrameElement[j+k].y-fFrameElement[j+k+(int)pow(2,i)].x*cMultiNum.y-fFrameElement[j+k+(int)pow(2,i)].y*cMultiNum.x;
      fFrameElement[j+k]=temp1;
      fFrameElement[j+k+(int)pow(2,i)]=temp2;
      }
      }
      }
      for(j=0;j<ullength;j++)
      {
      pDoc->m_EleFre->SetAt(j,sqrt(pow(fFrameElement[j].x,2)+pow(fFrameElement[j].y,2)));
      }
      delete fFrameElement;
    }void CExam2View::Sort(unsigned int fFrameMove, _complex *fFrameElement)
    {
    unsigned int i=0,j=0,k=0;
    _complex temp={0,0};
    unsigned int uiNv2=fFrameMove/2;
    unsigned int uiNm1=fFrameMove-1;
    while(i<uiNm1)
    {
    if(i<=j)
    {
    temp=fFrameElement[i];
    fFrameElement[i]=fFrameElement[j];
    fFrameElement[j]=temp;
    }
    k=uiNv2;
    while(k<=j)
    {
    j=j-k;
    k=k/2;
    }
    j=j+k;
    i++;
    }}