X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=include%2Ffourier.h;h=5215a3a25928ad645869be3c2eeadba9e9b2d875;hp=95aaeb01ed85d02e30ee2a121b9cfe4dd4fd5640;hb=d42d3d062dd1aca92b5a2552a1f474aab0bee610;hpb=8a9896531e2ea87f05a3386015ac9c4334f4db14 diff --git a/include/fourier.h b/include/fourier.h index 95aaeb0..5215a3a 100644 --- a/include/fourier.h +++ b/include/fourier.h @@ -1,45 +1,114 @@ -/***************************************************************************** -** FILE IDENTIFICATION -** -** Name: fourier.h -** Purpose: Header for Fourier transform functions -** Programmer: Kevin Rosenberg -** Date Started: Dec 2000 -** -** This is part of the CTSim program -** Copyright (C) 1983-2001 Kevin Rosenberg -** -** $Id: fourier.h,v 1.1 2001/01/02 06:33:04 kevin Exp $ -** -** This program is free software; you can redistribute it and/or modify -** it under the terms of the GNU General Public License (version 2) as -** published by the Free Software Foundation. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software -** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -******************************************************************************/ - -#include - -class ImageFile; - -class Fourier { -public: - static void shuffleFourierToNaturalOrder (ImageFile& im); - static void shuffleNaturalToFourierOrder (ImageFile& im); - - static void shuffleNaturalToFourierOrder (float* pdVector, const int n); - static void shuffleNaturalToFourierOrder (double* pdVector, const int n); - static void shuffleNaturalToFourierOrder (std::complex* pdVector, const int n); - static void shuffleFourierToNaturalOrder (float* pdVector, const int n); - static void shuffleFourierToNaturalOrder (double* pdVector, const int n); - static void shuffleFourierToNaturalOrder (std::complex* pdVector, const int n); - -}; // namespace Fourier - +/***************************************************************************** +** FILE IDENTIFICATION +** +** Name: fourier.h +** Purpose: Header for Fourier transform functions +** Programmer: Kevin Rosenberg +** Date Started: Dec 2000 +** +** This is part of the CTSim program +** Copyright (c) 1983-2001 Kevin Rosenberg +** +** $Id$ +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License (version 2) as +** published by the Free Software Foundation. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +******************************************************************************/ + +#include +#ifdef HAVE_FFTW +#include +#endif + +class ImageFile; + +class Fourier { +public: + static void shuffleFourierToNaturalOrder (ImageFile& im); + static void shuffleNaturalToFourierOrder (ImageFile& im); + +#ifdef HAVE_FFTW + static void shuffleFourierToNaturalOrder (fftw_complex* pc, const int n); + static void shuffleNaturalToFourierOrder (fftw_complex* pc, const int n); +#endif + +// Odd Number of Points +// Natural Frequency Order: -(n-1)/2...-1,0,1...(n-1)/2 +// Fourier Frequency Order: 0, 1..(n-1)/2,-(n-1)/2...-1 +// Even Number of Points +// Natural Frequency Order: -n/2...-1,0,1...((n/2)-1) +// Fourier Frequency Order: 0,1...((n/2)-1),-n/2...-1 + template + static void shuffleNaturalToFourierOrder (T* pVector, const int n) + { + T* pTemp = new T [n]; + int i; + if (isOdd(n)) { // Odd + int iHalfN = (n - 1) / 2; + + pTemp[0] = pVector[iHalfN]; + for (i = 0; i < iHalfN; i++) + pTemp[i + 1] = pVector[i + 1 + iHalfN]; + for (i = 0; i < iHalfN; i++) + pTemp[i + iHalfN + 1] = pVector[i]; + } else { // Even + int iHalfN = n / 2; + pTemp[0] = pVector[iHalfN]; + for (i = 0; i < iHalfN - 1; i++) + pTemp[i + 1] = pVector[i + iHalfN + 1]; + for (i = 0; i < iHalfN; i++) + pTemp[i + iHalfN] = pVector[i]; + } + + for (i = 0; i < n; i++) + pVector[i] = pTemp[i]; + delete pTemp; + } + + template + static void shuffleFourierToNaturalOrder (T* pVector, const int n) + { + T* pTemp = new T [n]; + int i; + if (isOdd(n)) { // Odd + int iHalfN = (n - 1) / 2; + + pTemp[iHalfN] = pVector[0]; + for (i = 0; i < iHalfN; i++) + pTemp[i + 1 + iHalfN] = pVector[i + 1]; + for (i = 0; i < iHalfN; i++) + pTemp[i] = pVector[i + iHalfN + 1]; + } else { // Even + int iHalfN = n / 2; + pTemp[iHalfN] = pVector[0]; + for (i = 0; i < iHalfN; i++) + pTemp[i] = pVector[i + iHalfN]; + for (i = 0; i < iHalfN - 1; i++) + pTemp[i + iHalfN + 1] = pVector[i+1]; + } + + for (i = 0; i < n; i++) + pVector[i] = pTemp[i]; + delete pTemp; + } +#if 0 + static void shuffleNaturalToFourierOrder (float* pdVector, const int n); + static void shuffleNaturalToFourierOrder (double* pdVector, const int n); + static void shuffleNaturalToFourierOrder (std::complex* pdVector, const int n); + static void shuffleFourierToNaturalOrder (float* pdVector, const int n); + static void shuffleFourierToNaturalOrder (double* pdVector, const int n); + static void shuffleFourierToNaturalOrder (std::complex* pdVector, const int n); +#endif +}; + +