Hallo, für meinen Roboter habe ich entschieden, einen eigenen DUE für die Schleifensignalerkennung einzusetzen.
Was mir als erstes mit dem von Ardumower verwendeten Code aufgefallen ist, ist die Erkennung das der Roboter innerhalb der Schleife ist, obwohl das Schleifensignal nicht vorhanden ist (zumindest mit den Codefragmenten die ich herauskopiert habe). Die Qualität ist nicht immer ausreichend um zu erkennen, ob ein Signal vorhanden ist. Daher habe ich zwei Änderungen vorgenommen.
1.) Erkennung ob Signal vorhanden
Zum einen habe ich das Empfangsarry (was der ADC füllt) auf 3x die Größe des Senderarray * Oversampling gestellt. Damit habe ich immer zwei Mal einen Ausschlag des Matched Filters in einer Sampleperiode. Nun suche ich wie bisher das Maximum und danach das zweite Maximum des zweiten Peaks. Diese beiden Maxima sind bei mir immer entweder 96 oder 240 Arrayzellen auseinander - je nachdem welchen Code ich verwende. Allein durch diese Maßnahme kann ich 99.9% aller falschen Signale herausfiltern. Falls doch nochmal ein Störsignal dieses Ergebnis erzeugt, so prüfe ich ob die Qualität > 1.5 ist. Und selbst wenn das einmal falsch ist, wird die nächste Abtastrate des Störsignals eine andere Peakdistanz aufweisen.
2.) Verbesserung der Filterqualität
Als zweites verwende ich den pseudonoise4_dbpsk code anstatt den pseudonoise4_pw. Die beiden Vergleiche könnt ihr im Anhang sehen. Mit dem pseudonoise4_dbpsk erreiche ich eine Filterqualität ohne Störungen von ca. 2.4. Mit pseudonoise4_pw habe ich es nur auf 1.8 geschafft.
Wenn das Signal nun nicht erkannt wurde setze ich die Amplitude auf 0.
Die Amplituden vom linken und rechten Sensor werden dann über die Serielle Schnittstelle an den anderen DUE geschickt, der den Roboter steuer und die weitere Auswertung vornimmt.
Bei zwei Sensoren benötige der DUE ca. 130ms um beide Sensoren auszuwerten. Damit komme ich auf ca. 7 Messwerte pro Sekunden.
Aktuell bin ich noch nicht im richtigen Betrieb. Aber die Ergebnisse und das Störverhalten sind zum jetzigen Zeitpunkt OK.
int8_t pseudonoise4_pw[] = { 1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1 }; // 24 Zahlen
int8_t pseudonoise4_dbpsk[] = {-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1}; // 60 Zahlen
Was mir allerdings auffällt ist, das von Sample zu Sample die Amplitude sich verändert obwohl ich mit sampleRate = SRATE_38462 sample. Vermutlich ist dies auf die Frequenzverschiebung zwischen Sender und Abtaster zurückzuführen. Hat da jemand eine Idee um dieses zu optimieren?
Was mir als erstes mit dem von Ardumower verwendeten Code aufgefallen ist, ist die Erkennung das der Roboter innerhalb der Schleife ist, obwohl das Schleifensignal nicht vorhanden ist (zumindest mit den Codefragmenten die ich herauskopiert habe). Die Qualität ist nicht immer ausreichend um zu erkennen, ob ein Signal vorhanden ist. Daher habe ich zwei Änderungen vorgenommen.
1.) Erkennung ob Signal vorhanden
Zum einen habe ich das Empfangsarry (was der ADC füllt) auf 3x die Größe des Senderarray * Oversampling gestellt. Damit habe ich immer zwei Mal einen Ausschlag des Matched Filters in einer Sampleperiode. Nun suche ich wie bisher das Maximum und danach das zweite Maximum des zweiten Peaks. Diese beiden Maxima sind bei mir immer entweder 96 oder 240 Arrayzellen auseinander - je nachdem welchen Code ich verwende. Allein durch diese Maßnahme kann ich 99.9% aller falschen Signale herausfiltern. Falls doch nochmal ein Störsignal dieses Ergebnis erzeugt, so prüfe ich ob die Qualität > 1.5 ist. Und selbst wenn das einmal falsch ist, wird die nächste Abtastrate des Störsignals eine andere Peakdistanz aufweisen.
2.) Verbesserung der Filterqualität
Als zweites verwende ich den pseudonoise4_dbpsk code anstatt den pseudonoise4_pw. Die beiden Vergleiche könnt ihr im Anhang sehen. Mit dem pseudonoise4_dbpsk erreiche ich eine Filterqualität ohne Störungen von ca. 2.4. Mit pseudonoise4_pw habe ich es nur auf 1.8 geschafft.
Wenn das Signal nun nicht erkannt wurde setze ich die Amplitude auf 0.
Die Amplituden vom linken und rechten Sensor werden dann über die Serielle Schnittstelle an den anderen DUE geschickt, der den Roboter steuer und die weitere Auswertung vornimmt.
Bei zwei Sensoren benötige der DUE ca. 130ms um beide Sensoren auszuwerten. Damit komme ich auf ca. 7 Messwerte pro Sekunden.
Aktuell bin ich noch nicht im richtigen Betrieb. Aber die Ergebnisse und das Störverhalten sind zum jetzigen Zeitpunkt OK.
int8_t pseudonoise4_pw[] = { 1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1 }; // 24 Zahlen
int8_t pseudonoise4_dbpsk[] = {-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1}; // 60 Zahlen
Was mir allerdings auffällt ist, das von Sample zu Sample die Amplitude sich verändert obwohl ich mit sampleRate = SRATE_38462 sample. Vermutlich ist dies auf die Frequenzverschiebung zwischen Sender und Abtaster zurückzuführen. Hat da jemand eine Idee um dieses zu optimieren?