麦克风阵列声源定位四通道麦克风数据库及TDOA双曲交汇定位算法实验
麥克風陣列聲源定位四通道麥克風數據庫建立
四通道麥克風數據庫建立物理模型的建立,來源于文獻:SLoClas: A DATABASE FOR JOINT SOUND LOCALIZATION AND CLASSIFICATION
根據圖一,聲源處于紅色圓形上,且聲源距離麥克風陣列中心O點的距離為1.5m,其中
mic1(0,-d)、mic2(d,0)、mic3(0,d)、mic4(-d,0) d為0.03m
聲源會沿著紅色圓圈按照θ角度旋轉,麥克風陣列會依次按照一定的采樣率每θ角度采集相同數據長度的聲源數據,不同麥克風會因為距離角度而導致采集到的信號的幅度和相位不同。實驗數據是按照θ=5°采集完成的,實驗部分數據集如下圖:
TDOA相關法時延求解
TDOA相關法時延求解原理與算法
雙曲交匯定位算法
參考文獻:運 用 雙 曲 線 知 識 測 定 聲 源
———研究性學習課題成果
結合圖一,以mic2、mic4為焦點構建雙曲線方程1:
以mic1、mic3為焦點構建雙曲線方程2:
現在定義,T42為聲源到mic4的時間與聲源到mic2的時間的差,T13為聲源到mic1的時間與聲源到mic3的時間的差c為聲音傳播的速度,在這里c=340m/s。
根據雙曲線的特性,其中,
兩個雙曲線方程聯立求解,雙曲線的交點就是聲源的坐標。根據作者何曉東 鄭東風 指導教師 支 靜的文獻,聯立兩個雙曲線方程組求解得:
我們只需要根據T42和T13和0的關系來判定聲源的具體位置即可,如下圖所示:
聲源位置、角度求解與算法代碼驗證
matlab的算法代碼如下:
clc; clear; close all m=100; filedir=('E:\***\SoClas_database\Segmented_Sound\class06\class06_360\*.wav');%% infiledir=('E:\***\SoClas_database\Segmented_Sound\class06\class06_360\'); files = dir(filedir); for num = 1:minfile = [infiledir,files(num).name];[y0,Fs]= audioread(infile);for j = 1:3[c,lags] = xcorr(y0(:,j+1),y0(:,1));[Am,Lm] = max(c);d = Lm - (length(c)+1)/2;Delay(num,j)=d/Fs;endfor k = 1:2[c1,lags1] = xcorr(y0(:,k+2),y0(:,2));[Am1,Lm1] = max(c1);d1 = Lm1 - (length(c1)+1)/2;Delay(num,k+3)=d1/Fs; end[c2,lags2] = xcorr(y0(:,3),y0(:,4));[Am2,Lm2] = max(c2);d2 = Lm2 - (length(c2)+1)/2;Delay(num,6)=d2/Fs; endLength = length(y0); T = 1 / Fs; t = (1 : Length) * T; t = t'; figure;subplot(411); plot(t,y0(:,1)); title('mic1'); xlabel('(秒)') ylabel('幅度(V)') subplot(412); plot(t,y0(:,2)); title('mic2'); xlabel('(秒)') ylabel('幅度(V)') subplot(413); plot(t,y0(:,3)); title('mic3'); xlabel('(秒)') ylabel('幅度(V)') subplot(414); plot(t,y0(:,4)); title('mic4'); xlabel('(秒)') ylabel('幅度(V)') %%%%%%%%%%%%%%%%%%%%%%%%%%%% c = 340; ddd = 0.03; a1 = c*Delay(1,5); b1 = sqrt(ddd*ddd - a1 * a1); a2 = c*Delay(1,2); b2 = sqrt(ddd*ddd - a2 * a2); kk = b1*b1*b2*b2 - a1*a1*a2*a2; mm1 = a1*a1*b2*b2; mm2 = a2*a2*b1*b1; nn1 = a2*a2+b1*b1; nn2 = a1*a1+b2*b2; ppp = sqrt(mm1*nn1/kk); qqq = sqrt(mm2*nn2/kk); if a2 > 0yyy = -qqq; elseyyy = qqq; end if a1 > 0xxx = ppp; elsexxx = -ppp; end angle = atan(xxx / yyy)*180/pi % if angle <= 0 % theta = -angle + 180 % else % theta = angle % end上述代碼可以通過c語言移植到具備算力的開發板中,根據數據集中的按照不同θ角度的麥克風陣列數據,分別進行角度驗證,鎖定聲源的坐標,根據求得的角度在代入R即可求出聲源的實際距離。測試結果如下:
可以看出,雙曲交匯定位算法是有一定效果的。良好的定位效果和聲源距離麥克風陣列的距離、聲源所發聲信號的類型頻率、背景噪聲等有關,下一步將繼續優化定位算法,使定位結果更加精準。
上述結構四通道麥克風定位數據集下載
鏈接:https://pan.baidu.com/s/1t63N73ZDFx9Ih6aeBISrRA
提取碼:esnp
定位精度時延改進——時域預處理
為了提高數據精度,需要對時域信號進行預處理——立方處理。就是對時域信號的每個點做三次冪處理。
未預處理實驗
close all; clear; clc; [time_txt,Fs] = audioread('E:\***\SoClas_database\Segmented_Sound\class06\class06_270\class06_270_001.wav'); LEN = 7361; x1 = time_txt(:,1); x2 = time_txt(:,2); % xxx1 = x1.*x1.*x1; % xxx2 = x2.*x2.*x2; xxx1 = x1; xxx2 = x2; X1=(fft(xxx1)); X2=(fft(xxx2)); Sxy=X1.*conj(X2); Bxy=fftshift(abs(ifft(Sxy))); figure; subplot(211); Xxy=xcorr(xxx1,xxx2); plot(Xxy); title('DSP hxg') subplot(212); plot((Bxy)); title('MATLAB hxg')預處理實驗
close all; clear; clc; [time_txt,Fs] = audioread('E:\***\SoClas_database\Segmented_Sound\class06\class06_270\class06_270_001.wav'); LEN = 7361; x1 = time_txt(:,1); x2 = time_txt(:,2); xxx1 = x1.*x1.*x1; xxx2 = x2.*x2.*x2; X1=(fft(xxx1)); X2=(fft(xxx2)); Sxy=X1.*conj(X2); Bxy=fftshift(abs(ifft(Sxy))); figure; subplot(211); Xxy=xcorr(xxx1,xxx2); plot(Xxy); title('DSP hxg') subplot(212); plot((Bxy)); title('MATLAB hxg')總結
以上是生活随笔為你收集整理的麦克风阵列声源定位四通道麦克风数据库及TDOA双曲交汇定位算法实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VLSI数字集成电路设计——CMOS
- 下一篇: 精益生产计划如何制订,如何做好精益生产计