143 行
4.0 KiB
Python
可执行文件
143 行
4.0 KiB
Python
可执行文件
""" Wind Generated Noise Prediction """
|
|
import numpy as np
|
|
from scipy.interpolate import interp1d
|
|
from pyat import DataBase as db
|
|
import matplotlib.pyplot as plt
|
|
|
|
class MdlPara():
|
|
def __init__(self, title, lat, lon, seaDepth, month, freq, vc, a, b, vs):
|
|
self.title = title
|
|
self.lat = lat
|
|
self.lon = lon
|
|
self.seaDepth = seaDepth
|
|
self.month = month
|
|
self.freq = freq
|
|
self.vc = vc
|
|
self.a = a
|
|
self.b = b
|
|
self.vs = vs
|
|
|
|
def loadMdlPara(filename):
|
|
f = open(filename, mode='r')
|
|
|
|
mdlPara = []
|
|
eof = False
|
|
while (1):
|
|
# Title
|
|
while (1):
|
|
line = f.readline()
|
|
if line == '':
|
|
eof = True
|
|
break
|
|
title = line.strip()
|
|
if title != '':
|
|
break
|
|
if eof:
|
|
break
|
|
|
|
# Latitude and Longitude
|
|
line = f.readline()
|
|
line = line.strip().split()
|
|
lat = np.double(line[0])
|
|
lon = np.double(line[1])
|
|
|
|
# Sea Depth
|
|
line = f.readline()
|
|
line = line.strip().split()
|
|
seaDepth = np.double(line[0])
|
|
|
|
# Month
|
|
line = f.readline()
|
|
line = line.strip().split()
|
|
month = np.int8(line[0])
|
|
|
|
# Model Parameters
|
|
freq = []
|
|
vc = []
|
|
a = []
|
|
b = []
|
|
vs = []
|
|
while (1):
|
|
line = f.readline()
|
|
line = line.strip().split()
|
|
if line[0] == '0':
|
|
break
|
|
freq.append(np.double(line[0]))
|
|
vc.append(np.double(line[1]))
|
|
a.append(np.double(line[2]))
|
|
b.append(np.double(line[3]))
|
|
vs.append(np.double(line[4]))
|
|
|
|
mdlPara.append(MdlPara(title, lat, lon, seaDepth, month, freq, vc, a, b, vs))
|
|
|
|
return mdlPara
|
|
|
|
|
|
def WGNMdl(mdlPara, windspeed):
|
|
f = np.array(mdlPara.freq)
|
|
spl = np.zeros(len(f))
|
|
for it in range(len(f)):
|
|
if windspeed < mdlPara.vc[it]:
|
|
spl[it] = mdlPara.a[it] + mdlPara.b[it] * 10 * np.log10(mdlPara.vc[it])
|
|
elif (mdlPara.vs[it] is not np.NaN) & (windspeed > mdlPara.vs[it]):
|
|
spl[it] = mdlPara.a[it] + mdlPara.b[it] * 10 * np.log10(mdlPara.vs[it])
|
|
else:
|
|
spl[it] = mdlPara.a[it] + mdlPara.b[it] * 10 * np.log10(windspeed)
|
|
|
|
return f, spl
|
|
|
|
|
|
def WGNPd(dataFile, seaDepth, windspeed, month, freq):
|
|
if min(freq) < 50:
|
|
raise UserWarning("The minimum frequency must be larger than 50 Hz")
|
|
|
|
mdlPara = loadMdlPara(dataFile)
|
|
|
|
z = seaDepth
|
|
|
|
Q = []
|
|
for it in range(len(mdlPara)):
|
|
q1 = abs(mdlPara[it].seaDepth - z) / (mdlPara[it].seaDepth + z)
|
|
q2 = min(abs(month-mdlPara[it].month), 12-abs(month-mdlPara[it].month)) / 6
|
|
alpha = 0.7
|
|
Q.append(alpha * q1 + (1-alpha) * q2)
|
|
idx = np.argmin(Q)
|
|
# print([z, month, idx])
|
|
|
|
f0, spl0 = WGNMdl(mdlPara[idx], windspeed)
|
|
if max(freq) > max(f0):
|
|
spl0 = np.append(spl0, spl0[-1] - 5 * np.log2(max(freq)/max(f0)))
|
|
f0 = np.append(f0, max(freq))
|
|
if min(f0) > 200:
|
|
spl0 = np.insert(spl0, 0, spl0[0] + 5 * np.log2(min(f0)/200))
|
|
f0 = np.insert(f0, 0, 200)
|
|
if min(f0) > 50:
|
|
spl0 = np.insert(spl0, 0, spl0[0] + 9 * np.log2(min(f0)/50))
|
|
f0 = np.insert(f0, 0, 50)
|
|
|
|
itp1 = interp1d(np.log10(f0), spl0)
|
|
spl = itp1(np.log10(freq))
|
|
|
|
return freq, spl
|
|
|
|
|
|
# if __name__=="__main__":
|
|
# lat = 19
|
|
# lon = 116
|
|
# windspeed = 5 # unit: m/s
|
|
# month = 3
|
|
# freq = 50 * np.power(2, np.arange(25)/3)
|
|
|
|
# # 定义时间段
|
|
# timeIndex = db.timeDict['Annual']
|
|
# # 创建类
|
|
# data = db.DataBase()
|
|
# # 设置时间段
|
|
# data.set_timePeriod(timeIndex)
|
|
|
|
# f, spl = WGNPd(data, lat, lon, windspeed, month, freq)
|
|
|
|
# plt.semilogx(f, spl)
|
|
# plt.xlabel('Frequency / Hz')
|
|
# plt.ylabel('Noise Level / dB')
|
|
# plt.show() |