当前位置:   article > 正文

三种插值算法的对比_三次样条插值和线性插值对比

三次样条插值和线性插值对比

1、线性插值

线性插值是最简单的插值方法。它假设输入数据点之间的函数在每个点上是线性的。在找到输入点之间的位置后,线性插值函数会计算出新位置处的函数值。

2、‘slinear’插值

‘slinear’插值方法使用线性插值的方式对原始数据进行平滑。在调用interp1d函数时,需要将参数kind设置成‘slinear’。

3、三次样条插值

三次样条插值使用光滑的三次多项式来逼近输入数据点之间的函数。这个插值方法会生成一个三次样条函数,它在离散点之间具有三阶平滑性。使用三次样条插值方法时,在调用interp1d函数时,需要将参数kind设置成‘cubic’。示例代码如下所示:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from scipy.interpolate import interp1d
  4. # 参数设置
  5. amplitude = 1.0 # 振幅
  6. frequency = 5.0 # 频率(周期为2*pi/frequency)
  7. sample_rate = 1000 # 采样率
  8. duration = 1.0 # 波形持续时间
  9. # 生成时间序列
  10. t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)
  11. # 生成正弦波形
  12. signal = amplitude * np.sin(2 * np.pi * frequency * t)
  13. # 对正弦波进行离散采样
  14. sample_points = np.arange(0, len(t), step=50) # 每50个点采样一次
  15. sampled_signal = signal[sample_points]
  16. # 绘制原始波形
  17. plt.subplot(5, 1, 1) # 表示将整个图像窗口分为3行1列, 当前位置为1
  18. plt.plot(t, signal)
  19. plt.title('Original Sinusoidal Waveform')
  20. plt.xlabel('Time (s)')
  21. plt.ylabel('Amplitude')
  22. plt.grid(True)
  23. # 绘制采样后的波形和拟合曲线
  24. plt.subplot(5, 1, 2)
  25. plt.plot(sample_points / sample_rate, sampled_signal)
  26. plt.stem(sample_points / sample_rate, sampled_signal, markerfmt='ro', linefmt='r-', basefmt='k-')
  27. # plt.plot(t, fit_curve, 'g--', label='Fit Curve')
  28. plt.title('Sampled Sinusoidal Waveform with Fit Curve')
  29. plt.xlabel('Time (s)')
  30. plt.ylabel('Amplitude')
  31. plt.legend()
  32. plt.grid(True)
  33. # 绘制插值后的曲线
  34. # f = interp1d(sample_points / sample_rate,sampled_signal, kind='cubic')
  35. f = interp1d(sample_points / sample_rate,sampled_signal, kind='linear')
  36. # f = interp1d(sample_points / sample_rate,sampled_signal, kind='slinear')
  37. x_interp = np.linspace(min(sample_points / sample_rate), max(sample_points / sample_rate), 40)
  38. y_interp = f(x_interp)
  39. plt.subplot(5, 1, 3)
  40. plt.plot(x_interp, y_interp, label='Smoothed Curve', color='blue')
  41. plt.stem(x_interp, y_interp, markerfmt='ro', linefmt='r-', basefmt='k-')
  42. plt.title('kind = linear')
  43. plt.xlabel('Time (s)')
  44. plt.ylabel('Amplitude')
  45. plt.tight_layout()
  46. # plt.show()
  47. # 绘制插值后的曲线
  48. # f = interp1d(sample_points / sample_rate,sampled_signal, kind='cubic')
  49. # f = interp1d(sample_points / sample_rate,sampled_signal, kind='linear')
  50. f = interp1d(sample_points / sample_rate,sampled_signal, kind='slinear')
  51. x_interp = np.linspace(min(sample_points / sample_rate), max(sample_points / sample_rate), 40)
  52. y_interp = f(x_interp)
  53. plt.subplot(5, 1, 4)
  54. plt.plot(x_interp, y_interp, label='Smoothed Curve', color='blue')
  55. plt.stem(x_interp, y_interp, markerfmt='ro', linefmt='r-', basefmt='k-')
  56. plt.title('kind = slinear')
  57. plt.xlabel('Time (s)')
  58. plt.ylabel('Amplitude')
  59. plt.tight_layout()
  60. # plt.show()
  61. # 绘制插值后的曲线
  62. f = interp1d(sample_points / sample_rate,sampled_signal, kind='cubic')
  63. # f = interp1d(sample_points / sample_rate,sampled_signal, kind='linear')
  64. x_interp = np.linspace(min(sample_points / sample_rate), max(sample_points / sample_rate), 40)
  65. y_interp = f(x_interp)
  66. plt.subplot(5, 1, 5)
  67. plt.plot(x_interp, y_interp, label='Smoothed Curve', color='blue')
  68. plt.stem(x_interp, y_interp, markerfmt='ro', linefmt='r-', basefmt='k-')
  69. plt.title('kind = cubic')
  70. plt.xlabel('Time (s)')
  71. plt.ylabel('Amplitude')
  72. plt.tight_layout()
  73. plt.show()

运行结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/193317
推荐阅读
相关标签
  

闽ICP备14008679号