AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Morsecode erkennen

Ein Thema von any_key · begonnen am 1. Jun 2008 · letzter Beitrag vom 1. Jun 2008
Antwort Antwort
any_key

Registriert seit: 7. Okt 2005
96 Beiträge
 
Delphi 7 Personal
 
#1

Morsecode erkennen

  Alt 1. Jun 2008, 13:22
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 (http://www.delphipraxis.net/internal...630&highlight= - LiveTest).
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:
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;
Kann mir vielleicht jemand sagen, warum das Programm hängen bleibt und wie man das beheben kann?

Schon mal vielen Dank im Vorraus für eure Antworten.
mfg any_key
  Mit Zitat antworten Zitat
Benutzerbild von STS301
STS301

Registriert seit: 6. Nov 2007
668 Beiträge
 
Delphi 7 Personal
 
#2

Re: Morsecode erkennen

  Alt 1. Jun 2008, 13:45
als was ist Pegel definiert?
Sebastian

ölpölp

Linux will rule the universe!!
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#3

Re: Morsecode erkennen

  Alt 1. Jun 2008, 13:47
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?
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
any_key

Registriert seit: 7. Okt 2005
96 Beiträge
 
Delphi 7 Personal
 
#4

Re: Morsecode erkennen

  Alt 1. Jun 2008, 13:55
@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.

//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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Morsecode erkennen

  Alt 1. Jun 2008, 15:53
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:
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;
Der Code ist nur eine Skizze und funktioniert so nicht, soll mehr als richtungsweisender Anstoß verstanden werden.

Grüße vom marabu
  Mit Zitat antworten Zitat
any_key

Registriert seit: 7. Okt 2005
96 Beiträge
 
Delphi 7 Personal
 
#6

Re: Morsecode erkennen

  Alt 1. Jun 2008, 16:30
Danke marabu für die Hilfe. So ganz habe ich den Code noch nicht verstanden, aber ich guck es mir noch mal genau an.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Morsecode erkennen

  Alt 1. Jun 2008, 16:44
Ich habe noch ein paar Kommentare dazu geschrieben und die Abbruchbedingung vervollständigt.

Es bleibt genug Arbeit für dich ...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz