Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2017
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.92 KB | None | 0 0
  1.  
  2. import java.util.*;
  3.  
  4. public class FFT {
  5.  
  6.     public Vector<Complex> directFFT(Vector<Complex> v) {
  7.         int n = v.size();
  8.         int length = 0;
  9.         while ((1 << length) < n) length++;
  10.        
  11.         Vector<int> reversed = new Vector<int>(n);
  12.         reversed.set(0, 0);
  13.         int high1 = -1;
  14.         for (int i = 1; i < n; i++) {
  15.             if ((i & (i - 1)) == 0)
  16.             high1++;
  17.             reversed.set(i, reversed.get(i ^ (1 << high1)));
  18.             reversed.set(i, (1 << (length - high1 - 1)));
  19.         }
  20.        
  21.         Vector<Complex> roots = new Vector<Complex>(n);
  22.         for (int i = 0; i <= n / 2; i++) {
  23.             double alpha = 2 * Math.PI * i / n;        
  24.             roots.set(i, new Complex(Math.cos(alpha), Math.sin(alpha)));
  25.         }
  26.         for (int i = n - 1; i > n / 2; i--) {
  27.             roots.set(i, roots.get(i).conjugate());
  28.         }
  29.        
  30.         Vector<Complex> result = new Vector<Complex>(n);
  31.         for (int i = 0; i < n; i++) {
  32.             int j = reversed.get(i);
  33.             result.set(i, v.get(reversed.get(i)));
  34.         }
  35.        
  36.         for (int len = 1; len < n; len *= 2) {
  37.             Vector<Complex> newResult = new Vector<Complex>(n);
  38.            
  39.             int rstep = roots.size() / (len * 2);
  40.             for (int pdest = 0; pdest < n; ) {             
  41.                 int p1 = pdest;
  42.                 for (int i = 0; i < len; i++) {
  43.                     Complex value = roots.get(i * rstep) * result.get(p1 + len);
  44.                     newResult.set(pdest, result.get(p1) + value);
  45.                     newResult.set(pdest + len, result.get(p1) - value);
  46.                    
  47.                     pdest++;
  48.                     p1++;
  49.                 }
  50.                 pdest += len;
  51.             }
  52.             result.swap(newResult);
  53.         }
  54.        
  55.         return result;
  56.     }
  57.    
  58.     public Vector<Complex> reverseFFT(Vector<Complex> v) {
  59.         Vector<Complex> result = directFFT(v);
  60.        
  61.         double n = (double)v.size();       
  62.         int size = result.size();
  63.        
  64.         for (int i = 0; i < size; i++) {
  65.             result.set(i, result.get(i).divide(n));
  66.         }
  67.        
  68.         for (int i = 1; i < size / 2 - 1; i++) {
  69.             Complex t = result.get(i);
  70.             result.set(i, result.get(size - i));
  71.             result.set(size - i, t);
  72.         }
  73.        
  74.         return result;
  75.     }
  76.    
  77.     public static void main(String[] args) {
  78.        
  79.     }
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement