user12237730
user12237730

Reputation:

Morse Audio Decoder on MATLAB

I was programming a morse audio decoder on Matlab but it didn't work. I have multiple files, but my decoder doesn't work, I also have an encoder which my partner gave me and it works.

I cannot find my mistakes, I cannot even create a struct. Can you please help me?

my cells T is 47*2 is like this:

'A' '01'

'B' '1000'

'C' '1010'

'D' '100'

'E' '0'

function decoded = morse_decode(signal, fs)

C = readtable('morsecode.dat', 'ReadVariableNames', false, ...
'Format', '%s%s', 'Delimiter', 'space');

T = table2cell(C);

for i=1 : length(T)*2
    if isa(T{i}, 'numeric')
        T{i} = num2str(T{i});
    end
end

struc = cell2struct(T(:,1), T(:,2));
clear T

morse2char = @(m) getfield(struc, m);


[b,a] = butter(7,1/20);
signal = filter(b,a,signal);
env = abs(real(hilbert(signal)));
fc=600;
[b,a] = butter(2,1/fc/5);
env=filter(b,a,env);


thresh = mean(env)*0.9;


dur=find(env <= thresh,1) - find(env>thresh,1);
if (dur <0)
    dur = find(env>thresh,1) - find(env<= thresh,1);
    env = env(dur+1:end);
    dur = find(env <= thresh,1) - find(env>thresh,1);
end
env=env(dur+1:end);
dists = [dur,1];
dit = dur;

next = find(env>thresh,1);

while (any(next))
    if(next<dit)
        dit=next;
    end   
    dists=[dists; [next,0]];
    env = env(next+1:end);
    next=find(env<thresh,1);
    if (next<dit)
        dit=next;
    end   
    dists= [dists; [next,1]];
    env= env(next+1:end);
    next = find(env>thresh,1);       
end


letter="";
word="";
for i=1:(rows(dists))
    if(dists(i,2)==i)
        if (dists(i,2)<=dit*1.8)
            letter=[letter "0"];
        else
            letter=[letter "1"];
        end
    else
        if (dists(i,1) > dit * 3.9)
            word = [word; [letter; "break"]];
            letter = "";
        elseif (dists(i,1) > dit*1.5)
            word = [word; (letter)];
            letter = "";
        end
    end
end
word = [word; (letter)];


decoded = morse2char(deblank(word(1,:)));
for i=2:(rows(word))
    if (strcmpi(strtrim(word(i,:)),"break") ==1)
        decoded = [decoded (" ")];
    else
        decoded = [decoded (morse2char(deblank(word(i,:))))];
    end
end




decoded = []; %Replace with actually decoded text

Upvotes: 0

Views: 707

Answers (1)

user12237730
user12237730

Reputation:

In MATLAB you cannot create a struct with a variable names with number but in Octave it works.

Upvotes: 1

Related Questions