├── README.md ├── generateSignal.m ├── example.m └── SRP_PHAT_SRC.m /README.md: -------------------------------------------------------------------------------- 1 | Acoustic source sound localization using srp-phat in matlab. 2 | 3 | #Requiments: 4 | 5 | - Phased Array System Toolbox (https://www.mathworks.com/products/phased-array.html) 6 | 7 | -------------------------------------------------------------------------------- /generateSignal.m: -------------------------------------------------------------------------------- 1 | function [semnal]=generateSignal(fs, mics, t, source) 2 | 3 | s2=rand(fs*t,1); 4 | 5 | [a,b]=size(mics); 6 | 7 | dist=zeros(1,a); 8 | for i=1:a 9 | dist(i)=sqrt( (source(1)-mics(i,1))^2 +(source(2)-mics(i,2))^2 +(source(3)-mics(i,3))^2); 10 | end 11 | 12 | [distS, index]=sort(dist); 13 | 14 | Dd=zeros(1, a-1); 15 | ind=1; 16 | for i=1:1 17 | for j=i+1:a 18 | Dd(ind)=abs(distS(i)-distS(j)); 19 | ind=ind+1; 20 | end 21 | end 22 | 23 | V_s=340; %m/s 24 | Dt=(Dd*1)/V_s; 25 | 26 | xes=round((1*fs)*Dt); 27 | 28 | 29 | 30 | semnal=zeros(a, fs*t); 31 | semnal(index(1), :)=s2'; 32 | 33 | for i=2:a 34 | s_aux=[rand(xes(i-1),1)' s2(1:fs*t-(xes(i-1)))']; 35 | semnal(index(i),:)=s_aux; 36 | 37 | end 38 | semnal=semnal'; 39 | end 40 | -------------------------------------------------------------------------------- /example.m: -------------------------------------------------------------------------------- 1 | clear all 2 | close all 3 | clc 4 | 5 | %micrphones position 6 | mics=[ 7 | 0,0.20,0.34; 8 | -0.32, 0,0; 9 | 0.32, 0,0; 10 | 0,0.62, 0; 11 | ]; 12 | 13 | fs=41000;% sampling frequency [Hz] 14 | 15 | t=1;%time [s] - 16 | 17 | %volume limit[x, y, z] 18 | V_Min=[-5; 5; 5]; %[m] 19 | V_Max=[5; 5; 5]; 20 | 21 | %genereate a random source 22 | source=V_Min + (V_Max - V_Min).*rand(3,1); 23 | 24 | [signal]=generateSignal(fs, mics, t, source); 25 | 26 | 27 | 28 | %number of points 29 | n=4000000; 30 | 31 | [sourceD]=SRP_PHAT_SRC(mics, fs, signal, n, V_Min, V_Max); 32 | 33 | 34 | figure 35 | plot3(source(1),source(2),source(3), 'd','MarkerSize',6,'MarkerFaceColor','blue') 36 | hold on 37 | plot3(sourceD(1),sourceD(2),sourceD(3), 'o','MarkerSize',6,'MarkerFaceColor','red') 38 | plot3(mics(:,1),mics(:,2),mics(:,3), 'x','MarkerSize',6,'Color','blue') 39 | grid on 40 | 41 | [TH,PHI,d] = cart2sph(source(1),source(2),source(3)); 42 | az_source=TH*180/pi 43 | el_source=PHI*180/pi 44 | 45 | 46 | [TH,PHI] = cart2sph(sourceD(1),sourceD(2),sourceD(3)); 47 | az_SRC=TH*180/pi 48 | el_SRC=PHI*180/pi 49 | -------------------------------------------------------------------------------- /SRP_PHAT_SRC.m: -------------------------------------------------------------------------------- 1 | function [source]=SRP_PHAT_SRC(mics, fs, s, n, lsb, usb) 2 | % mics - microphones location 3 | % fs - sampling rate 4 | % s - signal 5 | % n - number of points 6 | % 7 | 8 | 9 | 10 | [nr_mic,b]=size(mics); 11 | 12 | corelation=zeros( (nr_mic*(nr_mic-1)/2), length(s)+length(s)-1); 13 | idx=1; 14 | for(i=1:nr_mic-1) 15 | for(j=i+1:nr_mic) 16 | 17 | [c cor cor2]=gccphat(s(:,i),s(:,j)); 18 | corelation(idx, :)=abs(cor); 19 | idx=idx+1; 20 | end 21 | end 22 | 23 | 24 | 25 | points=lsb + (usb - lsb).*rand(3,n); 26 | %% 27 | 28 | distances=zeros((nr_mic*(nr_mic-1)/2), n); 29 | 30 | idx=1; 31 | for(i=1:nr_mic) 32 | microphone=mics(i, :)'; 33 | microphone_rep=repmat(microphone, 1, length(points)); 34 | distances(idx, :)=sqrt( (points(1, :)-microphone_rep(1,:)).^2 +(points(2, :)-microphone_rep(2,:)).^2 + (points(3, :)-microphone_rep(3,:)).^2 ); 35 | idx=idx+1; 36 | 37 | end 38 | 39 | 40 | idx=1; 41 | distanceDifference=zeros((nr_mic*(nr_mic-1)/2), n); 42 | 43 | for(i=1:nr_mic-1) 44 | for(j=i+1:nr_mic) 45 | 46 | distanceDifference(idx, :)=distances(i,:)-distances(j,:); 47 | idx=idx+1; 48 | end 49 | end 50 | % 51 | 52 | sampleDifference=distanceDifference*fs/343; 53 | 54 | sampleDifferenceIdx=fix(sampleDifference)+length(s); 55 | 56 | 57 | 58 | [m indexMax]=max(corelation'); 59 | 60 | indexMax=indexMax'; 61 | [no1, no2]=size(sampleDifferenceIdx); 62 | indexMaxim2=repmat(indexMax, 1,no2 ); 63 | 64 | 65 | 66 | 67 | c=indexMaxim2-sampleDifferenceIdx; 68 | % cc=c-length(s) 69 | cc=abs(c); 70 | ccc=sum(cc); 71 | [minim, index]=min(ccc); 72 | source=points(:,index); 73 | 74 | 75 | end 76 | --------------------------------------------------------------------------------