如何通过在两次测量之间进行插值来提高一维数据分辨率?

时间:2019-08-29 07:05:58

标签: numpy interpolation resolution sensor python-3.7

我正在开发一个pythong脚本,在该脚本中,我从安装了低分辨率编码器的电机接收角度测量值。我从电机获得的数据分辨率很低(两次测量之间大约相差5度)。这是传感器以恒定速度(以度为单位)旋转时的输出示例:

传感器输出=([5,5,5,5,5,10,10,10,10,10,15,15,20,20,20,20,25,25,30,30,30, 30,30,35,35 ....])

如您所见,其中一些测量正在重复进行。 根据这些测量值,我想进行插值,以便在一维数据点之间获得测量值。例如,如果我在时间k处接收到角度测量值theta = 5,而在下一个实例中,在t = k + 1处也接收到测量值theta = 5,则我想计算出一个类似于theta = 5的估计值+(1/5)。
我也一直在考虑使用某种预测性过滤,但是如果在这种情况下甚至适用(例如卡尔曼过滤),我不确定要使用哪种预测性过滤。由于电动机以恒定的角速度旋转,因此估计的输出应为线性形式。

我尝试使用numpy.linspace来实现我想要的功能,但似乎无法使其按我想要的方式工作:

# Interpolate for every 'theta_div' values in angle received through 
# modbus
for k in range(np.size(rx)):
    y = T.readSensorData() # take measurement (call read sensor function)
    fp = np.linspace(y, y+1, num=theta_div)
    for n in range(theta_div):
        if k % 6 == 0:
            if not y == fp[n]:
                z = fp[n]
            else:
                z = y
        print(z)

因此对于传感器读数:([5、5、5、5、5、10、10、10、10、10、15、15、20、20、20、20、25、25、30、30 ,30,30,30,35,35 ....])#每个元素在时间= k0 ... kn

我希望输出类似于: theta =([5,6,7,8,9,10,11,12,13,14,15,17.5,20 ...])

因此,简而言之,我需要某种预测,然后使用传感器的实际读数更新值,类似于卡尔曼滤波器中的过程。

1 个答案:

答案 0 :(得分:1)

为什么不做线性拟合?

import numpy as np
import matplotlib.pyplot as plt

messurements = np.array([5, 5, 5, 5, 5, 10, 10, 10, 10 ,10, 15, 15, 20, 20, 20, 20, 25, 25, 30, 30, 30, 30, 30, 35, 35])
time_array = np.arange(messurements.shape[0])

fitparms = np.polyfit(time_array,messurements,1)

def line(x,a,b):
    return a*x +b


better_time_array = np.linspace(0,np.max(time_array))


plt.plot(time_array,messurements)
plt.plot(better_time_array,line(better_time_array,fitparms[0],fitparms[1]))

enter image description here