TDOA计算,将某个时间的过冲最小化

问题描述

我正在尝试使用TDOA在坐标系中查找声源位置。

我们有一个成本函数,如下所示:

    def costfunction(point,meas_list,dims=2):
        #### Cost function to be fed into the scipy.optimize.minimize function
        #### For a candidate point,calculates the time differences,compares it
        #### to data
        error = 0
        for m in meas_list:
            actualdiff = m.delta
            calcdiff = (
                m.soundpointB.dist(point,dims=dims)
                - m.soundpointA.dist(point,dims=dims)
                )
            
            error += (actualdiff - calcdiff) ** 2
    
        return(error)
soundpointB.dist #---> is to calculate the distance between sensors

我们的传感器位置是

b = [-2,2,0]
c = [2,-2,0]
d = [2,0]
e = [0,2]

我们模拟x,y在-50至50和z在0至-20范围内的随机源 仿真会产生从源到每个传感器的时间差。

所以我们有成本函数来计算均方误差 然后我们使用scipy minimal找出最佳解决方

    startpoint = np.array([0,0])
    dims = 3
    result = minimize(
            fun=costfunction,x0=startpoint,args=(meas_list,dims),method='BFGS',options={
                      'gtol': 1e-06,'return_all':True,'norm':inf},jac='2-point')

对于大多数计算而言,好的结果是,实际位置与TDOA计算位置之间的百分比误差为+ -10%

但是对于某些位置,例如[-30.0,0.5,-6.0],TDOA计算返回[-325.07,5.49,-64.73]

当我们检查所有结果时,将其最小化。似乎它已经找到了位置,但是它超调了。

有人知道如何使它变得更好吗?还是需要更正?

解决方法

BFGS除了局部最小值外,将不保证任何其他内容。如果您知道您的传感器始终在-50和50之间以及-2和2之间,那么我建议:

  • 首先,请尝试使用L-BFGS-B,SLSQP等方法使局部局部最小化,并为变量赋予这些边界
  • 如果以上方法不能令人满意,请使用大型火炮并尝试使用全局优化算法,例如SHGO,DifferentialEvolution,DualAnnealing。它们都可以在SciPy中使用,可能会比较慢,但是您会对结果更有信心。