-
Notifications
You must be signed in to change notification settings - Fork 102
/
Copy pathNLMS_mss.m
98 lines (90 loc) · 2.82 KB
/
NLMS_mss.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
%NLMS
%Marko Stamenovic
%April 28, 2016
mus = [0.01 0.05 0.1 0.5 1 2];% 0.5 1];
for j = 1:length(mus)
for i = 1:100
%%INITIALIZE VALUES%%
% generate input signal
M=128; %buffer size (num filter weights)
x=randn(20000,1); %input signal
x=x/max(x); %sample rate
fs=8000; %number of samples of the input signal
N=length(x); %length of input signal
muOG = mus(j);
% generate known filter coefficients
Pz=(0.5*[0:127]).^2; %linear coefficients
%Pz=randn(128,1); %random coefficients
ylim = max(Pz)*1.20;
ymin = min(Pz)-.2*max(Pz);
% generate filtered input signal == desired signal
d=conv(Pz,x); %input signal filtered by known filter Pz (primary path)
%% LMS FOR MAIN ANC %%
%initalize Wz filter values
Wz=zeros(M,1);
emean=zeros(N,1);
%Make sure that x and d are column vectors
x=x(:);
d=d(:);
%LMS
for n=M:N
xvec=x(n:-1:n-M+1); %input has to be in reverse orxer
%adaptively update mu
mu(n) = muOG/(xvec'*xvec); %too slow at nonlinear transfer fxn, converges for linear transfer function
e(n)=d(n)-Wz'*xvec; %update error
Wz=Wz+mu(n)*xvec*(e(n)); %update filter coefficient
%visualize learned filter in realtime
% plot(Pz)
% hold on
% plot(Wz)
% axis([0 inf ymin ylim])
% title(sprintf('n=%f time=%fs error = %f mu=%f',n-M, (n-M)/fs, e(n), mu(n-M+1)))
% hold off
% legend('Input coefficients','Learned Coefficients')
% drawnow;
end
e=e(:);
emean = (emean(:)+e);
end
emean=(emean)/i;
if sum(isinf(emean))>0
emean(~isinf(emean))=1e3;
eall(j,:)=emean;
elseif max(emean)>1e4
for l = 1:length(emean)
if abs(emean(l)) > 1e3
emean(l)=1e3;
end
end
eall(j,:)=emean;
else
[eall(j,:),q]=(envelope(abs(emean),150,'peaks'));
end
end
figure
for i = 1:length(mus)
plot(10*log10(abs(eall(i,:))))
hold on
end
title('Convergence Time in Cycles')
ylabel('Error (dB)');
xlabel('Cycles');
hleg=legend('0.01','0.05','0.1','0.5','1.0', '2.0');
htitle=get(hleg,'Title');
set(htitle,'String','mu');
% %% PLOT RESULTS %%
% figure
% subplot(2,1,1)
% plot(e)
% title('Convergence Time in Cycles')
% ylabel('Amplitude');
% xlabel('Cycles');
% legend('Error');
% subplot(2,1,2)
% stem(Pz)
% hold on
% stem(Wz, 'r*')
% title('Input Coefficients vs Learned Coefficients')
% ylabel('Amplitude');
% xlabel('Numbering of filter tap');
% legend('Input Coefficients', 'learned coefficients')