#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
#include <math.h>
AudioInputI2S i2sIn;
AudioAnalyzeFFT4096 fft4096_1; //xy=920,302
AudioSynthNoiseWhite noise1;
AudioOutputI2S i2sOut;
AudioConnection patchCord0(i2sIn, 1, fft4096_1, 0);
AudioConnection patchCord1(noise1, 0, i2sOut, 0);
AudioConnection patchCord2(noise1, 0, i2sOut, 1);
AudioControlSGTL5000 codec;
int16_t k = 0;
long serial_input_number; // Used to build number from serial stream
short num ;
char incoming_char;
int NfftPts = 4096;
int nloops = 0;
int nbands = 31;
float averagelevel[2048];//[512];
float magsum[2048];
float binfc[2048];//[512];
float level[2048];//[512];
const double Pi = 3.14159265;
void setup(void) {
Serial.begin(57600);
AudioMemory(160);
codec.enable();
codec.volume(0.8); //
codec.inputSelect(AUDIO_INPUT_LINEIN);
codec.lineInLevel(0);
codec.lineOutLevel(13);
noise1.amplitude(0.5);
fft4096_1.windowFunction(AudioWindowHanning4096);
serial_input_number = 0;
}
void loop(void) {
if (Serial.available() > 0) {
incoming_char = Serial.read();
switch (incoming_char) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
serial_input_number = serial_input_number * 10 + (incoming_char - '0');
break;
case 'A':
num = (int)serial_input_number;
serial_input_number = 0;
break;
case 'B':
num = (int)serial_input_number;
serial_input_number = 0;
break;
case 'F':
num = (int)serial_input_number;
nloops = num;
fft(NfftPts, nloops);
Serial.println("Done");
serial_input_number = 0;
break;
case 'G':
num = (int)serial_input_number;
serial_input_number = 0;
break;
case 'H':
serial_input_number = 0;
break;
case 'I':
serial_input_number = 0;
break;
case 'J':
serial_input_number = 0;
break;
case 'K':
serial_input_number = 0;
break;
case 'L': //input and output filters
num = (int)serial_input_number;
serial_input_number = 0;
break;
case 'M':
num = (int)serial_input_number;
serial_input_number = 0;
break;
case 'N':
serial_input_number = 0;
break;
case 'O': //input and output filters
num = (int)serial_input_number;
serial_input_number = 0;
break;
case 'P':
serial_input_number = 0;
break;
case 'R':
serial_input_number = 0;
break;
case 'S':
num = (int)serial_input_number;
serial_input_number = 0;
break;
case 'T':
num = (int)serial_input_number;
serial_input_number = 0;
break;
case 'W': //Read RH part of bridge
num = (int)serial_input_number;
serial_input_number = 0;
break;
case 'X': //Read RH part of bridge
num = (int)serial_input_number;
serial_input_number = 0;
break;
case 'Y': //send data to PC
num = (int)serial_input_number;
for (int i = 0; i < NfftPts / 2; i++) {
if (num == 10) Serial.println(level[i]); //fft
if (num == 20) Serial.println(binfc[i]); //bin frequency
if (num == 30) Serial.println(averagelevel[i]); //response value either measured or ocrrected
}
serial_input_number = 0;
break;
case 'Z': //Read RH part of bridge
num = (int)serial_input_number;
serial_input_number = 0;
break;
}
}
}
void fft(int npts, int loops ) {
for (int k = 0; k < npts / 2; k++) {
magsum[k] = 0;
averagelevel[k] = 0;
binfc[k] = (float)k * 44100 / npts;
}
binfc[0] = 1;
fftstart:
if (fft4096_1.available()) {
delay(100);
for (int j = 0; j < loops; j++) {//-fft()
delay(100);
for (int i = 0; i < npts / 2; i++) {
level[i] = 0;
level[i] = fft4096_1.read(i); //
level[i] = 1.63 * level[i]; //Hanning Scaling
if (level[i] < 1E-6) level[i] = 1E-6;
}
for (int m = 0; m < npts / 2; m++) {
averagelevel[m] = averagelevel[m] + (0.1 * sq(level[m])); //dt*p^2
}
}
for (int k = 0; k < npts / 2; k++) {
averagelevel[k] = averagelevel[k] / (loops * 0.1) ;
averagelevel[k] = 10 * log10(averagelevel[k]);
}
}
else {
goto fftstart;
}
}