Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ss15:taktrueckgewinnung_1.2 [2015/10/06 20:55] m.schramm [4. Problem:] |
ss15:taktrueckgewinnung_1.2 [2016/05/10 14:46] (aktuell) |
||
---|---|---|---|
Zeile 60: | Zeile 60: | ||
Die Variante 1 wirft allerdings ein Problem auf: Wurde im untersuchten Abschnitt kein Signal aufgenommen, d.h. es herrscht nahezu Stille auf der Taktfrequenz, wird diese Stille mit ihrem ganz geringen Grundrauschen trotzdem auf den üblichen Wert verstärkt. Das führt dann aber dazu, dass Takt-Flanken erkannt werden wo gar keine sind. Deshalb erachte ich es für sinnvoller eine feste minimale Grenze zu definieren, ab dem das Taktsignal als vorhanden gewertet wird und die Grenze zur Erkennung wie gehabt über das Maximum oder ähnlich zu berechnen. | Die Variante 1 wirft allerdings ein Problem auf: Wurde im untersuchten Abschnitt kein Signal aufgenommen, d.h. es herrscht nahezu Stille auf der Taktfrequenz, wird diese Stille mit ihrem ganz geringen Grundrauschen trotzdem auf den üblichen Wert verstärkt. Das führt dann aber dazu, dass Takt-Flanken erkannt werden wo gar keine sind. Deshalb erachte ich es für sinnvoller eine feste minimale Grenze zu definieren, ab dem das Taktsignal als vorhanden gewertet wird und die Grenze zur Erkennung wie gehabt über das Maximum oder ähnlich zu berechnen. | ||
<code python> | <code python> | ||
+ | # [...] | ||
+ | ma = max(yh) | ||
+ | if ma > mind: | ||
+ | s = ma/5 | ||
+ | tol = 0.002 * ma | ||
+ | idx = np.where(np.abs(yh-s)<tol) | ||
# [...] | # [...] | ||
- | ma = max(yh) | ||
- | if ma > mind: | ||
- | s = ma/5 | ||
- | tol = 0.002 * ma | ||
- | idx = np.where(np.abs(yh-s)<tol) | ||
- | |||
- | if l >= minl: | ||
- | # [...] | ||
</code> | </code> | ||
==== 2. Problem: ==== | ==== 2. Problem: ==== | ||
Zeile 85: | Zeile 83: | ||
übertragen. Der momentane Index wird mit dem nächstkommenden Index auf seinen | übertragen. Der momentane Index wird mit dem nächstkommenden Index auf seinen | ||
Abstand überprüft und nur als 'richtig' übertragen, wenn diese im Taktabstand | Abstand überprüft und nur als 'richtig' übertragen, wenn diese im Taktabstand | ||
- | mit einer Toleranz von +-10% vom Taktabstand zueinander stehen. Somit fallen | + | mit einer Toleranz von +-5% vom Taktabstand zueinander stehen. Somit fallen |
- | sofort alle Indices raus, dessen Abstand ungleich des Taktabstandes zum | + | sofort alle Indizes raus, deren Abstand ungleich des Taktabstandes zum |
nächsten Index ist, also die der gleichen Flanke angehören oder die den | nächsten Index ist, also die der gleichen Flanke angehören oder die den | ||
'falschen' Flanken angehören, die sich zwischenmogeln könnten. | 'falschen' Flanken angehören, die sich zwischenmogeln könnten. | ||
Zeile 142: | Zeile 140: | ||
if n==len(v): | if n==len(v): | ||
for x in sorted(v,reverse=True): # v-liste von hinten nochmal durchgehen, damit letzte Takt-Flanke noch in h hinzugefügt wird | for x in sorted(v,reverse=True): # v-liste von hinten nochmal durchgehen, damit letzte Takt-Flanke noch in h hinzugefügt wird | ||
- | if h[-1]+takt+0.1*takt>x and h[-1]+takt-0.1*takt<x: | + | if h[-1]+takt+0.1*takt>x and h[-1]+takt-0.05*takt<x: |
h.append(x) # die letzte richtige Taktflanke | h.append(x) # die letzte richtige Taktflanke | ||
break | break | ||
- | elif x+takt+0.1*takt>v[n] and x+takt-0.1*takt<v[n]: # nächste Flanke ist einen Takt mit Tolerant von +-10% entfernt | + | elif x+takt+0.05*takt>v[n] and x+takt-0.05*takt<v[n]: # nächste Flanke ist einen Takt mit Toleranz von +-5% entfernt |
- | if k!=0 and v[n-k-1]+takt+0.1*takt>x and v[n-k-1]+takt-0.1*takt<x: | + | if k!=0 and v[n-k-1]+takt+0.05*takt>x and v[n-k-1]+takt-0.05*takt<x: |
h.append(v[n-k-1]) # vergangene richtige Takt-Flanke, die nun durch einer nachfolgenden Takt-Flanke gefunden wurde | h.append(v[n-k-1]) # vergangene richtige Takt-Flanke, die nun durch einer nachfolgenden Takt-Flanke gefunden wurde | ||
h.append(x) | h.append(x) | ||
Zeile 158: | Zeile 156: | ||
h=sorted(h+e) # fülle Lücken in der richtigen Takt-Liste | h=sorted(h+e) # fülle Lücken in der richtigen Takt-Liste | ||
break | break | ||
- | elif not (x+takt+0.1*takt>h[m] and x+takt-0.1*takt<h[m]): # findet Lücken | + | elif not (x+takt+0.05*takt>h[m] and x+takt-0.05*takt<h[m]): # findet Lücken |
e.append(int(x+takt)) | e.append(int(x+takt)) | ||
return h | return h | ||
Zeile 164: | Zeile 162: | ||
====Resultat:==== | ====Resultat:==== | ||
Wir erhalten die genauen Zeitpunkte eines Wechsels der Lautstärke der Takt-Frequenz und damit lässt sich die Takteinteilung des Signals ablesen. | Wir erhalten die genauen Zeitpunkte eines Wechsels der Lautstärke der Takt-Frequenz und damit lässt sich die Takteinteilung des Signals ablesen. | ||
- | |||
- | __Bilder folgen noch!__ |