FFTW Power Spectrum

  • Follow


Dear all,

for quite a while I struggle with the following problem : 
Having a 3-D Array of equally data in X,Y & Z , I want to calculate the
power spectra. 

=============

#include "fftw3.h"
#include <math.h>
#include <iostream>
#include <complex>
#include <blitz/array.h>

using namespace blitz;

main(int argc,char **argv)
{

 // Blitz++ is an c++ class for faciliating array handling
blitz::Array<double, 3> phi(32,32,32);        // creates 3D Array with
indices 0-31 for x, y, z
blitz::Array<std::complex<double>, 3> phi_k(32,32,17);

fftw_plan plan_Phi3DForward      = fftw_plan_dft_r2c_3d(32, 32, 32, 
phi.data(), (fftw_complex *)  phi_k.data(), FFTW_ESTIMATE);

// 3d symmetric  sin wave
 for(int i = 0; i <= 31; i++) {
 for(int j = 0; j <= 31; j++) {
  for(int k = 0; k <= 31; k++) {
        phi(i,j,k) = (sin(((double)i)/32 * 8*M_PI) + sin(((double)j)/32 *
8*M_PI) + sin(((double)k)/32 * 8*M_PI))/sqrt((double) 32*32*32);
                 }
     } }
      fftw_execute(plan_Phi3DForward);
               
      double mode_x, mode_y, mode_z; 
       // Get first 8 modes
        for(int m = 0; m < 8 ; m++) {
                    mode_x = 0.e0; mode_y = 0.e0; mode_z = 0.e0;
                   
         // Iterate all elements to sum up
         for(int i = 0; i <= 31; i++) {
            for(int j = 0; j <= 31; j++) {
                for(int k = 0; k <= 16; k++) {
                     // frequency symmetry around
                     mode_x += pow2(abs(phi_k(m, j, k)))/(8.f * M_PI) +
((m > 0) ? (pow2(abs(phi_k(32 -m, j, k))))/(8.f * M_PI) : 0.e0); 
                     mode_y += pow2(abs(phi_k(i, m,k)))/(8.f * M_PI) + ((m
> 0) ?  (pow2(abs(phi_k(i, 32 -m, k))))/(8.f * M_PI) : 0.e0);
                     //complex conjugates for i > N/2 (factor 2.e0) 
                     mode_z += ((i > 0) ? 2.e0 : 1.e0) *(pow2(abs(phi_k(i,
j, m))))/(8.f * M_PI); 
                 }
            } 
         }
                     std::cout << m << " " << mode_x << " " << mode_y << "
" << mode_z << std::endl;     
       
       }
               fftw_free(plan_Phi3DForward);

}

  =========

the mode power should be equal for each direction but instead I get
following result

0   31291.1            31291.1             33246.8
1   5.74174e-29   5.33214e-29    6.44005e-30
2   1.11428e-28   6.92429e-29    2.7889e-29
3   1.21869e-27   1.13776e-27    2.66253e-28
4   20860.8            20860.8             5541.14
5   7.43371e-28  5.29499e-28     1.2743e-28
6   4.48504e-28  4.74109e-28     1.38245e-28
7   8.68525e-29  1.65377e-28     3.47825e-29

for mode 0 and 4 the discrepancy can not be explained by rounding errors
etc., so I guess
I  calculate the mode powers wrong, but I do not see why/where ? Any hints
?

Thanks for reading & helping 

Paul



0
Reply Mosby 2/5/2010 4:03:24 PM

On 5 Feb, 17:03, "Mosby" <pphilscher...@gmail.com> wrote:
> Dear all,
>
> for quite a while I struggle with the following problem :
> Having a 3-D Array of equally data in X,Y & Z , I want to calculate the
> power spectra.
....
> I =A0calculate the mode powers wrong, but I do not see why/where ? Any hi=
nts
> ?

I don't know what you expect to see, but be aware that
the symmetry relations in ND, N > 1, are different from
the simple 1D case. The symmetry is around origo. If you
expect to see conjugate symmetry mirrored around the 0 axis
in each transformed dimension, you will become confused.

Try some simple experiments in 2D first, so you understand
the effect before you move to 3D. If you have a graphics
package, use it. The effect is almost counter intuitive
if you only have played with 1D DFTs.

Rune
0
Reply Rune 2/5/2010 6:12:39 PM


1 Replies
676 Views

(page loaded in 0.039 seconds)

Similiar Articles:













7/22/2012 10:31:10 PM


Reply: