0
votes

I am doing experiments on a filtering technique for noise reduction. My samples in the data set are audio files (.wav), I therefore have: original recording audio files and I mix them with noise, so I get mixed (noisy signals), I pass these noisy signals through the filtering algorithm, the outputs are filtered or noise reduced audio signals.

So in total I have the following:

  1. Original audio files (without noise)
  2. Noise (that need to be added to the original signals)
  3. Mixed (Noisy files)
  4. Filtered (noise reduced)

I need to get how much dB the filter can reduce. I think of SNR as a measure that could give such indication about the performance of the filtering algorithm and a comparison before filtering and after filtering.

So kindly does anybody know:

  1. Is SNR a good objective measure to evaluate the performance of the algorithm and measure the enhancement?
  2. Are there any other suitable objective measures that can be used in this case?
  3. What will be the situation if field recording already contains noise and I don't need to add noise? (the noise in my case is wind)

Here is a simple MATLAB code I wrote to compute SNR:

[signal]=audioread('Original.wav');
[noise]=audioread('Noise.wav');
[noise_reduced_signal]=audioread('Filtered.wav');
[noisysignal]=audioread('Noisy.wav');

snr_before = mean( signal.^ 2 ) / mean( noise .^ 2 );
snr_before_db = 10 * log10( snr_before ) % in dB
%===================================================================%
% After noise reduction, the residual noise can be calculated as the difference 
% of the wanted signal and the actual signal. Calculation of SNR is then straightforward:
%===================================================================%
snr_after = mean( signal .^ 2 ) / mean( noise_reduced_signal .^ 2 ); 
snr_after_db = 10 * log10( snr_after ) % in dB
Diff = snr_after_db - snr_before_db;
disp(['Diff  = ' num2str(Diff) ' dB'])
1

1 Answers

0
votes

Signal to noise ratio is a good figure of merit if you are interested in the proportion of noise you have in your signal. So, if you want to make the point that you remove noise from the signal, then its a good choice. Another figure-of-merit would be the spurious free dynamic range indicating the distance between your signal and the strongest frequency bin of the spurious signal (noise). I think instead of

    snr_after = mean( signal .^ 2 ) / mean( noise_reduced_signal .^ 2 );

you might want

    snr_after = mean( signal .^ 2 ) / mean( (noise_reduced_signal - signal_delayed).^ 2 );

to get the filtered noise only. Of course you need to take the delay into account that is introduced by your filter; and you could do this by adding a delay to your initial signal.