Created
June 20, 2018 22:24
-
-
Save Bomfim/14477f2672a3705a9265f478b7ac3000 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| Neste exemplo, o Arduino simula a amostragem de um sinal sinusoidal de 1000 Hz com uma amplitude de 100, amostrada a 5000 Hz. | |
| As amostras são armazenadas no array vReal. As amostras são janelas de acordo com a função Hamming. A FFT é calculada usando as amostras em janelas. | |
| Então as magnitudes de cada uma das freqüências que compõem o sinal são calculadas. Finalmente, as magnitudes do espectro de freqüência são impressas. | |
| Se você usar o Plotter serial do Arduino IDE, verá um único pico correspondente à frequência de 1000 Hz. | |
| */ | |
| #include "arduinoFFT.h" | |
| arduinoFFT FFT = arduinoFFT(); /* Cria um objeto FFT */ | |
| const uint16_t samples = 128; //Este valor deve ser sempre potência de 2, não ultrapassando 128, devido ao ADC. | |
| const double signalFrequency = 1000; | |
| const double samplingFrequency = 5000; | |
| const uint8_t amplitude = 100; | |
| /* | |
| Estes são os vetores de entrada e saída | |
| Os vetores de entrada recebem resultados calculados da FFT | |
| */ | |
| double vReal[samples]; | |
| double vImag[samples]; | |
| #define SCL_INDEX 0x00 | |
| #define SCL_TIME 0x01 | |
| #define SCL_FREQUENCY 0x02 | |
| #define SCL_PLOT 0x03 | |
| void setup() | |
| { | |
| Serial.begin(9600); | |
| } | |
| void loop() | |
| { | |
| /* Construção dos dados brutos */ | |
| double cycles = (((samples-1) * signalFrequency) / samplingFrequency); //Número de ciclos de sinal que a amostragem lerá. | |
| for (uint16_t i = 0; i < samples; i++) | |
| { | |
| vReal[i] = int8_t((amplitude * (sin((i * (twoPi * cycles)) / samples))) / 2.0);/* Constrói dados com valores positivos e negativos */ | |
| //vReal[i] = uint8_t((amplitude * (sin((i * (twoPi * cycles)) / samples) + 1.0)) / 2.0);/* Constrói dados deslocados no eixo Y para incluir apenas valores positivos*/ | |
| vImag[i] = 0.0; //A parte imaginária deve ser zerada em caso de loop para evitar cálculos errados ou estouro de memória. | |
| } | |
| FFT.Windowing(vReal, samples, FFT_WIN_TYP_HAMMING, FFT_FORWARD); /* Dados com devidos pesos (calculados com o tipo hamming) */ | |
| FFT.Compute(vReal, vImag, samples, FFT_FORWARD); /* Cálculo da FFT */ | |
| FFT.ComplexToMagnitude(vReal, vImag, samples); /* Cálculo das magnitudes */ | |
| PrintVector(vReal, samples>>1, SCL_PLOT); | |
| double x = FFT.MajorPeak(vReal, samples, samplingFrequency); | |
| Serial.print(x); | |
| //while(1); /* Roda apenas uma vez */ | |
| delay(2000); /* Repete após um delay de 'x' ms */ | |
| } | |
| void PrintVector(double *vData, uint16_t bufferSize, uint8_t scaleType) | |
| { | |
| for (uint16_t i = 0; i < bufferSize; i++) | |
| { | |
| double abscissa; | |
| /* Mostra o valor da abscissa */ | |
| switch (scaleType) | |
| { | |
| case SCL_INDEX: | |
| abscissa = (i * 1.0); | |
| break; | |
| case SCL_TIME: | |
| abscissa = ((i * 1.0) / samplingFrequency); | |
| break; | |
| case SCL_FREQUENCY: | |
| abscissa = ((i * 1.0 * samplingFrequency) / samples); | |
| break; | |
| } | |
| if(scaleType!=SCL_PLOT) | |
| { | |
| Serial.print(abscissa, 6); | |
| if(scaleType==SCL_FREQUENCY) | |
| Serial.print("Hz"); | |
| Serial.print(" "); | |
| } | |
| Serial.println(vData[i], 4); | |
| } | |
| Serial.println(); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment