<?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>processamento digital de sinais - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/processamento-digital-de-sinais/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Sat, 21 Feb 2026 11:31:50 +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>processamento digital de sinais - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Processadores Especializados em DSP (DCP) em Sistemas Embarcados</title>
		<link>https://mcu.tec.br/microcontroladores/processadores-especializados-em-dsp-dcp-em-sistemas-embarcados/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=processadores-especializados-em-dsp-dcp-em-sistemas-embarcados</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Sat, 21 Feb 2026 11:31:42 +0000</pubDate>
				<category><![CDATA[microcontroladores]]></category>
		<category><![CDATA[arquitetura Harvard modificada]]></category>
		<category><![CDATA[controle de motores FOC]]></category>
		<category><![CDATA[DCP]]></category>
		<category><![CDATA[desempenho por watt]]></category>
		<category><![CDATA[DSP vs CPU]]></category>
		<category><![CDATA[eficiência energética em DSP]]></category>
		<category><![CDATA[fft em microcontroladores]]></category>
		<category><![CDATA[processadores DSP]]></category>
		<category><![CDATA[processamento digital de sinais]]></category>
		<category><![CDATA[processamento na borda]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[unidade MAC]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1383</guid>

					<description><![CDATA[<p>Este artigo apresenta uma análise técnica e didática sobre o uso de processadores especializados em DSP (DCP) em sistemas embarcados modernos. São exploradas as diferenças arquiteturais entre CPUs convencionais e processadores dedicados de sinal, destacando unidades MAC, arquitetura Harvard modificada, aritmética saturada e suporte a ponto fixo e ponto flutuante. O conteúdo aborda aplicações práticas em áudio, controle de motores, análise de vibração e comunicação digital, além de discutir desempenho por watt e eficiência energética em processamento na borda. Ideal para engenheiros, desenvolvedores de firmware e profissionais que projetam sistemas embarcados de alta performance.</p>
<p>The post <a href="https://mcu.tec.br/microcontroladores/processadores-especializados-em-dsp-dcp-em-sistemas-embarcados/">Processadores Especializados em DSP (DCP) em Sistemas Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-yp681 wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-yp681 "><div class="eb-toc-container eb-toc-yp681  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;Introdu\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Introdu\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Arquitetura de CPUs Convencionais versus Processadores Especializados em DSP (DCP)&quot;,&quot;text&quot;:&quot;Arquitetura de CPUs Convencionais versus Processadores Especializados em DSP (DCP)&quot;,&quot;link&quot;:&quot;arquitetura-de-cpus-convencionais-versus-processadores-especializados-em-dsp-dcp&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Elementos Internos de um Processador Especializado em DSP (DCP)&quot;,&quot;text&quot;:&quot;Elementos Internos de um Processador Especializado em DSP (DCP)&quot;,&quot;link&quot;:&quot;elementos-internos-de-um-processador-especializado-em-dsp-dcp&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Aplica\u00e7\u00f5es Pr\u00e1ticas de Processadores Especializados em DSP em Sistemas Embarcados&quot;,&quot;text&quot;:&quot;Aplica\u00e7\u00f5es Pr\u00e1ticas de Processadores Especializados em DSP em Sistemas Embarcados&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Efici\u00eancia Energ\u00e9tica e Desempenho por Watt em DCPs&quot;,&quot;text&quot;:&quot;Efici\u00eancia Energ\u00e9tica e Desempenho por Watt em DCPs&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Quando Utilizar um Microcontrolador com Extens\u00f5es DSP e Quando Optar por um DCP Dedicado&quot;,&quot;text&quot;:&quot;Quando Utilizar um Microcontrolador com Extens\u00f5es DSP e Quando Optar por um DCP Dedicado&quot;,&quot;link&quot;:&quot;eb-table-content-5&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Conclus\u00e3o&quot;,&quot;text&quot;:&quot;Conclus\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Introdu\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;introdu\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Arquitetura de CPUs Convencionais versus Processadores Especializados em DSP (DCP)&quot;,&quot;value&quot;:&quot;arquitetura-de-cpus-convencionais-versus-processadores-especializados-em-dsp-dcp&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Elementos Internos de um Processador Especializado em DSP (DCP)&quot;,&quot;value&quot;:&quot;elementos-internos-de-um-processador-especializado-em-dsp-dcp&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Aplica\u00e7\u00f5es Pr\u00e1ticas de Processadores Especializados em DSP em Sistemas Embarcados&quot;,&quot;value&quot;:&quot;aplica\u00e7\u00f5es-pr\u00e1ticas-de-processadores-especializados-em-dsp-em-sistemas-embarcados&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Efici\u00eancia Energ\u00e9tica e Desempenho por Watt em DCPs&quot;,&quot;value&quot;:&quot;efici\u00eancia-energ\u00e9tica-e-desempenho-por-watt-em-dcps&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Quando Utilizar um Microcontrolador com Extens\u00f5es DSP e Quando Optar por um DCP Dedicado&quot;,&quot;value&quot;:&quot;quando-utilizar-um-microcontrolador-com-extens\u00f5es-dsp-e-quando-optar-por-um-dcp-dedicado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conclus\u00e3o&quot;,&quot;value&quot;:&quot;conclus\u00e3o&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">Introdução</a><li><a href="#arquitetura-de-cpus-convencionais-versus-processadores-especializados-em-dsp-dcp">Arquitetura de CPUs Convencionais versus Processadores Especializados em DSP (DCP)</a><li><a href="#elementos-internos-de-um-processador-especializado-em-dsp-dcp">Elementos Internos de um Processador Especializado em DSP (DCP)</a><li><a href="#eb-table-content-3">Aplicações Práticas de Processadores Especializados em DSP em Sistemas Embarcados</a><li><a href="#eb-table-content-4">Eficiência Energética e Desempenho por Watt em DCPs</a><li><a href="#eb-table-content-5">Quando Utilizar um Microcontrolador com Extensões DSP e Quando Optar por um DCP Dedicado</a><li><a href="#eb-table-content-6">Conclusão</a></ul></div></div></div></div></div>


<h3 class="wp-block-heading">Introdução</h3>



<p class="wp-block-paragraph">O processamento digital de sinais é um dos pilares da eletrônica moderna. Desde sistemas de áudio e comunicação sem fio até controle industrial e monitoramento de vibração, praticamente todo sistema embarcado contemporâneo precisa, em algum nível, manipular sinais digitais de forma eficiente. Entretanto, quando esse processamento se torna matematicamente intensivo — envolvendo filtragem digital, transformadas rápidas de Fourier (FFT), correlação, convolução ou controle em tempo real — microcontroladores convencionais podem não oferecer desempenho adequado ou eficiência energética suficiente.</p>



<p class="wp-block-paragraph">É nesse contexto que surgem os processadores especializados em DSP, que aqui chamaremos de DCP (Digital Signal Processors / Digital Signal Processing Cores). Com base no artigo técnico publicado pela Analog Devices na revista Analog Dialogue, analisaremos de forma didática o papel desses processadores, suas arquiteturas internas e as vantagens que oferecem quando comparados a CPUs tradicionais em sistemas embarcados.</p><p>The post <a href="https://mcu.tec.br/microcontroladores/processadores-especializados-em-dsp-dcp-em-sistemas-embarcados/">Processadores Especializados em DSP (DCP) em Sistemas Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1383</post-id>	</item>
		<item>
		<title>LPCC (Linear Prediction Cepstral Coefficients): Fundamentos, Algoritmos e Aplicações em Sistemas Embarcados</title>
		<link>https://mcu.tec.br/algoritimos/dsp/lpcc-linear-prediction-cepstral-coefficients-fundamentos-algoritmos-e-aplicacoes-em-sistemas-embarcados/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lpcc-linear-prediction-cepstral-coefficients-fundamentos-algoritmos-e-aplicacoes-em-sistemas-embarcados</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Fri, 30 Jan 2026 18:04:34 +0000</pubDate>
				<category><![CDATA[DSP]]></category>
		<category><![CDATA[algoritmo de Levinson-Durbin]]></category>
		<category><![CDATA[análise de sinais]]></category>
		<category><![CDATA[autocorrelação]]></category>
		<category><![CDATA[diagnóstico de falhas]]></category>
		<category><![CDATA[edge computing]]></category>
		<category><![CDATA[extração de características]]></category>
		<category><![CDATA[firmware DSP]]></category>
		<category><![CDATA[iot industrial]]></category>
		<category><![CDATA[Linear Prediction Cepstral Coefficients]]></category>
		<category><![CDATA[LPC]]></category>
		<category><![CDATA[LPCC]]></category>
		<category><![CDATA[MFCC vs LPCC]]></category>
		<category><![CDATA[predição linear]]></category>
		<category><![CDATA[processamento digital de sinais]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[vibroacústica]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1254</guid>

					<description><![CDATA[<p>Os coeficientes cepstrais por predição linear (LPCC) são uma técnica clássica e altamente eficiente para extração de características em sinais de fala, vibração e acústica industrial. Neste artigo, apresentamos uma explicação completa e didática sobre LPCC, partindo dos fundamentos da predição linear (LP), passando pela autocorrelação, equações de Yule-Walker, algoritmo de Levinson-Durbin e erro de predição, até a conversão de coeficientes LPC em LPCC. Todo o conteúdo é contextualizado para aplicações práticas em sistemas embarcados, edge computing, IoT e diagnóstico vibroacústico, com exemplos de implementação em linguagem C, sem dependência de MATLAB ou bibliotecas pesadas. Também é apresentada uma comparação técnica entre LPCC e MFCC, destacando diferenças conceituais, computacionais e de interpretabilidade. O artigo é indicado para engenheiros, estudantes e pesquisadores que buscam compreender não apenas como usar LPCC, mas por que essa técnica continua relevante em aplicações industriais, manutenção preditiva, detecção de anomalias e análise de sinais físicos em ambientes com recursos limitados.</p>
<p>The post <a href="https://mcu.tec.br/algoritimos/dsp/lpcc-linear-prediction-cepstral-coefficients-fundamentos-algoritmos-e-aplicacoes-em-sistemas-embarcados/">LPCC (Linear Prediction Cepstral Coefficients): Fundamentos, Algoritmos e Aplicações em Sistemas Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-8gar6 wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-8gar6 "><div class="eb-toc-container eb-toc-8gar6  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 LPC (Linear Predictive Coding)&quot;,&quot;text&quot;:&quot;1 \u2014 LPC (Linear Predictive Coding)&quot;,&quot;link&quot;:&quot;1-lpc-linear-predictive-coding&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que significa LPC&quot;,&quot;text&quot;:&quot;O que significa LPC&quot;,&quot;link&quot;:&quot;o-que-significa-lpc&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Intui\u00e7\u00e3o f\u00edsica e de sinal&quot;,&quot;text&quot;:&quot;Intui\u00e7\u00e3o f\u00edsica e de sinal&quot;,&quot;link&quot;:&quot;eb-table-content-2&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Modelo matem\u00e1tico do LPC&quot;,&quot;text&quot;:&quot;Modelo matem\u00e1tico do LPC&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Por que o LPC \u00e9 importante para LPCC&quot;,&quot;text&quot;:&quot;Por que o LPC \u00e9 importante para LPCC&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Implementa\u00e7\u00e3o conceitual do LPC em C (vis\u00e3o geral)&quot;,&quot;text&quot;:&quot;Implementa\u00e7\u00e3o conceitual do LPC em C (vis\u00e3o geral)&quot;,&quot;link&quot;:&quot;eb-table-content-5&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo em C \u2014 c\u00e1lculo da autocorrela\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Exemplo em C \u2014 c\u00e1lculo da autocorrela\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Observa\u00e7\u00f5es pr\u00e1ticas para sistemas embarcados&quot;,&quot;text&quot;:&quot;Observa\u00e7\u00f5es pr\u00e1ticas para sistemas embarcados&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;2 \u2014 LPCC (Linear Prediction Cepstral Coefficients)&quot;,&quot;text&quot;:&quot;2 \u2014 LPCC (Linear Prediction Cepstral Coefficients)&quot;,&quot;link&quot;:&quot;2-lpcc-linear-prediction-cepstral-coefficients&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que significa LPCC&quot;,&quot;text&quot;:&quot;O que significa LPCC&quot;,&quot;link&quot;:&quot;o-que-significa-lpcc&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que \u00e9 o dom\u00ednio cepstral (intui\u00e7\u00e3o)&quot;,&quot;text&quot;:&quot;O que \u00e9 o dom\u00ednio cepstral (intui\u00e7\u00e3o)&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Rela\u00e7\u00e3o matem\u00e1tica entre LPC e LPCC&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o matem\u00e1tica entre LPC e LPCC&quot;,&quot;link&quot;:&quot;eb-table-content-11&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Por que LPCC \u00e9 prefer\u00edvel ao LPC em Machine Learning&quot;,&quot;text&quot;:&quot;Por que LPCC \u00e9 prefer\u00edvel ao LPC em Machine Learning&quot;,&quot;link&quot;:&quot;eb-table-content-12&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Implementa\u00e7\u00e3o em C \u2014 LPC \u2192 LPCC&quot;,&quot;text&quot;:&quot;Implementa\u00e7\u00e3o em C \u2014 LPC \u2192 LPCC&quot;,&quot;link&quot;:&quot;eb-table-content-13&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Observa\u00e7\u00f5es importantes sobre o c\u00f3digo&quot;,&quot;text&quot;:&quot;Observa\u00e7\u00f5es importantes sobre o c\u00f3digo&quot;,&quot;link&quot;:&quot;eb-table-content-14&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Complexidade computacional&quot;,&quot;text&quot;:&quot;Complexidade computacional&quot;,&quot;link&quot;:&quot;complexidade-computacional&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;3 \u2014 CEPSTRUM&quot;,&quot;text&quot;:&quot;3 \u2014 CEPSTRUM&quot;,&quot;link&quot;:&quot;3-cepstrum&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que significa Cepstrum&quot;,&quot;text&quot;:&quot;O que significa Cepstrum&quot;,&quot;link&quot;:&quot;o-que-significa-cepstrum&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Intui\u00e7\u00e3o f\u00edsica do Cepstrum&quot;,&quot;text&quot;:&quot;Intui\u00e7\u00e3o f\u00edsica do Cepstrum&quot;,&quot;link&quot;:&quot;eb-table-content-18&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Cepstrum \u201ccl\u00e1ssico\u201d vs Cepstrum via LPC&quot;,&quot;text&quot;:&quot;Cepstrum \u201ccl\u00e1ssico\u201d vs Cepstrum via LPC&quot;,&quot;link&quot;:&quot;eb-table-content-19&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;1. Cepstrum via FFT (cepstrum cl\u00e1ssico)&quot;,&quot;text&quot;:&quot;1. Cepstrum via FFT (cepstrum cl\u00e1ssico)&quot;,&quot;link&quot;:&quot;eb-table-content-20&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;2. Cepstrum via LPC (LPCC)&quot;,&quot;text&quot;:&quot;2. Cepstrum via LPC (LPCC)&quot;,&quot;link&quot;:&quot;2-cepstrum-via-lpc-lpcc&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Por que o Cepstrum \u00e9 t\u00e3o poderoso&quot;,&quot;text&quot;:&quot;Por que o Cepstrum \u00e9 t\u00e3o poderoso&quot;,&quot;link&quot;:&quot;eb-table-content-22&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Quefr\u00eancia: interpreta\u00e7\u00e3o correta&quot;,&quot;text&quot;:&quot;Quefr\u00eancia: interpreta\u00e7\u00e3o correta&quot;,&quot;link&quot;:&quot;eb-table-content-23&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Conex\u00e3o direta com LPCC&quot;,&quot;text&quot;:&quot;Conex\u00e3o direta com LPCC&quot;,&quot;link&quot;:&quot;eb-table-content-24&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;4 \u2014 LP (Linear Prediction)&quot;,&quot;text&quot;:&quot;4 \u2014 LP (Linear Prediction)&quot;,&quot;link&quot;:&quot;4-lp-linear-prediction&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que significa LP&quot;,&quot;text&quot;:&quot;O que significa LP&quot;,&quot;link&quot;:&quot;o-que-significa-lp&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Predi\u00e7\u00e3o linear como modelo autoregressivo (AR)&quot;,&quot;text&quot;:&quot;Predi\u00e7\u00e3o linear como modelo autoregressivo (AR)&quot;,&quot;link&quot;:&quot;eb-table-content-27&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Interpreta\u00e7\u00e3o como filtro digital&quot;,&quot;text&quot;:&quot;Interpreta\u00e7\u00e3o como filtro digital&quot;,&quot;link&quot;:&quot;eb-table-content-28&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Estabilidade do modelo LP&quot;,&quot;text&quot;:&quot;Estabilidade do modelo LP&quot;,&quot;link&quot;:&quot;estabilidade-do-modelo-lp&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Escolha da ordem do modelo (p)&quot;,&quot;text&quot;:&quot;Escolha da ordem do modelo (p)&quot;,&quot;link&quot;:&quot;escolha-da-ordem-do-modelo-p&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Rela\u00e7\u00e3o direta entre LP, LPC e LPCC&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o direta entre LP, LPC e LPCC&quot;,&quot;link&quot;:&quot;eb-table-content-31&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo conceitual em C \u2014 erro de predi\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Exemplo conceitual em C \u2014 erro de predi\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-32&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;5 \u2014 AC (Autocorrelation)&quot;,&quot;text&quot;:&quot;5 \u2014 AC (Autocorrelation)&quot;,&quot;link&quot;:&quot;5-ac-autocorrelation&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que significa AC&quot;,&quot;text&quot;:&quot;O que significa AC&quot;,&quot;link&quot;:&quot;o-que-significa-ac&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Defini\u00e7\u00e3o matem\u00e1tica da autocorrela\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Defini\u00e7\u00e3o matem\u00e1tica da autocorrela\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-35&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Por que a autocorrela\u00e7\u00e3o \u00e9 usada em LPC&quot;,&quot;text&quot;:&quot;Por que a autocorrela\u00e7\u00e3o \u00e9 usada em LPC&quot;,&quot;link&quot;:&quot;eb-table-content-36&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;1. Garante estabilidade do filtro LPC&quot;,&quot;text&quot;:&quot;1. Garante estabilidade do filtro LPC&quot;,&quot;link&quot;:&quot;1-garante-estabilidade-do-filtro-lpc&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;2. Reduz sensibilidade a ru\u00eddo&quot;,&quot;text&quot;:&quot;2. Reduz sensibilidade a ru\u00eddo&quot;,&quot;link&quot;:&quot;eb-table-content-38&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;3. Conecta LP a m\u00ednimos quadrados&quot;,&quot;text&quot;:&quot;3. Conecta LP a m\u00ednimos quadrados&quot;,&quot;link&quot;:&quot;eb-table-content-39&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Equa\u00e7\u00f5es de Yule-Walker&quot;,&quot;text&quot;:&quot;Equa\u00e7\u00f5es de Yule-Walker&quot;,&quot;link&quot;:&quot;eb-table-content-40&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Interpreta\u00e7\u00e3o f\u00edsica da autocorrela\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Interpreta\u00e7\u00e3o f\u00edsica da autocorrela\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-41&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Autocorrela\u00e7\u00e3o e estacionariedade&quot;,&quot;text&quot;:&quot;Autocorrela\u00e7\u00e3o e estacionariedade&quot;,&quot;link&quot;:&quot;eb-table-content-42&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Implementa\u00e7\u00e3o em C \u2014 autocorrela\u00e7\u00e3o (revis\u00e3o pr\u00e1tica)&quot;,&quot;text&quot;:&quot;Implementa\u00e7\u00e3o em C \u2014 autocorrela\u00e7\u00e3o (revis\u00e3o pr\u00e1tica)&quot;,&quot;link&quot;:&quot;eb-table-content-43&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Consequ\u00eancias pr\u00e1ticas em sistemas embarcados&quot;,&quot;text&quot;:&quot;Consequ\u00eancias pr\u00e1ticas em sistemas embarcados&quot;,&quot;link&quot;:&quot;eb-table-content-44&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;6 \u2014 LDA (Levinson\u2013Durbin Algorithm)&quot;,&quot;text&quot;:&quot;6 \u2014 LDA (Levinson\u2013Durbin Algorithm)&quot;,&quot;link&quot;:&quot;6-lda-levinsondurbin-algorithm&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que significa LDA neste contexto&quot;,&quot;text&quot;:&quot;O que significa LDA neste contexto&quot;,&quot;link&quot;:&quot;o-que-significa-lda-neste-contexto&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Por que Levinson\u2013Durbin \u00e9 essencial&quot;,&quot;text&quot;:&quot;Por que Levinson\u2013Durbin \u00e9 essencial&quot;,&quot;link&quot;:&quot;eb-table-content-47&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Estrutura recursiva do algoritmo&quot;,&quot;text&quot;:&quot;Estrutura recursiva do algoritmo&quot;,&quot;link&quot;:&quot;estrutura-recursiva-do-algoritmo&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Interpreta\u00e7\u00e3o f\u00edsica do coeficiente de reflex\u00e3o&quot;,&quot;text&quot;:&quot;Interpreta\u00e7\u00e3o f\u00edsica do coeficiente de reflex\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-49&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Implementa\u00e7\u00e3o completa em C \u2014 Levinson\u2013Durbin&quot;,&quot;text&quot;:&quot;Implementa\u00e7\u00e3o completa em C \u2014 Levinson\u2013Durbin&quot;,&quot;link&quot;:&quot;eb-table-content-50&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Observa\u00e7\u00f5es importantes sobre o c\u00f3digo&quot;,&quot;text&quot;:&quot;Observa\u00e7\u00f5es importantes sobre o c\u00f3digo&quot;,&quot;link&quot;:&quot;eb-table-content-51&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Papel do Levinson\u2013Durbin no pipeline completo&quot;,&quot;text&quot;:&quot;Papel do Levinson\u2013Durbin no pipeline completo&quot;,&quot;link&quot;:&quot;papel-do-levinsondurbin-no-pipeline-completo&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;7 \u2014 PE (Prediction Error)&quot;,&quot;text&quot;:&quot;7 \u2014 PE (Prediction Error)&quot;,&quot;link&quot;:&quot;7-pe-prediction-error&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que significa PE&quot;,&quot;text&quot;:&quot;O que significa PE&quot;,&quot;link&quot;:&quot;o-que-significa-pe&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Energia do erro de predi\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Energia do erro de predi\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-55&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Interpreta\u00e7\u00e3o f\u00edsica do erro de predi\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Interpreta\u00e7\u00e3o f\u00edsica do erro de predi\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-56&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Em fala&quot;,&quot;text&quot;:&quot;Em fala&quot;,&quot;link&quot;:&quot;em-fala&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Em vibra\u00e7\u00e3o mec\u00e2nica&quot;,&quot;text&quot;:&quot;Em vibra\u00e7\u00e3o mec\u00e2nica&quot;,&quot;link&quot;:&quot;eb-table-content-58&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Rela\u00e7\u00e3o direta entre PE e LPCC (coeficiente c\u2080)&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o direta entre PE e LPCC (coeficiente c\u2080)&quot;,&quot;link&quot;:&quot;eb-table-content-59&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;PE como m\u00e9trica de qualidade do modelo&quot;,&quot;text&quot;:&quot;PE como m\u00e9trica de qualidade do modelo&quot;,&quot;link&quot;:&quot;eb-table-content-60&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo em C \u2014 c\u00e1lculo expl\u00edcito do erro m\u00e9dio&quot;,&quot;text&quot;:&quot;Exemplo em C \u2014 c\u00e1lculo expl\u00edcito do erro m\u00e9dio&quot;,&quot;link&quot;:&quot;eb-table-content-61&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;PE e estabilidade num\u00e9rica&quot;,&quot;text&quot;:&quot;PE e estabilidade num\u00e9rica&quot;,&quot;link&quot;:&quot;eb-table-content-62&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Rela\u00e7\u00e3o final no pipeline&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o final no pipeline&quot;,&quot;link&quot;:&quot;eb-table-content-63&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Conclus\u00e3o desta se\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Conclus\u00e3o desta se\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-64&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;8 \u2014 LPCC Extraction Pipeline (Pipeline de Extra\u00e7\u00e3o de LPCC)&quot;,&quot;text&quot;:&quot;8 \u2014 LPCC Extraction Pipeline (Pipeline de Extra\u00e7\u00e3o de LPCC)&quot;,&quot;link&quot;:&quot;eb-table-content-65&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Vis\u00e3o geral do pipeline&quot;,&quot;text&quot;:&quot;Vis\u00e3o geral do pipeline&quot;,&quot;link&quot;:&quot;eb-table-content-66&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Etapa 1 \u2014 Janelamento do sinal&quot;,&quot;text&quot;:&quot;Etapa 1 \u2014 Janelamento do sinal&quot;,&quot;link&quot;:&quot;etapa-1-janelamento-do-sinal&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Etapa 2 \u2014 Autocorrela\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Etapa 2 \u2014 Autocorrela\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-68&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Etapa 3 \u2014 Levinson\u2013Durbin&quot;,&quot;text&quot;:&quot;Etapa 3 \u2014 Levinson\u2013Durbin&quot;,&quot;link&quot;:&quot;etapa-3-levinsondurbin&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Etapa 4 \u2014 Convers\u00e3o LPC \u2192 LPCC&quot;,&quot;text&quot;:&quot;Etapa 4 \u2014 Convers\u00e3o LPC \u2192 LPCC&quot;,&quot;link&quot;:&quot;eb-table-content-70&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Etapa 5 \u2014 Vetor de caracter\u00edsticas&quot;,&quot;text&quot;:&quot;Etapa 5 \u2014 Vetor de caracter\u00edsticas&quot;,&quot;link&quot;:&quot;eb-table-content-71&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo completo \u2014 pipeline integrado em C&quot;,&quot;text&quot;:&quot;Exemplo completo \u2014 pipeline integrado em C&quot;,&quot;link&quot;:&quot;exemplo-completo-pipeline-integrado-em-c&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Considera\u00e7\u00f5es num\u00e9ricas e de engenharia&quot;,&quot;text&quot;:&quot;Considera\u00e7\u00f5es num\u00e9ricas e de engenharia&quot;,&quot;link&quot;:&quot;eb-table-content-73&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;9 \u2014 LPCC \u00d7 MFCC (Compara\u00e7\u00e3o Conceitual e Pr\u00e1tica)&quot;,&quot;text&quot;:&quot;9 \u2014 LPCC \u00d7 MFCC (Compara\u00e7\u00e3o Conceitual e Pr\u00e1tica)&quot;,&quot;link&quot;:&quot;eb-table-content-74&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que significa MFCC&quot;,&quot;text&quot;:&quot;O que significa MFCC&quot;,&quot;link&quot;:&quot;o-que-significa-mfcc&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Diferen\u00e7a filos\u00f3fica entre LPCC e MFCC&quot;,&quot;text&quot;:&quot;Diferen\u00e7a filos\u00f3fica entre LPCC e MFCC&quot;,&quot;link&quot;:&quot;eb-table-content-76&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;LPCC \u2014 modelo f\u00edsico\/matem\u00e1tico&quot;,&quot;text&quot;:&quot;LPCC \u2014 modelo f\u00edsico\/matem\u00e1tico&quot;,&quot;link&quot;:&quot;eb-table-content-77&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;MFCC \u2014 modelo perceptual&quot;,&quot;text&quot;:&quot;MFCC \u2014 modelo perceptual&quot;,&quot;link&quot;:&quot;mfcc-modelo-perceptual&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Pipeline comparativo&quot;,&quot;text&quot;:&quot;Pipeline comparativo&quot;,&quot;link&quot;:&quot;pipeline-comparativo&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;LPCC&quot;,&quot;text&quot;:&quot;LPCC&quot;,&quot;link&quot;:&quot;lpcc&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;MFCC&quot;,&quot;text&quot;:&quot;MFCC&quot;,&quot;link&quot;:&quot;mfcc&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Complexidade computacional&quot;,&quot;text&quot;:&quot;Complexidade computacional&quot;,&quot;link&quot;:&quot;complexidade-computacional&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Sensibilidade a ru\u00eddo e n\u00e3o-linearidades&quot;,&quot;text&quot;:&quot;Sensibilidade a ru\u00eddo e n\u00e3o-linearidades&quot;,&quot;link&quot;:&quot;eb-table-content-83&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Interpretabilidade dos coeficientes&quot;,&quot;text&quot;:&quot;Interpretabilidade dos coeficientes&quot;,&quot;link&quot;:&quot;interpretabilidade-dos-coeficientes&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo pr\u00e1tico de escolha&quot;,&quot;text&quot;:&quot;Exemplo pr\u00e1tico de escolha&quot;,&quot;link&quot;:&quot;eb-table-content-85&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Ponto cr\u00edtico raramente discutido&quot;,&quot;text&quot;:&quot;Ponto cr\u00edtico raramente discutido&quot;,&quot;link&quot;:&quot;eb-table-content-86&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;10 \u2014 Aplica\u00e7\u00f5es do LPCC (Linear Prediction Cepstral Coefficients)&quot;,&quot;text&quot;:&quot;10 \u2014 Aplica\u00e7\u00f5es do LPCC (Linear Prediction Cepstral Coefficients)&quot;,&quot;link&quot;:&quot;eb-table-content-87&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Por que LPCC \u00e9 usado na pr\u00e1tica&quot;,&quot;text&quot;:&quot;Por que LPCC \u00e9 usado na pr\u00e1tica&quot;,&quot;link&quot;:&quot;eb-table-content-88&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1. Reconhecimento e classifica\u00e7\u00e3o de fala (cl\u00e1ssico)&quot;,&quot;text&quot;:&quot;1. Reconhecimento e classifica\u00e7\u00e3o de fala (cl\u00e1ssico)&quot;,&quot;link&quot;:&quot;eb-table-content-89&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2. Diagn\u00f3stico vibroac\u00fastico e monitoramento de condi\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;2. Diagn\u00f3stico vibroac\u00fastico e monitoramento de condi\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-90&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3. Detec\u00e7\u00e3o de anomalias (Anomaly Detection)&quot;,&quot;text&quot;:&quot;3. Detec\u00e7\u00e3o de anomalias (Anomaly Detection)&quot;,&quot;link&quot;:&quot;eb-table-content-91&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4. Classifica\u00e7\u00e3o com Machine Learning cl\u00e1ssico&quot;,&quot;text&quot;:&quot;4. Classifica\u00e7\u00e3o com Machine Learning cl\u00e1ssico&quot;,&quot;link&quot;:&quot;eb-table-content-92&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5. Monitoramento em tempo real (edge \/ firmware)&quot;,&quot;text&quot;:&quot;5. Monitoramento em tempo real (edge \/ firmware)&quot;,&quot;link&quot;:&quot;5-monitoramento-em-tempo-real-edge-firmware&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6. Aplica\u00e7\u00f5es em energia e eletromagnetismo&quot;,&quot;text&quot;:&quot;6. Aplica\u00e7\u00f5es em energia e eletromagnetismo&quot;,&quot;link&quot;:&quot;eb-table-content-94&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7. Por que LPCC \u00e9 subestimado hoje&quot;,&quot;text&quot;:&quot;7. Por que LPCC \u00e9 subestimado hoje&quot;,&quot;link&quot;:&quot;eb-table-content-95&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo conceitual de uso do LPCC em classifica\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Exemplo conceitual de uso do LPCC em classifica\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-96&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Conclus\u00e3o&quot;,&quot;text&quot;:&quot;Conclus\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-97&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;1 \u2014 LPC (Linear Predictive Coding)&quot;,&quot;value&quot;:&quot;1-lpc-linear-predictive-coding&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que significa LPC&quot;,&quot;value&quot;:&quot;o-que-significa-lpc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Intui\u00e7\u00e3o f\u00edsica e de sinal&quot;,&quot;value&quot;:&quot;intui\u00e7\u00e3o-f\u00edsica-e-de-sinal&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Modelo matem\u00e1tico do LPC&quot;,&quot;value&quot;:&quot;modelo-matem\u00e1tico-do-lpc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Por que o LPC \u00e9 importante para LPCC&quot;,&quot;value&quot;:&quot;por-que-o-lpc-\u00e9-importante-para-lpcc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Implementa\u00e7\u00e3o conceitual do LPC em C (vis\u00e3o geral)&quot;,&quot;value&quot;:&quot;implementa\u00e7\u00e3o-conceitual-do-lpc-em-c-vis\u00e3o-geral&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo em C \u2014 c\u00e1lculo da autocorrela\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;exemplo-em-c-c\u00e1lculo-da-autocorrela\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Observa\u00e7\u00f5es pr\u00e1ticas para sistemas embarcados&quot;,&quot;value&quot;:&quot;observa\u00e7\u00f5es-pr\u00e1ticas-para-sistemas-embarcados&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2 \u2014 LPCC (Linear Prediction Cepstral Coefficients)&quot;,&quot;value&quot;:&quot;2-lpcc-linear-prediction-cepstral-coefficients&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que significa LPCC&quot;,&quot;value&quot;:&quot;o-que-significa-lpcc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que \u00e9 o dom\u00ednio cepstral (intui\u00e7\u00e3o)&quot;,&quot;value&quot;:&quot;o-que-\u00e9-o-dom\u00ednio-cepstral-intui\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o matem\u00e1tica entre LPC e LPCC&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-matem\u00e1tica-entre-lpc-e-lpcc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Por que LPCC \u00e9 prefer\u00edvel ao LPC em Machine Learning&quot;,&quot;value&quot;:&quot;por-que-lpcc-\u00e9-prefer\u00edvel-ao-lpc-em-machine-learning&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Implementa\u00e7\u00e3o em C \u2014 LPC \u2192 LPCC&quot;,&quot;value&quot;:&quot;implementa\u00e7\u00e3o-em-c-lpc-\u2192-lpcc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Observa\u00e7\u00f5es importantes sobre o c\u00f3digo&quot;,&quot;value&quot;:&quot;observa\u00e7\u00f5es-importantes-sobre-o-c\u00f3digo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Complexidade computacional&quot;,&quot;value&quot;:&quot;complexidade-computacional&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3 \u2014 CEPSTRUM&quot;,&quot;value&quot;:&quot;3-cepstrum&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que significa Cepstrum&quot;,&quot;value&quot;:&quot;o-que-significa-cepstrum&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Intui\u00e7\u00e3o f\u00edsica do Cepstrum&quot;,&quot;value&quot;:&quot;intui\u00e7\u00e3o-f\u00edsica-do-cepstrum&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Cepstrum \u201ccl\u00e1ssico\u201d vs Cepstrum via LPC&quot;,&quot;value&quot;:&quot;cepstrum-cl\u00e1ssico-vs-cepstrum-via-lpc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1. Cepstrum via FFT (cepstrum cl\u00e1ssico)&quot;,&quot;value&quot;:&quot;1-cepstrum-via-fft-cepstrum-cl\u00e1ssico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2. Cepstrum via LPC (LPCC)&quot;,&quot;value&quot;:&quot;2-cepstrum-via-lpc-lpcc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Por que o Cepstrum \u00e9 t\u00e3o poderoso&quot;,&quot;value&quot;:&quot;por-que-o-cepstrum-\u00e9-t\u00e3o-poderoso&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Quefr\u00eancia: interpreta\u00e7\u00e3o correta&quot;,&quot;value&quot;:&quot;quefr\u00eancia-interpreta\u00e7\u00e3o-correta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conex\u00e3o direta com LPCC&quot;,&quot;value&quot;:&quot;conex\u00e3o-direta-com-lpcc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4 \u2014 LP (Linear Prediction)&quot;,&quot;value&quot;:&quot;4-lp-linear-prediction&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que significa LP&quot;,&quot;value&quot;:&quot;o-que-significa-lp&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Predi\u00e7\u00e3o linear como modelo autoregressivo (AR)&quot;,&quot;value&quot;:&quot;predi\u00e7\u00e3o-linear-como-modelo-autoregressivo-ar&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Interpreta\u00e7\u00e3o como filtro digital&quot;,&quot;value&quot;:&quot;interpreta\u00e7\u00e3o-como-filtro-digital&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estabilidade do modelo LP&quot;,&quot;value&quot;:&quot;estabilidade-do-modelo-lp&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Escolha da ordem do modelo (p)&quot;,&quot;value&quot;:&quot;escolha-da-ordem-do-modelo-p&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o direta entre LP, LPC e LPCC&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-direta-entre-lp-lpc-e-lpcc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo conceitual em C \u2014 erro de predi\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;exemplo-conceitual-em-c-erro-de-predi\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5 \u2014 AC (Autocorrelation)&quot;,&quot;value&quot;:&quot;5-ac-autocorrelation&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que significa AC&quot;,&quot;value&quot;:&quot;o-que-significa-ac&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Defini\u00e7\u00e3o matem\u00e1tica da autocorrela\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;defini\u00e7\u00e3o-matem\u00e1tica-da-autocorrela\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Por que a autocorrela\u00e7\u00e3o \u00e9 usada em LPC&quot;,&quot;value&quot;:&quot;por-que-a-autocorrela\u00e7\u00e3o-\u00e9-usada-em-lpc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1. Garante estabilidade do filtro LPC&quot;,&quot;value&quot;:&quot;1-garante-estabilidade-do-filtro-lpc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2. Reduz sensibilidade a ru\u00eddo&quot;,&quot;value&quot;:&quot;2-reduz-sensibilidade-a-ru\u00eddo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3. Conecta LP a m\u00ednimos quadrados&quot;,&quot;value&quot;:&quot;3-conecta-lp-a-m\u00ednimos-quadrados&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Equa\u00e7\u00f5es de Yule-Walker&quot;,&quot;value&quot;:&quot;equa\u00e7\u00f5es-de-yule-walker&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Interpreta\u00e7\u00e3o f\u00edsica da autocorrela\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;interpreta\u00e7\u00e3o-f\u00edsica-da-autocorrela\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Autocorrela\u00e7\u00e3o e estacionariedade&quot;,&quot;value&quot;:&quot;autocorrela\u00e7\u00e3o-e-estacionariedade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Implementa\u00e7\u00e3o em C \u2014 autocorrela\u00e7\u00e3o (revis\u00e3o pr\u00e1tica)&quot;,&quot;value&quot;:&quot;implementa\u00e7\u00e3o-em-c-autocorrela\u00e7\u00e3o-revis\u00e3o-pr\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Consequ\u00eancias pr\u00e1ticas em sistemas embarcados&quot;,&quot;value&quot;:&quot;consequ\u00eancias-pr\u00e1ticas-em-sistemas-embarcados&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6 \u2014 LDA (Levinson\u2013Durbin Algorithm)&quot;,&quot;value&quot;:&quot;6-lda-levinsondurbin-algorithm&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que significa LDA neste contexto&quot;,&quot;value&quot;:&quot;o-que-significa-lda-neste-contexto&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Por que Levinson\u2013Durbin \u00e9 essencial&quot;,&quot;value&quot;:&quot;por-que-levinsondurbin-\u00e9-essencial&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estrutura recursiva do algoritmo&quot;,&quot;value&quot;:&quot;estrutura-recursiva-do-algoritmo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Interpreta\u00e7\u00e3o f\u00edsica do coeficiente de reflex\u00e3o&quot;,&quot;value&quot;:&quot;interpreta\u00e7\u00e3o-f\u00edsica-do-coeficiente-de-reflex\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Implementa\u00e7\u00e3o completa em C \u2014 Levinson\u2013Durbin&quot;,&quot;value&quot;:&quot;implementa\u00e7\u00e3o-completa-em-c-levinsondurbin&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Observa\u00e7\u00f5es importantes sobre o c\u00f3digo&quot;,&quot;value&quot;:&quot;observa\u00e7\u00f5es-importantes-sobre-o-c\u00f3digo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Papel do Levinson\u2013Durbin no pipeline completo&quot;,&quot;value&quot;:&quot;papel-do-levinsondurbin-no-pipeline-completo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7 \u2014 PE (Prediction Error)&quot;,&quot;value&quot;:&quot;7-pe-prediction-error&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que significa PE&quot;,&quot;value&quot;:&quot;o-que-significa-pe&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Energia do erro de predi\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;energia-do-erro-de-predi\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Interpreta\u00e7\u00e3o f\u00edsica do erro de predi\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;interpreta\u00e7\u00e3o-f\u00edsica-do-erro-de-predi\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Em fala&quot;,&quot;value&quot;:&quot;em-fala&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Em vibra\u00e7\u00e3o mec\u00e2nica&quot;,&quot;value&quot;:&quot;em-vibra\u00e7\u00e3o-mec\u00e2nica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o direta entre PE e LPCC (coeficiente c\u2080)&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-direta-entre-pe-e-lpcc-coeficiente-c\u2080&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;PE como m\u00e9trica de qualidade do modelo&quot;,&quot;value&quot;:&quot;pe-como-m\u00e9trica-de-qualidade-do-modelo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo em C \u2014 c\u00e1lculo expl\u00edcito do erro m\u00e9dio&quot;,&quot;value&quot;:&quot;exemplo-em-c-c\u00e1lculo-expl\u00edcito-do-erro-m\u00e9dio&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;PE e estabilidade num\u00e9rica&quot;,&quot;value&quot;:&quot;pe-e-estabilidade-num\u00e9rica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o final no pipeline&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-final-no-pipeline&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conclus\u00e3o desta se\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;conclus\u00e3o-desta-se\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8 \u2014 LPCC Extraction Pipeline (Pipeline de Extra\u00e7\u00e3o de LPCC)&quot;,&quot;value&quot;:&quot;8-lpcc-extraction-pipeline-pipeline-de-extra\u00e7\u00e3o-de-lpcc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Vis\u00e3o geral do pipeline&quot;,&quot;value&quot;:&quot;vis\u00e3o-geral-do-pipeline&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Etapa 1 \u2014 Janelamento do sinal&quot;,&quot;value&quot;:&quot;etapa-1-janelamento-do-sinal&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Etapa 2 \u2014 Autocorrela\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;etapa-2-autocorrela\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Etapa 3 \u2014 Levinson\u2013Durbin&quot;,&quot;value&quot;:&quot;etapa-3-levinsondurbin&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Etapa 4 \u2014 Convers\u00e3o LPC \u2192 LPCC&quot;,&quot;value&quot;:&quot;etapa-4-convers\u00e3o-lpc-\u2192-lpcc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Etapa 5 \u2014 Vetor de caracter\u00edsticas&quot;,&quot;value&quot;:&quot;etapa-5-vetor-de-caracter\u00edsticas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo completo \u2014 pipeline integrado em C&quot;,&quot;value&quot;:&quot;exemplo-completo-pipeline-integrado-em-c&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Considera\u00e7\u00f5es num\u00e9ricas e de engenharia&quot;,&quot;value&quot;:&quot;considera\u00e7\u00f5es-num\u00e9ricas-e-de-engenharia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;9 \u2014 LPCC \u00d7 MFCC (Compara\u00e7\u00e3o Conceitual e Pr\u00e1tica)&quot;,&quot;value&quot;:&quot;9-lpcc-\u00d7-mfcc-compara\u00e7\u00e3o-conceitual-e-pr\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que significa MFCC&quot;,&quot;value&quot;:&quot;o-que-significa-mfcc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Diferen\u00e7a filos\u00f3fica entre LPCC e MFCC&quot;,&quot;value&quot;:&quot;diferen\u00e7a-filos\u00f3fica-entre-lpcc-e-mfcc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;LPCC \u2014 modelo f\u00edsico\/matem\u00e1tico&quot;,&quot;value&quot;:&quot;lpcc-modelo-f\u00edsicomatem\u00e1tico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;MFCC \u2014 modelo perceptual&quot;,&quot;value&quot;:&quot;mfcc-modelo-perceptual&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Pipeline comparativo&quot;,&quot;value&quot;:&quot;pipeline-comparativo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;LPCC&quot;,&quot;value&quot;:&quot;lpcc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;MFCC&quot;,&quot;value&quot;:&quot;mfcc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Complexidade computacional&quot;,&quot;value&quot;:&quot;complexidade-computacional&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sensibilidade a ru\u00eddo e n\u00e3o-linearidades&quot;,&quot;value&quot;:&quot;sensibilidade-a-ru\u00eddo-e-n\u00e3o-linearidades&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Interpretabilidade dos coeficientes&quot;,&quot;value&quot;:&quot;interpretabilidade-dos-coeficientes&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo pr\u00e1tico de escolha&quot;,&quot;value&quot;:&quot;exemplo-pr\u00e1tico-de-escolha&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Ponto cr\u00edtico raramente discutido&quot;,&quot;value&quot;:&quot;ponto-cr\u00edtico-raramente-discutido&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;10 \u2014 Aplica\u00e7\u00f5es do LPCC (Linear Prediction Cepstral Coefficients)&quot;,&quot;value&quot;:&quot;10-aplica\u00e7\u00f5es-do-lpcc-linear-prediction-cepstral-coefficients&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Por que LPCC \u00e9 usado na pr\u00e1tica&quot;,&quot;value&quot;:&quot;por-que-lpcc-\u00e9-usado-na-pr\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1. Reconhecimento e classifica\u00e7\u00e3o de fala (cl\u00e1ssico)&quot;,&quot;value&quot;:&quot;1-reconhecimento-e-classifica\u00e7\u00e3o-de-fala-cl\u00e1ssico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2. Diagn\u00f3stico vibroac\u00fastico e monitoramento de condi\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;2-diagn\u00f3stico-vibroac\u00fastico-e-monitoramento-de-condi\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3. Detec\u00e7\u00e3o de anomalias (Anomaly Detection)&quot;,&quot;value&quot;:&quot;3-detec\u00e7\u00e3o-de-anomalias-anomaly-detection&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4. Classifica\u00e7\u00e3o com Machine Learning cl\u00e1ssico&quot;,&quot;value&quot;:&quot;4-classifica\u00e7\u00e3o-com-machine-learning-cl\u00e1ssico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5. Monitoramento em tempo real (edge \/ firmware)&quot;,&quot;value&quot;:&quot;5-monitoramento-em-tempo-real-edge-firmware&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6. Aplica\u00e7\u00f5es em energia e eletromagnetismo&quot;,&quot;value&quot;:&quot;6-aplica\u00e7\u00f5es-em-energia-e-eletromagnetismo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7. Por que LPCC \u00e9 subestimado hoje&quot;,&quot;value&quot;:&quot;7-por-que-lpcc-\u00e9-subestimado-hoje&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo conceitual de uso do LPCC em classifica\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;exemplo-conceitual-de-uso-do-lpcc-em-classifica\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conclus\u00e3o&quot;,&quot;value&quot;:&quot;conclus\u00e3o&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="#1-lpc-linear-predictive-coding">1 — LPC (Linear Predictive Coding)</a><ul class="eb-toc__list"><li><a href="#o-que-significa-lpc">O que significa LPC</a><li><a href="#eb-table-content-2">Intuição física e de sinal</a><li><a href="#eb-table-content-3">Modelo matemático do LPC</a><li><a href="#eb-table-content-4">Por que o LPC é importante para LPCC</a><li><a href="#eb-table-content-5">Implementação conceitual do LPC em C (visão geral)</a><li><a href="#eb-table-content-6">Exemplo em C — cálculo da autocorrelação</a><li><a href="#eb-table-content-7">Observações práticas para sistemas embarcados</a></li></ul><li><a href="#2-lpcc-linear-prediction-cepstral-coefficients">2 — LPCC (Linear Prediction Cepstral Coefficients)</a><ul class="eb-toc__list"><li><a href="#o-que-significa-lpcc">O que significa LPCC</a><li><a href="#eb-table-content-10">O que é o domínio cepstral (intuição)</a><li><a href="#eb-table-content-11">Relação matemática entre LPC e LPCC</a><li><a href="#eb-table-content-12">Por que LPCC é preferível ao LPC em Machine Learning</a><li><a href="#eb-table-content-13">Implementação em C — LPC → LPCC</a><li><a href="#eb-table-content-14">Observações importantes sobre o código</a><li><a href="#complexidade-computacional">Complexidade computacional</a></li></ul><li><a href="#3-cepstrum">3 — CEPSTRUM</a><ul class="eb-toc__list"><li><a href="#o-que-significa-cepstrum">O que significa Cepstrum</a><li><a href="#eb-table-content-18">Intuição física do Cepstrum</a><li><a href="#eb-table-content-19">Cepstrum “clássico” vs Cepstrum via LPC</a><ul class="eb-toc__list"><li><a href="#eb-table-content-20">1. Cepstrum via FFT (cepstrum clássico)</a><li><a href="#2-cepstrum-via-lpc-lpcc">2. Cepstrum via LPC (LPCC)</a></li></ul><li><a href="#eb-table-content-22">Por que o Cepstrum é tão poderoso</a><li><a href="#eb-table-content-23">Quefrência: interpretação correta</a><li><a href="#eb-table-content-24">Conexão direta com LPCC</a></li></ul><li><a href="#4-lp-linear-prediction">4 — LP (Linear Prediction)</a><ul class="eb-toc__list"><li><a href="#o-que-significa-lp">O que significa LP</a><li><a href="#eb-table-content-27">Predição linear como modelo autoregressivo (AR)</a><li><a href="#eb-table-content-28">Interpretação como filtro digital</a><li><a href="#estabilidade-do-modelo-lp">Estabilidade do modelo LP</a><li><a href="#escolha-da-ordem-do-modelo-p">Escolha da ordem do modelo (p)</a><li><a href="#eb-table-content-31">Relação direta entre LP, LPC e LPCC</a><li><a href="#eb-table-content-32">Exemplo conceitual em C — erro de predição</a></li></ul><li><a href="#5-ac-autocorrelation">5 — AC (Autocorrelation)</a><ul class="eb-toc__list"><li><a href="#o-que-significa-ac">O que significa AC</a><li><a href="#eb-table-content-35">Definição matemática da autocorrelação</a><li><a href="#eb-table-content-36">Por que a autocorrelação é usada em LPC</a><ul class="eb-toc__list"><li><a href="#1-garante-estabilidade-do-filtro-lpc">1. Garante estabilidade do filtro LPC</a><li><a href="#eb-table-content-38">2. Reduz sensibilidade a ruído</a><li><a href="#eb-table-content-39">3. Conecta LP a mínimos quadrados</a></li></ul><li><a href="#eb-table-content-40">Equações de Yule-Walker</a><li><a href="#eb-table-content-41">Interpretação física da autocorrelação</a><li><a href="#eb-table-content-42">Autocorrelação e estacionariedade</a><li><a href="#eb-table-content-43">Implementação em C — autocorrelação (revisão prática)</a><li><a href="#eb-table-content-44">Consequências práticas em sistemas embarcados</a></li></ul><li><a href="#6-lda-levinsondurbin-algorithm">6 — LDA (Levinson–Durbin Algorithm)</a><ul class="eb-toc__list"><li><a href="#o-que-significa-lda-neste-contexto">O que significa LDA neste contexto</a><li><a href="#eb-table-content-47">Por que Levinson–Durbin é essencial</a><li><a href="#estrutura-recursiva-do-algoritmo">Estrutura recursiva do algoritmo</a><li><a href="#eb-table-content-49">Interpretação física do coeficiente de reflexão</a><li><a href="#eb-table-content-50">Implementação completa em C — Levinson–Durbin</a><li><a href="#eb-table-content-51">Observações importantes sobre o código</a><li><a href="#papel-do-levinsondurbin-no-pipeline-completo">Papel do Levinson–Durbin no pipeline completo</a></li></ul><li><a href="#7-pe-prediction-error">7 — PE (Prediction Error)</a><ul class="eb-toc__list"><li><a href="#o-que-significa-pe">O que significa PE</a><li><a href="#eb-table-content-55">Energia do erro de predição</a><li><a href="#eb-table-content-56">Interpretação física do erro de predição</a><ul class="eb-toc__list"><li><a href="#em-fala">Em fala</a><li><a href="#eb-table-content-58">Em vibração mecânica</a></li></ul><li><a href="#eb-table-content-59">Relação direta entre PE e LPCC (coeficiente c₀)</a><li><a href="#eb-table-content-60">PE como métrica de qualidade do modelo</a><li><a href="#eb-table-content-61">Exemplo em C — cálculo explícito do erro médio</a><li><a href="#eb-table-content-62">PE e estabilidade numérica</a><li><a href="#eb-table-content-63">Relação final no pipeline</a><li><a href="#eb-table-content-64">Conclusão desta seção</a></li></ul><li><a href="#eb-table-content-65">8 — LPCC Extraction Pipeline (Pipeline de Extração de LPCC)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-66">Visão geral do pipeline</a><li><a href="#etapa-1-janelamento-do-sinal">Etapa 1 — Janelamento do sinal</a><li><a href="#eb-table-content-68">Etapa 2 — Autocorrelação</a><li><a href="#etapa-3-levinsondurbin">Etapa 3 — Levinson–Durbin</a><li><a href="#eb-table-content-70">Etapa 4 — Conversão LPC → LPCC</a><li><a href="#eb-table-content-71">Etapa 5 — Vetor de características</a><li><a href="#exemplo-completo-pipeline-integrado-em-c">Exemplo completo — pipeline integrado em C</a><li><a href="#eb-table-content-73">Considerações numéricas e de engenharia</a></li></ul><li><a href="#eb-table-content-74">9 — LPCC × MFCC (Comparação Conceitual e Prática)</a><ul class="eb-toc__list"><li><a href="#o-que-significa-mfcc">O que significa MFCC</a><li><a href="#eb-table-content-76">Diferença filosófica entre LPCC e MFCC</a><ul class="eb-toc__list"><li><a href="#eb-table-content-77">LPCC — modelo físico/matemático</a><li><a href="#mfcc-modelo-perceptual">MFCC — modelo perceptual</a></li></ul><li><a href="#pipeline-comparativo">Pipeline comparativo</a><ul class="eb-toc__list"><li><a href="#lpcc">LPCC</a><li><a href="#mfcc">MFCC</a></li></ul><li><a href="#complexidade-computacional">Complexidade computacional</a><li><a href="#eb-table-content-83">Sensibilidade a ruído e não-linearidades</a><li><a href="#interpretabilidade-dos-coeficientes">Interpretabilidade dos coeficientes</a><li><a href="#eb-table-content-85">Exemplo prático de escolha</a><li><a href="#eb-table-content-86">Ponto crítico raramente discutido</a></li></ul><li><a href="#eb-table-content-87">10 — Aplicações do LPCC (Linear Prediction Cepstral Coefficients)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-88">Por que LPCC é usado na prática</a><li><a href="#eb-table-content-89">1. Reconhecimento e classificação de fala (clássico)</a><li><a href="#eb-table-content-90">2. Diagnóstico vibroacústico e monitoramento de condição</a><li><a href="#eb-table-content-91">3. Detecção de anomalias (Anomaly Detection)</a><li><a href="#eb-table-content-92">4. Classificação com Machine Learning clássico</a><li><a href="#5-monitoramento-em-tempo-real-edge-firmware">5. Monitoramento em tempo real (edge / firmware)</a><li><a href="#eb-table-content-94">6. Aplicações em energia e eletromagnetismo</a><li><a href="#eb-table-content-95">7. Por que LPCC é subestimado hoje</a><li><a href="#eb-table-content-96">Exemplo conceitual de uso do LPCC em classificação</a></li></ul><li><a href="#eb-table-content-97">Conclusão</a></ul></div></div></div></div></div>


<h2 class="wp-block-heading">1 — <strong>LPC (Linear Predictive Coding)</strong></h2>



<h3 class="wp-block-heading">O que significa LPC</h3>



<p class="wp-block-paragraph"><strong>LPC</strong> é o acrônimo de <strong>Linear Predictive Coding</strong> (<em>Codificação Preditiva Linear</em>).<br>Trata-se de um método matemático usado para <strong>modelar sinais</strong>, especialmente sinais de fala e áudio, assumindo que <strong>cada amostra do sinal pode ser aproximada como uma combinação linear de amostras passadas</strong>.</p>



<p class="wp-block-paragraph">Em termos simples:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">o LPC tenta responder à pergunta<br><em>“Dado o passado recente do sinal, qual é o melhor valor para a próxima amostra?”</em></p>
</blockquote>



<p class="wp-block-paragraph">Essa ideia é central em processamento de fala, reconhecimento de padrões acústicos e, mais recentemente, em pipelines de <strong>extração de características cepstrais</strong>, como o <strong>LPCC</strong>.</p>



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



<h3 class="wp-block-heading">Intuição física e de sinal</h3>



<p class="wp-block-paragraph">No contexto de fala (mas não limitado a ele), o LPC modela o sinal como:</p>



<ul class="wp-block-list">
<li>Uma <strong>fonte de excitação</strong> (ex.: vibração das cordas vocais)</li>



<li>Um <strong>filtro linear</strong> (trato vocal, cavidade acústica, ou sistema ressonante)</li>
</ul>



<p class="wp-block-paragraph">Matematicamente, o sinal é tratado como a saída de um <strong>filtro tudo-polo (all-pole)</strong> excitado por um sinal simples.</p>



<p class="wp-block-paragraph">Isso é importante porque:</p>



<ul class="wp-block-list">
<li>Formantes (ressonâncias) aparecem naturalmente nos polos do modelo</li>



<li>O modelo é <strong>compacto</strong>, <strong>computacionalmente eficiente</strong> e <strong>estável</strong></li>
</ul>



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



<h3 class="wp-block-heading">Modelo matemático do LPC</h3>



<p class="wp-block-paragraph">O sinal discreto ( x[n] ) é modelado como:</p>



<p class="wp-block-paragraph">\[<br>x[n] = -\sum_{k=1}^{p} a_k , x[n-k] + e[n]<br>\]



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



<ul class="wp-block-list">
<li>\( a_k \) → coeficientes LPC</li>



<li>\( p \) → ordem do modelo</li>



<li>\( e[n] \) → erro de predição (resíduo)</li>
</ul>



<p class="wp-block-paragraph">O objetivo do LPC é <strong>escolher os coeficientes \( a_k \)</strong> que <strong>minimizam a energia média do erro</strong>.</p>



<p class="wp-block-paragraph">Isso leva diretamente às <strong>Equações de Yule-Walker</strong>, resolvidas normalmente pelo <strong>algoritmo de Levinson-Durbin</strong> — que veremos em código C mais à frente.</p>



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



<h3 class="wp-block-heading">Por que o LPC é importante para LPCC</h3>



<p class="wp-block-paragraph">Aqui está o ponto-chave que conecta esta seção ao restante do artigo:</p>



<ul class="wp-block-list">
<li><strong>LPCC (Linear Prediction Cepstral Coefficients)</strong> <strong>não existem sem LPC</strong></li>



<li>O LPC fornece:
<ul class="wp-block-list">
<li>Os <strong>coeficientes do filtro</strong></li>



<li>A <strong>estrutura espectral</strong></li>
</ul>
</li>



<li>O LPCC transforma esses coeficientes em um <strong>domínio cepstral</strong>, mais adequado para:
<ul class="wp-block-list">
<li>Reconhecimento de padrões</li>



<li>Classificação</li>



<li>Machine Learning clássico</li>
</ul>
</li>
</ul>



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



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>LPC modela o sistema</strong><br><strong>LPCC descreve o sistema</strong></p>
</blockquote>



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



<h3 class="wp-block-heading">Implementação conceitual do LPC em C (visão geral)</h3>



<p class="wp-block-paragraph">Antes do código completo, o pipeline típico em C é:</p>



<ol class="wp-block-list">
<li>Janela do sinal (ex.: Hamming)</li>



<li>Cálculo da autocorrelação</li>



<li>Levinson-Durbin → coeficientes LPC</li>



<li>Conversão LPC → LPCC (próxima seção futura)</li>
</ol>



<p class="wp-block-paragraph">Nesta seção, focamos apenas no <strong>LPC puro</strong>.</p>



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



<h3 class="wp-block-heading">Exemplo em C — cálculo da autocorrelação</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>#include &lt;stddef.h>

/**
 * Calcula a autocorrelação de um sinal
 * x      : sinal de entrada
 * N      : número de amostras
 * p      : ordem LPC
 * r      : vetor de autocorrelação (tamanho p+1)
 */
void autocorrelation(const float *x, size_t N, size_t p, float *r)
{
    for (size_t k = 0; k &lt;= p; k++) {
        r&#91;k&#93; = 0.0f;
        for (size_t n = k; n &lt; N; n++) {
            r&#91;k&#93; += x&#91;n&#93; * x&#91;n - k&#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: #D8DEE9FF">#include &lt;stddef.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">/**</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">*</span><span style="color: #D8DEE9FF"> Calcula a autocorrelação de um sinal</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">*</span><span style="color: #D8DEE9FF"> x      : sinal de entrada</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">*</span><span style="color: #D8DEE9FF"> N      : número de amostras</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">*</span><span style="color: #D8DEE9FF"> p      : ordem LPC</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">*</span><span style="color: #D8DEE9FF"> r      : vetor de autocorrelação (tamanho p+1)</span></span>
<span class="line"><span style="color: #D8DEE9FF"> */</span></span>
<span class="line"><span style="color: #D8DEE9FF">void autocorrelation(const float *x, size_t N, size_t p, float *r)</span></span>
<span class="line"><span style="color: #D8DEE9FF">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    for (size_t k = 0; k &lt;= p; k++) {</span></span>
<span class="line"><span style="color: #D8DEE9FF">        r</span><span style="color: #ECEFF4">&#91;</span><span style="color: #88C0D0">k</span><span style="color: #ECEFF4">&#93;</span><span style="color: #D8DEE9FF"> = 0.0f;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        for (size_t n = k; n &lt; N; n++) {</span></span>
<span class="line"><span style="color: #D8DEE9FF">            r</span><span style="color: #ECEFF4">&#91;</span><span style="color: #88C0D0">k</span><span style="color: #ECEFF4">&#93;</span><span style="color: #D8DEE9FF"> += x</span><span style="color: #ECEFF4">&#91;</span><span style="color: #88C0D0">n</span><span style="color: #ECEFF4">&#93;</span><span style="color: #D8DEE9FF"> * x&#91;n - k&#93;;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        }</span></span>
<span class="line"><span style="color: #D8DEE9FF">    }</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esse vetor <code>r[k]</code> é exatamente o que alimenta o algoritmo de <strong>Levinson-Durbin</strong>, que gera os coeficientes LPC.</p>



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



<h3 class="wp-block-heading">Observações práticas para sistemas embarcados</h3>



<p class="wp-block-paragraph">Do ponto de vista de firmware e IoT:</p>



<ul class="wp-block-list">
<li>LPC é <strong>extremamente viável</strong> em microcontroladores</li>



<li>Complexidade: ( O(p^2) )</li>



<li>Pode ser executado:
<ul class="wp-block-list">
<li>Em <strong>tempo real</strong></li>



<li>Com <strong>DMA + buffers circulares</strong></li>



<li>Integrado a pipelines FreeRTOS ou Zephyr</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">Isso explica por que LPC/LPCC ainda são relevantes mesmo em tempos de deep learning.</p><p>The post <a href="https://mcu.tec.br/algoritimos/dsp/lpcc-linear-prediction-cepstral-coefficients-fundamentos-algoritmos-e-aplicacoes-em-sistemas-embarcados/">LPCC (Linear Prediction Cepstral Coefficients): Fundamentos, Algoritmos e Aplicações em Sistemas Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1254</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>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>
		<item>
		<title>Pipeline em Microcontroladores: Como Funciona no ARM Cortex-M55 e Por Que Isso Importa</title>
		<link>https://mcu.tec.br/microcontroladores/pipeline-em-microcontroladores-como-funciona-no-arm-cortex-m55-e-por-que-isso-importa/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pipeline-em-microcontroladores-como-funciona-no-arm-cortex-m55-e-por-que-isso-importa</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Sun, 18 May 2025 00:32:18 +0000</pubDate>
				<category><![CDATA[microcontroladores]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[arm cortex-m55]]></category>
		<category><![CDATA[arm helium]]></category>
		<category><![CDATA[arquitetura pipeline]]></category>
		<category><![CDATA[cortex-m55 pipeline]]></category>
		<category><![CDATA[cortex-m66]]></category>
		<category><![CDATA[instruções vetoriais MVE]]></category>
		<category><![CDATA[microcontrolador para IA]]></category>
		<category><![CDATA[microcontroladores armv8-m]]></category>
		<category><![CDATA[pipeline em microcontroladores]]></category>
		<category><![CDATA[pipeline fetch decode execute]]></category>
		<category><![CDATA[processamento digital de sinais]]></category>
		<category><![CDATA[programação cortex-m]]></category>
		<category><![CDATA[tempo real cortex]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=514</guid>

					<description><![CDATA[<p>Entenda o que é pipeline em microcontroladores e descubra como o ARM Cortex-M55 usa essa técnica para acelerar tarefas de IA, DSP e tempo real. Veja vantagens, comparações e como programar melhor para ele.</p>
<p>The post <a href="https://mcu.tec.br/microcontroladores/pipeline-em-microcontroladores-como-funciona-no-arm-cortex-m55-e-por-que-isso-importa/">Pipeline em Microcontroladores: Como Funciona no ARM Cortex-M55 e Por Que Isso Importa</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Os microcontroladores baseados no núcleo Cortex-M55 da ARM representam uma nova geração de dispositivos voltados para aplicações embarcadas que exigem alto desempenho aliado a eficiência energética. Lançado como parte da linha Armv8.1-M, o Cortex-M55 é o primeiro núcleo da família Cortex-M a incluir suporte nativo ao Helium (também conhecido como M-Profile Vector Extension, ou MVE), o que o torna especialmente adequado para tarefas de aprendizado de máquina, processamento de sinais digitais (DSP) e aplicações de visão computacional.</p>



<p class="wp-block-paragraph">Projetado para atender às demandas crescentes de aplicações inteligentes em sensores, wearables, dispositivos médicos e automação industrial, o Cortex-M55 combina desempenho escalável com simplicidade de programação. Um dos principais elementos que possibilita esse desempenho é sua arquitetura <em>pipeline</em>, que permite processar múltiplas instruções de maneira eficiente e previsível. Esse recurso é fundamental para garantir respostas rápidas em sistemas de tempo real, sem sacrificar a economia de energia.</p>



<p class="wp-block-paragraph">Neste artigo, vamos explorar em detalhes o funcionamento do <em>pipeline</em> no Cortex-M55, explicando o que é essa técnica, como ela é estruturada no núcleo e quais as vantagens práticas que ela oferece aos desenvolvedores de sistemas embarcados.</p>



<h3 class="wp-block-heading">O que é Pipeline em Microcontroladores</h3>



<p class="wp-block-paragraph">O conceito de <em>pipeline</em> (ou &#8220;linha de montagem&#8221;) em microcontroladores é uma técnica fundamental de otimização de desempenho adotada nos processadores modernos. Inspirado na lógica de produção industrial, o <em>pipeline</em> permite que múltiplas instruções sejam processadas simultaneamente, cada uma em uma fase diferente do ciclo de execução. Assim, enquanto uma instrução está sendo decodificada, outra pode estar sendo buscada, e uma terceira pode estar sendo executada.</p>



<p class="wp-block-paragraph">Essa divisão em estágios — como busca (fetch), decodificação (decode) e execução (execute) — cria um fluxo contínuo de instruções através do processador, aumentando significativamente a taxa de entrega de resultados (throughput) e reduzindo a ociosidade do sistema. Isso se traduz em maior eficiência e menor consumo de energia por operação, aspectos cruciais para aplicações embarcadas.</p>



<p class="wp-block-paragraph">Nos microcontroladores, diferentemente de processadores de propósito geral, a arquitetura de pipeline tende a ser mais simples e previsível, já que muitos sistemas embarcados operam sob requisitos rígidos de tempo real. Portanto, a previsibilidade do tempo de execução é mais importante do que a velocidade bruta. Essa simplicidade também facilita o desenvolvimento e a validação de firmware confiável.</p>



<p class="wp-block-paragraph">Com a chegada do Cortex-M55, o conceito de <em>pipeline</em> foi ainda mais refinado. Ele oferece um pipeline mais profundo que os modelos anteriores, com estágios adicionais que permitem atingir maior desempenho e suporte a instruções vetoriais. O objetivo não é apenas acelerar o código sequencial tradicional, mas também melhorar o desempenho de algoritmos de inteligência artificial e DSP, que se beneficiam imensamente da arquitetura paralela e dos recursos de execução antecipada presentes nesse núcleo.</p>



<h3 class="wp-block-heading">Estrutura do Pipeline do Cortex-M55</h3>



<p class="wp-block-paragraph">O núcleo Cortex-M55 introduz uma arquitetura de <em>pipeline</em> mais avançada em comparação aos seus predecessores da família Cortex-M. Com o objetivo de combinar alto desempenho com previsibilidade e baixo consumo de energia, o pipeline do Cortex-M55 é composto por <strong>até cinco estágios</strong> principais, cuja organização reflete as demandas contemporâneas de processamento vetorial e aprendizado de máquina embarcado.</p>



<p class="wp-block-paragraph">Os cinco estágios típicos do pipeline do Cortex-M55 são:</p>



<ol class="wp-block-list">
<li><strong>Fetch (IF – Instruction Fetch)</strong><br>Neste estágio, a unidade de busca de instruções (fetch unit) acessa a memória de instruções e busca a próxima instrução a ser executada. O Cortex-M55 pode buscar mais de uma instrução por ciclo graças a mecanismos de pré-busca e cache de instruções, otimizando o acesso à memória.</li>



<li><strong>Decode (ID – Instruction Decode)</strong><br>A instrução buscada é decodificada, e os operandos são identificados. O decodificador também determina o tipo de operação (aritmética, lógica, salto, etc.), ativando as unidades funcionais adequadas. Este estágio também prepara os caminhos de dados necessários e identifica potenciais riscos (hazards).</li>



<li><strong>Register Read / Operand Fetch (RR)</strong><br>Os registradores indicados pela instrução são lidos. Isso inclui registradores escalares (como R0 a R15) e, quando habilitado, também os registradores vetoriais utilizados pelo Helium/MVE. A separação deste estágio permite preparar operandos em paralelo com outras instruções que estejam sendo decodificadas ou buscadas.</li>



<li><strong>Execute (EX)</strong><br>A instrução é efetivamente executada neste estágio. Aqui ocorrem as operações de ALU (unidade lógica-aritmética), multiplicação, acesso à unidade de ponto flutuante (quando presente), ou execução de operações vetoriais no caso de instruções MVE. Saltos e desvios também são resolvidos neste estágio, podendo impactar o fluxo de instruções subsequentes.</li>



<li><strong>Write Back (WB)</strong><br>O resultado da operação é escrito de volta no registrador de destino. Essa escrita pode ocorrer nos registradores principais, nos registradores vetoriais ou em áreas da memória dependendo do tipo de instrução.</li>
</ol>



<p class="wp-block-paragraph">Vale destacar que o pipeline do Cortex-M55 é <strong>in-order</strong>, ou seja, as instruções são executadas na ordem em que aparecem no código. Isso reduz a complexidade da lógica de controle e facilita a previsibilidade de execução, especialmente importante em aplicações de tempo real. Ainda assim, ele conta com recursos como pré-busca, buffers de instrução e controle de <em>branch</em> antecipado para minimizar <em>stalls</em> (paradas no pipeline) e maximizar o desempenho contínuo.</p>



<p class="wp-block-paragraph">Além disso, ao habilitar o Helium, o pipeline adapta seu comportamento para lidar com o paralelismo implícito das instruções vetoriais. Essa capacidade é suportada por unidades de execução específicas, que operam em conjunto com o pipeline base, compartilhando os estágios iniciais (como fetch e decode) mas utilizando caminhos dedicados nos estágios de execução e escrita.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="931" height="384" src="https://mcu.tec.br/wp-content/uploads/2025/05/Captura-de-tela-de-2025-05-17-18-25-29.png" alt="" class="wp-image-515" srcset="https://mcu.tec.br/wp-content/uploads/2025/05/Captura-de-tela-de-2025-05-17-18-25-29.png 931w, https://mcu.tec.br/wp-content/uploads/2025/05/Captura-de-tela-de-2025-05-17-18-25-29-300x124.png 300w, https://mcu.tec.br/wp-content/uploads/2025/05/Captura-de-tela-de-2025-05-17-18-25-29-768x317.png 768w" sizes="(max-width: 931px) 100vw, 931px" /></figure>



<h3 class="wp-block-heading">Papéis e Vantagens do Pipeline no Cortex-M55</h3>



<p class="wp-block-paragraph">O uso de <em>pipeline</em> no Cortex-M55 vai além da simples aceleração da execução de instruções; ele é parte central de uma estratégia arquitetural voltada à eficiência e versatilidade em aplicações embarcadas modernas. Ao organizar as instruções em uma linha de execução segmentada, o Cortex-M55 consegue equilibrar requisitos como desempenho, consumo energético e previsibilidade temporal — elementos essenciais para sistemas de tempo real, sensores inteligentes e aplicações com aprendizado de máquina embarcado.</p>



<p class="wp-block-paragraph">Um dos papéis fundamentais do pipeline é permitir a <strong>sobreposição de instruções</strong>, garantindo que cada estágio do processador esteja sempre ocupado com uma tarefa. Isso evita ciclos ociosos e melhora a taxa de instruções por ciclo (IPC). Por exemplo, enquanto uma instrução está sendo executada, outra pode estar sendo decodificada e uma terceira sendo buscada da memória. Essa simultaneidade é o que torna o pipeline tão eficiente.</p>



<p class="wp-block-paragraph">No Cortex-M55, essa eficiência se traduz em várias vantagens práticas:</p>



<ul class="wp-block-list">
<li><strong>Aumento de desempenho com consumo energético moderado:</strong> graças ao pipeline, é possível atingir altas frequências operacionais sem necessidade de estruturas agressivas de especulação ou execução fora de ordem, que consumiriam mais energia.</li>



<li><strong>Suporte robusto a instruções vetoriais (Helium/MVE):</strong> o pipeline do Cortex-M55 está preparado para lidar com o paralelismo implícito de instruções vetoriais, permitindo que múltiplos dados sejam processados simultaneamente dentro do mesmo ciclo de execução. Essa característica é crucial para algoritmos de processamento de sinais, imagens e inferência de redes neurais.</li>



<li><strong>Previsibilidade temporal para sistemas de tempo real:</strong> como as instruções seguem um caminho ordenado, é possível prever com alto grau de precisão o tempo de execução de cada tarefa, mesmo em sistemas mais complexos. Isso torna o Cortex-M55 altamente confiável em aplicações críticas.</li>



<li><strong>Baixa latência de interrupção:</strong> mesmo com um pipeline mais profundo que os modelos anteriores, o Cortex-M55 mantém a capacidade de resposta rápida a interrupções, essencial para microcontroladores que atuam como sensores ou controladores em sistemas embarcados.</li>
</ul>



<p class="wp-block-paragraph">Em resumo, o pipeline do Cortex-M55 atua como um facilitador para que o microcontrolador seja não apenas mais rápido, mas também mais adaptável aos diferentes perfis de aplicação que surgem com a expansão da IoT, da automação industrial e das interfaces homem-máquina inteligentes.</p>



<h3 class="wp-block-heading">Comparações com Arquiteturas Cortex-M Anteriores</h3>



<p class="wp-block-paragraph">Para compreender a relevância das melhorias introduzidas no Cortex-M55, é fundamental compará-lo com os modelos anteriores da linha Cortex-M, como o Cortex-M3, Cortex-M4 e Cortex-M7. Embora todos adotem alguma forma de pipeline para aumentar o desempenho, a profundidade, especialização dos estágios e integração com extensões modernas como o Helium diferenciam profundamente o M55 de seus antecessores.</p>



<p class="wp-block-paragraph">O Cortex-M3 e o Cortex-M4, por exemplo, utilizam um <strong>pipeline de três estágios</strong>: Fetch, Decode e Execute. Esse modelo simples é eficiente para muitas aplicações embarcadas, mas encontra limitações ao lidar com instruções mais complexas ou com múltiplos acessos à memória. Ele também apresenta maior sensibilidade a desvios de fluxo (branches), o que impacta o desempenho em laços e estruturas condicionais.</p>



<p class="wp-block-paragraph">O Cortex-M7 introduziu um <strong>pipeline de seis estágios</strong>, incorporando melhorias no acesso à memória e maior paralelismo interno. Ele também adicionou suporte à execução fora de ordem em algumas configurações, mas isso aumentou a complexidade da previsão de tempo de execução, tornando-o menos previsível em sistemas críticos de tempo real.</p>



<p class="wp-block-paragraph">Já o Cortex-M55 implementa um <strong>pipeline de cinco estágios</strong> balanceado e eficiente, com foco explícito em previsibilidade, suporte vetorial e otimização energética. Ao invés de buscar maior profundidade como no M7, o M55 aposta em um pipeline mais curto que ainda permite instruções complexas, com suporte direto a instruções SIMD (Single Instruction, Multiple Data) por meio do Helium/MVE. Com isso, ele entrega desempenho comparável ou superior ao M7 em tarefas vetoriais, com menor consumo de energia e menor complexidade de controle.</p>



<p class="wp-block-paragraph">Além disso, a forma como o Cortex-M55 lida com <em>branches</em> é mais refinada, com técnicas de previsão e cancelamento antecipado que reduzem significativamente os <em>pipeline stalls</em>. Essa capacidade o torna ideal para algoritmos com muitos laços, como filtros digitais ou redes neurais convolucionais.</p>



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



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Núcleo</th><th>Estágios de Pipeline</th><th>Foco Principal</th><th>Suporte a Vetor/ML</th></tr></thead><tbody><tr><td>Cortex-M3</td><td>3</td><td>Baixo custo, uso geral</td><td>Não</td></tr><tr><td>Cortex-M4</td><td>3</td><td>DSP básico com FPU</td><td>Não</td></tr><tr><td>Cortex-M7</td><td>6</td><td>Alto desempenho geral</td><td>Parcial (SIMD leve)</td></tr><tr><td>Cortex-M55</td><td>5</td><td>IA embarcada, DSP avançado, Helium</td><td>Sim (Helium/MVE)</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Essa comparação mostra que o Cortex-M55 não é apenas uma evolução incremental, mas uma resposta arquitetural às demandas emergentes da computação embarcada inteligente.</p>



<h3 class="wp-block-heading">Estratégias de Programação Eficientes para Pipelines no Cortex-M55</h3>



<p class="wp-block-paragraph">Tirar o máximo proveito da arquitetura de pipeline do Cortex-M55 requer não apenas conhecer sua estrutura, mas também aplicar estratégias adequadas durante a programação. Como em qualquer arquitetura <em>pipelined</em>, determinadas abordagens de codificação e compilação podem ajudar a evitar gargalos, melhorar o desempenho e preservar a previsibilidade — aspecto essencial em sistemas embarcados.</p>



<p class="wp-block-paragraph">A seguir, destacamos algumas estratégias fundamentais:</p>



<h4 class="wp-block-heading">1. <strong>Evite Saltos Incondicionais Excessivos</strong></h4>



<p class="wp-block-paragraph">Instruções de desvio (<em>branch</em>) interrompem o fluxo sequencial do pipeline. Embora o Cortex-M55 possua técnicas de previsão de branches, saltos imprevisíveis (como os resultantes de <em>switch-case</em> mal organizados ou laços com condições variáveis) podem causar <em>pipeline flushes</em>, eliminando o conteúdo parcialmente processado. Sempre que possível:</p>



<ul class="wp-block-list">
<li>Reestruture laços para que tenham saídas previsíveis.</li>



<li>Agrupe os casos mais frequentes no início de <em>switch</em>.</li>



<li>Prefira comparações simples e condicionais diretas.</li>
</ul>



<h4 class="wp-block-heading">2. <strong>Alinhe Dados e Instruções</strong></h4>



<p class="wp-block-paragraph">O desempenho do pipeline depende também da memória. Instruções desalinhadas, ou acessos a dados mal posicionados, exigem ciclos adicionais de espera. Utilize:</p>



<ul class="wp-block-list">
<li>Alinhamento de estruturas (<code>__attribute__((aligned(4)))</code> no GCC).</li>



<li>Evite acessar dados cruzando fronteiras de palavra (32 bits).</li>
</ul>



<h4 class="wp-block-heading">3. <strong>Aproveite o Helium/MVE com Blocos Vetoriais</strong></h4>



<p class="wp-block-paragraph">Com Helium ativado, o compilador pode gerar instruções vetoriais automáticas (auto-vectorization) para loops bem definidos. Para isso:</p>



<ul class="wp-block-list">
<li>Use laços simples com limites constantes.</li>



<li>Evite dependências entre iterações.</li>



<li>Utilize tipos vetoriais (<code>int16x8_t</code>, <code>float32x4_t</code>, etc.) com intrínsecos ARM.</li>
</ul>



<p class="wp-block-paragraph">Exemplo em C com intrínseco MVE:</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" data-code="#include &lt;arm_mve.h&gt;

void soma_vetores(int32_t *a, int32_t *b, int32_t *c) {
    mve_pred16_t p0 = vctp32q(16);
    int32x4_t va = vldrwq_z_s32(&amp;a[0], p0);
    int32x4_t vb = vldrwq_z_s32(&amp;b[0], p0);
    int32x4_t vc = vaddq_m_s32(va, vb, p0);
    vstrwq_p_s32(&amp;c[0], vc, p0);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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">#include &lt;arm_mve.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">soma_vetores</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">int32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #A3BE8C">a,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">int32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #A3BE8C">b,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">int32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #A3BE8C">c</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">mve_pred16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">p0</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">vctp32q</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">16</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">int32x4_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">va</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">vldrwq_z_s32</span><span style="color: #ECEFF4">(&amp;</span><span style="color: #88C0D0">a[0],</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">p0</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">int32x4_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">vb</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">vldrwq_z_s32</span><span style="color: #ECEFF4">(&amp;</span><span style="color: #88C0D0">b[0],</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">p0</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">int32x4_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">vc</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">vaddq_m_s32</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">va,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">vb,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">p0</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">vstrwq_p_s32(</span><span style="color: #ECEFF4">&amp;</span><span style="color: #88C0D0">c[0],</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">vc,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">p0</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esse código soma vetores usando Helium, executando 4 operações por ciclo.</p>



<h4 class="wp-block-heading">4. <strong>Minimize Acessos à Memória e Maximize Uso de Registradores</strong></h4>



<p class="wp-block-paragraph">Como o pipeline depende da disponibilidade dos operandos nos momentos certos, acessos frequentes à RAM podem gerar <em>stalls</em>. Prefira:</p>



<ul class="wp-block-list">
<li>Variáveis locais ao invés de globais.</li>



<li>Cálculos intermediários mantidos em registradores.</li>
</ul>



<h4 class="wp-block-heading">5. <strong>Use Compiladores Otimizados e Flags Apropriadas</strong></h4>



<p class="wp-block-paragraph">Compiladores como o Arm Compiler 6 e o GCC têm suporte explícito ao Cortex-M55 e Helium. Utilize flags como:</p>



<pre class="wp-block-preformatted"><code>-mcpu=cortex-m55 -mfpu=auto -mfloat-abi=hard -O3<br></code></pre>



<p class="wp-block-paragraph">Essas opções instruem o compilador a gerar código otimizado para pipeline e SIMD.</p>



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



<p class="wp-block-paragraph">Essas estratégias ajudam o desenvolvedor a alcançar o melhor equilíbrio entre desempenho, consumo de energia e previsibilidade, tirando proveito pleno do pipeline e dos recursos vetoriais do Cortex-M55.</p>



<h3 class="wp-block-heading">Conclusão e Aplicações Práticas do Pipeline no Cortex-M55</h3>



<p class="wp-block-paragraph">O pipeline no Cortex-M55 é mais do que uma técnica de desempenho — é um elemento central de sua arquitetura, projetado para lidar com as exigências crescentes de aplicações embarcadas inteligentes. Ao permitir a execução simultânea de múltiplas instruções em diferentes estágios, o pipeline proporciona um salto em eficiência, mantendo a previsibilidade necessária em sistemas de tempo real.</p>



<p class="wp-block-paragraph">Ao longo deste artigo, vimos que o Cortex-M55 combina uma estrutura de pipeline balanceada com recursos vetoriais do Helium/MVE, resultando em um microcontrolador versátil, capaz de atender desde tarefas clássicas de controle até aplicações modernas de aprendizado de máquina embarcado.</p>



<p class="wp-block-paragraph">As principais vantagens do pipeline no Cortex-M55 incluem:</p>



<ul class="wp-block-list">
<li><strong>Maior throughput com baixo consumo</strong>: ideal para dispositivos alimentados por bateria.</li>



<li><strong>Compatibilidade com IA embarcada e DSP</strong>: graças ao suporte vetorial eficiente.</li>



<li><strong>Previsibilidade temporal</strong>: essencial para aplicações médicas, industriais e automotivas.</li>



<li><strong>Tempo de resposta rápido a interrupções</strong>, mesmo com um pipeline mais profundo.</li>
</ul>



<p class="wp-block-paragraph"><strong>Aplicações práticas</strong> incluem:</p>



<ul class="wp-block-list">
<li>Dispositivos de voz e reconhecimento de fala (com inferência embarcada).</li>



<li>Câmeras inteligentes e sensores com classificação em tempo real.</li>



<li>Controladores de motores com algoritmos de filtro digital e PID otimizados.</li>



<li>Wearables com detecção de gestos, batimentos cardíacos e análise de sinais biológicos.</li>



<li>Interfaces homem-máquina com resposta rápida e feedback sensorial.</li>
</ul>



<p class="wp-block-paragraph">O desenvolvedor que entende o funcionamento do pipeline no Cortex-M55 está melhor equipado para escrever firmware mais eficiente, selecionar bibliotecas otimizadas e tomar decisões críticas de arquitetura embarcada. Mais do que uma melhoria incremental, esse conhecimento representa uma mudança de paradigma no desenvolvimento de microcontroladores para aplicações modernas e inteligentes.</p>



<h3 class="wp-block-heading">Referências Técnicas e Leituras Recomendadas</h3>



<ol class="wp-block-list">
<li><strong>ARM Developer Documentation – Cortex-M55</strong><br>Documentação oficial da Arm com detalhes técnicos sobre a arquitetura, pipeline e suporte ao Helium/MVE.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a class="" href="https://developer.arm.com/ip-products/processors/cortex-m/cortex-m55">https://developer.arm.com/ip-products/processors/cortex-m/cortex-m55</a></li>



<li><strong>Arm Cortex-M55 Technical Reference Manual</strong><br>Manual de referência técnica com detalhes de implementação, estágios do pipeline, latência de instruções, comportamento de branches e suporte a interrupções.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a>https://developer.arm.com/documentation/100985/latest</a></li>



<li><strong>Arm Helium Technology Overview</strong><br>Explicação do MVE (M-Profile Vector Extension), parte essencial do desempenho paralelo no Cortex-M55.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a>https://developer.arm.com/architectures/instruction-sets/simd/helium</a></li>



<li><strong>CMSIS-DSP and CMSIS-NN</strong><br>Bibliotecas otimizadas pela Arm para DSP e inferência com suporte ao pipeline vetorial do Cortex-M55.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a class="" href="https://github.com/ARM-software/CMSIS_5">https://github.com/ARM-software/CMSIS_5</a></li>



<li><strong>Introduction to Arm Cortex-M55 Processor (PDF)</strong><br>Documento introdutório incluído no material que você forneceu, com boas explicações sobre pipeline, fetch-decode-execute e paralelismo interno.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4c4.png" alt="📄" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>introduction-to-arm-cortex-m55-processor.pdf</em></li>
</ol>



<p class="wp-block-paragraph"></p><p>The post <a href="https://mcu.tec.br/microcontroladores/pipeline-em-microcontroladores-como-funciona-no-arm-cortex-m55-e-por-que-isso-importa/">Pipeline em Microcontroladores: Como Funciona no ARM Cortex-M55 e Por Que Isso Importa</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">514</post-id>	</item>
	</channel>
</rss>
