Как найти уровень звукового давления линейного массива в python?

Мне интересно, как найти уровень звукового давления линейного массива в python? В основном я хочу нарисовать контур, который показывает SPL на основе расстояния от источника линейного массива динамиков. Образец контура здесь:

введите здесь описание изображения

Самое близкое, что я получил, было из этого фрагмента:

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< /а>

Заранее спасибо, дкср


person dksr    schedule 21.06.2012    source источник


Ответы (1)


Что я сделал, так это создал две маленькие функции (лямбда-функции) в этом фрагменте для вычисления пифагорейского расстояния и SPL в соответствии с уравнением [8] в вашей ссылке.

Кроме того, поскольку коэффициент направленности определяется экспериментально, я просто использовал здесь косинус как репрезентативный пример. Вы можете заменить функцию 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()

введите здесь описание изображения

Хотя я решил это без использования массивов, вы должны изучить numpy и как векторизовать этот код, чтобы вы использовали не циклы, а матричные операции. Однако это не столько проблема кода, сколько математическая проблема.

Наконец, если у вас есть инженерное образование, вы можете запустить этот эксперимент на компьютере, где функция Q вычисляет относительную интенсивность на основе условий окружающей среды. Вам нужно больше понимать, как звук взаимодействует с окружающей средой, возможно, вы захотите погуглить анализ конечных элементов и уровень звукового давления.

person jbbiomed    schedule 30.06.2012