#include <arduinoFFT.h>
const uint16_t samples = 128; //This value MUST ALWAYS be a power of 2
const float samplingFrequency = 4000; //Hz, must be less than 10000 due to ADC
unsigned int sampling_period_us;
unsigned long microseconds;
float vReal[samples];
float vImag[samples];
ArduinoFFT<float> FFT = ArduinoFFT<float>(vReal, vImag, samples, samplingFrequency);
const int micPin = A0;
void setup() {
Serial.begin(115200);
sampling_period_us = round(1000000 * (1.0 / samplingFrequency));
}
void loop() {
// Sample signal
for (int i = 0; i < samples; i++) {
microseconds = micros(); // Overflows after ~70 min
vReal[i] = analogRead(micPin); // Read mic input
vImag[i] = 0;
while (micros() - microseconds < sampling_period_us) {
// wait
}
}
intsimmm(vReal, vImag,samples, samplingFrequency);
// Apply FFT
FFT.windowing(FFTWindow::Hamming, FFTDirection::Forward);
FFT.compute(FFTDirection::Forward);
FFT.complexToMagnitude();
// Find peak
double peak = FFT.majorPeak();
Serial.print("Detected Frequency: ");
Serial.print(peak);
Serial.println(" Hz");
// You can now match the frequency to a guitar string:
identifyNote(peak);
delay(500);
}
void identifyNote(double frequency) {
if (frequency > 75 && frequency < 85) {
Serial.println("Note: E2 (Low E String)");
} else if (frequency > 95 && frequency < 105) {
Serial.println("Note: A2 (A String)");
} else if (frequency > 125 && frequency < 135) {
Serial.println("Note: D3 (D String)");
} else if (frequency > 165 && frequency < 175) {
Serial.println("Note: G3 (G String)");
} else if (frequency > 245 && frequency < 255) {
Serial.println("Note: B3 (B String)");
} else if (frequency > 325 && frequency < 335) {
Serial.println("Note: E4 (High E String)");
} else {
Serial.println("Note: Unknown");
}
}
void intsimmm(float* vReal, float* vImag, int samples, float samplingFrequency) {
float freq = 330.0;
for (int i = 0; i < samples; i++) {
vReal[i] = 512.0 + (511.0 * sin(i * 2.0 * PI * freq / samplingFrequency));
vImag[i]=0.0;
// Serial.println(sample[sampleCnt]);
}
}