<?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>algoritmo goertzel - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/algoritmo-goertzel/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>algoritmo goertzel - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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>
