algebramix_doc 0.3
|
#include <fft_blocks.hpp>
Definition at line 31 of file fft_blocks.hpp.
typedef implementation<vector_linear,vector_naive> NVec |
Definition at line 33 of file fft_blocks.hpp.
typedef FFTER::R R |
Definition at line 34 of file fft_blocks.hpp.
typedef R::S S |
Definition at line 36 of file fft_blocks.hpp.
typedef R::U U |
Definition at line 35 of file fft_blocks.hpp.
fft_blocks_transformer | ( | nat | n | ) | [inline] |
~fft_blocks_transformer | ( | ) | [inline] |
Definition at line 48 of file fft_blocks.hpp.
{ delete ffter; }
Definition at line 51 of file fft_blocks.hpp.
References mmx::C.
Referenced by fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::dfft(), and fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::ifft().
{ for (nat i= 0; i < s1; i++, c0 += s0) { C* cc0= c0, * cc1= c1 + i; for (nat k= 0; k < n; k++, cc0++, cc1+= s1) *cc1= *cc0; } }
void dfft | ( | C * | c, |
nat | stride, | ||
nat | shift, | ||
nat | steps | ||
) | [inline] |
Definition at line 159 of file fft_blocks.hpp.
void dfft | ( | C * | c, |
nat | stride, | ||
nat | shift, | ||
nat | steps, | ||
nat | step1, | ||
nat | step2 | ||
) | [inline] |
Definition at line 65 of file fft_blocks.hpp.
References mmx::C, fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::delocate(), fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::ffter, and fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::relocate().
Referenced by fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::dfft(), and fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::direct_transform().
{ if (steps <= max (threshold, log2_inner_block_size)) ffter->dfft (c, stride, shift, steps, step1, step2); else { nat temp_len= default_aligned_size<C> ((nat) 1<<(log2_outer_block_size+log2_block_number)); C* c0, * temp= mmx_new<C> (temp_len); nat step, block, blocks, todo, k_beg, k_end; for (step= step1; step < min (steps - log2_inner_block_size, step2); step += block) { block = min (min (steps - log2_inner_block_size - step, step2 - step), log2_outer_block_size); todo = steps - 1 - step; blocks= todo - block + 1; c0= c; for (nat j= 0; j < ((nat) 1<<step); j++) { for (k_beg= 0; k_beg < ((nat) 1<<blocks); k_beg= k_end) { k_end= min (((nat) 1<<blocks), k_beg + ((nat) 1<< log2_block_number)); delocate (temp, (nat) 1<<block, c0 + k_beg, stride<<blocks, k_end - k_beg); for (nat k= 0; k < k_end - k_beg; k++) ffter->dfft (temp+(k<<block), 1, ((shift>>todo) + j)<<(block-1), block); relocate (temp, (nat) 1<<block, c0+k_beg, stride<<blocks, k_end - k_beg); } c0 += (stride<<(todo+1)); } } mmx_delete<C> (temp, temp_len); if (step < step2) { c0= c; todo= steps - 1 - step; for (nat j= 0; j < ((nat) 1<<step); j++) { ffter->dfft (c0, stride, ((shift>>todo) + j) << todo, todo+1, 0, step2-step); c0 += (stride<<(todo+1)); } } } }
void direct_transform | ( | C * | c | ) | [inline] |
Definition at line 167 of file fft_blocks.hpp.
References fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::depth, and fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::dfft().
void ifft | ( | C * | c, |
nat | stride, | ||
nat | shift, | ||
nat | steps, | ||
nat | step1, | ||
nat | step2 | ||
) | [inline] |
Definition at line 111 of file fft_blocks.hpp.
References mmx::C, fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::delocate(), fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::ffter, and fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::relocate().
Referenced by fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::ifft(), and fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::inverse_transform().
{ if (steps <= max (threshold, log2_inner_block_size)) ffter->ifft (c, stride, shift, steps, step1, step2); else { nat temp_len= default_aligned_size<C> ((nat) 1<<(log2_outer_block_size+log2_block_number)); C* c0, * temp= mmx_new<C> (temp_len); nat step, block, blocks, todo, k_beg, k_end; if (log2_inner_block_size > steps - step2) { step= steps - log2_inner_block_size; c0= c; todo= steps - 1 - step; for (nat j= 0; j < ((nat) 1<<step); j++) { ffter->ifft (c0, stride, ((shift>>todo) + j) <<todo, todo+1, max(0, (int) step1- (int) step), step2-step); c0 += (stride<<(todo+1)); } } else step= step2; while (step > step1) { block = min (step - step1, log2_outer_block_size); step -= block; todo = steps - 1 - step; blocks= todo - block + 1; c0= c; for (nat j= 0; j < ((nat) 1<<step); j++) { for (k_beg= 0; k_beg < ((nat) 1<<blocks); k_beg= k_end) { k_end= min (((nat) 1<<blocks), k_beg + ((nat) 1<< log2_block_number)); delocate (temp, (nat) 1<<block, c0 + k_beg, stride<<blocks, k_end - k_beg); for (nat k= 0; k < k_end - k_beg; k++) ffter->ifft (temp+(k<<block), 1, ((shift>>todo) + j)<<(block-1), block); relocate (temp, (nat) 1<<block, c0+k_beg, stride<<blocks, k_end - k_beg); } c0 += (stride<<(todo+1)); } } mmx_delete<C> (temp, temp_len); } }
void ifft | ( | C * | c, |
nat | stride, | ||
nat | shift, | ||
nat | steps | ||
) | [inline] |
Definition at line 163 of file fft_blocks.hpp.
void inverse_transform | ( | C * | c, |
bool | divide = true |
||
) | [inline] |
Definition at line 171 of file fft_blocks.hpp.
References fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::depth, fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::ifft(), mmx::invert(), and fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::len.
Definition at line 58 of file fft_blocks.hpp.
References mmx::C.
Referenced by fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::dfft(), and fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::ifft().
{ for (nat i= 0; i < s1; i++, c0 += s0) { C* cc0= c0, * cc1= c1 + i; for (nat k= 0; k < n; k++, cc0++, cc1+= s1) *cc0= *cc1; } }
nat depth |
Definition at line 39 of file fft_blocks.hpp.
Referenced by fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::direct_transform(), and fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::inverse_transform().
FFTER* ffter |
Definition at line 38 of file fft_blocks.hpp.
Referenced by fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::dfft(), fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::ifft(), and fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::~fft_blocks_transformer().
nat len |
Definition at line 40 of file fft_blocks.hpp.
Referenced by fft_blocks_transformer< C, FFTER, log2_outer_block_size, log2_block_number, log2_inner_block_size, threshold >::inverse_transform().
Definition at line 41 of file fft_blocks.hpp.