// // 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 #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()); } } }