Spektrumanalysator

ich glaube, es fehlt da noch die Zuordnung der Frequenzen der jeweiligen Streifen, wiel die Amplituden wissen nicht was sie ansteuern sollen. hier ist der Code:
#include <Adafruit_NeoPixel.h>
#include "arduinoFFT.h"

const uint16_t samples = 1024; // Dieser Wert MUSS IMMER eine Zweierpotenz sein
const double samplingFrequency = 44100;

double vReal[samples];
double vImag[samples];

ArduinoFFT FFT = ArduinoFFT(vReal, vImag, samples, samplingFrequency);

#define LED_PIN 2 // Pin, an dem die WS2812-LED-Streifen angeschlossen sind
#define LED_COUNT 8 // Anzahl der LEDs pro Streifen
#define NUM_STRIPS 12 // Anzahl der WS2812-Streifen

Adafruit_NeoPixel strips[NUM_STRIPS] = { Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800) };

void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("Bereit");

for (int i = 0; i < NUM_STRIPS; i++) {
strips[i].begin();
strips[i].show(); // Alle LEDs initialisieren
}
}

void loop() {
for (uint16_t i = 0; i < samples; i++)
{
vReal[i] = analogRead(A0); // Das analoge Eingangssignal erfassen
vImag[i] = 0.0; // Die imaginäre Komponente muss null sein
delayMicroseconds(100); // Etwas Zeit zwischen den Proben für die Analog-Digital-Wandlung
}

FFT.windowing(FFTWindow::Hamming, FFTDirection::Forward); // Daten mit Hamming-Fenster gewichten
FFT.compute(FFTDirection::Forward); // Durch FFT führen
FFT.complexToMagnitude(); // Die Magnituden berechnen

// Die berechneten Frequenzen und Amplituden an den ser. Monitor senden
Serial.println("Berechnete Frequenzen und Amplituden:");
for (int i = 0; i < (samples >> 1); i++) {
double freq = (i * 1.0 * samplingFrequency) / samples;
double amplitude = vReal[i];
Serial.print("Frequenz: ");
Serial.print(freq, 2);
Serial.print(" Hz, Amplitude: ");
Serial.println(amplitude, 2);
}
Serial.println();

// Skalierung der Amplituden auf den Bereich 0-255
byte normalizedAmplitudes[NUM_STRIPS];
double maxAmplitude = 0.0;

// Die maximale Amplitude bestimmen
for (int i = 0; i < (samples >> 1); i++) {
if (vReal[i] > maxAmplitude) {
maxAmplitude = vReal[i];
}
}

// Skalierung der Amplituden auf den Bereich 0-255 für die Helligkeit der LEDs
for (int i = 0; i < NUM_STRIPS; i++) {
// Beispielhafte lineare Skalierung
normalizedAmplitudes[i] = map(vReal[i], 0, maxAmplitude, 0, 255);
}

// Steuerung der LEDs basierend auf den berechneten Amplituden
for (int i = 0; i < NUM_STRIPS; i++) {
for (int j = 0; j < LED_COUNT; j++) {
// Annahme: Die Helligkeit der LED wird durch die skalierte Amplitude festgelegt
// und die Farbe kann je nach Anwendung angepasst werden
strips[i].setPixelColor(j, normalizedAmplitudes[i], 0, 0); // Rote LEDs als Beispiel
}
strips[i].show();
}

// Die berechneten Amplituden im ser. Monitor zeigen
Serial.println("Berechnete Amplituden:");
for (int i = 0; i < NUM_STRIPS; i++) {
Serial.print(normalizedAmplitudes[i]);
Serial.print(" ");
}
Serial.println();
}
und ein Auszug vom ser. Monitor:
Frequenz: 18217.09 Hz, Amplitude: 15.23
Frequenz: 18260.16 Hz, Amplitude: 37.55
Frequenz: 18303.22 Hz, Amplitude: 54.50
Frequenz: 18346.29 Hz, Amplitude: 45.92
Frequenz: 18389.36 Hz, Amplitude: 78.46
Frequenz: 18432.42 Hz, Amplitude: 137.35
Frequenz: 18475.49 Hz, Amplitude: 57.04
Frequenz: 18518.55 Hz, Amplitude: 52.96
Frequenz: 18561.62 Hz, Amplitude: 32.56
Frequenz: 18604.69 Hz, Amplitude: 14.82
Frequenz: 18647.75 Hz, Amplitude: 74.27
Frequenz: 18690.82 Hz, Amplitude: 44.28
Frequenz: 18733.89 Hz, Amplitude: 73.19