Como extrapolar um sinal 1D?

25

Eu tenho um sinal de algum comprimento, digamos 1000 amostras. Gostaria de estender esse sinal para 5000 amostras, amostradas na mesma taxa que o original (ou seja, quero prever qual seria o sinal se continuasse a amostrá-lo por um longo período de tempo). O sinal é composto por vários componentes sinusoidais somados.

O método que me veio pela primeira vez foi pegar a FFT inteira e estendê-la, mas isso deixa uma descontinuidade muito forte no quadro 1001. Também considerei usar apenas a parte do espectro perto dos picos, e enquanto isso parece melhorar um pouco o sinal, não me parece que a fase esteja correta. Qual é o melhor método para estender esse sinal?

Aqui está um código MATLAB mostrando um método idealizado do que eu quero. Obviamente, não saberei de antemão que existem exatamente três componentes sinusoidais, nem sua fase e frequência exatas. Quero garantir que a função seja contínua, que não haja um salto à medida que avançamos para o ponto 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);

Basicamente, dada a linha verde, quero encontrar a linha azul. insira a descrição da imagem aqui

PearsonArtPhoto
fonte
3
Isso ocorre no contexto de colocar uma imagem em mosaico, fazer algo como uma extensão do céu ou algo mais? Em outras palavras, existem outras medidas de qualidade para a extensão além de serem "suaves" nas bordas?
datageist
3
Sua pergunta não está clara. O que você quer dizer com "estender"? Você está tentando duplicar e catenar cópias do seu sinal (lado a lado) ou deseja aumentá-lo em 5x ou deseja gravá-lo por 5x mais tempo? O seu sinal é periódico? Eu acho que uma pergunta mais concreta e bem definida é necessária e um exemplo mínimo do que você está tentando alcançar definitivamente ajudará.
Lorem Ipsum
11
extensão significa interpolação? questão não é muito clara.
Sriram
Nunca percebi que isso poderia significar tantas coisas ... Tentarei esclarecer, basicamente eu quero ter um sinal 1-D amostrado na mesma taxa, mas por um longo período de tempo.
precisa saber é o seguinte
11
@ endolith: Isso melhora as coisas?
PearsonArtPhoto

Respostas:

16

Dependendo do material de origem, o método de interpolação espectral baseado em DCT descrito no artigo a seguir parece promissor:

lk, HG, Güler S. "Transformação e interpolação de sinais com base na síntese DCT modificada" , Digital Signal Processing, Article in Press, 2011.

Aqui está uma das figuras do artigo que mostra um exemplo de interpolação:

insira a descrição da imagem aqui

As aplicações da técnica na recuperação de segmentos perdidos ( por exemplo, 4.2. Síntese de períodos perdidos de afinação ) são provavelmente mais relevantes para a extrapolação. Em outras palavras, pegue um pedaço do material de origem existente, finja que há um segmento perdido entre a borda e o segmento arbitrário que você selecionou, depois "reconstrua" a parte "ausente" (e talvez descarte o pedaço que você usou no final). Parece que uma aplicação ainda mais simples da técnica funcionaria para fazer um loop contínuo do material de origem ( por exemplo, 3.1. Interpolação da amplitude espectral ).

datagrama
fonte
11
Infelizmente, o link está morto. Só consegui encontrar este download pago .
knedlsepp
@knedlsepp Este link parece mostrar o papel sem estar atrás de um paywall.
Peter K.
18

Acho que a codificação preditiva linear (também conhecida como média móvel auto-regressiva ) é o que você está procurando. O LPC extrapola uma série temporal, ajustando primeiro um modelo linear à série temporal, na qual cada amostra é considerada uma combinação linear de amostras anteriores. Depois de ajustar esse modelo às séries temporais existentes, ele pode ser executado para extrapolar valores adicionais enquanto mantém um espectro de potência estacionário (?).

Aqui está um pequeno exemplo no Matlab, usando a lpcfunção para estimar os coeficientes de 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');

Obviamente, no código real você usaria filterpara implementar a extrapolação, usando os coeficientes LPC acomo um filtro IIR e pré-carregando os valores conhecidos das séries temporais no estado do filtro; algo assim:

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

Aqui está a saída:

Exemplo de LPC

Faz um trabalho razoável, embora a previsão acabe com o tempo por algum motivo.

Na verdade, eu não sei muito sobre modelos de RA e também ficaria curioso para saber mais.

-

EDIT: @china e @Emre estão certos, o método Burg parece funcionar muito melhor que o LPC. Simplesmente alterando lpcpara arburgno código acima, obtém os seguintes resultados:

Extrapolação usando o método Burg

O código está disponível aqui: https://gist.github.com/2843661

nibot
fonte
H(z)=b(z)/a(z)
@ Emre Existe uma maneira de melhorar a extrapolação?
Nibot 21/05
Como @chinnu diz, a maneira mais fácil é alimentar a saída na entrada.
Emre
2
Tudo bem, você me fez iniciar o MATLAB: P O problema pode ser evitado usando um algoritmo de estimativa de AR diferente; simplesmente substitua a=lpc(x,N)por a=arburg(x,N). Para uma discussão (seco) em algoritmos AR ver Por Yule-Walker não deve ser usado para Autoregressive Modeling
Emre
11
Obviamente, isso é um pouco tarde, mas há um problema com sua configuração. Você fornece a série temporal completa de x( Pmedições) a lpc(ou arburg) ao estimar os coeficientes do modelo. Para extrapolação de acordo com a pergunta original, você realmente deve basear essa estimativa apenas nas primeiras Mmedições. Fornecer menos pontos de tempo resulta em uma extrapolação inferior, mas ainda funciona razoavelmente bem.
Chris C
6

A extrapolação 1-D é bastante simples, usando o método BURG para estimar os coeficientes de PL. Uma vez disponíveis os coeficientes de LP, é possível calcular facilmente as amostras de tempo aplicando o filtro. As amostras previstas com o Burg são as próximas amostras do seu segmento de tempo de entrada.

chinnu
fonte
6

Se você tiver certeza absoluta de que existem apenas alguns componentes de frequência no sinal, tente o algoritmo MUSIC para descobrir quais frequências estão contidas no sinal e tentar trabalhar a partir daí. Não tenho certeza absoluta de que isso possa funcionar perfeitamente.

Além disso, como seus dados são completamente determinísticos, você pode tentar criar algum tipo de preditor não linear, treiná-lo usando o conjunto de dados existente e deixar extrapolar o restante.

Em geral, esse é um problema de extrapolação. Você pode procurar no Google algo como extrapolação de preço por Fourier .

Phonon
fonte
(Anos depois) outro algoritmo para encontrar alguns componentes de frequência é a inversão harmônica .
Denis