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.
Entweder sind die Samples "Müll" oder der Audio-Kanal des AudioShields ist massiv übersteuert.
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, 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.
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.
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.
(11.09.2020, 19:06)DIYLAB schrieb: [ -> ] (11.09.2020, 19:04)gogosch schrieb: [ -> ]Die Punkte muss man nur verbinden.....
Der war gut .
Ist das Dein Ernst?
Na, Kurven lassen sich nicht zeichnen und bestehen immer aus geraden Teilstücken.
Ich bin raus.
Hallo Freunde.
Gogosch 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.
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.
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
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
(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
).
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;
}
(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
Gogosch,
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
(13.09.2020, 12:37)bornemju schrieb: [ -> ]Gogosch,
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.
Mal kurz einen Blick auf das Ziel werfen
Bei den amtlichen Goniometern sind die Achsen übrigens im 45 Grad Winkel angeordnet, nicht horizontal und vertikal.
(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
Oder meins du das Fadenkreuz?
Mono Links:
Mono rechts:
(13.09.2020, 15:55)havox schrieb: [ -> ]Mal kurz einen Blick auf das Ziel werfen
Kannst Du uns mal bitte den Sound dazu bereitstellen?
(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:
Ja, genau so
edit: dann liegt nämlich ein Monosignal, das nur im linken Kanal ist, auf der Koordinate für links. Rechts entsprechend.