Hallo, ich frage mich, wie man Signale innerhalb von Software analysieren kann und wie man bei der Erstellung von solchen Programmen vorgeht. Als Beispiel könnte man hier das Funkmeldesystem der BOS (Feuerwehr, Rettungsdienst, ...) nennen, das durch ein Frequenzumtastverfahren (1200Hz = 1, 1800Hz = 0) Daten übermittelt. Nehmen wir an, dass die Signale bereits digitalisiert sind und z.B. von einer Textdatei ausgelesen werden können. Kleine Zusatzinfo: Programmierung ist für mich kein Problem. Aber mit digitaler Signalverarbeitung hatte ich bisher so gut wie noch nie was zu tun.
Matt B. schrieb: > ich frage mich, wie man Signale innerhalb von Software analysieren kann > und wie man bei der Erstellung von solchen Programmen vorgeht. Kann man pauschal nicht beantworten. Das hängt sowohl von der Art der Signale als auch von der benötigten Analyseform ab. Ganz grob und allgemein: 1. Signal einlesen 2. Analysefunktion (die in Form einer Rechenvorschrift vorliegt) anwenden 3. Analyseergebnis ausgeben > Nehmen wir an, dass die Signale bereits digitalisiert sind und z.B. von > einer Textdatei ausgelesen werden können 1. Datei einlesen 2. Daten dekodieren 3. Information ausgeben Oder was willst Du da analysieren?
Mich interessiert vor allem, wie man so eine Analysefunktion (Rechenvorschrift) erstellt.
Erst mal überlegen, ob das interaktiv oder nicht-interaktiv sein soll. Sprich willst Du einfach nur Daten einlesen-verarbeiten-ausgeben, oder soll der Anwender damit spielen können? Im ersten Falle mach ein ganz normales Programm ohne GUI, das einfach die Daten (z.Bsp im SoX .dat Textformat) über die Standardeingabe einließt, und über die Standardausgabe ausließt. Die Signalverarbeitung hängt davon ab was Du machen willst. Für FSK Signale kannst Du einfach 2 Bandpass-Filter machen in dem Du die Signale heruntermischt (mit e^(j*w*t) multiplizieren, bzw *sin(w*t) und *cos(w*t)) und dann tiefpassfilterst. Wenn Du das Signal dadurch schon komplex hast kannst du einfach den Betrag bestimmen. In Pascal sähe das beispielsweise so aus:
1 | PROGRAM irgendwas; |
2 | CONST w1=1000; //Kreisfrequenz 1 |
3 | w2=2000; //Kreisfrequenz 2 |
4 | td=1e-3; //Zeit zwischen 2 Abtastwerten am Ausgang |
5 | VAR t,x,nt:double; |
6 | sr1,si1,sr2,si2:double; |
7 | p1,p2:double; |
8 | |
9 | BEGIN |
10 | readln; readln; //Sox mach am Anfang 2 Kommentarzeilen, weg damit |
11 | sr1:=0; si1:=0; |
12 | sr2:=0; si2:=0; |
13 | nt:=td; |
14 | REPEAT |
15 | readln(t,x); |
16 | sr1:=sr1+cos(x/w1); |
17 | si1:=si1+sin(x/w1); |
18 | sr2:=sr2+cos(x/w2); |
19 | si2:=si2+sin(x/w2); |
20 | if t>nt THEN |
21 | BEGIN |
22 | p1:=sqr(sr1)+sqr(si1); |
23 | p2:=sqr(sr2)+sqr(sr2); |
24 | writeln(t,' ',(p2-p1)/(p2+p1)); |
25 | sr1:=0; sc1:=0; |
26 | sr2:=0; sc2:=0; |
27 | nt:=nt+td; |
28 | END; |
29 | UNTIL eof; |
30 | END. |
(Code nicht ausprobiert, vermutlich Fehler drin) Du kriegst dann Zahlen zwischen -1 und 1, die Du dann in einer Art Software UART weiterverarbeiten kannst. Dafür muss natürlich td klein genug sein. (kleiner als die Symbolzeit durch 16)
Hallo Christian, danke für deine Hilfe. Ich habe allerdings noch ein paar Fragen: Du schreibst, dass du die Real- und Imaginärteile der Werte berechnest und diese anschließend tiefpassfilterst. Verstehen ich den Codeteil
1 | sr1:=sr1+cos(x/w1); |
2 | si1:=si1+sin(x/w1); |
3 | sr2:=sr2+cos(x/w2); |
4 | si2:=si2+sin(x/w2); |
so richtig: sr1 stellt den Realanteil von x/w1 dar. si1 entsprechend den Imaginäranteil. Alle Realanteile werden unter Beachtung deren Vorzeichen zu sr1 dazuaddiert. Bildet das bereits den Tiefpassfilter?
@Christian: Inwiefen bezieht sich Dein Code auf Sox? @Matt: Womit willst DU Deine Signale anzeigen?
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.