-
Notifications
You must be signed in to change notification settings - Fork 35
/
Copy pathtx_bin_mmse.asv
executable file
·208 lines (131 loc) · 4.44 KB
/
tx_bin_mmse.asv
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
%% Stimatore MMSE per tx binaria antipodale
clear all;
close all;
clc;
%
% for i=1:1000 %numero osservazioni
% sigmaw=1;
% w=sigmaw*randn;
% the=randsrc;
%
% x=the+w;
%
% c(i)=x;
% end
%
% %figure,hist(c,500),title('Istogramma delle osservazioni')
%
%
% log_px=log(1/sqrt(8*pi*sigmaw))-(c.^2+1)/sigmaw;
%
% the_mmse=c(1:end-1)+sigmaw*(diff(log_px));
%figure,hist(the_mmse,500),title('Istogramma della stima di Theta MMSE')
%prova distribuzione delle osservazioni
x=-7:.01:7;
sigmaw=[0.1 0.2 0.5 1 3];
col=['r' 'k' 'b' 'm' 'g'];
figure(1),
for i=1:5
px=1/sqrt(8*pi*sigmaw(i))*(exp(-((x+1).^2/(2*sigmaw(i))))+exp(-((x-1).^2/(2*sigmaw(i)))));
logpx=log(px);
%stima della derivata
px_dx=diff(logpx)./0.01;
%stima del the_mmse
the_mmse=x(1:end-1)+sigmaw(i)*px_dx;
w_mmse(i,:)=x(1:end-1)-the_mmse;
% figure,subplot(1,2,1),plot(x,px,'r'),title('Pdf delle osservazioni (f chiusa)'),...
% subplot(1,2,2),plot(x,logpx,'k'),title('Log pdf osservazioni')
%figure,subplot(1,2,1),plot(x(1:end-1),px_dx,'b'),title('Stima della derivata logaritmica di Px'),...
hold on,plot(x(1:end-1),the_mmse,col(i)),axis([min(x)-1 max(x)+1 min(x)-1 max(x)+1]),...
title('Stimatore MMSE'),xlabel('x'),ylabel('E[the|x]'),hold on,
end
hold on, plot(x(1:end-1),x(1:end-1),'k-.'),legend('s_w=0.1','s_w=0.3','s_w=0.5','s_w=1','s_w=3','lineare')
%stimatore MMSE del rumore
figure,
for i=1:5
hold on,plot(x(1:end-1),w_mmse(i,:),col(i)),axis([min(x)-1 max(x)+1 min(x)-1 max(x)+1]),...
title('Stimatore MMSE rumore'),legend('s_w=0.1','s_w=0.3','s_w=0.5','s_w=1','s_w=3'),xlabel('x'),ylabel('E[w|x]'),hold on,
end
hold on, plot(x(1:end-1),x(1:end-1),'k-.')
%% Tx multilivello e stima MMSE
clear all;
close all;
clc;
%in questo caso il segnale è multilivello, ad esempio 4 livelli: -3 -1 1 3
x=-7:.01:7;
sigmaw=[0.1 0.2 0.5 1 3];
col=['r' 'k' 'b' 'm' 'g'];
%figure(1),
%for i=1:5
i=3;
px=1/sqrt(32*pi*sigmaw(i))*(exp(-((x+1).^2/(2*sigmaw(i))))+exp(-((x-1).^2/(2*sigmaw(i))))+exp(-((x+3).^2/(2*sigmaw(i))))+exp(-((x-3).^2/(2*sigmaw(i)))));
logpx=log(px);
%stima della derivata
px_dx=diff(logpx)./0.01;
%stima del the_mmse
the_mmse=x(1:end-1)+sigmaw(i)*px_dx;
w_mmse(i,:)=x(1:end-1)-the_mmse;
figure,subplot(1,2,1),plot(x,px,'r'),title('Pdf delle osservazioni (f chiusa)'),...
subplot(1,2,2),plot(x,logpx,'k'),title('Log pdf osservazioni')
figure,subplot(1,2,1),plot(x(1:end-1),px_dx,'b'),title('Stima della derivata logaritmica di Px'),...
figure,hold on,plot(x(1:end-1),the_mmse,col(i)),axis([min(x)-1 max(x)+1 min(x)-1 max(x)+1]),...
title('Stimatore MMSE'),xlabel('x'),ylabel('E[the|x]'),hold on,
%end
hold on, plot(x(1:end-1),x(1:end-1),'k-.'),legend('s_w=0.1','s_w=0.3','s_w=0.5','s_w=1','s_w=3','lineare')
%stimatore MMSE del rumore
figure,
%for i=1:5
hold on,plot(x(1:end-1),w_mmse(i,:),col(i)),axis([min(x)-1 max(x)+1 min(x)-1 max(x)+1]),...
title('Stimatore MMSE rumore'),legend('s_w=0.1','s_w=0.3','s_w=0.5','s_w=1','s_w=3'),xlabel('x'),ylabel('E[w|x]'),hold on,
%end
hold on, plot(x(1:end-1),x(1:end-1),'k-.')
%% Mistura Gaussiana (GMM)
clear all;
close all;
clc;
%Definisco le 2 pdf che andranno a comporre la mistura, e la prob
%dell'evento di scelta
p=0.5;
mu_a=3; %media
sig_a=5; %varianza
mu_b=1;
sig_b=2;
sig_w=0.5;
%Simulazione di mistura gaussiana
binz=-20:0.1:20;
N=zeros(size(binz));
Nu=10000;
for k=1:200
for i=1:Nu
res=binornd(1,p);
if (res==0)
a=mu_a+sig_a*randn; %estrazione da vc alfa
x(i)=a+sig_w*randn;
else
b=mu_b+sig_b*randn; %estrazione da vc beta
x(i)=b+sig_w*randn;
end
end
N=N+histc(x,binz);
end
N=N./sum(N); %stima della pdf delle osservazioni
figure,plot(binz,N),title('Stima della pdf delle osservazioni vs pdf calcolata'),hold on,
%Calcolo teorico delle pdf alfa e beta
clear x;
x=binz;
Ga_x=(1/(sqrt(2*pi*sig_a)))*exp(-((x-mu_a).^2)/(2*sig_a));
Gb_x=(1/(sqrt(2*pi*sig_b)))*exp(-((x-mu_b).^2)/(2*sig_b));
%Definisco la pdf del rumore (gaussiano bianco, dunque a valore medio nullo e incorrelato)
Gw_x=(1/(sqrt(2*pi*sig_w)))*exp(-(x.^2)/(2*sig_w));
%Calcolo la pdf teorica delle osservazioni con il GMM
p=0.5;
pxa_rid=conv(Ga_x,Gw_x,'same'); %va rinormalizzata
pxa_rid=pxa_rid./sum(pxa_rid);
pxb_rid=conv(Gb_x,Gw_x,'same'); %va rinormalizzata
pxb_rid=pxb_rid./sum(pxb_rid);
%previsione teorica della pdf delle osservazioni, da confrontare poi con la
%simulazione
px=p*pxa_rid+(1-p)*pxb_rid; %va rinormalizzata
px=px./sum(px);
%La plotto sopra, e vedo se coincide con la simulazione
plot(binz,px,'r')