วิธีที่ง่ายที่สุดคือการแก้ไขแบบอิสระเช่นJim Clay แนะนำ (เชิงเส้นหรืออื่น ๆ ) อย่างไรก็ตามหากคุณมีความหรูหราของการประมวลผลแบบแบทช์และโดยเฉพาะอย่างยิ่งถ้าคุณมีตัวอย่างที่ไม่ได้กำหนดจำนวนมากเกินไปมันมีอัลกอริทึม "การสร้างใหม่ที่สมบูรณ์แบบ" ซึ่งสง่างามที่สุด สำหรับเหตุผลที่เป็นตัวเลขอาจไม่สามารถใช้ได้ในทุกกรณี แต่อย่างน้อยก็ควรรู้เกี่ยวกับแนวคิด ก่อนอื่นฉันอ่านเกี่ยวกับเรื่องนี้ในเอกสารนี้
เคล็ดลับคือการพิจารณากลุ่มตัวอย่าง nonuniform ของคุณว่ามีการสร้างขึ้นใหม่จากตัวอย่างสม่ำเสมอผ่านการแก้ไขแบบซิน ตามสัญลักษณ์ในกระดาษ:
y(t)=∑k=1Ny(kT)sin(π(t−kT)/T)π(t−kT)/T=∑k=1Ny(kT)sinc(t−kTT).
โปรดทราบว่านี่เป็นชุดของสมการเชิงเส้นหนึ่งชุดสำหรับแต่ละตัวอย่างที่ไม่ใช่แบบฟอร์มโดยที่ไม่ทราบค่าเป็นตัวอย่างระยะห่างเท่ากันเช่น:y ( k T )y(t)y(kT)
⎡⎣⎢⎢⎢⎢y(t0)y(t1)⋯y(tm)⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢sinc(t0−TT)sinc(t1−TT)⋯sinc(tm−TT)sinc(t0−2TT)sinc(t1−2TT)⋯sinc(tm−2TT)⋯⋯⋯⋯sinc(t0−nTT)sinc(t1−nTT)⋯sinc(tm−nTT)⎤⎦⎥⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢y(T)y(2T)⋯y(nT)⎤⎦⎥⎥⎥⎥.
ในสมการข้างต้นคือจำนวนตัวอย่างเครื่องแบบที่ไม่รู้จักคือค่าผกผันของอัตราตัวอย่างสม่ำเสมอและคือจำนวนตัวอย่างที่ไม่เป็นรูปแบบ (ซึ่งอาจมากกว่า ) ด้วยการคำนวณวิธีกำลังสองน้อยที่สุดของระบบนั้นจะสามารถสร้างตัวอย่างแบบสม่ำเสมอได้ ในทางเทคนิคเท่านั้นตัวอย่างสม่ำเสมอเป็นสิ่งจำเป็น แต่ขึ้นอยู่กับวิธีการ "กระจัดกระจาย" พวกเขาอยู่ในเวลาเมทริกซ์การแก้ไขอาจจะน่ากลัวป่วยปรับอากาศ เมื่อเป็นเช่นนั้นการใช้ตัวอย่างที่ไม่ได้เป็นรูปแบบปกติจะช่วยได้มากขึ้นT m n nnTmnn
เป็นตัวอย่างของเล่นต่อไปนี้เป็นการเปรียบเทียบ (โดยใช้numpy ) ระหว่างวิธีการข้างบนและการแก้ไขลูกบาศก์ spline บนตารางที่มีการสั่นเล็กน้อย:
(รหัสในการทำซ้ำพล็อตข้างต้นรวมอยู่ในตอนท้ายของคำตอบนี้)
ทั้งหมดที่กล่าวมาสำหรับวิธีการที่มีคุณภาพสูงและมีประสิทธิภาพเริ่มต้นด้วยบางสิ่งในเอกสารใดเอกสารหนึ่งต่อไปนี้อาจจะเหมาะสมกว่า:
A. Aldroubi และ Karlheinz Grochenig การสุ่มตัวอย่าง Nonuniform และการสร้างใหม่ในช่องว่าง shift-invariant , SIAM Rev. , 2001, no. 4, 585-620 ( ลิงก์ pdf )
K. Grochenig และ H. Schwab, วิธีการสร้างใหม่แบบเร็วสำหรับการสุ่มตัวอย่างแบบไม่สม่ำเสมอในช่องว่าง shift-invariant , SIAM J. Matrix Anal Appl., 24 (2003), 899- 913
-
import numpy as np
import pylab as py
import scipy.interpolate as spi
import numpy.random as npr
import numpy.linalg as npl
npr.seed(0)
class Signal(object):
def __init__(self, x, y):
self.x = x
self.y = y
def plot(self, title):
self._plot(title)
py.plot(self.x, self.y ,'bo-')
py.ylim([-1.8,1.8])
py.plot(hires.x,hires.y, 'k-', alpha=.5)
def _plot(self, title):
py.grid()
py.title(title)
py.xlim([0.0,1.0])
def sinc_resample(self, xnew):
m,n = (len(self.x), len(xnew))
T = 1./n
A = np.zeros((m,n))
for i in range(0,m):
A[i,:] = np.sinc((self.x[i] - xnew)/T)
return Signal(xnew, npl.lstsq(A,self.y)[0])
def spline_resample(self, xnew):
s = spi.splrep(self.x, self.y)
return Signal(xnew, spi.splev(xnew, s))
class Error(Signal):
def __init__(self, a, b):
self.x = a.x
self.y = np.abs(a.y - b.y)
def plot(self, title):
self._plot(title)
py.plot(self.x, self.y, 'bo-')
py.ylim([0.0,.5])
def grid(n): return np.linspace(0.0,1.0,n)
def sample(f, x): return Signal(x, f(x))
def random_offsets(n, amt=.5):
return (amt/n) * (npr.random(n) - .5)
def jittered_grid(n, amt=.5):
return np.sort(grid(n) + random_offsets(n,amt))
def f(x):
t = np.pi * 2.0 * x
return np.sin(t) + .5 * np.sin(14.0*t)
n = 30
m = n + 1
# Signals
even = sample(f, np.r_[1:n+1] / float(n))
uneven = sample(f, jittered_grid(m))
hires = sample(f, grid(10*n))
sinc = uneven.sinc_resample(even.x)
spline = uneven.spline_resample(even.x)
sinc_err = Error(sinc, even)
spline_err = Error(spline, even)
# Plot Labels
sn = lambda x,n: "%sly Sampled (%s points)" % (x,n)
r = lambda x: "%s Reconstruction" % x
re = lambda x: "%s Error" % r(x)
plots = [
[even, sn("Even", n)],
[uneven, sn("Uneven", m)],
[sinc, r("Sinc")],
[sinc_err, re("Sinc")],
[spline, r("Cubic Spline")],
[spline_err, re("Cubic Spline")]
]
for i in range(0,len(plots)):
py.subplot(3, 2, i+1)
p = plots[i]
p[0].plot(p[1])
py.show()