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:46] m.schramm [takt_finder] |
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: | + | ma = max(yh) |
- | s = ma/5 | + | if ma > mind: |
- | tol = 0.002 * ma | + | s = ma/5 |
- | idx = np.where(np.abs(yh-s)<tol) | + | tol = 0.002 * ma |
- | + | idx = np.where(np.abs(yh-s)<tol) | |
- | if l >= minl: | + | # [...] |
- | # [...] | + | |
</code> | </code> | ||
==== 2. Problem: ==== | ==== 2. Problem: ==== | ||
Zeile 84: | 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 127: | Zeile 126: | ||
<code python> | <code python> | ||
- | # [...] | + | # [...] |
- | v=[] # alle Indices um Grenze | + | v=[] # alle Indices um Grenze |
- | h=[] # Sortierung der Indices aus v nach nur richtigen Takt-Flanken | + | h=[] # Sortierung der Indices aus v nach nur richtigen Takt-Flanken |
- | e=[] # Hilfliste zur Ergänzung von Takt-Flanken, falls richtige Takt-Flanken nicht auffindbar (Lückenliste) | + | e=[] # Hilfliste zur Ergänzung von Takt-Flanken, falls richtige Takt-Flanken nicht auffindbar (Lückenliste) |
- | n=0 # Zähler für v-Liste | + | n=0 # Zähler für v-Liste |
- | m=0 # Zähler für h-Liste | + | m=0 # Zähler für h-Liste |
- | k=0 # Zähler für falsche Takt-Flanken in v-Liste | + | k=0 # Zähler für falsche Takt-Flanken in v-Liste |
- | v.extend(np.array(idx).flatten().tolist()) | + | v.extend(np.array(idx).flatten().tolist()) |
- | for x in v: | + | for x in v: |
- | n+=1 | + | n+=1 |
- | 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) |
- | k=0 # Neustart nach neuer gefundenen richtigen Takt-Flanke | + | k=0 # Neustart nach neuer gefundenen richtigen Takt-Flanke |
- | else: | + | else: |
- | k+=1 # merke um wieviele Flanken wir uns von pot. richtigen Takt-Flanke entfernen | + | k+=1 # merke um wieviele Flanken wir uns von pot. richtigen Takt-Flanke entfernen |
- | for x in h: # Lückenfüller von richtigen Takt-Flanken | + | for x in h: # Lückenfüller von richtigen Takt-Flanken |
- | m+=1 | + | m+=1 |
- | if m==len(h): | + | if m==len(h): |
- | 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 |
</code> | </code> | ||
- | |||
====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!__ |