Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过原始数据点所需的三次样条插值因子(scipy、python)_Python_Interpolation_Sampling_Spline_Cubic - Fatal编程技术网

通过原始数据点所需的三次样条插值因子(scipy、python)

通过原始数据点所需的三次样条插值因子(scipy、python),python,interpolation,sampling,spline,cubic,Python,Interpolation,Sampling,Spline,Cubic,我正在使用scipy.interpolate.interp1d对信号进行三次样条插值。虽然我相信插值信号应该通过所有原始数据点,但当使用某些因子进行插值时,情况并非如此 e、 g.如果有N个样本,样本之间有N-1个空格,插值因子为f,我们可以在样本之间插入x个点N*f==(N-1)*x+N。如果x不是整数,则插值信号无法通过原始数据点。正如预期的那样,这是一种情况,使用下面的scipy编码,N=4,插值因子f为3或4 我的问题是A)这是正确的还是我做错了什么?和B)是上面的公式,其中x是一个整数

我正在使用scipy.interpolate.interp1d对信号进行三次样条插值。虽然我相信插值信号应该通过所有原始数据点,但当使用某些因子进行插值时,情况并非如此

e、 g.如果有N个样本,样本之间有N-1个空格,插值因子为f,我们可以在样本之间插入x个点N*f==(N-1)*x+N。如果x不是整数,则插值信号无法通过原始数据点。正如预期的那样,这是一种情况,使用下面的scipy编码,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

首先,正如您所写,三次插值确实会通过其原始点。您可以通过以下方式进行验证:

all(y == interp_f(x))  # gives True
你的上采样公式似乎有点混乱。如果我们浏览一个示例,很容易看出:

  • 假设我们有区间
    [0,w]
    ,其中
    w=2
  • 具有
    n=5
    样本时,给出
    (n-1)
    宽度间隔
    d=w/(n-1)=.5
  • 为了增加样本的系数
    f=4
    ,我们将新的间隔宽度改为
    d_4=d/f=0.125
  • 因此
    d_4=w/(n_4-1)
    也需要保持,其中
    n_4
    是上采样信号的样本数
  • 利用
    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.")