我使用scipy.interpolate.interp1d进行三次样条插值信号。虽然我认为插值信号应该通过所有原始数据点,但在某些因素的情况下,情况并非如此。
例如,如果有N个样本,样本之间有N-1个空间,且插值因子为f,则可以在样本N*f == (N-1)*x +N之间插入x点,如果x不是一个整数,则插值信号不能通过原始数据点。与预期的情况一样,下面使用的代码N= 4,插值因子f为3或4。
我的问题是A)这是正确的还是我做错了什么?B)是上面的公式,其中x是一个整数,是对原始数据样本将出现在插值信号中的充分检验(或者可能存在边缘情况)。
非常感谢
import scipy.interpolate
import numpy as np
# produce random data and interp
x = np.linspace(0, 2, 4)
np.random.seed(123)
y = np.random.random(4)
interp_f = scipy.interpolate.interp1d(x, y, kind='cubic')
# upsample factor 4
x_f4 = np.linspace(0, 2, 16)
y_f4 = interp_f(x_f4)
# upsample factor 3
x_f3 = np.linspace(0, 2, 12)
y_f3 = interp_f(x_f3)
print("Sample 2 in raw data: {0:.10f}, Sample 6 in interp f4: {1:.10f}, Sample 4 in interp f3: {2:.10f}".format(y[1], y_f4[5], y_f3[4]))
# Sample 2 in raw data: 0.2861393350, Sample 6 in interp f4: 0.2861393350, Sample 5 in interp f3: 0.2657521625发布于 2020-09-18 22:48:53
首先,正如您所写的,一个三次插值通过它的原始点是正确的。您可以通过以下方式验证这一点:
all(y == interp_f(x)) # gives True你的上采样公式似乎有点混乱。如果我们通过一个例子,很容易看出:
假定我们有区间d = w/(n-1) = .5.
d_4 = d / f = 0.125.
n = 5样本以f=4因子给出了(n-1)宽度区间,除了d_4 = d / f = 0.125.
d_4 = w / (n_4 - 1)需要保持的新的区间宽度外,n_4是向上采样的signal.
1 / d_4 = f * (n-1) / w的样本数应该等于(n_4 - 1) / w在n_4 = f * (n-1) + 1 = 17中的结果。
只要f是正整数,原始样本就会包含在上采样信号中(由于d_4 = d / f)。我们可以通过以下方式验证我们的公式:
n, f = 5, 4
n_4 = f * (n-1) + 1
x = np.linspace(0, 2, n)
x_4 = np.linspace(0, 2, n_4)
if all(x_4[::f] == x): # Every fourth sample is equal to the original
print("Up-sampling works.")https://stackoverflow.com/questions/63918911
复制相似问题