2014-07-20 01:08:55 +00:00
/*
Example of use of the FFT libray
2014-07-20 03:43:58 +00:00
Copyright ( C ) 2014 Enrique Condes
2014-07-20 01:08:55 +00:00
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/>.
*/
2014-07-20 03:43:58 +00:00
# include "arduinoFFT.h"
2014-07-20 01:08:55 +00:00
2014-07-20 03:43:58 +00:00
arduinoFFT FFT = arduinoFFT ( ) ; /* Create FFT object */
2014-07-20 01:08:55 +00:00
/*
These values can be changed in order to evaluate the functions
*/
2014-07-20 03:43:58 +00:00
const uint16_t samples = 64 ; //This value MUST ALWAYS be a power of 2
2014-07-20 01:08:55 +00:00
double signalFrequency = 1000 ;
double samplingFrequency = 5000 ;
2014-07-20 03:43:58 +00:00
uint8_t amplitude = 100 ;
2014-07-20 01:08:55 +00:00
/*
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
2014-07-20 03:43:58 +00:00
void setup ( )
{
Serial . begin ( 115200 ) ;
Serial . println ( " Ready " ) ;
2014-07-20 01:08:55 +00:00
}
void loop ( )
{
2014-07-20 03:43:58 +00:00
/* Build raw data */
double cycles = ( ( ( samples - 1 ) * signalFrequency ) / samplingFrequency ) ; //Number of signal cycles that the sampling will read
for ( uint8_t i = 0 ; i < samples ; i + + )
{
vReal [ i ] = uint8_t ( ( amplitude * ( sin ( ( i * ( 6.2831 * cycles ) ) / samples ) ) ) / 2.0 ) ; /* Build data with positive and negative values*/
//vReal[i] = uint8_t((amplitude * (sin((i * (6.2831 * cycles)) / samples) + 1.0)) / 2.0);/* Build data displaced on the Y axis to include only positive values*/
}
Serial . println ( " Data: " ) ;
PrintVector ( vReal , samples , SCL_TIME ) ;
FFT . Windowing ( vReal , 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 */
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 */
2014-07-20 01:08:55 +00:00
}
void PrintVector ( double * vData , uint8_t bufferSize , uint8_t scaleType )
2014-07-20 03:43:58 +00:00
{
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 ) ;
Serial . print ( " " ) ;
Serial . print ( vData [ i ] , 4 ) ;
Serial . println ( ) ;
}
Serial . println ( ) ;
}