Skip to content

Instantly share code, notes, and snippets.

@Bomfim
Created June 20, 2018 22:24
Show Gist options
  • Select an option

  • Save Bomfim/14477f2672a3705a9265f478b7ac3000 to your computer and use it in GitHub Desktop.

Select an option

Save Bomfim/14477f2672a3705a9265f478b7ac3000 to your computer and use it in GitHub Desktop.
/*
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