Ich will ein Tool programmieren, was per DMX MovingHeads in Abhängigkeit vom aktuellen Umgebungs-Sound steuert - so eine Art moderne Lichtorgel. Was ich bereits habe und was funktioniert sind Programm-Fragmente für: - Soundgrabbing (liefert eine festgelegte Anzahl von Samples in einem Array) - DMX-Ausgabe Zur Trennung der Spektralanteile (und deren Verteilung auf die DMX-Kanäle) möchte ich FFT verwenden, dazu habe ich ein Beispielprogramm mit einer entsprechenden Funktion. Leider blicke ich bei deren Nutzung nicht ganz durch, zumal der Beispielcode nur mit einer Listenausgabe daher kommt. Als Übergabeparameter bekommt diese Funktion ein Array mit komplexen Zahlen, die vorher aus meinem Array mit den Sampling-Daten erzeugt werden (z.B. 1024 Werte). Zurück bekomme ich ein gleich großes Array voller komplexer Zahlen ... und nun? Wie bekomme ich daraus die spektralen Anteile? Ist so verdammt lang her ...
1 | dim N,k as integer //Anzahl der Eingangs-Werte |
2 | dim x() as Double //Array für Eingangswerte real |
3 | dim c() as Complex //Array für Eingangswerte komplex |
4 | |
5 | N=1023 |
6 | |
7 | for k = 0 to N |
8 | x.Append sin(k/10) + 0.5 * sin(k/3) 'Erzeugen von Beispiel-Eingangswerten mit zwei Sinus-Funktionen |
9 | next |
10 | |
11 | for k = 0 to N |
12 | c.append new Complex(x(k),0) // Complex with real part = x(k) and imaginary part = 0 |
13 | next |
14 | |
15 | // Calculate FFT |
16 | dim C_() as Complex = fft(c) |
17 | |
18 | // Extract magnitudes |
19 | dim m() as double |
20 | |
21 | for k = 0 to N |
22 | m.Append C_(k).Abs |
23 | next |
24 | |
25 | for k=0 to N //Ausgabe der Ergebnisse in eine Tabelle |
26 | list.addrow str(k) //Zeilennummer |
27 | list.cell(k,1)=str(sin(k/10) + 0.5 * sin(k/3)) //EIngangswerte |
28 | list.cell(k,2)=str(c_(k)) //Resultat komplex |
29 | list.cell(k,3)=str(m(k)) //Resultat real |
30 | next |
(ist RealBasic/Xojo)