Guest User

Untitled

a guest
Apr 26th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.62 KB | None | 0 0
  1. var calculateFFT = function(real, imag) {
  2. var bufferSize = real.length;
  3.  
  4. if ( bufferSize == 1 ) {
  5. return [[real[0], imag[0]]];
  6. }
  7.  
  8. if(bufferSize % 2 != 0) throw "Invalid buffer size, bufferSize must be a power of 2";
  9.  
  10. var even_real = [];
  11. var even_imag = [];
  12. var odd_real = [];
  13. var odd_imag = [];
  14.  
  15. // break up signal into odd and even parts
  16. for ( var k = 0; k < bufferSize/2; k++ ) {
  17. if ( typeof(imag) == 'undefined' ) {
  18. // this is a non complex signal
  19. even_real[k] = real[2*k];
  20. even_imag[k] = 0.0;
  21. odd_real[k] = real[2*k+1];
  22. odd_imag[k] = 0.0;
  23. } else {
  24. even_real[k] = real[2*k];
  25. even_imag[k] = imag[2*k];
  26. odd_real[k] = real[2*k+1];
  27. odd_imag[k] = imag[2*k+1];
  28. }
  29. }
  30.  
  31. var q = calculateFFT(even_real, even_imag);
  32. var r = calculateFFT(odd_real, odd_imag);
  33.  
  34. y = [];
  35.  
  36. for ( var k = 0; k < bufferSize/2; k++ ) {
  37. var kth = -2 * k * Math.PI / bufferSize;
  38. var wk_real = Math.cos(kth);
  39. var wk_imag = Math.sin(kth);
  40.  
  41. // Complex: q[k] + wk * r[k], must multiply the complex parts correctly
  42. y[k] = [q[k][0] + (wk_real*r[k][0] - wk_imag*r[k][1]),
  43. q[k][1] + (wk_real*r[k][1] + wk_imag*r[k][0])];
  44.  
  45. // Complex: q[k] - wk * r[k], must multiply the complex parts correctly
  46. y[k + bufferSize/2] = [q[k][0] - (wk_real*r[k][0] - wk_imag*r[k][1]),
  47. q[k][1] - (wk_real*r[k][1] + wk_imag*r[k][0])];
  48. }
  49. return y;
  50. }
Add Comment
Please, Sign In to add comment