algebramix_doc 0.3
fft_truncated_transformer< C, Ffter > Class Template Reference

#include <fft_truncated.hpp>

List of all members.

Public Types

Public Member Functions

Public Attributes


Detailed Description

template<typename C, typename Ffter = fft_naive_transformer<C>>
class mmx::fft_truncated_transformer< C, Ffter >

Examples:

tft_test.cpp.

Definition at line 27 of file fft_truncated.hpp.


Member Typedef Documentation

typedef implementation<vector_linear,vector_naive> NVec

Definition at line 29 of file fft_truncated.hpp.

typedef Ffter::R R

Definition at line 30 of file fft_truncated.hpp.

typedef Ffter::S S

Definition at line 32 of file fft_truncated.hpp.

typedef Ffter::U U

Definition at line 31 of file fft_truncated.hpp.


Constructor & Destructor Documentation

fft_truncated_transformer ( nat  s) [inline]

Definition at line 37 of file fft_truncated.hpp.

References fft_truncated_transformer< C, Ffter >::ffter.

                                          : len (s) {
    nat n= next_power_of_two (s);
    VERIFY(s <= n, "maximum size exceeded");
    ffter= new Ffter (n); }

Definition at line 42 of file fft_truncated.hpp.

References fft_truncated_transformer< C, Ffter >::ffter.

{ delete ffter; }

Member Function Documentation

void direct_transform ( C c) [inline]

Definition at line 155 of file fft_truncated.hpp.

References fft_truncated_transformer< C, Ffter >::dtft(), fft_truncated_transformer< C, Ffter >::ffter, and fft_truncated_transformer< C, Ffter >::len.

                          {
    nat n= ((nat) 1) << ffter->depth;
    if (len == n)
      ffter->direct_transform (c);
    else {
      NVec::clear (c + len, n - len);
      dtft (c, 1, len, 0);
      NVec::clear (c + len, n - len);
    }
  }
void dtft ( C c,
nat  stride,
nat  s,
nat  shift,
nat  steps 
) [inline]

Definition at line 61 of file fft_truncated.hpp.

References fft_truncated_transformer< C, Ffter >::fft_cross_range(), and fft_truncated_transformer< C, Ffter >::ffter.

Referenced by fft_truncated_transformer< C, Ffter >::direct_transform(), and fft_truncated_transformer< C, Ffter >::dtft().

                                                       {
    // In place direct tft of c[0], c[stride], ..., c[(s-1) stride]
    // Roots start at roots + (shift<<1)
    if (s == 0 || steps == 0) return;
    nat todo= steps - 1;
    nat w   = (nat) 1 << todo;
    fft_cross_range (c, c + (stride<<todo), stride, shift>>todo, w);
    steps--;
    if (s >= w) {
      ffter->dfft (c, stride, shift, steps);
      s -= w;  shift += w >> 1;  c += stride<<todo;
    }
    dtft (c, stride, s, shift, steps);
  }
void dtft ( C c,
nat  stride,
nat  s,
nat  shift 
) [inline]

Definition at line 147 of file fft_truncated.hpp.

References fft_truncated_transformer< C, Ffter >::dtft(), and fft_truncated_transformer< C, Ffter >::ffter.

                                            {
    dtft (c, stride, s, shift, ffter->depth); }
void fft_cross_range ( C lp,
C rp,
nat  stride,
nat  shift,
nat  nr 
) [inline]

Definition at line 46 of file fft_truncated.hpp.

References fft_truncated_transformer< C, Ffter >::ffter.

Referenced by fft_truncated_transformer< C, Ffter >::dtft().

                                                                {
    U* a= ffter->roots + (shift << 1);
    if (shift == 0)
      for (nat i=nr; i!=0; i--) {
        R::fft_cross (lp, rp);
        lp += stride; rp +=stride;
      }
    else
      for (nat i=nr; i!=0; i--) {
        R::dfft_cross (lp, rp, a);
        lp += stride; rp += stride;
      }
  }
void ifft_cross_range ( C lp,
C rp,
nat  stride,
nat  shift,
nat  nr 
) [inline]

Definition at line 108 of file fft_truncated.hpp.

References fft_truncated_transformer< C, Ffter >::ffter.

Referenced by fft_truncated_transformer< C, Ffter >::itft().

                                                                 {
    U* a= ffter->roots + (shift << 1);
    if (shift == 0)
      for (nat i=nr; i!=0; i--) {
        R::fft_cross (lp, rp);
        lp += stride; rp += stride;
      }
    else
      for (nat i=nr; i!=0; i--) {
        R::ifft_cross (lp, rp, a+1);
        lp += stride; rp += stride;
      }
  }
void inverse_transform ( C c) [inline]

Definition at line 167 of file fft_truncated.hpp.

References fft_truncated_transformer< C, Ffter >::ffter, mmx::invert(), fft_truncated_transformer< C, Ffter >::itft(), and fft_truncated_transformer< C, Ffter >::len.

                           {
    nat n= ((nat) 1) << ffter->depth;
    if (len == n)
      ffter->inverse_transform (c);
    else {
      NVec::clear (c + len, n - len);
      itft (c, 1, len, 0);
      S x= invert (binpow (S (2), ffter->depth));
      NVec::template vec_unary_scalar<typename R::fft_mul_sc_op> (c, x, len);
      NVec::clear (c + len, n - len);
    }
  }
void itft ( C c,
nat  stride,
nat  s,
nat  shift,
nat  steps 
) [inline]

Definition at line 123 of file fft_truncated.hpp.

References fft_truncated_transformer< C, Ffter >::ffter, fft_truncated_transformer< C, Ffter >::ifft_cross_range(), fft_truncated_transformer< C, Ffter >::itft_flip_range(), and fft_truncated_transformer< C, Ffter >::tft_cross_range().

Referenced by fft_truncated_transformer< C, Ffter >::inverse_transform(), and fft_truncated_transformer< C, Ffter >::itft().

                                                       {
    // In place inverse tft of c[0], c[stride], ..., c[(s-1) stride]
    // Roots start at roots + (shift<<1)
    if (s == 0 || steps == 0) return;
    nat todo= steps - 1;
    nat l   = (nat) 1 << steps;
    nat w   = (nat) 1 << todo;
    if (s < w) {
      tft_cross_range (c + stride*s, c + stride*(s+w),
                       stride, shift>>todo, w-s);
      itft (c, stride, s, shift, steps-1);
      itft_flip_range (c, c + (stride<<todo), stride, shift>>todo, s);
    }
    else {
      ffter->ifft (c, stride, shift, steps-1);
      itft_flip_range (c + stride*(s-w), c + stride*s,
                       stride, shift>>todo, l-s);
      if (s == w) return;
      itft (c + (stride<<todo), stride, s-w, shift + (w>>1), steps-1);
      ifft_cross_range (c, c + (stride<<todo), stride, shift>>todo, s-w);
    }
  }
void itft ( C c,
nat  stride,
nat  s,
nat  shift 
) [inline]

Definition at line 151 of file fft_truncated.hpp.

References fft_truncated_transformer< C, Ffter >::ffter, and fft_truncated_transformer< C, Ffter >::itft().

                                            {
    itft (c, stride, s, shift, ffter->depth); }
void itft_flip_range ( C lp,
C rp,
nat  stride,
nat  shift,
nat  nr 
) [inline]

Definition at line 78 of file fft_truncated.hpp.

References fft_truncated_transformer< C, Ffter >::ffter.

Referenced by fft_truncated_transformer< C, Ffter >::itft().

                                                                {
    U* a= ffter->roots + (shift << 1);
    if (shift == 0)
      for (nat i=nr; i!=0; i--) {
        R::itft_flip (lp, rp);
        lp += stride; rp += stride;
      }
    else
      for (nat i=nr; i!=0; i--) {
        R::itft_flip (lp, rp, a);
        lp += stride; rp += stride;
      }
  }
void tft_cross_range ( C lp,
C rp,
nat  stride,
nat  shift,
nat  nr 
) [inline]

Definition at line 93 of file fft_truncated.hpp.

References fft_truncated_transformer< C, Ffter >::ffter.

Referenced by fft_truncated_transformer< C, Ffter >::itft().

                                                                {
    U* a= ffter->roots + (shift << 1);
    if (shift == 0)
      for (nat i=nr; i!=0; i--) {
        R::dtft_cross (lp, rp);
        lp += stride; rp += stride;
      }
    else
      for (nat i=nr; i!=0; i--) {
        R::dtft_cross (lp, rp, a);
        lp += stride; rp += stride;
      }
  }

Member Data Documentation


The documentation for this class was generated from the following file:
 All Classes Namespaces Files Functions Variables Typedefs Friends Defines