Cálculo derivativo

9

Eu tenho uma série de dados (matriz única). Se eu pegar esses dados e plotar, posso ver que existem vários picos. No entanto, se eu ampliar uma seção de dados, vejo que há ruído substancial.

Eu gosto de detectar quantos picos nos dados usam pouco tempo e energia da CPU. Pensei em detectar as encostas desses picos (poderia ser nítido ou suave subindo ou descendo) e observe o número de encostas para determinar o número de picos. (2 pistas positivas e negativas para cada pico)

Alguma dica de como posso calcular as inclinações na presença de ruído?

O código entra em um sistema incorporado, a memória é limitada, então, de preferência, gosto de implementar algo que não requer nenhuma cópia significativa dos dados.

Ktuncer
fonte
11
Você parece estar em uma loja pedindo algo que precisa
2
Se o ruído for relativamente alto em frequência, você poderá filtrar com baixa frequência os dados
Paul R
4
Você pode postar um ou mais exemplos de seus dados? Isso nos ajudará a ver como é. A detecção de pico geralmente não é feita por estimativa de derivada, pois o cálculo da derivada de um sinal é muito sensível ao ruído (é uma operação de passa-alta). Pode haver características no sinal de interesse que você pode explorar. Além disso, sempre há uma troca entre a probabilidade de detectar corretamente um pico e a probabilidade de declarar falsamente um pico que realmente não é de interesse. O que é mais importante para a sua aplicação?
Jason R
2
Se você pode produzir um enredo, seria útil.
Jason R
11
Se você deseja detectar picos, procure a detecção de picos (consulte dsp.stackexchange.com/questions/1302/peak-detection- Approach ).
Geerten

Respostas:

1

Depende do tipo de ruído e tipo de sinal. Mostre um exemplo se você quiser uma boa resposta. Mas, dito isso, em geral você provavelmente deseja filtrar o sinal com passa-baixa. Se eu fosse você, usaria um espectro de potência Fourier para ver se a maior parte do ruído é de alta frequência e o sinal de que me preocupo principalmente em uma faixa mais baixa. Se eles se sobrepõem, bem, isso é vida. Eu teria que pensar mais sobre as coisas.

Um filtro passa-baixo que é bom para sinal ruidoso em muitos casos é o filtro Savitzky-Golay. É descrito em Receitas numéricas e, para o Python, há uma função no Python Numpy Cookbook. É apenas uma convolução com um pequeno núcleo. Você escolhe o tamanho da janela com base na largura dos picos ou em outros recursos, suficientemente largos para reduzir o ruído, mas não maiores que os recursos. Pode ser pequeno, digamos cinco pontos, ou maior como dezenas, cem talvez.

Você também escolhe uma ordem polinomial - geralmente eu uso 2 ou 4. A ordem 2 é boa para quando a janela é pequena, <10 pontos ou se estende por menos de meio ciclo (se o sinal se assemelhar a um seno), enquanto a ordem 4 é melhor na correspondência de formas de pico distorcidas, mas gosta de ter cerca de 9 ou mais pontos. Mas depende muito da forma e frequência do ruído.

Como outros dizem nos comentários, encontrar derivadas provavelmente não é a melhor estratégia, mas se você quiser encontrar derivadas de qualquer maneira, o filtro Savitzky-Golay pode fazer isso - suavizando e relatando simultaneamente a derivada em vez do sinal.

DarenW
fonte