MCU & FPGA DSP Filtros Estatísticos em Sistemas Embarcados: EMA, Wiener e Kalman Aplicados ao RP2040

Filtros Estatísticos em Sistemas Embarcados: EMA, Wiener e Kalman Aplicados ao RP2040


2 — Filtro de Wiener: minimização do erro médio e separação sinal-ruído

Se a EMA responde à pergunta “quanto do passado eu devo lembrar?”, o Filtro de Wiener responde a outra, mais ambiciosa:

Como estimar o sinal verdadeiro quando conheço (ou estimo) o ruído?

Aqui saímos da suavização empírica e entramos em otimalidade estatística — ainda mantendo o foco em implementações viáveis em MCU.


2.1 A ideia central do Wiener (sem fórmulas intimidadoras)

O Filtro de Wiener é construído sobre um princípio simples:

Escolher o filtro que minimiza o erro quadrático médio (MSE)
entre o sinal estimado e o sinal real.

Em termos práticos, isso significa:

  • Se o ruído domina certas frequências → atenuá-las mais
  • Se o sinal domina outras frequências → preservá-las

Ao contrário da EMA:

  • ❌ Não trata todas as frequências igualmente
  • ✅ Usa informação estatística do sinal e do ruído

2.2 Modelo estatístico assumido

O Wiener parte de um modelo clássico:

\[
x[n] = s[n] + v[n]
\]

Onde:

  • \(x[n]\): sinal medido
  • \(s[n]\): sinal verdadeiro (desconhecido)
  • \(v[n]\): ruído (estatisticamente caracterizável)

Hipóteses (importantes):

  • \(s[n]) e (v[n]\) são não correlacionados
  • O ruído tem estatística conhecida ou estimável
  • O objetivo é minimizar o erro médio quadrático

Essas hipóteses já nos dizem algo importante:

👉 Wiener não é universal — ele funciona muito bem quando o ruído é previsível.


2.3 Wiener no domínio da frequência (visão conceitual)

No domínio da frequência, o filtro de Wiener tem a forma:

\[
H(f) = \frac{S_{ss}(f)}{S_{ss}(f) + S_{vv}(f)}
\]

Onde:

  • \(S_{ss}(f)\): densidade espectral do sinal
  • \(S_{vv}(f)\): densidade espectral do ruído

Interpretação direta:

  • Se \(S_{vv}(f) \gg S_{ss}(f)) → (H(f) \approx 0\)
  • Se \(S_{ss}(f) \gg S_{vv}(f)) → (H(f) \approx 1\)

Ou seja:

o filtro decide quanto confiar em cada frequência.


2.4 Por que isso é poderoso em sistemas embarcados?

Em muitos sistemas reais:

  • O ruído é conhecido (sensor, ADC, ambiente)
  • O sinal de interesse ocupa bandas específicas

Exemplos:

  • Microfone com ruído branco dominante
  • Sensor analógico com ruído térmico
  • Leituras de corrente com ripple conhecido
  • Sinais acústicos com banda estreita

Nesses casos, Wiener supera facilmente:

  • EMA
  • médias móveis simples
  • limiares fixos

2.5 Wiener simplificado para MCU (forma escalar)

Para firmware embarcado, não usamos FFT gigante.
Usamos uma forma escalar simplificada, baseada em variâncias:

\[
\hat{s}[n] = \frac{\sigma_s^2}{\sigma_s^2 + \sigma_v^2} ; x[n]
\]

Onde:

  • \(\sigma_s^2\): variância estimada do sinal
  • \(\sigma_v^2\): variância estimada do ruído

Esse fator:

\[
K = \frac{\sigma_s^2}{\sigma_s^2 + \sigma_v^2}
\]

atua como um ganho adaptativo ótimo.


2.6 Implementação incremental em C (forma prática)

Vamos definir uma estrutura simples:

typedef struct {
    float var_signal;
    float var_noise;
} wiener_filter_t;

Inicialização típica:

static inline void wiener_init(wiener_filter_t *w,
                               float var_signal,
                               float var_noise)
{
    w->var_signal = var_signal;
    w->var_noise  = var_noise;
}

Passo de filtragem:

static inline float wiener_step(wiener_filter_t *w, float x)
{
    float K = w->var_signal / (w->var_signal + w->var_noise);
    return K * x;
}

Simples, previsível e eficiente.


2.7 Estimando variâncias em tempo real

Em firmware real, variâncias podem ser estimadas com EMA:

static inline void update_variance(float *var, float x, float mean, float alpha)
{
    float d = x - mean;
    *var += alpha * (d*d - *var);
}

Estratégia comum:

  • Ruído: estimar durante silêncio
  • Sinal: estimar durante evento válido

Essa separação é crucial para o Wiener funcionar bem.


2.8 Onde o Wiener falha (e quando não usar)

Apesar de ótimo, o Wiener tem limitações claras:

  • Requer estimativa confiável do ruído
  • Assume estacionariedade
  • Não modela dinâmica temporal
  • Não prevê estados futuros

Se:

  • o ruído muda rápido,
  • o sistema tem dinâmica própria,
  • ou o estado não é diretamente observável,

então precisamos ir além.

👉 É aqui que entra o Filtro de Kalman.


2.9 EMA vs. Wiener (comparação direta)

AspectoEMAWiener
ComplexidadeMuito baixaBaixa
Modelo estatísticoImplícitoExplícito
Conhecimento do ruídoNãoSim
OtimalidadeHeurísticaMSE mínimo
Uso típicoSuavizaçãoSeparação sinal-ruído

0 0 votos
Classificação do artigo
Inscrever-se
Notificar de
guest
0 Comentários
mais antigos
mais recentes Mais votado
Feedbacks embutidos
Ver todos os comentários

Related Post

LPCC (Linear Prediction Cepstral Coefficients): Fundamentos, Algoritmos e Aplicações em Sistemas EmbarcadosLPCC (Linear Prediction Cepstral Coefficients): Fundamentos, Algoritmos e Aplicações em Sistemas Embarcados

Os coeficientes cepstrais por predição linear (LPCC) são uma técnica clássica e altamente eficiente para extração de características em sinais de fala, vibração e acústica industrial. Neste artigo, apresentamos uma

0
Adoraria saber sua opinião, comente.x