如何在python中找到线阵列的声压级?

时间:2012-06-21 14:41:35

标签: python audio matplotlib contour

我想知道如何在python中找到线阵列的声压级?基本上我想绘制一个轮廓,根据距离扬声器线阵列源的距离显示SPL。这里有一个样本轮廓:

enter image description here

我最接近的是这个片段:

import matplotlib.pyplot as plt
from pylab import linspace, meshgrid, sqrt, log

x = linspace(-30.0, 30.0, 15)
y = linspace(0, 30, 15)
X, Y = meshgrid(x, y)
Z = sqrt(X**2 + Y**2)

plt.figure()
CS = plt.contourf(Y, X, Z)
plt.show()

我知道我想要的轮廓是由复杂的软件和方程式生成的,但是接近的东西对我来说很好。

此链接可能会有所帮助,但我不知道如何使用此信息中的公式获得该轮廓。 http://personal.cityu.edu.hk/~bsapplec/transmis1.htm

提前致谢, dksr

1 个答案:

答案 0 :(得分:2)

我所做的是在这个片段中创建两个小函数(lambda函数),根据参考中的等式[8]计算毕达哥拉斯距离和SPL。

此外,由于方向性因素是通过实验确定的,我在这里仅使用余弦作为代表性示例。您可以使用给定角度θ的函数替换Q函数,并且在给定实验结果的插值的情况下,距离r返回强度分数。

import matplotlib.pyplot as plt
from pylab import linspace, meshgrid, sqrt, log10, angle, cos

x = linspace(-30.0, 30.0, 15)
y = linspace(0, 30, 15)
X, Y = meshgrid(x, y)
#Z = sqrt(X**2 + Y**2)

def SPL(source_SPL, x, y, x1, y1, Q):
    '''Given a source sound pressure level, the x and y vectors describing
    the space, the x1 and y1 coordinates of the sound origin
    and a directivity factor function, return the SPL matrix'''
    #Using eqation 8 from the source
    dist = lambda x1, x2, y1, y2: sqrt((x1-x2)**2 + (y1-y2)**2)
    spl = lambda r, q: source_SPL - 20*log10(r) - 10*log10(q) - 11
    spl_matrix = []
    for y2 in y:
        # Create a new row
        spl_matrix.append([])
        for x2 in x:
            r = dist(x1, x2, y1, y2)
            theta = angle(complex(x2-x1, y2-y1))
            q = Q(theta, r)/float(source_SPL)
            # After calculating r and q, put them into the spl equation to get Db
            Db = spl(r, q)
            spl_matrix[-1].append(Db)
    return spl_matrix

Q = lambda theta, r: r*abs(cos(theta))
Z = SPL(1, x, y, 0.1, 0.1, Q)

plt.figure()
#Need to draw the contour twice, once for the lines (in 10 sections)
CS = plt.contour(Y, X, Z, 10, linewidths=0.5, colors='k')
#And again for the fills
CS = plt.contourf(Y, X, Z, 10)
plt.show()

enter image description here

虽然我已经在不使用数组的情况下解决了这个问题,但你应该研究numpy以及如何对这段代码进行矢量化,这样你就不会使用循环而是使用矩阵运算。然而,这不仅仅是数学问题的代码问题。

最后,如果您具有工程背景,则可以在计算机上运行此实验,其中Q函数根据环境条件计算相对强度。你需要更多地了解声音如何与周围环境相互作用,你可能需要谷歌有限元分析和声压级