Sign in

username:

password:



Not a member?

Search audiodsp



Search tips

Subscribe to audiodsp



audiodsp by Keywords

AAC | ADPCM | Convolution | DAFx | FFT | IIR | Mixer | MP3 | MPEG | MPEG-4

Discussion Groups

Discussion Groups | Audio Signal Processing | Noise Cancellation using Auto and Cross-Correlation

Technical discussions related to Audio Signal Processing (digital effects, acoustics, noise reduction, musical signal processing, etc).

  

Post a new Thread

Noise Cancellation using Auto and Cross-Correlation - dwch...@gmail.com - May 5 8:57:59 2008



Hello,

I'm trying to create an FIR filter to cancel some noise in an audio sample by looking back at
the previous samples (some m samples back) to create the filter weight for the current sample
and then incrementing (similar to a queue where a new sample enters). 

I am using the auto and cross-correlation between the noise and the noisy signal to find the
filter coefficients and not having any luck. I am using the following formulas:
-Cross-correlation between noise and noisy signal (p) is noisy(n-m:n)*noise(n-m:n)
-Autocorrelation for the noise (r) is noise(n-m:n)*noise(n-m:m)'
-Filter Weight (W) is r^-1 * p

I am then using the Filter Weight (W) to find out how much noise to subtract from the noisy
signal with W' * noise(some range).

My MATLAB code is as follows:
% Load Wave File
[original, Fs, nbits] = wavread('Original.wav');
original = original(1:10);   % Trying a small chunk first

% Generate noise and add it to the signal
noise = (0.04).*randn(1, length(original))';
noisy = original + noise;
wavwrite(noisy, Fs, nbits, 'Noisy_Output.wav');

m = 3;             % How far in the past do we look to determine weight

% We loop through the entire audio sample, calculating new weights
% for the current sample by looking at the previous 3 samples, filtering 
% and then repeating the process
for n = 1:8,
    % Calculate Correlations p and r
    temp = xcorr(noise(n:n+m-1), noisy(n:n+m-1), 'unbiased');
    p = temp(m:m+m-1);        % Take second half of matrix

    r = xcorr2(noise(n:n+m-1), noise(n:n+m-1)');
    r = fliplr(r);
    R = pinv(r);

    % Calculate Filter Weight
    W = R * p;
    
    % Find what to subtract and take it out of the noisy signal
    to_subtract(m+n-1) = W'*noise(n:n+m-1);    
    filtered(n+m-1) = noisy(n+m-1) - to_subtract(n+m-1)';
end

Unfortunately the results are not correct (even for a small sample) and I think it might be due
to my filter coefficient calculation (i.e. xcorr and xcorr2 not working). I already tried
without the flips and using them unmodified, but reading the documentation, I believe this is
correct. At the same time, it's not working and thus any help would be appreciated.

Thanks!
-Daniel

------------------------------------



(You need to be a member of audiodsp -- send a blank email to audiodsp-subscribe@yahoogroups.com )