Mijn poging:
Kunnen interpretatie fouten inzitten. Maar eerste "ansatz" zoals ik zou doen.
1. Snelheid x en versnelling ay aan zelfde tijd as gekoppeld.
2. Blanco gaten snelheid forward gevuld.
3. Afstand berekend (integreren snelheid).
4. Afstandas afgerond op 0.5 meter (om FFT uit te voeren met constante intervallen).
5. Groupby tijd as en gemiddelden genomen elke 0.5 meter.
6. Spectrogram bepaald (geen extra filtering buiten box grote).
Heb: frequentie (versnl. ay) in: [1/m] en periode [m] weergegeven.
Kom ik uit op onderstaande resultaten. Let op hobby en first trial "proof of concept". Ik kan wat foutjes gemaakt hebben mbt. samplefrequentie welke bij mij 0.5 meter is (heb Fs=1/0.5 ingesteld te moe om te controleren).
Misschien nog een beetje experimenteren en Fs controleren als ik minder moe ben.
Observaties:
- Met pijlen aangeduid waar extra beweging komt. Snelle schommeling iedere twee meter. Problemen kwaliteit spoormisschien? Lijkt mij geen rekenkundig artifact komt en verdwijnt in afstand.
- Er lijkt een ondergrens voor trage perioden bij tien meter intervallen. Maar dit is intuitief.
Plots:
Code: Selecteer alles
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import numpy as np
# Define layout spectrogram plot and time series
layout = [ ["time"], ["time2"], ["freq"], ["period"]]
gs_kw = dict(width_ratios=[1], height_ratios=[1, 1, 1, 1])
fig, axd = plt.subplot_mosaic(layout, figsize=(16, 9), layout="constrained", gridspec_kw=gs_kw)
def spectogram(signal, fs):
# calcuate the spectrogram, determine perios instead of frequency
spec, freq, t = mlab.specgram(signal, Fs=fs, mode="magnitude")
# calculate the period bin limits, omit the zero frequency bin
period = 1. / freq[1:]
return t, freq, period, spec
df = pd.read_excel("treinreis/Retour-calc.xlsx")
axd["time"].set_title("Retour")
# Plot time signal
axd["time"].plot(df["x"], df["ay"], color="black", linewidth=0.1)
axd["time"].set_xlabel("distance [meters]")
axd["time"].set_ylabel("Acceleration y [m/s2]")
#axd["timepart"].plot(df["x"], df["ay"], color="black", linewidth=0.5)
#axd["timepart"].set_xlabel("distance [meters]")
#xd["timepart"].set_ylabel("Acceleration y [m/s2]")
axd["time2"].plot(df["x"], df["ay"], color="black", linewidth=0.1)
axd["time2"].set_xlabel("distance [meters]")
axd["time2"].set_ylabel("Acceleration y [m/s2]")
fs = 1/0.5
time, freq, period, spectrum = spectogram(df["ay"], fs)
axd["freq"].pcolormesh(time, (freq), np.log10(spectrum), cmap="coolwarm")
axd["freq"].set_xlabel("distance [meters]")
axd["freq"].set_ylabel("frequency [1/m]")
axd["period"].pcolormesh(time, (period[::-1]), np.log10(spectrum[:0:-1]), cmap="coolwarm")
axd["period"].set_xlabel("distance [meters]")
axd["period"].set_ylabel("period [m]")
axd["period"].set_ylim([0, 25])
plt.show()
Data voorbereiding:
Code: Selecteer alles
import pandas as pd
import numpy as np
df = pd.read_excel("treinreis/Retour.xlsx")
df = df.fillna(method="ffill")
df["dt"] = df["t"].diff()
df["x"] = df["dt"] * df["vx"]
df["x"] = df["x"].cumsum()
df["x"] = df["x"].apply(lambda x: 0.5 * np.round(x/0.5, 0))
df = df.groupby("x").mean()
df.to_excel("treinreis/Retour-calc.xlsx")