title: Filter message from noisy voice signal
body: <p>I am trying to decipher a message hidden within a very noisy(sounds like white noise with an additional low drone) audio file(.wav).  The message is a six digit number.  I have not been informed of any of the details of 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):</p>
  
  <pre><code>[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) &lt; 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)
  </code></pre>
  
  <hr>
  
  <pre><code>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;
  </code></pre>
  
  <h2>    end</h2>
  
  <p>Any and all assistance will be greatly appreciated.  Thanks!</p>
  
  <p><img src="https://i.stack.imgur.com/ImwIl.png" alt="Plot of my filtered and the original signal"></p>