📄 itkffttest.cxx
字号:
/*Get the size and the pointer to the complex image.*/
typename ComplexImageType::Pointer complexImageA = R2Ca->GetOutput();
std::complex<TPixel> *fftbufA = complexImageA->GetBufferPointer();
const typename ComplexImageType::SizeType &complexImageSizeA =
complexImageA->GetLargestPossibleRegion().GetSize();
typename ComplexImageType::Pointer complexImageB = R2Cb->GetOutput();
std::complex<TPixel> *fftbufB = complexImageB->GetBufferPointer();
const typename ComplexImageType::SizeType &complexImageSizeB =
complexImageB->GetLargestPossibleRegion().GetSize();
unsigned int _SizesA[3] = { 1,1,1 };
unsigned int _SizesB[3] = { 1,1,1 };
for(unsigned int i = 0; i < ImageDimensions; i++)
{
/* the size may be different if one implementation returns
a fullmatrix but not the other. */
_SizesA[i] = complexImageSizeA[i];
_SizesB[i] = complexImageSizeB[i];
}
/*Print out the the frequency domain data obtained after performing the forward transform */
for(unsigned int i = 0; i < _SizesA[2]; i++)
{
unsigned int zStride = i * _SizesA[1] * _SizesA[0];
for(unsigned int j = 0; j < _SizesA[1]; j++)
{
unsigned int yStride = j * _SizesA[0];
for(unsigned int k = 0; k < _SizesA[0]; k++)
{
std::cerr << fftbufA[zStride+yStride+k] << " ";
}
std::cerr << std::endl;
}
}
std::cerr << std::endl << std::endl;
for(unsigned int i = 0; i < _SizesB[2]; i++)
{
unsigned int zStride = i * _SizesB[1] * _SizesB[0];
for(unsigned int j = 0; j < _SizesB[1]; j++)
{
unsigned int yStride = j * _SizesB[0];
for(unsigned int k = 0; k < _SizesB[0]; k++)
{
std::cerr << fftbufB[zStride+yStride+k] << " ";
}
std::cerr << std::endl;
}
}
std::cerr << std::endl << std::endl;
/*Subtract the 2 images Pixel Values
and test whether they are greater than 0.01 for the test to pass*/
for(unsigned int i = 0; i < std::min(_SizesA[2],_SizesB[2]); i++)
{
unsigned int zStrideA = i * _SizesA[1] * _SizesA[0];
unsigned int zStrideB = i * _SizesB[1] * _SizesB[0];
for(unsigned int j = 0; j < std::min(_SizesA[1],_SizesB[1]); j++)
{
unsigned int yStrideA = j * _SizesA[0];
unsigned int yStrideB = j * _SizesB[0];
for(unsigned int k = 0; k < std::min(_SizesA[0],_SizesB[0]); k++)
{
double val = std::abs(fftbufA[zStrideA+yStrideA+k]);
double diff = std::abs(fftbufA[zStrideA+yStrideA+k]-fftbufB[zStrideB+yStrideB+k]);
if(val != 0)
{
diff /= vnl_math_abs(val);
}
if(diff > 0.01)
{
std::cerr << "Diff found " << fftbufA[zStrideA+yStrideA+k]
<< " " << fftbufB[zStrideB+yStrideB+k] << " diff " << diff << std::endl;
return -1;
}
}
}
}
std::cerr << std::endl << std::endl;
return 0;
}
/*Test FFT using VNL Libraries. The test is performed for 2 3d array one of them
having the same dimension(4,4,4) and the other having different dimensions (3,4,5).
Images are created with different dimensions in the test function based on the second template argument and the size of these dimensions are taken from the array.
The data types used are float and double. */
int itkVnlFFTTest(int, char *[])
{
unsigned int SizeOfDimensions1[] = { 4,4,4 };
unsigned int SizeOfDimensions2[] = { 3,5,4 };
int rval = 0;
std::cerr << "Vnl float,1 (4,4,4)" << std::endl;
if((test_fft<float,1,
itk::VnlFFTRealToComplexConjugateImageFilter<float,1> ,
itk::VnlFFTComplexConjugateToRealImageFilter<float,1> >(SizeOfDimensions1)) != 0)
{
rval++;;
std::cerr << "--------------------- Failed!" << std::endl;
}
std::cerr << "Vnl float,2 (4,4,4)"<< std::endl;
if((test_fft<float,2,
itk::VnlFFTRealToComplexConjugateImageFilter<float,2> ,
itk::VnlFFTComplexConjugateToRealImageFilter<float,2> >(SizeOfDimensions1)) != 0)
{
std::cerr << "--------------------- Failed!" << std::endl;
rval++;;
}
std::cerr << "Vnl float,3 (4,4,4)"<< std::endl;
if((test_fft<float,3,
itk::VnlFFTRealToComplexConjugateImageFilter<float,3> ,
itk::VnlFFTComplexConjugateToRealImageFilter<float,3> >(SizeOfDimensions1)) != 0)
{
std::cerr << "--------------------- Failed!" << std::endl;
rval++;;
}
std::cerr << "Vnl double,1 (4,4,4)"<< std::endl;
if((test_fft<double,1,
itk::VnlFFTRealToComplexConjugateImageFilter<double,1> ,
itk::VnlFFTComplexConjugateToRealImageFilter<double,1> >(SizeOfDimensions1)) != 0)
{
std::cerr << "--------------------- Failed!" << std::endl;
rval++;;
}
std::cerr << "Vnl double,2 (4,4,4)"<< std::endl;
if((test_fft<double,2,
itk::VnlFFTRealToComplexConjugateImageFilter<double,2> ,
itk::VnlFFTComplexConjugateToRealImageFilter<double,2> >(SizeOfDimensions1)) != 0)
{
std::cerr << "--------------------- Failed!" << std::endl;
rval++;;
}
std::cerr << "Vnl double,3 (4,4,4)"<< std::endl;
if((test_fft<double,3,
itk::VnlFFTRealToComplexConjugateImageFilter<double,3> ,
itk::VnlFFTComplexConjugateToRealImageFilter<double,3> >(SizeOfDimensions1)) != 0)
{
std::cerr << "--------------------- Failed!" << std::endl;
rval++;;
}
std::cerr << "Vnl float,1 (3,5,4)" << std::endl;
if((test_fft<float,1,
itk::VnlFFTRealToComplexConjugateImageFilter<float,1> ,
itk::VnlFFTComplexConjugateToRealImageFilter<float,1> >(SizeOfDimensions2)) != 0)
{
std::cerr << "--------------------- Failed!" << std::endl;
rval++;;
}
std::cerr << "Vnl float,2 (3,5,4)"<< std::endl;
if((test_fft<float,2,
itk::VnlFFTRealToComplexConjugateImageFilter<float,2> ,
itk::VnlFFTComplexConjugateToRealImageFilter<float,2> >(SizeOfDimensions2)) != 0)
{
std::cerr << "--------------------- Failed!" << std::endl;
rval++;;
}
std::cerr << "Vnl float,3 (3,5,4)"<< std::endl;
if((test_fft<float,3,
itk::VnlFFTRealToComplexConjugateImageFilter<float,3> ,
itk::VnlFFTComplexConjugateToRealImageFilter<float,3> >(SizeOfDimensions2)) != 0)
{
std::cerr << "--------------------- Failed!" << std::endl;
rval++;;
}
std::cerr << "Vnl double,1 (3,5,4)"<< std::endl;
if((test_fft<double,1,
itk::VnlFFTRealToComplexConjugateImageFilter<double,1> ,
itk::VnlFFTComplexConjugateToRealImageFilter<double,1> >(SizeOfDimensions2)) != 0)
{
std::cerr << "--------------------- Failed!" << std::endl;
rval++;;
}
std::cerr << "Vnl double,2 (3,5,4)"<< std::endl;
if((test_fft<double,2,
itk::VnlFFTRealToComplexConjugateImageFilter<double,2> ,
itk::VnlFFTComplexConjugateToRealImageFilter<double,2> >(SizeOfDimensions2)) != 0)
{
std::cerr << "--------------------- Failed!" << std::endl;
rval++;;
}
std::cerr << "Vnl double,3 (3,5,4)"<< std::endl;
if((test_fft<double,3,
itk::VnlFFTRealToComplexConjugateImageFilter<double,3> ,
itk::VnlFFTComplexConjugateToRealImageFilter<double,3> >(SizeOfDimensions2)) != 0)
{
std::cerr << "--------------------- Failed!" << std::endl;
rval++;;
}
return rval == 0 ? 0 : -1;
}
#if defined(USE_FFTWF)
/*Test FFT using FFTW Libraries. The test is performed for 2 3d array one of them
having the same dimension(4,4,4) and the other having different dimensions (3,4,5).
Images are created with different dimensions in the test function based on the second template argument and the size of these dimensions are taken from the array.The data types used are float and double. */
int itkFFTWF_FFTTest(int, char *[])
{
unsigned int SizeOfDimensions1[] = { 4,4,4 };
unsigned int SizeOfDimensions2[] = { 3,5,4 };
int rval = 0;
std::cerr << "FFTWF:float,1 (4,4,4)" << std::endl;
if((test_fft<float,1,
itk::FFTWRealToComplexConjugateImageFilter<float,1> ,
itk::FFTWComplexConjugateToRealImageFilter<float,1> >(SizeOfDimensions1)) != 0)
rval++;;
std::cerr << "FFTWF:float,2 (4,4,4)"<< std::endl;
if((test_fft<float,2,
itk::FFTWRealToComplexConjugateImageFilter<float,2> ,
itk::FFTWComplexConjugateToRealImageFilter<float,2> >(SizeOfDimensions1)) != 0)
rval++;;
std::cerr << "FFTWF:float,3 (4,4,4)"<< std::endl;
if((test_fft<float,3,
itk::FFTWRealToComplexConjugateImageFilter<float,3> ,
itk::FFTWComplexConjugateToRealImageFilter<float,3> >(SizeOfDimensions1)) != 0)
rval++;;
std::cerr << "FFTWF:float,1 (3,5,4)" << std::endl;
if((test_fft<float,1,
itk::FFTWRealToComplexConjugateImageFilter<float,1> ,
itk::FFTWComplexConjugateToRealImageFilter<float,1> >(SizeOfDimensions2)) != 0)
rval++;;
std::cerr << "FFTWF:float,2 (3,5,4)"<< std::endl;
if((test_fft<float,2,
itk::FFTWRealToComplexConjugateImageFilter<float,2> ,
itk::FFTWComplexConjugateToRealImageFilter<float,2> >(SizeOfDimensions2)) != 0)
rval++;;
std::cerr << "FFTWF:float,3 (3,5,4)"<< std::endl;
if((test_fft<float,3,
itk::FFTWRealToComplexConjugateImageFilter<float,3> ,
itk::FFTWComplexConjugateToRealImageFilter<float,3> >(SizeOfDimensions2)) != 0)
rval++;;
return (rval == 0) ? 0 : -1;
}
/*Compare FFT using VNL and FFTW Libraries. The test is performed for 2 3d array one of them
having the same dimension(4,4,4) and the other having different dimensions (3,4,5).
Images are created with different dimensions in the test function based on the second template argument and the size of these dimensions are taken from the array.The data types used are float and double. */
int itkVnlFFTWF_FFTTest(int, char *[])
{
unsigned int SizeOfDimensions1[] = { 4,4,4 };
unsigned int SizeOfDimensions2[] = { 3,5,4 };
int rval = 0;
std::cerr << "VnlFFTWF:float,1 (4,4,4)" << std::endl;
if((test_fft_rtc<float,1,
itk::VnlFFTRealToComplexConjugateImageFilter<float,1> ,
itk::FFTWRealToComplexConjugateImageFilter<float,1> >(SizeOfDimensions1)) != 0)
rval++;;
std::cerr << "VnlFFTWF:float,2 (4,4,4)"<< std::endl;
if((test_fft_rtc<float,2,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -