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