Code covered by the BSD License  

Highlights from
demorse

from demorse by Aaron
Translates morse code in a wav file to text

demorse(filename)
function demorse(filename)

fs = 44000;

x = wavread(filename);

%zero pad the signal
x = [zeros(fs,1); x; zeros(fs,1)];

% find the frequency of the signal
ff = getChirpFrequency(x);

waveletSizes = fs * centfrq('morl') ./ ff;

sig = cwt(x,waveletSizes,'morl');
sig = abs(sig);

% do a filter five times the frequency length
sigF = conv(sig,ones(floor(10 * fs / ff),1),'same');

seg = (sigF > (0.25 * mean(sigF))) - 0.5;
segPts = find(sign(seg(2:end)) ~= sign(seg(1:end-1)));

segIntervals = diff(segPts) ./ fs;

beeps = segIntervals(1:2:end);
gaps = segIntervals(2:2:end);

[N,X] = hist(beeps,10);
[~,idx] = sort(N,'descend');
thresh = mean(X(idx(1:2)));
beeps = beeps > thresh;

[N,X] = hist(gaps,30);
[~,idx] = sort(N,'descend');
gapThresh = sort(X(idx(1:3)));
gapThresh = gapThresh(1:2) + diff(gapThresh)./2;
trueGaps = (gaps > gapThresh(2)) + (gaps > gapThresh(1));

decoder = getDecoder();

% now we get to interpret the message
letter = beeps(1);
beeps = beeps(2:end);
for n = 1:length(trueGaps)
    switch trueGaps(n)
        case 0
           % dot/dash split
           letter = [letter beeps(1)];
           beeps = beeps(2:end);
        case 1
           % letter break
           out = printSymbol(letter);
           fprintf('%s',decode(out,decoder));
%             fprintf('%s',out);
           letter = beeps(1);
           beeps = beeps(2:end);
        case 2
           % word break
           out = printSymbol(letter);
           fprintf('%s',decode(out,decoder));
%             fprintf('%s',out);
           letter = beeps(1);
           beeps = beeps(2:end);
           fprintf(' ');
    end      
end


end

function [ out ] = printSymbol( array )

    out = char(zeros(1,length(array)));

    for n = 1:length(array)
        if array(n) == 0
            out(n) = '.';
        else
            if array(n) == 1
                out(n) = '-';
            end
        end
    end

end

function c = decode(str,decoder) 
    if isKey(decoder,str)
       c = decoder(str); 
    else
        c = '???';
    end

end

function [freq] = getChirpFrequency(sig) 

limit = 10000; % maximum frequency allowed

fs = 44000;
len = length(sig);
cutoff = floor(len * limit / fs); 

f = abs(fft(sig));
f = f(2:cutoff);

[~,idx] = max(f);

freq = idx * fs ./ len ;

end

function [decoder] = getDecoder() 

    decoder = containers.Map();
    decoder('.-') = 'A';
    decoder('-...') = 'B';
    decoder('-.-.') = 'C';
    decoder('-..') = 'D';
    decoder('.') = 'E';
    decoder('..-.') = 'F';
    decoder('--.') = 'G';
    decoder('....') = 'H';
    decoder('..') = 'I';
    decoder('.---') = 'J';
    decoder('-.-') = 'K';
    decoder('.-..') = 'L';
    decoder('--') = 'M';
    decoder('-.') = 'N';
    decoder('---') = 'O';
    decoder('.--.') = 'P';
    decoder('--.-') = 'Q';
    decoder('.-.') = 'R';
    decoder('...') = 'S';
    decoder('-') = 'T';
    decoder('..-') = 'U';
    decoder('...-') = 'V';
    decoder('.--') = 'W';
    decoder('-..-') = 'X';
    decoder('-.--') = 'Y';
    decoder('--..') = 'Z';
    decoder('----') = '0';
    decoder('.----') = '1';
    decoder('..---') = '2';
    decoder('...--') = '3';
    decoder('....-') = '4';
    decoder('...--') = '5';
    decoder('-....') = '6';
    decoder('--...') = '7';
    decoder('---..') = '8';
    decoder('----.') = '9';
    decoder('.-.-.-') = '.';
    decoder('--..--') = ',';
    decoder('..--..') = '?';
    decoder('-...-') = '=';

end

Contact us