Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Morsecode erkennen (https://www.delphipraxis.net/114835-morsecode-erkennen.html)

any_key 1. Jun 2008 12:22


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 (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

STS301 1. Jun 2008 12:45

Re: Morsecode erkennen
 
als was ist Pegel definiert?

rollstuhlfahrer 1. Jun 2008 12:47

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?

any_key 1. Jun 2008 12:55

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?

marabu 1. Jun 2008 14:53

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:
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

any_key 1. Jun 2008 15:30

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.

marabu 1. Jun 2008 15:44

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 15:16 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