Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.41 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <complex.h>
  4.  
  5. double PI;
  6. typedef double complex cplx;
  7.  
  8. //<summary>Вычисление среднего квадратического, сложность O(n)</summary>
  9. //<param name="v">Массив данных</param>
  10. //<param name="n">Размер массива</param>
  11. //<returns>Среднее квадратическое</returns>
  12. double rms(double* v, int n)
  13. {
  14.     int i;
  15.     double sum = 0.0;
  16.     for (i = 0; i < n; i++)
  17.         sum += v[i] * v[i];
  18.     return sqrt(sum / n);
  19. }
  20.  
  21. void _fft(cplx buf[], cplx out[], int n, int step)
  22. {
  23.     if (step < n) {
  24.         _fft(out, buf, n, step * 2);
  25.         _fft(out + step, buf + step, n, step * 2);
  26.  
  27.         for (int i = 0; i < n; i += 2 * step) {
  28.             cplx t = cexp(-I * PI * i / n) * out[i + step];
  29.             buf[i / 2]     = out[i] + t;
  30.             buf[(i + n)/2] = out[i] - t;
  31.         }
  32.     }
  33. }
  34.  
  35. //<summary>Быстрое преобразование Фурье, сложность O(n log n)</summary>
  36. //<param name="buf[]">Массив данных комплексных чисел (C99)</param>
  37. //<param name="n">Размер массива(размер должен быть степенью двойки)</param>
  38. void fft(cplx buf[], int n)
  39. {
  40.     cplx out[n];
  41.     for (int i = 0; i < n; i++) out[i] = buf[i];
  42.  
  43.     _fft(buf, out, n, 1);
  44. }
  45.  
  46. //<summary>Пример алгоритма с квадратичной временной сложностью O(n*n)</summary>
  47. void n2Sample(double* v, int n)
  48. {
  49.     int i;
  50.     int j;
  51.     for (i = 0; i < n; i++)
  52.     {
  53.         for (j = 0; j < n; j++)
  54.         {
  55.             v[j] += 0;
  56.         }
  57.     }
  58. }
  59.  
  60. int main(void)
  61. {
  62.    
  63.     double v[16000];//Датчик 8000гц, частота дискретизации должна быть в 2 раза выше = 16000гц, значит 16 000 значений в секунду
  64.                     //их можно буферизировать в течении секунды, производить обработку и отсылать в сеть результат.
  65.     rms(v, sizeof(v) / sizeof(double)); //Сложность O(n)
  66.     n2Sample(v, sizeof(v) / sizeof(double));//Сложность O(n*n)
  67.    
  68.     //Пример для быстрого преобразования фурье
  69.     PI = atan2(1, 1) * 4;
  70.     cplx buf[16384];//Массив комплексных чисел, можно заполнять как обычный напимер buf[0]=1.0; buf[1] = 2;
  71.     fft(buf, 16384);//Сложность O(n log n)
  72.  
  73.     return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement