This is some work from one of my signal processing classes at Case Western Reserve University. For the assignment, we were given and told to find the hidden message in it:
I started by plotting my signal just to see what I was working with. It wasn’t very helpful.
The first thing that I tried was creating a spectrogram of the signal between the frequencies 0 and 5000 Hz.
There is a thing that looks like a signal around 1000 Hz, and the stuff above 2000 Hz looks useless, so I created a lowpass filter that filtered out everything above 2000 Hz. I chose to use a Butterworth filter because that is the one that I used in Lab 8 and I could just paste the code in. I set the passband frequency to 1900 Hz and the stopband to 2000 Hz.
My new spectrogram is below. It seems to have worked pretty well.
My filtered signal is plotted below. It is really hard to see the signal here, but looking at this graph was the point where I finally had the idea that the signal was in Morse code.
I noticed long and short sections in the signal along with different slightly different length spaces that could be used to find the borders between letters and words. I zoomed in on the first 50 seconds below to make this signal more obvious.
First 50 seconds from the picture above are: “Minions are on the move. “
The entire message directly transcribed is: “Minions are on the move. Expected arrival June 30 2017. Intercepted communication. Sa. La. Ka. Bi. Do.”
According to a Minionese to English translator, that I found online, “Sa La Ka” means “How dare you!” and “Bi Do” means “I’m sorry.”
This would make my final decoding, “Minions are on the move. Expected arrival June 30 2017. Intercepted communication. How dare you! I’m sorry.”
Thanks to Dr. Matthew Schieffer for this creative challenge, and (through his class) for teaching us how to separate the signal from the noise.
The code that I used for the program is below if anybody wants to follow along in MatLab:
% By: T—-s Hampton
signal = audioread(‘msg2.wav’); %Convert the .wav to a matrix
dt = 221.6529 / 2216529 %This is the length of the signal divided by the number of data points
t = 0 : dt : 221.6529 – dt; %Make the time vector
window = 1000;
overlap = 500;
Fs = 1/dt;
f = [0:1:Fs./2];
spectrogram (signal, window, overlap, f, Fs, ‘yaxis’)
% Filtering out all of the high frequency signals
Wp=1900*2*pi; %passband freq (rad/sec)
Ws=2000*2*pi; %stopband freq (rad/sec)
Gp=2; %attenuation in passband (dB) (no more than 2dB below 1)
Gs=20; %attenuation in stopband (dB) (no less than 20dB below 1)
[n,Wc] = buttord(Wp,Ws,Gp,Gs,’s’); %get the appropriate order and cutoff frequency
[num,denom]=butter(n,Wc,’low’,’s’); %get the coefficients of the filter (transfer fxn)
[digital_num,digital_denom] = bilinear(num,denom,Fs);
filtered_signal = filter(digital_num,digital_denom,signal);
spectrogram (filtered_signal, window, overlap, f, Fs, ‘yaxis’)