I am trying to decipher a message hidden within a very noisy audio file(.wav)(I think it is white noise with an additional low drone). The message is a six digit number. I have not have any further details about the noise.
I attempted to use a low-pass filter in the hopes that eliminating most of the higher frequencies would allow me to hear the numbers but, I seem to be unable to also get rid of enough of the low drone to hear the voice well enough. My attempt was as follows (the employed function
freq_space_low_pass_filter is included at the end):
[data, SampleRate, NbitsPerSample]=wavread('noisy_msg6.wav'); y=data(:,1); % we will work only with one channel in this demo N=length(y); %number of sample points t=( (1:N)*1/SampleRate ).'; % time spacing is 1/SampleRate and we want column vector Y=fft(y); spectrum_freq=fourier_frequencies(SampleRate, N); Freq3db=100; [spectrum_filtered,g_vs_freq]=freq_space_low_pass_filter(Y, SampleRate, Freq3db); y_filtered=ifft(spectrum_filtered); y_filtered=real(y_filtered); wavwrite(y_filtered/(0.1+max(y_filtered)), SampleRate, NbitsPerSample, 'noisy_msg6_filtered.wav'); %%%%%%%%down sampling%%%%%%%% indexes=(abs(spectrum_freq) < 10*Freq3db); spectrum_freq_down_sampled = spectrum_freq(indexes); spectrum_down_sampled = spectrum_filtered(indexes); N_down_sampled = length(spectrum_down_sampled); spectrum_down_sampled=spectrum_down_sampled*N_down_sampled/N; SampleRate_down_sampled=SampleRate*N_down_sampled/N; y_down_sampled=real(ifft(spectrum_down_sampled)); t_down_sampled = ( (1:N_down_sampled)*1/SampleRate_down_sampled ).'; sound(y_down_sampled, SampleRate_down_sampled)
function [spectrum_filtered,g]=freq_space_low_pass_filter(spectrum, SampleRate, Freq3db) %% applies low pass filter in the frequency domain % spectrum - result of fft on time series data (column vector is expected) % SampleRate - measured in Hz, 1/dt where dt spacing of the points in time domain % Freq3db - desired 3db roll off point in Hz N=length(spectrum); function G=filter_gain(freq, Freq3db) G=1./(1+1i*freq/Freq3db); % this corresponds to low pass RC filter end spectrum_freq=fourier_frequencies(SampleRate, N); % calculate filter gain for each spectrum frequency g=filter_gain(spectrum_freq, Freq3db); spectrum_filtered=spectrum.*g; end
Plot of the signal spectrum: