Пример #1
0
void fft(double *x_int_re, double *x_int_im, int taille) {
  int size_2 = taille >> 1;
  double base = 2 * M_PI / taille;
  const double SQ_2 = M_SQRT2;
  QVarLengthArray<double> pair_re(size_2), pair_im(size_2), impair_re(size_2),
      impair_im(size_2); // double pair_re[size_2], pair_im[size_2],
                         // impair_re[size_2], impair_im[size_2];
  for (int i = 0; i < size_2; i++) {
    int tmp1 = (i << 1);
    pair_re[i] = x_int_re[tmp1];
    pair_im[i] = x_int_im[tmp1];
    impair_re[i] = x_int_re[tmp1 + 1];
    impair_im[i] = x_int_im[tmp1 + 1];
  }

  if (taille > 2) {
    fft(pair_re.data(), pair_im.data(), size_2);
    fft(impair_re.data(), impair_im.data(), size_2);
  }

  for (int i = 0; i < size_2; i++) {
    double tmp = base * i;
    double tmpcos = cos(tmp);
    double tmpsin = sin(tmp);
    x_int_re[i] =
        (pair_re[i] + impair_re[i] * tmpcos + impair_im[i] * tmpsin) / SQ_2;
    x_int_im[i] =
        (pair_im[i] + impair_im[i] * tmpcos - impair_re[i] * tmpsin) / SQ_2;
    x_int_re[i + size_2] =
        (pair_re[i] - impair_re[i] * tmpcos - impair_im[i] * tmpsin) / SQ_2;
    x_int_im[i + size_2] =
        (pair_im[i] - impair_im[i] * tmpcos + impair_re[i] * tmpsin) / SQ_2;
  }
}
Пример #2
0
void fft_inv(double* x_int_re, double* x_int_im, int taille)
{
    int size_2=taille>>1, tmp1;
    double tmp, tmpcos, tmpsin, base=2*M_PI/taille;
    const double SQ_2=sqrt(2.0);//const double SQ_2=sqrt(2);
    QVarLengthArray<double> pair_re(size_2), pair_im(size_2), impair_re(size_2), impair_im(size_2);//double pair_re[size_2], pair_im[size_2], impair_re[size_2], impair_im[size_2];
    for(int i=0; i<size_2; i++){
        tmp1=i<<1;
        pair_re[i]=x_int_re[tmp1];
        pair_im[i]=x_int_im[tmp1];
        impair_re[i]=x_int_re[tmp1+1];
        impair_im[i]=x_int_im[tmp1+1];
    }

    if(taille>2){
        fft_inv(pair_re.data(), pair_im.data(),size_2);//fft_inv(pair_re, pair_im,size_2);
        fft_inv(impair_re.data(), impair_im.data(),size_2);//fft_inv(impair_re, impair_im,size_2);
    }

    for(int i=0; i<size_2; i++){
        tmp=base*i;
        tmpcos=cos(tmp);
        tmpsin=sin(tmp);
        x_int_re[i]=(pair_re[i]+impair_re[i]*tmpcos-impair_im[i]*tmpsin)/SQ_2;
        x_int_im[i]=(pair_im[i]+impair_im[i]*tmpcos+impair_re[i]*tmpsin)/SQ_2;
        x_int_re[i+size_2]=(pair_re[i]-impair_re[i]*tmpcos+impair_im[i]*tmpsin)/SQ_2;
        x_int_im[i+size_2]=(pair_im[i]-impair_im[i]*tmpcos-impair_re[i]*tmpsin)/SQ_2;
    }
}
Пример #3
0
void fft(double* x_int_re, double* x_int_im, int taille)
{
    int size_2 = taille >> 1, tmp1 = 0;
    double tmp, tmpcos, tmpsin, base = 2*M_PI/taille;
#ifdef Q_CC_MSVC
    const double SQ_2=sqrt(2.0);
    QVarLengthArray<double> pair_re(size_2), pair_im(size_2), impair_re(size_2), impair_im(size_2);
#else
    const double SQ_2=sqrt(2);
    double pair_re[size_2], pair_im[size_2], impair_re[size_2], impair_im[size_2];
#endif
    for(int i=0; i<size_2; i++){
        tmp1=(i<<1);
        pair_re[i]=x_int_re[tmp1];
        pair_im[i]=x_int_im[tmp1];
        impair_re[i]=x_int_re[tmp1+1];
        impair_im[i]=x_int_im[tmp1+1];
    }

    if(taille>2){
#ifdef Q_CC_MSVC
        fft(pair_re.data(),pair_im.data(),size_2);
        fft(impair_re.data(),impair_im.data(),size_2);
#else
        fft(pair_re,pair_im,size_2);
        fft(impair_re,impair_im,size_2);
#endif
    }

    for(int i=0; i<size_2; i++){
        tmp=base*i;
        tmpcos=cos(tmp);
        tmpsin=sin(tmp);
        x_int_re[i]=(pair_re[i]+impair_re[i]*tmpcos+impair_im[i]*tmpsin)/SQ_2;
        x_int_im[i]=(pair_im[i]+impair_im[i]*tmpcos-impair_re[i]*tmpsin)/SQ_2;
        x_int_re[i+size_2]=(pair_re[i]-impair_re[i]*tmpcos-impair_im[i]*tmpsin)/SQ_2;
        x_int_im[i+size_2]=(pair_im[i]-impair_im[i]*tmpcos+impair_re[i]*tmpsin)/SQ_2;
    }
}