Ambilight – Rechenzeit gewinnen durch geschicktes Auswerten
- Ambilight – Selbstbau für 50 euro
- Ambilight – Fragen über Fragen
- Ambilight – Das VGA-Signal
- Ambilight – Schluss mit der grauen Theorie
- Ambilight – Elektronik bauen
- Ambilight – Rechenzeit gewinnen durch geschicktes Auswerten
- Ambilight – Licht an die Wand
- Ambilight – Bestaunen des Meisterwerks
- Ambilight – Zutatenliste
Stellt man sich vor, dass 60 Bilder pro Sekunde übertragen werden und jedes Bild 1080 Zeilen beinhaltet, dann bleiben für eine Zeile knapp 15,4 us übrig. Da ich mein Bild in horizontaler Richtung in 6 Bereiche unterteile, werden daraus ca. 2,5 us für den Abschnitt eines jeden Rechteckes. Ich hätte also nur 2,5 us, um 320 Pixel (1920/6) zu analysieren, indem ich die Werte von deren Farbanteilen einlese, alle aufsummiere und den Mittelwert daraus bestimme. Mit dem Controller, den ich dafür anvisiere (STM32F407) scheint das unmöglich zu sein. Aber zum Glück habe ich mich ja dafür entschieden, diesen Teil der Operationen über den Integrator durchführen zulassen, von dem ich jetzt nur noch alle 2,5 us das Ergebnis über den ADC einlesen muss.
Ich bekomme nun also alle 2,5 us den Mittelwert aus einem dieser 6 Rechtecke für die aktuelle Zeile. Damit ich das Timing einhalte, mache ich nun folgendes: Jedes Mal wenn sich der Beginn einer neuen Zeile durch das entsprechende SYNC-Signal ankündigt, lasse ich darüber einen Interrupt auslösen. Dabei wird ein Timer gestartet, der exakt nach jedem Sechstel einer Zeile überläuft und den ADC triggert, um eine Messung zu starten. Auf diese Weise kann ich den Integratorwert am Endes eines jeden Sechstels auslesen und den Integrator im gleichen Moment zurücksetzen damit er für das nächste Sechstel in seinen Initialzustand versetzt wird. Das heißt, dass ich nach dem Durchlauf einer Zeile insgesamt 6 Mittelwerte für jeden Rot-, Grün- und Blauanteil eines dieser Felder erhalte, in die ich mein Fernsehbild für die Analyse unterteilt habe.
Da mein Bild 1080 Zeilen hat und ich dieses in vertikaler Richtung in 4 Rechtecke unterteilt habe, ergeben sich somit 270 Zeilen in jedem dieser Felder. Das heißt, dass ich nun die eingelesenen Farbanteilsmittelwerte für jedes Feld einer Zeile speichern und mit jeder weiteren Zeile die Werte aus 6 neuen Feldern jeweils noch mit dazu addieren muss. Wenn ich das für 480 gemacht habe und die erhaltenen Summen dann wieder durch 270 teile, ergibt sich ein Mittelwert für alle Farbanteile, der dann nicht mehr nur für eine Zeile eines Rechteckes steht, sondern für ein ganzes Rechteck.
Mein letzter Trick, um im Controller noch etwas Zeit zu gewinnen, ist es, tatsächlich nicht jede dieser 270 Zeilen analysieren zu wollen. Stattdessen mache ich das nur für jede zweite oder dritte Zeile. Da sich in einem normalen Fernsehbild die Farbwerte nicht schlagartig von Zeile zu Zeile verändern, halte ich das für sehr legitim. Somit gewinne ich Zeit zum Addieren und Dividieren (für die Mittelwertberechnung). Ebenso will ich von den 60 Bildern auch nicht jedes sondern nur jedes zweite Bild auswerten, um damit die LEDs mit 30 Hz immernoch flimmerfrei ansteuern zu können. Sämtlicher Rechnerei, die dazu anfällt, erledige ich also immer dann, wenn gerade jedes zweite Bild übertragen wird.
Neueste Kommentare