Advertisement
Guest User

Untitled

a guest
Apr 21st, 2017
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. // Тестировалось на Arduino IDE 1.0.1
  2. #include <Adafruit_GFX.h>
  3. #include <Adafruit_PCD8544.h>
  4. #include <math.h>
  5.  
  6.  
  7. Adafruit_PCD8544 display = Adafruit_PCD8544(2, 3, 4, 5, 6);
  8. void FFTAnalysis(double *AVal, double *FTvl, int Nvl, int Nft);
  9.  
  10. void setup() {
  11.  // analogReference(DEFAULT);
  12.   Serial.begin(9600);
  13.   display.begin();              // Инициализация дисплея
  14.   display.setContrast(60);      // Устанавливаем контраст
  15.   display.setTextColor(BLACK);  // Устанавливаем цвет текста
  16.   display.setTextSize(1);       // Устанавливаем размер текста
  17.   display.clearDisplay();       // Очищаем дисплей
  18.   display.display();
  19.   delay(100);
  20.   Serial.begin(9600);
  21. }
  22. int x=0;
  23. int y=x;
  24. void loop() {
  25.  
  26.   double inputArr[64];
  27.   double outputArr[1];
  28.   double arrData[48];
  29.   double RES[48];
  30.  
  31.   for(int i = 0; i < 48 ; i++){
  32.    for(int i = 0; i < 63 ; i++){
  33.       inputArr[i] = analogRead(6);
  34.    }
  35.    FFTAnalysis(inputArr,outputArr,1,1);
  36.    
  37.    RES[i] = *outputArr;
  38.    Serial.println(RES[i]);
  39.    delay(200);
  40.    
  41.   }
  42.  
  43.   display.clearDisplay();
  44.   for(int i=0;i<48;i++){
  45.   display.drawFastHLine(0,i,RES[i],1);    
  46.   }
  47.  
  48.   display.display();
  49.   delayMicroseconds(analogRead(1)*10);
  50.  
  51. }
  52.  
  53. // AVal - массив анализируемых данных, Nvl - длина массива, должна быть кратна степени 2.
  54. // FTvl - массив полученных значений, Nft - длина массива, должна быть равна Nvl / 2 или меньше.
  55.  
  56. const double TwoPi = 6.283185307179586;
  57.  
  58. void FFTAnalysis(double *AVal, double *FTvl, int Nvl, int Nft) {
  59.  int i, j, n, m, Mmax, Istp;
  60.  double Tmpr, Tmpi, Wtmp, Theta;
  61.  double Wpr, Wpi, Wr, Wi;
  62.  double *Tmvl;
  63.  
  64.  n = Nvl * 2; Tmvl = new double[n];
  65.  
  66.  for (i = 0; i < n; i+=2) {
  67.   Tmvl[i] = 0;
  68.   Tmvl[i+1] = AVal[i/2];
  69.  }
  70.  
  71.  i = 1; j = 1;
  72.  while (i < n) {
  73.   if (j > i) {
  74.    Tmpr = Tmvl[i]; Tmvl[i] = Tmvl[j]; Tmvl[j] = Tmpr;
  75.    Tmpr = Tmvl[i+1]; Tmvl[i+1] = Tmvl[j+1]; Tmvl[j+1] = Tmpr;
  76.   }
  77.   i = i + 2; m = Nvl;
  78.   while ((m >= 2) && (j > m)) {
  79.    j = j - m; m = m >> 1;
  80.   }
  81.   j = j + m;
  82.  }
  83.  
  84.  Mmax = 2;
  85.  while (n > Mmax) {
  86.   Theta = -TwoPi / Mmax; Wpi = sin(Theta);
  87.   Wtmp = sin(Theta / 2); Wpr = Wtmp * Wtmp * 2;
  88.   Istp = Mmax * 2; Wr = 1; Wi = 0; m = 1;
  89.  
  90.   while (m < Mmax) {
  91.    i = m; m = m + 2; Tmpr = Wr; Tmpi = Wi;
  92.    Wr = Wr - Tmpr * Wpr - Tmpi * Wpi;
  93.    Wi = Wi + Tmpr * Wpi - Tmpi * Wpr;
  94.  
  95.    while (i < n) {
  96.     j = i + Mmax;
  97.     Tmpr = Wr * Tmvl[j] - Wi * Tmvl[j-1];
  98.     Tmpi = Wi * Tmvl[j] + Wr * Tmvl[j-1];
  99.  
  100.     Tmvl[j] = Tmvl[i] - Tmpr; Tmvl[j-1] = Tmvl[i-1] - Tmpi;
  101.     Tmvl[i] = Tmvl[i] + Tmpr; Tmvl[i-1] = Tmvl[i-1] + Tmpi;
  102.     i = i + Istp;
  103.    }
  104.   }
  105.  
  106.   Mmax = Istp;
  107.  }
  108.  
  109.  for (i = 0; i < Nft; i++) {
  110.   j = i * 2; FTvl[i] = 2*sqrt(pow(Tmvl[j],2) + pow(Tmvl[j+1],2))/Nvl;
  111.  }
  112.  
  113.  delete []Tmvl;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement