, поэтому я относительно новичок в Python и использую его в настоящее время для выравнивания и обрезки некоторых очень шумных данных о температуре, которые у меня есть. Таким образом, мои данные, как правило, имеют форму кривой вверх, пока температура не возрастет во временном порядке, и вызывает своего рода локализованную синусоидальную волну.
У меня есть несколько таких набор данных, и я пытаюсь выровнять их все так, чтобы я мог сравнить их. Теперь мне удалось создать некоторый код, который использует FFT, чтобы найти пики данных таким образом, чтобы я мог найти более или менее медиану и сместить медианы в нужное место.
import numpy as np
import matplotlib.pyplot as pp
import glob as glob
import scipy.fftpack as fft
from scipy.signal import savgol_filter
dataset = glob.glob('*.csv')
for i in range(0,len(dataset)):
data = np.loadtxt(dataset[i], skiprows=1, usecols = (2,3), delimiter=",")
save_name = dataset[i].replace(".csv","_processed.csv")
time = data[:,0]
temp = data[:,1]
d_temp = savgol_filter(np.diff(temp),51,11)
#perform fast forward FFT on temperature data
w = fft.rfft(d_temp)
f = fft.rfftfreq(100, time[1]-time[0])
spectrum = w**2
#Filter
cutoff_idx = spectrum < (spectrum.max()/10)
w2 = w.copy()
w2[cutoff_idx] = 0
sig_fit = savgol_filter(fft.irfft(w2),81,7)
#plot filtered
pp.figure(1)
pp.plot(time,temp)
pp.plot(time[0:-1],sig_fit*10)
d_temp_id = np.argmax(sig_fit)
#Set time offset from peak
peak_offset = 45
time_del = time[d_temp_id] - peak_offset
time_end = time[d_temp_id] + peak_offset
#Trim time and temperature measurements
time_trim = time[np.logical_and(time > time_del, time <= time_end)] - time[time > time_del][0]
temp_trim = temp[np.logical_and(time > time_del, time <= time_end)]
pp.figure(2)
pp.plot(time_trim,temp_trim)
#Determine average start and change in temperature
start_temp = temp_trim[0:3].mean()
del_temp = temp_trim - start_temp
change_temp = (del_temp/start_temp)*100
#Create data and save to new folder
save_data = np.transpose([time_trim,temp_trim,del_temp,change_temp])
np.savetxt("Processed/"+save_name,save_data,delimiter=',')
Этот подход кажется вполне разумным, поскольку он генерирует отфильтрованный сигнал моих данных, который я могу использовать для выравнивания графика следующим образом.
И который дает мне окончательный результат в конце, как это происходит, с определенным смещением в 45 секунд, которое я положил.
И пока это работает для наборов данных, которые у меня есть, однако я чувствую, что я ' Я усложняю мой подход. Теперь мне было интересно, если есть, возможно, более простой и надежный способ, которым я могу подавить этот сигнал? Потому что я чувствую, что если применить это к другому набору данных, это, вероятно, не сработает.