Tuner Upper Removal Demonstration: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
(4 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
<nowiki> |
|||
% Demonstration of LMS algorithm for noise cancellation. Tuner upper problem. |
|||
% Rich Kozick, Spring 1997 |
|||
% Rob Frohne's modifications for Macintosh 2000 |
|||
% Desired signal |
|||
% and Linux 2006 or so. |
|||
⚫ | |||
Totaltime=1; |
|||
<nowiki>speak('Hit a key and speak the signal.');</nowiki> |
|||
⚫ | |||
pause; |
|||
Fs=8000; % 8 Khz sampling for Linux. |
|||
[st, Fs] = recordsound(Totaltime, 22050, 1); |
|||
T0 = 2; % 2 seconds |
|||
⚫ | |||
⚫ | |||
system("espeak 'After hitting enter in the command window, speak the signal.'"); |
|||
% Interference + random noise |
|||
st = record(T0,Fs); |
|||
speak('Hit a key and make the noise!'); |
|||
%st=wavread('Hello.wav'); |
|||
pause; |
|||
st=st(:,1); |
|||
[nt,Fs] = recordsound(Totaltime, 22050, 1); |
|||
⚫ | |||
⚫ | |||
%Sign = 0.01; |
|||
⚫ | |||
%Dn=20; % Delay of the noise that appears in y. |
|||
%n = n(1:Ls) + Sign*randn(Ls,1); |
|||
⚫ | |||
%an = [0 .01 -.5 1 -.5 .1 .01 0]; |
|||
T0=length(st)/Fs; |
|||
an = 4*[0 0 0 0 0 0 0 0 0 0 0 0 0 0 .5 1 .5]; |
|||
% Make the tuner upper noise or even several at the same time. |
|||
bn = [1]; |
|||
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)); |
|||
%bode(sys); |
|||
%figure(1); |
|||
% Add him or them to the desired signal. |
|||
nf = filter(an,bn,n); |
|||
⚫ | |||
%nf = [nf(Dn:(Ls)); zeros(Dn-1,1)] + Sign*randn(Ls,1); |
|||
y = s + nf; |
|||
system("espeak 'Here is the noisy signal.'") |
|||
Sigx = 0.01; |
|||
soundsc(x,Fs); |
|||
bx = [1]; % bx and ax are filtering on n to produce x |
|||
ax = [1]; |
|||
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); |
|||
⚫ | |||
h = ones(N,1); |
|||
⚫ | |||
N = 20; % Length of adaptive filter |
|||
for k=N:Ls |
|||
⚫ | |||
xk = x(k:-1:(k-N+1)); |
|||
y(k) = h'*xk'; |
|||
mu = 1/(10*N*var(x)); |
|||
e(k) = y(k); |
|||
h = h - 2*mu*e(k)*xk'/(xk*xk'); |
|||
end |
end |
||
% The signal estimate is in the vector e |
% 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); |
|||
</nowiki> |
Latest revision as of 13: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);