Выравнивание перекоса шумного сигнала в Python - PullRequest
0 голосов
/ 19 марта 2020

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

Image of raw data

У меня есть несколько таких набор данных, и я пытаюсь выровнять их все так, чтобы я мог сравнить их. Теперь мне удалось создать некоторый код, который использует 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=',')

Этот подход кажется вполне разумным, поскольку он генерирует отфильтрованный сигнал моих данных, который я могу использовать для выравнивания графика следующим образом.

Image of signal generated by filtering

И который дает мне окончательный результат в конце, как это происходит, с определенным смещением в 45 секунд, которое я положил.

Image of shifted data

И пока это работает для наборов данных, которые у меня есть, однако я чувствую, что я ' Я усложняю мой подход. Теперь мне было интересно, если есть, возможно, более простой и надежный способ, которым я могу подавить этот сигнал? Потому что я чувствую, что если применить это к другому набору данных, это, вероятно, не сработает.

...