djh713 发表于 2008-7-20 12:41

一个BEAMFORMING 用于声源定位的程序,帮忙看看错在哪啊?

编了一段BEAMFORMING的程序,基于时延累加的,但结果总是不对,看了好久也不知什么地方错了,各位高手帮忙看下吧。多谢了

clear all
clc
A_x=0.1;%阵列面x方向网格的间距
A_y=0.1;%阵列面y方向网格的间距
A_z=1;%传声器阵列所在平面的z坐标
%--------------------阵列-7×7平面阵列-----------------------
Position_A=[-3*A_x,3*A_y,A_z;    -2*A_x,3*A_y,A_z;    -A_x,3*A_y,A_z;    0,3*A_y,A_z;    A_x,3*A_y,A_z;    2*A_x,3*A_y,A_z;    3*A_x,3*A_y,A_z;
    -3*A_x,2*A_y,A_z;    -2*A_x,2*A_y,A_z;    -A_x,2*A_y,A_z;    0,2*A_y,A_z;    A_x,2*A_y,A_z;    2*A_x,2*A_y,A_z;    3*A_x,2*A_y,A_z;
    -3*A_x,A_y,A_z;    -2*A_x,A_y,A_z;    -A_x,A_y,A_z;    0,A_y,A_z;    A_x,A_y,A_z;    2*A_x,A_y,A_z;    3*A_x,A_y,A_z;
    -3*A_x,0,A_z;    -2*A_x,0,A_z;    -A_x,0,A_z;    0,0,A_z;    A_x,0,A_z;    2*A_x,0,A_z;    3*A_x,0,A_z;
    -3*A_x,-A_y,A_z;    -2*A_x,-A_y,A_z;    -A_x,-A_y,A_z;    0,-A_y,A_z;    A_x,-A_y,A_z;    2*A_x,-A_y,A_z;    3*A_x,-A_y,A_z;
    -3*A_x,-2*A_y,A_z;    -2*A_x,-2*A_y,A_z;    -A_x,-2*A_y,A_z;    0,-2*A_y,A_z;    A_x,-2*A_y,A_z;    2*A_x,-2*A_y,A_z;    3*A_x,-2*A_y,A_z;
    -3*A_x,-3*A_y,A_z;    -2*A_x,-3*A_y,A_z;    -A_x,-3*A_y,A_z;    0,-3*A_y,A_z;    A_x,-3*A_y,A_z;    2*A_x,-3*A_y,A_z;    3*A_x,-3*A_y,A_z];
L=49;


Ax=Position_A(:,1);Ay=Position_A(:,2);Az=Position_A(:,3);%阵列坐标
ax=reshape(Ax,sqrt(L),sqrt(L));
ay=reshape(Ay,sqrt(L),sqrt(L));
az=reshape(Az,sqrt(L),sqrt(L));

%-----------------------定义声源坐标------------------------------------
S_x=0.1;%阵列面x方向网格的间距
S_y=0.1;%阵列面y方向网格的间距
S_z0=0;%传声器阵列所在平面的z坐标
Position_S=[-4*S_x,4*S_y,S_z0;    -3*S_x,4*S_y,S_z0;    -2*S_x,4*S_y,S_z0;    -S_x,4*S_y,S_z0;    0,4*S_y,S_z0;    S_x,4*S_y,S_z0;    2*S_x,4*S_y,S_z0;    3*S_x,4*S_y,S_z0;    4*S_x,4*S_y,S_z0;
   -4*S_x,3*S_y,S_z0;    -3*S_x,3*S_y,S_z0;    -2*S_x,3*S_y,S_z0;    -S_x,3*S_y,S_z0;    0,3*S_y,S_z0;    S_x,3*S_y,S_z0;    2*S_x,3*S_y,S_z0;    3*S_x,3*S_y,S_z0;    4*S_x,3*S_y,S_z0;
   -4*S_x,2*S_y,S_z0;    -3*S_x,2*S_y,S_z0;    -2*S_x,2*S_y,S_z0;    -S_x,2*S_y,S_z0;    0,2*S_y,S_z0;    S_x,2*S_y,S_z0;    2*S_x,2*S_y,S_z0;    3*S_x,2*S_y,S_z0;    4*S_x,2*S_y,S_z0;
   -4*S_x,S_y,S_z0;    -3*S_x,S_y,S_z0;    -2*S_x,S_y,S_z0;    -S_x,S_y,S_z0;    0,S_y,S_z0;    S_x,S_y,S_z0;    2*S_x,S_y,S_z0;    3*S_x,S_y,S_z0;    4*S_x,S_y,S_z0;
   -4*S_x,0,S_z0;    -3*S_x,0,S_z0;    -2*S_x,0,S_z0;    -S_x,0,S_z0;    0,0,S_z0;    S_x,0,S_z0;    2*S_x,0,S_z0;    3*S_x,0,S_z0;    4*S_x,0,S_z0
   -4*S_x,-S_y,S_z0;    -3*S_x,-S_y,S_z0;    -2*S_x,-S_y,S_z0;    -S_x,-S_y,S_z0;    0,-S_y,S_z0;    S_x,-S_y,S_z0;    2*S_x,-S_y,S_z0;    3*S_x,-S_y,S_z0;    4*S_x,-S_y,S_z0;
   -4*S_x,-2*S_y,S_z0;    -3*S_x,-2*S_y,S_z0;    -2*S_x,-2*S_y,S_z0;    -S_x,-2*S_y,S_z0;    0,-2*S_y,S_z0;    S_x,-2*S_y,S_z0;    2*S_x,-2*S_y,S_z0;    3*S_x,-2*S_y,S_z0;    4*S_x,-2*S_y,S_z0;
   -4*S_x,-3*S_y,S_z0;    -3*S_x,-3*S_y,S_z0;    -2*S_x,-3*S_y,S_z0;    -S_x,-3*S_y,S_z0;    0,-3*S_y,S_z0;    S_x,-3*S_y,S_z0;    2*S_x,-3*S_y,S_z0;    3*S_x,-3*S_y,S_z0;    4*S_x,-3*S_y,S_z0;
   -4*S_x,-4*S_y,S_z0;    -3*S_x,-4*S_y,S_z0;    -2*S_x,-4*S_y,S_z0;    -S_x,-4*S_y,S_z0;    0,-4*S_y,S_z0;    S_x,-4*S_y,S_z0;    2*S_x,-4*S_y,S_z0;    3*S_x,-4*S_y,S_z0;    4*S_x,-4*S_y,S_z0];

Sx=Position_S(:,1);Sy=Position_S(:,2);Sz=Position_S(:,3);%阵列坐标
N=81;
%------------------定义声源---------------------------------------
f=2000;%定义声场的频率
k=2*pi*f/344;%对应频率下的声场波数
c=344; %声速
rho=1.25; %空气密度
r0=0.001;%脉动球源半径
Ua=1; %脉动球源振速
de=1;% 重建距离constant parameter
omega=2*pi*f;
A=(rho*c*k*r0*r0)*Ua*(k*r0+i)/(1+k*k*r0*r0);
S=zeros(N,1);
% S(76)=1;%定义声源位置为(0,0.1,0)
S(31)=A;
% S(18)=1;
SS=reshape(S,sqrt(N),sqrt(N));%在7×7方阵上重构声源
sx=reshape(Sx,sqrt(N),sqrt(N));
sy=reshape(Sy,sqrt(N),sqrt(N));%将Sx与Sy重构为7×7方阵
sz=reshape(Sz,sqrt(N),sqrt(N));
ssx=sx(:,1);
ssy=sy(1,:)';%提取x与y为7个向量
%mesh(sx,sy,SS);
figure(1)
contourf(ssx,ssy,SS);
colorbar;

%--------------------确定声源到阵列面上各传声器间的距离-------------------------------------
for i=1:N;
    for j=1:L;
      r(i,j)=sqrt((Sx(i)-Ax(j))^2+(Sy(i)-Ay(j))^2+(Sz(i)-Az(j))^2);
    end
end
%-------------------------------以下为计算阵列面接收信号----------------------------------
clear i j
for m=1:N;
    for n=1:L;
%         h(m,n)=exp(j*(2*pi*f*r(m,n)/c-k*r(m,n)))./r(m,n);   
      h(m,n)=1/r(m,n)*exp(i*(omega*r(m,n)/c-k*r(m,n)));
    end
end
pa=S.'*h;
Pa=reshape(pa,sqrt(L),sqrt(L));
ax=reshape(Ax,sqrt(L),sqrt(L));
ay=reshape(Ay,sqrt(L),sqrt(L));
az=reshape(Az,sqrt(L),sqrt(L));
figure(2)
mesh(ax,ay,abs(Pa).');
figure(3)
contourf(ax,ay,abs(Pa).');
colorbar;
clear m n
%---------------------------重建声源面------------------------------------------
%-------------------确定声源面大小及节点坐标-----------------------------------
kj=1.5;%重建面孔径为 1.5×1.5m,保证阵列开角在30度范围内
d=0.1; %重建面节点间距0.1m
M=kj/d+1;%每个方向的网格节点数
for l=1:M
    X_s(l,1)=-kj/2+(l-1)*d;%声源面网格在X向的坐标
end
xs=repmat(X_s,1,M);%扩展为M×1的列阵,X的坐标为按行依次排列,如1 2 3 1 2 3 1 2 3
for g=1:M
    Y_s(g,1)=kj/2-(g-1)*d;%声源面网格在Y向的坐标
end
ys=repmat(Y_s',M,1);%扩展为M×1的列阵,Y的坐标为同一值重复X次,如1 1 1 2 2 2 3 3 3
zs=repmat(0,M,M);%声源面网格在Z向的坐标
%------------------------确定阵列点对重建面上每一聚焦点的距离------------------------------------------


%------------------------以阵列中心点为参考点,确定其余各阵列点相对于该点的时间延迟---------------------
RR=repmat(A_z,L,M^2);
for m=1:L;
    for n=1:M^2;
      R(m,n)=sqrt((xs(n)-Ax(m))^2+(ys(n)-Ay(m))^2+(zs(n)-Az(m))^2);
      DR(m,n)=R(m,n)-RR(m,n);
      T(m,n)=DR(m,n)./c;%-------------------求延时
      H(m,n)=exp(-j*(omega*T(m,n)-k*DR(m,n)))*R(m,n);
    end
end
%-----------------------------------根据已知的延时对声源面进行聚焦------------------------
Ps=pa*H./max(max(H));

ps=reshape(Ps,M,M);
sx=reshape(xs,M,M);
sy=reshape(ys,M,M);
figure(4)
mesh(sx,sy,abs(ps).');
figure(5)
contourf(sx,sy,abs(ps).');
colorbar;

[ 本帖最后由 djh713 于 2008-7-20 12:42 编辑 ]
页: [1]
查看完整版本: 一个BEAMFORMING 用于声源定位的程序,帮忙看看错在哪啊?