Old Fidelity - HiFi Klassiker Forum

Normale Version: Digitales VU-Meter (Mikrocontroller, Display, LED) reVox A700
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.

gogosch

Typ "double" ist rechnerisch notwendig, da z.B. die Sinusfunktion dezimale Werte zw. -1 und +1 liefert die konvertiert zu "short" immer 0 oder +-1 liefern würden.
Die Ausgabe meines Codeschnipsels liefert ebenda solche dezimalen Werte zw. -1 und +1 (xRotated, yRotated), die noch auf das Grid des Displays mit entsprechendem Faktor (z.B. 100) skaliert werden müssen. Das Wertepaar 0, 0 sollte dann idealerweise genau in der Mitte des anzuzeigenden Feldes (z.B. x = 120, y = 160) liegen. 
Beispiel: uint xKoordinate = 120 + 120 * xRotated; uint yKoordinate = 120 + 120 * yRotated; 
Die Bézier-Kurve kann nun entweder als Punkt (mit "point") oder als Linie (mit "line") der verbundenen Punkte dargestellt werden.

gogosch

Entweder sind die Samples "Müll" oder der Audio-Kanal des AudioShields ist massiv übersteuert.

gogosch

Ich vermute die, Samples sind in den Queues nicht ganz synchron. Werde heute nachmittag testen. Bei einem Sinus-Mono sollte die Differenz der Samples (L-R) 0 ergeben. Wenn dem nicht so ist , .........
(11.09.2020, 09:43)DIYLAB schrieb: [ -> ]
(11.09.2020, 09:07)gogosch schrieb: [ -> ]Ich vermute die, Samples sind in den Queues nicht ganz synchron.

Auch das schrieb ich schon  Lol1 .
Liest eigentlich Jemand meine Beiträge? 
Nichts für ungut  Drinks

Ja, ich, auch wenn ich nix verstehe . . .  Thumbsup
(11.09.2020, 08:43)DIYLAB schrieb: [ -> ]Auch das sagte ich schon - die Samples sind MÜLL!
Irgendwelche Ideen?

Lass es weg, es muss ja nicht zwingend alles was grundsätzlich möglich ist auch implementiert werden.
Vor allem, wer braucht das letztlich um seine BM ordentlich auszusteuern.

gogosch

Sodale. Funzt.
Funktioniert soweit bis auf die Skalierung. Mono: 0° Strich, Mono Links: -45° Strich, Mono Rechts: 45° Strich. Das Audio-Signal darf nicht zu stark sein.

[Bild: 2020-09-11-17-26-29.jpg]

gogosch

Die Punkte muss man nur chronologisch  verbinden, dann ergibt sich die Kurve von selbst. 
PS: Die Samples stimmen exakt. Kann auch mehr Buffer verwenden. War nur ein Test um Speicherprobleme auszuschließen.

gogosch

(11.09.2020, 19:06)DIYLAB schrieb: [ -> ]
(11.09.2020, 19:04)gogosch schrieb: [ -> ]Die Punkte muss man nur verbinden.....

Der war gut  Thumbsup .
Ist das Dein Ernst?

Na, Kurven lassen sich nicht zeichnen und bestehen immer aus geraden Teilstücken.
Ich bin raus.
Hallo Freunde.

AtGogosch und Bruno,

leider hatte ich heute beruflich bedingt bis jetzt keine Zeit in das Projekt zu schauen. Morgen sieht das zeitlich besser aus.

ABER... das Projekt hat sich bis auf dieses Problemchen bestens entwickelt. Da werden wir doch kurz vor dem Ziel nicht aufgeben und alles vor die Wand fahren. Dash1  Lasst uns alle mal runterfahren, Abstand nehmen und neu nachdenken. Die Lösung wird sich schon finden lassen. Wenn es eine nicht funktionierende Hardware wäre, würde ich sie aus dem Fenster schmeißen und danach wieder rein holen und erneut testen. Das hat tatsächlich schon zweimal in meinem Entwicklerleben funktioniert. Der Fehler wurde allerdings nie lokalisiert, weil danach alles problemlos funktionierte.  Thumbsup 

Hat mir doch keine Ruhe gelassen. Habe den Bruno-Code aus #693 auf den Teensy übertragen.

Als erstes fällt das Gesprattel im Leerlauf (kein Audiosignal anliegend) auf. Das könnte wieder das gleiche Problem sein, das auch in der Korrelationsanzeige war und mit der Hysterese behoben wurde. Das ist aber z.Z. wohl das kleinste Problem.

Zweitens habe ich einmal ein nicht so lautes Signal eingespeist. Was dabei herauskommt, ist zumindest eine Anzeige, die aber noch nicht unseren Vorstellungen entspricht. Aber, das Problem lösen wir. Wäre doch gelacht.

Gute N8 zusammen



Moin zusammen,

Zunächst einmal sollte man nicht Nachts etwas machen, wenn man zu müde ist. Ich bin leider mit viel zu hohem Studiopegel an den Teensy gegangen, weshalb der Audiostream übersteuert war.

Heute morgen ist mir das durch den Kopf geschossen und ich bin einmal auf -20dB Pegel gegangen. Siehe da, das Gonio funktioniert einwandfrei, bis auf die saubere Bezierdarstellung.

Wollte ich nur schnell mitteilen. Werde jetzt erst einmal frühstücken. Danach mache ich noch ein Foto.

Ich habe auch mehr in C programmiert. C++ ist auch nicht so mein Spezialgebiet. Montag beginnt wieder das Wintersemester und da werde ich mich mal bei einigen Studies umhören, die professionell programmieren. Vielleicht finde ich da einen für die notwendige Lösung.

Bis später.
Grüße, Jürgen
Hallo Bruno,

könnte das ein Ansatz fürs weiterkommen sein:

https://xoax.net/cpp/ref/gdi_plus/incl/bezier/

Dieser Link könnte auch interessant sein. Eine Bibliothek der versch. Audio-Testsysteme:

https://github.com/x42/meters.lv2

Gruß, Jürgen

gogosch


Code im Post #694

Kann mit folgenden YT-Video getestet werden: 



Für mich ist der Drops gelutscht!
Hi Gogosch,

Habe deinen Code gerade auf den Teensy geladen. Funktioniert mit angepasstem Pegel einwandfrei. Müsste nur noch von Bruno integriert und skaliert werden. Dann wären wir in der Tat mit dem Projekt durch.

Habe ein Stereosignal im Beispielvideo eingespielt. Dann einmal das Panorama nach Links und nach Rechts gedreht, auf Mono geschaltet und zum Schluß die Phase gedreht. Lediglich links und rechts sind falsch rum. PAN-Pot auf links, dann geht Gonio nach Rechts und umgekehrt. Ansonsten sieht alles perfekt aus.

Aus meiner Sicht wüsste ich jetzt nichts, was gegen eine Codeimplementierung sprechen sollte. Mehr Aufwand scheint mir nicht notwendig.

Beste Grüße
Jürgen

DIYLAB

(12.09.2020, 21:36)bornemju schrieb: [ -> ]Lediglich links und rechts sind falsch rum.

Moin,

hier mein Stand von heute.
Da ist es andersrum.
Ich tue mich aber schwer damit, die Punkte einfach zu verbinden, das ist mir teilweise zu zackig und man sieht immer die langen Linien, z.B. beim Kreis (ich meine bei Test mit dem Pilzvideo  LOL ).
Also habe ich es erst mal bei der Pixelwolke belassen, sieht auch ganz nett aus beim Pilz-Testvideo aus Beitrag #705.
Mal gucken, ob Spline noch implementierbar wäre.

Gute N8

Code:
#include <Wire.h>
#include "SPI.h"
#include <Audio.h>
#include <ILI9341_t3n.h>

short samplesLeft[1024] = { 0 };
short samplesRight[1024] = { 0 };

const float sin45 = 0.7071067812;
const float cos45 = 0.7071067812;
const float sqr2 = 1.414213562;

float xL, xR, xNorm;
float yL, yR, yNorm;
float normL, normR;

ILI9341_t3n tft = ILI9341_t3n(10, 9, -1);

// GUItool: begin automatically generated code
AudioInputI2S            i2s1;           //xy=414,328
AudioRecordQueue         queue2;         //xy=610,376
AudioOutputI2S           i2s2;           //xy=611,328
AudioRecordQueue         queue1;         //xy=612,280
AudioConnection          patchCord1(i2s1, 0, i2s2, 0);
AudioConnection          patchCord2(i2s1, 0, queue1, 0);
AudioConnection          patchCord3(i2s1, 1, i2s2, 1);
AudioConnection          patchCord4(i2s1, 1, queue2, 0);
AudioControlSGTL5000     sgtl5000_1;     //xy=275,329
// GUItool: end automatically generated code

void setup() {
    // Audio
    AudioMemory(1024);
    sgtl5000_1.enable();
    sgtl5000_1.inputSelect(AUDIO_INPUT_LINEIN);
    sgtl5000_1.volume(.5);
    sgtl5000_1.lineInLevel(4); // Level can be 0 to 15 (5 is the Teensy Audio Library's default).
    queue1.begin();
    queue2.begin();

    // Display
    tft.begin(50000000);
    tft.setRotation(2);
    tft.fillScreen(ILI9341_BLACK);
}

void loop() {
    if (queue1.available() >= 8 && queue2.available() >= 8) {
        for (byte i = 0; i < 8; i++) {
            memcpy(&samplesLeft[128 * i], queue1.readBuffer(), 256);
            queue1.freeBuffer();
            memcpy(&samplesRight[128 * i], queue2.readBuffer(), 256);
            queue2.freeBuffer();
        }
    }

    drawGonio();
}

void drawGonio() {
    uint16_t matrix[76800] = { 0 };

    // Cross
    for (byte i = 10; i < 230; i++) {
        matrix[i + 160 * 240] = 0x4208;
    }
    for (uint16_t i = 10; i < 310; i++) {
        matrix[120 + i * 240] = 0x4208;
    }

    // Gonio
    for (uint16_t i = 0; i < 1024; i++) {
        normL = (samplesLeft[i] / 32767.) * 2.;
        xL = normL * cos45;
        yL = normL * sin45;

        normR = (samplesRight[i] / 32767.) * 2.;
        xR = normR * cos45;
        yR = normR * sin45;

        xL *= cos45;
        yL *= sin45;
        xR *= cos45;
        yR *= sin45;

        xNorm = (xR - xL) / sqr2;
        yNorm = (yR + yL) / sqr2;

        int16_t x = 120. + (xNorm * 120.);
        int16_t y = 160. - (yNorm * 120.);
        uint32_t mVector = x + y * 240;
        if (mVector <= 76800) matrix[mVector] = 0x05FF;
    }

    tft.writeRect(0, 0, 240, 320, matrix);
}

Frage an die C-Experten:
Man kann doch sicher diese beiden Schleifen in C++ auch vereinfachen, also das Ganze ohne Schleife realisieren (matrix ist ein Array)?

Code:
   // Cross
    for (byte i = 10; i < 230; i++) {
        matrix[i + 160 * 240] = 0x4208;
    }
    for (uint16_t i = 10; i < 310; i++) {
        matrix[120 + i * 240] = 0x4208;
    }

gogosch

(12.09.2020, 21:36)bornemju schrieb: [ -> ]Hi Gogosch,

Habe deinen Code gerade auf den Teensy geladen. Funktioniert mit angepasstem Pegel einwandfrei. Müsste nur noch von Bruno integriert und skaliert werden. Dann wären wir in der Tat mit dem Projekt durch.

Habe ein Stereosignal im Beispielvideo eingespielt. Dann einmal das Panorama nach Links und nach Rechts gedreht, auf Mono geschaltet und zum Schluß die Phase gedreht. Lediglich links und rechts sind falsch rum. PAN-Pot auf links, dann geht Gonio nach Rechts und umgekehrt. Ansonsten sieht alles perfekt aus.

Aus meiner Sicht wüsste ich jetzt nichts, was gegen eine Codeimplementierung sprechen sollte. Mehr Aufwand scheint mir nicht notwendig.

Beste Grüße
Jürgen


L/R vertauscht: einfach tft.SetRotation(2) auf tft.SetRotation(0) ändern. Manche Displays (so wie meines) sind um 180° gedreht. Hab den Sketch im Post 694 aktualisiert.
edit: 11:00 optionale Normalisierung auf gesamte Azeigefläche hinzugefügt.
Edit: Kanäle korrigiert.
(12.09.2020, 23:25)DIYLAB schrieb: [ -> ]
(12.09.2020, 21:36)bornemju schrieb: [ -> ]Lediglich links und rechts sind falsch rum.

Moin,

hier mein Stand von heute.

Moin Bruno,

ich habe soeben deine aktuelle Version auf den Teensy portiert. Funktioniert ebenfalls einwandfrei. Muss erst noch etwas erledigen, dann mache ich ein kleines Funktionsvideo.

Was deine beiden Schleifen angeht, so hätte ich eine spontane Idee. Es gibt doch sicher eine Vektor-Grafik-Bibliothek für Arduino mit einer Linien-Funktion, wo man nur Start- und Endkoordinaten, Farbe und Linienstärke übergeben muss. Ich würde dann einfach eine Horizontale und vertikale Linie zeichnen.

Ganz oben sollte noch die Beschriftung: L    M    R stehen. An der horizontalen Achse sollte links +S und rechts -S stehen.

Unten sollte dann wie in der Windowsversion noch der Korrelationsgradmesser angezeigt werden.

Bis gleich
Jürgen

(13.09.2020, 07:09)gogosch schrieb: [ -> ]L/R vertauscht: einfach tft.SetRotation(2) auf tft.SetRotation(0) ändern. Manche Displays (so wie meines) sind um 180° gedreht. Hab den Sketch im Post 694 aktualisiert.
edit: 11:00 optionale Normalisierung auf gesamte Azeigefläche hinzugefügt.

Moin Gogosch,

danke für die schnelle Umsetzung. Ich werde gleich den Code portieren und testen. Danach gebe ich eine entsprechende Rückmeldung.

Grüße
Jürgen
So, ich habe einmal Bruno's und Gogosch's aktuelle Versionen auf den Teensy portiert und getestet. Der Vergleich ist interessant und kann von euch entsprechend bewertet werden.

Bruno's Version:

[color=var(--ytcp-link-color)]https://youtu.be/OWerywcR-vM[/color]

Gogosch's Version:

[color=var(--ytcp-link-color)]https://youtu.be/BWW2jecbypw[/color]


Ich finde, dass wir jetzt Gonio-Versionen haben, die beide noch nicht 100%ig optimal sind, aber man sollte jetzt erst einmal das Gesamtprojekt mit allen Optionen fertigstellen, damit diejenigen, die es implementieren möchten, dies auch möglichst zeitnah durchführen können. Zumal die Gonio-Funktion sicherlich nicht von allen Anwendern benötigt wird. Diejenigen, die das Gonio benötigen können mit den vorliegenden Versionen sicherlich leben, da sie ja grundsätzlich funktionieren und nur die Darstellung noch etwas Optimierung bedarf.

Danach ist dann genügend Zeit, um das Gonio weiter zu optimieren und zusätzliche Softwarefunktionen zu entwickeln oder zu optimieren. Das kann ja dann in einem späteren Release veröffentlicht werden, was doch eine übliche Vorgehensweise im Softwareengineering ist.

Liebe Grüße
Jürgen
AtGogosch,

eine Änderung des Parameters von 2 auf 0 für die Rotation bringt nichts. In beiden Fällen bleibt L und R vertauscht. Habe ich jetzt mehrfach gewechselt und jeweils auf den Teensy portiert. Es funktioniert leider noch nicht.

Gruß
Jürgen

gogosch

(13.09.2020, 12:37)bornemju schrieb: [ -> ]AtGogosch,

eine Änderung des Parameters von 2 auf 0 für die Rotation bringt nichts. In beiden Fällen bleibt L und R vertauscht. Habe ich jetzt mehrfach gewechselt und jeweils auf den Teensy portiert. Es funktioniert leider noch nicht.

Gruß
Jürgen

Hast Du auch die letzte Version? Bei mir funktioniert es nun.


Thumbsup Thumbsup
Mal kurz einen Blick auf das Ziel werfen  Floet 




Bei den amtlichen Goniometern sind die Achsen übrigens im 45 Grad Winkel angeordnet, nicht horizontal und vertikal.

gogosch

(13.09.2020, 15:55)havox schrieb: [ -> ]Bei den amtlichen Goniometern sind die Achsen übrigens im 45 Grad Winkel angeordnet, nicht horizontal und vertikal.

... und wo ist da der Unterschied zu unseren Versionen  Sad2
Oder meins du das Fadenkreuz?

Mono Links:
[Bild: 2020-09-13-17-35-20.jpg]

Mono rechts:
[Bild: 2020-09-13-17-32-19.jpg]

DIYLAB

(13.09.2020, 15:55)havox schrieb: [ -> ]Mal kurz einen Blick auf das Ziel werfen  Floet 


Kannst Du uns mal bitte den Sound dazu bereitstellen?

gogosch

(13.09.2020, 15:55)havox schrieb: [ -> ]Bei den amtlichen Goniometern sind die Achsen übrigens im 45 Grad Winkel angeordnet, nicht horizontal und vertikal.

So in etwa:

[Bild: 2020-09-13-18-15-06.jpg]
Ja, genau so  Thumbsup

edit: dann liegt nämlich ein Monosignal, das nur im linken Kanal ist, auf der Koordinate für links. Rechts entsprechend.