Advertisement
Guest User

Untitled

a guest
Sep 29th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.22 KB | None | 0 0
  1. #pragma once
  2. #include <stdlib.h>
  3. #include "xyz.h"
  4. #include <cmath>
  5. #include <valarray>
  6. #include <complex>
  7.  
  8. using namespace std;
  9. class Fourier;
  10. typedef complex<double> Complex;
  11. typedef valarray<Complex> CArray;
  12. const double PI = 3.141592653589793238460;
  13.  
  14. class window
  15. {
  16. private:
  17. const int size;
  18. xyz* elements;
  19. public:
  20. CArray* fftx;
  21. CArray* ffty;
  22. CArray* fftz;
  23. int curNumOfElements;
  24. double meanx, meany, meanz;
  25. double correlationXY, correlationXZ, correlationYZ;
  26. window(int size) :size(size), curNumOfElements(0)
  27. {
  28. elements = (xyz*)malloc(size * sizeof(xyz));
  29. fftx = new CArray(size);
  30. ffty = new CArray(size);
  31. fftz = new CArray(size);
  32. }
  33. ~window()
  34. {
  35. free(elements);
  36. delete(fftx);
  37. delete(ffty);
  38. delete(fftz);
  39. }
  40. bool add(xyz &element)
  41. {
  42. if (isFull()) return false;
  43. else
  44. {
  45. elements[curNumOfElements] = element;
  46. curNumOfElements++;
  47. return true;
  48. }
  49. }
  50. bool isFull()
  51. {
  52. return curNumOfElements >= size;
  53. }
  54. bool isOverthreshold()
  55. {
  56. return curNumOfElements >= size / 2;
  57. }
  58. void calculate()
  59. {
  60. calculateMean();
  61. calculateCorrelation();
  62. calculateFFT();
  63. }
  64. void calculateFFT() {
  65. for (int i = 0; i < curNumOfElements; i++) {
  66. fftx[i] = elements[i].x;
  67. ffty[i] = elements[i].y;
  68. fftz[i] = elements[i].z;
  69. }
  70. fft_axis(*fftx);
  71. fft_axis(*ffty);
  72. fft_axis(*fftz);
  73. }
  74.  
  75. void fft_axis(CArray& a) {
  76. const size_t N = a.size();
  77. if (N <= 1) return;
  78.  
  79. // divide
  80. CArray even = a[slice(0, N / 2, 2)];
  81. CArray odd = a[slice(1, N / 2, 2)];
  82.  
  83. // conquer
  84. fft_axis(even);
  85. fft_axis(odd);
  86.  
  87. // combine
  88. for (size_t k = 0; k < N / 2; ++k)
  89. {
  90. Complex t = polar(1.0, -2 * PI * k / N) * odd[k];
  91. a[k] = even[k] + t;
  92. a[k + N / 2] = even[k] - t;
  93. }
  94. }
  95.  
  96. void calculateMean()
  97. {
  98. int sumx = 0;
  99. int sumy = 0;
  100. int sumz = 0;
  101. for (int i = 0; i < curNumOfElements; i++)
  102. {
  103. sumx += elements[i].x;
  104. sumy += elements[i].y;
  105. sumz += elements[i].z;
  106. }
  107. meanx = sumx / curNumOfElements;
  108. meany = sumy / curNumOfElements;
  109. meanz = sumz / curNumOfElements;
  110. }
  111. void calculateCorrelation()
  112. {
  113. double tempXY = 0;
  114. double tempXZ = 0;
  115. double tempYZ = 0;
  116. double tempVarx = 0;
  117. double tempVary = 0;
  118. double tempVarz = 0;
  119. for (int i = 0; i < curNumOfElements; i++)
  120. {
  121. tempXY += (elements[i].x - meanx) * (elements[i].y - meany);
  122. tempXZ += (elements[i].x - meanx) * (elements[i].z - meanz);
  123. tempYZ += (elements[i].y - meany) * (elements[i].z - meanz);
  124. tempVarx += (elements[i].x - meanx) * (elements[i].x - meanx);
  125. tempVary += (elements[i].y - meany) * (elements[i].y - meany);
  126. tempVarz += (elements[i].z - meanz) * (elements[i].z - meanz);
  127. }
  128. double covXY = tempXY / curNumOfElements;
  129. double covXZ = tempXZ / curNumOfElements;
  130. double covYZ = tempYZ / curNumOfElements;
  131. double varX = tempVarx / curNumOfElements;
  132. double varY = tempVary / curNumOfElements;
  133. double varZ = tempVarz / curNumOfElements;
  134. correlationXY = covXY / sqrt((varX*varY));
  135. correlationXZ = covXZ / sqrt((varX*varZ));
  136. correlationYZ = covXZ / sqrt((varZ*varY));
  137. cout << "correlationXY is:" << correlationXY << endl;
  138. }
  139.  
  140. xyz getElement(int i) const {
  141. return elements[i];
  142. }
  143.  
  144. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement