Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Тестировалось на Arduino IDE 1.0.1
- #include <Adafruit_GFX.h>
- #include <Adafruit_PCD8544.h>
- #include <math.h>
- Adafruit_PCD8544 display = Adafruit_PCD8544(2, 3, 4, 5, 6);
- void FFTAnalysis(double *AVal, double *FTvl, int Nvl, int Nft);
- void setup() {
- // analogReference(DEFAULT);
- Serial.begin(9600);
- display.begin(); // Инициализация дисплея
- display.setContrast(60); // Устанавливаем контраст
- display.setTextColor(BLACK); // Устанавливаем цвет текста
- display.setTextSize(1); // Устанавливаем размер текста
- display.clearDisplay(); // Очищаем дисплей
- display.display();
- delay(100);
- Serial.begin(9600);
- }
- int x=0;
- int y=x;
- void loop() {
- double inputArr[64];
- double outputArr[1];
- double arrData[48];
- double RES[48];
- for(int i = 0; i < 48 ; i++){
- for(int i = 0; i < 63 ; i++){
- inputArr[i] = analogRead(6);
- }
- FFTAnalysis(inputArr,outputArr,1,1);
- RES[i] = *outputArr;
- Serial.println(RES[i]);
- delay(200);
- }
- display.clearDisplay();
- for(int i=0;i<48;i++){
- display.drawFastHLine(0,i,RES[i],1);
- }
- display.display();
- delayMicroseconds(analogRead(1)*10);
- }
- // AVal - массив анализируемых данных, Nvl - длина массива, должна быть кратна степени 2.
- // FTvl - массив полученных значений, Nft - длина массива, должна быть равна Nvl / 2 или меньше.
- const double TwoPi = 6.283185307179586;
- void FFTAnalysis(double *AVal, double *FTvl, int Nvl, int Nft) {
- int i, j, n, m, Mmax, Istp;
- double Tmpr, Tmpi, Wtmp, Theta;
- double Wpr, Wpi, Wr, Wi;
- double *Tmvl;
- n = Nvl * 2; Tmvl = new double[n];
- for (i = 0; i < n; i+=2) {
- Tmvl[i] = 0;
- Tmvl[i+1] = AVal[i/2];
- }
- i = 1; j = 1;
- while (i < n) {
- if (j > i) {
- Tmpr = Tmvl[i]; Tmvl[i] = Tmvl[j]; Tmvl[j] = Tmpr;
- Tmpr = Tmvl[i+1]; Tmvl[i+1] = Tmvl[j+1]; Tmvl[j+1] = Tmpr;
- }
- i = i + 2; m = Nvl;
- while ((m >= 2) && (j > m)) {
- j = j - m; m = m >> 1;
- }
- j = j + m;
- }
- Mmax = 2;
- while (n > Mmax) {
- Theta = -TwoPi / Mmax; Wpi = sin(Theta);
- Wtmp = sin(Theta / 2); Wpr = Wtmp * Wtmp * 2;
- Istp = Mmax * 2; Wr = 1; Wi = 0; m = 1;
- while (m < Mmax) {
- i = m; m = m + 2; Tmpr = Wr; Tmpi = Wi;
- Wr = Wr - Tmpr * Wpr - Tmpi * Wpi;
- Wi = Wi + Tmpr * Wpi - Tmpi * Wpr;
- while (i < n) {
- j = i + Mmax;
- Tmpr = Wr * Tmvl[j] - Wi * Tmvl[j-1];
- Tmpi = Wi * Tmvl[j] + Wr * Tmvl[j-1];
- Tmvl[j] = Tmvl[i] - Tmpr; Tmvl[j-1] = Tmvl[i-1] - Tmpi;
- Tmvl[i] = Tmvl[i] + Tmpr; Tmvl[i-1] = Tmvl[i-1] + Tmpi;
- i = i + Istp;
- }
- }
- Mmax = Istp;
- }
- for (i = 0; i < Nft; i++) {
- j = i * 2; FTvl[i] = 2*sqrt(pow(Tmvl[j],2) + pow(Tmvl[j+1],2))/Nvl;
- }
- delete []Tmvl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement