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.
Respostas:
Dependendo do material de origem, o método de interpolação espectral baseado em DCT descrito no artigo a seguir parece promissor:
Aqui está uma das figuras do artigo que mostra um exemplo de interpolação:
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 ).
fonte
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
lpc
função para estimar os coeficientes de LPC.Obviamente, no código real você usaria
filter
para implementar a extrapolação, usando os coeficientes LPCa
como um filtro IIR e pré-carregando os valores conhecidos das séries temporais no estado do filtro; algo assim:Aqui está a saída:
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
lpc
paraarburg
no código acima, obtém os seguintes resultados:O código está disponível aqui: https://gist.github.com/2843661
fonte
a=lpc(x,N)
pora=arburg(x,N)
. Para uma discussão (seco) em algoritmos AR ver Por Yule-Walker não deve ser usado para Autoregressive Modelingx
(P
medições) alpc
(ouarburg
) ao estimar os coeficientes do modelo. Para extrapolação de acordo com a pergunta original, você realmente deve basear essa estimativa apenas nas primeirasM
medições. Fornecer menos pontos de tempo resulta em uma extrapolação inferior, mas ainda funciona razoavelmente bem.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.
fonte
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 .
fonte