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.
peak-detection
Ktuncer
fonte
fonte
Respostas:
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.
fonte