|
|
|
//
|
|
|
|
// TestFFT1024.ino Bob Larkin W7PUA
|
|
|
|
// Started from PJRC Teensy Examples/Audio/Analysis/FFT
|
|
|
|
//
|
|
|
|
// Compute a 1024 point Fast Fourier Transform (spectrum analysis)
|
|
|
|
// on audio connected to the Left Line-In pin. By changing code,
|
|
|
|
// a synthetic sine wave can be input instead.
|
|
|
|
//
|
|
|
|
// The power output from 512 frequency analysis bins are printed to
|
|
|
|
// the Arduino Serial Monitor. The format is selectable.
|
|
|
|
// Output power averaging is an option
|
|
|
|
//
|
|
|
|
// T4.0: Uses 7.8% processor and 9 F32 memory blocks, both max.
|
|
|
|
//
|
|
|
|
// This example code is in the public domain.
|
|
|
|
|
|
|
|
#include <Audio.h>
|
|
|
|
#include "OpenAudio_ArduinoLibrary.h"
|
|
|
|
|
|
|
|
// Create the Audio components. These should be created in the
|
|
|
|
// order data flows, inputs/sources -> processing -> outputs
|
|
|
|
//
|
|
|
|
// AudioInputI2S_F32 audioInput; // audio shield: mic or line-in
|
|
|
|
AudioSynthSineCosine_F32 sinewave;
|
|
|
|
AudioAnalyzeFFT1024_F32 myFFT;
|
|
|
|
AudioOutputI2S_F32 audioOutput; // audio shield: headphones & line-out NU
|
|
|
|
// Connect either the live input or synthesized sine wave
|
|
|
|
// AudioConnection_F32 patchCord1(audioInput, 0, myFFT, 0);
|
|
|
|
AudioConnection_F32 patchCord1(sinewave, 0, myFFT, 0);
|
|
|
|
AudioControlSGTL5000 audioShield;
|
|
|
|
|
|
|
|
float saveDat[512];
|
|
|
|
|
|
|
|
void setup() {
|
|
|
|
Serial.begin(300); // Any speed works
|
|
|
|
delay(1000);
|
|
|
|
|
|
|
|
AudioMemory_F32(50);
|
|
|
|
|
|
|
|
// Enable the audio shield and set the output volume.
|
|
|
|
audioShield.enable();
|
|
|
|
audioShield.inputSelect(AUDIO_INPUT_LINEIN);
|
|
|
|
|
|
|
|
// Create a synthetic sine wave, for testing
|
|
|
|
// To use this, edit the connections above
|
|
|
|
// sinewave.frequency(1033.99f); // Bin 24 T3.x
|
|
|
|
// sinewave.frequency(1033.59375f); // Bin 24 T4.x at 44100
|
|
|
|
// sinewave.frequency(1055.0f); // Bin 24.5, demonstrates windowing
|
|
|
|
// Or some random frequency:
|
|
|
|
sinewave.frequency(1234.5f);
|
|
|
|
|
|
|
|
sinewave.amplitude(1.0f);
|
|
|
|
|
|
|
|
// Set windowing function
|
|
|
|
// myFFT.windowFunction(AudioWindowNone);
|
|
|
|
// myFFT.windowFunction(AudioWindowHanning1024); // default
|
|
|
|
// The next Kaiser window needs a dB peak sidelobe number
|
|
|
|
// myFFT.windowFunction(AudioWindowKaiser1024, 70.0f);
|
|
|
|
myFFT.windowFunction(AudioWindowBlackmanHarris1024);
|
|
|
|
|
|
|
|
// To print the window function:
|
|
|
|
// float* pw=myFFT.getWindow();
|
|
|
|
// for(int jj=0; jj<1024; jj++)
|
|
|
|
// Serial.println(*pw++, 6);
|
|
|
|
|
|
|
|
myFFT.setNAverage(1);
|
|
|
|
|
|
|
|
myFFT.setOutputType(FFT_DBFS); // FFT_RMS or FFT_POWER or FFT_DBFS
|
|
|
|
|
|
|
|
Serial.println("1024 point real FFT output in dB relative to full scale sine wave");
|
|
|
|
}
|
|
|
|
|
|
|
|
void loop() {
|
|
|
|
static uint32_t nTimes = 0;
|
|
|
|
if ( myFFT.available() ) {
|
|
|
|
// each time new FFT data is available
|
|
|
|
// print it all to the Arduino Serial Monitor
|
|
|
|
float* pin = myFFT.getData();
|
|
|
|
for (int kk=0; kk<512; kk++)
|
|
|
|
saveDat[kk]= *(pin + kk);
|
|
|
|
if(++nTimes>4 && nTimes<6) {
|
|
|
|
for (int i=0; i<512; i++) {
|
|
|
|
Serial.print(i);
|
|
|
|
Serial.print(", ");
|
|
|
|
Serial.println(saveDat[i], 8);
|
|
|
|
}
|
|
|
|
Serial.println();
|
|
|
|
Serial.print("CPU: Max Percent Usage: ");
|
|
|
|
Serial.println(AudioProcessorUsageMax());
|
|
|
|
Serial.print(" Max Float 32 Memory: ");
|
|
|
|
Serial.println(AudioMemoryUsageMax_F32());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|