Difference between revisions of "Tuner Upper Removal Demonstration"

From Class Wiki
Jump to: navigation, search
 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
% Demonstration of LMS algorithm for noise cancellation.
 
  +
<nowiki>
% Rich Kozick, Spring 1997
 
  +
% Demonstration of LMS algorithm for noise cancellation. Tuner upper problem.
% Rob Frohne's modifications for Macintosh 2000.
 
  +
% Rich Kozick, Spring 1997
% Desired signal
 
  +
% Rob Frohne's modifications for Macintosh 2000
clear all
 
  +
% and Linux 2006 or so.
Totaltime=1;
 
  +
speak('Hit a key and speak the signal.');
 
  +
pause;
 
  +
clear all
[st, Fs] = recordsound(Totaltime, 22050, 1);
 
  +
Fs=8000; % 8 Khz sampling for Linux.
s = st';
 
  +
T0 = 2; % 2 seconds
Ls = length(s);
 
  +
% Interference + random noise
 
  +
system("espeak 'After hitting enter in the command window, speak the signal.'");
speak('Hit a key and make the noise!');
 
  +
st = record(T0,Fs);
pause;
 
  +
%st=wavread('Hello.wav');
[nt,Fs] = recordsound(Totaltime, 22050, 1);
 
  +
st=st(:,1);
n = nt';
 
  +
%Sign = 0.01;
 
  +
system("espeak 'Here is the signal.'")
%Dn=20; % Delay of the noise that appears in y.
 
  +
soundsc(st);
%n = n(1:Ls) + Sign*randn(Ls,1);
 
  +
%an = [0 .01 -.5 1 -.5 .1 .01 0];
 
  +
Ls = length(st);
an = 4*[0 0 0 0 0 0 0 0 0 0 0 0 0 0 .5 1 .5];
 
  +
T0=length(st)/Fs;
bn = [1];
 
  +
% Make the tuner upper noise or even several at the same time.
%sys = tf(an,bn,1/Fs);
+
t=0:1/Fs:T0-1/Fs;
%bode(sys);
+
n = 10*(sin(2*pi*100*pi*t) + cos(2*pi*600*t) + 1.5*sin(2*pi*850*t));
%figure(1);
+
nf = filter(an,bn,n);
+
% Add him or them to the desired signal.
%nf = [nf(Dn:(Ls)); zeros(Dn-1,1)] + Sign*randn(Ls,1);
+
x = st' + n;
y = s + nf;
+
Sigx = 0.01;
+
system("espeak 'Here is the noisy signal.'")
bx = [1]; % bx and ax are filtering on n to produce x
+
soundsc(x,Fs);
ax = [1];
+
Dx = 1; % Delay of n that appears in x
+
N = 64; % Length of adaptive filter
x = filter(bx, ax, n);%x = [x(Dx:(Ls)); zeros(Dx-1,1)] + Sigx*randn(Ls,1);
+
%x = n + Sigx*randn(Ls,1);
+
% LMS algorithm for adaptive noise cancellation
speak('Here is the noisy signal.')
+
soundsc(y,Fs);
+
h = ones(N,1);
N = 20; % Length of adaptive filter
+
mu = 0.1;
% LMS algorithm for adaptive noise cancellation
+
for k=N:Ls
h = zeros(N,1);
+
xk = x(k:-1:(k-N+1));
mu = 1/(10*N*var(x));
+
y(k) = h'*xk';
%mu = 1.0;
+
e(k) = y(k);
for k=N:Ls xk = x(k:-1:(k-N+1)); nhat(k) = h'*xk; e(k) = - y(k) + nhat(k); h = h - mu*e(k)*xk;%/(xk'*xk);
+
h = h - 2*mu*e(k)*xk'/(xk*xk');
end
+
end
% The signal estimate is in the vector e
+
speak('Here is the cleaned signal.');
+
% The signal estimate is in the vector e
soundsc(e,Fs);
+
system("espeak 'Here is a scaled version of the tail of the cleaned signal.'");
  +
skip =1000;
  +
soundsc(e(skip:length(e)),Fs);
  +
</nowiki>

Latest revision as of 14:43, 6 December 2015

% Demonstration of LMS algorithm for noise cancellation.  Tuner upper problem.
% Rich Kozick, Spring 1997
% Rob Frohne's  modifications for Macintosh 2000
% and Linux 2006 or so.


clear all
Fs=8000; % 8 Khz sampling for Linux.
T0 = 2;  % 2 seconds

system("espeak 'After hitting enter in the command window, speak the signal.'");
st = record(T0,Fs);
%st=wavread('Hello.wav');
st=st(:,1);

system("espeak 'Here is the signal.'")
soundsc(st);

Ls = length(st);
T0=length(st)/Fs;
%  Make the tuner upper noise or even several at the same time.
t=0:1/Fs:T0-1/Fs;
n =  10*(sin(2*pi*100*pi*t) + cos(2*pi*600*t) + 1.5*sin(2*pi*850*t));

% Add him or them to the desired signal.
x = st' + n;

system("espeak 'Here is the noisy signal.'")
soundsc(x,Fs);

N = 64;         % Length of adaptive filter

% LMS algorithm for adaptive noise cancellation

h = ones(N,1);
mu = 0.1;
for k=N:Ls
  xk = x(k:-1:(k-N+1));
  y(k) = h'*xk';
  e(k) = y(k);
  h = h - 2*mu*e(k)*xk'/(xk*xk');
end

% The signal estimate is in the vector e
system("espeak 'Here is a scaled version of the tail of the cleaned signal.'");
skip =1000;
soundsc(e(skip:length(e)),Fs);