Ich habe ein Signal von einiger Länge, sagen wir 1000 Samples. Ich möchte dieses Signal auf 5000 Samples erweitern, die mit der gleichen Rate wie das Original abgetastet wurden (dh ich möchte vorhersagen, wie das Signal aussehen würde, wenn ich es für einen längeren Zeitraum weiter abtasten würde). Das Signal setzt sich aus mehreren Sinuskomponenten zusammen.
Die Methode, die mir zuerst einfiel, war, die gesamte FFT zu nehmen und zu erweitern, aber dies hinterlässt eine sehr starke Diskontinuität bei Frame 1001. Ich habe auch in Betracht gezogen, nur den Teil des Spektrums in der Nähe der Peaks zu verwenden, und dies scheint zu sein verbessern Sie das Signal ein wenig, es scheint mir nicht, dass die Phase garantiert korrekt ist. Was ist die beste Methode, um dieses Signal zu verlängern?
Hier ist ein MATLAB-Code, der eine idealisierte Methode für das zeigt, was ich will. Natürlich werde ich vorher nicht wissen, dass es genau 3 sinusförmige Komponenten gibt, noch deren genaue Phase und Frequenz. Ich möchte sicherstellen, dass die Funktion kontinuierlich ist, dass es keinen Sprung gibt, wenn wir zu Punkt 501 gehen.
vals = 1:50;
signal = 100+5*sin(vals/3.7+.3)+3*sin(vals/1.3+.1)+2*sin(vals/34.7+.7); % This is the measured signal
% Note, the real signal will have noise and not be known exactly.
output_vals = 1:200;
output_signal = 100+5*sin(output_vals/3.7+.3)+3*sin(output_vals/1.3+.1)+2*sin(output_vals/34.7+.7); % This is the output signal
figure;
plot(output_signal);
hold all;
plot(signal);
Grundsätzlich möchte ich bei der grünen Linie die blaue Linie finden.
Antworten:
Je nach Ausgangsmaterial sieht die in der folgenden Veröffentlichung beschriebene DCT-basierte spektrale Interpolationsmethode vielversprechend aus:
Hier ist eine der Abbildungen aus dem Papier, die ein Beispiel für die Interpolation zeigt:
Die Anwendung der Technik auf die Wiederherstellung verlorener Segmente ( z. B. 4.2. Synthese verlorener Tonhöhenperioden ) ist wahrscheinlich für die Extrapolation am relevantesten. Mit anderen Worten, greifen Sie nach einem Teil des vorhandenen Quellmaterials, tun Sie so, als gäbe es ein verlorenes Segment zwischen der Kante und dem von Ihnen ausgewählten beliebigen Segment, und "rekonstruieren" Sie dann den "fehlenden" Teil (und verwerfen Sie möglicherweise den am Ende verwendeten Teil). Es scheint, dass eine noch einfachere Anwendung der Technik zum nahtlosen Durchschleifen des Quellmaterials funktionieren würde ( z. B. 3.1. Interpolation der spektralen Amplitude ).
quelle
Ich denke, Sie suchen nach linearer prädiktiver Codierung (auch bekannt als auto-regressiver gleitender Durchschnitt ). LPC extrapoliert eine Zeitreihe, indem zunächst ein lineares Modell an die Zeitreihe angepasst wird, wobei angenommen wird, dass jede Stichprobe eine lineare Kombination vorheriger Stichproben ist. Nachdem dieses Modell an die vorhandenen Zeitreihen angepasst wurde, kann es weitergeführt werden, um weitere Werte unter Beibehaltung eines stationären (?) Leistungsspektrums zu extrapolieren.
Hier ist ein kleines Beispiel in Matlab, das die
lpc
Funktion zum Schätzen der LPC-Koeffizienten verwendet.Natürlich würden Sie in realem Code
filter
die Extrapolation implementieren, indem Sie die LPC-Koeffizientena
als IIR-Filter verwenden und die bekannten Zeitreihenwerte vorab in den Filterzustand laden. etwas wie das:Hier ist die Ausgabe:
Es macht einen vernünftigen Job, obwohl die Vorhersage aus irgendeinem Grund mit der Zeit nachlässt.
Ich weiß eigentlich nicht viel über AR-Modelle und wäre auch neugierig, mehr zu erfahren.
-
EDIT: @china und @Emre sind richtig, die Burg-Methode scheint viel besser zu funktionieren als LPC. Wenn Sie einfach in den obigen Code wechseln
lpc
, erhalten Siearburg
die folgenden Ergebnisse:Der Code ist hier verfügbar: https://gist.github.com/2843661
quelle
a=lpc(x,N)
durcha=arburg(x,N)
. Eine (trockene) Diskussion über AR-Algorithmen finden Sie unter Warum sollte Yule-Walker nicht für autoregressive Modellierung verwendet werden?x
(P
Messungen) fürlpc
(oderarburg
) an, wenn Sie Modellkoeffizienten schätzen. Für die Extrapolation nach der ursprünglichen Frage sollten Sie diese Schätzung eigentlich nur auf die erstenM
Messungen stützen . Wenn Sie weniger Zeitpunkte angeben, führt dies zu einer minderwertigen Extrapolation, funktioniert aber immer noch recht gut.Die 1-D-Extrapolation ist mit der BURG-Methode zur Schätzung der LP-Koeffizienten recht einfach. Sobald LP-Koeffizienten verfügbar sind, kann man die Zeitabtastwerte durch Anwenden eines Filters leicht berechnen. Die Samples, die mit Burg's vorhergesagt werden, sind die nächsten Samples Ihres Eingabezeitsegments.
quelle
Wenn Sie sich völlig sicher sind, dass das Signal nur wenige Frequenzkomponenten enthält, können Sie den MUSIC- Algorithmus verwenden, um herauszufinden, welche Frequenzen in Ihrem Signal enthalten sind, und versuchen, von dort aus zu arbeiten. Ich bin mir nicht ganz sicher, ob dies perfekt funktioniert.
Da Ihre Daten vollständig deterministisch sind, können Sie außerdem versuchen, eine Art nichtlinearen Prädiktor zu erstellen, ihn anhand Ihres vorhandenen Datensatzes zu trainieren und den Rest extrapolieren lassen .
In der Regel ist dies eine Extrapolation Problem, haben Sie zu Google etwas wie wollen könnten Fourier Extrapolation des Preises .
quelle