Eu tenho um sensor que relata suas leituras com um carimbo de hora e um valor. No entanto, ele não gera leituras a uma taxa fixa.
Acho os dados de taxa variável difíceis de lidar. A maioria dos filtros espera uma taxa de amostragem fixa. Desenhar gráficos é mais fácil com uma taxa de amostragem fixa também.
Existe um algoritmo para reamostrar de uma taxa de amostra variável para uma taxa de amostra fixa?
resampling
FigBug
fonte
fonte
Respostas:
A abordagem mais simples é fazer algum tipo de interpolação de splines, como Jim Clay sugere (linear ou não). No entanto, se você tem o luxo do processamento em lote e, especialmente, se você tem um conjunto sobredeterminado de amostras não uniformes, existe um algoritmo de "reconstrução perfeita" extremamente elegante. Por razões numéricas, pode não ser prático em todos os casos, mas vale a pena conhecer conceitualmente. Eu li pela primeira vez sobre isso neste artigo .
O truque é considerar o seu conjunto de amostras não uniformes como já tendo sido reconstruído a partir de amostras uniformes por meio de interpolação sincera . Após a notação no artigo:
Observe que isso fornece um conjunto de equações lineares, uma para cada amostra não uniforme , onde as incógnitas são as amostras igualmente espaçadas , da seguinte forma:y ( k T )y(t) y(kT)
Na equação acima, é o número de amostras uniformes desconhecidas, é o inverso da taxa de amostragem uniforme, e é o número de amostras não uniformes (que podem ser maiores que ). Calculando a solução de mínimos quadrados desse sistema, as amostras uniformes podem ser reconstruídas. Tecnicamente, apenas amostras não uniformes são necessárias, mas dependendo de quão "dispersas" elas estão no tempo, a matriz de interpolação pode estar terrivelmente mal condicionada . Nesse caso, o uso de mais amostras não uniformes geralmente ajuda.T m n nn T m n n
Como um exemplo de brinquedo, veja uma comparação (usando numpy ) entre o método acima e a interpolação de spline cúbico em uma grade levemente instável:
(O código para reproduzir o gráfico acima está incluído no final desta resposta)
Tudo o que foi dito, para métodos robustos de alta qualidade, começando com algo em um dos seguintes documentos provavelmente seria mais apropriado:
-
fonte
Isso parece um problema de conversão de taxa de amostragem assíncrona. Para converter de uma taxa de amostragem para outra, podemos calcular a representação em tempo contínuo do sinal executando uma interpolação sinc e, em seguida, reamostrar em nossa nova taxa de amostragem. O que você está fazendo não é muito diferente. Você precisa reamostrar seu sinal para ter tempos de amostra fixados.
O sinal de tempo contínuo pode ser calculado convocando cada amostra com uma função sinc. Como a função sinc continua indefinidamente, usamos algo mais prático como um sinc com janelas de um comprimento finito prático. A parte complicada é que, como suas amostras se movem com o tempo, um sinc com um deslocamento de fase diferente pode precisar ser usado para cada amostra ao reamostrar.
Sinal de tempo contínuo do sinal amostrado:
onde é o seu tempo de amostra. No seu caso, no entanto, seu tempo de amostra não é fixo. Então, acho que você precisa substituí-lo pelo tempo da amostra nessa amostra.Ts
A partir disso, você pode reamostrar o sinal:
onde é o tempo de amostra desejado.Tns
Juntando tudo, você obtém:
Como isso não é causal ou tratável, a função sinc pode ser substituída por uma função de suporte finito e os limites de soma ajustados de acordo.
Seja o kernel (t) uma função sinc de janela ou outra função similar de comprimento 2k, então:
Espero que isso ajude ..., mas posso ter cometido um erro ao longo do caminho e pode ser um pouco intensivo em matemática. Eu recomendaria pesquisar a conversão da taxa de amostra para obter mais informações. Talvez alguém aqui também possa dar uma explicação ou solução melhor.
fonte
Eu acho que a resposta de Jacob é muito viável.
Um método mais fácil que provavelmente não é tão bom em termos de introdução de distorção é fazer a interpolação polinomial. Eu usaria interpolação linear (fácil, não como um bom sinal em termos de desempenho) ou splines cúbicos (ainda não muito difíceis, melhor desempenho de sinais) para produzir amostras a qualquer momento que você quiser de suas amostras de tempo arbitrárias.
fonte
(Um mês depois), existem duas opções principais para qualquer método de interpolação:Nnear
1) o número de pontos de dados mais próximo do ponto ausente a ser usado; 2 4 6 ... 2) a classe de funções a serem usadas: linear, polinomial, seno-cosseno (Fourier), cúbico por partes (spline B ou spline de interpolação), tipo sinc ... (A opção 0 é se você deve usar o método e o código de outra pessoa ou fazer você mesmo.)
Ajustar uma linha reta aos pontos é fácil: 2 pontos [-1, ], [1, ]: estimam pontos com média : média geral : consulte, por exemplo, Receitas Numéricas p. 781: ajuste uma linha e . Pode-se ajustar quadráticos, cúbicos, seno-cossenos ... da mesma maneira.Nnear
y−1 y1
[ x i , y i ] x i = 0y0∼(y−1+y1)/2
[xi,yi] xi=0 y0∼ yi
[xi,yi]
y 0 ∼ aa+bx y0∼a
y i [ x i , y i ]
Entendo que você tem dados espaçados uniformemente com alguns pontos faltando, não é mesmo?2πft f
Como funciona a interpolação linear neste caso?
Bem, vamos tentar cos com = 0.25: 1 0 -1 0 1 0 -1 0 ... 2 vizinhos de qualquer ponto médio a 0, terrível. 4 vizinhos: média de [1 0 (faltando -1) 0 1] = 1/2, terrível. (Experimente o filtro de 4 vizinhos [-1 3 3 -1] / 4 sobre isso.)f
A interação linear com 4, 6 ou 8 vizinhos pode funcionar bem o suficiente para seus dados.
Eu sugiro começar com um método que você entenda bem antes de mergulhar em splines, tipo sinc ... embora esses também possam ser divertidos.
Outro método bastante diferente é a ponderação de distância inversa . É fácil de implementar (consulte idw-interpolation-with-python no SO), funciona em 2d 3d e superior, mas é muito difícil de analisar teoricamente.
(Obviamente, NÃO método de interpolação único pode, eventualmente, ajustar os zilhões de combinações de
[sinal, ruído, métrica de erro, a função de teste] que ocorrem na realidade.
Há mais métodos do mundo, com mais botões, de funções de teste.
No entanto uma galeria métodos e funções de teste podem ser úteis.)
fonte
Se você trabalha com o matlab, pode fazê-lo trabalhando com séries temporais.
fonte
Antes de iniciar um processamento exótico, você pode tentar algo simples como este (pseudo-código - sem interpolação, mas isso pode ser adicionado)
fonte
A resposta do IMHO Datageist está correta, a resposta de Jacob não está. Uma maneira fácil de verificar isso é que é garantido que o algoritmo sugerido pelo datagrafista interpole pelas amostras originais (assumindo precisão numérica infinita), enquanto a resposta de Jacob não.
fonte