You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.9 KiB
131 lines
3.9 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkImageFourierFilter.h,v $
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
// .NAME vtkImageFourierFilter - Superclass that implements complex numbers.
|
|
// .SECTION Description
|
|
// vtkImageFourierFilter is a class of filters that use complex numbers
|
|
// this superclass is a container for methods that manipulate these structure
|
|
// including fast Fourier transforms. Complex numbers may become a class.
|
|
// This should really be a helper class.
|
|
#ifndef __vtkImageFourierFilter_h
|
|
#define __vtkImageFourierFilter_h
|
|
|
|
|
|
#include "vtkImageDecomposeFilter.h"
|
|
|
|
|
|
//BTX
|
|
/*******************************************************************
|
|
COMPLEX number stuff
|
|
*******************************************************************/
|
|
|
|
|
|
typedef struct{
|
|
double Real;
|
|
double Imag;
|
|
} vtkImageComplex;
|
|
|
|
|
|
#define vtkImageComplexEuclidSet(C, R, I) \
|
|
(C).Real = (R); \
|
|
(C).Imag = (I)
|
|
|
|
#define vtkImageComplexPolarSet(C, M, P) \
|
|
(C).Real = (M)*cos(P); \
|
|
(C).Imag = (M)*sin(P)
|
|
|
|
#define vtkImageComplexPrint(C) \
|
|
printf("(%.3f, %.3f)", (C).Real, (C).Imag)
|
|
|
|
#define vtkImageComplexScale(cOut, S, cIn) \
|
|
(cOut).Real = (cIn).Real * (S); \
|
|
(cOut).Imag = (cIn).Imag * (S)
|
|
|
|
#define vtkImageComplexConjugate(cIn, cOut) \
|
|
(cOut).Imag = (cIn).Imag * -1.0; \
|
|
(cOut).Real = (cIn).Real
|
|
|
|
#define vtkImageComplexAdd(C1, C2, cOut) \
|
|
(cOut).Real = (C1).Real + (C2).Real; \
|
|
(cOut).Imag = (C1).Imag + (C2).Imag
|
|
|
|
#define vtkImageComplexSubtract(C1, C2, cOut) \
|
|
(cOut).Real = (C1).Real - (C2).Real; \
|
|
(cOut).Imag = (C1).Imag - (C2).Imag
|
|
|
|
#define vtkImageComplexMultiply(C1, C2, cOut) \
|
|
{ \
|
|
vtkImageComplex _vtkImageComplexMultiplyTemp; \
|
|
_vtkImageComplexMultiplyTemp.Real = (C1).Real*(C2).Real-(C1).Imag*(C2).Imag;\
|
|
_vtkImageComplexMultiplyTemp.Imag = (C1).Real*(C2).Imag+(C1).Imag*(C2).Real;\
|
|
cOut = _vtkImageComplexMultiplyTemp; \
|
|
}
|
|
|
|
// This macro calculates exp(cIn) and puts the result in cOut
|
|
#define vtkImageComplexExponential(cIn, cOut) \
|
|
{ \
|
|
double tmp = exp(cIn.Real); \
|
|
cOut.Real = tmp * cos(cIn.Imag); \
|
|
cOut.Imag = tmp * sin(cIn.Imag); \
|
|
}
|
|
|
|
/******************* End of COMPLEX number stuff ********************/
|
|
//ETX
|
|
|
|
class VTK_IMAGING_EXPORT vtkImageFourierFilter : public vtkImageDecomposeFilter
|
|
{
|
|
public:
|
|
vtkTypeRevisionMacro(vtkImageFourierFilter,vtkImageDecomposeFilter);
|
|
|
|
|
|
// public for templated functions of this object
|
|
//BTX
|
|
|
|
// Description:
|
|
// This function calculates the whole fft of an array.
|
|
// The contents of the input array are changed.
|
|
// (It is engineered for no decimation)
|
|
void ExecuteFft(vtkImageComplex *in, vtkImageComplex *out, int N);
|
|
|
|
|
|
// Description:
|
|
// This function calculates the whole fft of an array.
|
|
// The contents of the input array are changed.
|
|
// (It is engineered for no decimation)
|
|
void ExecuteRfft(vtkImageComplex *in, vtkImageComplex *out, int N);
|
|
|
|
//ETX
|
|
|
|
protected:
|
|
vtkImageFourierFilter() {};
|
|
~vtkImageFourierFilter() {};
|
|
|
|
//BTX
|
|
void ExecuteFftStep2(vtkImageComplex *p_in, vtkImageComplex *p_out,
|
|
int N, int bsize, int fb);
|
|
void ExecuteFftStepN(vtkImageComplex *p_in, vtkImageComplex *p_out,
|
|
int N, int bsize, int n, int fb);
|
|
void ExecuteFftForwardBackward(vtkImageComplex *in, vtkImageComplex *out,
|
|
int N, int fb);
|
|
//ETX
|
|
private:
|
|
vtkImageFourierFilter(const vtkImageFourierFilter&); // Not implemented.
|
|
void operator=(const vtkImageFourierFilter&); // Not implemented.
|
|
};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|