Cách tiếp cận đơn giản nhất là thực hiện một số loại nội suy spline như Jim Clay gợi ý (tuyến tính hoặc cách khác). Tuy nhiên, nếu bạn có sự sang trọng của xử lý hàng loạt và đặc biệt là nếu bạn có một bộ mẫu không định dạng quá mức, thì có một thuật toán "tái tạo hoàn hảo" cực kỳ thanh lịch. Vì lý do số, nó có thể không thực tế trong mọi trường hợp, nhưng ít nhất nó đáng để biết về khái niệm. Lần đầu tiên tôi đọc về nó trong bài báo này .
Bí quyết là xem xét tập hợp các mẫu không hình thành của bạn như đã được xây dựng lại từ các mẫu thống nhất thông qua phép nội suy chân thành . Theo ký hiệu trong bài báo:
y(t)=∑k=1Ny(kT)sin(π(t−kT)/T)π(t−kT)/T=∑k=1Ny(kT)sinc(t−kTT).
Lưu ý rằng điều này cung cấp một tập hợp các phương trình tuyến tính, một phương trình cho mỗi mẫu không dạng , trong đó các ẩn số là các mẫu có khoảng cách đều nhau , như vậy: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)⎤⎦⎥⎥⎥⎥.
Trong phương trình trên, là số lượng mẫu đồng nhất chưa biết, là tỷ lệ nghịch của tỷ lệ mẫu thống nhất và là số lượng mẫu không đồng nhất (có thể lớn hơn ). Bằng cách tính toán giải pháp bình phương nhỏ nhất của hệ thống đó, các mẫu thống nhất có thể được xây dựng lại. Về mặt kỹ thuật, chỉ có mẫu phi hình thành là cần thiết, nhưng tùy thuộc vào mức độ "phân tán" của chúng trong thời gian, ma trận nội suy có thể bị điều hòa khủng khiếp . Khi đó là trường hợp, sử dụng nhiều mẫu nonuniform thường giúp.nTmnn
Như một ví dụ về đồ chơi, đây là một so sánh (sử dụng numpy ) giữa phương pháp trên và phép nội suy spline khối trên một lưới bị xáo trộn nhẹ:
(Mã để tái tạo âm mưu trên được bao gồm ở cuối câu trả lời này)
Tất cả những gì đang được nói, đối với các phương pháp mạnh mẽ, chất lượng cao, bắt đầu bằng một thứ gì đó trong một trong các giấy tờ sau đây có lẽ sẽ phù hợp hơn:
A. Aldroubi và Karlheinz Grochenig, Lấy mẫu và tái cấu trúc Nonuniform trong không gian bất biến , SIAM Rev., 2001, no. 4, 585-620. ( liên kết pdf ).
K. Grochenig và H. Schwab, Phương pháp tái tạo cục bộ nhanh để lấy mẫu không đồng nhất trong không gian bất biến thay đổi , SIAM J. Matrix Anal. Ứng dụng, 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()