collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Tipos de filtro/tratamento de dados a aplicar a dados recolhidos por sensores  (Lida 4788 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Kristey

  • Mini Robot
  • *
  • Mensagens: 783
Boa tarde.

Apesar de ter tido uma cadeira de sensores inteligentes, não abordamos esta temática (  :o >:( )
Normalmente para medição de baterias por ADC adquirir varias medidas e fazer uma media, resolvia a situação.
Mas neste momento estou-me a deparar com um problema de um sensor que trabalha por i2c que me devolve os valores ja tratados da grandeza que mede contudo de vez em quando devolve picos, um valor que varia normalmente à unidade:
124,124,124,124,125,125,125,300,126,126
Obviamente que aquele 300 está errado.

Media:
Por exemplo de 10 valores não me resolve o problema.
Media=142,3

Mediana:
Mediana: 125
A mediana ja resolve por exemplo, mas ignora todos os outros valores (por mais vezes que eles apareçam).

Haverá mais formas de tratar este problema ate de uma forma mais científica?
« Última modificação: 08 de Abril de 2017, 16:49 por Kristey »

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Fazes a média e descartas valores que ultrapassarem em X % a média, se realmente esse valor for errado.
Tens a certeza que é um valor errado?
Que sensor é?
Avr fanboy

Offline Kristey

  • Mini Robot
  • *
  • Mensagens: 783
É uma temperatura.
Ja tinha pensado nessa questão da rejeição de valores a cima ou a baixo da media, pensei em ver o "declive da derivada entre dois valores"
Mas realmente esse metodo é melhor.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Fazes a média e descartas valores que ultrapassarem em X % a média, se realmente esse valor for errado.

Isto.
É um método "standard", não sei o nome. Deitas fora os que estiverem muito fora da média, os "outliers". Em certas aplicações podes ter que ter cuidados adicionais, como não descartar mais do que Y% dos valores por unidade de tempo.
« Última modificação: 09 de Abril de 2017, 01:37 por Njay »

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Eu tenho ideia que já li isso ser chamado de data/sample prunning, mas as internets só me mostram decision tree prunning para big data/data minning(que vai dar ao mesmo, é tirar os outliers).
Avr fanboy

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.481
Uma maneira que inventei agora "em cima do joelho":

pseudo codigo:

Código: [Seleccione]
var valorActual, mediaAcc;

Loop:
    valorActual = LeSensor();
    if ABS(valorActual - mediaAcc) < THRESHOULD_A_DEFINIR
         mediaAcc = (mediaAcc + valorActual) / 2;
    else
         // ignora valor

Outra alternativa é fazer uma media movel? (media dos ultimos X valores?) e descartar esse valor que sai fora de determinado threshould.

Isto tem um problema, que é.. se houver mesmo uma variacao muito brusca.
Entao a alternativa seria usar a media móvel e como os valores antigos vao sendo perdidos e os novos vao entrando.. quando so houver novos, a diferente dos novos e os antigos está abaixo desse treshould.. e passa a calcular usando os novos valores.


Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Boa tarde.

Apesar de ter tido uma cadeira de sensores inteligentes, não abordamos esta temática (  :o >:( )
Normalmente para medição de baterias por ADC adquirir varias medidas e fazer uma media, resolvia a situação.
Mas neste momento estou-me a deparar com um problema de um sensor que trabalha por i2c que me devolve os valores ja tratados da grandeza que mede contudo de vez em quando devolve picos, um valor que varia normalmente à unidade:
124,124,124,124,125,125,125,300,126,126
Obviamente que aquele 300 está errado.

Media:
Por exemplo de 10 valores não me resolve o problema.
Media=142,3

Mediana:
Mediana: 125
A mediana ja resolve por exemplo, mas ignora todos os outros valores (por mais vezes que eles apareçam).

Haverá mais formas de tratar este problema ate de uma forma mais científica?


Problema bastante comum no tratamento de sinais da vida real.
Contudo, o sensor devolver-te um valor tao dispar do nominal, eh estranho por si.

Podes fazer medias e/ou medianas, mas o melhor algoritmo p tratar o TEU sinal, deve ser adaptado ao teu TIPO DE SINAL. Isto porque as aplicacoes sao todas diferentes e todas precisam atencao pessoal e particular.
Poderahs ter q, alem da media/mediana, adicionar mais variaveis ao teu algoritmo de modo a dar-te apenas valores filtrados reais descartando variacoes bruscas.

Eh temperatura da agua q estahs a medir?  Nunca vi a agua a mudar to rapidamente de temperatura. Sinceramente eh um meio muito lento nesse aspecto.
Por isso se sabes q o teu delta-T acima de determinado valor eh errado, entao sabes como corrigir/auto-corrigir o teu algoritmo.


Offline dropes

  • Mini Robot
  • *
  • Mensagens: 2.189
Realmente não é suposto um sensor de temperatura ter mudanças tão bruscas.
Se tal existe então algo se passa na leitura, interferências externas ou código à mistura.

Principalmente averiguar o motivo destes valores, se for normal deve-se ignorar os picos já que não são usados na prática.

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.481
Realmente não é suposto um sensor de temperatura ter mudanças tão bruscas.
Se tal existe então algo se passa na leitura, interferências externas ou código à mistura.

Principalmente averiguar o motivo destes valores, se for normal deve-se ignorar os picos já que não são usados na prática.

Este tipo de casos pode ser investigado no hardware (se justificar),
no entanto, por experiencia própria, o software nao pode ignorar estes valores no sentido que alguma coisa tem de fazer com eles mesmo que apareçam.

Já me aconteceu escrever código que partia do princípio que se ia verificar o requisito de hardware, eg: "a temperatura varia entre 0.0V e 2.5V"
Guess what? afinal havia situaçoes que o hardware criava picos maiores que 2.5V e o meu código fazia overflow e o resultado era completamente contrário ao que seria de esperar. Isto aconteceu já com os equipamentos instalados no terreno e não tinha sido testado em laboratorio :/

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
Concordo quando o Sena diz que é preciso adequar cada caso à sua situação, porque a ideia de ignorar os valores foram de x % da média é uma boa ideia, mas se estiveres a falar de valores muito baixos estás sujeito a ter problemas...
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein