/*
https://www.google.com/search?q=arduino+nano+I2S+++Output+Digital+Microphone+measure+frequency&sca_esv=70aa846ced6b4820&rlz=1C1ASUM_enUS1027US1027&sxsrf=ANbL-n7WsqdXQiQSylbksbu4Jaj-l4MmEA%3A1780421141372&ei=FRIfaoOwFoyymtkP3OK70QM&biw=1367&bih=1071&ved=0ahUKEwjDjrrNiemUAxUMmSYFHVzxLjoQ4dUDCBA&uact=5&oq=arduino+nano+I2S+++Output+Digital+Microphone+measure+frequency&gs_lp=Egxnd3Mtd2l6LXNlcnAiPmFyZHVpbm8gbmFubyBJMlMgICBPdXRwdXQgRGlnaXRhbCBNaWNyb3Bob25lIG1lYXN1cmUgZnJlcXVlbmN5SJsmUNcGWJkhcAF4AZABAJgBZaAB5wGqAQMyLjG4AQPIAQD4AQL4AQGYAgGgAgLCAgoQABhHGNYEGLADmAMAiAYBkAYCkgcBMaAHiAKyBwC4BwDCBwMwLjHIBwGACAE&sclient=gws-wiz-serp
*/
#include <I2S.h>
#include <arduinoFFT.h>
// I2S Configuration
const int sampleRate = 16000;
const int fftSamples = 256; // Must be a power of 2
double vReal[fftSamples];
double vImag[fftSamples];
ArduinoFFT<double> FFT = ArduinoFFT<double>(vReal, vImag, sampleRate, double(sampleRate));
void setup() {
Serial.begin(115200);
// Start I2S
if (!I2S.begin(I2S_PHILIPS_MODE, sampleRate, 32)) {
Serial.println("Failed to initialize I2S!");
while (1);
}
}
void loop() {
// 1. Read audio samples from I2S mic
for (int i = 0; i < fftSamples; i++) {
int32_t sample = I2S.read() >> 16; // Shift to 16-bit
vReal[i] = (double)sample;
vImag[i] = 0;
}
// 2. Perform FFT
FFT.windowing(FFTWindow::Hamming, FFTDirection::Forward);
FFT.compute(FFTDirection::Forward);
FFT.complexToMagnitude();
// 3. Find the peak frequency
double peakFrequency = FFT.majorPeak();
Serial.print("Peak Frequency: ");
Serial.print(peakFrequency);
Serial.println(" Hz");
}