Ein Pulszähler soll eine weitgehend bekannte Kurvenform (Delta-Marker) aus einem Signal extrahieren und mitzählen, wobei die Daten stark verrauscht sind. Soweit funktioniert die Geschichte allerdings ergibt sich infolge eines Antennenproblems und dynamisch bewegter Objekte eine Reflektionsbildung, d.h. das Signal ist mehrfach enthalten. Bei großen Abständen sehe Ich Echos, die Ich erkennen und ignorieren kann. Bei kleinen Abständen laufen aber die Kurven ineinander, d.h. es gibt eine Deformation und die Erkennung misslingt. Wie kommt man dem Problem einfach bei? Nach Doppelpulsen suchen? Wie formuliere Ich die Annahme?
Zunächst auch gerne mit Matlab. Langfristig mit einem Microcontroller, der klein genug ist und es leisten kann. Wie wäre denn Dein Ansatz? Hätte denn MATLAB eine Vorschrift oder eine feritg implementierte Methode zur Erkennung eines Doppelpulses? Oder muss Ich einfach selbst eine Reihe von Annahmen machen, um das Ergebnis der Pulsfolgen zu bekommen, mit denen Ich dann falte? Ich habe eine ähnliche Lösung von anderer Seite skizziert bekommen, dabei handelt es sich aber um jeweils zwei einfach Wellen, die sich zu einem Kamelbuckel vereinen. Das ist recht einfach zu prozessieren. Das Ursignal sieht übrigens vom Prinzip her so aus: 0,1,2,3,4,5,6,7,8,9,-9,-8,-7,-6,-5,-4,-3,-2,-1,0 also zwei komplementäre Geraden.
Wenn das Signal bekannt ist dann ist das doch eine Anwendung von Korrelation. Es wird hier etwas schwieriger dadurch dass das bekannte Signal mit dem korreliert wird wenig Energie bei tiefen Frequenzen hat, quasi ein bandpass ist und damit die Korrelation nicht so leicht ausgewertet werden kann. Normalisiert man aber die Frequenz etwas bis zu einer gewählten Grenzfreqzenz des Nutzsignals, verbessert sich das. Octave/Matlab Beispiel:
1 | close all |
2 | clear all |
3 | |
4 | function fs = realmirror(rs); |
5 | |
6 | fs=[rs conj(fliplr(rs(2:end-1)))]; |
7 | |
8 | end |
9 | |
10 | signal = [0 1 2 3 4 5 6 7 8 9 -9 -8 -7 -6 -5 -4 -3 -2 -1 0]; |
11 | |
12 | receivedsamples=200; |
13 | |
14 | signal=[signal zeros(1,receivedsamples-length(signal))]; |
15 | |
16 | noise=randn(1,receivedsamples)*5e-1; |
17 | noise-=mean(noise); |
18 | |
19 | received = noise ... |
20 | .+ shift(signal,50) ... |
21 | .+ shift(signal,55)*.5 ... |
22 | .+ shift(signal,70) ... |
23 | .+ shift(signal,80)*.5 ... |
24 | .+ shift(signal,100) ... |
25 | .+ shift(signal,120)*.5; |
26 | |
27 | bandf=realmirror(exp(linspace(0,1,receivedsamples/2+1).^2*log(.1))); |
28 | bandf(1)=0; |
29 | |
30 | plot (received) |
31 | |
32 | figure() |
33 | |
34 | plot (real(ifft(fft(received).*(bandf./[1 fft(signal)(2:length(signal))])))) |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.