|
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.