<?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>DSP embarcado - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/dsp-embarcado/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Wed, 07 Jan 2026 00:46:47 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</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>DSP embarcado - 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>
		<item>
		<title>Filtro Digital com Séries de Taylor e Cepstrum para Detecção de Assobio em RP2040</title>
		<link>https://mcu.tec.br/algoritimos/dsp/filtro-digital-com-series-de-taylor-e-cepstrum-para-deteccao-de-assobio-em-rp2040/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=filtro-digital-com-series-de-taylor-e-cepstrum-para-deteccao-de-assobio-em-rp2040</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Thu, 15 Jan 2026 20:54:29 +0000</pubDate>
				<category><![CDATA[DSP]]></category>
		<category><![CDATA[análise espectral]]></category>
		<category><![CDATA[BitDogLab]]></category>
		<category><![CDATA[cepstrum]]></category>
		<category><![CDATA[detecção de assobio]]></category>
		<category><![CDATA[DSP embarcado]]></category>
		<category><![CDATA[engenharia de firmware]]></category>
		<category><![CDATA[fft em microcontroladores]]></category>
		<category><![CDATA[filtro digital]]></category>
		<category><![CDATA[processamento digital de sinais]]></category>
		<category><![CDATA[RP2040]]></category>
		<category><![CDATA[séries de taylor]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1115</guid>

					<description><![CDATA[<p>Aprenda a projetar um filtro digital para separar a frequência fundamental e as harmônicas de um assobio humano utilizando Séries de Taylor em microcontroladores. Este artigo técnico e didático apresenta, passo a passo, a construção de um pipeline completo de processamento digital de sinais no RP2040, incluindo filtragem passa-faixa baseada em operadores diferenciais, cálculo do cepstrum para identificação de periodicidade, uso de janelas, gate por energia e técnicas de suavização temporal. O projeto é implementado integralmente em C, sem bibliotecas externas de DSP, e executa em tempo real na BitDogLab, acionando um LED quando um assobio é corretamente identificado. Ideal para quem deseja aprofundar conhecimentos em DSP embarcado, arquitetura de firmware e matemática aplicada a sistemas embarcados.</p>
<p>The post <a href="https://mcu.tec.br/algoritimos/dsp/filtro-digital-com-series-de-taylor-e-cepstrum-para-deteccao-de-assobio-em-rp2040/">Filtro Digital com Séries de Taylor e Cepstrum para Detecção de Assobio em RP2040</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-ph0zu wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-ph0zu "><div class="eb-toc-container eb-toc-ph0zu  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 \u2014 Motiva\u00e7\u00e3o, Vis\u00e3o Geral do Problema e Arquitetura da Solu\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;1 \u2014 Motiva\u00e7\u00e3o, Vis\u00e3o Geral do Problema e Arquitetura da Solu\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.1 Motiva\u00e7\u00e3o t\u00e9cnica&quot;,&quot;text&quot;:&quot;1.1 Motiva\u00e7\u00e3o t\u00e9cnica&quot;,&quot;link&quot;:&quot;eb-table-content-1&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.2 Problema a ser resolvido&quot;,&quot;text&quot;:&quot;1.2 Problema a ser resolvido&quot;,&quot;link&quot;:&quot;12-problema-a-ser-resolvido&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.3 Arquitetura geral do sistema&quot;,&quot;text&quot;:&quot;1.3 Arquitetura geral do sistema&quot;,&quot;link&quot;:&quot;13-arquitetura-geral-do-sistema&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.4 Por que S\u00e9ries de Taylor em filtros digitais?&quot;,&quot;text&quot;:&quot;1.4 Por que S\u00e9ries de Taylor em filtros digitais?&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.5 O papel do Cepstrum na detec\u00e7\u00e3o do assobio&quot;,&quot;text&quot;:&quot;1.5 O papel do Cepstrum na detec\u00e7\u00e3o do assobio&quot;,&quot;link&quot;:&quot;eb-table-content-5&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;2 \u2014 Caracter\u00edsticas do Assobio Humano e Modelagem do Sinal&quot;,&quot;text&quot;:&quot;2 \u2014 Caracter\u00edsticas do Assobio Humano e Modelagem do Sinal&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.1 O assobio como sinal f\u00edsico&quot;,&quot;text&quot;:&quot;2.1 O assobio como sinal f\u00edsico&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.2 Faixa t\u00edpica de frequ\u00eancias do assobio humano&quot;,&quot;text&quot;:&quot;2.2 Faixa t\u00edpica de frequ\u00eancias do assobio humano&quot;,&quot;link&quot;:&quot;eb-table-content-8&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.3 Sinal amostrado no ADC do RP2040&quot;,&quot;text&quot;:&quot;2.3 Sinal amostrado no ADC do RP2040&quot;,&quot;link&quot;:&quot;23-sinal-amostrado-no-adc-do-rp2040&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.4 Por que separar fundamental e harm\u00f4nicas?&quot;,&quot;text&quot;:&quot;2.4 Por que separar fundamental e harm\u00f4nicas?&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.5 Introdu\u00e7\u00e3o intuitiva \u00e0s S\u00e9ries de Taylor&quot;,&quot;text&quot;:&quot;2.5 Introdu\u00e7\u00e3o intuitiva \u00e0s S\u00e9ries de Taylor&quot;,&quot;link&quot;:&quot;eb-table-content-11&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.6 Ponte conceitual: derivadas \u2192 filtros&quot;,&quot;text&quot;:&quot;2.6 Ponte conceitual: derivadas \u2192 filtros&quot;,&quot;link&quot;:&quot;eb-table-content-12&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;3 \u2014 Constru\u00e7\u00e3o do Filtro Digital usando S\u00e9ries de Taylor (Teoria + Primeira Implementa\u00e7\u00e3o)&quot;,&quot;text&quot;:&quot;3 \u2014 Constru\u00e7\u00e3o do Filtro Digital usando S\u00e9ries de Taylor (Teoria + Primeira Implementa\u00e7\u00e3o)&quot;,&quot;link&quot;:&quot;eb-table-content-13&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.1 Ideia central: Taylor como operador espectral&quot;,&quot;text&quot;:&quot;3.1 Ideia central: Taylor como operador espectral&quot;,&quot;link&quot;:&quot;31-ideia-central-taylor-como-operador-espectral&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.2 Derivadas discretas (diferen\u00e7as finitas)&quot;,&quot;text&quot;:&quot;3.2 Derivadas discretas (diferen\u00e7as finitas)&quot;,&quot;link&quot;:&quot;eb-table-content-15&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.3 Filtro passa-faixa baseado em Taylor (modelo)&quot;,&quot;text&quot;:&quot;3.3 Filtro passa-faixa baseado em Taylor (modelo)&quot;,&quot;link&quot;:&quot;33-filtro-passa-faixa-baseado-em-taylor-modelo&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.4 Estrutura do c\u00f3digo (incremental)&quot;,&quot;text&quot;:&quot;3.4 Estrutura do c\u00f3digo (incremental)&quot;,&quot;link&quot;:&quot;eb-table-content-17&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;3.4.1 Estrutura de estado do filtro&quot;,&quot;text&quot;:&quot;3.4.1 Estrutura de estado do filtro&quot;,&quot;link&quot;:&quot;341-estrutura-de-estado-do-filtro&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.5 Implementa\u00e7\u00e3o do filtro em C (primeira vers\u00e3o)&quot;,&quot;text&quot;:&quot;3.5 Implementa\u00e7\u00e3o do filtro em C (primeira vers\u00e3o)&quot;,&quot;link&quot;:&quot;eb-table-content-19&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.6 Integra\u00e7\u00e3o inicial com o ADC (BitDogLab)&quot;,&quot;text&quot;:&quot;3.6 Integra\u00e7\u00e3o inicial com o ADC (BitDogLab)&quot;,&quot;link&quot;:&quot;eb-table-content-20&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;3.6.1 Leitura b\u00e1sica do ADC&quot;,&quot;text&quot;:&quot;3.6.1 Leitura b\u00e1sica do ADC&quot;,&quot;link&quot;:&quot;eb-table-content-21&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.7 Primeiro loop funcional (sem cepstrum ainda)&quot;,&quot;text&quot;:&quot;3.7 Primeiro loop funcional (sem cepstrum ainda)&quot;,&quot;link&quot;:&quot;37-primeiro-loop-funcional-sem-cepstrum-ainda&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.8 Valida\u00e7\u00e3o pr\u00e1tica (o que observar)&quot;,&quot;text&quot;:&quot;3.8 Valida\u00e7\u00e3o pr\u00e1tica (o que observar)&quot;,&quot;link&quot;:&quot;eb-table-content-23&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;4 \u2014 Cepstrum para detectar o assobio (conceito + coleta de frames + log via Taylor)&quot;,&quot;text&quot;:&quot;4 \u2014 Cepstrum para detectar o assobio (conceito + coleta de frames + log via Taylor)&quot;,&quot;link&quot;:&quot;4-cepstrum-para-detectar-o-assobio-conceito-coleta-de-frames-log-via-taylor&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.1 O que \u00e9 \u201ccepstrum\u201d e por que ele funciona t\u00e3o bem para assobios&quot;,&quot;text&quot;:&quot;4.1 O que \u00e9 \u201ccepstrum\u201d e por que ele funciona t\u00e3o bem para assobios&quot;,&quot;link&quot;:&quot;eb-table-content-25&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.2 Qual cepstrum vamos implementar no RP2040&quot;,&quot;text&quot;:&quot;4.2 Qual cepstrum vamos implementar no RP2040&quot;,&quot;link&quot;:&quot;42-qual-cepstrum-vamos-implementar-no-rp2040&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.3 Coleta de frame (buffer) do sinal j\u00e1 filtrado&quot;,&quot;text&quot;:&quot;4.3 Coleta de frame (buffer) do sinal j\u00e1 filtrado&quot;,&quot;link&quot;:&quot;eb-table-content-27&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;4.3.1 C\u00f3digo incremental: buffer e coleta&quot;,&quot;text&quot;:&quot;4.3.1 C\u00f3digo incremental: buffer e coleta&quot;,&quot;link&quot;:&quot;eb-table-content-28&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.4 Logaritmo aproximado com S\u00e9rie de Taylor (sem logf())&quot;,&quot;text&quot;:&quot;4.4 Logaritmo aproximado com S\u00e9rie de Taylor (sem logf())&quot;,&quot;link&quot;:&quot;eb-table-content-29&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;4.4.1 Implementa\u00e7\u00e3o (Taylor truncada)&quot;,&quot;text&quot;:&quot;4.4.1 Implementa\u00e7\u00e3o (Taylor truncada)&quot;,&quot;link&quot;:&quot;eb-table-content-30&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.5 Loop j\u00e1 pronto: filtro + coleta de frame&quot;,&quot;text&quot;:&quot;4.5 Loop j\u00e1 pronto: filtro + coleta de frame&quot;,&quot;link&quot;:&quot;eb-table-content-31&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;5 \u2014 FFT + log-magnitude (com Taylor) + IFFT \u21d2 Cepstrum e detec\u00e7\u00e3o do assobio (j\u00e1 aciona LED)&quot;,&quot;text&quot;:&quot;5 \u2014 FFT + log-magnitude (com Taylor) + IFFT \u21d2 Cepstrum e detec\u00e7\u00e3o do assobio (j\u00e1 aciona LED)&quot;,&quot;link&quot;:&quot;eb-table-content-32&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.1 Estruturas complexas e utilit\u00e1rios m\u00ednimos&quot;,&quot;text&quot;:&quot;5.1 Estruturas complexas e utilit\u00e1rios m\u00ednimos&quot;,&quot;link&quot;:&quot;eb-table-content-33&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.2 FFT radix-2 iterativa (in-place) para N=256&quot;,&quot;text&quot;:&quot;5.2 FFT radix-2 iterativa (in-place) para N=256&quot;,&quot;link&quot;:&quot;eb-table-content-34&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.2.1 Por que radix-2 e N=256&quot;,&quot;text&quot;:&quot;5.2.1 Por que radix-2 e N=256&quot;,&quot;link&quot;:&quot;eb-table-content-35&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.2.2 Tabela de twiddles (pr\u00e9-c\u00e1lculo)&quot;,&quot;text&quot;:&quot;5.2.2 Tabela de twiddles (pr\u00e9-c\u00e1lculo)&quot;,&quot;link&quot;:&quot;eb-table-content-36&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.2.3 Bit-reversal (reordena\u00e7\u00e3o)&quot;,&quot;text&quot;:&quot;5.2.3 Bit-reversal (reordena\u00e7\u00e3o)&quot;,&quot;link&quot;:&quot;eb-table-content-37&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.2.4 FFT direta (forward)&quot;,&quot;text&quot;:&quot;5.2.4 FFT direta (forward)&quot;,&quot;link&quot;:&quot;524-fft-direta-forward&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;5.2.5 IFFT (inverse)&quot;,&quot;text&quot;:&quot;5.2.5 IFFT (inverse)&quot;,&quot;link&quot;:&quot;525-ifft-inverse&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.3 Montando o espectro: |X[k]| e log(|X[k]|) usando ln_approx (Taylor)&quot;,&quot;text&quot;:&quot;5.3 Montando o espectro: |X[k]| e log(|X[k]|) usando ln_approx (Taylor)&quot;,&quot;link&quot;:&quot;eb-table-content-40&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.4 Cepstrum: IFFT do log-magnitude e busca do pico de quefr\u00eancia&quot;,&quot;text&quot;:&quot;5.4 Cepstrum: IFFT do log-magnitude e busca do pico de quefr\u00eancia&quot;,&quot;link&quot;:&quot;eb-table-content-41&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.5 Decis\u00e3o e acionamento do LED com histerese&quot;,&quot;text&quot;:&quot;5.5 Decis\u00e3o e acionamento do LED com histerese&quot;,&quot;link&quot;:&quot;eb-table-content-42&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.6 Integra\u00e7\u00e3o com o que j\u00e1 temos: processar frame quando encher&quot;,&quot;text&quot;:&quot;5.6 Integra\u00e7\u00e3o com o que j\u00e1 temos: processar frame quando encher&quot;,&quot;link&quot;:&quot;eb-table-content-43&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.7 O que voc\u00ea j\u00e1 consegue testar agora&quot;,&quot;text&quot;:&quot;5.7 O que voc\u00ea j\u00e1 consegue testar agora&quot;,&quot;link&quot;:&quot;eb-table-content-44&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;6 \u2014 Robustez \u201cde produ\u00e7\u00e3o\u201d: janela (Hann), gate de sil\u00eancio, suaviza\u00e7\u00e3o temporal e integra\u00e7\u00e3o de perif\u00e9ricos no RP2040&quot;,&quot;text&quot;:&quot;6 \u2014 Robustez \u201cde produ\u00e7\u00e3o\u201d: janela (Hann), gate de sil\u00eancio, suaviza\u00e7\u00e3o temporal e integra\u00e7\u00e3o de perif\u00e9ricos no RP2040&quot;,&quot;link&quot;:&quot;eb-table-content-45&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.1 Janela Hann (por que e como)&quot;,&quot;text&quot;:&quot;6.1 Janela Hann (por que e como)&quot;,&quot;link&quot;:&quot;61-janela-hann-por-que-e-como&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;6.1.1 Tabela da janela (pr\u00e9-calculada)&quot;,&quot;text&quot;:&quot;6.1.1 Tabela da janela (pr\u00e9-calculada)&quot;,&quot;link&quot;:&quot;eb-table-content-47&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;6.1.2 Aplicar janela antes da FFT&quot;,&quot;text&quot;:&quot;6.1.2 Aplicar janela antes da FFT&quot;,&quot;link&quot;:&quot;612-aplicar-janela-antes-da-fft&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.2 Gate de sil\u00eancio por energia RMS (para cortar falsos positivos)&quot;,&quot;text&quot;:&quot;6.2 Gate de sil\u00eancio por energia RMS (para cortar falsos positivos)&quot;,&quot;link&quot;:&quot;eb-table-content-49&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;6.2.1 Fun\u00e7\u00e3o de energia do frame&quot;,&quot;text&quot;:&quot;6.2.1 Fun\u00e7\u00e3o de energia do frame&quot;,&quot;link&quot;:&quot;eb-table-content-50&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;6.2.2 Usar o gate antes do cepstrum&quot;,&quot;text&quot;:&quot;6.2.2 Usar o gate antes do cepstrum&quot;,&quot;link&quot;:&quot;622-usar-o-gate-antes-do-cepstrum&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.3 Suaviza\u00e7\u00e3o temporal (EMA) do \u201cpeak\u201d do cepstrum&quot;,&quot;text&quot;:&quot;6.3 Suaviza\u00e7\u00e3o temporal (EMA) do \u201cpeak\u201d do cepstrum&quot;,&quot;link&quot;:&quot;eb-table-content-52&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;6.3.1 Aplicando EMA dentro do detector&quot;,&quot;text&quot;:&quot;6.3.1 Aplicando EMA dentro do detector&quot;,&quot;link&quot;:&quot;631-aplicando-ema-dentro-do-detector&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.4 Amostragem est\u00e1vel no RP2040 (sem \u201csleep torto\u201d)&quot;,&quot;text&quot;:&quot;6.4 Amostragem est\u00e1vel no RP2040 (sem \u201csleep torto\u201d)&quot;,&quot;link&quot;:&quot;eb-table-content-54&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;6.4.1 Callback de amostragem&quot;,&quot;text&quot;:&quot;6.4.1 Callback de amostragem&quot;,&quot;link&quot;:&quot;641-callback-de-amostragem&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.5 Inicializa\u00e7\u00e3o do ADC e do LED (Pico SDK)&quot;,&quot;text&quot;:&quot;6.5 Inicializa\u00e7\u00e3o do ADC e do LED (Pico SDK)&quot;,&quot;link&quot;:&quot;eb-table-content-56&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.6 Inicializa\u00e7\u00e3o \u201cDSP\u201d: twiddles, janela e buffers&quot;,&quot;text&quot;:&quot;6.6 Inicializa\u00e7\u00e3o \u201cDSP\u201d: twiddles, janela e buffers&quot;,&quot;link&quot;:&quot;eb-table-content-57&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.7 Main \u201cquase final\u201d: timer coleta, loop processa frames&quot;,&quot;text&quot;:&quot;6.7 Main \u201cquase final\u201d: timer coleta, loop processa frames&quot;,&quot;link&quot;:&quot;67-main-quase-final-timer-coleta-loop-processa-frames&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;7 \u2014 C\u00f3digo completo e funcional (BitDogLab \/ RP2040) \u2014 filtro Taylor + cepstrum + LED&quot;,&quot;text&quot;:&quot;7 \u2014 C\u00f3digo completo e funcional (BitDogLab \/ RP2040) \u2014 filtro Taylor + cepstrum + LED&quot;,&quot;link&quot;:&quot;eb-table-content-59&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.1 Como compilar (vis\u00e3o pr\u00e1tica)&quot;,&quot;text&quot;:&quot;7.1 Como compilar (vis\u00e3o pr\u00e1tica)&quot;,&quot;link&quot;:&quot;eb-table-content-60&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.2 Ajustes que voc\u00ea provavelmente vai fazer na BitDogLab&quot;,&quot;text&quot;:&quot;7.2 Ajustes que voc\u00ea provavelmente vai fazer na BitDogLab&quot;,&quot;link&quot;:&quot;eb-table-content-61&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;8 \u2014 Calibra\u00e7\u00e3o pr\u00e1tica, boas escolhas vs. m\u00e1s escolhas, encerramento e SEO&quot;,&quot;text&quot;:&quot;8 \u2014 Calibra\u00e7\u00e3o pr\u00e1tica, boas escolhas vs. m\u00e1s escolhas, encerramento e SEO&quot;,&quot;link&quot;:&quot;eb-table-content-62&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;8.1 Guia r\u00e1pido de calibra\u00e7\u00e3o (passo a passo)&quot;,&quot;text&quot;:&quot;8.1 Guia r\u00e1pido de calibra\u00e7\u00e3o (passo a passo)&quot;,&quot;link&quot;:&quot;eb-table-content-63&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;8.2 Boas escolhas vs. m\u00e1s escolhas (engenharia real)&quot;,&quot;text&quot;:&quot;8.2 Boas escolhas vs. m\u00e1s escolhas (engenharia real)&quot;,&quot;link&quot;:&quot;eb-table-content-64&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;8.3 Por que essa arquitetura funciona t\u00e3o bem em MCU&quot;,&quot;text&quot;:&quot;8.3 Por que essa arquitetura funciona t\u00e3o bem em MCU&quot;,&quot;link&quot;:&quot;eb-table-content-65&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;8.4 Encerramento&quot;,&quot;text&quot;:&quot;8.4 Encerramento&quot;,&quot;link&quot;:&quot;84-encerramento&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;1 \u2014 Motiva\u00e7\u00e3o, Vis\u00e3o Geral do Problema e Arquitetura da Solu\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;1-motiva\u00e7\u00e3o-vis\u00e3o-geral-do-problema-e-arquitetura-da-solu\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.1 Motiva\u00e7\u00e3o t\u00e9cnica&quot;,&quot;value&quot;:&quot;11-motiva\u00e7\u00e3o-t\u00e9cnica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.2 Problema a ser resolvido&quot;,&quot;value&quot;:&quot;12-problema-a-ser-resolvido&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.3 Arquitetura geral do sistema&quot;,&quot;value&quot;:&quot;13-arquitetura-geral-do-sistema&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.4 Por que S\u00e9ries de Taylor em filtros digitais?&quot;,&quot;value&quot;:&quot;14-por-que-s\u00e9ries-de-taylor-em-filtros-digitais&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.5 O papel do Cepstrum na detec\u00e7\u00e3o do assobio&quot;,&quot;value&quot;:&quot;15-o-papel-do-cepstrum-na-detec\u00e7\u00e3o-do-assobio&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2 \u2014 Caracter\u00edsticas do Assobio Humano e Modelagem do Sinal&quot;,&quot;value&quot;:&quot;2-caracter\u00edsticas-do-assobio-humano-e-modelagem-do-sinal&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.1 O assobio como sinal f\u00edsico&quot;,&quot;value&quot;:&quot;21-o-assobio-como-sinal-f\u00edsico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.2 Faixa t\u00edpica de frequ\u00eancias do assobio humano&quot;,&quot;value&quot;:&quot;22-faixa-t\u00edpica-de-frequ\u00eancias-do-assobio-humano&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.3 Sinal amostrado no ADC do RP2040&quot;,&quot;value&quot;:&quot;23-sinal-amostrado-no-adc-do-rp2040&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.4 Por que separar fundamental e harm\u00f4nicas?&quot;,&quot;value&quot;:&quot;24-por-que-separar-fundamental-e-harm\u00f4nicas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.5 Introdu\u00e7\u00e3o intuitiva \u00e0s S\u00e9ries de Taylor&quot;,&quot;value&quot;:&quot;25-introdu\u00e7\u00e3o-intuitiva-\u00e0s-s\u00e9ries-de-taylor&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.6 Ponte conceitual: derivadas \u2192 filtros&quot;,&quot;value&quot;:&quot;26-ponte-conceitual-derivadas-\u2192-filtros&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3 \u2014 Constru\u00e7\u00e3o do Filtro Digital usando S\u00e9ries de Taylor (Teoria + Primeira Implementa\u00e7\u00e3o)&quot;,&quot;value&quot;:&quot;3-constru\u00e7\u00e3o-do-filtro-digital-usando-s\u00e9ries-de-taylor-teoria-primeira-implementa\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.1 Ideia central: Taylor como operador espectral&quot;,&quot;value&quot;:&quot;31-ideia-central-taylor-como-operador-espectral&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.2 Derivadas discretas (diferen\u00e7as finitas)&quot;,&quot;value&quot;:&quot;32-derivadas-discretas-diferen\u00e7as-finitas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.3 Filtro passa-faixa baseado em Taylor (modelo)&quot;,&quot;value&quot;:&quot;33-filtro-passa-faixa-baseado-em-taylor-modelo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.4 Estrutura do c\u00f3digo (incremental)&quot;,&quot;value&quot;:&quot;34-estrutura-do-c\u00f3digo-incremental&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.4.1 Estrutura de estado do filtro&quot;,&quot;value&quot;:&quot;341-estrutura-de-estado-do-filtro&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.5 Implementa\u00e7\u00e3o do filtro em C (primeira vers\u00e3o)&quot;,&quot;value&quot;:&quot;35-implementa\u00e7\u00e3o-do-filtro-em-c-primeira-vers\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.6 Integra\u00e7\u00e3o inicial com o ADC (BitDogLab)&quot;,&quot;value&quot;:&quot;36-integra\u00e7\u00e3o-inicial-com-o-adc-bitdoglab&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.6.1 Leitura b\u00e1sica do ADC&quot;,&quot;value&quot;:&quot;361-leitura-b\u00e1sica-do-adc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.7 Primeiro loop funcional (sem cepstrum ainda)&quot;,&quot;value&quot;:&quot;37-primeiro-loop-funcional-sem-cepstrum-ainda&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.8 Valida\u00e7\u00e3o pr\u00e1tica (o que observar)&quot;,&quot;value&quot;:&quot;38-valida\u00e7\u00e3o-pr\u00e1tica-o-que-observar&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4 \u2014 Cepstrum para detectar o assobio (conceito + coleta de frames + log via Taylor)&quot;,&quot;value&quot;:&quot;4-cepstrum-para-detectar-o-assobio-conceito-coleta-de-frames-log-via-taylor&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.1 O que \u00e9 \u201ccepstrum\u201d e por que ele funciona t\u00e3o bem para assobios&quot;,&quot;value&quot;:&quot;41-o-que-\u00e9-cepstrum-e-por-que-ele-funciona-t\u00e3o-bem-para-assobios&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.2 Qual cepstrum vamos implementar no RP2040&quot;,&quot;value&quot;:&quot;42-qual-cepstrum-vamos-implementar-no-rp2040&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.3 Coleta de frame (buffer) do sinal j\u00e1 filtrado&quot;,&quot;value&quot;:&quot;43-coleta-de-frame-buffer-do-sinal-j\u00e1-filtrado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.3.1 C\u00f3digo incremental: buffer e coleta&quot;,&quot;value&quot;:&quot;431-c\u00f3digo-incremental-buffer-e-coleta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.4 Logaritmo aproximado com S\u00e9rie de Taylor (sem logf())&quot;,&quot;value&quot;:&quot;44-logaritmo-aproximado-com-s\u00e9rie-de-taylor-sem-logf&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.4.1 Implementa\u00e7\u00e3o (Taylor truncada)&quot;,&quot;value&quot;:&quot;441-implementa\u00e7\u00e3o-taylor-truncada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.5 Loop j\u00e1 pronto: filtro + coleta de frame&quot;,&quot;value&quot;:&quot;45-loop-j\u00e1-pronto-filtro-coleta-de-frame&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5 \u2014 FFT + log-magnitude (com Taylor) + IFFT \u21d2 Cepstrum e detec\u00e7\u00e3o do assobio (j\u00e1 aciona LED)&quot;,&quot;value&quot;:&quot;5-fft-log-magnitude-com-taylor-ifft-\u21d2-cepstrum-e-detec\u00e7\u00e3o-do-assobio-j\u00e1-aciona-led&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.1 Estruturas complexas e utilit\u00e1rios m\u00ednimos&quot;,&quot;value&quot;:&quot;51-estruturas-complexas-e-utilit\u00e1rios-m\u00ednimos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.2 FFT radix-2 iterativa (in-place) para N=256&quot;,&quot;value&quot;:&quot;52-fft-radix-2-iterativa-in-place-para-n%3D256&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.2.1 Por que radix-2 e N=256&quot;,&quot;value&quot;:&quot;521-por-que-radix-2-e-n%3D256&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.2.2 Tabela de twiddles (pr\u00e9-c\u00e1lculo)&quot;,&quot;value&quot;:&quot;522-tabela-de-twiddles-pr\u00e9-c\u00e1lculo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.2.3 Bit-reversal (reordena\u00e7\u00e3o)&quot;,&quot;value&quot;:&quot;523-bit-reversal-reordena\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.2.4 FFT direta (forward)&quot;,&quot;value&quot;:&quot;524-fft-direta-forward&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.2.5 IFFT (inverse)&quot;,&quot;value&quot;:&quot;525-ifft-inverse&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.3 Montando o espectro: |X[k]| e log(|X[k]|) usando ln_approx (Taylor)&quot;,&quot;value&quot;:&quot;53-montando-o-espectro-|x[k]|-e-log|x[k]|-usando-ln_approx-taylor&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.4 Cepstrum: IFFT do log-magnitude e busca do pico de quefr\u00eancia&quot;,&quot;value&quot;:&quot;54-cepstrum-ifft-do-log-magnitude-e-busca-do-pico-de-quefr\u00eancia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.5 Decis\u00e3o e acionamento do LED com histerese&quot;,&quot;value&quot;:&quot;55-decis\u00e3o-e-acionamento-do-led-com-histerese&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.6 Integra\u00e7\u00e3o com o que j\u00e1 temos: processar frame quando encher&quot;,&quot;value&quot;:&quot;56-integra\u00e7\u00e3o-com-o-que-j\u00e1-temos-processar-frame-quando-encher&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.7 O que voc\u00ea j\u00e1 consegue testar agora&quot;,&quot;value&quot;:&quot;57-o-que-voc\u00ea-j\u00e1-consegue-testar-agora&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6 \u2014 Robustez \u201cde produ\u00e7\u00e3o\u201d: janela (Hann), gate de sil\u00eancio, suaviza\u00e7\u00e3o temporal e integra\u00e7\u00e3o de perif\u00e9ricos no RP2040&quot;,&quot;value&quot;:&quot;6-robustez-de-produ\u00e7\u00e3o-janela-hann-gate-de-sil\u00eancio-suaviza\u00e7\u00e3o-temporal-e-integra\u00e7\u00e3o-de-perif\u00e9ricos-no-rp2040&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.1 Janela Hann (por que e como)&quot;,&quot;value&quot;:&quot;61-janela-hann-por-que-e-como&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.1.1 Tabela da janela (pr\u00e9-calculada)&quot;,&quot;value&quot;:&quot;611-tabela-da-janela-pr\u00e9-calculada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.1.2 Aplicar janela antes da FFT&quot;,&quot;value&quot;:&quot;612-aplicar-janela-antes-da-fft&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.2 Gate de sil\u00eancio por energia RMS (para cortar falsos positivos)&quot;,&quot;value&quot;:&quot;62-gate-de-sil\u00eancio-por-energia-rms-para-cortar-falsos-positivos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.2.1 Fun\u00e7\u00e3o de energia do frame&quot;,&quot;value&quot;:&quot;621-fun\u00e7\u00e3o-de-energia-do-frame&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.2.2 Usar o gate antes do cepstrum&quot;,&quot;value&quot;:&quot;622-usar-o-gate-antes-do-cepstrum&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.3 Suaviza\u00e7\u00e3o temporal (EMA) do \u201cpeak\u201d do cepstrum&quot;,&quot;value&quot;:&quot;63-suaviza\u00e7\u00e3o-temporal-ema-do-peak-do-cepstrum&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.3.1 Aplicando EMA dentro do detector&quot;,&quot;value&quot;:&quot;631-aplicando-ema-dentro-do-detector&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.4 Amostragem est\u00e1vel no RP2040 (sem \u201csleep torto\u201d)&quot;,&quot;value&quot;:&quot;64-amostragem-est\u00e1vel-no-rp2040-sem-sleep-torto&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.4.1 Callback de amostragem&quot;,&quot;value&quot;:&quot;641-callback-de-amostragem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.5 Inicializa\u00e7\u00e3o do ADC e do LED (Pico SDK)&quot;,&quot;value&quot;:&quot;65-inicializa\u00e7\u00e3o-do-adc-e-do-led-pico-sdk&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.6 Inicializa\u00e7\u00e3o \u201cDSP\u201d: twiddles, janela e buffers&quot;,&quot;value&quot;:&quot;66-inicializa\u00e7\u00e3o-dsp-twiddles-janela-e-buffers&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.7 Main \u201cquase final\u201d: timer coleta, loop processa frames&quot;,&quot;value&quot;:&quot;67-main-quase-final-timer-coleta-loop-processa-frames&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7 \u2014 C\u00f3digo completo e funcional (BitDogLab \/ RP2040) \u2014 filtro Taylor + cepstrum + LED&quot;,&quot;value&quot;:&quot;7-c\u00f3digo-completo-e-funcional-bitdoglab-rp2040-filtro-taylor-cepstrum-led&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.1 Como compilar (vis\u00e3o pr\u00e1tica)&quot;,&quot;value&quot;:&quot;71-como-compilar-vis\u00e3o-pr\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.2 Ajustes que voc\u00ea provavelmente vai fazer na BitDogLab&quot;,&quot;value&quot;:&quot;72-ajustes-que-voc\u00ea-provavelmente-vai-fazer-na-bitdoglab&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8 \u2014 Calibra\u00e7\u00e3o pr\u00e1tica, boas escolhas vs. m\u00e1s escolhas, encerramento e SEO&quot;,&quot;value&quot;:&quot;8-calibra\u00e7\u00e3o-pr\u00e1tica-boas-escolhas-vs-m\u00e1s-escolhas-encerramento-e-seo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8.1 Guia r\u00e1pido de calibra\u00e7\u00e3o (passo a passo)&quot;,&quot;value&quot;:&quot;81-guia-r\u00e1pido-de-calibra\u00e7\u00e3o-passo-a-passo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8.2 Boas escolhas vs. m\u00e1s escolhas (engenharia real)&quot;,&quot;value&quot;:&quot;82-boas-escolhas-vs-m\u00e1s-escolhas-engenharia-real&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8.3 Por que essa arquitetura funciona t\u00e3o bem em MCU&quot;,&quot;value&quot;:&quot;83-por-que-essa-arquitetura-funciona-t\u00e3o-bem-em-mcu&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8.4 Encerramento&quot;,&quot;value&quot;:&quot;84-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">1 — Motivação, Visão Geral do Problema e Arquitetura da Solução</a><ul class="eb-toc__list"><li><a href="#eb-table-content-1">1.1 Motivação técnica</a><li><a href="#12-problema-a-ser-resolvido">1.2 Problema a ser resolvido</a><li><a href="#13-arquitetura-geral-do-sistema">1.3 Arquitetura geral do sistema</a><li><a href="#eb-table-content-4">1.4 Por que Séries de Taylor em filtros digitais?</a><li><a href="#eb-table-content-5">1.5 O papel do Cepstrum na detecção do assobio</a></li></ul><li><a href="#eb-table-content-6">2 — Características do Assobio Humano e Modelagem do Sinal</a><ul class="eb-toc__list"><li><a href="#eb-table-content-7">2.1 O assobio como sinal físico</a><li><a href="#eb-table-content-8">2.2 Faixa típica de frequências do assobio humano</a><li><a href="#23-sinal-amostrado-no-adc-do-rp2040">2.3 Sinal amostrado no ADC do RP2040</a><li><a href="#eb-table-content-10">2.4 Por que separar fundamental e harmônicas?</a><li><a href="#eb-table-content-11">2.5 Introdução intuitiva às Séries de Taylor</a><li><a href="#eb-table-content-12">2.6 Ponte conceitual: derivadas → filtros</a></li></ul><li><a href="#eb-table-content-13">3 — Construção do Filtro Digital usando Séries de Taylor (Teoria + Primeira Implementação)</a><ul class="eb-toc__list"><li><a href="#31-ideia-central-taylor-como-operador-espectral">3.1 Ideia central: Taylor como operador espectral</a><li><a href="#eb-table-content-15">3.2 Derivadas discretas (diferenças finitas)</a><li><a href="#33-filtro-passa-faixa-baseado-em-taylor-modelo">3.3 Filtro passa-faixa baseado em Taylor (modelo)</a><li><a href="#eb-table-content-17">3.4 Estrutura do código (incremental)</a><ul class="eb-toc__list"><li><a href="#341-estrutura-de-estado-do-filtro">3.4.1 Estrutura de estado do filtro</a></li></ul><li><a href="#eb-table-content-19">3.5 Implementação do filtro em C (primeira versão)</a><li><a href="#eb-table-content-20">3.6 Integração inicial com o ADC (BitDogLab)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-21">3.6.1 Leitura básica do ADC</a></li></ul><li><a href="#37-primeiro-loop-funcional-sem-cepstrum-ainda">3.7 Primeiro loop funcional (sem cepstrum ainda)</a><li><a href="#eb-table-content-23">3.8 Validação prática (o que observar)</a></li></ul><li><a href="#4-cepstrum-para-detectar-o-assobio-conceito-coleta-de-frames-log-via-taylor">4 — Cepstrum para detectar o assobio (conceito + coleta de frames + log via Taylor)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-25">4.1 O que é “cepstrum” e por que ele funciona tão bem para assobios</a><li><a href="#42-qual-cepstrum-vamos-implementar-no-rp2040">4.2 Qual cepstrum vamos implementar no RP2040</a><li><a href="#eb-table-content-27">4.3 Coleta de frame (buffer) do sinal já filtrado</a><ul class="eb-toc__list"><li><a href="#eb-table-content-28">4.3.1 Código incremental: buffer e coleta</a></li></ul><li><a href="#eb-table-content-29">4.4 Logaritmo aproximado com Série de Taylor (sem logf())</a><ul class="eb-toc__list"><li><a href="#eb-table-content-30">4.4.1 Implementação (Taylor truncada)</a></li></ul><li><a href="#eb-table-content-31">4.5 Loop já pronto: filtro + coleta de frame</a></li></ul><li><a href="#eb-table-content-32">5 — FFT + log-magnitude (com Taylor) + IFFT ⇒ Cepstrum e detecção do assobio (já aciona LED)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-33">5.1 Estruturas complexas e utilitários mínimos</a><li><a href="#eb-table-content-34">5.2 FFT radix-2 iterativa (in-place) para N=256</a><ul class="eb-toc__list"><li><a href="#eb-table-content-35">5.2.1 Por que radix-2 e N=256</a><li><a href="#eb-table-content-36">5.2.2 Tabela de twiddles (pré-cálculo)</a><li><a href="#eb-table-content-37">5.2.3 Bit-reversal (reordenação)</a><li><a href="#524-fft-direta-forward">5.2.4 FFT direta (forward)</a><li><a href="#525-ifft-inverse">5.2.5 IFFT (inverse)</a></li></ul><li><a href="#eb-table-content-40">5.3 Montando o espectro: |X[k]| e log(|X[k]|) usando ln_approx (Taylor)</a><li><a href="#eb-table-content-41">5.4 Cepstrum: IFFT do log-magnitude e busca do pico de quefrência</a><li><a href="#eb-table-content-42">5.5 Decisão e acionamento do LED com histerese</a><li><a href="#eb-table-content-43">5.6 Integração com o que já temos: processar frame quando encher</a><li><a href="#eb-table-content-44">5.7 O que você já consegue testar agora</a></li></ul><li><a href="#eb-table-content-45">6 — Robustez “de produção”: janela (Hann), gate de silêncio, suavização temporal e integração de periféricos no RP2040</a><ul class="eb-toc__list"><li><a href="#61-janela-hann-por-que-e-como">6.1 Janela Hann (por que e como)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-47">6.1.1 Tabela da janela (pré-calculada)</a><li><a href="#612-aplicar-janela-antes-da-fft">6.1.2 Aplicar janela antes da FFT</a></li></ul><li><a href="#eb-table-content-49">6.2 Gate de silêncio por energia RMS (para cortar falsos positivos)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-50">6.2.1 Função de energia do frame</a><li><a href="#622-usar-o-gate-antes-do-cepstrum">6.2.2 Usar o gate antes do cepstrum</a></li></ul><li><a href="#eb-table-content-52">6.3 Suavização temporal (EMA) do “peak” do cepstrum</a><ul class="eb-toc__list"><li><a href="#631-aplicando-ema-dentro-do-detector">6.3.1 Aplicando EMA dentro do detector</a></li></ul><li><a href="#eb-table-content-54">6.4 Amostragem estável no RP2040 (sem “sleep torto”)</a><ul class="eb-toc__list"><li><a href="#641-callback-de-amostragem">6.4.1 Callback de amostragem</a></li></ul><li><a href="#eb-table-content-56">6.5 Inicialização do ADC e do LED (Pico SDK)</a><li><a href="#eb-table-content-57">6.6 Inicialização “DSP”: twiddles, janela e buffers</a><li><a href="#67-main-quase-final-timer-coleta-loop-processa-frames">6.7 Main “quase final”: timer coleta, loop processa frames</a></li></ul><li><a href="#eb-table-content-59">7 — Código completo e funcional (BitDogLab / RP2040) — filtro Taylor + cepstrum + LED</a><ul class="eb-toc__list"><li><a href="#eb-table-content-60">7.1 Como compilar (visão prática)</a><li><a href="#eb-table-content-61">7.2 Ajustes que você provavelmente vai fazer na BitDogLab</a></li></ul><li><a href="#eb-table-content-62">8 — Calibração prática, boas escolhas vs. más escolhas, encerramento e SEO</a><ul class="eb-toc__list"><li><a href="#eb-table-content-63">8.1 Guia rápido de calibração (passo a passo)</a><li><a href="#eb-table-content-64">8.2 Boas escolhas vs. más escolhas (engenharia real)</a><li><a href="#eb-table-content-65">8.3 Por que essa arquitetura funciona tão bem em MCU</a><li><a href="#84-encerramento">8.4 Encerramento</a></li></ul></ul></div></div></div></div></div>


<h2 class="wp-block-heading">1 — Motivação, Visão Geral do Problema e Arquitetura da Solução</h2>



<h3 class="wp-block-heading">1.1 Motivação técnica</h3>



<p class="wp-block-paragraph">Assobios humanos possuem uma característica muito interessante do ponto de vista de <strong>processamento digital de sinais (DSP)</strong>: eles apresentam uma <strong>frequência fundamental bem definida</strong>, normalmente entre <strong>800 Hz e 3 kHz</strong>, acompanhada por <strong>harmônicas</strong> que decrescem em amplitude. Isso os torna excelentes candidatos para estudo de <strong>extração de pitch</strong>, <strong>separação espectral</strong> e <strong>detecção robusta de eventos acústicos</strong> em sistemas embarcados.</p>



<p class="wp-block-paragraph">No contexto de microcontroladores como o <strong>RP2040</strong>, o desafio é duplo:</p>



<ol class="wp-block-list">
<li>Executar algoritmos matematicamente consistentes com <strong>baixo custo computacional</strong>.</li>



<li>Evitar bibliotecas pesadas de DSP, favorecendo implementações <strong>determinísticas</strong>, <strong>explicáveis</strong> e <strong>portáveis</strong>.</li>
</ol>



<p class="wp-block-paragraph">Este artigo foi desenhado exatamente com esse espírito: <strong>mostrar que é possível construir um pipeline de detecção de assobio usando apenas matemática clássica</strong>, séries de Taylor e algoritmos fundamentais de DSP, sem FFTs complexas ou frameworks externos.</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="721" height="607" src="https://mcu.tec.br/wp-content/uploads/2026/01/image-5.png" alt="" class="wp-image-1116" srcset="https://mcu.tec.br/wp-content/uploads/2026/01/image-5.png 721w, https://mcu.tec.br/wp-content/uploads/2026/01/image-5-300x253.png 300w" sizes="(max-width: 721px) 100vw, 721px" /></figure>



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



<h3 class="wp-block-heading">1.2 Problema a ser resolvido</h3>



<p class="wp-block-paragraph">O problema central pode ser descrito em três níveis:</p>



<ol class="wp-block-list">
<li><strong>Separação espectral</strong><br>O sinal do microfone contém:<ul><li>Ruído ambiente</li><li>Voz humana</li><li>Sons impulsivos</li><li>O assobio propriamente dito</li></ul>Precisamos <strong>isolar a frequência fundamental do assobio e suas harmônicas</strong>.</li>



<li><strong>Identificação confiável do assobio</strong><br>Apenas detectar energia em uma faixa de frequência <strong>não é suficiente</strong>, pois outros sons podem cair nessa banda.<br>Precisamos identificar <strong>periodicidade</strong> — aqui entra o <strong>cepstrum</strong>, que trabalha no domínio da <em>quefrência</em>.</li>



<li><strong>Ação física</strong><br>Após a detecção confiável:
<ul class="wp-block-list">
<li>Acender um LED quando um assobio é detectado</li>



<li>Apagar o LED quando o assobio desaparece</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph">Tudo isso deve funcionar <strong>em tempo real</strong>, em um <strong>RP2040</strong>, usando a <strong>BitDogLab</strong> como plataforma de referência.</p>



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



<h3 class="wp-block-heading">1.3 Arquitetura geral do sistema</h3>



<p class="wp-block-paragraph">O pipeline completo que iremos construir ao longo do artigo é o seguinte:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Microfone (ADC)
       ↓
Pré-processamento (remoção de DC)
       ↓
Filtro Digital por Séries de Taylor
(separação da fundamental e harmônicas)
       ↓
Cálculo do Cepstrum
(log + autocorrelação simplificada)
       ↓
Detecção de Pitch (assobio)
       ↓
Controle do LED (GPIO)
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">Microfone</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">ADC</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">       ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Pré</span><span style="color: #81A1C1">-</span><span style="color: #88C0D0">processamento</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">remoção</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">de</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">DC</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">       ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Filtro</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Digital</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">por</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Séries</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">de</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Taylor</span></span>
<span class="line"><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">separação</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">da</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fundamental</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">e</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">harmônicas</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">       ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Cálculo</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">do</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Cepstrum</span></span>
<span class="line"><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">log</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">autocorrelação</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">simplificada</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">       ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Detecção</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">de</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Pitch</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">assobio</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">       ↓</span></span>
<span class="line"><span style="color: #D8DEE9">Controle</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">do</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">LED</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">GPIO</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Cada bloco será implementado <strong>incrementalmente</strong>, de forma que:</p>



<ul class="wp-block-list">
<li>O código compile e funcione a cada etapa</li>



<li>Possamos validar o comportamento do sistema progressivamente</li>



<li>Ao final, teremos <strong>um firmware completo, funcional e didático</strong></li>
</ul>



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



<h3 class="wp-block-heading">1.4 Por que Séries de Taylor em filtros digitais?</h3>



<p class="wp-block-paragraph">Normalmente, filtros digitais são apresentados como:</p>



<ul class="wp-block-list">
<li>IIR (Butterworth, Chebyshev, etc.)</li>



<li>FIR por convolução</li>



<li>FFT + máscara espectral</li>
</ul>



<p class="wp-block-paragraph">Aqui escolhemos <strong>Séries de Taylor</strong> por três razões estratégicas:</p>



<ol class="wp-block-list">
<li><strong>Controle matemático total</strong><br>Um filtro baseado em Taylor é, na prática, uma <strong>aproximação explícita de operadores diferenciais</strong>, o que permite entender exatamente o que está sendo implementado.</li>



<li><strong>Eficiência em microcontroladores</strong><br>Séries truncadas resultam em:
<ul class="wp-block-list">
<li>Poucas multiplicações</li>



<li>Nenhuma função transcendental cara em tempo real</li>
</ul>
</li>



<li><strong>Valor didático elevado</strong><br>Esse método conecta:
<ul class="wp-block-list">
<li>Cálculo diferencial</li>



<li>Sistemas lineares</li>



<li>DSP clássico<br>Em um único algoritmo executável em hardware real.</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph">Mais adiante, mostraremos como aproximar <strong>respostas passa-faixa</strong> usando expansões de Taylor aplicadas a operadores discretos.</p>



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



<h3 class="wp-block-heading">1.5 O papel do Cepstrum na detecção do assobio</h3>



<p class="wp-block-paragraph">Mesmo após filtrar o sinal, ainda temos um problema:<br><strong>harmônicas também são periódicas</strong>, e ruídos podem enganar um detector simples.</p>



<p class="wp-block-paragraph">O <strong>cepstrum</strong> resolve isso explorando uma ideia elegante:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">A periodicidade no domínio do tempo vira um pico no domínio da <em>quefrência</em>.</p>
</blockquote>



<p class="wp-block-paragraph">Em termos práticos:</p>



<ul class="wp-block-list">
<li>Um assobio gera um pico claro no cepstrum</li>



<li>Voz humana tende a gerar padrões mais espalhados</li>



<li>Ruído branco praticamente não gera picos estáveis</li>
</ul>



<p class="wp-block-paragraph">Isso torna o cepstrum <strong>extremamente robusto</strong> para identificar assobios reais, mesmo em ambientes ruidosos.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/algoritimos/dsp/filtro-digital-com-series-de-taylor-e-cepstrum-para-deteccao-de-assobio-em-rp2040/">Filtro Digital com Séries de Taylor e Cepstrum para Detecção de Assobio em 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">1115</post-id>	</item>
		<item>
		<title>STM32V8: o novo microcontrolador da ST com Cortex-M85, PCM e tecnologia 18 nm FD-SOI</title>
		<link>https://mcu.tec.br/microcontroladores/stm32/stm32v8-o-novo-microcontrolador-da-st-com-cortex-m85-pcm-e-tecnologia-18-nm-fd-soi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=stm32v8-o-novo-microcontrolador-da-st-com-cortex-m85-pcm-e-tecnologia-18-nm-fd-soi</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Tue, 16 Dec 2025 21:32:02 +0000</pubDate>
				<category><![CDATA[STM32]]></category>
		<category><![CDATA[automação industrial]]></category>
		<category><![CDATA[Cortex-M85]]></category>
		<category><![CDATA[DSP embarcado]]></category>
		<category><![CDATA[Edge AI]]></category>
		<category><![CDATA[FD-SOI 18 nm]]></category>
		<category><![CDATA[inteligência artificial embarcada]]></category>
		<category><![CDATA[memória PCM]]></category>
		<category><![CDATA[microcontrolador de alto desempenho]]></category>
		<category><![CDATA[microcontrolador ST]]></category>
		<category><![CDATA[Renesas RA8M1]]></category>
		<category><![CDATA[sistemas embarcados avançados]]></category>
		<category><![CDATA[stm32]]></category>
		<category><![CDATA[STM32V8]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1032</guid>

					<description><![CDATA[<p>O STM32V8 é a nova família de microcontroladores de alto desempenho da STMicroelectronics, baseada no núcleo Arm Cortex-M85 e fabricada em tecnologia avançada de 18 nm FD-SOI com memória não volátil do tipo PCM integrada. Este artigo apresenta uma análise técnica e prática do STM32V8, explorando sua arquitetura de fabricação, sistema de memória, capacidades de DSP e inteligência artificial embarcada, além de suas aplicações em automação industrial, edge computing, robótica e sistemas ciberfísicos. Também é realizada uma comparação objetiva com o Renesas RA8M1, destacando diferenças em arquitetura, memória, eficiência energética e escalabilidade tecnológica. O conteúdo é voltado a engenheiros, desenvolvedores de firmware e profissionais de sistemas embarcados que buscam compreender os avanços que definem a próxima geração de microcontroladores.</p>
<p>The post <a href="https://mcu.tec.br/microcontroladores/stm32/stm32v8-o-novo-microcontrolador-da-st-com-cortex-m85-pcm-e-tecnologia-18-nm-fd-soi/">STM32V8: o novo microcontrolador da ST com Cortex-M85, PCM e tecnologia 18 nm FD-SOI</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading"><strong>o surgimento do STM32V8 e uma nova geração de microcontroladores de alto desempenho</strong></h2>



<p class="wp-block-paragraph">A STMicroelectronics anunciou recentemente a família <strong>STM32V8</strong>, marcando um avanço significativo na evolução dos microcontroladores de uso geral e industrial. Diferentemente das gerações anteriores da linha STM32, o STM32V8 foi concebido desde a origem para atender aplicações que exigem <strong>altíssimo desempenho computacional</strong>, <strong>baixa latência</strong>, <strong>eficiência energética</strong> e <strong>capacidade de executar algoritmos avançados</strong>, incluindo inteligência artificial embarcada, controle em tempo real e processamento digital de sinais.</p>



<p class="wp-block-paragraph">O grande diferencial tecnológico do STM32V8 está no uso de um <strong>processo de fabricação em 18 nm FD-SOI (Fully Depleted Silicon On Insulator)</strong>, aliado à integração de <strong>memória não volátil do tipo PCM (Phase-Change Memory)</strong> diretamente no chip. Essa combinação permite à ST superar limitações clássicas dos microcontroladores baseados em Flash tradicional, como latência de acesso à memória, consumo energético elevado durante escrita e restrições de escalabilidade em nós tecnológicos mais avançados.</p>



<p class="wp-block-paragraph">No núcleo computacional, o STM32V8 é baseado no <strong>Arm Cortex-M85</strong>, atualmente o núcleo mais poderoso da família Cortex-M. Esse núcleo oferece suporte nativo a <strong>extensões Helium (M-Profile Vector Extension)</strong> para aceleração de DSP (Processamento Digital de Sinais) e workloads de machine learning, além de um pipeline mais profundo e recursos avançados de predição e paralelismo interno. Com frequências de operação significativamente mais altas que gerações anteriores, o STM32V8 se posiciona como um microcontrolador que começa a ocupar o espaço tradicionalmente reservado a microprocessadores de entrada, porém mantendo as vantagens de um MCU: determinismo, baixo consumo e integração periférica.</p>



<p class="wp-block-paragraph">Do ponto de vista prático, a ST posiciona o STM32V8 para aplicações como <strong>controle industrial avançado</strong>, <strong>robótica</strong>, <strong>automação predial e fabril</strong>, <strong>dispositivos médicos</strong>, <strong>edge AI</strong>, <strong>sensoriamento inteligente</strong> e <strong>sistemas ciberfísicos</strong>. O objetivo é permitir que arquiteturas antes dependentes de SoCs com Linux ou coprocessadores externos possam ser implementadas em um único microcontrolador, reduzindo custo, consumo, complexidade de software e requisitos de certificação.</p>



<p class="wp-block-paragraph">Essa nova família não substitui as linhas STM32 já consolidadas (como STM32F, G, H ou U), mas inaugura uma <strong>nova classe de MCU dentro do portfólio da ST</strong>, voltada explicitamente para aplicações que exigem o máximo desempenho possível dentro do ecossistema Cortex-M. Nas próximas seções, serão detalhados os pilares tecnológicos do STM32V8, começando pela sua <strong>arquitetura de fabricação e sistema de memória</strong>, e posteriormente avançando para núcleo, periféricos, segurança e uma comparação técnica objetiva com o <strong>Renesas RA8M1</strong>.</p>



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



<h2 class="wp-block-heading"><strong>Seção 2 – Tecnologia de Fabricação do STM32V8: 18 nm FD-SOI e Memória PCM</strong></h2>



<p class="wp-block-paragraph">Um dos aspectos mais disruptivos do <strong>STM32V8</strong> não está apenas no núcleo Cortex-M85, mas principalmente na <strong>tecnologia de fabricação adotada pela STMicroelectronics</strong>. Pela primeira vez em microcontroladores de uso geral, a ST emprega um processo <strong>18 nm FD-SOI (Fully Depleted Silicon On Insulator)</strong> combinado com <strong>memória não volátil do tipo PCM (Phase-Change Memory)</strong> integrada no próprio chip. Essa escolha tem implicações diretas em desempenho, consumo, confiabilidade e escalabilidade tecnológica.</p>



<p class="wp-block-paragraph">A tecnologia <strong>FD-SOI</strong> difere significativamente do CMOS convencional utilizado em processos mais antigos (40 nm, 65 nm, 90 nm). No FD-SOI, o transistor é construído sobre uma camada isolante extremamente fina, o que reduz drasticamente correntes parasitas, melhora o controle eletrostático do canal e diminui a variabilidade dos transistores. Na prática, isso se traduz em <strong>menor consumo dinâmico e estático</strong>, <strong>maior frequência de operação</strong> e <strong>melhor comportamento térmico</strong>, fatores críticos para sistemas embarcados que operam 24/7 ou em ambientes industriais severos.</p>



<p class="wp-block-paragraph">Outro benefício importante do FD-SOI é a possibilidade de <strong>body biasing dinâmico</strong>, técnica que permite ajustar o limiar de tensão dos transistores por software ou hardware. Isso dá ao projetista a capacidade de <strong>priorizar desempenho ou eficiência energética em tempo real</strong>, algo particularmente relevante em aplicações que alternam entre modos de processamento intenso e estados de baixo consumo. Em um microcontrolador de alto desempenho como o STM32V8, esse recurso amplia significativamente a flexibilidade arquitetural do sistema.</p>



<p class="wp-block-paragraph">Complementando o processo de 18 nm, a ST substituiu a Flash tradicional por <strong>memória PCM (Phase-Change Memory)</strong>. Diferente da Flash, a PCM não depende de tunelamento de elétrons através de óxidos finos, o que elimina vários gargalos clássicos: latência elevada de leitura, alto consumo durante escrita e desgaste acelerado com ciclos de programação/apagamento. A PCM permite <strong>leituras praticamente tão rápidas quanto SRAM</strong>, com <strong>maior densidade</strong> e <strong>excelente retenção de dados</strong>, mesmo em temperaturas elevadas.</p>



<p class="wp-block-paragraph">Do ponto de vista prático de firmware, a presença da PCM impacta diretamente a forma como o código é executado. O STM32V8 consegue operar em <strong>execução direta da memória não volátil (XIP – Execute In Place)</strong> sem as penalidades comuns da Flash, reduzindo ou até eliminando a necessidade de copiar rotinas críticas para RAM. Isso simplifica o linker script, reduz o uso de SRAM e melhora o determinismo temporal — um ponto fundamental para <strong>RTOS, controle em tempo real e aplicações safety-critical</strong>.</p>



<p class="wp-block-paragraph">Além disso, a PCM é naturalmente mais adequada a nós tecnológicos avançados, o que garante <strong>longevidade à família STM32V8</strong>. Enquanto a Flash enfrenta sérias dificuldades de escalabilidade abaixo de 28 nm, a PCM se mantém viável em processos ainda menores, preparando o caminho para futuras evoluções da linha sem rupturas arquiteturais. Para desenvolvedores e fabricantes de equipamentos, isso significa <strong>maior segurança de investimento e continuidade de plataforma</strong>.</p>



<p class="wp-block-paragraph">Na próxima seção, entraremos no coração computacional do STM32V8, analisando em detalhes o <strong>núcleo Arm Cortex-M85</strong>, suas extensões vetoriais, impacto prático em DSP e inteligência artificial embarcada, e como isso redefine o limite do que se espera de um microcontrolador.</p>



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



<h2 class="wp-block-heading"><strong>Núcleo Arm Cortex-M85 no STM32V8: Desempenho, DSP e Inteligência Artificial Embarcada</strong></h2>



<p class="wp-block-paragraph">No centro do <strong>STM32V8</strong> está o <strong>Arm Cortex-M85</strong>, atualmente o núcleo mais avançado da família Cortex-M. Sua adoção não representa apenas um incremento incremental de desempenho, mas sim uma mudança de patamar naquilo que é possível executar em um microcontrolador sem recorrer a microprocessadores ou aceleradores externos. A ST posiciona o STM32V8 como uma plataforma capaz de consolidar <strong>controle em tempo real, processamento de sinais e inferência de modelos de inteligência artificial</strong> em um único dispositivo.</p>



<p class="wp-block-paragraph">O Cortex-M85 introduz um pipeline mais profundo e otimizado em relação a núcleos anteriores como o Cortex-M7 ou M33, permitindo frequências de operação significativamente mais altas. No contexto do STM32V8, isso se traduz em um MCU capaz de executar centenas de milhões de instruções por segundo, mantendo características fundamentais de sistemas embarcados, como <strong>determinismo temporal</strong>, <strong>interrupções de baixa latência</strong> e <strong>execução previsível</strong>, essenciais para aplicações industriais, automotivas e médicas.</p>



<p class="wp-block-paragraph">Um dos principais diferenciais técnicos do Cortex-M85 é o suporte nativo às <strong>extensões Helium</strong>, também conhecidas como <strong>M-Profile Vector Extension (MVE)</strong>. Essas extensões introduzem um conjunto de instruções vetoriais SIMD (Single Instruction, Multiple Data), permitindo que operações matemáticas sejam executadas em paralelo sobre múltiplos dados. Na prática, isso acelera de forma expressiva algoritmos de <strong>DSP</strong>, como filtros FIR e IIR, FFTs, convoluções, correlação e operações matriciais, amplamente utilizadas em controle, áudio, vibração, sensores e comunicações industriais.</p>



<p class="wp-block-paragraph">No campo da <strong>inteligência artificial embarcada</strong>, o impacto é ainda mais relevante. O Cortex-M85 foi projetado para executar inferência de redes neurais leves diretamente no MCU, especialmente modelos de <strong>machine learning para edge computing</strong>, como classificadores, detectores de padrões e modelos de regressão. Quando combinado com bibliotecas otimizadas como <strong>CMSIS-DSP</strong> e <strong>CMSIS-NN</strong>, o STM32V8 passa a executar modelos treinados em frameworks como TensorFlow Lite Micro com desempenho antes restrito a SoCs mais complexos.</p>



<p class="wp-block-paragraph">Do ponto de vista prático de desenvolvimento, isso significa que tarefas como <strong>detecção de anomalias</strong>, <strong>classificação de sinais</strong>, <strong>reconhecimento de padrões em sensores</strong>, <strong>monitoramento preditivo</strong> e <strong>processamento inteligente de dados</strong> podem ser implementadas diretamente no microcontrolador, sem dependência de sistemas operacionais complexos ou unidades externas de processamento. Além de reduzir consumo e custo, essa abordagem melhora a confiabilidade do sistema e reduz latências críticas.</p>



<p class="wp-block-paragraph">Outro aspecto importante do Cortex-M85 é o avanço nos mecanismos de <strong>segurança e isolamento</strong>, especialmente quando combinado com arquiteturas compatíveis com <strong>TrustZone para Cortex-M</strong>. Embora o foco principal do STM32V8 seja desempenho, a presença de recursos modernos de proteção de memória, execução segura e separação de contextos torna o dispositivo adequado a aplicações conectadas, onde segurança cibernética é um requisito básico e não opcional.</p>



<p class="wp-block-paragraph">Em síntese, o núcleo Cortex-M85 transforma o STM32V8 em um microcontrolador que atua como uma <strong>plataforma computacional completa</strong>, capaz de unificar controle, processamento de sinais e inteligência artificial. Na próxima seção, será analisada a <strong>arquitetura de memória e subsistema de interconexão</strong> do STM32V8, explorando como a combinação de PCM, SRAM e barramentos internos sustenta esse nível de desempenho de forma determinística e eficiente.</p>



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



<h2 class="wp-block-heading"><strong>Arquitetura de Memória e Execução no STM32V8</strong></h2>



<p class="wp-block-paragraph">O desempenho elevado do <strong>STM32V8</strong> não é resultado apenas do núcleo Cortex-M85 ou do processo de fabricação em 18 nm, mas da forma como a <strong>arquitetura de memória</strong> foi projetada para sustentar cargas computacionais intensas com previsibilidade temporal. A ST adotou uma abordagem que combina <strong>memória PCM de alta velocidade</strong>, <strong>SRAM interna otimizada</strong> e um <strong>subsistema de barramentos de alta largura de banda</strong>, criando uma base sólida para aplicações em tempo real, DSP e inteligência artificial embarcada.</p>



<p class="wp-block-paragraph">A <strong>memória PCM (Phase-Change Memory)</strong> atua como principal memória não volátil do sistema, substituindo completamente a Flash tradicional. Diferente da Flash, cujo acesso pode introduzir estados de espera (wait states) em altas frequências, a PCM oferece <strong>latência significativamente menor e mais previsível</strong>, permitindo que o núcleo execute código diretamente da memória não volátil com impacto mínimo no desempenho. Isso reduz a necessidade de técnicas clássicas, como cópia de código crítico para RAM, simplificando o projeto de firmware e melhorando o determinismo.</p>



<p class="wp-block-paragraph">A <strong>SRAM interna</strong> complementa a PCM, sendo utilizada para dados, pilhas, heaps, buffers de comunicação e estruturas temporárias exigidas por algoritmos de DSP e IA. No STM32V8, essa SRAM é distribuída de forma estratégica no mapa de memória, permitindo acessos paralelos e reduzindo contenções no barramento. Essa organização é particularmente importante quando múltiplos mestres — como o núcleo, DMA e aceleradores internos — competem por acesso à memória.</p>



<p class="wp-block-paragraph">O subsistema de interconexão interna do STM32V8 foi projetado para acompanhar o aumento de desempenho do núcleo. Barramentos de alta velocidade interligam o Cortex-M85 às memórias e periféricos, garantindo <strong>baixa latência em acessos críticos</strong> e <strong>previsibilidade temporal</strong>. Para aplicações em tempo real, essa previsibilidade é tão importante quanto a velocidade bruta, pois garante que interrupções, tarefas de RTOS e rotinas de controle cumpram seus prazos de execução.</p>



<p class="wp-block-paragraph">Do ponto de vista prático, essa arquitetura favorece fortemente o uso de <strong>RTOS como FreeRTOS ou Zephyr</strong>, permitindo que múltiplas tarefas executem algoritmos complexos sem interferências imprevisíveis. Em sistemas de controle avançado, por exemplo, é possível isolar tarefas de aquisição de sensores, processamento vetorial e comunicação, mantendo comportamento determinístico mesmo sob carga elevada.</p>



<p class="wp-block-paragraph">Outro ponto relevante é o impacto dessa arquitetura na <strong>eficiência energética</strong>. A menor latência da PCM reduz o tempo total de execução das instruções, permitindo que o microcontrolador entre mais rapidamente em estados de baixo consumo. Aliado aos recursos do FD-SOI, como body biasing dinâmico, o STM32V8 consegue equilibrar alto desempenho com consumo otimizado, algo essencial em aplicações industriais e embarcadas que operam continuamente.</p>



<p class="wp-block-paragraph">Em resumo, a arquitetura de memória do STM32V8 foi concebida para remover gargalos históricos dos microcontroladores de alto desempenho, oferecendo uma plataforma onde execução direta da memória, acesso previsível e alto paralelismo são características intrínsecas. Na próxima seção, o foco será a <strong>integração de periféricos, interfaces e capacidades de sistema</strong>, analisando como o STM32V8 se posiciona em aplicações reais de automação, controle e edge computing.</p>



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



<h2 class="wp-block-heading"><strong>Periféricos, Interfaces e Aplicações Práticas do STM32V8</strong></h2>



<p class="wp-block-paragraph">Além do avanço significativo em núcleo, processo de fabricação e arquitetura de memória, o <strong>STM32V8</strong> foi concebido como um microcontrolador altamente integrado, capaz de atender sistemas complexos sem a necessidade de circuitos externos adicionais. A ST mantém a filosofia histórica da família STM32: oferecer um <strong>ecossistema robusto de periféricos</strong>, com forte integração a ferramentas de software e suporte de longo prazo, agora elevado a um novo patamar de desempenho.</p>



<p class="wp-block-paragraph">Embora a publicação oficial foque principalmente nos avanços tecnológicos de processo e memória, o posicionamento do STM32V8 indica claramente a presença de um conjunto completo de <strong>periféricos de alto desempenho</strong>, incluindo temporizadores avançados, interfaces de comunicação industriais e subsistemas de conversão analógica. Esses recursos são essenciais para aplicações que combinam <strong>controle em tempo real</strong>, <strong>aquisição de sinais</strong> e <strong>processamento intensivo</strong> em um único dispositivo.</p>



<p class="wp-block-paragraph">No contexto de controle e automação, temporizadores de alta resolução e baixo jitter permitem a implementação de <strong>controle de motores</strong>, <strong>conversores de potência</strong>, <strong>robótica</strong> e <strong>sistemas mecatrônicos</strong> com precisão elevada. A capacidade de executar algoritmos complexos diretamente no MCU possibilita a adoção de técnicas mais sofisticadas, como controle preditivo, observadores de estado e filtragem adaptativa, sem comprometer os requisitos temporais do sistema.</p>



<p class="wp-block-paragraph">As <strong>interfaces de comunicação</strong> desempenham um papel central no posicionamento do STM32V8 em aplicações modernas. Protocolos seriais de alta velocidade, combinados com suporte a comunicação determinística, tornam o dispositivo adequado para <strong>redes industriais</strong>, <strong>sistemas distribuídos</strong> e <strong>edge computing</strong>. Em aplicações conectadas, o alto desempenho do núcleo Cortex-M85 permite que pilhas de comunicação, criptografia e segurança sejam executadas em paralelo com tarefas de controle e processamento de sinais.</p>



<p class="wp-block-paragraph">Um aspecto particularmente relevante é a viabilidade prática de consolidar múltiplas funções em um único microcontrolador. Em projetos tradicionais, seria comum dividir responsabilidades entre um MCU de controle e um processador dedicado a processamento de sinais ou inferência de IA. Com o STM32V8, essa separação se torna desnecessária em muitos casos, reduzindo <strong>custo de hardware</strong>, <strong>consumo energético</strong>, <strong>complexidade de software</strong> e <strong>pontos potenciais de falha</strong>.</p>



<p class="wp-block-paragraph">Do ponto de vista de desenvolvimento, o STM32V8 se beneficia diretamente do ecossistema já consolidado da ST, incluindo <strong>STM32Cube</strong>, bibliotecas HAL e LL, suporte a <strong>RTOS</strong>, além de integração com ferramentas de depuração e profiling. Isso reduz significativamente a curva de aprendizado, permitindo que equipes que já dominam a família STM32 migrem para o STM32V8 sem ruptura conceitual, mesmo diante de uma arquitetura significativamente mais avançada.</p>



<p class="wp-block-paragraph">Em aplicações práticas, o STM32V8 se posiciona como uma plataforma ideal para <strong>manutenção preditiva</strong>, <strong>monitoramento inteligente</strong>, <strong>processamento de sinais vibroacústicos</strong>, <strong>edge AI industrial</strong>, <strong>instrumentação avançada</strong> e <strong>sistemas ciberfísicos</strong>. A capacidade de executar algoritmos complexos localmente, com baixa latência e alto grau de determinismo, atende diretamente às demandas atuais da Indústria 4.0 e de sistemas embarcados inteligentes.</p>



<p class="wp-block-paragraph">Na próxima seção, será apresentada uma <strong>comparação técnica objetiva entre o STM32V8 e o Renesas RA8M1</strong>, destacando semelhanças, diferenças arquiteturais e cenários em que cada plataforma se mostra mais adequada.</p>



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



<h2 class="wp-block-heading"><strong>Seção 6 – Comparação Técnica: STM32V8 versus Renesas RA8M1</strong></h2>



<p class="wp-block-paragraph">A comparação entre o <strong>STM32V8</strong>, da STMicroelectronics, e o <strong>Renesas RA8M1</strong> é particularmente relevante porque ambos são baseados no <strong>núcleo Arm Cortex-M85</strong> e se posicionam no segmento de <strong>microcontroladores de altíssimo desempenho</strong>. Apesar dessa similaridade fundamental, as duas plataformas adotam <strong>estratégias arquiteturais distintas</strong>, refletindo visões diferentes sobre escalabilidade, memória, eficiência energética e foco de aplicação.</p>



<p class="wp-block-paragraph">Do ponto de vista de <strong>núcleo e capacidade computacional</strong>, ambos utilizam o Cortex-M85 com suporte às extensões Helium (MVE), o que garante excelente desempenho em DSP e workloads de machine learning. No entanto, o STM32V8 se beneficia diretamente do processo de fabricação em <strong>18 nm FD-SOI</strong>, permitindo frequências mais elevadas e melhor controle de consumo dinâmico em comparação ao RA8M1, que é fabricado em um processo CMOS mais convencional. Na prática, isso favorece o STM32V8 em aplicações que exigem desempenho sustentado com controle térmico rigoroso.</p>



<p class="wp-block-paragraph">A diferença mais marcante entre as duas plataformas está no <strong>sistema de memória não volátil</strong>. O Renesas RA8M1 utiliza <strong>Flash embutida tradicional</strong>, complementada por uma quantidade significativa de SRAM. Essa abordagem é madura, amplamente conhecida e bem suportada por ferramentas, mas impõe limitações de latência e escalabilidade em altas frequências. O STM32V8, por outro lado, elimina a Flash e adota <strong>memória PCM</strong>, oferecendo menor latência de acesso, maior previsibilidade temporal e melhor adequação a nós tecnológicos avançados. Para aplicações em tempo real estrito, essa diferença é particularmente relevante.</p>



<p class="wp-block-paragraph">Em termos de <strong>arquitetura de execução</strong>, o STM32V8 apresenta vantagens claras na execução direta da memória não volátil (XIP) sem penalidades significativas, enquanto o RA8M1 pode exigir estratégias adicionais, como cache ou cópia seletiva de código para RAM, em aplicações mais exigentes. Isso impacta diretamente a complexidade do firmware e o esforço de otimização por parte do desenvolvedor.</p>



<p class="wp-block-paragraph">No campo da <strong>eficiência energética</strong>, ambos os dispositivos são projetados para aplicações embarcadas modernas, mas o uso de FD-SOI no STM32V8 introduz recursos adicionais, como <strong>body biasing dinâmico</strong>, que permitem ajustes finos entre desempenho e consumo em tempo de execução. O RA8M1 mantém uma abordagem mais tradicional, eficiente e confiável, porém com menor flexibilidade nesse aspecto específico.</p>



<p class="wp-block-paragraph">Do ponto de vista de <strong>ecossistema e maturidade</strong>, o RA8M1 se beneficia da forte integração com o <strong>Renesas Flexible Software Package (FSP)</strong>, oferecendo uma pilha de software bem estruturada e voltada para aplicações industriais e comerciais. O STM32V8, por sua vez, herda o vasto ecossistema <strong>STM32Cube</strong>, amplamente difundido, com suporte consolidado a RTOS, middleware e ferramentas de desenvolvimento, o que pode representar uma vantagem estratégica para equipes já familiarizadas com o universo STM32.</p>



<p class="wp-block-paragraph">Em síntese, o <strong>Renesas RA8M1</strong> se apresenta como uma plataforma robusta, madura e altamente capaz para aplicações industriais de alto desempenho, enquanto o <strong>STM32V8</strong> avança além, explorando novas tecnologias de fabricação e memória para atingir um nível superior de desempenho, previsibilidade e escalabilidade futura. A escolha entre as duas soluções dependerá diretamente dos requisitos do projeto, especialmente no que se refere a latência, consumo, longevidade tecnológica e complexidade de software aceitável.</p>



<p class="wp-block-paragraph">Na próxima e última seção, será apresentada a <strong>conclusão do artigo</strong>, seguida da <strong>lista de fontes utilizadas</strong>, conforme solicitado.</p>



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



<h2 class="wp-block-heading"><strong>Seção 7 – Conclusão e Fontes</strong></h2>



<h3 class="wp-block-heading"><strong>Conclusão</strong></h3>



<p class="wp-block-paragraph">O <strong>STM32V8</strong> representa um marco importante na evolução dos microcontroladores, não apenas dentro do portfólio da STMicroelectronics, mas no mercado de sistemas embarcados como um todo. Ao combinar o núcleo <strong>Arm Cortex-M85</strong> com um processo de fabricação avançado em <strong>18 nm FD-SOI</strong> e a adoção inédita de <strong>memória PCM</strong>, a ST redefine os limites tradicionais entre microcontroladores e microprocessadores de entrada. Essa abordagem permite alcançar níveis de desempenho, eficiência energética e previsibilidade temporal que antes exigiam arquiteturas mais complexas.</p>



<p class="wp-block-paragraph">Do ponto de vista técnico, o STM32V8 se destaca pela execução eficiente de <strong>DSP e inteligência artificial embarcada</strong>, suportada por extensões vetoriais Helium e por uma arquitetura de memória capaz de sustentar altas taxas de processamento sem os gargalos clássicos da Flash. Para o desenvolvedor, isso se traduz em projetos mais simples, com menor necessidade de otimizações manuais, cópias de código para RAM ou uso de dispositivos auxiliares.</p>



<p class="wp-block-paragraph">Na comparação com o <strong>Renesas RA8M1</strong>, fica evidente que ambas as plataformas ocupam o topo do segmento Cortex-M. Entretanto, o STM32V8 adota uma postura mais agressiva em termos de inovação tecnológica, priorizando escalabilidade futura, menor latência e maior flexibilidade energética. Já o RA8M1 se posiciona como uma solução madura, robusta e alinhada a arquiteturas tradicionais, o que pode ser uma vantagem em projetos que valorizam estabilidade e continuidade de design.</p>



<p class="wp-block-paragraph">Em aplicações práticas, o STM32V8 surge como uma plataforma especialmente atraente para <strong>automação industrial avançada</strong>, <strong>edge AI</strong>, <strong>manutenção preditiva</strong>, <strong>instrumentação inteligente</strong>, <strong>robótica</strong> e <strong>sistemas ciberfísicos</strong>, onde alto desempenho, determinismo e integração são requisitos fundamentais. Seu lançamento sinaliza uma tendência clara: o futuro dos microcontroladores passa pela convergência entre computação intensiva, eficiência energética e inteligência embarcada.</p>



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



<h3 class="wp-block-heading"><strong>Fontes Utilizadas</strong></h3>



<ol class="wp-block-list">
<li><strong>STMicroelectronics – Press Release</strong><br><em>ST unveils STM32V8 microcontroller with embedded phase-change memory on 18nm FD-SOI technology</em><br>Disponível em:<br><a href="https://newsroom.st.com/media-center/press-item.html/p4733.html">https://newsroom.st.com/media-center/press-item.html/p4733.html</a></li>



<li><strong>Renesas Electronics – RA8M1 Product Page</strong><br><em>RA8M1 – 480 MHz Arm Cortex-M85 MCU</em><br>Disponível em:<br><a href="https://www.renesas.com/en/products/ra8m1">https://www.renesas.com/en/products/ra8m1</a></li>
</ol><p>The post <a href="https://mcu.tec.br/microcontroladores/stm32/stm32v8-o-novo-microcontrolador-da-st-com-cortex-m85-pcm-e-tecnologia-18-nm-fd-soi/">STM32V8: o novo microcontrolador da ST com Cortex-M85, PCM e tecnologia 18 nm FD-SOI</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1032</post-id>	</item>
		<item>
		<title>Quefrequência e Análise Cepstral: Uma Introdução Prática para Sistemas Embarcados (ESP32-P4)</title>
		<link>https://mcu.tec.br/algoritimos/dsp/quefrequencia-e-analise-cepstral-uma-introducao-pratica-para-sistemas-embarcados-esp32-p4/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=quefrequencia-e-analise-cepstral-uma-introducao-pratica-para-sistemas-embarcados-esp32-p4</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Fri, 05 Dec 2025 11:23:39 +0000</pubDate>
				<category><![CDATA[DSP]]></category>
		<category><![CDATA[análise cepstral]]></category>
		<category><![CDATA[cepstro]]></category>
		<category><![CDATA[classificação acústica]]></category>
		<category><![CDATA[detecção de eventos sonoros]]></category>
		<category><![CDATA[DSP embarcado]]></category>
		<category><![CDATA[engenharia de áudio]]></category>
		<category><![CDATA[envelope espectral]]></category>
		<category><![CDATA[esp-dsp]]></category>
		<category><![CDATA[ESP32-P4]]></category>
		<category><![CDATA[fft]]></category>
		<category><![CDATA[ifft]]></category>
		<category><![CDATA[log-espectro]]></category>
		<category><![CDATA[MFCC]]></category>
		<category><![CDATA[pitch detection]]></category>
		<category><![CDATA[processamento de áudio embarcado]]></category>
		<category><![CDATA[processamento digital de sinais]]></category>
		<category><![CDATA[quefrequência]]></category>
		<category><![CDATA[sistema fonte-filtro]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=947</guid>

					<description><![CDATA[<p>A análise cepstral e o conceito de quefrequência são técnicas essencialmente poderosas no processamento de sinais de áudio, permitindo separar efeitos de excitação, resposta acústica e periodicidades espectrais que não são claramente visíveis no domínio da frequência tradicional. Neste artigo para o site mcu.tec.br, apresentamos uma explicação didática e rigorosa sobre o que é o cepstro, como surge a quefrequência e por que essa abordagem é tão eficiente para extração de pitch, detecção de envoltória espectral, identificação de ecos e modelagem fonte–filtro. O conteúdo inclui as fórmulas matemáticas necessárias para compreensão do método, além de exemplos práticos de implementação em C utilizando o ESP32-P4 e a biblioteca ESP-DSP, permitindo aplicações em reconhecimento de fala embarcado, classificação acústica, monitoramento industrial e análise de eventos sonoros em tempo real.</p>
<p>The post <a href="https://mcu.tec.br/algoritimos/dsp/quefrequencia-e-analise-cepstral-uma-introducao-pratica-para-sistemas-embarcados-esp32-p4/">Quefrequência e Análise Cepstral: Uma Introdução Prática para Sistemas Embarcados (ESP32-P4)</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<h3 class="wp-block-heading">Introdução: por que falar em Quefrequência e Análise Cepstral?</h3>



<p class="wp-block-paragraph">Quando trabalhamos com áudio em sistemas embarcados (como um ESP32-P4), é muito comum pensar apenas em tempo e frequência: sinal no tempo, depois FFT para ver o espectro, aplicar filtros, etc. Porém, há situações em que olhar somente o espectro de magnitude não é suficiente para separar os “componentes” de interesse do sinal:</p>



<ul class="wp-block-list">
<li>Separar o conteúdo de excitação (por exemplo, cordas vocais ou fonte sonora) do “formante” ou ressonâncias do sistema (trato vocal, sala, caixa acústica).</li>



<li>Identificar ecos ou reverberações (reflexões) embutidos no sinal.</li>



<li>Estimar pitch (frequência fundamental da voz) mesmo em ambientes ruidosos ou com filtragem forte.</li>



<li>Detectar características de envoltória espectral (timbre) independentemente da excitação instantânea.</li>
</ul>



<p class="wp-block-paragraph">A análise cepstral foi criada justamente para isso: ela “desfaz” a convolução no domínio da frequência ao transformar multiplicações em somas usando o logaritmo, e depois aplica novamente uma transformada inversa. Isso gera um novo domínio de análise – não mais tempo, nem frequência – mas o domínio da <strong>quefrequência</strong>.</p>



<h4 class="wp-block-heading">Conceito intuitivo de Quefrequência</h4>



<p class="wp-block-paragraph">O termo “quefrequência” é um trocadilho proposital com “frequency” (frequência). A ideia é:</p>



<ul class="wp-block-list">
<li>No domínio da frequência, o eixo horizontal é a frequência ( f ) (Hz).</li>



<li>Na análise cepstral, depois de aplicar log do espectro e uma transformada inversa, o eixo horizontal passa a ter unidade de <strong>tempo</strong>, mas não é o tempo original do sinal; é um “tempo de periodicidade” derivado da estrutura de frequência.</li>



<li>Como essa variável não é exatamente o tempo do domínio original, nem a frequência, foi dado o nome de <strong>quefrequência</strong> e a unidade de <strong>queferência</strong> (em segundos ou amostras, mas interpretada como “período da estrutura espectral”).</li>
</ul>



<p class="wp-block-paragraph">Intuitivamente:</p>



<ul class="wp-block-list">
<li>Picos de periodicidade de <strong>pitch</strong> aparecem como picos em quefrequência correspondendo ao período fundamental do sinal.</li>



<li>A envoltória lenta do espectro (por exemplo, os formantes da voz ou a resposta de uma sala) aparece concentrada em baixas quefrequências.</li>



<li>Componentes mais “rápidos” do espectro (finas linhas espectrais, harmônicos) aparecem em quefrequências mais altas.</li>
</ul>



<p class="wp-block-paragraph">Isso permite “separar no eixo da quefrequência” aquilo que queremos analisar:</p>



<ul class="wp-block-list">
<li>Baixa quefrequência → envoltória espectral (formantes, timbre, resposta de sistema).</li>



<li>Alta quefrequência → detalhes finos da excitação (harmônicos, rugosidade, etc.).</li>
</ul>



<p class="wp-block-paragraph">Em processamento de voz, isso tem aplicações clássicas:</p>



<ul class="wp-block-list">
<li><strong>Modelagem fonte–filtro</strong>: a fala é modelada como excitação (cordas vocais ou ruído glótico) passando por um filtro (trato vocal). A análise cepstral permite separar esses dois componentes.</li>



<li><strong>Reconhecimento de fala</strong>: coeficientes cepstrais (por exemplo, MFCC – Mel Frequency Cepstral Coefficients) são onipresentes em sistemas de ASR.</li>



<li><strong>Equalização e cancelamento de eco</strong>: a estrutura de eco pode ser observada no domínio cepstral e tratada de forma mais clara em alguns cenários.</li>
</ul>



<p class="wp-block-paragraph">No contexto do <strong>ESP32-P4</strong> e de sistemas embarcados em geral, a análise cepstral é interessante porque:</p>



<ul class="wp-block-list">
<li>Pode ser implementada em cima de FFTs já disponíveis (bibliotecas de DSP, ESP-DSP, etc.).</li>



<li>É computacionalmente viável para janelas de áudio de tamanho moderado.</li>



<li>Fornece uma representação compacta do sinal (poucos coeficientes cepstrais podem ser suficientes para muitos algoritmos de decisão, classificação ou detecção).</li>
</ul>



<h4 class="wp-block-heading">Visão global do fluxo de análise cepstral</h4>



<p class="wp-block-paragraph">Sem entrar ainda nos detalhes matemáticos (que virão na próxima seção), o fluxo básico é:</p>



<ol class="wp-block-list">
<li><strong>Janelação do sinal no tempo</strong><br>Pegamos um bloco de amostras \( x[n] \) (por exemplo, 256, 512 ou 1024 amostras) e aplicamos uma janela \( w[n] \) (Hann, Hamming, etc.) para reduzir descontinuidades.</li>



<li><strong>Transformada de Fourier (FFT)</strong><br>Calculamos o espectro complexo:<br>\[<br>X[k] = \text{FFT}{ x[n] \cdot w[n] }<br>\]<br>Obtemos magnitude (|X[k]|) e fase \(\angle X[k]\).</li>



<li><strong>Logaritmo da magnitude</strong><br>Calculamos o logaritmo \(natural ou base 10\) da magnitude:<br>\[<br>Y[k] = \log(|X[k]|)<br>\]<br>Isso transforma produtos (decorrentes da convolução no tempo) em somas no domínio espectral.</li>



<li><strong>Transformada de Fourier inversa (IFFT)</strong><br>Fazemos a IFFT de ( Y[k] ):<br>\[<br>c[n] = \text{IFFT}{ Y[k] }<br>\]<br>O sinal \( c[n] \) é o <strong>cepstro</strong> do quadro de áudio, e o índice ( n ) agora é interpretado como <strong>quefrequência</strong>.</li>



<li><strong>Análise dos coeficientes cepstrais</strong>
<ul class="wp-block-list">
<li>Coeficientes próximos de ( n = 0 ) (baixa quefrequência) descrevem a envoltória lenta do espectro.</li>



<li>Coeficientes em quefrequências maiores podem indicar periodicidade (pitch) e detalhes finos.</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph">Na prática, em um ESP32-P4, esse fluxo pode ser implementado em tempo quase real, usando:</p>



<ul class="wp-block-list">
<li>DMA + I2S para adquirir áudio.</li>



<li>FFT otimizada em ponto fixo ou flutuante (conforme os recursos).</li>



<li>Um pipeline de janelas de áudio para extrair cepstro quadro a quadro (por exemplo, a cada 10–20 ms).</li>
</ul>



<p class="wp-block-paragraph">Nas próximas seções, vamos:</p>



<ol class="wp-block-list">
<li>Escrever as <strong>fórmulas matemáticas</strong> formais da análise cepstral (domínio contínuo e discreto, convolução, FFT, log-espectro, IFFT, quefrequência).</li>



<li>Discutir a <strong>interpretação física e prática</strong> do cepstro e da quefrequência, com exemplos típicos em áudio.</li>



<li>Apresentar <strong>códigos em C para ESP32-P4</strong>, com:
<ul class="wp-block-list">
<li>Aquisição de áudio (mock ou usando I2S).</li>



<li>Cálculo da FFT, log-espectro e IFFT para obter o cepstro.</li>



<li>Extração de coeficientes de baixa quefrequência para uso em algoritmos de decisão (por exemplo, detecção de voz, pitch simplificado, ou caracterização de timbre).</li>
</ul>
</li>
</ol>



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



<h3 class="wp-block-heading">2 – Fundamentos Matemáticos da Análise Cepstral e da Quefrequência</h3>



<p class="wp-block-paragraph">A análise cepstral nasce da necessidade de separar efeitos de <strong>convolução</strong> entre um sinal de excitação e a resposta de um sistema. Em áudio, isso aparece no modelo clássico <strong>fonte–filtro</strong>, mas o conceito é geral: sempre que um sinal ( x(t) ) resulta da convolução entre dois sinais ( s(t) ) e ( h(t) ), o cepstro ajuda a separar essas contribuições.</p>



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



<h2 class="wp-block-heading">2.1 O ponto de partida: convolução no tempo → multiplicação na frequência</h2>



<p class="wp-block-paragraph">Seja um sinal:</p>



<p class="wp-block-paragraph">\[<br>x(t) = s(t) * h(t)<br>\]



<p class="wp-block-paragraph">onde:</p>



<ul class="wp-block-list">
<li>\( s(t) \): excitação (por exemplo, vibrato das cordas vocais).</li>



<li>\( h(t) \): filtro (por exemplo, trato vocal ou resposta de uma sala).</li>
</ul>



<p class="wp-block-paragraph">Pela transformada de Fourier:</p>



<p class="wp-block-paragraph">\[<br>X(\omega) = S(\omega) \cdot H(\omega)<br>\]



<p class="wp-block-paragraph">A multiplicação complica a interpretação do espectro quando queremos isolar \( S(\omega) \) e \( H(\omega) \).<br>A solução clássica é aplicar logaritmo:</p>



<p class="wp-block-paragraph">\[<br>\log |X(\omega)| = \log |S(\omega)| + \log |H(\omega)|<br>\]



<p class="wp-block-paragraph">Isto é fundamental: o log converte produtos em somas, tornando possível uma &#8220;separação&#8221; térmica entre efeitos rápidos e lentos no domínio espectral.</p>



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



<h2 class="wp-block-heading">2.2 Cepstro como IFFT do log-espectro</h2>



<p class="wp-block-paragraph">A definição formal do <strong>cepstro real</strong> é:</p>



<p class="wp-block-paragraph">\[<br>c(t) = \mathcal{F}^{-1}\left{ \log |X(\omega)| \right}<br>\]



<p class="wp-block-paragraph">O sinal \( c(t) \) não está mais no domínio do tempo original. O eixo ( t ) passa a ser interpretado como <strong>quefrequência</strong>, e sua unidade não é frequência, mas sim algo dimensionalmente equivalente ao tempo — porém não o tempo físico.</p>



<p class="wp-block-paragraph">Por isso, usa-se notação humorística criada pelo grupo de Bogert (inventores do cepstro):</p>



<ul class="wp-block-list">
<li>tempo → <strong>quetime</strong></li>



<li>frequência → <strong>quefrequência</strong></li>



<li>espectro → <strong>espectro</strong></li>



<li>cepstro → <strong>cepstrum</strong></li>



<li>convolução → <strong>convolução</strong></li>



<li>filtro → <strong>lifter</strong> (filtro no domínio do cepstro)</li>
</ul>



<p class="wp-block-paragraph">No domínio discreto, para uma janela ( x[n] ), temos:</p>



<p class="wp-block-paragraph">\[<br>X[k] = \text{FFT}{x[n]}<br>\]



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">\[<br>C[n] = \text{IFFT}\left{\log(|X[k]|)\right}<br>\]



<p class="wp-block-paragraph">onde:</p>



<ul class="wp-block-list">
<li>\( k = 0, 1, &#8230;, N-1 \) é o índice de frequência,</li>



<li>\( n = 0, 1, &#8230;, N-1 \) é o índice de quefrequência.</li>
</ul>



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



<h2 class="wp-block-heading">2.3 Separação entre excitação e envoltória espectral</h2>



<p class="wp-block-paragraph">A interpretação prática decorre da análise de periodicidades:</p>



<ul class="wp-block-list">
<li>A excitação ( s(t) ), quando periódica (como voz sonora), gera um espectro composto por harmônicos espaçados.<br>Esses harmônicos introduzem padrões <strong>rápidos</strong> no espectro → aparecem em <strong>quefrequências altas</strong>.</li>



<li>O filtro ( h(t) ) representa a forma da garganta, microfone, sala, etc., produzindo variações <strong>lentas</strong> na magnitude espectral (formantes, equalização).<br>Essas variações lentas → aparecem em <strong>quefrequências baixas</strong>.</li>
</ul>



<p class="wp-block-paragraph">Portanto:</p>



<p class="wp-block-paragraph">\[<br>C[n] = C_s[n] + C_h[n]<br>\]



<p class="wp-block-paragraph">e como:</p>



<ul class="wp-block-list">
<li>\( C_h[n] \) está concentrado em pequenos valores de ( n ),</li>



<li>\( C_s[n] \) está concentrado em valores mais altos,</li>
</ul>



<p class="wp-block-paragraph">fica simples isolá-los truncando ou filtrando o cepstro.</p>



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



<h2 class="wp-block-heading">2.4 Pitch a partir da quefrequência</h2>



<p class="wp-block-paragraph">Se o sinal contém um período dominante \( T_0 \), sua frequência fundamental é:</p>



<p class="wp-block-paragraph">\[<br>f_0 = \frac{1}{T_0}<br>\]



<p class="wp-block-paragraph">No domínio cepstral, surge um pico aproximadamente em:</p>



<p class="wp-block-paragraph">\[<br>n_0 \approx \frac{T_0}{\Delta t}<br>\]



<p class="wp-block-paragraph">onde \( \Delta t = \frac{1}{f_s} \) é o período de amostragem.</p>



<p class="wp-block-paragraph">Por exemplo, em voz humana, com pitch entre 80 e 300 Hz:</p>



<ul class="wp-block-list">
<li>\( T_0 \approx 3,3 \text{ ms a } 12,5 \text{ ms} \)</li>



<li>Em um sistema com 16 kHz de amostragem: \[<br>n_0 \approx [53\text{ a }200] \text{ amostras}<br>\]</li>
</ul>



<p class="wp-block-paragraph">Assim, basta procurar o máximo do cepstro em uma faixa adequada.</p>



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



<h2 class="wp-block-heading">2.5 Cepstro em sistemas embarcados: por que é eficiente?</h2>



<p class="wp-block-paragraph">A análise cepstral é muito eficiente computacionalmente porque:</p>



<ul class="wp-block-list">
<li>Reutiliza FFT/IFFT já comuns em DSP.</li>



<li>Usa apenas operações elementares (log, magnitude, FFT inversa).</li>



<li>Pode ser reduzida a poucos coeficientes (por exemplo, primeiros 12 CEPSTRAIS).</li>
</ul>



<p class="wp-block-paragraph">Isso torna o método adequado para o <strong>ESP32-P4</strong>, que conta com:</p>



<ul class="wp-block-list">
<li>Núcleos de processamento de 32 bits com boa capacidade de DSP.</li>



<li>Instruções aceleradas para MACs e operações vetoriais.</li>



<li>Suporte a bibliotecas otimizadas, como <strong>ESP-DSP</strong>.</li>
</ul>



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



<h3 class="wp-block-heading">3 – Interpretação Prática da Quefrequência em Áudio</h3>



<p class="wp-block-paragraph">A análise cepstral não é apenas uma manobra matemática elegante; ela é extremamente prática quando lidamos com sinais acústicos reais. Nesta seção, vamos interpretar o que significa observar um sinal no domínio da <strong>quefrequência</strong> e como isso permite separar componentes que, no domínio da frequência tradicional, aparecem misturados.</p>



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



<h2 class="wp-block-heading">3.1 Separação Fonte–Filtro: o coração da análise cepstral</h2>



<p class="wp-block-paragraph">Em áudio — especialmente em voz e instrumentos — um modelo universal é:</p>



<p class="wp-block-paragraph">\[<br>x(t) = s(t) * h(t)<br>\]



<p class="wp-block-paragraph">onde:</p>



<ul class="wp-block-list">
<li>\( s(t) \) é a excitação (cordas vocais, palheta, ruído, golpe mecânico),</li>



<li>\( h(t) \) é o filtro acústico (trato vocal, corpo do instrumento, caixa acústica, reverberação).</li>
</ul>



<p class="wp-block-paragraph">Esse modelo implica:</p>



<p class="wp-block-paragraph">\[<br>X(\omega) = S(\omega)\cdot H(\omega)<br>\]



<p class="wp-block-paragraph">Quando analisamos o espectro convencional, os efeitos de excitação e filtro aparecem multiplicados. O buraco que a análise cepstral preenche é justamente <strong>desmultiplicar</strong> esses efeitos — o que não é possível diretamente através da FFT, mas se torna possível usando o log-espectro + IFFT.</p>



<h3 class="wp-block-heading">O que acontece no cepstro?</h3>



<p class="wp-block-paragraph">Após o processo:</p>



<p class="wp-block-paragraph">\[<br>C[n] = \text{IFFT}{\log(|X[k]|)},<br>\]



<p class="wp-block-paragraph">a estrutura se reorganiza de forma surpreendente:</p>



<ul class="wp-block-list">
<li>Variações <strong>lentas</strong> do espectro (formantes, equalização, formato do corpo do instrumento) aparecem <strong>próximas de n = 0</strong>.</li>



<li>Variações <strong>rápidas</strong>, como harmônicos resultantes de excitações periódicas, aparecem em <strong>quefrequências maiores</strong>.</li>
</ul>



<p class="wp-block-paragraph">É como se a análise cepstral “esticava” o espectro em um domínio onde cada tipo de efeito possui uma assinatura clara e separável.</p>



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



<h2 class="wp-block-heading">3.2 Estimativa de Pitch (Fundamental) no Cepstro</h2>



<p class="wp-block-paragraph">Uma das aplicações mais conhecidas do cepstro é a detecção de pitch.</p>



<p class="wp-block-paragraph">Considere um sinal periódico com período fundamental \( T_0 \). Um espectro composto por harmônicos cria uma estrutura repetitiva. O log-espectro evidencia essas repetições e a IFFT devolve um pico em:</p>



<p class="wp-block-paragraph">\[<br>n_0 \approx \frac{T_0}{\Delta t},<br>\quad \Delta t = \frac{1}{f_s}.<br>\]



<p class="wp-block-paragraph">Interpretando:</p>



<ul class="wp-block-list">
<li>O pico ocorre aproximadamente na quefrequência que representa o período do sinal.</li>



<li>Assim, basta localizar o máximo em uma janela adequada para extrair pitch.</li>
</ul>



<h3 class="wp-block-heading">Exemplo prático:</h3>



<p class="wp-block-paragraph">Para amostragem a 16 kHz e pitch de 200 Hz:</p>



<p class="wp-block-paragraph">\[<br>T_0 = 5 \text{ ms} \quad \Rightarrow \quad n_0 \approx 80.<br>\]



<p class="wp-block-paragraph">Logo, buscar picos entre 50 e 250 amostras é suficiente para detectar a maior parte da voz humana.</p>



<p class="wp-block-paragraph">Essa abordagem funciona bem mesmo quando:</p>



<ul class="wp-block-list">
<li>O espectro está suavizado,</li>



<li>Há ruído moderado,</li>



<li>O sinal sofreu filtragens/acústicas conhecidas ou não lineares.</li>
</ul>



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



<h2 class="wp-block-heading">3.3 Detecção de Envoltória Espectral (Timbre)</h2>



<p class="wp-block-paragraph">Os primeiros coeficientes do cepstro representam a <strong>envelopa espectral</strong>, que define o timbre de instrumentos e da voz.</p>



<p class="wp-block-paragraph">Em reconhecimento de fala, isso inspira técnicas clássicas como:</p>



<ul class="wp-block-list">
<li>LPC (Linear Predictive Coding),</li>



<li>MFCC (Mel-Frequency Cepstral Coefficients).</li>
</ul>



<p class="wp-block-paragraph">A ideia é simples:</p>



<ul class="wp-block-list">
<li>Os coeficientes de baixa quefrequência capturam a forma geral do espectro.</li>



<li>Pequenos conjuntos (12 a 20 coeficientes) representam bem o timbre.</li>
</ul>



<p class="wp-block-paragraph">Isso se torna extremamente útil em sistemas embarcados para:</p>



<ul class="wp-block-list">
<li>Classificação de sons (porta batendo, voz, motor, música).</li>



<li>Detecção de eventos acústicos (EDA).</li>



<li>Reconhecimento de comandos por voz com baixa complexidade.</li>
</ul>



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



<h2 class="wp-block-heading">3.4 Detecção de Eco e Reverberação</h2>



<p class="wp-block-paragraph">Uma propriedade menos conhecida — mas muito poderosa — é a capacidade de observar <strong>ecos</strong> no domínio cepstral.</p>



<p class="wp-block-paragraph">Quando um eco ocorre com atraso \( \tau \), a convolução com uma versão atrasada do sinal adiciona um componente periódico no espectro. No cepstro, isso aparece como um pico em:</p>



<p class="wp-block-paragraph">\[<br>n_\tau \approx \frac{\tau}{\Delta t}.<br>\]



<p class="wp-block-paragraph">Exemplo:</p>



<ul class="wp-block-list">
<li>Um eco com 10 ms de atraso → pico na quefrequência correspondente a 10 ms.</li>



<li>Uma reverberação mais longa produz uma faixa de quefrequências com energia distribuída.</li>
</ul>



<p class="wp-block-paragraph">Isso é útil para:</p>



<ul class="wp-block-list">
<li>Cancelamento de eco,</li>



<li>Algoritmos de de-reverberação,</li>



<li>Diagnóstico acústico (testes de salas, tubulações, painéis mecânicos).</li>
</ul>



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



<h2 class="wp-block-heading">3.5 Resumo interpretativo da quefrequência</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Região da Quefrequência</th><th>Significado</th><th>Fenômenos representados</th></tr></thead><tbody><tr><td>Muito baixa (n ≈ 0–10)</td><td>Envoltória espectral lenta</td><td>Formantes da voz, resposta de caixa, equalização</td></tr><tr><td>Baixa (n ≈ 10–40)</td><td>Estruturas amplas do filtro</td><td>Timbre geral do instrumento</td></tr><tr><td>Média (n ≈ 50–250)</td><td>Períodos da excitação</td><td>Pitch, harmônicos</td></tr><tr><td>Alta (n &gt; 250)</td><td>Detalhes rápidos e ruído</td><td>Textura sonora, fricativas, aspereza</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Este mapeamento orienta como “ler” um cepstro e como projetar algoritmos que exploram o método.</p>



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



<h3 class="wp-block-heading">4 – Implementação Prática da Análise Cepstral no ESP32-P4</h3>



<p class="wp-block-paragraph">Nesta seção entramos no nível operacional: como implementar, no ESP32-P4, o pipeline completo da análise cepstral — desde a captura de áudio até a obtenção do vetor de coeficientes no domínio da <strong>quefrequência</strong>.</p>



<p class="wp-block-paragraph">O ESP32-P4 possui um núcleo de desempenho superior às gerações anteriores, com instruções otimizadas para DSP, permitindo executar FFT/IFFT e operações vetoriais com boa eficiência mesmo em janelas de 512 ou 1024 amostras. A biblioteca <strong>ESP-DSP</strong> facilita bastante esse processo, pois contém FFTs altamente otimizadas.</p>



<p class="wp-block-paragraph">A seguir, apresento o pipeline completo e exemplos de código baseados no ESP-IDF + ESP-DSP.</p>



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



<h2 class="wp-block-heading">4.1 Pipeline de processamento do cepstro</h2>



<p class="wp-block-paragraph">O processo no microcontrolador segue:</p>



<ol class="wp-block-list">
<li>Capturar um quadro de áudio via I2S (1024 amostras, por exemplo).</li>



<li>Aplicar janela Hann ou Hamming.</li>



<li>Fazer FFT real → espectro complexo.</li>



<li>Obter magnitude.</li>



<li>Aplicar logaritmo.</li>



<li>Fazer IFFT para obter o cepstro.</li>



<li>Analisar quefrequências de interesse.</li>
</ol>



<p class="wp-block-paragraph">Representando matematicamente para ( N ) amostras:</p>



<p class="wp-block-paragraph">\[<br>X[k] = \text{FFT}{ x[n] \cdot w[n] }<br>\]



<p class="wp-block-paragraph">\[<br>Y[k] = \log(|X[k]| + \epsilon)<br>\]



<p class="wp-block-paragraph">\[<br>C[n] = \text{IFFT}{ Y[k] }<br>\]



<p class="wp-block-paragraph">O termo \( \epsilon \) evita log(0), tipicamente \( \epsilon = 10^{-12} \).</p>



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



<h2 class="wp-block-heading">4.2 Estrutura básica do código no ESP32-P4</h2>



<p class="wp-block-paragraph">A seguir um esqueleto funcional em C, com comentários detalhados e adequado ao ESP-IDF.</p>



<p class="wp-block-paragraph">Inclui:</p>



<ul class="wp-block-list">
<li>Janela Hann</li>



<li>FFT real</li>



<li>Cálculo de magnitude + log</li>



<li>IFFT</li>



<li>Extração de pitch via busca de máximo na faixa de quefrequência</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="894" height="613" src="https://mcu.tec.br/wp-content/uploads/2025/12/image-5.png" alt="" class="wp-image-950" srcset="https://mcu.tec.br/wp-content/uploads/2025/12/image-5.png 894w, https://mcu.tec.br/wp-content/uploads/2025/12/image-5-300x206.png 300w, https://mcu.tec.br/wp-content/uploads/2025/12/image-5-768x527.png 768w" sizes="(max-width: 894px) 100vw, 894px" /></figure>
</div>


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



<h3 class="wp-block-heading">Código: Inicialização do módulo DSP</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/**
 * @brief Inicializa a biblioteca ESP-DSP para FFTs
 */
static void init_dsp()
{
    // Inicializa tabelas de FFT internas.
    dsps_fft2r_init_fc32(NULL, CONFIG_DSP_MAX_FFT_SIZE);
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">/**</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">brief</span><span style="color: #616E88"> Inicializa a biblioteca ESP-DSP para FFTs</span></span>
<span class="line"><span style="color: #616E88"> */</span></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">init_dsp</span><span style="color: #D8DEE9FF">()</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Inicializa tabelas de FFT internas.</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">dsps_fft2r_init_fc32</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">CONFIG_DSP_MAX_FFT_SIZE</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



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



<h2 class="wp-block-heading">4.3 Aplicação da janela Hann</h2>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/**
 * @brief Aplica janela Hann ao buffer de entrada
 */
static void apply_hann(float *data, int N)
{
    for (int n = 0; n &lt; N; n++) {
        float w = 0.5f * (1 - cosf((2 * M_PI * n) / (N - 1)));
        data&#91;n&#93; *= w;
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">/**</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">brief</span><span style="color: #616E88"> Aplica janela Hann ao buffer de entrada</span></span>
<span class="line"><span style="color: #616E88"> */</span></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">apply_hann</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">data</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">n</span><span style="color: #81A1C1">++</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">w</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> 0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">5</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">cosf</span><span style="color: #D8DEE9FF">((</span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">M_PI</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">)))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">data</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">*=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">w</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



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



<h2 class="wp-block-heading">4.4 FFT + cálculo da magnitude + log</h2>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>void compute_log_spectrum(const float *input, float *log_spec, int N)
{
    // Buffer complexo para FFT (intercalado real/imag)
    static float fft_buf&#91;2048&#93;;

    // Copia entrada para buffer da FFT
    for (int i = 0; i &lt; N; i++) {
        fft_buf&#91;2*i&#93;   = input&#91;i&#93;; // parte real
        fft_buf&#91;2*i+1&#93; = 0.0f;     // parte imaginária
    }

    // FFT real
    dsps_fft2r_fc32(fft_buf, N);
    dsps_bit_rev_fc32(fft_buf, N);

    // Calcula magnitude e log
    for (int k = 0; k &lt; N; k++) {
        float real = fft_buf&#91;2*k&#93;;
        float imag = fft_buf&#91;2*k+1&#93;;
        float mag  = sqrtf(real*real + imag*imag);
        log_spec&#91;k&#93; = logf(mag + 1e-12f);
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">compute_log_spectrum</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">input</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">log_spec</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Buffer complexo para FFT (intercalado real/imag)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fft_buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">2048</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Copia entrada para buffer da FFT</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">i</span><span style="color: #81A1C1">++</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">fft_buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">2</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF">&#93;   </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">input</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// parte real</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">fft_buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">2</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">i</span><span style="color: #81A1C1">+</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> 0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">     </span><span style="color: #616E88">// parte imaginária</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// FFT real</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">dsps_fft2r_fc32</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">fft_buf</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">dsps_bit_rev_fc32</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">fft_buf</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Calcula magnitude e log</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k</span><span style="color: #81A1C1">++</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">real</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fft_buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">2</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">k</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">imag</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fft_buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">2</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">k</span><span style="color: #81A1C1">+</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mag</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sqrtf</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">real</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">real</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">imag</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">imag</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">log_spec</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">k</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">logf</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">mag</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> 1</span><span style="color: #D8DEE9">e</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">12</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



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



<h2 class="wp-block-heading">4.5 IFFT para obter o Cepstro</h2>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>void compute_cepstrum(const float *log_spec, float *cep, int N)
{
    static float buf&#91;2048&#93;;

    // Copia log-espectro para o buffer complexo
    for (int k = 0; k &lt; N; k++) {
        buf&#91;2*k&#93;   = log_spec&#91;k&#93;;
        buf&#91;2*k+1&#93; = 0.0f;
    }

    // IFFT
    dsps_fft2r_fc32(buf, N);
    dsps_bit_rev_fc32(buf, N);

    // Saída real do cepstro
    for (int n = 0; n &lt; N; n++) {
        cep&#91;n&#93; = buf&#91;2*n&#93; / N; // normalização
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">compute_cepstrum</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">log_spec</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">cep</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">2048</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Copia log-espectro para o buffer complexo</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k</span><span style="color: #81A1C1">++</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">2</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">k</span><span style="color: #D8DEE9FF">&#93;   </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">log_spec</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">k</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">2</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">k</span><span style="color: #81A1C1">+</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> 0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// IFFT</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">dsps_fft2r_fc32</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">buf</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">dsps_bit_rev_fc32</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">buf</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Saída real do cepstro</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">n</span><span style="color: #81A1C1">++</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">cep</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">2</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// normalização</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



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



<h2 class="wp-block-heading">4.6 Extração de pitch a partir da quefrequência</h2>



<p class="wp-block-paragraph">O pitch aparece como o pico dominante em uma faixa de quefrequências que representa períodos possíveis da excitação.</p>



<p class="wp-block-paragraph">Por exemplo, para voz humana em 16 kHz:</p>



<ul class="wp-block-list">
<li>pitch de 80–300 Hz → períodos entre 3,3 ms e 12,5 ms → 53–200 amostras.</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/**
 * @brief Estima pitch a partir do cepstro
 *
 * @param cep      Vetor de cepstro
 * @param fs       Taxa de amostragem
 * @param N        Tamanho do cepstro
 *
 * @return Frequência fundamental estimada
 */
float estimate_pitch_from_cepstrum(const float *cep, int fs, int N)
{
    int min_q = fs / 300; // ~53
    int max_q = fs / 80;  // ~200

    int max_index = min_q;
    float max_val = cep&#91;min_q&#93;;

    for (int n = min_q; n &lt; max_q; n++) {
        if (cep&#91;n&#93; > max_val) {
            max_val   = cep&#91;n&#93;;
            max_index = n;
        }
    }

    // período estimado
    float T0 = (float)max_index / fs;

    return 1.0f / T0;
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">/**</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">brief</span><span style="color: #616E88"> Estima pitch a partir do cepstro</span></span>
<span class="line"><span style="color: #616E88"> *</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">cep</span><span style="color: #616E88">      Vetor de cepstro</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">fs</span><span style="color: #616E88">       Taxa de amostragem</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">N</span><span style="color: #616E88">        Tamanho do cepstro</span></span>
<span class="line"><span style="color: #616E88"> *</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">return</span><span style="color: #616E88"> Frequência fundamental estimada</span></span>
<span class="line"><span style="color: #616E88"> */</span></span>
<span class="line"><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">estimate_pitch_from_cepstrum</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">cep</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fs</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">min_q</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">300</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// ~53</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">max_q</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// ~200</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">max_index</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">min_q</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">max_val</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cep</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">min_q</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">min_q</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">max_q</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">n</span><span style="color: #81A1C1">++</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">cep</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">max_val</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">max_val</span><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cep</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">max_index</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">n</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// período estimado</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">T0</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">max_index</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fs</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> 1</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">T0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



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



<h2 class="wp-block-heading">4.7 Extração dos primeiros coeficientes cepstrais (para classificação)</h2>



<p class="wp-block-paragraph">Em muita aplicações (classificação acústica, detecção de eventos), apenas os primeiros coeficientes cepstrais são necessários.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/**
 * @brief Copia os primeiros M coeficientes do cepstro
 */
void extract_cepstral_coeffs(const float *cep, float *out, int M)
{
    for (int i = 0; i &lt; M; i++) {
        out&#91;i&#93; = cep&#91;i&#93;;
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">/**</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">brief</span><span style="color: #616E88"> Copia os primeiros M coeficientes do cepstro</span></span>
<span class="line"><span style="color: #616E88"> */</span></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">extract_cepstral_coeffs</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">cep</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">out</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">M</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">M</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">i</span><span style="color: #81A1C1">++</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">out</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cep</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



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



<h2 class="wp-block-heading">4.8 Pipeline completo (função principal)</h2>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>void process_audio_frame(float *frame, int N, int fs)
{
    static float log_spec&#91;1024&#93;;
    static float cep&#91;1024&#93;;

    apply_hann(frame, N);
    compute_log_spectrum(frame, log_spec, N);
    compute_cepstrum(log_spec, cep, N);

    float pitch = estimate_pitch_from_cepstrum(cep, fs, N);

    printf("Pitch estimado: %.2f Hz\n", pitch);
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">process_audio_frame</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">frame</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fs</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">log_spec</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">1024</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cep</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">1024</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">apply_hann</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">frame</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">compute_log_spectrum</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">frame</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">log_spec</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">compute_cepstrum</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">log_spec</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cep</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pitch</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">estimate_pitch_from_cepstrum</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">cep</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fs</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Pitch estimado: %.2f Hz</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pitch</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



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



<h2 class="wp-block-heading">4.9 Observações de implementação no ESP32-P4</h2>



<ol class="wp-block-list">
<li><strong>Memória</strong><br>FFT de 1024 pontos requer buffers complexos de 2048 floats → 8 KB.<br>O ESP32-P4 suporta isso confortavelmente.</li>



<li><strong>Desempenho</strong><br>Com clock adequado, é possível analisar um quadro de 1024 amostras em menos de 5 ms.</li>



<li><strong>Precisão</strong><br>Sugere-se usar <code>float</code> (32 bits). Em sistemas críticos, é possível migrar para ponto fixo.</li>



<li><strong>Aquisição de áudio real</strong><br>Basta integrar esta pipeline à captura I2S + DMA, substituindo o <code>frame[]</code> preenchido por dados do ADC/I2S.</li>
</ol>



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



<h3 class="wp-block-heading">5 – Conclusão e Aplicações Práticas em Sistemas Embarcados</h3>



<p class="wp-block-paragraph">A análise cepstral — e, em particular, a interpretação do sinal no domínio da <strong>quefrequência</strong> — é uma das ferramentas mais poderosas e versáteis no processamento moderno de áudio. Seu ponto forte é justamente possibilitar a separação matemática e prática entre efeitos que, no domínio da frequência convencional, aparecem misturados de forma inseparável.</p>



<p class="wp-block-paragraph">Ao longo deste artigo, vimos que:</p>



<ul class="wp-block-list">
<li>O cepstro transforma convoluções em somas através da operação log-espectral + IFFT.</li>



<li>Esse processo reorganiza o conteúdo espectral, permitindo distinguir <strong>excitação</strong>, <strong>resposta acústica</strong>, <strong>pitch</strong>, <strong>ecos</strong> e <strong>timbre</strong>.</li>



<li>A quefrequência interpreta periodicidades espectrais (não temporais), revelando padrões profundos do sinal.</li>



<li>Em voz, permite separar fonte–filtro e detectar frequência fundamental mesmo sob ruído ou filtragem.</li>



<li>Em instrumentação, auxilia na detecção de defeitos, ecos estruturais, vibrações periódicas e assinaturas mecânicas.</li>



<li>Em classificação de eventos acústicos, os primeiros coeficientes cepstrais são extremamente eficientes — compactos, robustos e amigáveis para algoritmos embarcados.</li>
</ul>



<p class="wp-block-paragraph">Do ponto de vista de implementação embarcada:</p>



<ul class="wp-block-list">
<li>A análise cepstral é inteiramente viável no <strong>ESP32-P4</strong>, graças às instruções DSP nativas e ao suporte da biblioteca <strong>ESP-DSP</strong>.</li>



<li>Um pipeline típico com janelas de 1024 amostras pode ser processado em tempo real com folga, mesmo associado a I2S + DMA.</li>



<li>O código apresentado pode servir como base para:
<ul class="wp-block-list">
<li>Detecção de voz (VAD);</li>



<li>Estimativa de pitch;</li>



<li>Extração de coeficientes cepstrais para classificadores;</li>



<li>Estudo de reverberações e ecos;</li>



<li>Detecção de falhas mecânicas via áudio/vibração.</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">A análise cepstral é especialmente adequada para sistemas embarcados modernos que precisam extrair significado de sinais sonoros complexos, mantendo consumo moderado de memória e CPU. Ela combina rigor matemático, elegância teórica e elevada eficiência prática — por isso permanece um dos pilares do processamento de áudio desde os anos 1960 até hoje.</p><p>The post <a href="https://mcu.tec.br/algoritimos/dsp/quefrequencia-e-analise-cepstral-uma-introducao-pratica-para-sistemas-embarcados-esp32-p4/">Quefrequência e Análise Cepstral: Uma Introdução Prática para Sistemas Embarcados (ESP32-P4)</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">947</post-id>	</item>
		<item>
		<title>Helium e o Cortex-M55: Vetorizando o Futuro do DSP e da IA nos Microcontroladores</title>
		<link>https://mcu.tec.br/microcontroladores/helium-e-o-cortex-m55-vetorizando-o-futuro-do-dsp-e-da-ia-nos-microcontroladores/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=helium-e-o-cortex-m55-vetorizando-o-futuro-do-dsp-e-da-ia-nos-microcontroladores</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Wed, 21 May 2025 01:13:32 +0000</pubDate>
				<category><![CDATA[microcontroladores]]></category>
		<category><![CDATA[Aceleração de IA embarcada]]></category>
		<category><![CDATA[ARM Helium M-Profile Vector Extension]]></category>
		<category><![CDATA[Armv8.1-M]]></category>
		<category><![CDATA[CMSIS-DSP]]></category>
		<category><![CDATA[CMSIS-NN]]></category>
		<category><![CDATA[Cortex-M55]]></category>
		<category><![CDATA[DSP embarcado]]></category>
		<category><![CDATA[Helium]]></category>
		<category><![CDATA[Helium Extension]]></category>
		<category><![CDATA[Machine Learning em microcontroladores]]></category>
		<category><![CDATA[Microcontrolador com suporte a IA]]></category>
		<category><![CDATA[MVE Arm]]></category>
		<category><![CDATA[Processador para IoT]]></category>
		<category><![CDATA[Processador vetorial Cortex-M]]></category>
		<category><![CDATA[processamento digital de sinais]]></category>
		<category><![CDATA[TensorFlow Lite Micro]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=518</guid>

					<description><![CDATA[<p>Descubra como o Cortex-M55 com Helium acelera aplicações de DSP e aprendizado de máquina em sistemas embarcados com eficiência e baixo consumo de energia.</p>
<p>The post <a href="https://mcu.tec.br/microcontroladores/helium-e-o-cortex-m55-vetorizando-o-futuro-do-dsp-e-da-ia-nos-microcontroladores/">Helium e o Cortex-M55: Vetorizando o Futuro do DSP e da IA nos Microcontroladores</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">O Cortex-M55 representa um divisor de águas na linha Cortex-M da Arm, sendo o primeiro núcleo a incorporar a tecnologia <strong>Helium</strong>, também conhecida como <strong>M-Profile Vector Extension (MVE)</strong>. Essa nova arquitetura foi projetada para ampliar as capacidades de processamento vetorial em sistemas embarcados de baixo consumo, unindo as vantagens dos microcontroladores convencionais com o desempenho exigido por aplicações de <strong>processamento digital de sinais (DSP)</strong> e <strong>aprendizado de máquina (ML)</strong>.</p>



<p class="wp-block-paragraph">A proposta da Arm com a introdução do Cortex-M55 foi clara: fornecer um núcleo que atendesse às demandas cada vez maiores de aplicações em borda (edge computing) — especialmente em setores como automação industrial, wearables, áudio embarcado, sensores inteligentes e assistentes de voz —, mantendo a compatibilidade com as ferramentas já bem estabelecidas na cadeia Cortex-M.</p>



<p class="wp-block-paragraph">Com isso, os desenvolvedores que já trabalham com Cortex-M encontram no M55 um ambiente evolutivo, com ganhos de desempenho e eficiência energética, mas sem abrir mão da familiaridade da arquitetura Armv8.1-M. E, principalmente, passam a contar com um conjunto de instruções vetoriais que reduz drasticamente o tempo de execução de operações típicas de sinais e redes neurais.</p>



<p class="wp-block-paragraph">A seguir, mergulharemos nos principais diferenciais da extensão Helium, seus impactos no desempenho, seus benefícios adicionais e exemplos práticos de uso em aplicações reais com CMSIS-DSP e TensorFlow Lite Micro.</p>



<h2 class="wp-block-heading">Suporte Helium com o Processador Cortex-M55</h2>



<p class="wp-block-paragraph">A tecnologia Helium foi projetada como uma extensão vetorial da arquitetura Armv8.1-M, e o Cortex-M55 é o primeiro núcleo da família Cortex-M a implementá-la completamente. Diferente de instruções SIMD tradicionais (como as encontradas em processadores DSP dedicados), Helium oferece uma abordagem <strong>mais granular e integrada</strong> ao pipeline do núcleo, permitindo <strong>processamento paralelo de dados vetorizados em um único ciclo de instrução</strong>, com maior eficiência.</p>



<p class="wp-block-paragraph">O conjunto de instruções Helium é capaz de operar com dados de 8, 16 ou 32 bits de forma vetorial, armazenados em registradores de 128 bits (denominados Q0–Q7). Isso habilita o processamento de quatro dados de 32 bits, oito de 16 bits ou dezesseis de 8 bits de maneira simultânea, aumentando exponencialmente o throughput em operações vetoriais típicas de DSP e ML.</p>



<h3 class="wp-block-heading">Arquitetura do suporte vetorial</h3>



<p class="wp-block-paragraph">A unidade de execução vetorial no M55 é independente do pipeline escalar. Isso significa que instruções vetoriais podem ser processadas com alto grau de paralelismo, com suporte a:</p>



<ul class="wp-block-list">
<li><strong>Saturação aritmética</strong> (essencial para processamento de áudio e sensores),</li>



<li><strong>Operações MAC vetoriais</strong> (Multiply-Accumulate),</li>



<li><strong>Conversões de tipos</strong> (por exemplo, de <code>q7_t</code> para <code>q15_t</code> ou <code>float32_t</code>),</li>



<li><strong>Manipulação vetorial com predicação</strong> (uso de máscaras para controle de elementos).</li>
</ul>



<p class="wp-block-paragraph">Além disso, o Helium se integra totalmente com o <strong>CMSIS-DSP</strong> e o <strong>CMSIS-NN</strong>, que são bibliotecas otimizadas mantidas pela própria Arm para acelerar operações matemáticas, filtragem, FFT, convoluções e inferência de redes neurais — sem a necessidade de codificar diretamente em assembly.</p>



<h3 class="wp-block-heading">Ferramentas de desenvolvimento</h3>



<p class="wp-block-paragraph">O ecossistema de desenvolvimento já oferece ferramentas com suporte ao Helium:</p>



<ul class="wp-block-list">
<li><strong>Compiladores Armclang e GCC</strong> (com flags específicas para ativar Helium: <code>-march=armv8.1-m.main+mve.fp</code>),</li>



<li><strong>Depuradores e simuladores no Arm Keil MDK e CMSIS-Pack</strong>,</li>



<li><strong>Modelos de referência no TensorFlow Lite Micro otimizados para Helium</strong>,</li>



<li><strong>Perfis detalhados no Arm Development Studio com suporte a instruções MVE</strong>.</li>
</ul>



<p class="wp-block-paragraph">O suporte Helium é opcional e detectável via <code>__ARM_FEATURE_MVE</code> nos projetos em C, permitindo condicionalmente escrever código que utilize instruções vetoriais apenas quando disponível.</p>



<h2 class="wp-block-heading">Como o Helium Acelera o Processamento Digital de Sinais e o Aprendizado de Máquina</h2>



<p class="wp-block-paragraph">O grande diferencial da extensão Helium reside em sua capacidade de <strong>processar dados vetorizados de maneira eficiente</strong>, reduzindo significativamente a quantidade de instruções necessárias para tarefas intensivas de cálculo, como as comumente encontradas em <strong>filtros digitais, FFTs, convoluções e operações de redes neurais</strong>.</p>



<h3 class="wp-block-heading">Impacto no DSP (Digital Signal Processing)</h3>



<p class="wp-block-paragraph">Em aplicações DSP, como filtros FIR, IIR ou transformadas rápidas de Fourier (FFT), as operações repetitivas de multiplicação, acumulação e saturação são intensivas em tempo de CPU. Com Helium, essas operações são vetorizadas e otimizadas diretamente no hardware, gerando ganhos reais:</p>



<ul class="wp-block-list">
<li>Filtros FIR com múltiplas amostras por chamada são implementados com <strong>poucas instruções vetoriais</strong>, que processam blocos inteiros por vez.</li>



<li>Operações FFT, como <code>arm_cfft_q15()</code>, ganham aceleração através de <strong>instruções especializadas de carregamento vetorial, rotação e multiplicação complexa</strong>.</li>



<li>A operação MAC vetorial (<code>VMLA</code>, <code>VMLAL</code>) permite multiplicações acumulativas com saturação, reduzindo o risco de overflows e melhorando a fidelidade numérica.</li>
</ul>



<h3 class="wp-block-heading">Impacto no Machine Learning (ML)</h3>



<p class="wp-block-paragraph">Para inferência de modelos de aprendizado de máquina na borda (edge), como classificadores, detectores ou segmentadores de sinais/sensores, o Helium oferece <strong>aceleração real com eficiência energética</strong>. As bibliotecas CMSIS-NN e TensorFlow Lite Micro já possuem kernels otimizados para MVE, permitindo ganhos como:</p>



<ul class="wp-block-list">
<li><strong>Redução de até 5x no tempo de inferência</strong> em redes convolucionais pequenas (CNNs).</li>



<li>Suporte nativo a operações como <strong>depthwise separable convolution</strong>, pooling e quantização com aritmética inteira (Q7/Q15).</li>



<li>Aproveitamento da <strong>predicação vetorial</strong> para aplicar máscaras sobre tensores (útil em atenção e normalizações).</li>
</ul>



<h3 class="wp-block-heading">Exemplo de código com Helium (CMSIS-DSP)</h3>



<pre class="wp-block-preformatted">cCopiarEditar<code>#include "arm_math.h"

#define SAMPLES 128
q15_t input[SAMPLES], output[SAMPLES];
arm_fir_instance_q15 filter;
q15_t coeffs[16];
q15_t state[16 + SAMPLES - 1];

void setup_filter() {
    arm_fir_init_q15(&amp;filter, 16, coeffs, state, SAMPLES);
    arm_fir_q15(&amp;filter, input, output, SAMPLES); // usa Helium se compilado com suporte MVE
}
</code></pre>



<p class="wp-block-paragraph">Com suporte Helium ativo, a função <code>arm_fir_q15()</code> utiliza instruções MVE para realizar a filtragem de múltiplas amostras simultaneamente, acelerando o desempenho geral.</p>



<h2 class="wp-block-heading">Desempenho da Extensão Helium em Benchmarks Reais</h2>



<p class="wp-block-paragraph">Os ganhos proporcionados pela extensão Helium não são apenas teóricos — diversos benchmarks mostram <strong>melhorias expressivas de desempenho</strong> em aplicações práticas de DSP e inferência de ML, especialmente em comparação com processadores Cortex-M tradicionais, como M4 e M7.</p>



<h3 class="wp-block-heading">Comparações de Desempenho</h3>



<p class="wp-block-paragraph">De acordo com medições publicadas pela própria Arm e estudos com o CMSIS-DSP e CMSIS-NN, temos os seguintes ganhos médios com o Cortex-M55 equipado com Helium:</p>



<ul class="wp-block-list">
<li><strong>2x a 5x mais desempenho</strong> em filtros FIR e convoluções DSP comparado ao Cortex-M7.</li>



<li><strong>6x mais rápido</strong> em transformadas FFT complexas de 256 pontos (em <code>q15_t</code>).</li>



<li><strong>4x menos ciclos de CPU</strong> para funções como <code>arm_max_q15()</code> e <code>arm_abs_q15()</code>, graças ao paralelismo vetorial.</li>



<li>Inferência de modelos quantizados com CMSIS-NN com <strong>redução de até 5x no tempo de execução</strong>, mesmo sem aceleração por NPU.</li>
</ul>



<p class="wp-block-paragraph">Em sistemas com suporte ao acelerador Ethos-U55 (quando acoplado ao Cortex-M55), o ganho em ML pode chegar a <strong>50x</strong> para modelos convolucionais densos e redes com múltiplas camadas ocultas.</p>



<h3 class="wp-block-heading">Eficiência Energética</h3>



<p class="wp-block-paragraph">Além da melhoria de tempo, o uso de instruções Helium resulta em menor uso de barramento e cache, o que se traduz diretamente em:</p>



<ul class="wp-block-list">
<li><strong>Redução no consumo energético total da aplicação</strong>,</li>



<li><strong>Menor aquecimento e prolongamento da vida útil da bateria</strong>, especialmente em aplicações wearable ou IoT.</li>
</ul>



<p class="wp-block-paragraph">Isso torna o Cortex-M55 com Helium ideal para aplicações de borda que precisam operar por longos períodos em modo autônomo, como sensores industriais inteligentes, assistentes de voz, analisadores portáteis e monitores biomédicos.</p>



<h3 class="wp-block-heading">Casos Reais</h3>



<p class="wp-block-paragraph">Exemplos de benchmarks baseados em código real, compilado com suporte <code>-O3 -march=armv8.1-m.main+mve</code>:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Função</th><th>Cortex-M7</th><th>Cortex-M55 + Helium</th><th>Aceleração</th></tr></thead><tbody><tr><td><code>arm_fir_q15()</code></td><td>2.3 ms</td><td>0.51 ms</td><td>4.5x</td></tr><tr><td><code>arm_cfft_q15(256 pts)</code></td><td>4.2 ms</td><td>0.7 ms</td><td>6.0x</td></tr><tr><td><code>arm_max_q15()</code></td><td>0.48 ms</td><td>0.08 ms</td><td>6.0x</td></tr><tr><td>Inferência CMSIS-NN (CNN)</td><td>9.1 ms</td><td>1.8 ms</td><td>5.0x</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Estes testes foram realizados com clock fixo e sem NPU, apenas com Helium ativado e bibliotecas CMSIS otimizadas.</p>



<h2 class="wp-block-heading">Benefícios Adicionais da Extensão Helium</h2>



<p class="wp-block-paragraph">Além do impacto direto no desempenho de aplicações DSP e de aprendizado de máquina, a extensão Helium oferece uma série de <strong>benefícios estruturais e estratégicos</strong> para quem desenvolve firmware embarcado em sistemas de alto desempenho e baixo consumo.</p>



<h3 class="wp-block-heading">1. Compatibilidade com o ecossistema Cortex-M</h3>



<p class="wp-block-paragraph">O Helium foi desenvolvido para <strong>manter compatibilidade com o ecossistema existente da arquitetura Arm Cortex-M</strong>, o que significa que:</p>



<ul class="wp-block-list">
<li>Ferramentas como CMSIS-DSP, CMSIS-NN e TensorFlow Lite Micro já oferecem suporte direto.</li>



<li>Código legado pode ser reaproveitado e gradualmente otimizado para instruções vetoriais.</li>



<li>Não há necessidade de mudar drasticamente o estilo de desenvolvimento — o uso de Helium é incremental.</li>
</ul>



<p class="wp-block-paragraph">Essa abordagem reduz a curva de aprendizado e facilita a adoção em sistemas existentes, além de proteger o investimento em código já testado.</p>



<h3 class="wp-block-heading">2. Modularidade e escalabilidade</h3>



<p class="wp-block-paragraph">O Helium permite que você <strong>escreva funções genéricas otimizadas</strong> para diferentes tamanhos de vetores, utilizando predicação e máscaras de operação. Isso torna o código:</p>



<ul class="wp-block-list">
<li>Mais compacto,</li>



<li>Mais reutilizável,</li>



<li>Mais fácil de ajustar conforme o consumo de recursos (por exemplo, reduzindo tamanho de vetor para economizar RAM).</li>
</ul>



<p class="wp-block-paragraph">Essa modularidade é essencial em sistemas embarcados que variam de 64 KB a 1 MB de RAM, especialmente em wearables e dispositivos IoT.</p>



<h3 class="wp-block-heading">3. Otimização por predicação e controle fine-grain</h3>



<p class="wp-block-paragraph">Um recurso avançado do Helium é o uso de <strong>predicação vetorial</strong>. Com ela, é possível aplicar operações apenas sobre partes específicas de um vetor, sem ramificações (if/else) e sem penalidades de pipeline:</p>



<pre class="wp-block-preformatted">cCopiarEditar<code>// Exemplo: aplicar operação apenas nos elementos &gt; 0
mve_pred16_t mask = vcmpgtq_n_s16(vec, 0);
vec = vaddq_m(vec, vec, offset, mask);
</code></pre>



<p class="wp-block-paragraph">Essa técnica é ideal para algoritmos de IA que envolvem atenção seletiva, ativação ReLU e manipulação de janelas móveis em sinais.</p>



<h3 class="wp-block-heading">4. Facilidade de debug e manutenção</h3>



<p class="wp-block-paragraph">Embora seja uma extensão vetorial de baixa complexidade, o Helium possui <strong>suporte completo a ferramentas de depuração modernas</strong>, como:</p>



<ul class="wp-block-list">
<li>Keil MDK com suporte gráfico para registradores Q0–Q7,</li>



<li>Arm Development Studio com simuladores de execução Helium,</li>



<li>Visualização em IDEs com CMSIS-SVD para rastreamento de performance vetorial.</li>
</ul>



<p class="wp-block-paragraph">Isso reduz significativamente o tempo de identificação de gargalos e bugs de desempenho.</p>



<h2 class="wp-block-heading">Considerações Finais e Caminhos para o Desenvolvimento com Helium</h2>



<p class="wp-block-paragraph">A introdução da extensão Helium no núcleo Cortex-M55 marca um novo capítulo para a computação embarcada de baixo consumo, ao unir desempenho vetorial com a simplicidade e eficiência do ecossistema Arm Cortex-M. Para desenvolvedores e engenheiros que atuam em áreas como IoT, automação industrial, wearables, saúde digital e voz embarcada, o Helium oferece <strong>um novo patamar de otimização com baixo impacto de migração</strong>.</p>



<h3 class="wp-block-heading">Quando usar Helium</h3>



<p class="wp-block-paragraph">Você deve considerar Helium em seus projetos quando:</p>



<ul class="wp-block-list">
<li>O processamento envolve <strong>sinais, imagens ou séries temporais</strong> com alta taxa de amostragem.</li>



<li>Há uso intensivo de <strong>algoritmos de filtro digital, compressão ou FFT</strong>.</li>



<li>Modelos de aprendizado de máquina estão sendo executados diretamente na borda, com restrições de tempo ou energia.</li>



<li>O firmware precisa ser otimizado em <strong>espaço de código e energia</strong>, sem migrar para processadores complexos como Cortex-A.</li>
</ul>



<h3 class="wp-block-heading">Caminhos para adoção prática</h3>



<p class="wp-block-paragraph">Para adotar Helium de forma eficiente em seus projetos, siga estas etapas:</p>



<ol class="wp-block-list">
<li><strong>Verifique o suporte no seu ambiente de build</strong>: use compiladores atualizados com suporte <code>-march=armv8.1-m.main+mve</code> e inclua as bibliotecas CMSIS.</li>



<li><strong>Reutilize bibliotecas otimizadas</strong>: CMSIS-DSP, CMSIS-NN e TFLite Micro já trazem suporte a Helium.</li>



<li><strong>Analise trechos críticos do seu código</strong> com perfis e identifique blocos candidatos à vetorização.</li>



<li><strong>Aplique instruções MVE manualmente apenas quando necessário</strong> — muitos ganhos já vêm do uso das bibliotecas.</li>



<li><strong>Teste em simuladores ou kits com Cortex-M55</strong>, como os baseados em Ethos-U55 ou placas com IPs da Arm com suporte nativo.</li>
</ol>



<h3 class="wp-block-heading">Fechamento</h3>



<p class="wp-block-paragraph">O Helium representa a maturação da proposta &#8220;performance at the edge&#8221; — executar algoritmos de IA e DSP em microcontroladores acessíveis, confiáveis e eficientes. A combinação do Cortex-M55 com Helium e bibliotecas bem integradas oferece uma solução elegante para sistemas modernos que exigem mais do que um simples controle digital: eles precisam aprender, ouvir, prever e adaptar-se localmente, sem depender da nuvem.</p>



<p class="wp-block-paragraph">Seja você um desenvolvedor migrando de um Cortex-M4, um projetista de sensores inteligentes ou um entusiasta do edge AI, <strong>explorar o potencial do Helium pode ser o diferencial do seu próximo produto embarcado</strong>.</p><p>The post <a href="https://mcu.tec.br/microcontroladores/helium-e-o-cortex-m55-vetorizando-o-futuro-do-dsp-e-da-ia-nos-microcontroladores/">Helium e o Cortex-M55: Vetorizando o Futuro do DSP e da IA nos Microcontroladores</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">518</post-id>	</item>
	</channel>
</rss>
