Saturday 2 September 2017

Detecção De Pico Médio Média


Atualização: o algoritmo de melhor desempenho até agora é esse. Esta questão explora algoritmos robustos para detectar picos repentinos em dados de tempo real em tempo real. Considere o seguinte conjunto de dados: (formato Matlab, mas não é sobre o idioma, mas sobre o algoritmo) Você pode ver claramente que existem três grandes picos e alguns pequenos picos. Este conjunto de dados é um exemplo específico da classe de conjuntos de dados timeseries sobre os quais a questão é sobre. Esta classe de conjuntos de dados tem duas características gerais: há ruído básico com um meio geral. Existem grandes picos ou pontos de dados mais altos que se desviam significativamente do ruído. Vamos também assumir o seguinte: a largura dos picos não pode ser determinada de antemão, a altura dos picos se desvia claramente dos outros valores que o algoritmo usado deve calcular em tempo real (então mude com cada ponto de dados novo). Para tal situação, um valor de limite precisa Ser construído o que desencadeia sinais. No entanto, o valor do limite não pode ser estático e deve ser determinado em tempo real com base em um algoritmo. Minha Pergunta: o que é um bom algoritmo para calcular tais limiares em tempo real Existem algoritmos específicos para tais situações Quais são os algoritmos mais bem conhecidos Algoritmos robustos ou insights úteis são todos altamente apreciados. (Pode responder em qualquer idioma: é sobre o algoritmo) Eu costumava fazer isso para detectar uma alteração abrupta da intensidade da luz em um fotossensor. Eu fiz isso movendo média e ignorando quaisquer pontos de dados que sejam maiores que um limite. Observe que esse limiar é diferente do limiar que determina um pico. Então, diga que você inclui apenas pontos de dados que estão dentro de um stddev para sua média móvel e considere esses pontos de dados com mais de três stddev como picos. Este algoritmo fez muito bem o nosso contexto de aplicação nesse horário. Ndash justhalf 28 de março às 7:54 Ah, eu vejo. Eu não estava esperando isso no formulário de código. Se eu tivesse visto essa pergunta mais cedo provavelmente, você obteria essa resposta muito mais alta. De qualquer forma, meu aplicativo naquele momento era detectar se o fotossensor estava obstruído pela fonte de luz ambiente (é por isso que precisamos da média móvel, já que a luz ambiente A fonte pode mudar gradualmente ao longo do tempo). Criamos isso como um jogo onde você deve passar a mão sobre os sensores seguindo o padrão específico. D ndash justhalf 28 de março 14 às 10:05 Smoothed z-score algo (algoritmo de limiar muito robusto) Construí um algoritmo que funciona muito bem para esses tipos de conjuntos de dados. Baseia-se no princípio da dispersão. Se um novo ponto de dados é um dado número x de desvios padrão longe de alguma média móvel, os sinais do algoritmo (também chamado de z-score). O algoritmo é muito robusto porque constrói uma média e desvio de movimento separado, de modo que os sinais não corrompem o limite. Os sinais futuros são, portanto, identificados com aproximadamente a mesma precisão, independentemente da quantidade de sinais anteriores. O algoritmo leva 3 entradas: lag o atraso da janela em movimento. Limiar a pontuação z em que o algoritmo sinaliza e influencia a influência (entre 0 e 1) de novos sinais na média e desvio padrão. Por exemplo, um atraso de 5 usará as últimas 5 observações para suavizar os dados. Um limite de 3.5 irá sinalizar se um ponto de dados é 3.5 desvios padrão longe da média móvel. E uma influência de 0,5 dá sinais de metade da influência que os pontos de dados normais têm. Da mesma forma, uma influência de 0 ignora os sinais completamente para recalcular o novo limite: uma influência de 0 é, portanto, a opção mais robusta 1 é a menor. Funciona da seguinte forma: o código Matlab para esta demo pode ser encontrado no final desta resposta. Para usar o demo, basta executá-lo e criar uma série de tempo, clicando no gráfico superior. O algoritmo começa a funcionar após o desenho do intervalo de observações. Apêndice 1: Código Matlab e R para o algoritmo Este código (ambos os idiomas) produzirá o seguinte resultado para os dados da pergunta original: Apêndice 2: código de demonstração Matlab (clique para fazer dados) O código acima foi escrito de tal forma que ele Recalcula o algoritmo completo toda vez. É claro que também se pode mudar ligeiramente o código, de modo que o filtro seja bem-vindo. AvgFilter e stdFilter são salvos e os valores são simplesmente atualizados quando as novas informações chegam (isso também tornará o algoritmo muito mais rápido). Para fins de demonstração, decidi colocar todo o código em uma única função. Se você usar esta função em algum lugar, me credite ou essa resposta. Se você tiver alguma dúvida sobre este algoritmo, publique-os nos comentários abaixo ou contacte-me no LinkedIn. Respondeu Mar 25 14 às 16:16 Uma abordagem é detectar picos com base na seguinte observação: Tempo t é um pico se (y (t) y (t-1)) ampamp (y (t) y (t1)) It Evita falsos positivos esperando que a tendência de alta acabe. Não é exatamente em tempo real, no sentido de que vai perder o pico por um dt. A sensibilidade pode ser controlada, exigindo uma margem de comparação. Há uma troca entre a detecção ruidosa e a demora na detecção. Você pode enriquecer o modelo adicionando mais parâmetros: onde dt e m são parâmetros para controlar a sensibilidade versus tempo-atraso aqui é o código para reproduzir o gráfico em python: Ao definir m 0,5. Você pode obter um sinal mais limpo com apenas um falso positivo: no processamento de sinal, a detecção de pico é geralmente feita através de uma transformada wavelet. Você basicamente faz uma transformada de wavelet discreta em seus dados da série temporal. Os cruzamentos de zero nos coeficientes de detalhe que são retornados corresponderão a picos no sinal da série temporal. Você obtém diferentes amplitudes de pico detectadas em diferentes níveis de coeficientes de detalhe, o que lhe dá uma resolução de vários níveis. Respondeu 31 de março às 20:54 Se o valor limite ou outro critério depender de valores futuros, a única solução (sem uma máquina do tempo ou outro conhecimento de valores futuros) é atrasar qualquer decisão até que uma tenha valores futuros suficientes. Se você quer um nível acima de uma média que abrange, por exemplo, 20 pontos, então você precisa esperar até ter pelo menos 19 pontos antes de qualquer decisão de pico, ou então o próximo novo ponto poderia eliminar completamente seu limite 19 pontos atrás . Seu gráfico atual não tem picos. A menos que você de alguma forma conheça antecipadamente que o próximo ponto não é 1e99, que depois de redimensionar sua dimensão de Y de tramas, seria plana até esse ponto. Respondeu 24 de março 14 em 1: 57 Eu tenho um sinal que eu amostras em 500khz. Estou tentando detectar um aumento, queda e o pico nos dados recebidos. A base do pico pode ser de 250 usec ou 2.5msec, a amplitude pode ser de 6db ou 15db acima do piso de ruído. Eu não tenho um bom snr, infelizmente. O nível de dc do sinal não é constante, mas muda muito mais lento do que o componente ac. No ponto de decisão, preciso conhecer a inclinação do aumento e queda. Este é um sistema de tempo real difícil e eu realmente preciso tomar uma decisão no 100usec após a inclinação descendente chegar ao nível de dc. Estou procurando sugestões sobre como implementar eficientemente um algoritmo decente. Atualmente, faço uma média em execução (últimos 25 pontos de dados adicionados) e tente detectar a tendência. Uma vez que eu detecto a tendência, eu começo a procurar tendência para baixo e, uma vez que eu faço, eu colecione talvez mais 50 amostras e comece a calcular. O ruído agora facilmente enruga esse algoritmo, daí a questão. Para o benefício de outros, acabei implementando uma Média Móvel seguida por integrador. A média móvel dos últimos 64 dados foi suavizada o suficiente, mas perdeu o aumento até um grau, integrando os últimos 8 valores obtidos de volta ao aumento e eu simplesmente procuro subir e cair, depois fiz uma regressão linear para a inclinação. Funciona ok, não ótimo, mas ok. Perguntou 7 de julho 12 às 8:01 Eu não sou muito bem versado com DSP. Você pode me apontar para uma possível implementação Com base na sua resposta e no meu conhecimento limitado, acho que o link (holoborodkopavelnumerical-methodsnumerical-derivativezwnj8203ehellip) faz exatamente o que você menciona. Se eu fosse usar essa abordagem, eu não sei 1) Como determinar minhas freqüências 2) Como selecionar coeficientes de filtro ndash Ktuncer 8 de julho 12 às 1:53 Também o seguinte link resolve um problema semelhante e contém um bom grupo de links . Dsprelatedshowmessage1237401.php ndash Ktuncer 8 de julho 12 às 1:54 Sua resposta 2017 Stack Exchange, IncConsidere ter um sinal no domínio do tempo e você deseja suavizar o sinal. Mudança média e filtros gaussianos que são usados. Como você escolhe qual é usado para o que são as condições em que Gaussian é melhor e as condições em que a média móvel é melhor O que eu estou tentando fazer com esse sinal é, detecção de pico inicialmente, então aplique pequenas janelas em cada parte e figura As mudanças de freqüência (turnos doppler) para cada parte para descobrir a direção do movimento da mudança de freqüência. Eu quero suavizar o sinal no domínio do tempo sem perda de informação no domínio da frequência. Eu pensei que, para a parte de descobrir os turnos Doppler, usar STFT seria uma boa idéia. Se pudesse ser dada referência a algum documento, isso também seria realmente útil. Perguntou 29 de setembro 16 às 11:12 Um filtro de média móvel centrado é um filtro de resposta de impulso finito (FIR) que afeta o mesmo peso para todas as amostras na janela. Se você se preocupa apenas com as propriedades do domínio do tempo e não se preocupe com o desempenho relativamente fraco no domínio espectral, para um sinal s que seja bastante estacionário na janela, você pode usá-lo. Possui implementação de execução extremamente rápida, e pode ser usado facilmente para sinais muito curtos. No domínio espectral, suponha que você tenha a mesma amplitude de sinal em três freqüências f1 lt f2 ltf3: S (f1) S (f2) S (f3). O espectro de amplitude deste filtro é não decrescente em geral. Então, você pode acabar com um sinal filtrado s para o qual S (f2) 0 lt S (f1) lt S (f3). Em outras palavras, o comportamento de freqüência não é completamente natural. Olhando para o seu sinal no domínio do tempo, bastante longo e com um comportamento não estacionário, um filtro gaussiano pode ser uma escolha mais sábia, se você tiver apenas essas duas opções e se a filtragem on-line ou o feedback de volta não são um problema. É um filtro infinito de resposta ao impulso. Fornece um bom tradeoff entre o tempo eo domínio de freqüência (no qual sua resposta está diminuindo). E permitir algumas implementações rápidas rápidas também. Você pode até mesmo emular uma aproximação de um filtro gaussiano combinando várias médias móveis de diferentes comprimentos. Então eu iria para o gaussiano, se o seu único objetivo é suavizar o sinal. Mas acredito que, para um processamento mais envolvente, outros filtros podem ser mais apropriados. Cuidado com a singularidade no lado direito, no entanto. Respondeu 29 de setembro 16 às 13:13

No comments:

Post a Comment