Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Weird results while imag input other than 0 at example FFT_1 #79

Open
hippoo0 opened this issue Mar 12, 2023 · 2 comments
Open

Weird results while imag input other than 0 at example FFT_1 #79

hippoo0 opened this issue Mar 12, 2023 · 2 comments

Comments

@hippoo0
Copy link

hippoo0 commented Mar 12, 2023

Hi,
I'm running the example FFT_1 on an Arduino Due. It works like expected.
Then I changed the input vector vImag[] from [0,0,...0] to a cosine wave with same amplitude and frequency as the vReal[] vector. That is a quadrature signal with 90 degrees phase difference.
I expect the same sharp peaks in the spectrum at f and fS-f as with a real only input signal. Only the sign of the peaks is different, depending if the phase lag is +90 or -90 degrees. But instead, the arduinoFFT() produces a weird result: The peaks at f an fS-f are wrong, and there is much noise in the whole spectrum.

Anyone else who detected this issue?

BR, hippoo0

@hippoo0
Copy link
Author

hippoo0 commented Mar 17, 2023

/*

Example of use of the FFT library
    Copyright (C) 2014 Enrique Condes

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

*/

/*
In this example, the Arduino simulates the sampling of a sinusoidal 1000 Hz
signal with an amplitude of 100, sampled at 5000 Hz. Samples are stored
inside the vReal array. The samples are windowed according to Hamming
function. The FFT is computed using the windowed samples. Then the magnitudes
of each of the frequencies that compose the signal are calculated. Finally,
the frequency with the highest peak is obtained, being that the main frequency
present in the signal.
*/

#include "arduinoFFT.h"

arduinoFFT FFT = arduinoFFT(); /* Create FFT object /
/

These values can be changed in order to evaluate the functions
/
const uint16_t samples = 64; //This value MUST ALWAYS be a power of 2
const double signalFrequency = 1000;
const double samplingFrequency = 5000;
const uint8_t amplitude = 100;
/

These are the input and output vectors
Input vectors receive computed results from 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(115200);
while(!Serial);
Serial.println("Ready");
}

void loop()
{
/* Build raw data /
double cycles = (((samples-1) * signalFrequency) / samplingFrequency); //Number of signal cycles that the sampling will read
for (uint16_t i = 0; i < samples; i++)
{
vReal[i] = int8_t((amplitude * (sin((i * (twoPi * cycles)) / samples))) / 2.0);/
Build data with positive and negative values*/
//vReal[i] = uint8_t((amplitude * (sin((i * (twoPi * cycles)) / samples) + 1.0)) / 2.0);/* Build data displaced on the Y axis to include only positive values*/
// vImag[i] = 0.0; //Imaginary part must be zeroed in case of looping to avoid wrong calculations and overflows
vImag[i] = int8_t((amplitude * (-cos((i * (twoPi * cycles)) / samples))) / 2.0);/* Build data with positive and negative values*/
}
/* Print the results of the simulated sampling according to time /
Serial.println("Data:");
PrintVector(vReal, samples, SCL_TIME);
FFT.Windowing(vReal, samples, FFT_WIN_TYP_HAMMING, FFT_FORWARD); /
Weigh data /
FFT.Windowing(vImag, samples, FFT_WIN_TYP_HAMMING, FFT_FORWARD); /
Weigh data /
// Serial.println("Weighed data:");
// PrintVector(vReal, samples, SCL_TIME);
FFT.Compute(vReal, vImag, samples, FFT_FORWARD); /
Compute FFT /
Serial.println("Computed Real values:");
PrintVector(vReal, samples, SCL_INDEX);
Serial.println("Computed Imaginary values:");
PrintVector(vImag, samples, SCL_INDEX);
// FFT.ComplexToMagnitude(vReal, vImag, samples); /
Compute magnitudes /
// Serial.println("Computed magnitudes:");
// PrintVector(vReal, (samples >> 1), SCL_FREQUENCY);
// double x = FFT.MajorPeak(vReal, samples, samplingFrequency);
// Serial.println(x, 6);
while(1); /
Run Once /
// delay(2000); /
Repeat after delay */
}

void PrintVector(double vData, uint16_t bufferSize, uint8_t scaleType)
{
for (uint16_t i = 0; i < bufferSize; i++)
{
double abscissa;
/
Print abscissa value */
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;
}
Serial.print(abscissa, 6);
if(scaleType==SCL_FREQUENCY)
Serial.print("Hz");
Serial.print(" ");
Serial.println(vData[i], 4);
}
Serial.println();
}

@hippoo0
Copy link
Author

hippoo0 commented Mar 23, 2023

Nobody?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant