簡體   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