如何使用SciPy对非均匀信号进行统一重采样?

9
我有一个在 x 方向上采样率不均匀的 (x, y) 信号(采样率大致与 1/x 成比例)。我尝试使用 scipy.signal 的 resample 函数对其进行均匀重采样。根据文档,我可以传递以下参数:scipy.resample(array_of_y_values, number_of_sample_points, array_of_x_values),它将返回[[resampled_y_values],[new_sample_points]]格式的数组。我期望它能返回一个采样率均匀且形式与原始数据大致相同的数据,具有相同的最小和最大 x 值。但实际效果并非如此。
# nu_data = [[x1, x2, ..., xn], [y1, y2, ..., yn]] 
# with x values in ascending order

length = len(nu_data[0])
resampled = sg.resample(nu_data[1], length, nu_data[0])

uniform_data = np.array([resampled[1], resampled[0]])

plt.plot(nu_data[0], nu_data[1], uniform_data[0], uniform_data[1])
plt.show()

enter image description here 蓝色: nu_data, 橙色: uniform_data

图像看起来并不是原始的,x轴范围也已被调整。如果我尝试修复范围:自己构建所需的均匀x值并使用它们代替,畸变仍然存在:

length = len(nu_data[0])
resampled = sg.resample(nu_data[1], length, nu_data[0])
delta = (nu_data[0,-1] - nu_data[0,0]) / length
new_samplepoints = np.arange(nu_data[0,0], nu_data[0,-1], delta)
uniform_data = np.array([new_samplepoints, resampled[0]])

plt.plot(nu_data[0], nu_data[1], uniform_data[0], uniform_data[1])
plt.show()

图片描述

如果不用这种方法,如何正确地对我的数据进行均匀重采样?


1
那么插值怎么样?我会选择像4这样的较小点集,从而找到特定点。问题是你的数据集有多大... - Michał Zaborowski
@MichałZaborowski,使用线性样条似乎效果不错。谢谢你的提示,我会采用这种方法。 现在我不明白的是为什么结果出错了?resample不是应该处理非均匀采样数据并将其重新采样为均匀数据吗?... - Neinstein
1
请查看我在此相关(重复?)问题的答案:https://dev59.com/NHrZa4cB1Zd3GeqP7tkF#20889651 - Warren Weckesser
1个回答

7
请看这个初步的解决方案:
import matplotlib.pyplot as plt
from scipy import interpolate
import numpy as np

x = np.array([0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20])
y = np.exp(-x/3.0)
flinear = interpolate.interp1d(x, y)
fcubic = interpolate.interp1d(x, y, kind='cubic')

xnew = np.arange(0.001, 20, 1)
ylinear = flinear(xnew)
ycubic = fcubic(xnew)
plt.plot(x, y, 'X', xnew, ylinear, 'x', xnew, ycubic, 'o')
plt.show()

这是从scipy网页上更新的一个例子。如果你运行它,你应该会看到像下面这样的东西: enter image description here

蓝色十字架表示初始函数,即采用非均匀采样分布的信号。有两个结果,橙色的x代表线性插值,绿色的点代表三次插值。问题是你更喜欢哪个选项?个人认为我都不喜欢,所以我通常选择4个点并在它们之间插值,然后再插入另外一些点......以获得无奇怪波动的三次插值。这需要更多的工作量,而且我也看不到使用scipy实现这一点,所以速度会很慢。这就是为什么我问过数据的大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接