38 #ifndef __INCLUDE_DCT_H__
39 #define __INCLUDE_DCT_H__
42 #ifndef __INCLUDE_MIST_H__
46 #ifndef __INCLUDE_FFT_UTIL_H__
51 #if defined( __MIST_WINDOWS__ ) && __MIST_WINDOWS__ > 0
52 #define USE_CDFT_WINTHREADS
53 #define USE_FFT2D_WINTHREADS
54 #define USE_FFT3D_WINTHREADS
56 #define USE_CDFT_PTHREADS
57 #define USE_FFT2D_PTHREADS
58 #define USE_FFT3D_PTHREADS
92 template <
class T1,
class T2,
class Allocator1,
class Allocator2 >
95 if( !__fft_util__::size_check( (
unsigned int ) in.
size( ) ) )
100 typedef typename Allocator1::size_type size_type;
102 __fft_util__::FFT_MEMORY1 mem;
104 if( !__fft_util__::allocate_memory( mem,
106 static_cast< size_t >( std::sqrt( static_cast< double >( in.
size( ) / 2 ) ) + 3 ),
107 in.
size( ) * 5 / 4 ) )
109 __fft_util__::deallocate_memory( mem );
113 double *data = mem.data;
117 for( i = 0 ; i < in.
size( ) ; i++ )
119 std::complex< double > c( __fft_util__::convert_complex< T1 >::convert_to( in[ i ] ) );
120 data[ i ] = c.real( );
125 ooura_fft::ddct( static_cast<int>( in.
size() ), -1, data, ip, w );
130 for( i = 0 ; i < out.
size( ) ; i++ )
132 out[ i ] = __fft_util__::convert_complex< T2 >::convert_from( data[ i ], 0.0 );
135 __fft_util__::deallocate_memory( mem );
152 template <
class T1,
class T2,
class Allocator1,
class Allocator2 >
155 if( !__fft_util__::size_check( (
unsigned int ) in.
size( ) ) )
160 typedef typename Allocator1::size_type size_type;
162 __fft_util__::FFT_MEMORY1 mem;
164 if( !__fft_util__::allocate_memory( mem,
166 static_cast< size_t >( std::sqrt( static_cast< double >( in.
size( ) / 2 ) ) + 3 ),
167 in.
size( ) * 5 / 4 ) )
169 __fft_util__::deallocate_memory( mem );
173 double *data = mem.data;
177 for( i = 0 ; i < in.
size( ) ; i++ )
179 std::complex< double > c( __fft_util__::convert_complex< T1 >::convert_to( in[ i ] ) );
180 data[ i ] = c.real( );
186 ooura_fft::ddct( static_cast<int>( in.
size() ), 1, data, ip, w );
191 for( i = 0 ; i < out.
size( ) ; i++ )
193 out[ i ] = __fft_util__::convert_complex< T2 >::convert_from( data[ i ] * 2.0 / out.
size( ), 0.0 );
196 __fft_util__::deallocate_memory( mem );
214 template <
class T1,
class T2,
class Allocator1,
class Allocator2 >
217 if( !__fft_util__::size_check( (
unsigned int ) in.
width( ) ) || !__fft_util__::size_check( (
unsigned int ) in.
height( ) ) )
222 typedef typename Allocator1::size_type size_type;
224 __fft_util__::FFT_MEMORY2 mem;
226 if( !__fft_util__::allocate_memory( mem,
229 4 * in.
width( ) * FFT2D_MAX_THREADS,
230 static_cast< size_t >( std::sqrt( static_cast< double >( size / 2 ) ) + 3 ),
233 __fft_util__::deallocate_memory( mem );
237 double **data = mem.data;
242 for( i = 0 ; i < in.
width( ) ; i++ )
244 for( j = 0 ; j < in.
height( ) ; j++ )
246 std::complex< double > c( __fft_util__::convert_complex< T1 >::convert_to( in( i, j ) ) );
247 data[ i ][ j ] = c.real( );
253 ooura_fft::ddct2d( static_cast<int>( in.
width( ) ), static_cast<int>( in.
height( ) ), -1, data, t, ip, w );
258 for( i = 0 ; i < out.
width( ) ; i++ )
260 for( j = 0 ; j < out.
height( ) ; j++ )
262 out( i, j ) = __fft_util__::convert_complex< T2 >::convert_from( data[ i ][ j ], 0.0 );
266 __fft_util__::deallocate_memory( mem );
284 template <
class T1,
class T2,
class Allocator1,
class Allocator2 >
287 if( !__fft_util__::size_check( (
unsigned int ) in.
width( ) ) || !__fft_util__::size_check( (
unsigned int ) in.
height( ) ) )
292 typedef typename Allocator1::size_type size_type;
294 __fft_util__::FFT_MEMORY2 mem;
296 if( !__fft_util__::allocate_memory( mem,
299 4 * in.
width( ) * FFT2D_MAX_THREADS,
300 static_cast< size_t >( std::sqrt( static_cast< double >( size / 2 ) ) + 3 ),
303 __fft_util__::deallocate_memory( mem );
307 double **data = mem.data;
312 for( i = 0 ; i < in.
width( ) ; i++ )
314 for( j = 0 ; j < in.
height( ) ; j++ )
316 std::complex< double > c( __fft_util__::convert_complex< T1 >::convert_to( in( i, j ) ) );
317 data[ i ][ j ] = c.real( );
324 for( i = 0 ; i < in.
width( ) ; i++ )
326 data[ i ][ 0 ] *= 0.5;
329 for( j = 0 ; j < in.
height( ) ; j++ )
331 data[ 0 ][ j ] *= 0.5;
335 ooura_fft::ddct2d( static_cast< int >( in.
width( ) ), static_cast< int >( in.
height( ) ), 1, data, t, ip, w );
340 for( i = 0 ; i < out.
width( ) ; i++ )
342 for( j = 0 ; j < out.
height( ) ; j++ )
344 out( i, j ) = __fft_util__::convert_complex< T2 >::convert_from( data[ i ][ j ] * 4.0 / in.
size( ), 0.0 );
348 __fft_util__::deallocate_memory( mem );
367 template <
class T1,
class T2,
class Allocator1,
class Allocator2 >
370 if( !__fft_util__::size_check( (
unsigned int ) in.
width( ) ) ||
371 !__fft_util__::size_check( (
unsigned int ) in.
height( ) ) ||
372 !__fft_util__::size_check( (
unsigned int ) in.
depth( ) ) )
377 typedef typename Allocator1::size_type size_type;
379 __fft_util__::FFT_MEMORY3 mem;
381 if( !__fft_util__::allocate_memory( mem,
385 4 * size * FFT3D_MAX_THREADS,
386 static_cast< size_t >( std::sqrt( static_cast< double >( size / 2 ) ) + 3 ),
389 __fft_util__::deallocate_memory( mem );
393 double ***data = mem.data;
398 for( i = 0 ; i < in.
width( ) ; i++ )
400 for( j = 0 ; j < in.
height( ) ; j++ )
402 for( k = 0 ; k < in.
depth( ) ; k++ )
404 std::complex< double > c( __fft_util__::convert_complex< T1 >::convert_to( in( i, j, k ) ) );
405 data[ i ][ j ][ k ] = c.real( );
412 ooura_fft::ddct3d( static_cast<int>( in.
width( ) ), static_cast<int>( in.
height( ) ), static_cast<int>( in.
depth( ) ), -1, data, t, ip, w );
417 for( i = 0 ; i < out.
width( ) ; i++ )
419 for( j = 0 ; j < out.
height( ) ; j++ )
421 for( k = 0 ; k < out.
depth( ) ; k++ )
423 out( i, j, k ) = __fft_util__::convert_complex< T2 >::convert_from( data[ i ][ j ][ k ], 0.0 );
428 __fft_util__::deallocate_memory( mem );
445 template <
class T1,
class T2,
class Allocator1,
class Allocator2 >
448 if( !__fft_util__::size_check( (
unsigned int ) in.
width( ) ) ||
449 !__fft_util__::size_check( (
unsigned int ) in.
height( ) ) ||
450 !__fft_util__::size_check( (
unsigned int ) in.
depth( ) ) )
455 typedef typename Allocator1::size_type size_type;
457 __fft_util__::FFT_MEMORY3 mem;
459 if( !__fft_util__::allocate_memory( mem,
463 4 * size * FFT3D_MAX_THREADS,
464 static_cast< size_t >( std::sqrt( static_cast< double >( size / 2 ) ) + 3 ),
467 __fft_util__::deallocate_memory( mem );
471 double ***data = mem.data;
476 for( i = 0 ; i < in.
width( ) ; i++ )
478 for( j = 0 ; j < in.
height( ) ; j++ )
480 for( k = 0 ; k < in.
depth( ) ; k++ )
482 std::complex< double > c( __fft_util__::convert_complex< T1 >::convert_to( in( i, j, k ) ) );
483 data[ i ][ j ][ k ] = c.real( );
489 for( i = 0 ; i < in.
width( ) ; i++ )
491 for( j = 0 ; j < in.
height( ) ; j++ )
493 data[ i ][ j ][ 0 ] *= 0.5;
496 for( k = 0 ; k < in.
depth( ) ; k++ )
498 data[ i ][ 0 ][ k ] *= 0.5;
502 for( j = 0 ; j < in.
height( ) ; j++ )
504 for( k = 0 ; k < in.
depth( ) ; k++ )
506 data[ 0 ][ j ][ k ] *= 0.5;
512 ooura_fft::ddct3d( static_cast<int>( in.
width( ) ), static_cast<int>( in.
height( ) ), static_cast<int>( in.
depth( ) ), 1, data, t, ip, w );
516 for( i = 0 ; i < out.
width( ) ; i++ )
518 for( j = 0 ; j < out.
height( ) ; j++ )
520 for( k = 0 ; k < out.
depth( ) ; k++ )
522 out( i, j, k ) = __fft_util__::convert_complex< T2 >::convert_from( data[ i ][ j ][ k ] * 8.0 / in.
size( ), 0.0 );
527 __fft_util__::deallocate_memory( mem );