desktop-wallpaper-fantasy-art-shark-fisherman-fishing-ice-fishing-split-view-and-mobile-backgrounds-ice-fishing

Detectores de Picos

Detectores de PicosIntroduçãoPrincipais insightsDerivada PrimeiraDerivada SegundaExemploVersão considerando derivadasImplementação em MATLABVersão considerando Espaçamento MínimoVersão considerando arquivo "bag" de dadosVersão considerando largura dos "vales"Exemplo em MATLABOutros MétodosConclusãoReferências

🎧

Introdução

A detecção de picos em sinais ruidosos é uma tarefa crítica em diversas aplicações científicas e de engenharia. Algoritmos baseados na primeira e segunda derivadas são comumente usados para identificar picos, detectando mudanças na inclinação do sinal. Esses métodos devem lidar com ruído de maneira eficaz e distinguir picos verdadeiros de flutuações aleatórias.

Principais insights

Seguem maiores exmplicações.

Derivada Primeira

  1. Encontrar os Pontos Críticos:

    • A derivada primeira de uma função , denotada por , representa a taxa de variação da função.
    • Para encontrar os pontos críticos, você deve resolver . Esses pontos são onde a inclinação da função é zero, ou seja, onde a função pode ter um máximo, mínimo ou ponto de inflexão.
  2. Teste da Derivada Primeira:

    • Após encontrar os pontos críticos, você pode usar o sinal de antes e depois desses pontos para determinar se eles são máximos ou mínimos.
    • Se muda de positivo para negativo ao passar por um ponto crítico, esse ponto é um máximo local.
    • Se muda de negativo para positivo, o ponto crítico é um mínimo local.

Derivada Segunda

  1. Teste da Derivada Segunda:

    • A derivada segunda de uma função , denotada por , fornece informações sobre a concavidade da função.
    • Avalie nos pontos críticos encontrados anteriormente.
    • Se em um ponto crítico, a função é côncava para cima nesse ponto, indicando um mínimo local.
    • Se , a função é côncava para baixo, indicando um máximo local.

Exemplo

Vamos considerar uma função: . Um gráfico na região resulta:

funcao_a_derivar.png

  1. Derivada Primeira: :

    • Encontramos os pontos críticos resolvendo: , o que dá e .
  2. Teste da Derivada Primeira:

    • Para : muda de negativo para positivo, indicando um mínimo local.
    • Para : muda de positivo para negativo, indicando um máximo local.
  3. Derivada Segunda:

    • Avaliando nos pontos críticos:

      • Para : (máximo local).
      • Para : (mínimo local).
  4. Determinando valor pontos de mínimo e máximo

    • Para : (ponto de máximo);
    • Para : (ponto de mínimo).

Gráficos resumo abaixo:

sinal_derivadas.png

Versão considerando derivadas

Em um sistema embarcado com memória limitada, você deve implementar um algoritmo eficiente que utiliza as derivadas primeira e eventualmente a derivada segunda para identificar máximos e mínimos locais em tempo real, sem armazenar muitos pontos.

Segue pseudo-código considerando cálculo de derivadas

Explicação do Algoritmo:

  1. Inicialização:

    • prev_y e prev2_y armazenam os valores das amostras anteriores.
    • prev_dy armazena a derivada primeira da amostra anterior.
  2. Loop de Aquisição de Dados:

    • A cada nova amostra y(t), calcule a derivada primeira dy como a diferença entre a amostra atual e a anterior, dividida pelo intervalo de amostragem T.

    • Calcule a derivada segunda ddy como a diferença entre a derivada primeira atual e a anterior, dividida por T.

    • Verifique as condições para máximos e mínimos locais:

      • Um máximo local é identificado se a derivada primeira muda de positiva para negativa.
      • Um mínimo local é identificado se a derivada primeira muda de negativa para positiva.
    • Atualize as variáveis (associadas com amostras passadas) para a próxima iteração.

Implementação em MATLAB

Aqui está uma implementação em MATLAB baseada no pseudo-código acima:

Executando análise sobre o arquivo "bag": captura_com_dedo.txt:

São geradas 2 figuras gráficas:

Figure 1: Sinal original com "janela" de análise de dados ressaltada pelo retângulo verde:

detecta_picos_simples_fig1.png

Figure 2: Resultado da detecção dos picos:

detecta_picos_simples_fig2.png

Note:

Conclusão: deveria ser considerado um espaçamento mínimo entre picos consecutivos de mesmo sinal (para evitar detecção de falsos picos).

Versão considerando Espaçamento Mínimo

Este exemplo em MATLAB detecta os picos em tempo real, processando dados de forma incremental, sem a necessidade de armazenar todo o sinal, atualizando as variáveis pico e distancia entre os últimos picos detectados conforme novos pontos de dados são "lidos". A detecção de picos usa a primeira e a segunda derivada, ao mesmo tempo em que leva em conta o ruído, deixando “espaço” (ou seja, tolerância) para vales e picos suaves (verificando existência de um espaçamento mínimo).

Considerações:

  1. Se espera medir pulsação no intervalo: BMP; isto resulta na seguinte faixa de frequências esperada para o sinal: Hz;

  2. O sinal mais rápido estaria oscilando à 5 Hz, resultando num período de segundos;

  3. Estamos amostrando o sinal à taxa de 50 Hz, então estariamos capturando amostras entre picos de mesmo sinal mais rápido.

  4. Além disto, poderia ser considerado um limiar mínimo de variação do sinal ou da variação do valor da derivada de . Analizando o gráfico da derivada do sinal sobreposto com o sinal, na região onde 2 picos positivos foram detectados muito próximos, se percebe:

    detecta_picos_simples2_fig3.png

    Ou mesmo um limiar maior para a variação do sinal entre picos máximos válidos:

    detecta_picos_simples_fig2_zoom.png

    No caso do gráfico acima:

    Ou:

 

Segue código usando Matlab:

Explicação:

  1. Primeira e segunda derivadas: Calculadas usando diferenças entre os últimos três pontos capturados.
  2. Detecção de pico: Verifica zero-crossing (mudança de sinal) da primeira derivada e que a segunda derivada seja negativa.
  3. Controle de ruído: Usa um limite (threshold) para evitar picos falsos.
  4. Atualização em tempo real: As variáveis pico e distancia são atualizadas sempre que um novo pico é detectado.

Exemplo de uso:

detecta_picos.gif

Note:

detecta_picos.png

Este algoritmo não detecta um "vale de descida" com largura mínima entre 2 possíveis pontos.

 

Versão considerando arquivo "bag" de dados

Segue código que carrega arquivo "bag" de dados gerados em outro momento e permite testar o algoritmo para detecção de picos: detecta_picos_bag_old.m:

Resultado:

Note que aparentemente o algorimto seria mais simples e eficaz se detectasse os picos negativos.

 

Versão considerando largura dos "vales"

Para garantir que um pico só seja detectado se for precedido por um "vale" com uma largura mínima, precisamos modificar o algoritmo para verificar se o sinal realmente desce a partir do pico anterior antes de um novo pico ser registrado. Isso ajuda a evitar falsos picos consecutivos em regiões onde o sinal não apresenta uma "descida" significativa.

A abordagem é ajustar o código para:

  1. Armazenar o índice e o valor do último pico detectado.
  2. Detectar um vale intermediário entre o último pico e um novo candidato a pico.
  3. Validar a largura mínima entre o pico e o vale intermediário.

Exemplo em MATLAB

Abaixo está uma versão MATLAB que considera a presença de um "vale" entre os picos, obedecendo a uma largura mínima antes de detectar um novo pico.

Explicação:

  1. Detecção de Vale: Identificamos um vale onde a derivada muda de negativa para positiva, o que representa uma "descida" completa antes do próximo pico.

  2. Validação do Pico: Um novo pico é detectado apenas se:

    • Obedecer a uma largura mínima entre o último pico e o vale (min_valley_width).
    • Cumprir o espaçamento mínimo entre picos (min_spacing).
  3. Atualização das Variáveis: pico e distancia são atualizados somente se todas as condições forem satisfeitas.

 


Outros Métodos

Conclusão

A detecção de pico em sinais ruidosos pode ser efetivamente alcançada usando métodos de primeira e segunda derivadas, técnicas baseadas em transformadas wavelet e algoritmos de otimização probabilística. Cada abordagem tem seus pontos fortes, com métodos derivados sendo simples, mas sensíveis ao ruído, transformadas wavelet oferecendo tratamento robusto de ruído e correção de linha de base, e métodos probabilísticos fornecendo recursos avançados de otimização em ambientes de ruído complexos.

Referências

[1] Cheng, D., & Schwartzman, A., 2014. MULTIPLE TESTING OF LOCAL MAXIMA FOR DETECTION OF PEAKS IN RANDOM FIELDS.. Annals of statistics, 45 2, pp. 529-556 . https://doi.org/10.1214/16-AOS1458.

[2] Zhang, Z., Tong, X., Peng, Y., Ma, P., Zhang, M., Lu, H., Chen, X., & Liang, Y., 2015. Multiscale peak detection in wavelet space.. The Analyst, 140 23, pp. 7955-64 . https://doi.org/10.1039/c5an01816a.

[3] Wang, X., Wang, Y., Shi, X., Gao, L., & Li, P., 2021. A probabilistic multimodal optimization algorithm based on Buffon principle and Nyquist sampling theorem for noisy environment. Appl. Soft Comput., 104, pp. 107068. https://doi.org/10.1016/J.ASOC.2020.107068.

[4] Zhou, Y., Ma, J., Li, F., Chen, B., Xian, T., & Wei, X., 2022. An Improved Algorithm for Peak Detection Based on Weighted Continuous Wavelet Transform. IEEE Access, 10, pp. 118779-118788. https://doi.org/10.1109/ACCESS.2022.3220640.


🌊 Fernando Passold 📬 ,