基于MATLAB的声源定位系统

您所在的位置:网站首页 声源定位技术名词解释 基于MATLAB的声源定位系统

基于MATLAB的声源定位系统

2024-06-26 19:39| 来源: 网络整理| 查看: 265

写这篇文章的初衷 

      这是我写的第一篇博客,写他是因为我在做别的东西时要用到声源定位算法,想要对他进行MATLAB仿真,但是网上很多文章中涉及的参数内容比较专业,看起来不太直观,所以有了这个文章。源码附在最下方。

理论部分

这里参考了这位UP的原理 

(侵权删)

代码

之后就是MATLAB部分,具体功能都标有注释

clc; clear; figure(1); sound_position=[5,6]; %声源实际位置 axis([0, 10, 0, 10]); %限定X,Y轴的范围 grid on; %画出网格线 mic1_positon=[-10,0]; mic2_positon=[0,0]; mic3_positon=[10,0]; wave = audioread('sample.wav'); wave = wave(:,1); %数组第一列 scale = 0.8/max(wave); wave = scale*wave; Trials = 10; %测试点的个数 Radius = 50; N = 3; Sen_position=[mic1_positon;mic2_positon;mic3_positon]; True_position = zeros(Trials, 3); Est_position = zeros(Trials,3); % 生成十个随机位置,半径在50以内 for i=1:Trials r = rand(1)*Radius; t = rand(1)*pi; x = r*cos(t); y = r*sin(t); True_position(i,1) = x; True_position(i,2) =y; end %计算距离 Distances = zeros(Trials,N); for i=1:Trials for j=1:N x1 = True_position(i,1); y1 = True_position(i,2); x2 = Sen_position(j,1); y2 = Sen_position(j,2); Distances(i,j) = sqrt((x1-x2)^2 + (y1-y2)^2 ); end end TimeDelay = Distances./340.29; Padding = TimeDelay*44100; %时延乘采样率 1s的数据的时延,十个数据点,三个MIC for i=1:Trials x = True_position(i,1); y = True_position(i,2); xstr = num2str(round(x)); ystr = num2str(round(y)); istr = num2str(i); mic1 = [zeros(round(Padding(i,1)),1) ; wave]; mic2 = [zeros(round(Padding(i,2)),1) ; wave]; mic3 = [zeros(round(Padding(i,3)),1) ; wave]; %创建一个全零矩阵,矩阵长度为padding,再续上一个wave %麦克一开始什么都收不到,经过一定时间的延迟,收到了音频信号 l1 = length(mic1); l2 = length(mic2); l3 = length(mic3); lenvec = [l1 l2 l3]; m = max(lenvec); c = [m-l1, m-l2, m-l3]; %找到最远的接受端 mic1 = [mic1; zeros(c(1),1)]; mic2 = [mic2; zeros(c(2),1)]; mic3 = [mic3; zeros(c(3),1)]; %补零,最近的声音结束了,最远的没有,通过补零让数组都一样长 mic1 = mic1./(Distances(i,1))^2; mic2 = mic2./(Distances(i,2))^2; mic3 = mic3./(Distances(i,3))^2; %声强和距离的关系是平方I = P / (4 * π * r?) multitrack = [mic1, mic2, mic3]; % wavwrite(multitrack, 44100, name); [x y] = Locate(Sen_position, multitrack); Est_position(i,1) = x; Est_position(i,2) = y; end plot(True_position(:,1),True_position(:,2),'bd',Est_position(:,1),Est_position(:,2),'r+','LineWidth',2); legend('True Position','Estimated Position'); xlabel('X coordinate of target'); ylabel('Y coordinate of target'); title('TDOA Hyperbolic Localization'); axis([-50 50 -50 50]); %越接近0度和180度时误差越大,这是原理上的问题 function [x y] = Locate(Sen_position, multitrack) s = size(Sen_position); len = s(1); timedelayvec = zeros(len,1); for i=1:len timedelayvec(i) = timedelayfunc(multitrack(:,1),multitrack(:,i)); end t1=timedelayvec(1)-timedelayvec(2); t2=timedelayvec(3)-timedelayvec(2); r=(2*(10)^2-340.29^2*(t1^2+t2^2))/(2*340.29*(t1+t2)); a=acos((t1-t2)/20*(340.29^2*(t1+t2)/(2*r)+340.29)); x=r*cos(a); y=r*sin(a); end function out = timedelayfunc(x,y) % suppose sampling rate is 44100 % Let Tx be transit time for x % Let Ty be transit time for y % out is Ty - Tx c = xcorr(x, y); %互相关函数 [C I] = max(c); out = ((length(c)+1) - I)/44100; end

仿真结果如下,蓝色是随机生成的实际位置,红色是通过声源定位出的位置

 

仿真中出现的误差是由于模型本身的误差导致,具体原因可参考:

基于DSP的声源定位装置的研究与实现 - 中国知网 (cnki.net)

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3