Guest User

Untitled

a guest
Nov 18th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.80 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <cmath>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. class FFT {
  7. private:
  8. float *real, *imag;
  9. int size;
  10.  
  11. static unsigned int bitreverse(unsigned int in, int bits);
  12.  
  13. public:
  14. FFT(int size); // size must be a power of 2 (!)
  15. ~FFT();
  16. void fft(float *output, const float *input);
  17. };
  18.  
  19.  
  20. FFT::FFT(int size) {
  21. real = new float[size];
  22. imag = new float[size];
  23. this->size = size;
  24. }
  25.  
  26. FFT::~FFT() {
  27. delete[] real;
  28. delete[] imag;
  29. }
  30.  
  31. void FFT::fft(float *output, const float *input) {
  32. int nu = (int) ((float) log(size) / log(2.0)); // Number of bits of item indexes
  33. int n2 = size / 2;
  34. int nu1 = nu - 1;
  35. float tr, ti, arg, c, s;
  36.  
  37. for (int i = 0; i < size; ++i) {
  38. real[i] = input[i];
  39. imag[i] = 0;
  40. }
  41.  
  42. // Stage 1 - calculation
  43. float f = -2 * M_PI / size;
  44. for (int l = 1; l <= nu; l++) {
  45. int k = 0;
  46. while (k < size) {
  47. for (int i = 1; i <= n2; i++) {
  48. arg = bitreverse(k >> nu1, nu) * f;
  49. c = cos(arg);
  50. s = sin(arg);
  51. tr = real[k + n2] * c + imag[k + n2] * s;
  52. ti = imag[k + n2] * c - real[k + n2] * s;
  53. real[k + n2] = real[k] - tr;
  54. imag[k + n2] = imag[k] - ti;
  55. real[k] += tr;
  56. imag[k] += ti;
  57. k++;
  58. }
  59. k += n2;
  60. }
  61. nu1--;
  62. n2 /= 2;
  63. }
  64.  
  65. // Stage 2 - normalize the output and feed the magnitudes to the output array
  66. for (int i = 0; i < size; ++i)
  67. output[i] = sqrt(real[i] * real[i] + imag[i] * imag[i]) / size;
  68.  
  69. // Stage 3 - recombination
  70. for (int k = 0; k < size; ++k) {
  71. int r = bitreverse(k, nu);
  72. if (r > k) {
  73. tr = output[k];
  74. output[k] = output[r];
  75. output[r] = tr;
  76. }
  77. }
  78. }
  79.  
  80. unsigned int FFT::bitreverse(unsigned int in, int bits) {
  81. unsigned int out = 0;
  82. while (bits--) {
  83. out |= (in & 1) << bits;
  84. in >>= 1;
  85. }
  86. return out;
  87. }
  88.  
  89.  
  90. extern "C" {
  91. int main(int argc, char *argv[]) {
  92. int real, complex;
  93. printf("%d", argc);
  94. }
  95. }
Add Comment
Please, Sign In to add comment