Zuerst eine Demonstration, dass die Quadrate von beiden
[ … , 0 , 0 , 1 ,- -1 , 0 , 0 , … ] und[ … , 0 , 0 , 1 , - 1 , 0 , 0 , … ]
gleich
[ … , 0 , 0 , 1 ,- -1 , 0 , 0 , … ] und
Die Quadrate ihrer Sinc-Interpolationen unterscheiden sich jedoch (Abb. 1):
Abbildung 1. Quadrate der Sinusinterpolationen von [ 1 , 1 ] (blau) und [ 1 , - 1 ] (rot).
Dies zeigt, dass es im Allgemeinen nicht möglich ist, das Quadrat eines bandbegrenzten Signals aus seinen einheitlichen Abtastwerten wiederherzustellen, die bei der kritischen Abtastfrequenz des bandbegrenzten Signals entnommen wurden.
Testen wir verschiedene Interpolationsansätze in Octave. Der Goldstandard der bandbegrenzten Interpolation ist DFT-Zero-Pad-DFT:
>> format free
>> x = [1 2 3];
>> y = [1 2 3 0 0 0];
>> abs(fft(x))
ans =
6 1.73205 1.73205
>> abs(fft(y))
ans =
6 4.3589 1.73205 2 1.73205 4.3589
Der letzte Satz von Zahlen sind die Größenwerte, die aus perfekt interpolierten Frequenzbereichsfächern berechnet wurden. Versuchen wir stattdessen, die Größe zu interpolieren :
>> fft(fftshift(horzcat([0 0], fftshift(ifft(abs(fft(x)))), [0])))
ans =
6 4.57735 1.73205 0.309401 1.73205 4.57735
Scheint ziemlich weit weg zu sein. Versuchen wir nun, die quadratische Größe zu interpolieren :
>> fft(fftshift(horzcat([0 0], fftshift(ifft(abs(fft(x)).^2)), [0])))
ans =
36 25 3 -8 3 25
>> sqrt(ans)
ans =
(6,0) (5,0) (1.73205,0) (0,2.82843) (1.73205,0) (5,0)
Es ist nicht nur ausgeschaltet, sondern gibt auch sqrt()
eine komplexe Zahl für einen negativen interpolierten Wert zurück. Ist also die einzig gültige Möglichkeit, die Bin-Werte zu interpolieren?
Geben wir diesem eine weitere Chance, indem wir versuchen, Frequenzbereichsdaten zu interpolieren, die um den Faktor 2 hochgetastet wurden. Aufgrund der Transformation mit gerader Länge muss das "Nyquist-Sample" dupliziert werden. Entschuldigen Sie daher, wenn der Code schwer zu lesen ist.
>> z = [1 2 3 0 0 0 0 0 0 0 0 0];
>> abs(fft(z))
ans =
6 5.55485 4.3589 2.82843 1.73205 1.77302 2 1.77302 1.73205 2.82843 4.3589 5.55485
Das Obige ist was wir wollen. Versuchen wir, 2x hochgetastete Größe zu interpolieren :
>> fftshift(horzcat([0 0 0], fftshift(ifft(abs(fft(y)))), [0 0 0]))
ans =
3.36365 1.10447 0.318175 0 0 0 0 0 0 -0.208949 0.318175 1.10447
>> ans(4) = ans(length(ans)-2)
ans =
3.36365 1.10447 0.318175 -0.208949 0 0 0 0 0 -0.208949 0.318175 1.10447
>> fft(ans)
ans =
5.79105 5.59483 4.56785 2.7273 1.5231 1.76882
2.20895 1.76882 1.5231 2.7273 4.56785 5.59483
Das ist noch aus. Versuchen wir, 2x hochgetastete quadratische Größe zu interpolieren :
>> fftshift(horzcat([0 0 0], fftshift(ifft(abs(fft(y)).^2)), [0 0 0]))
ans =
14 8 3 0 0 0 0 0 0 1.18424e-15 3 8
>> ans(4) = ans(length(ans)-2)
ans =
14 8 3 1.18424e-15 0 0 0 0 0 1.18424e-15 3 8
>> sqrt(fft(ans))
ans =
6 5.55485 4.3589 2.82843 1.73205 1.77302 2 1.77302 1.73205 2.82843 4.3589 5.55485
Jetzt funktioniert es perfekt! Die Nachricht zum Mitnehmen besteht darin, vor dem Versuch, im Frequenzbereich zu interpolieren, ein Upsampling (Zeitbereich-Null-Pad) um mindestens den Faktor zwei durchzuführen und die quadratische Größe anstelle der Größe zu interpolieren. Dies funktioniert, weil die quadratische Größe der Multiplikation jedes Bin-Werts mit seinem komplexen Konjugat entspricht. Die komplexe Konjugation bewahrt die Bandbreite der durch die Daten dargestellten bandbegrenzten Funktion, sodass die Multiplikation die "Zeitbereichsbandbreite" verdoppelt, da sie der Zeitbereichsfaltung entspricht. Beachten Sie, dass bei der Auswahl der Interpolationsmethode die 2x hochgetastete quadratische Größe immer noch kritisch abgetastet wird, sodass eine weitere Überabtastung die genaue Interpolation erheblich erleichtern sollte.
Ich habe ungefähr meine eigene Frage beantwortet, werde aber weitere Einsichten als Antwort akzeptieren!
PS Ich habe gerade herausgefunden, dass es auch eine interpft
Interpolation mit weniger Syntax gibt.
Zusätzliche Informationen nutzen
Die Interpolation wird durch zusätzliche Informationen zu den Daten einfacher oder sogar genauer, zum Beispiel, dass es sich um eine kritisch abgetastete quadratische zeitversetzte Sinc handelt. In diesem Fall gegeben die zwei Probenα kurz vor und γ kurz nach der größten Stichprobe die Zeit - 1 < d< 1 des Peaks kann berechnet werden durch:
d= {01 -1 -p2√p,p =γ - αα + γwenn α = γ,Andernfalls,
mit d= 0Dies bedeutet, dass der Sinc genau auf die Zeit der größten Stichprobe verschoben wird. Dieselbe Interpolation kann mit der halben Abtastrate durchgeführt werden, bei der es sich um die kritische Abtastfrequenz der zugrunde liegenden Funktion handelt, deren Größe der einer zeitversetzten Sinc mit den beiden aufeinanderfolgenden Abtastwerten mit dem größten Wert entsprichtα und β des Quadrats des Absolutwerts der zugrunde liegenden Funktion:
0 ≤ d≤ 1d=⎧⎩⎨⎪⎪⎪⎪011 + p -1 -p2√2 p,p =β- αα +βwenn β= 0 ,wenn α = 0 ,Andernfalls,
Die Formeln werden durch die Amplitudenskalierung der Daten nicht beeinflusst. Für die Frequenzschätzung hätten Sie selten eine rein zeitversetzte Sinc in Echtzeit, aber wenn Sie dies tun, gibt es genaue Interpolationsformeln dafür .