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(); }