コード例 #1
0
ファイル: fft2D.cpp プロジェクト: dezed/mantid
void fft_inv(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=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++){
        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_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++){
        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 fft2d_inv(double **xtre, double **xtim, double **xrec_re, double **xrec_im, int width, int height)
{
    double **xint_re = Matrix::allocateMatrixData(height, width);
    if (!xint_re)
        return;
    double **xint_im = Matrix::allocateMatrixData(height, width);
    if (!xint_im){
        Matrix::freeMatrixData(xint_re, height);
        return;
    }

#ifdef Q_CC_MSVC
    QVarLengthArray<double> x_int_l(width), x_int2_l(width), x_int_c(height), x_int2_c(height);
#else
    double x_int_l[width], x_int2_l[width], x_int_c[height], x_int2_c[height];
#endif
    for(int k=0; k<height; k++){
        for(int j=0; j<width; j++){
            x_int_l[j] = xtre[(k-(height>>1))%height][(j+(width>>1))%width];
            x_int2_l[j] = xtim[(k-(height>>1))%height][(j+(width>>1))%width] ;
        }
#ifdef Q_CC_MSVC
        fft_inv(x_int_l.data(), x_int2_l.data(), width) ;
#else
        fft_inv(x_int_l, x_int2_l, width) ;
#endif
        for(int j=0; j<width; j++){
            xint_re[k][j] = x_int_l[j];
            xint_im[k][j] = x_int2_l[j];
        }
    }
    for(int k=0; k<width; k++){
        for(int i=0; i<height; i++){
            x_int_c[i] = xint_re[i][k];
            x_int2_c[i] = xint_im[i][k];
        }
#ifdef Q_CC_MSVC
        fft_inv(x_int_c.data(),x_int2_c.data(), height) ;
#else
        fft_inv(x_int_c,x_int2_c, height) ;
#endif
        for(int i=0; i<height; i++){
            xrec_re[i][k] = x_int_c[i];
            xrec_im[i][k] = x_int2_c[i];
        }
    }
    Matrix::freeMatrixData(xint_re, height);
    Matrix::freeMatrixData(xint_im, height);
}
コード例 #3
0
ファイル: fft2D.cpp プロジェクト: mantidproject/mantid
void fft2d_inv(double **xtre, double **xtim, double **xrec_re, double **xrec_im,
               int width, int height) {
  double **xint_re = Matrix::allocateMatrixData(height, width);
  if (!xint_re)
    return;
  double **xint_im = Matrix::allocateMatrixData(height, width);
  if (!xint_im) {
    Matrix::freeMatrixData(xint_re, height);
    return;
  }

  QVarLengthArray<double> x_int_l(width), x_int2_l(width), x_int_c(height),
      x_int2_c(height); // double x_int_l[width], x_int2_l[width],
                        // x_int_c[height], x_int2_c[height];
  for (int k = 0; k < height; k++) {
    for (int j = 0; j < width; j++) {
      int idx_h = (k + (height >> 1)) % height;
      int idx_w = (j + (width >> 1)) % width;
      x_int_l[j] = xtre[idx_h][idx_w];
      x_int2_l[j] = xtim[idx_h][idx_w];
    }
    fft_inv(x_int_l.data(), x_int2_l.data(),
            width); // fft_inv(x_int_l, x_int2_l, width) ;
    for (int j = 0; j < width; j++) {
      xint_re[k][j] = x_int_l[j];
      xint_im[k][j] = x_int2_l[j];
    }
  }
  for (int k = 0; k < width; k++) {
    for (int i = 0; i < height; i++) {
      x_int_c[i] = xint_re[i][k];
      x_int2_c[i] = xint_im[i][k];
    }
    fft_inv(x_int_c.data(), x_int2_c.data(),
            height); // fft_inv(x_int_c,x_int2_c, height) ;
    for (int i = 0; i < height; i++) {
      xrec_re[i][k] = x_int_c[i];
      xrec_im[i][k] = x_int2_c[i];
    }
  }
  Matrix::freeMatrixData(xint_re, height);
  Matrix::freeMatrixData(xint_im, height);
}
コード例 #4
0
void fft_inv(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_inv(pair_re.data(), pair_im.data(),size_2);
        fft_inv(impair_re.data(), impair_im.data(),size_2);
#else
        fft_inv(pair_re, pair_im,size_2);
        fft_inv(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;
    }
}