Advertisement
Nikitka_36

Фурье

Mar 5th, 2015
475
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.30 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include "omp.h"
  5. #include <complex.h>
  6.  
  7. #define N 8
  8. #define PI 3.141592653589793
  9.  
  10. void swap(double complex* a, int i, int j)
  11. {
  12.     double complex temp;
  13.     temp = a[i];
  14.     a[i] = a[j];
  15.     a[j] = temp;  
  16. }
  17.  
  18. void shuffle(double complex* a)
  19. {
  20.     int j = N / 2, t;
  21.     for(int i = 1; i < N-1; i++)
  22.     {
  23.         if (i < j) swap(a, i, j);
  24.         t = N / 2;
  25.         while(j / t == 1)
  26.         {
  27.             j = j - t;
  28.             t /= 2;
  29.         }
  30.         j += t;
  31.     }
  32. }
  33.  
  34.  
  35.  
  36. void get_omega(double complex* W)
  37. {
  38.     for(int k = 0; k < N / 2; k++)
  39.         W[k] = cexp(2*PI*I*k/N);
  40. }
  41.  
  42. void Furhe(double complex* x)
  43. {
  44.     double complex W[N/2];
  45.     double complex omega;
  46.     double complex temp;
  47.     int i;
  48.     int l = N / 2;
  49.     int t;
  50.     get_omega(W);
  51.     //for(int i = 0; i <= N/2; i++)
  52.         //printf("%f + %f", creal(W[i]), cimag(W[i]));
  53.     shuffle(x);
  54.     int k = 1;
  55.     l = N / 2;
  56.     while(k < N)
  57.     {
  58.         t = 0;
  59.         omega = W[0];
  60.         for(int j = 0; j < k; j++)
  61.         {
  62.             i = j;
  63.             while(i < N)
  64.             {
  65.                 temp = x[i];
  66.                 x[i] = temp + omega*x[i+k];
  67.                 x[i + k] = temp - omega*x[i+k];
  68.                 i = i +2*k;
  69.             }
  70.             t += l;
  71.             omega = W[t];
  72.         }
  73.         k = 2*k;
  74.         l = l /2;
  75.     }
  76.    
  77.      
  78. }
  79.  
  80. int main()
  81. {
  82.     double complex x[N] = {0, 1, 0, 1};
  83.  
  84.     Furhe(x);
  85.     for(int i = 0; i < N; i++)
  86.         printf("%f + %f\n", creal(x[i]), cimag(x[i]));
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement