ArduinoFFT.h generat’s weird results – #5 by wogoos – General Electronics

Hi folks,
I have a question about ArduinoFFT.h. I use it on a perfect sine wave sampled with 32*Fb the base frequency of 60Hz with no DC component and no harmonics. The array vReal[SAMPLES] is loaded with the 32 values, one sine cycle period I have generated in excel. The FFT seems to see a DC component in the Bin0 and harmonic in Bin2. Neither are the amplitudes right. The signal has a peak of 165 and the FFT calculates a peak of 1374 at bin 1 =60Hz and second harmonic at 120Hz at Bin2 with and amplitude of 620?
The same FFT in excel with the same data produces correct results.
Is there a problem with ArduinoFFT.h or am I missing something here. Anyone that give me a helping hand?

#include <Arduino.h>
#include <arduinoFFT.h>
 
#define SAMPLES 32              //Must be a power of 2
#define SAMPLING_FREQUENCY 1920  //Hz, must be less than 10000 due to ADC
 
arduinoFFT FFT = arduinoFFT();
 
unsigned int sampling_period_us;
unsigned long microseconds;
 
double vReal[SAMPLES]={	
0.0000	,
32.1899	,
63.1428	,
91.6691	,
116.6726	,
137.1925	,
152.4401	,
161.8296	,
165.0000	,
161.8296	,
152.4401	,
137.1925	,
116.6726	,
91.6691	,
63.1428	,
32.1899	,
0.0000	,
-32.1899	,
-63.1428	,
-91.6691	,
-116.6726	,
-137.1925	,
-152.4401	,
-161.8296	,
-165.0000	,
-161.8296	,
-152.4401	,
-137.1925	,
-116.6726	,
-91.6691	,
-63.1428	,
-32.1899	
};	



double vImag[SAMPLES];
 
void setup() {
    Serial.begin(115200);
 
    sampling_period_us = round(1000000.0/SAMPLING_FREQUENCY);
}
 
void loop() {
   
    /*SAMPLING*/
    // for(int i=0; i<SAMPLES; i++)
    // {
    //     microseconds = micros();    //Overflows after around 70 minutes!
     
    //     vReal[i] = analogRead(A0);
    //     vReal[i] -= 511;
    //     vImag[i] = 0;
     
    //     while(micros() < (microseconds + sampling_period_us)){
    //     }
    // }
 
    for (int i=0; i<SAMPLES;i++) { Serial.print(vReal[i], 1); Serial.print("n"); }  
    Serial.print("n");

    /*FFT*/
    FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
    FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD);
    FFT.ComplexToMagnitude(vReal, vImag, SAMPLES);
    double peak = FFT.MajorPeak(vReal, SAMPLES, SAMPLING_FREQUENCY);
 
    /*PRINT RESULTS*/
    Serial.println(peak);   Serial.println("n");  //Print out what frequency is the most dominant.
 
    for(int i=0; i<(SAMPLES/2); i++)
    {
        /*View all these three lines in serial terminal to see which frequencies has which amplitudes*/
         
        //Serial.print((i * 1.0 * SAMPLING_FREQUENCY) / SAMPLES, 1);
        //Serial.print(" ");
        Serial.println(vReal[i], 1);    //View only this line in serial plotter to visualize the bins
    }
 
    //delay(1000);  //Repeat the process every second OR:
    while(1);       //Run code once
}

Spectrum

Read more here: Source link