Exemple #1
0
void MatrixModel::fft(bool inverse) {
  int width = d_cols;
  int height = d_rows;

  double **x_int_re =
      Matrix::allocateMatrixData(height, width); /* real coeff matrix */
  if (!x_int_re)
    return;

  double **x_int_im =
      Matrix::allocateMatrixData(height, width); /* imaginary coeff  matrix*/
  if (!x_int_im) {
    Matrix::freeMatrixData(x_int_re, height);
    return;
  }

  QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));

  int cell = 0;
  for (int i = 0; i < height; i++) {
    for (int j = 0; j < width; j++) {
      double data = d_data[cell++];
      if (data != data) // Cell is nan
      {
        Matrix::freeMatrixData(x_int_re, height);
        Matrix::freeMatrixData(x_int_im, height);
        QApplication::restoreOverrideCursor();
        QMessageBox::critical(
            d_matrix, tr("MantidPlot") + " - " + tr("FFT Error"),
            tr("Matrix must not contain any NaN values when performing FFT."));
        return;
      }

      x_int_re[i][j] = data;
      x_int_im[i][j] = 0.0;
    }
  }

  if (inverse) {
    double **x_fin_re = Matrix::allocateMatrixData(height, width);
    double **x_fin_im = Matrix::allocateMatrixData(height, width);

    if (!x_fin_re || !x_fin_im) {
      Matrix::freeMatrixData(x_int_re, height);
      Matrix::freeMatrixData(x_int_im, height);
      QApplication::restoreOverrideCursor();
      return;
    }

    fft2d_inv(x_int_re, x_int_im, x_fin_re, x_fin_im, width, height);
    cell = 0;
    for (int i = 0; i < height; i++) {
      for (int j = 0; j < width; j++) {
        double re = x_fin_re[i][j];
        double im = x_fin_im[i][j];
        d_data[cell++] = sqrt(re * re + im * im);
      }
    }

    Matrix::freeMatrixData(x_fin_re, height);
    Matrix::freeMatrixData(x_fin_im, height);
  } else {
    fft2d(x_int_re, x_int_im, width, height);
    cell = 0;
    for (int i = 0; i < height; i++) {
      for (int j = 0; j < width; j++) {
        double re = x_int_re[i][j];
        double im = x_int_im[i][j];
        d_data[cell++] = sqrt(re * re + im * im);
      }
    }
  }

  Matrix::freeMatrixData(x_int_re, height);
  Matrix::freeMatrixData(x_int_im, height);

  d_matrix->resetView();
  QApplication::restoreOverrideCursor();
}
void MatrixModel::fft(bool inverse)
{
	int width = d_cols;
    int height = d_rows;

    double **x_int_re = Matrix::allocateMatrixData(height, width); /* real coeff matrix */
    if (!x_int_re)
        return;
    double **x_int_im = Matrix::allocateMatrixData(height, width); /* imaginary coeff  matrix*/
	if (!x_int_im){
        Matrix::freeMatrixData(x_int_re, height);
        return;
	}

	QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));

	int cell = 0;
    for (int i = 0; i < height; i++){
        for (int j = 0; j < width; j++){
            x_int_re[i][j] = d_data[cell++];
            x_int_im[i][j] = 0.0;
        }
    }

    if (inverse){
        double **x_fin_re = Matrix::allocateMatrixData(height, width);
        double **x_fin_im = Matrix::allocateMatrixData(height, width);
		if (!x_fin_re || !x_fin_im){
		    Matrix::freeMatrixData(x_int_re, height);
            Matrix::freeMatrixData(x_int_im, height);
			QApplication::restoreOverrideCursor();
			return;
		}

        fft2d_inv(x_int_re, x_int_im, x_fin_re, x_fin_im, width, height);
		cell = 0;
        for (int i = 0; i < height; i++){
            for (int j = 0; j < width; j++){
                double re = x_fin_re[i][j];
                double im = x_fin_im[i][j];
                d_data[cell++] = sqrt(re*re + im*im);
            }
        }
        Matrix::freeMatrixData(x_fin_re, height);
        Matrix::freeMatrixData(x_fin_im, height);
    } else {
        fft2d(x_int_re, x_int_im, width, height);
		cell = 0;
        for (int i = 0; i < height; i++){
            for (int j = 0; j < width; j++){
                double re = x_int_re[i][j];
                double im = x_int_im[i][j];
                d_data[cell++] = sqrt(re*re + im*im);
            }
        }
    }
    Matrix::freeMatrixData(x_int_re, height);
    Matrix::freeMatrixData(x_int_im, height);

	d_matrix->resetView();
	QApplication::restoreOverrideCursor();
}