#include "fix_fft.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, 4);
char im[128], data[128];
char x = 0, ylim = 60;
int i = 0, val;
float alpha = 0.2; // Low-pass filter coefficient
void setup()
{
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextSize(1);
display.setTextColor(WHITE);
display.clearDisplay();
analogReference(DEFAULT);
}
void loop()
{
int min = 1024, max = 0;
float filteredValue = 0;
for (i = 0; i < 128; i++) // take 128 samples
{
val = 30 * analogRead(A0); // Read LDR sensor on A0
Serial.print("Raw Value: ");
Serial.print(val);
Serial.print("\t");
// Low-pass filter
filteredValue = alpha * val + (1 - alpha) * filteredValue;
Serial.print("Filtered Value: ");
Serial.println(filteredValue);
data[i] = filteredValue / 4 - 128;
im[i] = 0;
if (filteredValue > max)
max = filteredValue; // store max & min sample
if (filteredValue < min)
min = filteredValue;
}
//------------------------------------------
fix_fft(data, im, 7, 0); // FFT on data
//------------------------------------------
display.clearDisplay();
for (i = 1; i < 64; i++) // bar graph sketch on OLED display
{
int dat = sqrt(data[i] * data[i] + im[i] * im[i]);
display.drawLine(i * 2 + x, ylim, i * 2 + x, ylim - dat, WHITE);
}
display.setCursor(0, 0);
display.print(" Spectrum Analyzer");
display.display();
}