2 — Do sinal ao vetor de características: extraindo features estatísticas a partir do Goertzel
Nesta seção vamos responder a pergunta central deste artigo: quais números o Goertzel deve produzir para que um modelo estatístico consiga decidir bem?
A resposta curta é: poucos, estáveis e interpretáveis. A resposta completa vem a seguir.
2.1 Por que “features” são mais importantes que o algoritmo de decisão
Em sistemas embarcados, a maior parte do sucesso não está no classificador, mas sim na qualidade das variáveis de entrada.
Um classificador simples com boas features quase sempre supera um classificador complexo com features ruins.
No nosso caso:
- O Goertzel é o sensor (extrai informação espectral)
- O aprendizado estatístico é o decisor
- As features são a linguagem comum entre os dois
Se as features forem:
- invariantes a ganho,
- pouco sensíveis a ruído,
- correlacionadas com o fenômeno (assobio),
então a decisão se torna trivial.
2.2 O que NÃO usar como feature (e por quê)
Antes de listar o que usar, vale eliminar armadilhas comuns:
Más escolhas de features
- Potência absoluta em uma frequência
→ depende demais do volume e da distância - Amplitude do sinal no tempo
→ fala e batidas confundem - Energia total do frame
→ não distingue periodicidade tonal - Número grande de bins Goertzel
→ custo alto e overfitting
Essas variáveis não são invariantes e exigem limiares frágeis.
2.3 Princípio fundamental: normalização e relações
Assobio humano é caracterizado por:
- Uma frequência dominante
- Harmônicos coerentes
- Estabilidade temporal
Logo, as melhores features são relações, não valores absolutos.
2.4 Feature 1 — Energia normalizada da fundamental
Definimos:
- \(p_0\): potência Goertzel na frequência fundamental
- \(E\): energia total do frame
Feature:
\[
f_1 = \frac{p_0}{E + \epsilon}
\]
Propriedades:
- Invariante a ganho
- Rejeita ruído broadband
- Forte quando há tom dominante
Implementação (já conhecida do artigo anterior):
float f1 = p0 / (E + 1e-9f);
2.5 Feature 2 — Relação do 2º harmônico
Assobios reais quase sempre geram um 2º harmônico mensurável.
\[
f_2 = \frac{p_2}{p_0 + \epsilon}
\]
Onde:
- \(p_2\): potência em \(2f_0\)
Interpretação:
- Valores muito baixos → ruído ou tom artificial
- Valores moderados → assobio natural
- Valores muito altos → saturação ou distorção
float f2 = p2 / (p0 + 1e-9f);
2.6 Feature 3 — Relação do 3º harmônico (opcional, mas valiosa)
Nem todo assobio tem 3º harmônico forte, mas quando existe, ele ajuda muito a reduzir falsos positivos.
\[
f_3 = \frac{p_3}{p_0 + \epsilon}
\]
Uso prático:
- Peso menor no modelo
- Ajuda a diferenciar fala aguda de assobio
float f3 = p3 / (p0 + 1e-9f);
2.7 Feature 4 — Estabilidade temporal da frequência
Assobios são estáveis em frequência por dezenas de milissegundos.
Fala e ruído não.
Definimos:
\[
f_4 = |f_0[n] – f_0[n-1]|
\]
Interpretação:
- Pequeno → padrão tonal estável
- Grande → variação típica de fala
Implementação simples:
float f4 = fabsf(f0_curr - f0_prev);
2.8 Montando o vetor de características
Nosso vetor final de features será:
\[
\mathbf{v} =
\begin{bmatrix}
f_1 \
f_2 \
f_3 \
f_4
\end{bmatrix}
\]
Ou, em C:
typedef struct {
float f1; // p0 / E
float f2; // p2 / p0
float f3; // p3 / p0
float f4; // delta f0
} feature_vec_t;
Este vetor tem propriedades excelentes:
- Dimensão baixa (4)
- Interpretação física clara
- Custo computacional mínimo
- Ideal para aprendizado estatístico online
2.9 Feature engineering é engenharia, não tentativa
Note que:
- Nenhuma feature é “mágica”
- Cada uma tem significado físico
- Todas são derivadas do Goertzel
- Todas foram pensadas para rodar em MCU
Isso é o que diferencia:
engenharia de sinal
de
“jogar dados em um classificador”