Continuação da série: Filtragem Digital, Cepstrum e Detecção Acústica em MCU
Table of Contents
- Continuação da série: Filtragem Digital, Cepstrum e Detecção Acústica em MCU
- 1. Introdução — Por que Goertzel?
- 1.1 Estratégia geral adotada neste artigo
- 1.2 Quando Goertzel é a escolha correta (e quando não é)
- 1.3 Relação direta com o artigo anterior
- 1.4 O que você terá ao final deste artigo
- 2 — Fundamentos matemáticos do algoritmo de Goertzel (do zero, passo a passo)
- 2.1 Onde o Goertzel se encaixa no DSP clássico
- 2.2 A DFT vista como um único bin
- 2.3 A ideia-chave: um oscilador ressonante discreto
- 2.4 Extraindo a energia da frequência
- 2.5 Relação com filtros IIR de segunda ordem
- 2.6 Escolha de (N) e resolução em frequência
- 2.7 Como mapeamos frequência real → índice (k)
- 2.8 O que vamos detectar no assobio
- 3 — Implementação básica do algoritmo de Goertzel em C (isolado, incremental e testável)
- 4 — Goertzel em tempo real no RP2040: ADC + frames + múltiplas frequências (fundamental e harmônicos)
- 4.1 Definindo o frame e a taxa de amostragem
- 4.2 Estratégia “Goertzel multibanda”
- 4.3 Aquisição em tempo real (ADC + timer), igual ao artigo anterior
- 4.4 Pré-processamento mínimo: remoção de DC por média móvel (mais robusto)
- 4.5 Varredura com Goertzel (faixa 800–3000 Hz)
- 4.6 Encontrando o candidato de fundamental (pico na faixa)
- 4.7 Confirmação por harmônicos (2f0 e 3f0)
- 4.8 Integração: montar o “processador de frame” (ainda sem LED)
- 5 — Decisor completo + LED + otimizações (coeficientes pré-computados, EMA, histerese) e integração no RP2040
- 5.1 Otimização essencial: pré-computar os detectores da varredura
- 5.2 Goertzel “rápido” usando coeff pré-calculado
- 5.3 Encontrar o melhor candidato f0 (varredura)
- 5.4 Harmônicos com cálculo “on demand”
- 5.5 Critério espectral composto (score)
- 5.6 Decisão robusta com EMA + histerese
- 5.7 Integração de tempo real (ADC + DC-block + frame)
- 5 — Decisor completo + LED + otimizações (coeficientes pré-computados, EMA, histerese) e integração no RP2040
- 5.1 Otimização essencial: pré-computar os detectores da varredura
- 5.2 Goertzel “rápido” usando coeff pré-calculado
- 5.3 Encontrar o melhor candidato f0 (varredura)
- 5.4 Harmônicos com cálculo “on demand”
- 5.5 Critério espectral composto (score)
- 5.6 Decisão robusta com EMA + histerese
- 5.7 Integração de tempo real (ADC + DC-block + frame)
- 6 — Código completo e funcional (BitDogLab / RP2040) com Goertzel: detecção de assobio + LED
- 7 — Calibração prática, comparação com o artigo anterior, encerramento e SEO
1. Introdução — Por que Goertzel?
No artigo anterior desta série, exploramos uma abordagem baseada em filtragem digital construída com Séries de Taylor, seguida pelo cálculo do cepstrum, para identificar a periodicidade característica de um assobio humano. Aquela estratégia privilegiou uma análise global do espectro, permitindo identificar a estrutura harmônica do sinal de forma robusta, mesmo em ambientes com ruído.
Neste novo artigo, damos continuidade direta a essa série, adotando uma estratégia complementar e mais enxuta: o algoritmo de Goertzel. Em vez de calcular todo o espectro via FFT, o Goertzel permite extrair seletivamente a energia de frequências específicas, tornando-o ideal para microcontroladores com recursos limitados — como o RP2040 — quando o interesse está restrito a faixas bem definidas.
O assobio humano típico apresenta uma frequência fundamental relativamente estável, geralmente entre 800 Hz e 3000 Hz, com harmônicos previsíveis. O algoritmo de Goertzel explora exatamente esse cenário:
“Eu sei qual frequência quero detectar — e só ela importa.”
1.1 Estratégia geral adotada neste artigo
A arquitetura de processamento deste artigo será:
- Aquisição do sinal acústico (ADC do RP2040)
- Pré-processamento simples (remoção de DC e normalização)
- Aplicação do algoritmo de Goertzel para:
- Frequência fundamental
- Harmônicos selecionados
- Construção de um critério de decisão espectral
- Confirmação temporal (evitar falsos positivos)
- Acionamento de um LED quando o assobio é detectado
Diferentemente do artigo anterior:
- ❌ Não calcularemos FFT
- ❌ Não calcularemos cepstrum
- ✅ Usaremos análise espectral pontual
- ✅ Menor uso de RAM e CPU
- ✅ Menor latência
Isso permite uma comparação clara entre duas filosofias de DSP embarcado:
- FFT + Cepstrum → análise estrutural
- Goertzel → análise dirigida por frequência
1.2 Quando Goertzel é a escolha correta (e quando não é)
Goertzel é uma excelente escolha quando:
- Você conhece as frequências de interesse
- O número de frequências é pequeno
- O MCU possui RAM limitada
- A latência precisa ser baixa
- O sistema é reativo (event-driven)
Goertzel NÃO é a melhor escolha quando:
- A frequência fundamental varia muito
- Você precisa analisar o espectro completo
- O sinal tem múltiplas fontes concorrentes
- A estrutura harmônica é desconhecida
Este artigo assume explicitamente o caso ideal para Goertzel:
👉 detectar um fenômeno acústico específico e conhecido.
1.3 Relação direta com o artigo anterior
Este artigo não substitui o anterior — ele o complementa.
| Artigo anterior | Este artigo |
|---|---|
| Séries de Taylor | Goertzel |
| FFT + Cepstrum | Análise pontual |
| Estrutura harmônica global | Frequência-alvo |
| Mais matemática | Mais eficiência |
| Mais flexível | Mais determinístico |
A ideia da série é exatamente essa: mostrar estratégias diferentes para o mesmo problema, permitindo ao engenheiro escolher conscientemente.
1.4 O que você terá ao final deste artigo
Ao final deste artigo, você terá:
- Um detector de assobio funcional
- Código 100% em C, portátil
- Execução em tempo real no RP2040
- Arquitetura reutilizável para:
- DTMF
- Tons de controle
- Alarmes acústicos
- Interfaces sonoras simples