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