Trilha de aprendizado · Nível 13 · Tutorial 3

Filtro digital recursivo de primeira ordem

Implementar um filtro recursivo de primeira ordem e escolher seu coeficiente a partir do período de atualização e da rapidez de resposta desejada.

  • Nível: Intermediário
  • Duração: 18 min
  • 8 passos
Filtro digital recursivo de primeira ordem

O que você vai percorrer

  1. Entenda o estado e a correção recursiva Reconheça o estado que o filtro preserva e a correção que transforma esse estado a cada nova amostra. 2 min
  2. Rastreie a saída e interprete α Calcule atualizações sucessivas e relacione o coeficiente α ao compromisso entre rapidez e suavização. 2 min
  3. Calcule α pela constante de tempo Conecte o coeficiente α ao período de atualização e à constante de tempo desejada para configurar a resposta temporal do filtro. 3 min
  4. Implemente e inicialize o filtro Implemente uma função de filtro que conserva seu estado entre chamadas e começa pela primeira medição válida. 3 min
  5. Preserve as pequenas correções Evite que o filtro pare antes de alcançar a entrada por causa de conversões inteiras. 2 min
  6. Trate amostras inválidas e interrupções 2 min
  7. Compare com a média móvel Compare o filtro recursivo de primeira ordem e a média móvel sob as mesmas condições de entrada, distinguindo memória, flutuação residual e resposta a mudanças. 3 min
  8. Configure e valide um caso completo Conclua a configuração, a implementação e a validação de um filtro recursivo de primeira ordem em um caso sintético completo. 3 min

O que você vai aprender

  • Rastrear a evolução do estado do filtro em uma sequência curta.
  • Calcular α para um período e uma constante de tempo especificados.
  • Implementar o filtro com inicialização coerente e precisão numérica suficiente.
  • Comparar sua suavização e seu atraso com os de uma média móvel.

Antes de começar

  • Média móvel com buffer circular
  • Carga, descarga e constante de tempo RC
  • Funções com parâmetros e retorno

Passo 1 de 8

Entenda o estado e a correção recursiva

Reconheça o estado que o filtro preserva e a correção que transforma esse estado a cada nova amostra.

A saída também é memória

Um cálculo com memória

Um filtro recursivo calcula a nova saída usando a entrada atual e a saída que havia sido calculada antes. Por isso, ele mantém um estado entre atualizações.

Nesta etapa, considere a saída anterior y[k − 1] como esse estado guardado. Quando chega x[k], o filtro a compara com o estado e produz a nova saída y[k]. Em seguida, y[k] fica disponível como estado para a próxima atualização.

Fluxo de uma atualização

Diagrama com a entrada atual e o estado anterior entrando em um bloco de cálculo; a nova saída retorna para uma memória que alimentará a próxima atualização.

A saída recém-calculada é armazenada e passa a ser o estado da atualização seguinte.

Diferença, correção e novo estado

A equação como correção

A atualização do filtro é:

y[k] = y[k − 1] + α × (x[k] − y[k − 1])

Leia-a em três partes:

  1. Comece pelo estado anterior: y[k − 1].
  2. Calcule a diferença até a entrada atual: x[k] − y[k − 1].
  3. Some apenas uma parte dessa diferença: α × (x[k] − y[k − 1]).

Essa parcela é a correção. Assim, a nova saída não é calculada do zero: ela ajusta o valor que o filtro já mantinha.

Exemplo

Exemplo de uma atualização

Suponha que o estado anterior seja 10, a entrada atual seja 18 e que α = 0,25.

  • Diferença: 18 − 10 = 8
  • Correção: 0,25 × 8 = 2
  • Novo estado: 10 + 2 = 12

Portanto, y[k] vale 12. O filtro percebe que a entrada está acima do estado anterior e o move parcialmente nessa direção.

O valor de α será interpretado e escolhido nos próximos passos; por enquanto, observe seu papel: ele multiplica a diferença antes que ela seja somada ao estado.

Confira o fluxo da equação

Identifique os papéis

Associe cada elemento ao seu papel em uma atualização do filtro.

Faça as associações.

Toque em um item e depois no par correspondente.

Leve esta estrutura adiante

Síntese

Em cada atualização, o filtro segue esta ideia:

estado anterior → diferença até a entrada → correção parcial → novo estado

A recursão está no reaproveitamento da saída anterior. Na próxima tela, você rastreará esse estado ao longo de várias amostras e verá como diferentes valores de α alteram a resposta.

Pontos-chave

Elementos de uma única atualização recursiva.
ElementoFunção
x[k]Entrada que acabou de chegar
y[k − 1]Estado guardado da atualização anterior
α × (x[k] − y[k − 1])Correção parcial
y[k]Novo estado e saída atual

Passo 2 de 8

Rastreie a saída e interprete α

Calcule atualizações sucessivas e relacione o coeficiente α ao compromisso entre rapidez e suavização.

α controla rapidez e suavização

O tamanho da correção

O coeficiente α define quanto da diferença entre a entrada atual e o estado anterior será corrigido em cada atualização:

y[k] = y[k − 1] + α × (x[k] − y[k − 1])

Neste tutorial, adotamos 0 < α ≤ 1. Nessa faixa, diante de uma mudança de patamar, a saída avança em direção à entrada sem alternar para os dois lados do novo valor.

  • α = 1: a correção é toda a diferença; então y[k] = x[k]. Não há suavização.
  • α menor: apenas uma parte da diferença é corrigida a cada amostra. A saída fica mais suave, mas reage mais devagar.

Mesmo sinal, coeficientes diferentes

Comparação visual de uma entrada em degrau com respostas para alfa igual a 1, 0,5 e 0,2.

Quanto menor o valor de α, menor é a correção em cada atualização e mais lenta é a aproximação ao novo patamar.

Rastreando o estado

Exemplo

Exemplo calculado

Rastreie a sequência sempre na mesma ordem: use o estado anterior, calcule a diferença até a entrada, aplique a fração α e some ao estado.

Considere o estado inicial fornecido y[0] = 0, α = 0,5 e as duas entradas seguintes iguais a 10.

Duas atualizações

Na primeira atualização:

x[1] = 10

y[1] = 0 + 0,5 × (10 − 0) = 5

Na atualização seguinte, o estado anterior não é mais zero: é y[1] = 5.

x[2] = 10

y[2] = 5 + 0,5 × (10 − 5) = 7,5

Mesmo com a entrada mantida em 10, a correção diminui: primeiro foi 5; depois, 2,5. A saída se aproxima do patamar sem alcançá-lo de uma só vez.

Evolução do exemplo com entrada constante em 10.

Cada linha usa a saída da linha anterior como estado.
kx[k]y[k − 1]y[k]
0——0
11005
21057,5

Pratique o rastreamento

Calcule uma atualização

Use α = 0,5, estado inicial y[0] = 4 e entrada x[1] = 10.

Complete a saída após essa atualização:

y[1] = 4 + 0,5 × (10 − 4) = {{lacuna}}

y[1] =

Compare as escolhas de α

Comparação numérica

A mesma sequência recebe duas configurações, ambas com y[0] = 0. A entrada muda de 0 para 10 e permanece em 10.

Observe que α = 0,8 chega mais perto da entrada logo na primeira atualização do que α = 0,2. Isso significa resposta mais rápida, mas também menor suavização das variações de amostra para amostra.

Mesma entrada, estados iniciais e número de atualizações.

α maior aplica uma fração maior da diferença em cada linha.
AtualizaçãoEntrada xSaída, α = 0,2Saída, α = 0,8
Inicial000
11028
2103,69,6
3104,889,92

Identifique a passagem direta

Qual escolha acompanha exatamente cada nova amostra de entrada, sem suavização?

Passo 3 de 8

Calcule α pela constante de tempo

Conecte o coeficiente α ao período de atualização e à constante de tempo desejada para configurar a resposta temporal do filtro.

Relacione α ao que ainda falta

Da correção ao decaimento

Quando a entrada fica em um patamar constante, a saída se aproxima dela. A cada atualização, a diferença que ainda falta é multiplicada por 1 − α.

Se faltavam 10 unidades e α = 0,2, depois da atualização faltam 8: o filtro corrigiu 20% da diferença. Na próxima, corrigirá 20% do que restou. Portanto, α define o decaimento por amostra — mas, para definir a rapidez no tempo, também precisamos de T_s.

A diferença diminui a cada amostra

Diagrama com saídas sucessivas se aproximando de um patamar e espaços restantes cada vez menores.

Após cada atualização, a diferença restante é multiplicada por 1 − α.

Calcule o coeficiente

Escolha pelo tempo desejado

Para associar o filtro a uma constante de tempo desejada, use:

α = 1 − exp(−T_s / τ_f)

  • T_s: período entre atualizações;
  • τ_f: constante de tempo desejada para o filtro;
  • ambos devem ser positivos e estar na mesma unidade.

exp(z) é a função exponencial da calculadora ou da linguagem de programação. Não é preciso calcular derivadas.

Quanto menor for T_s em relação a τ_f, menor será α: cada atualização fará uma correção pequena, mas haverá mais atualizações no mesmo intervalo de tempo.

Exemplo

Exemplo calculado

Suponha T_s = 20 ms e τ_f = 100 ms.

  1. Faça as unidades coincidirem: 20 ms / 100 ms = 0,2.
  2. Calcule: α = 1 − exp(−0,2).
  3. Com exp(−0,2) ≈ 0,8187:

α ≈ 1 − 0,8187 = 0,1813

Use esse valor nas atualizações até que T_s ou τ_f seja alterado.

Pratique com uma razão de tempos

Unidades consistentes

A razão T_s/τ_f não tem unidade. Por isso, milissegundos e segundos funcionam igualmente bem, desde que sejam usados de modo consistente.

Exemplos de configuração

Valores aproximados obtidos por α = 1 − exp(−T_s/τ_f).

Mesmo τ_f, períodos diferentes exigem coeficientes diferentes.
T_sτ_fT_s / τ_fα
10 ms100 ms0,100,0952
20 ms100 ms0,200,1813
50 ms100 ms0,500,3935
0,02 s0,10 s0,200,1813

Pratique o cálculo

Calcule α para T_s = 25 ms e τ_f = 100 ms. Arredonde para quatro casas decimais.

Distingua amostras de tempo

Recalcule quando os parâmetros mudarem

Se o período mudar, o mesmo α mantém o mesmo comportamento por atualização, mas não necessariamente por segundo.

Um filtro configurado com T_s = 20 ms e τ_f = 100 ms usa α ≈ 0,1813. Se T_s passar para 40 ms e α for mantido, as correções ocorrerão com metade da frequência. O filtro ficará mais lento no tempo.

Para preservar τ_f = 100 ms, recalcule: α = 1 − exp(−40/100) ≈ 0,3297.

Calcule a exponencial na configuração inicial ou quando T_s ou τ_f mudar. Nas atualizações normais, use apenas o α já calculado; não é necessário chamar exp() a cada amostra.

Efeito da mudança de período

Um filtro usa α = 0,1813, calculado para T_s = 20 ms. Se o período passa a 40 ms e α não muda, a constante de tempo temporal continua sendo aproximadamente 100 ms.

Passo 4 de 8

Implemente e inicialize o filtro

Implemente uma função de filtro que conserva seu estado entre chamadas e começa pela primeira medição válida.

Guarde o histórico necessário

Um estado que permanece

A função do filtro recebe uma amostra válida e devolve a saída filtrada. Para funcionar entre chamadas, ela precisa guardar dois dados fora da função: o último valor filtrado (estado) e se já existe uma primeira amostra (inicializado).

Na primeira chamada, ainda não há saída anterior para aplicar à equação. Portanto, copie a medição para o estado e retorne-a. Nas chamadas seguintes, atualize o mesmo estado com o coeficiente alpha já calculado.

Estado entre chamadas

Diagrama de uma função chamada repetidamente que lê e atualiza um estado persistente e um indicador de inicialização.

O estado não é recriado a cada chamada: ele transporta a saída filtrada para a próxima atualização.

Inicialize uma única vez

Contrato e implementação

Declare o estado uma vez, em um escopo que continue existindo enquanto o programa roda. O indicador booleano separa o caso inicial das atualizações normais.

A função abaixo pressupõe que alpha está entre 0 e 1 e que amostra já foi considerada válida por quem a chama.

Filtro com inicialização

Código para estudar e usar em seu projeto local.

cpp
float estado = 0.0f;
bool inicializado = false;

float atualizaFiltro(float amostra, float alpha) {
  if (!inicializado) {
    estado = amostra;
    inicializado = true;
    return estado;
  }

  estado = estado + alpha * (amostra - estado);
  return estado;
}

Exemplo

Por que não começar em zero?

Se a primeira amostra for 42.0f, a primeira chamada devolve exatamente 42.0f, independentemente de alpha. Com isso, o filtro começa no valor realmente medido, não em um zero arbitrário.

Na chamada seguinte, a variável estado já contém 42 e pode receber a correção parcial prevista pela equação.

Sequência de processamento

Descreva a sequência

Considere alpha = 0,25 e uma primeira medição igual a 80. Qual sequência descreve corretamente o processamento da primeira chamada e das chamadas posteriores?

Escreva pelo menos 80 caracteres (0/80).

Ordem correta

Ordene as ações de uma chamada válida, colocando primeiro o tratamento da primeira amostra e depois a atualização normal.

  1. Receber a amostra válida.
  2. Se for a primeira chamada, copiar a amostra para o estado, marcar como inicializado e retornar.
  3. Verificar se o filtro ainda não foi inicializado.
  4. Nas chamadas posteriores, corrigir o estado com alpha e retornar o resultado.

Pratique a estrutura

Antes de conferir no código

Complete os trechos que fazem a primeira amostra definir o estado e que aplicam a atualização recursiva nas chamadas seguintes.

Complete a função

Preencha a lógica central da função.

cpp
float atualizaFiltro(float amostra, float alpha) {
  if () {
    estado = ;
    inicializado = ;
    return estado;
  }

  estado =  +  * (amostra - estado);
  return estado;
}

Passo 5 de 8

Preserve as pequenas correções

Evite que o filtro pare antes de alcançar a entrada por causa de conversões inteiras.

Veja o efeito do truncamento

Quando a correção some

Uma atualização do filtro tem uma correção: α × (entrada − estado). Se essa correção for fracionária, mas o resultado for guardado em uma variável inteira, a parte decimal é descartada.

Exemplo: com estado 100, entrada 101 e α = 0,2, a correção é 0,2. O novo valor matemático seria 100,2; em um int, ele volta a ser 100. Na próxima atualização, a mesma correção pode desaparecer de novo. Assim, o filtro fica parado apesar de ainda existir diferença até a entrada.

Inteiro versus ponto flutuante

Comparação visual: o estado inteiro permanece em 100 ao receber uma correção de 0,2; o estado em ponto flutuante passa para 100,2.

O armazenamento inteiro pode eliminar uma correção menor que uma unidade.

Escolha o tipo do estado

Regra prática

O problema não é a fórmula do filtro, e sim o local onde seu resultado é armazenado. Mantenha em ponto flutuante:

  • alpha;
  • o estado persistente;
  • a diferença e a correção intermediárias.

Converta para inteiro apenas na interface que realmente exigir isso, por exemplo ao enviar um valor para um hardware ou uma API que aceite somente inteiros. O estado interno não deve ser convertido a cada amostra.

Evolução em três atualizações

Considere estado = 100, entrada = 101 e alpha = 0,2.

Com o estado inteiro, a aproximação deixa de avançar já na primeira atualização.
AtualizaçãoEstado em intEstado em float
Inicial100100,0
1ª100100,2
2ª100100,36
3ª100100,488

Corrija sem prometer precisão infinita

O ponto de perda

Compare as duas versões. A primeira perde a parte fracionária toda vez que atribui o resultado ao estado inteiro.

cpp
// Incorreto: cada atribuição converte o resultado para inteiro.
int estado = 100;
float alpha = 0.2f;
int entrada = 101;

estado = estado + alpha * (entrada - estado);
// estado continua 100

// Correto: o estado preserva a fração.
float estadoFiltrado = 100.0f;
float entradaFloat = 101.0f;

estadoFiltrado = estadoFiltrado + alpha * (entradaFloat - estadoFiltrado);
// estadoFiltrado vale 100.2f

Dica

Atenção à escala

float também tem precisão finita. Em escalas muito grandes, uma correção muito pequena pode não alterar o valor armazenado. Portanto, teste o filtro com a faixa numérica real do seu sinal: confirme que uma correção esperada ainda muda o estado.

Isso não exige precisão ilimitada; exige que a resolução numérica seja adequada à medição e ao efeito que você quer preservar.

Aplique a escolha correta

Pratique a correção

Complete os tipos que preservam as correções fracionárias no estado do filtro.

cpp
struct Filtro {
   estado;
  bool inicializado;
};

float atualizar(Filtro &f, float entrada) {
  const  alpha = 0.2f;

  if (!f.inicializado) {
    f.estado = entrada;
    f.inicializado = true;
  } else {
    f.estado = f.estado + alpha * (entrada - f.estado);
  }
  return f.estado;
}

Passo 6 de 8

Trate amostras inválidas e interrupções

Reconheça a quebra de regularidade

Quando a atualização é aplicável

A relação entre α, período de atualização e constante de tempo pressupõe duas condições: cada entrada usada é válida e as atualizações ocorrem regularmente. Se uma leitura falha ou chega depois de uma lacuna, ela não representa simplesmente “mais uma amostra” na mesma sequência temporal.

Uma lacuna quebra a cadência

Diagrama temporal com amostras válidas regulares, uma lacuna de amostra inválida e a última saída mantida de forma tracejada.

A saída pode permanecer disponível, mas a lacuna impede assumir automaticamente a dinâmica temporal nominal.

Atenção

Regra de integridade

Não substitua uma leitura inválida por zero nem repita uma leitura antiga como se fosse nova. Ambas as ações criam uma entrada artificial e fazem o estado do filtro mudar por um dado que não foi medido.

Falha curta: não invente uma entrada

Mantenha, mas sinalize

Uma política simples separa o valor armazenado do status dele. Em uma falha curta, não execute a atualização recursiva: preserve y anterior e informe que a saída está desatualizada. Assim, quem usa a saída sabe que ela não representa uma medição recente.

Exemplo

Exemplo de falha curta

Exemplo: o filtro tem y = 24,6. A próxima aquisição é inválida. A saída publicada pode continuar em 24,6 com status “desatualizada”; não calcule uma nova correção. Quando houver uma nova amostra válida, a atualização pode voltar a ocorrer conforme a política de interrupção definida.

Interrupção longa: reinicialize de modo declarado

Retomada após interrupção longa

Defina um limiar de interrupção longa, adequado à aplicação: por exemplo, uma quantidade de períodos perdidos ou um tempo sem amostra válida. Ao ultrapassá-lo, marque o filtro como “precisa reinicializar”. Na próxima amostra válida, use-a para inicializar o estado, em vez de aplicar a equação sobre um estado antigo.

Atenção

Aceite a descontinuidade explícita

A reinicialização pode causar uma descontinuidade na saída: o valor antigo deixa de representar a situação atual. Isso é mais transparente do que fingir continuidade temporal durante uma lacuna longa.

Sequência de interrupção e retomada

Ordene as ações de uma política para uma interrupção que ultrapassa o limiar declarado, desde a primeira amostra inválida até a retomada.

  1. Manter a última saída publicada, identificando-a como desatualizada.
  2. Na primeira amostra válida posterior, inicializar o estado com essa amostra e publicar a nova saída.
  3. Ao atingir o limiar de ausência, marcar que o filtro precisa ser reinicializado.
  4. Rejeitar a amostra inválida e não atualizar o estado.

Verifique sua decisão

Decida a política

O filtro recebe amostras a cada 100 ms. Uma leitura é inválida e, depois, ficam 2 s sem leituras válidas — acima do limiar definido. Qual política é coerente?

Passo 7 de 8

Compare com a média móvel

Compare o filtro recursivo de primeira ordem e a média móvel sob as mesmas condições de entrada, distinguindo memória, flutuação residual e resposta a mudanças.

Defina as mesmas condições

Uma comparação justa

Para comparar de forma justa, aplique aos dois filtros o mesmo período de atualização T_s e a mesma sequência de entrada. Antes de uma mudança de patamar, deixe ambos estabelecidos no valor inicial: assim, a diferença observada vem do filtro, e não de condições iniciais diferentes.

Observe dois aspectos separadamente:

  • Flutuação residual: quanto as saídas ainda variam diante de pequenas perturbações.
  • Resposta à mudança: quantas atualizações cada saída leva para se aproximar do novo patamar.

O filtro recursivo usa a saída anterior e α. A média móvel usa a janela das últimas N amostras. Nenhum é universalmente “melhor”: a escolha depende da prioridade do sistema.

Mesma entrada, respostas diferentes

Gráfico comparativo: uma mesma entrada com pequenas perturbações e um degrau alimenta um filtro recursivo de resposta gradual e uma média móvel que alcança o patamar após a renovação da janela.

Compare a variação que sobra antes do degrau e o caminho de cada curva depois dele.

Interprete flutuação e mudança

Leia os resultados pelo contexto

Neste exemplo, ambos os filtros já estavam em 100 antes da tabela. A média móvel tem N = 4 e o recursivo usa α = 0,25. Os valores estão arredondados.

As pequenas perturbações alternadas mostram a flutuação residual. A partir de k = 5, a entrada passa a 120: compare o atraso de cada saída sem chamar nenhuma delas de atraso puro.

Resultados de uma sequência

Sequência comum aplicada aos dois filtros.

Saídas arredondadas para duas casas decimais.
kEntrada x[k]Recursivo α=0,25Média móvel N=4
0100100,00100,00
1104101,00101,00
29699,75100,00
3104100,81101,00
49699,61100,00
5120104,71104,00
6120108,53110,00
7120111,40114,00
8120113,55120,00

Exemplo

Conclusão limitada ao exemplo

Nesta configuração específica, a média móvel elimina a influência das amostras antigas após quatro atualizações no novo patamar; por isso chega a 120 em k = 8. O recursivo continua se aproximando gradualmente.

Isso não cria uma equivalência geral entre α = 0,25 e N = 4. Outras escolhas de α, N e sequências produzem outros compromissos de ruído e rapidez.

Verifique as afirmações

Compare sem generalizar

Associe cada aspecto à interpretação correta nesta comparação.

Toque em um item e depois no par correspondente.

Decida conforme a prioridade

Faça uma escolha justificada

Imagine que seu sistema tem pouca memória disponível, mas também não pode aceitar muita lentidão quando o sinal muda. Com base na comparação, qual filtro e quais parâmetros você investigaria primeiro? Justifique usando memória, flutuação residual e resposta à mudança. Não há uma única resposta correta.

Escreva pelo menos 100 caracteres (0/100).

Passo 8 de 8

Configure e valide um caso completo

Conclua a configuração, a implementação e a validação de um filtro recursivo de primeira ordem em um caso sintético completo.

Defina o cenário e o coeficiente

Caso de validação

Neste caso integrado, o filtro recebe uma amostra a cada T_s = 100 ms e deve ter τ_f = 500 ms. A sequência sintética é: 20, 20, 30, duas amostras inválidas, 30 e 20.

Use a política definida: uma amostra inválida mantém a última saída, identificada como desatualizada. Após duas posições consecutivas inválidas, o estado é reinicializado; a próxima amostra válida passa a ser a nova saída inicial.

O coeficiente é calculado uma vez na configuração:

α = 1 − exp(−T_s / τ_f)

Com T_s = 0,1 s e τ_f = 0,5 s, α ≈ 0,181269. Assim, uma mudança de 20 para 30 é corrigida parcialmente: a saída vai para aproximadamente 21,812692, não diretamente para 30.

Fluxo do caso

Linha do tempo com entrada em patamares, duas amostras inválidas, saída filtrada mantida durante a lacuna e reinicialização na retomada.

A interrupção não cria medições artificiais: a saída é mantida como desatualizada e o estado é reinicializado depois do limiar declarado.

Confira a configuração

Calcule α

Calcule o coeficiente do caso. Arredonde para quatro casas decimais:

α = 1 − exp(−0,1 / 0,5) = __

Implemente e confira as referências

Complete a atualização

Complete a função. Ela deve inicializar o estado uma única vez e preservar correções fracionárias.

cpp
float updateFilter(float sample) {
  if (!) {
    y = ;
    initialized = true;
    return y;
  }
  y +=  * (sample - y);
  return y;
}

Sketch completo de validação

Copie este programa inteiro para um único sketch, se quiser executá-lo na sua IDE ou em um Arduino Uno próprio. Ele não exige sensor nem circuito externo: as amostras são sintéticas.

cpp
#include <math.h>

const float TS_S = 0.1f;
const float TAU_F_S = 0.5f;
float alpha, y = 0.0f;
bool initialized = false;

struct Sample { float value; bool valid; };
Sample data[] = {{20,true},{20,true},{30,true},
                 {0,false},{0,false},{30,true},{20,true}};

float updateFilter(float sample) {
  if (!initialized) {
    y = sample;
    initialized = true;
    return y;
  }
  y += alpha * (sample - y);
  return y;
}

void setup() {
  Serial.begin(9600);
  alpha = 1.0f - exp(-TS_S / TAU_F_S);
  Serial.print("alpha="); Serial.println(alpha, 6);

  byte invalidCount = 0;
  for (byte k = 0; k < 7; k++) {
    if (!data[k].valid) {
      invalidCount++;
      Serial.print(k); Serial.print(" invalid, y=");
      Serial.println(y, 6);
      if (invalidCount >= 2) initialized = false;
      continue;
    }
    invalidCount = 0;
    float out = updateFilter(data[k].value);
    Serial.print(k); Serial.print(" valid, y=");
    Serial.println(out, 6);
  }
}
void loop() {}
Saída esperada
alpha=0.181269
0 valid, y=20.000000
1 valid, y=20.000000
2 valid, y=21.812693
3 invalid, y=21.812693
4 invalid, y=21.812693
5 valid, y=30.000000
6 valid, y=28.187307

A formatação decimal pode variar levemente entre versões da IDE, mas os valores e os estados devem ser equivalentes.

Valide e encerre

Justifique o comportamento

Analise o registro de referência do sketch e responda em poucas frases:

  1. Por que a saída em k=2 é aproximadamente 21,81, em vez de 30?
  2. Por que a saída em k=5 volta diretamente para 30?
  3. Qual é o compromisso observado ao escolher este α: suavização, atraso, ou ambos?

Escreva pelo menos 100 caracteres (0/100).

Resumo

Lista final de verificação

  • Calcule α com T_s e τ_f na mesma unidade: α = 1 − exp(−T_s/τ_f).
  • Calcule a exponencial na configuração ou quando os parâmetros mudarem, não a cada amostra.
  • Inicialize y pela primeira amostra válida; mantenha y e α em ponto flutuante.
  • Não atualize o filtro com dado inválido. Marque a saída mantida como desatualizada.
  • Declare um limiar para interrupção longa e reinicialize na próxima amostra válida.
  • Menor α suaviza mais, mas acrescenta mais atraso à resposta.

Tutorial concluído

Parabéns! Você concluiu: Filtro digital recursivo de primeira ordem

Concluído! Use esta lista de verificação ao aplicar o filtro a uma aquisição real: período regular, coeficiente coerente, estado válido, precisão suficiente e compromisso consciente entre suavização e atraso.

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso