<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>firmware em c - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/firmware-em-c/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Tue, 06 Jan 2026 22:44:43 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://mcu.tec.br/wp-content/uploads/2025/02/Robo-para-o-site-MCU.tec_.br-512x512-1-150x150.png</url>
	<title>firmware em c - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Detecção de Assobio com Goertzel e Aprendizado Estatístico no RP2040</title>
		<link>https://mcu.tec.br/algoritimos/dsp/deteccao-de-assobio-com-goertzel-e-aprendizado-estatistico-no-rp2040/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=deteccao-de-assobio-com-goertzel-e-aprendizado-estatistico-no-rp2040</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Thu, 12 Feb 2026 11:36:50 +0000</pubDate>
				<category><![CDATA[DSP]]></category>
		<category><![CDATA[aprendizado estatístico]]></category>
		<category><![CDATA[BitDogLab]]></category>
		<category><![CDATA[classificação estatística]]></category>
		<category><![CDATA[detecção de assobio]]></category>
		<category><![CDATA[DSP embarcado]]></category>
		<category><![CDATA[firmware em c]]></category>
		<category><![CDATA[Goertzel]]></category>
		<category><![CDATA[processamento de áudio]]></category>
		<category><![CDATA[RP2040]]></category>
		<category><![CDATA[sistemas adaptativos]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1127</guid>

					<description><![CDATA[<p>Este artigo apresenta uma abordagem avançada e didática para detecção de assobio humano em microcontroladores RP2040 utilizando o algoritmo de Goertzel combinado com aprendizado estatístico adaptativo. Como continuação direta de uma série sobre DSP embarcado, o conteúdo mostra como transformar medições espectrais determinísticas em vetores de características robustos e como aplicar modelos estatísticos leves — baseados em média, variância e distância probabilística — para tomada de decisão confiável em ambientes variáveis. Toda a solução é implementada integralmente em linguagem C, sem bibliotecas externas, executando em tempo real na BitDogLab. O artigo é voltado a engenheiros, estudantes e desenvolvedores que desejam compreender, projetar e aplicar sistemas de processamento digital de sinais adaptativos em microcontroladores de recursos limitados.</p>
<p>The post <a href="https://mcu.tec.br/algoritimos/dsp/deteccao-de-assobio-com-goertzel-e-aprendizado-estatistico-no-rp2040/">Detecção de Assobio com Goertzel e Aprendizado Estatístico no RP2040</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Continuação da série: </p>



<ul class="wp-block-list">
<li><a href="https://mcu.tec.br/?p=1115" title="">Filtragem Digital, Cepstrum e Detecção Acústica em MCU</a></li>



<li><a href="https://mcu.tec.br/?p=1125" title="detecção de assobio">Detecção de Assobio Humano com o Algoritmo de Goertzel no RP2040</a></li>
</ul>


<div class="root-eb-toc-tjnly wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-tjnly "><div class="eb-toc-container eb-toc-tjnly  eb-toc-is-not-sticky eb-toc-not-collapsible eb-toc-initially-not-collapsed eb-toc-scrollToTop style-1 list-style-none" data-scroll-top="false" data-scroll-top-icon="fas fa-angle-up" data-collapsible="false" data-sticky-hide-mobile="false" data-sticky="false" data-scroll-target="scroll_to_toc" data-copy-link="false" data-editor-type="" data-hide-desktop="false" data-hide-tab="false" data-hide-mobile="false" data-itemcollapsed="false" data-highlight-scroll="false"><div class="eb-toc-header"><h2 class="eb-toc-title">Table of Contents</h2></div><div class="eb-toc-wrapper " data-headers="[{&quot;level&quot;:2,&quot;content&quot;:&quot;1. Introdu\u00e7\u00e3o \u2014 Por que combinar Goertzel com aprendizado estat\u00edstico?&quot;,&quot;text&quot;:&quot;1. Introdu\u00e7\u00e3o \u2014 Por que combinar Goertzel com aprendizado estat\u00edstico?&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1.1 O papel do Goertzel nesta nova arquitetura&quot;,&quot;text&quot;:&quot;1.1 O papel do Goertzel nesta nova arquitetura&quot;,&quot;link&quot;:&quot;11-o-papel-do-goertzel-nesta-nova-arquitetura&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1.2 O que entendemos aqui por \u201caprendizado estat\u00edstico\u201d&quot;,&quot;text&quot;:&quot;1.2 O que entendemos aqui por \u201caprendizado estat\u00edstico\u201d&quot;,&quot;link&quot;:&quot;eb-table-content-2&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1.3 Por que limiares fixos falham em campo&quot;,&quot;text&quot;:&quot;1.3 Por que limiares fixos falham em campo&quot;,&quot;link&quot;:&quot;13-por-que-limiares-fixos-falham-em-campo&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1.4 Vis\u00e3o geral da nova arquitetura&quot;,&quot;text&quot;:&quot;1.4 Vis\u00e3o geral da nova arquitetura&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1.5 O que voc\u00ea ter\u00e1 ao final deste artigo&quot;,&quot;text&quot;:&quot;1.5 O que voc\u00ea ter\u00e1 ao final deste artigo&quot;,&quot;link&quot;:&quot;eb-table-content-5&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;2 \u2014 Do sinal ao vetor de caracter\u00edsticas: extraindo features estat\u00edsticas a partir do Goertzel&quot;,&quot;text&quot;:&quot;2 \u2014 Do sinal ao vetor de caracter\u00edsticas: extraindo features estat\u00edsticas a partir do Goertzel&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.1 Por que \u201cfeatures\u201d s\u00e3o mais importantes que o algoritmo de decis\u00e3o&quot;,&quot;text&quot;:&quot;2.1 Por que \u201cfeatures\u201d s\u00e3o mais importantes que o algoritmo de decis\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.2 O que N\u00c3O usar como feature (e por qu\u00ea)&quot;,&quot;text&quot;:&quot;2.2 O que N\u00c3O usar como feature (e por qu\u00ea)&quot;,&quot;link&quot;:&quot;eb-table-content-8&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.3 Princ\u00edpio fundamental: normaliza\u00e7\u00e3o e rela\u00e7\u00f5es&quot;,&quot;text&quot;:&quot;2.3 Princ\u00edpio fundamental: normaliza\u00e7\u00e3o e rela\u00e7\u00f5es&quot;,&quot;link&quot;:&quot;eb-table-content-9&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.4 Feature 1 \u2014 Energia normalizada da fundamental&quot;,&quot;text&quot;:&quot;2.4 Feature 1 \u2014 Energia normalizada da fundamental&quot;,&quot;link&quot;:&quot;24-feature-1-energia-normalizada-da-fundamental&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.5 Feature 2 \u2014 Rela\u00e7\u00e3o do 2\u00ba harm\u00f4nico&quot;,&quot;text&quot;:&quot;2.5 Feature 2 \u2014 Rela\u00e7\u00e3o do 2\u00ba harm\u00f4nico&quot;,&quot;link&quot;:&quot;eb-table-content-11&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.6 Feature 3 \u2014 Rela\u00e7\u00e3o do 3\u00ba harm\u00f4nico (opcional, mas valiosa)&quot;,&quot;text&quot;:&quot;2.6 Feature 3 \u2014 Rela\u00e7\u00e3o do 3\u00ba harm\u00f4nico (opcional, mas valiosa)&quot;,&quot;link&quot;:&quot;eb-table-content-12&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.7 Feature 4 \u2014 Estabilidade temporal da frequ\u00eancia&quot;,&quot;text&quot;:&quot;2.7 Feature 4 \u2014 Estabilidade temporal da frequ\u00eancia&quot;,&quot;link&quot;:&quot;eb-table-content-13&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.8 Montando o vetor de caracter\u00edsticas&quot;,&quot;text&quot;:&quot;2.8 Montando o vetor de caracter\u00edsticas&quot;,&quot;link&quot;:&quot;eb-table-content-14&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.9 Feature engineering \u00e9 engenharia, n\u00e3o tentativa&quot;,&quot;text&quot;:&quot;2.9 Feature engineering \u00e9 engenharia, n\u00e3o tentativa&quot;,&quot;link&quot;:&quot;eb-table-content-15&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;3 \u2014 Modelo estat\u00edstico adaptativo: m\u00e9dia, vari\u00e2ncia e decis\u00e3o probabil\u00edstica (online, leve e interpret\u00e1vel)&quot;,&quot;text&quot;:&quot;3 \u2014 Modelo estat\u00edstico adaptativo: m\u00e9dia, vari\u00e2ncia e decis\u00e3o probabil\u00edstica (online, leve e interpret\u00e1vel)&quot;,&quot;link&quot;:&quot;eb-table-content-16&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.1 Princ\u00edpio do modelo: aprender o \u201cnormal\u201d e medir desvio&quot;,&quot;text&quot;:&quot;3.1 Princ\u00edpio do modelo: aprender o \u201cnormal\u201d e medir desvio&quot;,&quot;link&quot;:&quot;eb-table-content-17&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.2 Modelo estat\u00edstico por feature (independente)&quot;,&quot;text&quot;:&quot;3.2 Modelo estat\u00edstico por feature (independente)&quot;,&quot;link&quot;:&quot;eb-table-content-18&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.3 Atualiza\u00e7\u00e3o online da m\u00e9dia (EMA)&quot;,&quot;text&quot;:&quot;3.3 Atualiza\u00e7\u00e3o online da m\u00e9dia (EMA)&quot;,&quot;link&quot;:&quot;eb-table-content-19&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.4 Atualiza\u00e7\u00e3o online da vari\u00e2ncia (forma est\u00e1vel)&quot;,&quot;text&quot;:&quot;3.4 Atualiza\u00e7\u00e3o online da vari\u00e2ncia (forma est\u00e1vel)&quot;,&quot;link&quot;:&quot;eb-table-content-20&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.5 Inicializa\u00e7\u00e3o segura do modelo&quot;,&quot;text&quot;:&quot;3.5 Inicializa\u00e7\u00e3o segura do modelo&quot;,&quot;link&quot;:&quot;eb-table-content-21&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.6 Medida de desvio: Z-score por feature&quot;,&quot;text&quot;:&quot;3.6 Medida de desvio: Z-score por feature&quot;,&quot;link&quot;:&quot;36-medida-de-desvio-z-score-por-feature&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.7 Dist\u00e2ncia estat\u00edstica simplificada (score global)&quot;,&quot;text&quot;:&quot;3.7 Dist\u00e2ncia estat\u00edstica simplificada (score global)&quot;,&quot;link&quot;:&quot;eb-table-content-23&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.8 Regra de decis\u00e3o probabil\u00edstica simples&quot;,&quot;text&quot;:&quot;3.8 Regra de decis\u00e3o probabil\u00edstica simples&quot;,&quot;link&quot;:&quot;eb-table-content-24&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.9 Aprendizado controlado (n\u00e3o aprender ru\u00eddo)&quot;,&quot;text&quot;:&quot;3.9 Aprendizado controlado (n\u00e3o aprender ru\u00eddo)&quot;,&quot;link&quot;:&quot;eb-table-content-25&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.10 O que conquistamos at\u00e9 aqui&quot;,&quot;text&quot;:&quot;3.10 O que conquistamos at\u00e9 aqui&quot;,&quot;link&quot;:&quot;eb-table-content-26&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;4 \u2014 Integra\u00e7\u00e3o completa em tempo real: Goertzel + features + modelo estat\u00edstico + LED no RP2040&quot;,&quot;text&quot;:&quot;4 \u2014 Integra\u00e7\u00e3o completa em tempo real: Goertzel + features + modelo estat\u00edstico + LED no RP2040&quot;,&quot;link&quot;:&quot;eb-table-content-27&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.1 Vis\u00e3o geral do fluxo em tempo real&quot;,&quot;text&quot;:&quot;4.1 Vis\u00e3o geral do fluxo em tempo real&quot;,&quot;link&quot;:&quot;eb-table-content-28&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.2 Estruturas globais de estado&quot;,&quot;text&quot;:&quot;4.2 Estruturas globais de estado&quot;,&quot;link&quot;:&quot;42-estruturas-globais-de-estado&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.3 Constru\u00e7\u00e3o do vetor de features em tempo real&quot;,&quot;text&quot;:&quot;4.3 Constru\u00e7\u00e3o do vetor de features em tempo real&quot;,&quot;link&quot;:&quot;eb-table-content-30&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.4 Avalia\u00e7\u00e3o estat\u00edstica e decis\u00e3o&quot;,&quot;text&quot;:&quot;4.4 Avalia\u00e7\u00e3o estat\u00edstica e decis\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-31&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.5 Atualiza\u00e7\u00e3o do modelo (aprendizado online controlado)&quot;,&quot;text&quot;:&quot;4.5 Atualiza\u00e7\u00e3o do modelo (aprendizado online controlado)&quot;,&quot;link&quot;:&quot;eb-table-content-32&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.6 Acionamento do LED (sem l\u00f3gica escondida)&quot;,&quot;text&quot;:&quot;4.6 Acionamento do LED (sem l\u00f3gica escondida)&quot;,&quot;link&quot;:&quot;eb-table-content-33&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.7 Loop principal: simples, limpo e determin\u00edstico&quot;,&quot;text&quot;:&quot;4.7 Loop principal: simples, limpo e determin\u00edstico&quot;,&quot;link&quot;:&quot;eb-table-content-34&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.8 O que temos agora (antes do c\u00f3digo final)&quot;,&quot;text&quot;:&quot;4.8 O que temos agora (antes do c\u00f3digo final)&quot;,&quot;link&quot;:&quot;eb-table-content-35&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;5 \u2014 C\u00f3digo completo e funcional (Goertzel + aprendizado estat\u00edstico) para BitDogLab \/ RP2040&quot;,&quot;text&quot;:&quot;5 \u2014 C\u00f3digo completo e funcional (Goertzel + aprendizado estat\u00edstico) para BitDogLab \/ RP2040&quot;,&quot;link&quot;:&quot;eb-table-content-36&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;6 \u2014 Calibra\u00e7\u00e3o pr\u00e1tica, boas escolhas vs. m\u00e1s escolhas, compara\u00e7\u00e3o entre estrat\u00e9gias, encerramento e SEO&quot;,&quot;text&quot;:&quot;6 \u2014 Calibra\u00e7\u00e3o pr\u00e1tica, boas escolhas vs. m\u00e1s escolhas, compara\u00e7\u00e3o entre estrat\u00e9gias, encerramento e SEO&quot;,&quot;link&quot;:&quot;eb-table-content-37&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.1 Calibra\u00e7\u00e3o pr\u00e1tica do modelo estat\u00edstico (como fazer funcionar em campo)&quot;,&quot;text&quot;:&quot;6.1 Calibra\u00e7\u00e3o pr\u00e1tica do modelo estat\u00edstico (como fazer funcionar em campo)&quot;,&quot;link&quot;:&quot;eb-table-content-38&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.2 Boas escolhas vs. m\u00e1s escolhas (aprendizado estat\u00edstico em MCU)&quot;,&quot;text&quot;:&quot;6.2 Boas escolhas vs. m\u00e1s escolhas (aprendizado estat\u00edstico em MCU)&quot;,&quot;link&quot;:&quot;eb-table-content-39&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.3 Compara\u00e7\u00e3o final entre os tr\u00eas artigos da s\u00e9rie&quot;,&quot;text&quot;:&quot;6.3 Compara\u00e7\u00e3o final entre os tr\u00eas artigos da s\u00e9rie&quot;,&quot;link&quot;:&quot;eb-table-content-40&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.4 Encerramento conceitual&quot;,&quot;text&quot;:&quot;6.4 Encerramento conceitual&quot;,&quot;link&quot;:&quot;64-encerramento-conceitual&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;1. Introdu\u00e7\u00e3o \u2014 Por que combinar Goertzel com aprendizado estat\u00edstico?&quot;,&quot;value&quot;:&quot;1-introdu\u00e7\u00e3o-por-que-combinar-goertzel-com-aprendizado-estat\u00edstico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.1 O papel do Goertzel nesta nova arquitetura&quot;,&quot;value&quot;:&quot;11-o-papel-do-goertzel-nesta-nova-arquitetura&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.2 O que entendemos aqui por \u201caprendizado estat\u00edstico\u201d&quot;,&quot;value&quot;:&quot;12-o-que-entendemos-aqui-por-aprendizado-estat\u00edstico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.3 Por que limiares fixos falham em campo&quot;,&quot;value&quot;:&quot;13-por-que-limiares-fixos-falham-em-campo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.4 Vis\u00e3o geral da nova arquitetura&quot;,&quot;value&quot;:&quot;14-vis\u00e3o-geral-da-nova-arquitetura&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.5 O que voc\u00ea ter\u00e1 ao final deste artigo&quot;,&quot;value&quot;:&quot;15-o-que-voc\u00ea-ter\u00e1-ao-final-deste-artigo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2 \u2014 Do sinal ao vetor de caracter\u00edsticas: extraindo features estat\u00edsticas a partir do Goertzel&quot;,&quot;value&quot;:&quot;2-do-sinal-ao-vetor-de-caracter\u00edsticas-extraindo-features-estat\u00edsticas-a-partir-do-goertzel&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.1 Por que \u201cfeatures\u201d s\u00e3o mais importantes que o algoritmo de decis\u00e3o&quot;,&quot;value&quot;:&quot;21-por-que-features-s\u00e3o-mais-importantes-que-o-algoritmo-de-decis\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.2 O que N\u00c3O usar como feature (e por qu\u00ea)&quot;,&quot;value&quot;:&quot;22-o-que-n\u00e3o-usar-como-feature-e-por-qu\u00ea&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.3 Princ\u00edpio fundamental: normaliza\u00e7\u00e3o e rela\u00e7\u00f5es&quot;,&quot;value&quot;:&quot;23-princ\u00edpio-fundamental-normaliza\u00e7\u00e3o-e-rela\u00e7\u00f5es&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.4 Feature 1 \u2014 Energia normalizada da fundamental&quot;,&quot;value&quot;:&quot;24-feature-1-energia-normalizada-da-fundamental&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.5 Feature 2 \u2014 Rela\u00e7\u00e3o do 2\u00ba harm\u00f4nico&quot;,&quot;value&quot;:&quot;25-feature-2-rela\u00e7\u00e3o-do-2\u00ba-harm\u00f4nico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.6 Feature 3 \u2014 Rela\u00e7\u00e3o do 3\u00ba harm\u00f4nico (opcional, mas valiosa)&quot;,&quot;value&quot;:&quot;26-feature-3-rela\u00e7\u00e3o-do-3\u00ba-harm\u00f4nico-opcional-mas-valiosa&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.7 Feature 4 \u2014 Estabilidade temporal da frequ\u00eancia&quot;,&quot;value&quot;:&quot;27-feature-4-estabilidade-temporal-da-frequ\u00eancia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.8 Montando o vetor de caracter\u00edsticas&quot;,&quot;value&quot;:&quot;28-montando-o-vetor-de-caracter\u00edsticas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.9 Feature engineering \u00e9 engenharia, n\u00e3o tentativa&quot;,&quot;value&quot;:&quot;29-feature-engineering-\u00e9-engenharia-n\u00e3o-tentativa&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3 \u2014 Modelo estat\u00edstico adaptativo: m\u00e9dia, vari\u00e2ncia e decis\u00e3o probabil\u00edstica (online, leve e interpret\u00e1vel)&quot;,&quot;value&quot;:&quot;3-modelo-estat\u00edstico-adaptativo-m\u00e9dia-vari\u00e2ncia-e-decis\u00e3o-probabil\u00edstica-online-leve-e-interpret\u00e1vel&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.1 Princ\u00edpio do modelo: aprender o \u201cnormal\u201d e medir desvio&quot;,&quot;value&quot;:&quot;31-princ\u00edpio-do-modelo-aprender-o-normal-e-medir-desvio&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.2 Modelo estat\u00edstico por feature (independente)&quot;,&quot;value&quot;:&quot;32-modelo-estat\u00edstico-por-feature-independente&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.3 Atualiza\u00e7\u00e3o online da m\u00e9dia (EMA)&quot;,&quot;value&quot;:&quot;33-atualiza\u00e7\u00e3o-online-da-m\u00e9dia-ema&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.4 Atualiza\u00e7\u00e3o online da vari\u00e2ncia (forma est\u00e1vel)&quot;,&quot;value&quot;:&quot;34-atualiza\u00e7\u00e3o-online-da-vari\u00e2ncia-forma-est\u00e1vel&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.5 Inicializa\u00e7\u00e3o segura do modelo&quot;,&quot;value&quot;:&quot;35-inicializa\u00e7\u00e3o-segura-do-modelo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.6 Medida de desvio: Z-score por feature&quot;,&quot;value&quot;:&quot;36-medida-de-desvio-z-score-por-feature&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.7 Dist\u00e2ncia estat\u00edstica simplificada (score global)&quot;,&quot;value&quot;:&quot;37-dist\u00e2ncia-estat\u00edstica-simplificada-score-global&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.8 Regra de decis\u00e3o probabil\u00edstica simples&quot;,&quot;value&quot;:&quot;38-regra-de-decis\u00e3o-probabil\u00edstica-simples&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.9 Aprendizado controlado (n\u00e3o aprender ru\u00eddo)&quot;,&quot;value&quot;:&quot;39-aprendizado-controlado-n\u00e3o-aprender-ru\u00eddo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.10 O que conquistamos at\u00e9 aqui&quot;,&quot;value&quot;:&quot;310-o-que-conquistamos-at\u00e9-aqui&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4 \u2014 Integra\u00e7\u00e3o completa em tempo real: Goertzel + features + modelo estat\u00edstico + LED no RP2040&quot;,&quot;value&quot;:&quot;4-integra\u00e7\u00e3o-completa-em-tempo-real-goertzel-features-modelo-estat\u00edstico-led-no-rp2040&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.1 Vis\u00e3o geral do fluxo em tempo real&quot;,&quot;value&quot;:&quot;41-vis\u00e3o-geral-do-fluxo-em-tempo-real&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.2 Estruturas globais de estado&quot;,&quot;value&quot;:&quot;42-estruturas-globais-de-estado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.3 Constru\u00e7\u00e3o do vetor de features em tempo real&quot;,&quot;value&quot;:&quot;43-constru\u00e7\u00e3o-do-vetor-de-features-em-tempo-real&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.4 Avalia\u00e7\u00e3o estat\u00edstica e decis\u00e3o&quot;,&quot;value&quot;:&quot;44-avalia\u00e7\u00e3o-estat\u00edstica-e-decis\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.5 Atualiza\u00e7\u00e3o do modelo (aprendizado online controlado)&quot;,&quot;value&quot;:&quot;45-atualiza\u00e7\u00e3o-do-modelo-aprendizado-online-controlado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.6 Acionamento do LED (sem l\u00f3gica escondida)&quot;,&quot;value&quot;:&quot;46-acionamento-do-led-sem-l\u00f3gica-escondida&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.7 Loop principal: simples, limpo e determin\u00edstico&quot;,&quot;value&quot;:&quot;47-loop-principal-simples-limpo-e-determin\u00edstico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.8 O que temos agora (antes do c\u00f3digo final)&quot;,&quot;value&quot;:&quot;48-o-que-temos-agora-antes-do-c\u00f3digo-final&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5 \u2014 C\u00f3digo completo e funcional (Goertzel + aprendizado estat\u00edstico) para BitDogLab \/ RP2040&quot;,&quot;value&quot;:&quot;5-c\u00f3digo-completo-e-funcional-goertzel-aprendizado-estat\u00edstico-para-bitdoglab-rp2040&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6 \u2014 Calibra\u00e7\u00e3o pr\u00e1tica, boas escolhas vs. m\u00e1s escolhas, compara\u00e7\u00e3o entre estrat\u00e9gias, encerramento e SEO&quot;,&quot;value&quot;:&quot;6-calibra\u00e7\u00e3o-pr\u00e1tica-boas-escolhas-vs-m\u00e1s-escolhas-compara\u00e7\u00e3o-entre-estrat\u00e9gias-encerramento-e-seo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.1 Calibra\u00e7\u00e3o pr\u00e1tica do modelo estat\u00edstico (como fazer funcionar em campo)&quot;,&quot;value&quot;:&quot;61-calibra\u00e7\u00e3o-pr\u00e1tica-do-modelo-estat\u00edstico-como-fazer-funcionar-em-campo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.2 Boas escolhas vs. m\u00e1s escolhas (aprendizado estat\u00edstico em MCU)&quot;,&quot;value&quot;:&quot;62-boas-escolhas-vs-m\u00e1s-escolhas-aprendizado-estat\u00edstico-em-mcu&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.3 Compara\u00e7\u00e3o final entre os tr\u00eas artigos da s\u00e9rie&quot;,&quot;value&quot;:&quot;63-compara\u00e7\u00e3o-final-entre-os-tr\u00eas-artigos-da-s\u00e9rie&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.4 Encerramento conceitual&quot;,&quot;value&quot;:&quot;64-encerramento-conceitual&quot;,&quot;isDelete&quot;:false}]" data-smooth="true" data-top-offset=""><div class="eb-toc__list-wrap"><ul class="eb-toc__list"><li><a href="#eb-table-content-0">1. Introdução — Por que combinar Goertzel com aprendizado estatístico?</a><li><a href="#11-o-papel-do-goertzel-nesta-nova-arquitetura">1.1 O papel do Goertzel nesta nova arquitetura</a><li><a href="#eb-table-content-2">1.2 O que entendemos aqui por “aprendizado estatístico”</a><li><a href="#13-por-que-limiares-fixos-falham-em-campo">1.3 Por que limiares fixos falham em campo</a><li><a href="#eb-table-content-4">1.4 Visão geral da nova arquitetura</a><li><a href="#eb-table-content-5">1.5 O que você terá ao final deste artigo</a><li><a href="#eb-table-content-6">2 — Do sinal ao vetor de características: extraindo features estatísticas a partir do Goertzel</a><ul class="eb-toc__list"><li><a href="#eb-table-content-7">2.1 Por que “features” são mais importantes que o algoritmo de decisão</a><li><a href="#eb-table-content-8">2.2 O que NÃO usar como feature (e por quê)</a><li><a href="#eb-table-content-9">2.3 Princípio fundamental: normalização e relações</a><li><a href="#24-feature-1-energia-normalizada-da-fundamental">2.4 Feature 1 — Energia normalizada da fundamental</a><li><a href="#eb-table-content-11">2.5 Feature 2 — Relação do 2º harmônico</a><li><a href="#eb-table-content-12">2.6 Feature 3 — Relação do 3º harmônico (opcional, mas valiosa)</a><li><a href="#eb-table-content-13">2.7 Feature 4 — Estabilidade temporal da frequência</a><li><a href="#eb-table-content-14">2.8 Montando o vetor de características</a><li><a href="#eb-table-content-15">2.9 Feature engineering é engenharia, não tentativa</a></li></ul><li><a href="#eb-table-content-16">3 — Modelo estatístico adaptativo: média, variância e decisão probabilística (online, leve e interpretável)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-17">3.1 Princípio do modelo: aprender o “normal” e medir desvio</a><li><a href="#eb-table-content-18">3.2 Modelo estatístico por feature (independente)</a><li><a href="#eb-table-content-19">3.3 Atualização online da média (EMA)</a><li><a href="#eb-table-content-20">3.4 Atualização online da variância (forma estável)</a><li><a href="#eb-table-content-21">3.5 Inicialização segura do modelo</a><li><a href="#36-medida-de-desvio-z-score-por-feature">3.6 Medida de desvio: Z-score por feature</a><li><a href="#eb-table-content-23">3.7 Distância estatística simplificada (score global)</a><li><a href="#eb-table-content-24">3.8 Regra de decisão probabilística simples</a><li><a href="#eb-table-content-25">3.9 Aprendizado controlado (não aprender ruído)</a><li><a href="#eb-table-content-26">3.10 O que conquistamos até aqui</a></li></ul><li><a href="#eb-table-content-27">4 — Integração completa em tempo real: Goertzel + features + modelo estatístico + LED no RP2040</a><ul class="eb-toc__list"><li><a href="#eb-table-content-28">4.1 Visão geral do fluxo em tempo real</a><li><a href="#42-estruturas-globais-de-estado">4.2 Estruturas globais de estado</a><li><a href="#eb-table-content-30">4.3 Construção do vetor de features em tempo real</a><li><a href="#eb-table-content-31">4.4 Avaliação estatística e decisão</a><li><a href="#eb-table-content-32">4.5 Atualização do modelo (aprendizado online controlado)</a><li><a href="#eb-table-content-33">4.6 Acionamento do LED (sem lógica escondida)</a><li><a href="#eb-table-content-34">4.7 Loop principal: simples, limpo e determinístico</a><li><a href="#eb-table-content-35">4.8 O que temos agora (antes do código final)</a></li></ul><li><a href="#eb-table-content-36">5 — Código completo e funcional (Goertzel + aprendizado estatístico) para BitDogLab / RP2040</a><li><a href="#eb-table-content-37">6 — Calibração prática, boas escolhas vs. más escolhas, comparação entre estratégias, encerramento e SEO</a><ul class="eb-toc__list"><li><a href="#eb-table-content-38">6.1 Calibração prática do modelo estatístico (como fazer funcionar em campo)</a><li><a href="#eb-table-content-39">6.2 Boas escolhas vs. más escolhas (aprendizado estatístico em MCU)</a><li><a href="#eb-table-content-40">6.3 Comparação final entre os três artigos da série</a><li><a href="#64-encerramento-conceitual">6.4 Encerramento conceitual</a></li></ul></ul></div></div></div></div></div>


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1. Introdução — Por que combinar Goertzel com aprendizado estatístico?</h2>



<p class="wp-block-paragraph">Nos dois artigos anteriores desta série, exploramos <strong>duas estratégias clássicas e complementares</strong> de processamento digital de sinais em microcontroladores:</p>



<ol class="wp-block-list">
<li><strong>Séries de Taylor + Cepstrum</strong> → análise estrutural e harmônica do sinal</li>



<li><strong>Algoritmo de Goertzel</strong> → detecção espectral dirigida e altamente eficiente</li>
</ol>



<p class="wp-block-paragraph">Ambas funcionam muito bem, mas compartilham uma característica importante:<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>a decisão final é baseada em limiares fixos</strong>.</p>



<p class="wp-block-paragraph">Neste terceiro artigo, damos um passo conceitual além, mantendo o Goertzel como <strong>extrator de características espectrais</strong>, mas substituindo o decisor rígido por um <strong>modelo de aprendizado estatístico leve</strong>, adequado a MCUs como o RP2040.</p>



<p class="wp-block-paragraph">O objetivo não é “colocar inteligência artificial por marketing”, mas sim responder a um problema real:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Como tornar a detecção mais robusta quando o ambiente muda, o usuário muda ou o ruído não é previsível?</em></p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1.1 O papel do Goertzel nesta nova arquitetura</h2>



<p class="wp-block-paragraph">É importante deixar claro desde o início:</p>



<ul class="wp-block-list">
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Goertzel <strong>não será substituído</strong></li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Não vamos rodar FFT gigante</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Não vamos usar redes neurais profundas</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Goertzel continua sendo o <strong>sensor espectral</strong></li>
</ul>



<p class="wp-block-paragraph">Nesta arquitetura, o Goertzel atua como um <strong>extrator determinístico de características (features)</strong>:</p>



<ul class="wp-block-list">
<li>Energia na frequência fundamental</li>



<li>Relação entre harmônicos</li>



<li>Estabilidade espectral ao longo do tempo</li>
</ul>



<p class="wp-block-paragraph">Esses valores passam a ser <strong>dados de entrada</strong> para um bloco estatístico que decide se o padrão observado <strong>se parece ou não com um assobio humano real</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1.2 O que entendemos aqui por “aprendizado estatístico”</h2>



<p class="wp-block-paragraph">Neste artigo, <strong>aprendizado estatístico não significa deep learning</strong>.</p>



<p class="wp-block-paragraph">Vamos trabalhar com modelos:</p>



<ul class="wp-block-list">
<li>Interpretáveis</li>



<li>Leves</li>



<li>Computacionalmente previsíveis</li>



<li>Treináveis com poucos dados</li>
</ul>



<p class="wp-block-paragraph">Exemplos que abordaremos ao longo do artigo:</p>



<ul class="wp-block-list">
<li>Média e variância adaptativas</li>



<li>Distância estatística (z-score, Mahalanobis simplificada)</li>



<li>Classificador linear simples</li>



<li>Modelo incremental (online learning)</li>
</ul>



<p class="wp-block-paragraph">Tudo isso é:</p>



<ul class="wp-block-list">
<li>Executável em ponto flutuante simples</li>



<li>Compatível com firmware bare-metal</li>



<li>Determinístico em tempo real</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1.3 Por que limiares fixos falham em campo</h2>



<p class="wp-block-paragraph">Nos artigos anteriores, usamos decisões do tipo:</p>



<ul class="wp-block-list">
<li><code>score &gt; S_ON</code></li>



<li><code>score &lt; S_OFF</code></li>
</ul>



<p class="wp-block-paragraph">Isso funciona bem quando:</p>



<ul class="wp-block-list">
<li>O ambiente é estável</li>



<li>O microfone é sempre o mesmo</li>



<li>O usuário assobia sempre da mesma forma</li>
</ul>



<p class="wp-block-paragraph">Mas em campo real:</p>



<ul class="wp-block-list">
<li>Pessoas assobiam diferente</li>



<li>Distância ao microfone muda</li>



<li>Ruído de fundo varia</li>



<li>Ganho analógico muda com temperatura e alimentação</li>
</ul>



<p class="wp-block-paragraph">Resultado:<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>limiar bom hoje, ruim amanhã</strong>.</p>



<p class="wp-block-paragraph">O aprendizado estatístico resolve exatamente isso:</p>



<ul class="wp-block-list">
<li>Ele <strong>aprende o padrão típico</strong></li>



<li>Ele <strong>tolera variações naturais</strong></li>



<li>Ele <strong>se adapta lentamente ao ambiente</strong></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1.4 Visão geral da nova arquitetura</h2>



<p class="wp-block-paragraph">A nova cadeia de processamento será:</p>



<pre class="wp-block-code"><code>ADC
 └── DC-block
     └── Frame (256 amostras)
         └── Goertzel (fundamental + harmônicos)
             └── Vetor de características
                 └── Modelo estatístico adaptativo
                     └── Decisão (assobio / não assobio)
                         └── LED / evento
</code></pre>



<p class="wp-block-paragraph">Comparando com o artigo anterior:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Artigo</th><th>Decisão</th></tr></thead><tbody><tr><td>Taylor + Cepstrum</td><td>Limiar estrutural</td></tr><tr><td>Goertzel clássico</td><td>Score com limiar</td></tr><tr><td><strong>Goertzel + Estatística</strong></td><td><strong>Classificação adaptativa</strong></td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1.5 O que você terá ao final deste artigo</h2>



<p class="wp-block-paragraph">Ao final deste terceiro artigo da série, você terá:</p>



<ul class="wp-block-list">
<li>Um <strong>detector de assobio adaptativo</strong></li>



<li>Baseado em <strong>Goertzel + estatística</strong></li>



<li>Código <strong>100% em C</strong></li>



<li>Executando em <strong>tempo real no RP2040</strong></li>



<li>Sem dependência de bibliotecas externas</li>



<li>Com arquitetura reutilizável para:
<ul class="wp-block-list">
<li>Detecção de padrões acústicos</li>



<li>Sensores inteligentes</li>



<li>Interfaces por som</li>



<li>Pré-processamento para tinyML</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">Mais importante:<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> você entenderá <strong>como transformar DSP em dados</strong> e <strong>dados em decisão</strong>, de forma técnica.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/algoritimos/dsp/deteccao-de-assobio-com-goertzel-e-aprendizado-estatistico-no-rp2040/">Detecção de Assobio com Goertzel e Aprendizado Estatístico no RP2040</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1127</post-id>	</item>
		<item>
		<title>Detecção de Assobio Humano com o Algoritmo de Goertzel no RP2040</title>
		<link>https://mcu.tec.br/algoritimos/dsp/deteccao-de-assobio-humano-com-o-algoritmo-de-goertzel-no-rp2040/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=deteccao-de-assobio-humano-com-o-algoritmo-de-goertzel-no-rp2040</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Thu, 29 Jan 2026 22:37:21 +0000</pubDate>
				<category><![CDATA[DSP]]></category>
		<category><![CDATA[algoritmo goertzel]]></category>
		<category><![CDATA[análise espectral]]></category>
		<category><![CDATA[áudio embarcado]]></category>
		<category><![CDATA[BitDogLab]]></category>
		<category><![CDATA[detecção de assobio]]></category>
		<category><![CDATA[DSP embarcado]]></category>
		<category><![CDATA[firmware em c]]></category>
		<category><![CDATA[microcontroladores]]></category>
		<category><![CDATA[processamento digital de sinais]]></category>
		<category><![CDATA[RP2040]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1125</guid>

					<description><![CDATA[<p>Este artigo apresenta uma implementação completa e didática do algoritmo de Goertzel para detecção de assobio humano em microcontroladores RP2040, dando continuidade à série de processamento digital de sinais iniciada com filtros baseados em Séries de Taylor e cepstrum. O conteúdo explora os fundamentos matemáticos do Goertzel, sua interpretação como um filtro ressonante discreto e sua aplicação prática em tempo real usando ADC, temporização estável, remoção de offset DC e análise espectral pontual. O projeto é implementado integralmente em linguagem C, sem bibliotecas externas de DSP, e demonstra como detectar a frequência fundamental e harmônicos de um assobio, gerar um score robusto e acionar um LED de forma confiável. Ideal para engenheiros e estudantes que desejam aprofundar conhecimentos em DSP embarcado, otimização de firmware e detecção acústica em sistemas de recursos limitados.</p>
<p>The post <a href="https://mcu.tec.br/algoritimos/dsp/deteccao-de-assobio-humano-com-o-algoritmo-de-goertzel-no-rp2040/">Detecção de Assobio Humano com o Algoritmo de Goertzel no RP2040</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<h3 class="wp-block-heading">Continuação da série: <a href="https://mcu.tec.br/?p=1115" title="">Filtragem Digital, Cepstrum e Detecção Acústica em MCU</a></h3>


<div class="root-eb-toc-84t2n wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-84t2n "><div class="eb-toc-container eb-toc-84t2n  eb-toc-is-not-sticky eb-toc-not-collapsible eb-toc-initially-not-collapsed eb-toc-scrollToTop style-1 list-style-none" data-scroll-top="false" data-scroll-top-icon="fas fa-angle-up" data-collapsible="false" data-sticky-hide-mobile="false" data-sticky="false" data-scroll-target="scroll_to_toc" data-copy-link="false" data-editor-type="" data-hide-desktop="false" data-hide-tab="false" data-hide-mobile="false" data-itemcollapsed="false" data-highlight-scroll="false"><div class="eb-toc-header"><h2 class="eb-toc-title">Table of Contents</h2></div><div class="eb-toc-wrapper " data-headers="[{&quot;level&quot;:3,&quot;content&quot;:&quot;Continua\u00e7\u00e3o da s\u00e9rie: Filtragem Digital, Cepstrum e Detec\u00e7\u00e3o Ac\u00fastica em MCU&quot;,&quot;text&quot;:&quot;Continua\u00e7\u00e3o da s\u00e9rie: Filtragem Digital, Cepstrum e Detec\u00e7\u00e3o Ac\u00fastica em MCU&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1. Introdu\u00e7\u00e3o \u2014 Por que Goertzel?&quot;,&quot;text&quot;:&quot;1. Introdu\u00e7\u00e3o \u2014 Por que Goertzel?&quot;,&quot;link&quot;:&quot;eb-table-content-1&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.1 Estrat\u00e9gia geral adotada neste artigo&quot;,&quot;text&quot;:&quot;1.1 Estrat\u00e9gia geral adotada neste artigo&quot;,&quot;link&quot;:&quot;eb-table-content-2&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.2 Quando Goertzel \u00e9 a escolha correta (e quando n\u00e3o \u00e9)&quot;,&quot;text&quot;:&quot;1.2 Quando Goertzel \u00e9 a escolha correta (e quando n\u00e3o \u00e9)&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.3 Rela\u00e7\u00e3o direta com o artigo anterior&quot;,&quot;text&quot;:&quot;1.3 Rela\u00e7\u00e3o direta com o artigo anterior&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.4 O que voc\u00ea ter\u00e1 ao final deste artigo&quot;,&quot;text&quot;:&quot;1.4 O que voc\u00ea ter\u00e1 ao final deste artigo&quot;,&quot;link&quot;:&quot;eb-table-content-5&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;2 \u2014 Fundamentos matem\u00e1ticos do algoritmo de Goertzel (do zero, passo a passo)&quot;,&quot;text&quot;:&quot;2 \u2014 Fundamentos matem\u00e1ticos do algoritmo de Goertzel (do zero, passo a passo)&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.1 Onde o Goertzel se encaixa no DSP cl\u00e1ssico&quot;,&quot;text&quot;:&quot;2.1 Onde o Goertzel se encaixa no DSP cl\u00e1ssico&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.2 A DFT vista como um \u00fanico bin&quot;,&quot;text&quot;:&quot;2.2 A DFT vista como um \u00fanico bin&quot;,&quot;link&quot;:&quot;eb-table-content-8&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.3 A ideia-chave: um oscilador ressonante discreto&quot;,&quot;text&quot;:&quot;2.3 A ideia-chave: um oscilador ressonante discreto&quot;,&quot;link&quot;:&quot;23-a-ideia-chave-um-oscilador-ressonante-discreto&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.4 Extraindo a energia da frequ\u00eancia&quot;,&quot;text&quot;:&quot;2.4 Extraindo a energia da frequ\u00eancia&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.5 Rela\u00e7\u00e3o com filtros IIR de segunda ordem&quot;,&quot;text&quot;:&quot;2.5 Rela\u00e7\u00e3o com filtros IIR de segunda ordem&quot;,&quot;link&quot;:&quot;eb-table-content-11&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.6 Escolha de (N) e resolu\u00e7\u00e3o em frequ\u00eancia&quot;,&quot;text&quot;:&quot;2.6 Escolha de (N) e resolu\u00e7\u00e3o em frequ\u00eancia&quot;,&quot;link&quot;:&quot;eb-table-content-12&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.7 Como mapeamos frequ\u00eancia real \u2192 \u00edndice (k)&quot;,&quot;text&quot;:&quot;2.7 Como mapeamos frequ\u00eancia real \u2192 \u00edndice (k)&quot;,&quot;link&quot;:&quot;eb-table-content-13&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.8 O que vamos detectar no assobio&quot;,&quot;text&quot;:&quot;2.8 O que vamos detectar no assobio&quot;,&quot;link&quot;:&quot;28-o-que-vamos-detectar-no-assobio&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;3 \u2014 Implementa\u00e7\u00e3o b\u00e1sica do algoritmo de Goertzel em C (isolado, incremental e test\u00e1vel)&quot;,&quot;text&quot;:&quot;3 \u2014 Implementa\u00e7\u00e3o b\u00e1sica do algoritmo de Goertzel em C (isolado, incremental e test\u00e1vel)&quot;,&quot;link&quot;:&quot;eb-table-content-15&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.1 Estrutura de estado do Goertzel&quot;,&quot;text&quot;:&quot;3.1 Estrutura de estado do Goertzel&quot;,&quot;link&quot;:&quot;31-estrutura-de-estado-do-goertzel&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.2 Inicializa\u00e7\u00e3o do detector Goertzel&quot;,&quot;text&quot;:&quot;3.2 Inicializa\u00e7\u00e3o do detector Goertzel&quot;,&quot;link&quot;:&quot;eb-table-content-17&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.3 Passo recursivo do Goertzel (n\u00facleo do algoritmo)&quot;,&quot;text&quot;:&quot;3.3 Passo recursivo do Goertzel (n\u00facleo do algoritmo)&quot;,&quot;link&quot;:&quot;eb-table-content-18&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.4 C\u00e1lculo da energia da frequ\u00eancia&quot;,&quot;text&quot;:&quot;3.4 C\u00e1lculo da energia da frequ\u00eancia&quot;,&quot;link&quot;:&quot;eb-table-content-19&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.5 Reset do estado (para novo frame)&quot;,&quot;text&quot;:&quot;3.5 Reset do estado (para novo frame)&quot;,&quot;link&quot;:&quot;35-reset-do-estado-para-novo-frame&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.6 Teste isolado com sinal sint\u00e9tico (valida\u00e7\u00e3o conceitual)&quot;,&quot;text&quot;:&quot;3.6 Teste isolado com sinal sint\u00e9tico (valida\u00e7\u00e3o conceitual)&quot;,&quot;link&quot;:&quot;eb-table-content-21&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.7 O que aprendemos at\u00e9 aqui&quot;,&quot;text&quot;:&quot;3.7 O que aprendemos at\u00e9 aqui&quot;,&quot;link&quot;:&quot;eb-table-content-22&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;4 \u2014 Goertzel em tempo real no RP2040: ADC + frames + m\u00faltiplas frequ\u00eancias (fundamental e harm\u00f4nicos)&quot;,&quot;text&quot;:&quot;4 \u2014 Goertzel em tempo real no RP2040: ADC + frames + m\u00faltiplas frequ\u00eancias (fundamental e harm\u00f4nicos)&quot;,&quot;link&quot;:&quot;eb-table-content-23&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.1 Definindo o frame e a taxa de amostragem&quot;,&quot;text&quot;:&quot;4.1 Definindo o frame e a taxa de amostragem&quot;,&quot;link&quot;:&quot;41-definindo-o-frame-e-a-taxa-de-amostragem&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.2 Estrat\u00e9gia \u201cGoertzel multibanda\u201d&quot;,&quot;text&quot;:&quot;4.2 Estrat\u00e9gia \u201cGoertzel multibanda\u201d&quot;,&quot;link&quot;:&quot;eb-table-content-25&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.3 Aquisi\u00e7\u00e3o em tempo real (ADC + timer), igual ao artigo anterior&quot;,&quot;text&quot;:&quot;4.3 Aquisi\u00e7\u00e3o em tempo real (ADC + timer), igual ao artigo anterior&quot;,&quot;link&quot;:&quot;eb-table-content-26&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;4.3.1 Buffer de frame (o mesmo padr\u00e3o)&quot;,&quot;text&quot;:&quot;4.3.1 Buffer de frame (o mesmo padr\u00e3o)&quot;,&quot;link&quot;:&quot;eb-table-content-27&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;4.3.2 Leitura ADC normalizada&quot;,&quot;text&quot;:&quot;4.3.2 Leitura ADC normalizada&quot;,&quot;link&quot;:&quot;432-leitura-adc-normalizada&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.4 Pr\u00e9-processamento m\u00ednimo: remo\u00e7\u00e3o de DC por m\u00e9dia m\u00f3vel (mais robusto)&quot;,&quot;text&quot;:&quot;4.4 Pr\u00e9-processamento m\u00ednimo: remo\u00e7\u00e3o de DC por m\u00e9dia m\u00f3vel (mais robusto)&quot;,&quot;link&quot;:&quot;eb-table-content-29&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.5 Varredura com Goertzel (faixa 800\u20133000 Hz)&quot;,&quot;text&quot;:&quot;4.5 Varredura com Goertzel (faixa 800\u20133000 Hz)&quot;,&quot;link&quot;:&quot;45-varredura-com-goertzel-faixa-8003000-hz&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;4.5.1 Fun\u00e7\u00e3o: pot\u00eancia Goertzel para uma frequ\u00eancia f0 em um frame&quot;,&quot;text&quot;:&quot;4.5.1 Fun\u00e7\u00e3o: pot\u00eancia Goertzel para uma frequ\u00eancia f0 em um frame&quot;,&quot;link&quot;:&quot;eb-table-content-31&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.6 Encontrando o candidato de fundamental (pico na faixa)&quot;,&quot;text&quot;:&quot;4.6 Encontrando o candidato de fundamental (pico na faixa)&quot;,&quot;link&quot;:&quot;46-encontrando-o-candidato-de-fundamental-pico-na-faixa&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.7 Confirma\u00e7\u00e3o por harm\u00f4nicos (2f0 e 3f0)&quot;,&quot;text&quot;:&quot;4.7 Confirma\u00e7\u00e3o por harm\u00f4nicos (2f0 e 3f0)&quot;,&quot;link&quot;:&quot;eb-table-content-33&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.8 Integra\u00e7\u00e3o: montar o \u201cprocessador de frame\u201d (ainda sem LED)&quot;,&quot;text&quot;:&quot;4.8 Integra\u00e7\u00e3o: montar o \u201cprocessador de frame\u201d (ainda sem LED)&quot;,&quot;link&quot;:&quot;eb-table-content-34&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;5 \u2014 Decisor completo + LED + otimiza\u00e7\u00f5es (coeficientes pr\u00e9-computados, EMA, histerese) e integra\u00e7\u00e3o no RP2040&quot;,&quot;text&quot;:&quot;5 \u2014 Decisor completo + LED + otimiza\u00e7\u00f5es (coeficientes pr\u00e9-computados, EMA, histerese) e integra\u00e7\u00e3o no RP2040&quot;,&quot;link&quot;:&quot;eb-table-content-35&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.1 Otimiza\u00e7\u00e3o essencial: pr\u00e9-computar os detectores da varredura&quot;,&quot;text&quot;:&quot;5.1 Otimiza\u00e7\u00e3o essencial: pr\u00e9-computar os detectores da varredura&quot;,&quot;link&quot;:&quot;eb-table-content-36&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.1.1 Estrutura do \u201cdetector preparado\u201d&quot;,&quot;text&quot;:&quot;5.1.1 Estrutura do \u201cdetector preparado\u201d&quot;,&quot;link&quot;:&quot;511-estrutura-do-detector-preparado&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.1.2 Construindo a lista de bins (800\u20133000 Hz, passo 2 bins)&quot;,&quot;text&quot;:&quot;5.1.2 Construindo a lista de bins (800\u20133000 Hz, passo 2 bins)&quot;,&quot;link&quot;:&quot;512-construindo-a-lista-de-bins-8003000-hz-passo-2-bins&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.2 Goertzel \u201cr\u00e1pido\u201d usando coeff pr\u00e9-calculado&quot;,&quot;text&quot;:&quot;5.2 Goertzel \u201cr\u00e1pido\u201d usando coeff pr\u00e9-calculado&quot;,&quot;link&quot;:&quot;eb-table-content-39&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.3 Encontrar o melhor candidato f0 (varredura)&quot;,&quot;text&quot;:&quot;5.3 Encontrar o melhor candidato f0 (varredura)&quot;,&quot;link&quot;:&quot;53-encontrar-o-melhor-candidato-f0-varredura&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.4 Harm\u00f4nicos com c\u00e1lculo \u201con demand\u201d&quot;,&quot;text&quot;:&quot;5.4 Harm\u00f4nicos com c\u00e1lculo \u201con demand\u201d&quot;,&quot;link&quot;:&quot;eb-table-content-41&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.5 Crit\u00e9rio espectral composto (score)&quot;,&quot;text&quot;:&quot;5.5 Crit\u00e9rio espectral composto (score)&quot;,&quot;link&quot;:&quot;eb-table-content-42&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.6 Decis\u00e3o robusta com EMA + histerese&quot;,&quot;text&quot;:&quot;5.6 Decis\u00e3o robusta com EMA + histerese&quot;,&quot;link&quot;:&quot;eb-table-content-43&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.7 Integra\u00e7\u00e3o de tempo real (ADC + DC-block + frame)&quot;,&quot;text&quot;:&quot;5.7 Integra\u00e7\u00e3o de tempo real (ADC + DC-block + frame)&quot;,&quot;link&quot;:&quot;eb-table-content-44&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.7.1 DC-block&quot;,&quot;text&quot;:&quot;5.7.1 DC-block&quot;,&quot;link&quot;:&quot;571-dc-block&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.7.2 Estado global e callback de amostragem&quot;,&quot;text&quot;:&quot;5.7.2 Estado global e callback de amostragem&quot;,&quot;link&quot;:&quot;572-estado-global-e-callback-de-amostragem&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.7.3 Loop processa frame e atualiza LED&quot;,&quot;text&quot;:&quot;5.7.3 Loop processa frame e atualiza LED&quot;,&quot;link&quot;:&quot;573-loop-processa-frame-e-atualiza-led&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;5 \u2014 Decisor completo + LED + otimiza\u00e7\u00f5es (coeficientes pr\u00e9-computados, EMA, histerese) e integra\u00e7\u00e3o no RP2040&quot;,&quot;text&quot;:&quot;5 \u2014 Decisor completo + LED + otimiza\u00e7\u00f5es (coeficientes pr\u00e9-computados, EMA, histerese) e integra\u00e7\u00e3o no RP2040&quot;,&quot;link&quot;:&quot;eb-table-content-48&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.1 Otimiza\u00e7\u00e3o essencial: pr\u00e9-computar os detectores da varredura&quot;,&quot;text&quot;:&quot;5.1 Otimiza\u00e7\u00e3o essencial: pr\u00e9-computar os detectores da varredura&quot;,&quot;link&quot;:&quot;eb-table-content-49&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.1.1 Estrutura do \u201cdetector preparado\u201d&quot;,&quot;text&quot;:&quot;5.1.1 Estrutura do \u201cdetector preparado\u201d&quot;,&quot;link&quot;:&quot;511-estrutura-do-detector-preparado&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.1.2 Construindo a lista de bins (800\u20133000 Hz, passo 2 bins)&quot;,&quot;text&quot;:&quot;5.1.2 Construindo a lista de bins (800\u20133000 Hz, passo 2 bins)&quot;,&quot;link&quot;:&quot;512-construindo-a-lista-de-bins-8003000-hz-passo-2-bins&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.2 Goertzel \u201cr\u00e1pido\u201d usando coeff pr\u00e9-calculado&quot;,&quot;text&quot;:&quot;5.2 Goertzel \u201cr\u00e1pido\u201d usando coeff pr\u00e9-calculado&quot;,&quot;link&quot;:&quot;eb-table-content-52&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.3 Encontrar o melhor candidato f0 (varredura)&quot;,&quot;text&quot;:&quot;5.3 Encontrar o melhor candidato f0 (varredura)&quot;,&quot;link&quot;:&quot;53-encontrar-o-melhor-candidato-f0-varredura&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.4 Harm\u00f4nicos com c\u00e1lculo \u201con demand\u201d&quot;,&quot;text&quot;:&quot;5.4 Harm\u00f4nicos com c\u00e1lculo \u201con demand\u201d&quot;,&quot;link&quot;:&quot;eb-table-content-54&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.5 Crit\u00e9rio espectral composto (score)&quot;,&quot;text&quot;:&quot;5.5 Crit\u00e9rio espectral composto (score)&quot;,&quot;link&quot;:&quot;eb-table-content-55&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.6 Decis\u00e3o robusta com EMA + histerese&quot;,&quot;text&quot;:&quot;5.6 Decis\u00e3o robusta com EMA + histerese&quot;,&quot;link&quot;:&quot;eb-table-content-56&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.7 Integra\u00e7\u00e3o de tempo real (ADC + DC-block + frame)&quot;,&quot;text&quot;:&quot;5.7 Integra\u00e7\u00e3o de tempo real (ADC + DC-block + frame)&quot;,&quot;link&quot;:&quot;eb-table-content-57&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.7.1 DC-block&quot;,&quot;text&quot;:&quot;5.7.1 DC-block&quot;,&quot;link&quot;:&quot;571-dc-block&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.7.2 Estado global e callback de amostragem&quot;,&quot;text&quot;:&quot;5.7.2 Estado global e callback de amostragem&quot;,&quot;link&quot;:&quot;572-estado-global-e-callback-de-amostragem&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.7.3 Loop processa frame e atualiza LED&quot;,&quot;text&quot;:&quot;5.7.3 Loop processa frame e atualiza LED&quot;,&quot;link&quot;:&quot;573-loop-processa-frame-e-atualiza-led&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;6 \u2014 C\u00f3digo completo e funcional (BitDogLab \/ RP2040) com Goertzel: detec\u00e7\u00e3o de assobio + LED&quot;,&quot;text&quot;:&quot;6 \u2014 C\u00f3digo completo e funcional (BitDogLab \/ RP2040) com Goertzel: detec\u00e7\u00e3o de assobio + LED&quot;,&quot;link&quot;:&quot;eb-table-content-61&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;7 \u2014 Calibra\u00e7\u00e3o pr\u00e1tica, compara\u00e7\u00e3o com o artigo anterior, encerramento e SEO&quot;,&quot;text&quot;:&quot;7 \u2014 Calibra\u00e7\u00e3o pr\u00e1tica, compara\u00e7\u00e3o com o artigo anterior, encerramento e SEO&quot;,&quot;link&quot;:&quot;eb-table-content-62&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.1 Calibra\u00e7\u00e3o pr\u00e1tica (engenharia de campo, n\u00e3o de laborat\u00f3rio)&quot;,&quot;text&quot;:&quot;7.1 Calibra\u00e7\u00e3o pr\u00e1tica (engenharia de campo, n\u00e3o de laborat\u00f3rio)&quot;,&quot;link&quot;:&quot;eb-table-content-63&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.2 Boas escolhas vs. m\u00e1s escolhas (espec\u00edfico do Goertzel)&quot;,&quot;text&quot;:&quot;7.2 Boas escolhas vs. m\u00e1s escolhas (espec\u00edfico do Goertzel)&quot;,&quot;link&quot;:&quot;eb-table-content-64&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.3 Compara\u00e7\u00e3o direta com o artigo anterior (Taylor + Cepstrum)&quot;,&quot;text&quot;:&quot;7.3 Compara\u00e7\u00e3o direta com o artigo anterior (Taylor + Cepstrum)&quot;,&quot;link&quot;:&quot;eb-table-content-65&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.4 Encerramento&quot;,&quot;text&quot;:&quot;7.4 Encerramento&quot;,&quot;link&quot;:&quot;74-encerramento&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Continua\u00e7\u00e3o da s\u00e9rie: Filtragem Digital, Cepstrum e Detec\u00e7\u00e3o Ac\u00fastica em MCU&quot;,&quot;value&quot;:&quot;continua\u00e7\u00e3o-da-s\u00e9rie-filtragem-digital-cepstrum-e-detec\u00e7\u00e3o-ac\u00fastica-em-mcu&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1. Introdu\u00e7\u00e3o \u2014 Por que Goertzel?&quot;,&quot;value&quot;:&quot;1-introdu\u00e7\u00e3o-por-que-goertzel&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.1 Estrat\u00e9gia geral adotada neste artigo&quot;,&quot;value&quot;:&quot;11-estrat\u00e9gia-geral-adotada-neste-artigo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.2 Quando Goertzel \u00e9 a escolha correta (e quando n\u00e3o \u00e9)&quot;,&quot;value&quot;:&quot;12-quando-goertzel-\u00e9-a-escolha-correta-e-quando-n\u00e3o-\u00e9&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.3 Rela\u00e7\u00e3o direta com o artigo anterior&quot;,&quot;value&quot;:&quot;13-rela\u00e7\u00e3o-direta-com-o-artigo-anterior&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.4 O que voc\u00ea ter\u00e1 ao final deste artigo&quot;,&quot;value&quot;:&quot;14-o-que-voc\u00ea-ter\u00e1-ao-final-deste-artigo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2 \u2014 Fundamentos matem\u00e1ticos do algoritmo de Goertzel (do zero, passo a passo)&quot;,&quot;value&quot;:&quot;2-fundamentos-matem\u00e1ticos-do-algoritmo-de-goertzel-do-zero-passo-a-passo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.1 Onde o Goertzel se encaixa no DSP cl\u00e1ssico&quot;,&quot;value&quot;:&quot;21-onde-o-goertzel-se-encaixa-no-dsp-cl\u00e1ssico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.2 A DFT vista como um \u00fanico bin&quot;,&quot;value&quot;:&quot;22-a-dft-vista-como-um-\u00fanico-bin&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.3 A ideia-chave: um oscilador ressonante discreto&quot;,&quot;value&quot;:&quot;23-a-ideia-chave-um-oscilador-ressonante-discreto&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.4 Extraindo a energia da frequ\u00eancia&quot;,&quot;value&quot;:&quot;24-extraindo-a-energia-da-frequ\u00eancia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.5 Rela\u00e7\u00e3o com filtros IIR de segunda ordem&quot;,&quot;value&quot;:&quot;25-rela\u00e7\u00e3o-com-filtros-iir-de-segunda-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.6 Escolha de (N) e resolu\u00e7\u00e3o em frequ\u00eancia&quot;,&quot;value&quot;:&quot;26-escolha-de-n-e-resolu\u00e7\u00e3o-em-frequ\u00eancia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.7 Como mapeamos frequ\u00eancia real \u2192 \u00edndice (k)&quot;,&quot;value&quot;:&quot;27-como-mapeamos-frequ\u00eancia-real-\u2192-\u00edndice-k&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.8 O que vamos detectar no assobio&quot;,&quot;value&quot;:&quot;28-o-que-vamos-detectar-no-assobio&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3 \u2014 Implementa\u00e7\u00e3o b\u00e1sica do algoritmo de Goertzel em C (isolado, incremental e test\u00e1vel)&quot;,&quot;value&quot;:&quot;3-implementa\u00e7\u00e3o-b\u00e1sica-do-algoritmo-de-goertzel-em-c-isolado-incremental-e-test\u00e1vel&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.1 Estrutura de estado do Goertzel&quot;,&quot;value&quot;:&quot;31-estrutura-de-estado-do-goertzel&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.2 Inicializa\u00e7\u00e3o do detector Goertzel&quot;,&quot;value&quot;:&quot;32-inicializa\u00e7\u00e3o-do-detector-goertzel&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.3 Passo recursivo do Goertzel (n\u00facleo do algoritmo)&quot;,&quot;value&quot;:&quot;33-passo-recursivo-do-goertzel-n\u00facleo-do-algoritmo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.4 C\u00e1lculo da energia da frequ\u00eancia&quot;,&quot;value&quot;:&quot;34-c\u00e1lculo-da-energia-da-frequ\u00eancia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.5 Reset do estado (para novo frame)&quot;,&quot;value&quot;:&quot;35-reset-do-estado-para-novo-frame&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.6 Teste isolado com sinal sint\u00e9tico (valida\u00e7\u00e3o conceitual)&quot;,&quot;value&quot;:&quot;36-teste-isolado-com-sinal-sint\u00e9tico-valida\u00e7\u00e3o-conceitual&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.7 O que aprendemos at\u00e9 aqui&quot;,&quot;value&quot;:&quot;37-o-que-aprendemos-at\u00e9-aqui&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4 \u2014 Goertzel em tempo real no RP2040: ADC + frames + m\u00faltiplas frequ\u00eancias (fundamental e harm\u00f4nicos)&quot;,&quot;value&quot;:&quot;4-goertzel-em-tempo-real-no-rp2040-adc-frames-m\u00faltiplas-frequ\u00eancias-fundamental-e-harm\u00f4nicos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.1 Definindo o frame e a taxa de amostragem&quot;,&quot;value&quot;:&quot;41-definindo-o-frame-e-a-taxa-de-amostragem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.2 Estrat\u00e9gia \u201cGoertzel multibanda\u201d&quot;,&quot;value&quot;:&quot;42-estrat\u00e9gia-goertzel-multibanda&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.3 Aquisi\u00e7\u00e3o em tempo real (ADC + timer), igual ao artigo anterior&quot;,&quot;value&quot;:&quot;43-aquisi\u00e7\u00e3o-em-tempo-real-adc-timer-igual-ao-artigo-anterior&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.3.1 Buffer de frame (o mesmo padr\u00e3o)&quot;,&quot;value&quot;:&quot;431-buffer-de-frame-o-mesmo-padr\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.3.2 Leitura ADC normalizada&quot;,&quot;value&quot;:&quot;432-leitura-adc-normalizada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.4 Pr\u00e9-processamento m\u00ednimo: remo\u00e7\u00e3o de DC por m\u00e9dia m\u00f3vel (mais robusto)&quot;,&quot;value&quot;:&quot;44-pr\u00e9-processamento-m\u00ednimo-remo\u00e7\u00e3o-de-dc-por-m\u00e9dia-m\u00f3vel-mais-robusto&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.5 Varredura com Goertzel (faixa 800\u20133000 Hz)&quot;,&quot;value&quot;:&quot;45-varredura-com-goertzel-faixa-8003000-hz&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.5.1 Fun\u00e7\u00e3o: pot\u00eancia Goertzel para uma frequ\u00eancia f0 em um frame&quot;,&quot;value&quot;:&quot;451-fun\u00e7\u00e3o-pot\u00eancia-goertzel-para-uma-frequ\u00eancia-f0-em-um-frame&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.6 Encontrando o candidato de fundamental (pico na faixa)&quot;,&quot;value&quot;:&quot;46-encontrando-o-candidato-de-fundamental-pico-na-faixa&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.7 Confirma\u00e7\u00e3o por harm\u00f4nicos (2f0 e 3f0)&quot;,&quot;value&quot;:&quot;47-confirma\u00e7\u00e3o-por-harm\u00f4nicos-2f0-e-3f0&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.8 Integra\u00e7\u00e3o: montar o \u201cprocessador de frame\u201d (ainda sem LED)&quot;,&quot;value&quot;:&quot;48-integra\u00e7\u00e3o-montar-o-processador-de-frame-ainda-sem-led&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5 \u2014 Decisor completo + LED + otimiza\u00e7\u00f5es (coeficientes pr\u00e9-computados, EMA, histerese) e integra\u00e7\u00e3o no RP2040&quot;,&quot;value&quot;:&quot;5-decisor-completo-led-otimiza\u00e7\u00f5es-coeficientes-pr\u00e9-computados-ema-histerese-e-integra\u00e7\u00e3o-no-rp2040&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.1 Otimiza\u00e7\u00e3o essencial: pr\u00e9-computar os detectores da varredura&quot;,&quot;value&quot;:&quot;51-otimiza\u00e7\u00e3o-essencial-pr\u00e9-computar-os-detectores-da-varredura&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.1.1 Estrutura do \u201cdetector preparado\u201d&quot;,&quot;value&quot;:&quot;511-estrutura-do-detector-preparado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.1.2 Construindo a lista de bins (800\u20133000 Hz, passo 2 bins)&quot;,&quot;value&quot;:&quot;512-construindo-a-lista-de-bins-8003000-hz-passo-2-bins&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.2 Goertzel \u201cr\u00e1pido\u201d usando coeff pr\u00e9-calculado&quot;,&quot;value&quot;:&quot;52-goertzel-r\u00e1pido-usando-coeff-pr\u00e9-calculado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.3 Encontrar o melhor candidato f0 (varredura)&quot;,&quot;value&quot;:&quot;53-encontrar-o-melhor-candidato-f0-varredura&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.4 Harm\u00f4nicos com c\u00e1lculo \u201con demand\u201d&quot;,&quot;value&quot;:&quot;54-harm\u00f4nicos-com-c\u00e1lculo-on-demand&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.5 Crit\u00e9rio espectral composto (score)&quot;,&quot;value&quot;:&quot;55-crit\u00e9rio-espectral-composto-score&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.6 Decis\u00e3o robusta com EMA + histerese&quot;,&quot;value&quot;:&quot;56-decis\u00e3o-robusta-com-ema-histerese&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.7 Integra\u00e7\u00e3o de tempo real (ADC + DC-block + frame)&quot;,&quot;value&quot;:&quot;57-integra\u00e7\u00e3o-de-tempo-real-adc-dc-block-frame&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.7.1 DC-block&quot;,&quot;value&quot;:&quot;571-dc-block&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.7.2 Estado global e callback de amostragem&quot;,&quot;value&quot;:&quot;572-estado-global-e-callback-de-amostragem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.7.3 Loop processa frame e atualiza LED&quot;,&quot;value&quot;:&quot;573-loop-processa-frame-e-atualiza-led&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5 \u2014 Decisor completo + LED + otimiza\u00e7\u00f5es (coeficientes pr\u00e9-computados, EMA, histerese) e integra\u00e7\u00e3o no RP2040&quot;,&quot;value&quot;:&quot;5-decisor-completo-led-otimiza\u00e7\u00f5es-coeficientes-pr\u00e9-computados-ema-histerese-e-integra\u00e7\u00e3o-no-rp2040&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.1 Otimiza\u00e7\u00e3o essencial: pr\u00e9-computar os detectores da varredura&quot;,&quot;value&quot;:&quot;51-otimiza\u00e7\u00e3o-essencial-pr\u00e9-computar-os-detectores-da-varredura&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.1.1 Estrutura do \u201cdetector preparado\u201d&quot;,&quot;value&quot;:&quot;511-estrutura-do-detector-preparado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.1.2 Construindo a lista de bins (800\u20133000 Hz, passo 2 bins)&quot;,&quot;value&quot;:&quot;512-construindo-a-lista-de-bins-8003000-hz-passo-2-bins&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.2 Goertzel \u201cr\u00e1pido\u201d usando coeff pr\u00e9-calculado&quot;,&quot;value&quot;:&quot;52-goertzel-r\u00e1pido-usando-coeff-pr\u00e9-calculado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.3 Encontrar o melhor candidato f0 (varredura)&quot;,&quot;value&quot;:&quot;53-encontrar-o-melhor-candidato-f0-varredura&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.4 Harm\u00f4nicos com c\u00e1lculo \u201con demand\u201d&quot;,&quot;value&quot;:&quot;54-harm\u00f4nicos-com-c\u00e1lculo-on-demand&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.5 Crit\u00e9rio espectral composto (score)&quot;,&quot;value&quot;:&quot;55-crit\u00e9rio-espectral-composto-score&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.6 Decis\u00e3o robusta com EMA + histerese&quot;,&quot;value&quot;:&quot;56-decis\u00e3o-robusta-com-ema-histerese&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.7 Integra\u00e7\u00e3o de tempo real (ADC + DC-block + frame)&quot;,&quot;value&quot;:&quot;57-integra\u00e7\u00e3o-de-tempo-real-adc-dc-block-frame&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.7.1 DC-block&quot;,&quot;value&quot;:&quot;571-dc-block&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.7.2 Estado global e callback de amostragem&quot;,&quot;value&quot;:&quot;572-estado-global-e-callback-de-amostragem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.7.3 Loop processa frame e atualiza LED&quot;,&quot;value&quot;:&quot;573-loop-processa-frame-e-atualiza-led&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6 \u2014 C\u00f3digo completo e funcional (BitDogLab \/ RP2040) com Goertzel: detec\u00e7\u00e3o de assobio + LED&quot;,&quot;value&quot;:&quot;6-c\u00f3digo-completo-e-funcional-bitdoglab-rp2040-com-goertzel-detec\u00e7\u00e3o-de-assobio-led&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7 \u2014 Calibra\u00e7\u00e3o pr\u00e1tica, compara\u00e7\u00e3o com o artigo anterior, encerramento e SEO&quot;,&quot;value&quot;:&quot;7-calibra\u00e7\u00e3o-pr\u00e1tica-compara\u00e7\u00e3o-com-o-artigo-anterior-encerramento-e-seo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.1 Calibra\u00e7\u00e3o pr\u00e1tica (engenharia de campo, n\u00e3o de laborat\u00f3rio)&quot;,&quot;value&quot;:&quot;71-calibra\u00e7\u00e3o-pr\u00e1tica-engenharia-de-campo-n\u00e3o-de-laborat\u00f3rio&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.2 Boas escolhas vs. m\u00e1s escolhas (espec\u00edfico do Goertzel)&quot;,&quot;value&quot;:&quot;72-boas-escolhas-vs-m\u00e1s-escolhas-espec\u00edfico-do-goertzel&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.3 Compara\u00e7\u00e3o direta com o artigo anterior (Taylor + Cepstrum)&quot;,&quot;value&quot;:&quot;73-compara\u00e7\u00e3o-direta-com-o-artigo-anterior-taylor-cepstrum&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.4 Encerramento&quot;,&quot;value&quot;:&quot;74-encerramento&quot;,&quot;isDelete&quot;:false}]" data-smooth="true" data-top-offset=""><div class="eb-toc__list-wrap"><ul class="eb-toc__list"><li><a href="#eb-table-content-0">Continuação da série: Filtragem Digital, Cepstrum e Detecção Acústica em MCU</a><li><a href="#eb-table-content-1">1. Introdução — Por que Goertzel?</a><li><a href="#eb-table-content-2">1.1 Estratégia geral adotada neste artigo</a><li><a href="#eb-table-content-3">1.2 Quando Goertzel é a escolha correta (e quando não é)</a><li><a href="#eb-table-content-4">1.3 Relação direta com o artigo anterior</a><li><a href="#eb-table-content-5">1.4 O que você terá ao final deste artigo</a><li><a href="#eb-table-content-6">2 — Fundamentos matemáticos do algoritmo de Goertzel (do zero, passo a passo)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-7">2.1 Onde o Goertzel se encaixa no DSP clássico</a><li><a href="#eb-table-content-8">2.2 A DFT vista como um único bin</a><li><a href="#23-a-ideia-chave-um-oscilador-ressonante-discreto">2.3 A ideia-chave: um oscilador ressonante discreto</a><li><a href="#eb-table-content-10">2.4 Extraindo a energia da frequência</a><li><a href="#eb-table-content-11">2.5 Relação com filtros IIR de segunda ordem</a><li><a href="#eb-table-content-12">2.6 Escolha de (N) e resolução em frequência</a><li><a href="#eb-table-content-13">2.7 Como mapeamos frequência real → índice (k)</a><li><a href="#28-o-que-vamos-detectar-no-assobio">2.8 O que vamos detectar no assobio</a></li></ul><li><a href="#eb-table-content-15">3 — Implementação básica do algoritmo de Goertzel em C (isolado, incremental e testável)</a><ul class="eb-toc__list"><li><a href="#31-estrutura-de-estado-do-goertzel">3.1 Estrutura de estado do Goertzel</a><li><a href="#eb-table-content-17">3.2 Inicialização do detector Goertzel</a><li><a href="#eb-table-content-18">3.3 Passo recursivo do Goertzel (núcleo do algoritmo)</a><li><a href="#eb-table-content-19">3.4 Cálculo da energia da frequência</a><li><a href="#35-reset-do-estado-para-novo-frame">3.5 Reset do estado (para novo frame)</a><li><a href="#eb-table-content-21">3.6 Teste isolado com sinal sintético (validação conceitual)</a><li><a href="#eb-table-content-22">3.7 O que aprendemos até aqui</a></li></ul><li><a href="#eb-table-content-23">4 — Goertzel em tempo real no RP2040: ADC + frames + múltiplas frequências (fundamental e harmônicos)</a><ul class="eb-toc__list"><li><a href="#41-definindo-o-frame-e-a-taxa-de-amostragem">4.1 Definindo o frame e a taxa de amostragem</a><li><a href="#eb-table-content-25">4.2 Estratégia “Goertzel multibanda”</a><li><a href="#eb-table-content-26">4.3 Aquisição em tempo real (ADC + timer), igual ao artigo anterior</a><ul class="eb-toc__list"><li><a href="#eb-table-content-27">4.3.1 Buffer de frame (o mesmo padrão)</a><li><a href="#432-leitura-adc-normalizada">4.3.2 Leitura ADC normalizada</a></li></ul><li><a href="#eb-table-content-29">4.4 Pré-processamento mínimo: remoção de DC por média móvel (mais robusto)</a><li><a href="#45-varredura-com-goertzel-faixa-8003000-hz">4.5 Varredura com Goertzel (faixa 800–3000 Hz)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-31">4.5.1 Função: potência Goertzel para uma frequência f0 em um frame</a></li></ul><li><a href="#46-encontrando-o-candidato-de-fundamental-pico-na-faixa">4.6 Encontrando o candidato de fundamental (pico na faixa)</a><li><a href="#eb-table-content-33">4.7 Confirmação por harmônicos (2f0 e 3f0)</a><li><a href="#eb-table-content-34">4.8 Integração: montar o “processador de frame” (ainda sem LED)</a></li></ul><li><a href="#eb-table-content-35">5 — Decisor completo + LED + otimizações (coeficientes pré-computados, EMA, histerese) e integração no RP2040</a><ul class="eb-toc__list"><li><a href="#eb-table-content-36">5.1 Otimização essencial: pré-computar os detectores da varredura</a><ul class="eb-toc__list"><li><a href="#511-estrutura-do-detector-preparado">5.1.1 Estrutura do “detector preparado”</a><li><a href="#512-construindo-a-lista-de-bins-8003000-hz-passo-2-bins">5.1.2 Construindo a lista de bins (800–3000 Hz, passo 2 bins)</a></li></ul><li><a href="#eb-table-content-39">5.2 Goertzel “rápido” usando coeff pré-calculado</a><li><a href="#53-encontrar-o-melhor-candidato-f0-varredura">5.3 Encontrar o melhor candidato f0 (varredura)</a><li><a href="#eb-table-content-41">5.4 Harmônicos com cálculo “on demand”</a><li><a href="#eb-table-content-42">5.5 Critério espectral composto (score)</a><li><a href="#eb-table-content-43">5.6 Decisão robusta com EMA + histerese</a><li><a href="#eb-table-content-44">5.7 Integração de tempo real (ADC + DC-block + frame)</a><ul class="eb-toc__list"><li><a href="#571-dc-block">5.7.1 DC-block</a><li><a href="#572-estado-global-e-callback-de-amostragem">5.7.2 Estado global e callback de amostragem</a><li><a href="#573-loop-processa-frame-e-atualiza-led">5.7.3 Loop processa frame e atualiza LED</a></li></ul></li></ul><li><a href="#eb-table-content-48">5 — Decisor completo + LED + otimizações (coeficientes pré-computados, EMA, histerese) e integração no RP2040</a><ul class="eb-toc__list"><li><a href="#eb-table-content-49">5.1 Otimização essencial: pré-computar os detectores da varredura</a><ul class="eb-toc__list"><li><a href="#511-estrutura-do-detector-preparado">5.1.1 Estrutura do “detector preparado”</a><li><a href="#512-construindo-a-lista-de-bins-8003000-hz-passo-2-bins">5.1.2 Construindo a lista de bins (800–3000 Hz, passo 2 bins)</a></li></ul><li><a href="#eb-table-content-52">5.2 Goertzel “rápido” usando coeff pré-calculado</a><li><a href="#53-encontrar-o-melhor-candidato-f0-varredura">5.3 Encontrar o melhor candidato f0 (varredura)</a><li><a href="#eb-table-content-54">5.4 Harmônicos com cálculo “on demand”</a><li><a href="#eb-table-content-55">5.5 Critério espectral composto (score)</a><li><a href="#eb-table-content-56">5.6 Decisão robusta com EMA + histerese</a><li><a href="#eb-table-content-57">5.7 Integração de tempo real (ADC + DC-block + frame)</a><ul class="eb-toc__list"><li><a href="#571-dc-block">5.7.1 DC-block</a><li><a href="#572-estado-global-e-callback-de-amostragem">5.7.2 Estado global e callback de amostragem</a><li><a href="#573-loop-processa-frame-e-atualiza-led">5.7.3 Loop processa frame e atualiza LED</a></li></ul></li></ul><li><a href="#eb-table-content-61">6 — Código completo e funcional (BitDogLab / RP2040) com Goertzel: detecção de assobio + LED</a><li><a href="#eb-table-content-62">7 — Calibração prática, comparação com o artigo anterior, encerramento e SEO</a><ul class="eb-toc__list"><li><a href="#eb-table-content-63">7.1 Calibração prática (engenharia de campo, não de laboratório)</a><li><a href="#eb-table-content-64">7.2 Boas escolhas vs. más escolhas (específico do Goertzel)</a><li><a href="#eb-table-content-65">7.3 Comparação direta com o artigo anterior (Taylor + Cepstrum)</a><li><a href="#74-encerramento">7.4 Encerramento</a></li></ul></ul></div></div></div></div></div>


<h3 class="wp-block-heading">1. Introdução — Por que Goertzel?</h3>



<p class="wp-block-paragraph">No artigo anterior desta série, exploramos uma abordagem baseada em <strong>filtragem digital construída com Séries de Taylor</strong>, seguida pelo <strong>cálculo do cepstrum</strong>, para identificar a periodicidade característica de um assobio humano. Aquela estratégia privilegiou uma análise <strong>global do espectro</strong>, permitindo identificar a estrutura harmônica do sinal de forma robusta, mesmo em ambientes com ruído.</p>



<p class="wp-block-paragraph">Neste novo artigo, damos continuidade direta a essa série, adotando <strong>uma estratégia complementar e mais enxuta</strong>: o <strong>algoritmo de Goertzel</strong>. Em vez de calcular todo o espectro via FFT, o Goertzel permite <strong>extrair seletivamente a energia de frequências específicas</strong>, tornando-o ideal para microcontroladores com recursos limitados — como o RP2040 — quando o interesse está restrito a <strong>faixas bem definidas</strong>.</p>



<p class="wp-block-paragraph">O assobio humano típico apresenta uma frequência fundamental relativamente estável, geralmente entre <strong>800 Hz e 3000 Hz</strong>, com harmônicos previsíveis. O algoritmo de Goertzel explora exatamente esse cenário:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>“Eu sei qual frequência quero detectar — e só ela importa.”</em></p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">1.1 Estratégia geral adotada neste artigo</h3>



<p class="wp-block-paragraph">A arquitetura de processamento deste artigo será:</p>



<ol class="wp-block-list">
<li><strong>Aquisição do sinal acústico</strong> (ADC do RP2040)</li>



<li><strong>Pré-processamento simples</strong> (remoção de DC e normalização)</li>



<li><strong>Aplicação do algoritmo de Goertzel</strong> para:
<ul class="wp-block-list">
<li>Frequência fundamental</li>



<li>Harmônicos selecionados</li>
</ul>
</li>



<li><strong>Construção de um critério de decisão espectral</strong></li>



<li><strong>Confirmação temporal</strong> (evitar falsos positivos)</li>



<li><strong>Acionamento de um LED</strong> quando o assobio é detectado</li>
</ol>



<p class="wp-block-paragraph">Diferentemente do artigo anterior:</p>



<ul class="wp-block-list">
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Não calcularemos FFT</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Não calcularemos cepstrum</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Usaremos <strong>análise espectral pontual</strong></li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Menor uso de RAM e CPU</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Menor latência</li>
</ul>



<p class="wp-block-paragraph">Isso permite uma comparação clara entre duas filosofias de DSP embarcado:</p>



<ul class="wp-block-list">
<li><strong>FFT + Cepstrum → análise estrutural</strong></li>



<li><strong>Goertzel → análise dirigida por frequência</strong></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">1.2 Quando Goertzel é a escolha correta (e quando não é)</h3>



<p class="wp-block-paragraph"><strong>Goertzel é uma excelente escolha quando:</strong></p>



<ul class="wp-block-list">
<li>Você conhece as frequências de interesse</li>



<li>O número de frequências é pequeno</li>



<li>O MCU possui RAM limitada</li>



<li>A latência precisa ser baixa</li>



<li>O sistema é reativo (event-driven)</li>
</ul>



<p class="wp-block-paragraph"><strong>Goertzel NÃO é a melhor escolha quando:</strong></p>



<ul class="wp-block-list">
<li>A frequência fundamental varia muito</li>



<li>Você precisa analisar o espectro completo</li>



<li>O sinal tem múltiplas fontes concorrentes</li>



<li>A estrutura harmônica é desconhecida</li>
</ul>



<p class="wp-block-paragraph">Este artigo assume explicitamente o <strong>caso ideal para Goertzel</strong>:<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>detectar um fenômeno acústico específico e conhecido</em>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">1.3 Relação direta com o artigo anterior</h3>



<p class="wp-block-paragraph">Este artigo <strong>não substitui</strong> o anterior — ele o <strong>complementa</strong>.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Artigo anterior</th><th>Este artigo</th></tr></thead><tbody><tr><td>Séries de Taylor</td><td>Goertzel</td></tr><tr><td>FFT + Cepstrum</td><td>Análise pontual</td></tr><tr><td>Estrutura harmônica global</td><td>Frequência-alvo</td></tr><tr><td>Mais matemática</td><td>Mais eficiência</td></tr><tr><td>Mais flexível</td><td>Mais determinístico</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">A ideia da série é exatamente essa: <strong>mostrar estratégias diferentes para o mesmo problema</strong>, permitindo ao engenheiro escolher conscientemente.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">1.4 O que você terá ao final deste artigo</h3>



<p class="wp-block-paragraph">Ao final deste artigo, você terá:</p>



<ul class="wp-block-list">
<li>Um <strong>detector de assobio funcional</strong></li>



<li>Código <strong>100% em C</strong>, portátil</li>



<li>Execução em <strong>tempo real no RP2040</strong></li>



<li>Arquitetura reutilizável para:
<ul class="wp-block-list">
<li>DTMF</li>



<li>Tons de controle</li>



<li>Alarmes acústicos</li>



<li>Interfaces sonoras simples</li>
</ul>
</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/algoritimos/dsp/deteccao-de-assobio-humano-com-o-algoritmo-de-goertzel-no-rp2040/">Detecção de Assobio Humano com o Algoritmo de Goertzel no RP2040</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1125</post-id>	</item>
	</channel>
</rss>
