-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathgeometria.m
More file actions
executable file
·90 lines (77 loc) · 2.75 KB
/
geometria.m
File metadata and controls
executable file
·90 lines (77 loc) · 2.75 KB
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
%Crea direttamente i ritardi associati a ciascuna sorgente per ciascun
%microfono, nel caso di geometria 2 microfoni e 3 sorgenti disposte su una
%circonferenza che ha centro nella schiera, a distanza R
%
%
% Variabili:
% fs= frequenza di campionamento temporale dei segnali audio
% d= distanza della schiera, ovvero periodo di campionamento spaziale, si
% calcola fissando quale direzione di arrivo si vuole poter individuare al
% Nyquist, il caso più generale se non si ha info sulle DOA è fissare il
% Nyquist a 90°, e dunque d<= c/(2*fmax(di tutti i segnali audio
% presenti)*sin(angoloDOA)=c/fmax*2 (espresso in metri)
% R= vettore raggi delle circonferenze sulle quali dispongo le sorgenti
% ang= vettore angoli ai quali dispongo le tre sorgenti
%
%
% Output:
% rit1= vettore che contiene i 2 ritardi in campioni rispetto alla prima
% sorgente ricevuta dal microfono, che segna il tempo zero per esso
% rit2 =uguale ma per l altro mic
% com= indica se può servire, quale dei microfoni riceve per primo in
% assoluto una delle sorgente, cioè quale dei 2 mic serve da base per
% temporizzare
function [diff,com,T]=geometria(fs,ang,R,d)
rit1=zeros(3,1);
rit2=zeros(3,1);
ang=deg2rad(ang);
%tempi di arrivo delle sorgenti al mic1, il suono in aria si propaga a
%340m/s, si suppone si propaghi un onda piana, in realtà questa
%approssimazione vale per grandi distanze sorgente/microfono
c=340;
%Il problema è ben posto se le sorgenti vengono disposte in
%ordine numerico da sinistra verso destra, e così i microfoni
if ang(1)<0
t11=1/c*(R(1)-d/2*cos(pi/2+ang(1))); %mic1 sorg 1
t21=1/c*(R(1)+d/2*cos(pi/2+ang(1)));
else
t11=1/c*(R(1)+d/2*cos(pi/2-ang(1)));
t21=1/c*(R(1)-d/2*cos(pi/2-ang(1)));
end;
if ang(2)<0
t12=1/c*(R(2)-d/2*cos(pi/2+ang(2))); %mic1 sorg 1
t22=1/c*(R(2)+d/2*cos(pi/2+ang(2)));
else
t12=1/c*(R(2)+d/2*cos(pi/2-ang(2)));
t22=1/c*(R(2)-d/2*cos(pi/2-ang(2)));
end;
if ang(3)<0
t13=1/c*(R(3)-d/2*cos(pi/2+ang(3))); %mic1 sorg 1
t23=1/c*(R(3)+d/2*cos(pi/2+ang(3)));
else
t13=1/c*(R(3)+d/2*cos(pi/2-ang(3)));
t23=1/c*(R(3)-d/2*cos(pi/2-ang(3)));
end;
%Chi arriva prima? Il tempo di arrivo più breve in assoluto fa da base
%temporale (ritardo zero), per tutti gli altri tempi di arrivo, si riesce a
%capire osservando i pedici dei tempi di arrivo se il primo a registrare un
%contributo è il mic1 o il mic2
t1=[t11 t12 t13];
t2=[t21 t22 t23];
T=[t11 t12 t13 t21 t22 t23]; %vettore tempi di arrivo
[base, ind]=min(T);
%Quale microfono uso come base di temporizzazione?
%La variabile com indica quale microfono "comanda"
if ind>3
com=2;
else
com=1;
end
%Calcolo dei ritardi in campioni
for i=1:3
rit1(i,1)=(t1(i)-T(ind))*fs;
end
for i=1:3
rit2(i,1)=(t2(i)-T(ind))*fs;
end
diff=rit2-rit1; %differenze tra i tempi di arrivo sono le informazioni rilevanti