Hallo zusammen,
die genauen Eigenschaften des Filters kann ich leider nicht beschreiben,
nur die Umgebung für die er benutzt werden soll.
Für eine RS485 UART Übertragung (8,N,1) mit 2MBit wollte ich evt.
Störungen am Empfänger filtern. Hierfür wird für die Synchronisation
natürlich das Signal erst einmal über zwei FFs geführt. Danach soll
folgender "Filter" eingesetzt werden:
clk_i beträgt hier 96MHz. rxd_i ist das synchronisierte Signal und rxd
das Signal nach dem Filter. Ist das Signal (rxd_i) 1 so wird diese von
rechts in den Filter geschoben. Bei einer 0 wird diese von links
geschoben. Steht der Filter auf 0 ist der Ausgang auch 0, entsprechend
gilt dies für die 1. Ich meine das dies eine gleitende Mittelwertbildung
ist.
Als Alternative könnte man auch eine 2 aus 3 Auswahl umsetzen.
Das rxd Signal soll später 16 fach abgetastet werden, und die Mitte (#8)
gibt dann den Wert für das entsprechende Bit an.
Wie ist nach Eurer Erfahrung hier das richtige Vorgehen?
Viele Grüße,
Michael
Wieso nimmst du nicht einen klassischen Ansatz wie einen TP Filter ?
Was du da machst ist ziemlicher Murks... wenn du das Signal "abtasten"
willst solltest du es auch analog sampeln..überleg dir mal wieviel sinn
es macht hier nur digital eine Art "Mittelwert" zu bilden..
Wie meinst Du das mit "solltest du es auch analog sampeln"? Ich glaube
nicht das es eine gute Idee wäre einen echten TP vor den RS485
Transceiver zu setzen.
Michael F. schrieb:> die Mitte (#8)gibt
warum wertest Du denn dann nicht genau die Signale dort aus? Also die
Mehrheit aus #7,#8 und #9
Wenn alle 3 gleich sind, ... OK gut.
Wenn einer anders ist (33%), dann ist Dein Signal doch so verrauscht,
dass die Startflanke und die Auswertung des Rests nur geraten ist. Der
Gewinn durch bessere Digitalverarbeitung ist dann vernachlässigbar.
Hallo Achim
das mit der #7,#8 und #9 habe ich mir auch schon überlegt. Und die Frage
ist ob das Vergleichbar ist mit einer 2 aus 3 Auswahl wenn dies schon
mit dem Signal selbst gemacht wird.
Gruß,
Michael
Gustl B. schrieb:> Das ist eigentlich auch ein gleitender Mittelwert und so ein Tiefpass.
Kein Tiefpass. Denn Dein Filter hat keinerlei Hysterese oder Dämpfung.
Er lässt selbst die maximale Frequenz (Abtastfrequenz) ungefiltert
durch, wenn er zufällig grad in der Mitte ist.
Gleichwohl hat er eine Phasenverschiebung von bis zu 15 Takten.
Dein Filter wäre der von oben, wenn Du ein Ausgangs-Flag einbaust, dass
bei +15 high wird, bei -15 low und sich sonst nicht ändert. Dann ist die
maximale Ausgangsfrequenz ein 30tel der Eingangsfrequenz, also ein
Tiefpass.
von gleitendem Mittelwert kann man bei beiden m.E. nicht sprechen, da
der Ausgang immer genau einer der beiden Maximalwerte ist. Es wird also
genau nichts gemittelt.
Michael F. schrieb:> Und die Frage> ist ob das Vergleichbar ist mit einer 2 aus 3 Auswahl wenn dies schon> mit dem Signal selbst gemacht wird.
Meist gibt es 2 Probleme bei UART-Signalen:
1) Erkennung der Startflanke. Meist wird diese (beim ersten Zeichen) zu
später erkannt, da die Leitung in maximaler Sättigung ist (seit
Stunden der Ruhepegel;-)
2) Erkennung des letzten Pegels. Bei 8+2+1 = 11 Bits müssen Taktfehler
(Quartz, UART-Teiler, Synchronisation) kleiner als 3% bzw. 1/2 Bit
bleiben.
Die Flanken dazwischen sind quasi "sicherer", die Pegel zum
Abtastzeitpunkt "stabiler".
Mit Deinem Ansatz erkennst Du die Startflanke grundsätzlich erst ein
paar Takte später. Das könntest Du zwar noch konstant korrigieren, wäre
aber ein Problem, wenn das Signal da toggelt.
Da die Startflanke in der Regel sowieso verzögert ist, ist es am
einfachsten und effektivsten, sofort auf dieses Signal zu reagieren und
von dort nach 15,16 und 17 Takten die Mehrheit zu bestimmen.
Wenn Du wirkliche Spikes auf der Leitung (ein high trotz dauerhaftem
low) hast, solltest Du an analog und nicht digital handeln.
TestX schrieb:> Was du da machst ist ziemlicher Murks...
Mitnichten. Ich würde auch in etwa diesen Ansatz gehen.
Allerdings ohne diese Rechts-Links-Schieberei (auch wenn ich
Schieberegister liebe). Diese aufwändige versteckte "Summiererei" macht
die Sache ziemlich undurchschaubar...
Mein Ansatz wäre also der hier (mit einem etwas breiteren
Schieberegister):
1
process(clk_i)
2
begin
3
ifrising_edge(clk_i)then
4
5
noise_sr<=noise_sr(5downto0)&rxd_i;
6
7
if(noise_sr=(others=>'0'))then
8
rxd<='0';
9
endif;
10
11
if(noise_sr=(others=>'1'))then
12
rxd<='1';
13
endif;
14
15
endif;
16
endprocess;
Michael F. schrieb:> wollte ich evt. Störungen am Empfänger filtern.
Solange du nicht weißt, was du filtern musst und wie oft es
auftritt, kann jeder Schuss ins Blaue gleich gut oder schlecht treffen.
Mein erster Schritt wäre also, diese Störungen zu qualifizieren und zu
analysieren...
OK OK, ja, kein gleitender Mittelwert, der Ausgang ist das MSB des
gleitenden Mittelwerts. Sprich bei 16 Samplewerten wird eine '1'
ausgegeben wenn der gleitende Mittelwert > 7 ist, sonst '0'.
Wieso so und nicht wie Lothar ein langes Schieberegister bei dem auf
alles '0' oder alles '1' geprüft wird?
Weil wenn ein Rauschen da ist vielleicht nie der Zustand alles '0'
erreicht wird sondern nur fast alles '0'. Ob das jetzt sinnvoll ist weiß
ich nicht.
Hallo Lothar,
mit Deiner Version habe ich etwas Bauchschmerzen.Wenn hier 5 Takte eine
1 vorhanden waren, und dann eine 0 kommt, braucht es erneut 6x eine 1 um
am Ausgang wirklich eine 1 zu bekommen. Darum die Idee mit dem
rechts/links schieben.
@Achim,
Ich glaube ich weiss was Du meinst. Das man die Startflanke etwas spät
erkennt und dadurch sich der Abtastpunkt immer weiter nach hinten
verschiebt.
Ich glaube man muss das mal testen wie es reagiert. Bei einem Clock vom
96MHz und einer Bitrate vom 2MHz habe ich 48 Clocks Zeit. Bei #24 ist
die Mitte wo man abtasten sollte. Die Startflanke wird über ein
Schieberegister erkannt, evt. darf man hier den Counter dann nicht auf 0
setzen, sondern schon auf 2 oder 3.
Und wie Lothar schon angemerkt hat. Erst mal schauen wie die Störungen
später wirklich aussehen.
Danke für Eure Anmerkungen.
Gruß,
Michael
Gustl B. schrieb:> Wieso so und nicht wie Lothar ein langes Schieberegister bei dem auf> alles '0' oder alles '1' geprüft wird?
Lothars Ansatz ist quasi außer Konkurrenz, da (wie Michael schon
anmerkt) jede einzelne 0 wieder n 1en erfordert und umgekehrt.
Dein Ansatz und Michaels sind dagegen gleichwertig. 15 Bit bei Michael
entspräche Zählen bis 15 bei Dir. In beiden sind die gleichen Schwellen
möglich:
Alles 0 oder 1 entspricht 0 bzw. 15 bei Dir.
Deine abfrage entspricht Bit 8 bei Michael.
Sämtliche Zwischenwerte wären möglich, also 1 bei > 10 und 0 bei <5.
Diese Hysterese-Grenzen kann Ich nicht empfehlen. Die speichern die
Geschichte von Störungen und schaffen ein Level, das mit der neuen
Störung nichts zu tun hat.
Solche Sachen filtert man diskret und dann mit einem AKF.
Auto-Korrelations-Filter
Es passt sich den Pegeln automatisch an. D.h. Du sampelst das Signal
passend ab und wirst die Spitzen diskret raus. Rest Filterung mit
Glättung.
Gustl B. schrieb:> Das ist eigentlich auch ein gleitender Mittelwert und so ein Tiefpass.
Das ist ein Integrator, der nur bedingt ein klassischer Tiefpass ist.
Da muss man gfs noch differenzieren, um Gleichanteil wegzukriegen. Das
läuft dann auf ein CIC hinaus. Da kann man oft auch einen trägen
Tiefpass nehmen, wie ich es beim Entprellen-Artikel reingeschrieben
habe. Normalerweise reicht sowas.
Generell ist der Tiefpass und Filterung nötig, wenn man runtersampelt,
um z.B. auf der Datentaktrate arbeiten zu können.
Bei dem Ansatz, wenn nur 6 Takte betrachtet werden, reicht der scope
gerade für 1/6 der Taktfrequenz und dämpft nur Frequenzen im Bereich
16MHz aufwärts weg. Was ist mit tieffrequenteren Störungen?
Gustl B. schrieb:> OK OK, ja, kein gleitender Mittelwert, der Ausgang ist das MSB des> gleitenden Mittelwerts. Sprich bei 16 Samplewerten wird eine '1'> ausgegeben wenn der gleitende Mittelwert > 7 ist, sonst '0'.
Wenn die Signale zu sehr verrauscht sind, sodaß es zu Sprüngen um den
Mittelwert kommen kann, weil ...
Beitrag "Gleitender Mittelwert rauscht"
... dann kann man das auch so machen, dass über einen sehr langen
Zeitraum integriert und dann wieder differenziert wird:
Beitrag "Differenzieren in VHDL"
Läuft auf sowas hinaus:
Beitrag "Decimator-Schaltung für Puls-Datenstrom"