Forum: Projekte & Code Goertzel on speed


von Ob S. (Firma: 1984now) (observer)


Angehängte Dateien:

Lesenswert?

Mal wieder etwas Langeweile, deswegen habe ich mich mal daran gemacht,
meine damalige ATtiny85-Lösung
Beitrag "Audio Spektrum Analyzer mit ATtiny85"
für einen PiPico umzusetzen. Natürlich erheblich aufgebohrt, da der Pico
wesentlich mehr Rechenleistung zu bieten hat als der kleine Tiny.
Deswegen brauchte ich auch nicht alle Tricks zu verwenden, die ich
damals beim Tiny angewandt hatte.

Die gesamte Signalverarbeitung läuft jetzt mit 32Bit (in verschiedenen
Festkommaformaten, denn eine FPU hat der PiPico nicht).
Es gibt jetzt statt 10 (bzw. 11) Bins im Oktavabstand 19 im
"Halboktavabstand". Zwischen zwei benachbarten Bins unterscheidet sich
also die Mittenfrequenz nicht mehr um den Faktor 2, sondern um den
Faktor sqrt(2).
Dementsprechend mussten die Halbbandfilter steiler werden und sind jetzt
4.er Ordnung statt 3.er wie beim Original.
Außerdem kann das Teil jetzt Stereo, hat also zwei (identische) Kanäle
zu bieten.
Die Ausgabe erfolgt nicht mehr über ein WS2812-Array, sondern über ein
günstiges ILI9341-SPI-Display (in meinem Fall 3,8") und zwar mit 60Hz
Refresh (statt 16,7Hz im Original). Gleich geblieben ist die
Eigenschaft, dass kein Framebuffer im Controller benötigt wird. Denn
damals wie heute hätte der RAM dafür nicht gereicht.

Die Signalverarbeitung erfordert gut 80% der Rechenleistung eines
PiPico Kerns und läuft deshalb komplett auf Core1.

Die Aufbereitung der Daten für das Display läuft auf Core0 und kann bei
besonders ungünstigen Audiodaten (Extremfall: alle Bins gleichzeitig von
0 auf Max) gelegentlich mal aus der Echtzeit geraten. Macht keinen
Schlimmen, der Code ist darauf vorbereitet. Es wird maximal ein kleiner
Ruckler in den Animationen sichtbar. Die Überlastsituation kann man sich
auf Wunsch mit der LED des Pico anzeigen lassen. Mit realer Musik
angesteuert habe ich sie noch nie aufblitzen sehen.

Das Analog-Frontend ist wieder bewusst primitiv gehalten, Anti-
Aliasfilter gibt's also auch hier wieder nicht. Es ist dafür ausgelegt,
Eingangspegel bis +2dBV brauchbar an die ADC des Pico zu liefern.

Ach so: diesmal gibt's auch Quelltexte. Sind für das offizielle
PiPico-C/C++-SDK geschrieben.

Eine Helper-Anwendung (DotNet4.8.1) zur Herstellung eigener Farbschemata
für die Bins habe ich auch gleich beigelegt. Der Screenshot zeigt das
tatsächlich im Code verwendete Design (presenter.c->barcolors[]). Der
Export-Button legt direkt den C-Quelltext in die Zwischenablage.

Sorry übrigens für die Qualität des Videos und des daraus entnommenen
Screenshot. Die Kamera hatte zwar Makrofunktion, aber erhebliche
Probleme mit der Tiefenschärfe und Farbtreue. Das Displaybild sieht also
in der Realität deutlich besser aus als hier gezeigt.
von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Habe ich das richtig in Erinnerung, dass der Goertzel nur ein 
Amplitudenspektrum liefert, keine Phasen wie die Fourier-Analyse?
https://de.wikipedia.org/wiki/Goertzel-Algorithmus
Normalerweise bracht man die ja nicht, ist also kein Problem.
von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Christoph db1uq K. schrieb:
> Habe ich das richtig in Erinnerung, dass der Goertzel nur ein
> Amplitudenspektrum liefert, keine Phasen wie die Fourier-Analyse?

Nein. Goertzel kann auch Phaseninfos liefern. Wird aber in dieser 
Anwendung nicht benötigt und deshalb werden etwas vereinfachte Goertzels 
verwendet, die halt nur die Amplitdude liefern können.
von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Danke
Der Goertzel wird ja gern als Tondecoder empfohlen, quasi ein NE567 in 
Software.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.