【发布时间】:2021-10-03 09:03:07
【问题描述】:
我目前有两个周期信号:一个以蓝色显示的输出信号和一个以绿色显示的噪声信号。显示的两条曲线都已转换为任意值,以清楚地分开曲线。鉴于噪声和输出具有相似的相位,我想做的是缩放噪声信号,使其具有与输出信号相同的幅度,然后从输出信号中去除噪声以消除任何振荡(希望)获得一条穿过输出信号平均值的直线。
鉴于噪声信号也在平均值附近振荡,我觉得两个信号的简单相减是行不通的,因为这只会使振荡更大。
输出信号和噪声信号都由不同数量的数据点组成(输出 - 58050 个数据点,噪声 - 52774 个数据点)这在 python 中如何实现?
数据文件如下:
噪音:https://drive.google.com/file/d/1RZwknUUAXGG31J9u_37aH7m9Fdyy_opE/view?usp=sharing
输出:https://drive.google.com/file/d/1E6vLa8Z63UtftrscKmicpid5uBVqoMpv/view?usp=sharing
我用来从 .csv 文件导入两个信号并绘制它们的代码如下所示。
import numpy as np
import pandas as pd
# from scipy.optimize import curve_fit
from datetime import datetime
from datetime import timedelta
import matplotlib
import matplotlib.pyplot as plt
datathick = "20210726_rig_thick.csv"
qcmfilter = "20210726_cool_QCM_act.csv"
with open(datathick) as f:
lines = f.readlines()
dates = [str(line.split(',')[0]) for line in lines]
thick = [float(line.split(',')[1]) for line in lines] #output y data
z = [float(line.split(',')[2]) for line in lines]
date_thick = [datetime.strptime(x,'%Y-%m-%dT%H:%M:%S.%f').time() for x in dates]
with open(qcmfilter) as f:
lines = f.readlines()
dates_qcm = [str(line.split(',')[0]) for line in lines]
temp_qcm = [float(line.split(',')[1])+420 for line in lines] #noise y data
z = [float(line.split(',')[2]) for line in lines]
date_temp_qcm = [datetime.strptime(x,'%Y-%m-%dT%H:%M:%S.%f').time() for x in dates_qcm]
time_list_thick = []
for i in np.arange(0, len(date_thick)):
q = date_thick[i]
t = timedelta(hours= q.hour, minutes=q.minute,seconds=q.second, microseconds = q.microsecond).total_seconds()
time_list_thick.append(float(t))
time_list_temp_qcm = []
for i in np.arange(0, len(date_temp_qcm)):
q3 = date_temp_qcm[i]
t3 = timedelta(hours= q3.hour, minutes=q3.minute,seconds=q3.second, microseconds = q3.microsecond).total_seconds()
time_list_temp_qcm.append(float(t3))
#------------------------------------------------
fig=plt.figure(figsize=(7.,7.))
ax=fig.add_subplot(1,1,1)
ax.set_zorder(1)
ax.patch.set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.set_xlabel('Time (s)')
ax.set_ylabel('Amplitude (a.u)')
ax.minorticks_on() # enable minor ticks
ax.xaxis.set_ticks_position('bottom')
ax.spines['left'].set_color('black')
ax.yaxis.label.set_color('black')
ax.set_ylim(440,460)
ax.set_xlim(0, 10000)
ax.tick_params(direction='out', axis='y', which='both', pad=4, colors='black')
ax.grid(b=True, which='major', color='#eeeeee', linestyle='-', zorder=1, linewidth=0.4) # turn on major grid
ax.grid(b=True, which='minor', color='#eeeeee', linestyle='-', zorder=1, linewidth=0.4) # turn on minor grid
ax.plot(time_list_thick, thick,color='blue')
ax.plot(time_list_temp_qcm, temp_qcm, color = 'green')
plt.savefig('QCM.pdf', dpi=300, bbox_inches='tight', format='pdf')
plt.savefig('QCM.png', dpi=300, bbox_inches='tight', format='png')
编辑:按照 Mozway 的回答中给出的建议后,我已将我的两个数据集更改为熊猫系列:
signal = pd.Series(thick, index = pd.TimedeltaIndex(time_list_thick,unit = 's'))
noise = pd.Series(temp_qcm, index = pd.TimedeltaIndex(time_list_temp_qcm,unit = 's'))
resampled_signal = signal.resample('1S').mean()
resampled_noise = noise.resample('1S').mean()
true_signal = []
for i in np.arange(0,len(resampled_signal)):
value = resampled_signal[i]-resampled_noise[i]
true_signal.append(value)
但是,真实信号在数据中出现断断续续,如下所示,真实信号也不是像我最初预期的那样围绕振荡原始信号的平均值。 我将尝试找到一种方法来提供对原始数据文件的访问权限,以便更容易获得答案。
【问题讨论】:
-
您可以从数据中减去噪声:
pure_data = [d - n for d, n in zip(time_list_thick, time_list_temp_qcm)]考虑到time_list_thick是数据,time_list_temp_qcm是噪声 -
这只是x数据,我要过滤的是y数据
thick(输出)和temp_QCM(噪声)。但是,这两个数据集的大小不同(分别为 58050 和 52774 个数据点) -
@tjsmert44 你有机会测试my answer 是否适合你吗?能否提供两条曲线的数据?
-
@mozway 我已经编辑了问题以更新我到目前为止所做的事情
-
@mozway 我还附上了数据文件供您访问和尝试。
标签: python pandas numpy matplotlib signal-processing