Der einfachste Ansatz besteht darin, eine Art Spline-Interpolation durchzuführen, wie Jim Clay vorschlägt (linear oder auf andere Weise). Wenn Sie jedoch den Luxus einer Stapelverarbeitung haben und besonders wenn Sie einen überbestimmten Satz ungleichmäßiger Proben haben, gibt es einen "perfekten Rekonstruktions" -Algorithmus, der äußerst elegant ist. Aus numerischen Gründen ist es möglicherweise nicht in allen Fällen praktikabel, aber es lohnt sich zumindest, das Konzept zu kennen. Ich habe es zum ersten Mal in diesem Artikel gelesen .
Der Trick besteht darin, Ihren Satz von ungleichmäßigen Abtastwerten als bereits aus gleichmäßigen Abtastwerten durch Sinusinterpolation rekonstruiert zu betrachten . Nach der Notation in der Zeitung:
y( t ) = ∑k = 1Ny( k T) Sünde( π( t - k T) / T)π( t - k T) / T= ∑k = 1Ny( k T) s i n c ( t - k TT) .
Beachten Sie, dass dies einen Satz linearer Gleichungen liefert, eine für jede ungleichmäßige Stichprobe , wobei die Unbekannten die gleich beabstandeten Stichproben y ( k T ) sind , wie folgt: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)⎤⎦⎥⎥⎥⎥.
nTmnn
Als ein Spielzeugbeispiel ist hier ein Vergleich (unter Verwendung von numpy ) zwischen der obigen Methode und der kubischen Spline-Interpolation auf einem leicht zitternden Gitter:
(Der Code zum Reproduzieren des obigen Diagramms befindet sich am Ende dieser Antwort.)
Alles, was gesagt wird, wäre für qualitativ hochwertige, robuste Methoden, beginnend mit etwas in einem der folgenden Papiere, wahrscheinlich angemessener:
A. Aldroubi und Karlheinz Grochenig, Uneinheitliche Abtastung und Rekonstruktion in verschiebungsinvarianten Räumen , SIAM Rev., 2001, Nr. 4, 585 & ndash; 620. ( pdf link ).
K. Grochenig und H. Schwab, Schnelle lokale Rekonstruktionsmethoden für ungleichmäßige Probenahme in verschiebungsinvarianten Räumen , 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()