繁体   English   中英

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

[英]How to increase 1d-data resolution though interpolating in between measurements?

我正在开发一个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、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,9,10,12,12,13,14,15,17.5,20 ...])

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

为什么不做线性拟合?

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]))

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM