![]() |
Morsecode erkennen
Ahoi,
zur Zeit versuche ich Morsecode, welchen ich von einem Programm generieren lasse über ein anderes Programm zu erkennen. Zum Erkennen der Töne verwende ich ein Beispiel, das ich hier im Board gefunden habe ( ![]() Jetzt habe ich mir dazu auch eine Strategie überlegt, wie der Code erkannt werden soll. Undzwar überprüfe ich, sobald die Aufzeichnung des Codes gestartet wurde, ob der Ton über einem bestimmten Pegel liegt. Wenn dies nicht der Fall ist ruft sich die Prozedur wieder selbst auf bis der Ton über diesem Pegel liegt. Danach wird die vordefinierte Tonlänge für einen kurzen Ton abgewartet und erneut eine Überprüfung des Pegels vorgenommen. Liegt dieser nun noch immer über dem vorbestimmten Maß dann handelt es sich um einen langen Ton und es wird wieder der Zeitraum der Tonlänge abgewartet und die Prozedure von vorne gestartet. Wenn der Ton unterhalb dieses Pegels liegt, was der Fall ist wenn es sich um einen kurzen Ton handelt, dann wird eine Tonlänge abgewartet und die Prozedure wiederum von vorne gestartet. Das habe ich auch alles in Quelltext umgesetzt, aber sobald ich die Aufzeichnung starte bleibt das Programm hängen :( Die Überprüfung des Tons sieht so aus:
Delphi-Quellcode:
Kann mir vielleicht jemand sagen, warum das Programm hängen bleibt und wie man das beheben kann?
procedure TForm1.TonPruefen;
var Anfangszeit,Zwischenzeit : integer; begin if Pegel > 2000000000 then begin Anfangszeit := GetTickCount; repeat Zwischenzeit := GetTickCount; until Zwischenzeit - Anfangszeit >= 800; if Pegel > 2000000000 then begin MemoLog.Text := MemoLog.Text + #13#10 + 'Lang'; Anfangszeit := GetTickCount; repeat Zwischenzeit := GetTickCount; until Zwischenzeit - Anfangszeit >= 800; TonPruefen; end else begin MemoLog.Text := MemoLog.Text + #13#10 + 'Kurz'; Anfangszeit := GetTickCount; repeat Zwischenzeit := GetTickCount; until Zwischenzeit - Anfangszeit >= 800; TonPruefen; end; end else TonPruefen; end; Schon mal vielen Dank im Vorraus für eure Antworten. mfg any_key |
Re: Morsecode erkennen
als was ist Pegel definiert?
|
Re: Morsecode erkennen
HI
ich würde die Prüfung in eine Schleife setzen, ums einfacher debuggen zu können. Morse lebt aber auch von Pausen. Wenn du deinen To erkannt hast, würd ich eine Pause abwarten und dann die Schleife von neuem Starten lassen. rollstuhlfahrer PS: Nur so aus interesse: Wie berechnest du den Pegel? |
Re: Morsecode erkennen
@STS301 / rollstuhlfahrer
Zur Ermittlung des Pegels habe ich einfach "Bass_ChannelGetlevel(channel)" aus dem genannten Beispiel übernommen. Das hatte ich dann zur erhöhten Verständlichkeit in eine extra function geschrieben. @rollstuhlfahrer Danke für den Vorschlag. Ich probier das gleich mal aus. Zu den Pausen: Ich hatte mir eigentlich vorgenommen zuerst die Erkennung von kurzen und langen Tönen zu realisieren und dann im nächsten Schritt die Pausen einzubauen. Danach kommt dann noch die Umsetzung der Interpretation der gesammelten Daten und danach funktioniert hoffenlich alles. :-D //Edit Also ich habe jetzt noch mal dran herumgebastelt. Mittlerweile bekomme ich bei dem Quelltext der oben steht immer die Fehlermeldung :'In Projekt ...\Project1.exe trat ein Problem mit folgender Meldung auf:"Zugriffsverletzung bei 0x7c93aa3d: Schreiben von Adresse 0x0030fd8'. Prozess angehalten. Mit Einzelne Anweisung oder Start fortsetzen." Weiß jemand was das zu bedeuten hat? //Edit² Mittlerweile ist es so, dass er so zwei bis drei Resultate anzeigt und dann die Fehlermeldung kommt. Liegt das evtl. daran, dass sich die Procedure selbst immer wieder aufruft, wenn die Bedingung nicht erfüllt ist? |
Re: Morsecode erkennen
Moin.
Für die Analyse von Morse-Code würde ich einen "Sound-Parser" mit Zustandsautomaten verwenden. Die Lexeme sind dann Pausen und Töne in den definierten Längen.
Delphi-Quellcode:
Der Code ist nur eine Skizze und funktioniert so nicht, soll mehr als richtungsweisender Anstoß verstanden werden.
const
WPM = 10; // words per minute DIT = 1200 div WPM; // short tone duration DAH = 3 * DIT; // long tone duration GAP = DIT; // bit gap LGAP = DAH; // letter gap WGAP = 7 * DIT; // word gap TOL = 0.1; // tolerance 10 percent type TMorseCode = ( mcSOT, // start of transmission mcGAP, // bit gap mcLGAP, // letter gap mcWGAP, // word gap mcDIT, // short tone mcDAH, // long tone mcEOT // end of transmission ); function ToneExists: Boolean; begin // end; function MorseCode(isTone: Boolean; ticks: Cardinal): TMorseCode; begin // end; procedure ReadMorseCode; var nStart, nStop: Cardinal; wasPausing, isPausing: Boolean; mc: TMorseCode; begin nStart := GetTickCount - DIT; wasPausing := True; mc := mcSOT; repeat isPausing := not ToneExists; if wasPausing xor isPausing then begin nStop := GetTickCount; mc := MorseCode(wasPausing, nStop - nStart); DoProcess(mc); end else if isPausing and ((GetTickCount - nStart) > (10 * WGAP)) then mc := mcEOT; until mc = mcEOT; end; Grüße vom marabu |
Re: Morsecode erkennen
Danke marabu für die Hilfe. So ganz habe ich den Code noch nicht verstanden, aber ich guck es mir noch mal genau an.
|
Re: Morsecode erkennen
Ich habe noch ein paar Kommentare dazu geschrieben und die Abbruchbedingung vervollständigt.
Es bleibt genug Arbeit für dich ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz