Come estrapolo un segnale 1D?


25

Ho un segnale di una certa lunghezza, diciamo 1000 campioni. Vorrei estendere questo segnale a 5000 campioni, campionati alla stessa velocità dell'originale (vale a dire, voglio prevedere quale sarebbe il segnale se continuassi a campionarlo per un periodo di tempo più lungo). Il segnale è composto da diversi componenti sinusoidali sommati.

Il metodo che mi è venuto in mente per la prima volta è stato quello di prendere l'intera FFT ed estenderla, ma questo lascia una discontinuità molto forte nel frame 1001. Ho anche considerato di usare solo la parte dello spettro vicino alle cime, e mentre questo sembra migliorare un po 'il segnale, non mi sembra che la fase sia garantita per essere corretta. Qual è il metodo migliore per estendere questo segnale?

Ecco un po 'di codice MATLAB che mostra un metodo idealizzato di ciò che voglio. Naturalmente, non saprò in anticipo che ci sono esattamente 3 componenti sinusoidali, né la loro fase e frequenza esatte. Voglio assicurarmi che la funzione sia continua, che non ci sia un salto mentre passiamo al punto 501,

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);

Fondamentalmente, data la linea verde, voglio trovare la linea blu. inserisci qui la descrizione dell'immagine


3
È nel contesto della piastrellatura di un'immagine, di fare qualcosa come un'estensione del cielo o qualcos'altro? In altre parole, ci sono altre misure di qualità per l'estensione oltre ad essere "liscia" ai bordi?
datageist

3
La tua domanda non è chiara Cosa intendi con "estensione"? Stai cercando di duplicare e catenare copie del tuo segnale (piastrellatura) o vuoi campionarlo di 5 volte o vuoi registrarlo per 5 volte di più? Il tuo segnale è periodico? Penso che sia necessaria una domanda più concreta e ben definita e un esempio minimo di ciò che stai cercando di ottenere sarà sicuramente di aiuto.
Lorem Ipsum,

1
l'estensione significa interpolazione? la domanda non è molto chiara.
Sriram,

Non ho mai realizzato che potesse significare così tante cose ... Cercherò di renderlo più chiaro, fondamentalmente voglio avere un segnale 1-D campionato alla stessa velocità, ma per un periodo di tempo più lungo.
PearsonArtPhoto,

1
@endolith: migliora le cose?
PearsonArtPhoto,

Risposte:


16

A seconda del materiale di origine, il metodo di interpolazione spettrale basato su DCT descritto nel seguente documento sembra promettente:

lk, HG, Güler S. "Trasformazione del segnale e interpolazione basata sulla sintesi DCT modificata" , Digital Signal Processing, Article in Press, 2011.

Ecco una delle figure del documento che mostra un esempio di interpolazione:

inserisci qui la descrizione dell'immagine

Le applicazioni della tecnica al recupero di segmenti persi ( ad es. 4.2. Sintesi di periodi di inclinazione persi ) sono probabilmente più rilevanti per l'estrapolazione. In altre parole, prendi un pezzo del materiale sorgente esistente, fai finta che ci sia un segmento perso tra il bordo e il segmento arbitrario che hai selezionato, quindi "ricostruisci" la porzione "mancante" (e forse scarta il pezzo che hai usato alla fine). Sembra che un'applicazione ancora più semplice della tecnica funzionerebbe per eseguire il loop continuo del materiale sorgente ( es. 3.1. Interpolazione dell'ampiezza spettrale ).


1
Purtroppo il link è morto. Ho trovato solo questo download a pagamento .
Knedlsepp,

@knedlsepp Questo link sembra fornire il documento senza essere dietro un paywall.
Peter K.

18

Penso che la codifica predittiva lineare (altrimenti nota come media mobile auto-regressiva ) sia ciò che stai cercando. LPC estrapola una serie temporale adattando prima un modello lineare alle serie temporali, in cui si presume che ogni campione sia una combinazione lineare di campioni precedenti. Dopo aver adattato questo modello alle serie storiche esistenti, può essere eseguito in avanti per estrapolare ulteriori valori mantenendo uno spettro di potenza stazionario (?).

Ecco un piccolo esempio in Matlab, usando la lpcfunzione per stimare i coefficienti LPC.

N = 150;    % Order of LPC auto-regressive model
P = 500;    % Number of samples in the extrapolated time series
M = 150;    % Point at which to start predicting

t = 1:P;

x = 5*sin(t/3.7+.3)+3*sin(t/1.3+.1)+2*sin(t/34.7+.7); %This is the measured signal

a = lpc(x, N);

y = zeros(1, P);

% fill in the known part of the time series
y(1:M) = x(1:M);

% in reality, you would use `filter` instead of the for-loop
for ii=(M+1):P      
    y(ii) = -sum(a(2:end) .* y((ii-1):-1:(ii-N)));
end

plot(t, x, t, y);
l = line(M*[1 1], get(gca, 'ylim'));
set(l, 'color', [0,0,0]);
legend('actual signal', 'extrapolated signal', 'start of extrapolation');

Ovviamente, nel codice reale useresti filterper implementare l'estrapolazione, usando i coefficienti LPC acome filtro IIR e pre-caricando i valori della serie temporale noti nello stato del filtro; qualcosa come questo:

% Run the initial timeseries through the filter to get the filter state 
[~, zf] = filter(-[0 a(2:end)], 1, x(1:M));     

% Now use the filter as an IIR to extrapolate
y((M+1):P) = filter([0 0], -a, zeros(1, P-M), zf); 

Ecco l'output:

Esempio LPC

Fa un lavoro ragionevole, anche se la previsione si interrompe con il tempo per qualche motivo.

In realtà non so molto sui modelli AR e sarei anche curioso di saperne di più.

-

EDIT: @china e @Emre hanno ragione, il metodo Burg sembra funzionare molto meglio di LPC. Semplicemente cambiando lpca arburgdei rendimenti di codice di cui sopra i seguenti risultati:

Estrapolazione con il metodo Burg

Il codice è disponibile qui: https://gist.github.com/2843661


LPC è in realtà AR, senza MA. Il segnale di estrapolazione "si spegne" perché la funzione di trasferimento dell'estrapolatore sta causando attenuazione. H(z)=b(z)/a(z)
Emre,

@Emre C'è un modo per migliorare l'estrapolazione?
nibot,

Come dice @chinnu, il modo più semplice è alimentare l'output nell'input.
Emre,

2
Bene, mi hai fatto accendere MATLAB: P Il problema può essere evitato usando un diverso algoritmo di stima AR; semplicemente sostituirlo a=lpc(x,N)con a=arburg(x,N). Per una discussione (a secco) sugli algoritmi AR, vedi Perché Yule-Walker non dovrebbe essere usato per la modellazione autoregressiva
Emre

1
Questo è ovviamente un po 'in ritardo, ma c'è un problema con la tua configurazione. Fornire le serie temporali complete di x( Pmisurazioni) a lpc(o arburg) durante la stima dei coefficienti del modello. Per l'estrapolazione secondo la domanda originale, si dovrebbe basare questa stima solo sulle prime Mmisurazioni. Fornire meno punti temporali comporta un'estrapolazione inferiore, ma funziona ancora abbastanza bene.
Chris C,

6

L'estrapolazione 1-D è abbastanza semplice usando il metodo di BURG per stimare i coefficienti LP. Una volta disponibili i coefficienti LP, è possibile calcolare facilmente i campioni di tempo applicando il filtro. I campioni previsti con Burg's sono i campioni successivi del segmento temporale di input.


6

Se sei completamente sicuro che ci sono solo poche componenti di frequenza nel segnale, puoi provare l' algoritmo MUSIC per scoprire quali frequenze sono contenute nel tuo segnale e provare a lavorare da lì. Non sono del tutto sicuro che questo possa essere fatto per funzionare perfettamente.

Inoltre, poiché i tuoi dati sono completamente deterministici, puoi provare a creare una sorta di predittore non lineare, addestrarlo utilizzando il tuo set di dati esistente e lasciarlo estrapolare il resto.

In generale questo è un problema di estrapolazione, potresti voler Google qualcosa come l'estrapolazione del prezzo di Fourier .


(Anni dopo) un altro algoritmo per trovare alcuni componenti di frequenza è l' inversione armonica .
Denis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.