66 lines
1.6 KiB
Python
66 lines
1.6 KiB
Python
import argparse
|
|
import configparser
|
|
import logging
|
|
import pathlib
|
|
|
|
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
from scipy.interpolate import griddata
|
|
|
|
parser = argparse.ArgumentParser(description="Pre-process time-series")
|
|
parser.add_argument("-v", "--verbose", action="count", default=0)
|
|
parser.add_argument("-c", "--config", default="config.ini")
|
|
args = parser.parse_args()
|
|
|
|
logging.basicConfig(level=max((10, 20 - 10 * args.verbose)))
|
|
log = logging.getLogger("bathy")
|
|
|
|
log.info("Starting time-series pre-processing")
|
|
config = configparser.ConfigParser()
|
|
config.read(args.config)
|
|
|
|
inp_root = pathlib.Path(config.get("inp", "root"))
|
|
out_root = pathlib.Path(config.get("out", "root"))
|
|
|
|
inp_spec = inp_root.joinpath(config.get("inp", "raw_spec"))
|
|
out_spec = out_root.joinpath("spec.dat")
|
|
|
|
Sm = np.loadtxt(
|
|
inp_spec,
|
|
skiprows=3,
|
|
max_rows=1,
|
|
)
|
|
|
|
inp = np.loadtxt(
|
|
inp_spec,
|
|
dtype=[("f", float), ("S", float)],
|
|
delimiter=",",
|
|
skiprows=12,
|
|
usecols=(0, 1),
|
|
max_rows=64,
|
|
)
|
|
|
|
cycle = config.getfloat("inp", "cycle", fallback=None)
|
|
if cycle is None:
|
|
f = inp["f"]
|
|
S = inp["S"] * Sm
|
|
else:
|
|
f = np.arange(inp["f"].min(), inp["f"].max() + 1 / cycle, 1 / cycle)
|
|
S = griddata(inp["f"], inp["S"] * Sm, f)
|
|
|
|
with out_spec.open("w") as out:
|
|
out.write("SPEC1D\n")
|
|
np.savetxt(out, np.stack((f, S), axis=1))
|
|
|
|
df = np.diff(f).min()
|
|
log.info(f"Minimum frequency delta: {df:.4f}Hz")
|
|
log.info(f"Maximum modelled time: {1/df:.0f}s")
|
|
|
|
fig, ax = plt.subplots()
|
|
ax.plot(f, S, c="k", lw=1)
|
|
ax.autoscale(True, "x", tight=True)
|
|
ax.grid()
|
|
ax.set(xlim=0, ylim=0, xlabel="f (Hz)", ylabel="S (m^2/Hz)")
|
|
|
|
fig.savefig(out_root.joinpath("spec.pdf"))
|
|
plt.show()
|