Technical discussion about Matlab and issues related to Digital Signal Processing.
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