请选择 进入手机版 | 继续访问电脑版

QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1525|回复: 1

球形麦克风阵列设计

[复制链接]
字体大小: 正常 放大
浅夏110 实名认证       

542

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2020-11-14 17:15
  • 签到天数: 74 天

    [LV.6]常住居民II

    邮箱绑定达人

    群组2019美赛冲刺课程

    群组站长地区赛培训

    群组2019考研数学 桃子老师

    群组2018教师培训(呼伦贝

    群组2019考研数学 站长系列

    发表于 2020-5-15 10:26 |显示全部楼层
    |招呼Ta 关注Ta |邮箱已经成功绑定
    音频信号处理中,麦克风是最基本的信号接收设备之一。将麦克风组成阵列的主要目的是通过多个麦克风的信息,可以解决很多实际问题:回声、噪声的抑制;视频会议;虚拟现实技术;场景分析等。在声源定位中,阵列几何必须是事先已知的,而且某些规则几何形状的应用可以有效地减少运算量。因此,针对麦克风的设计,提出了一种等距离分布方法,即球面上任意麦克风与相邻麦克风的距离均相等。------ 《基于球傅里叶变换的声源三维空间定位》
    * t* K- {; W$ g* G问题背景
    要设计球形麦克风阵列(SMA),并保证麦克风在球面等距离分布(可以理解为,球面上任一麦克风与相邻麦克风的距离相等),需要给出每个麦克风的具体坐标位置。
    麦克风坐标计算
    球面上的麦克风最终组成一个规则的凸包多面体(参见Platonic solid),麦克风坐标数值解法其实是一个Thomson problem
    , b$ k! R/ q) ^& B
    1.jpg
    4 R" o1 i. b% ?9 o( `- b+ Z* O
    此类问题有多种求解思路(可参考cofludy的博客),其中一种是基于力学原理,大致思路如下:
    1)首先建立单位球体,然后将待分布的N个麦克风作为带电粒子,随机分布在该单位球体的表面;
    2) 计算每个带电粒子在各个方向上受到的合力大小,然后计算出合力在对应带电粒子上的切线分量;
    3) 根据切线分量计算对应带电粒子沿切向运动飞出该单位球体表面的坐标,然后对每一带电粒子的坐标沿径向进行归一化,使所有带电粒子再次回到该单位球体的表面;
    4) 步骤2)、3)循环若干次,当各带电粒子所受合力均小于一设定值时,得到各带电粒子的球面均勾分布,即为N个麦克风在该球形的阵列分布。
    详细的算法步骤可参考专利描述:一种3D录音系统球面麦克风阵列分布方法【北京大学】
    幸运的是,网上有一段现成的MATLAB代码,可通过链接查看,源代码如下:
    3 O: b. F1 L7 O" I9 \; L
    function []=main()N=12; %点数量a=rand(N,1)*2*pi;%根据随机求面均匀分布,先生成一个初始状态b=asin(rand(N,1)*2-1);r0=[cos(a).*cos(b),sin(a).*cos(b),sin(b)];v0=zeros(size(r0));G=1e-2;%斥力常数,试验这个值比较不错for ii=1:200%模拟200步,一般已经收敛,其实可以在之下退出    [rn,vn]=countnext(r0,v0,G);%更新状态    r0=rn;v0=vn;endplot3(rn(:,1),rn(:,2),rn(:,3),'.');hold on;%画结果[xx,yy,zz]=sphere(50);h2=surf(xx,yy,zz); %画一个单位球做参考set(h2,'edgecolor','none','facecolor','r','facealpha',0.7);axis equal;axis([-1 1 -1 1 -1 1]);hold off;endfunction [rn vn]=countnext(r,v,G) %更新状态的函数%r存放每点的x,y,z数据,v存放每点的速度数据num=size(r,1);dd=zeros(3,num,num); %各点间的矢量差for m=1:num-1    for n=m+1:num        dd(:,m,n)=(r(m,-r(n,)';        dd(:,n,m)=-dd(:,m,n);    endendL=sqrt(sum(dd.^2,1));%各点间的距离L(L<1e-2)=1e-2; %距离过小限定F=sum(dd./repmat(L.^3,[3 1 1]),3)';%计算合力Fr=r.*repmat(dot(F,r,2),[1 3]); %计算合力径向分量Fv=F-Fr; %切向分量rn=r+v;  %更新坐标rn=rn./repmat(sqrt(sum(rn.^2,2)),[1 3]);vn=v+G*Fv;%跟新速度end
    一开始因为计算机没有安装MATLAB只有Python,代码看着也不多,也有那么一点点Python使用经验,想着用Python重写一遍好了。
    结果,困难程度远远超出预期(请原谅我这只菜鸟~)。一边查MATLAB中函数的用法,一边查Numpy中函数的用法,折腾几天还是没能完成。不得已,安装MATLAB后,一步一步确认Python代码的输出结果,又折腾几天最终完成。
    Numpy虽然说很多函数和MATLAB非常相似,但有几个地方需要注意:
    • MATLAB下标索引从1开始,Numpy下标索引从0开始;
    • MATLAB中多维数组下标依次表示维度 行:列:页,而Numpy中多维数组下标依次表示维度 页:行:列;
      / f& R/ f  X% j+ ~+ {6 W! M% w
    计算得到球面麦克风点的坐标后,可利用Scipy.spatial中的ConvexHull函数绘制3D凸包,参考以下链接,源代码如下
    1 A: |/ }5 e3 x5 v& y
    import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.spatial import ConvexHull# 8 points defining the cube cornerspts = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0],                [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1], ])hull = ConvexHull(pts)fig = plt.figure()ax = fig.add_subplot(111, projection="3d")# Plot defining corner pointsax.plot(pts.T[0], pts.T[1], pts.T[2], "ko")# 12 = 2 * 6 faces are the simplices (2 simplices per square face)for s in hull.simplices:    s = np.append(s, s[0])  # Here we cycle back to the first coordinate    ax.plot(pts[s, 0], pts[s, 1], pts[s, 2], "r-")# Make axis labelfor i in ["x", "y", "z"]:    eval("ax.set_{:s}label('{:s}')".format(i, i))plt.show(), p9 i7 X8 `- \; V; `4 u
    计算结果
    好了,让我们一起来看看最终的实现效果吧~

    & x, i# n+ @* t% q" U" A  o8 R 2.jpg
    1 K9 Q" o3 ~% B1 w4 a
    球面均匀分布4点
    4 W+ k& j" O7 v, o1 S
    3.jpg

    , k3 d# {& f8 }" z* b9 V* f% h
    球面均匀分布36点
    , M9 W, ~" s/ ?* w" E; y
    7 y; q2 E1 Y% @* \. @) ]
    zan
    TwThh        

    6

    主题

    1

    听众

    258

    积分

    升级  79%

  • TA的每日心情
    奋斗
    2021-2-6 09:19
  • 签到天数: 90 天

    [LV.6]常住居民II

    网络挑战赛参赛者

    自我介绍
    穿过人群 走过人间 在去往更远的地方

    邮箱绑定达人

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2024-4-18 15:02 , Processed in 0.436023 second(s), 60 queries .

    回顶部