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

<channel>
	<title>DSP - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/categorias/algoritimos/dsp/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Mon, 11 May 2026 16:08:46 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mcu.tec.br/wp-content/uploads/2025/02/Robo-para-o-site-MCU.tec_.br-512x512-1-150x150.png</url>
	<title>DSP - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Conversor Analógico Delta-Sigma (ΔΣ ADC)</title>
		<link>https://mcu.tec.br/algoritimos/dsp/conversor-analogico-delta-sigma-%ce%b4%cf%83-adc/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=conversor-analogico-delta-sigma-%25ce%25b4%25cf%2583-adc</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Mon, 11 May 2026 16:07:50 +0000</pubDate>
				<category><![CDATA[ADC/DAC]]></category>
		<category><![CDATA[DSP]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1430</guid>

					<description><![CDATA[<p>Aprenda detalhadamente como funciona o conversor analógico Delta-Sigma (ΣΔ ADC), entendendo conceitos como oversampling, noise shaping, quantização, moduladores Sigma-Delta, filtros CIC, decimação, SNR, ENOB e DSD. Veja comparações entre ADC Flash, SAR e Pipeline, além de aplicações práticas em microcontroladores, FPGAs, áudio digital, instrumentação, sensores industriais, controle de potência e sistemas embarcados modernos. Um guia técnico e didático sobre a arquitetura Sigma-Delta aplicado ao universo MCU &#038; FPGA.</p>
<p>The post <a href="https://mcu.tec.br/algoritimos/dsp/conversor-analogico-delta-sigma-%ce%b4%cf%83-adc/">Conversor Analógico Delta-Sigma (ΔΣ ADC)</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-oj5nd wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-oj5nd "><div class="eb-toc-container eb-toc-oj5nd  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;O Problema da Quantiza\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;O Problema da Quantiza\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Superamostragem (Oversampling)&quot;,&quot;text&quot;:&quot;Superamostragem (Oversampling)&quot;,&quot;link&quot;:&quot;superamostragem-oversampling&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Estrutura Interna do Conversor Delta-Sigma&quot;,&quot;text&quot;:&quot;Estrutura Interna do Conversor Delta-Sigma&quot;,&quot;link&quot;:&quot;estrutura-interna-do-conversor-delta-sigma&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Vis\u00e3o Conceitual do Modulador&quot;,&quot;text&quot;:&quot;Vis\u00e3o Conceitual do Modulador&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;O Integrador&quot;,&quot;text&quot;:&quot;O Integrador&quot;,&quot;link&quot;:&quot;o-integrador&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Quantizador de 1 Bit&quot;,&quot;text&quot;:&quot;Quantizador de 1 Bit&quot;,&quot;link&quot;:&quot;quantizador-de-1-bit&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;DAC de Realimenta\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;DAC de Realimenta\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Fluxo de Bits (Bitstream)&quot;,&quot;text&quot;:&quot;Fluxo de Bits (Bitstream)&quot;,&quot;link&quot;:&quot;fluxo-de-bits-bitstream&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Noise Shaping&quot;,&quot;text&quot;:&quot;Noise Shaping&quot;,&quot;link&quot;:&quot;noise-shaping&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Filtro Digital de Decima\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Filtro Digital de Decima\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-9&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1. Filtrar ru\u00eddo de alta frequ\u00eancia&quot;,&quot;text&quot;:&quot;1. Filtrar ru\u00eddo de alta frequ\u00eancia&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2. Reduzir a taxa de amostragem&quot;,&quot;text&quot;:&quot;2. Reduzir a taxa de amostragem&quot;,&quot;link&quot;:&quot;2-reduzir-a-taxa-de-amostragem&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Rela\u00e7\u00e3o entre Oversampling e Resolu\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o entre Oversampling e Resolu\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-12&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Ordens do Modulador&quot;,&quot;text&quot;:&quot;Ordens do Modulador&quot;,&quot;link&quot;:&quot;ordens-do-modulador&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Compara\u00e7\u00e3o entre Delta-Sigma, SAR, Flash e Pipeline ADC&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o entre Delta-Sigma, SAR, Flash e Pipeline ADC&quot;,&quot;link&quot;:&quot;eb-table-content-14&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;ADC Flash&quot;,&quot;text&quot;:&quot;ADC Flash&quot;,&quot;link&quot;:&quot;adc-flash&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Estrutura&quot;,&quot;text&quot;:&quot;Estrutura&quot;,&quot;link&quot;:&quot;estrutura&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;link&quot;:&quot;eb-table-content-17&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;ADC SAR (Successive Approximation Register)&quot;,&quot;text&quot;:&quot;ADC SAR (Successive Approximation Register)&quot;,&quot;link&quot;:&quot;adc-sar-successive-approximation-register&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Funcionamento&quot;,&quot;text&quot;:&quot;Funcionamento&quot;,&quot;link&quot;:&quot;funcionamento&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Tempo de Convers\u00e3o&quot;,&quot;text&quot;:&quot;Tempo de Convers\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-20&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Caracter\u00edsticas&quot;,&quot;text&quot;:&quot;Caracter\u00edsticas&quot;,&quot;link&quot;:&quot;eb-table-content-21&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;link&quot;:&quot;eb-table-content-22&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;ADC Pipeline&quot;,&quot;text&quot;:&quot;ADC Pipeline&quot;,&quot;link&quot;:&quot;adc-pipeline&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Conceito&quot;,&quot;text&quot;:&quot;Conceito&quot;,&quot;link&quot;:&quot;conceito&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Caracter\u00edsticas&quot;,&quot;text&quot;:&quot;Caracter\u00edsticas&quot;,&quot;link&quot;:&quot;eb-table-content-25&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;link&quot;:&quot;eb-table-content-26&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Por que o Delta-Sigma possui Alta Lat\u00eancia?&quot;,&quot;text&quot;:&quot;Por que o Delta-Sigma possui Alta Lat\u00eancia?&quot;,&quot;link&quot;:&quot;eb-table-content-27&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Aplica\u00e7\u00f5es Ideais para Delta-Sigma&quot;,&quot;text&quot;:&quot;Aplica\u00e7\u00f5es Ideais para Delta-Sigma&quot;,&quot;link&quot;:&quot;eb-table-content-28&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;\u00c1udio Digital&quot;,&quot;text&quot;:&quot;\u00c1udio Digital&quot;,&quot;link&quot;:&quot;eb-table-content-29&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Instrumenta\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Instrumenta\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-30&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Sensores de Precis\u00e3o&quot;,&quot;text&quot;:&quot;Sensores de Precis\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-31&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Microcontroladores Modernos&quot;,&quot;text&quot;:&quot;Microcontroladores Modernos&quot;,&quot;link&quot;:&quot;microcontroladores-modernos&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Uso em FPGAs&quot;,&quot;text&quot;:&quot;Uso em FPGAs&quot;,&quot;link&quot;:&quot;uso-em-fpgas&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Moduladores Delta-Sigma de Ordens Superiores&quot;,&quot;text&quot;:&quot;Moduladores Delta-Sigma de Ordens Superiores&quot;,&quot;link&quot;:&quot;moduladores-delta-sigma-de-ordens-superiores&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Noise Shaping em Diferentes Ordens&quot;,&quot;text&quot;:&quot;Noise Shaping em Diferentes Ordens&quot;,&quot;link&quot;:&quot;noise-shaping-em-diferentes-ordens&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Primeira Ordem&quot;,&quot;text&quot;:&quot;Primeira Ordem&quot;,&quot;link&quot;:&quot;primeira-ordem&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Segunda Ordem&quot;,&quot;text&quot;:&quot;Segunda Ordem&quot;,&quot;link&quot;:&quot;segunda-ordem&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Terceira Ordem&quot;,&quot;text&quot;:&quot;Terceira Ordem&quot;,&quot;link&quot;:&quot;terceira-ordem&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Rela\u00e7\u00e3o entre Ordem e SNR&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o entre Ordem e SNR&quot;,&quot;link&quot;:&quot;eb-table-content-39&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Primeira ordem&quot;,&quot;text&quot;:&quot;Primeira ordem&quot;,&quot;link&quot;:&quot;primeira-ordem&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Segunda ordem&quot;,&quot;text&quot;:&quot;Segunda ordem&quot;,&quot;link&quot;:&quot;segunda-ordem&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Terceira ordem&quot;,&quot;text&quot;:&quot;Terceira ordem&quot;,&quot;link&quot;:&quot;terceira-ordem&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Problema da Estabilidade&quot;,&quot;text&quot;:&quot;Problema da Estabilidade&quot;,&quot;link&quot;:&quot;problema-da-estabilidade&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Arquitetura MASH (Multi-Stage Noise Shaping)&quot;,&quot;text&quot;:&quot;Arquitetura MASH (Multi-Stage Noise Shaping)&quot;,&quot;link&quot;:&quot;arquitetura-mash-multi-stage-noise-shaping&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Quantizadores Multi-Bit&quot;,&quot;text&quot;:&quot;Quantizadores Multi-Bit&quot;,&quot;link&quot;:&quot;quantizadores-multi-bit&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Filtros de Decima\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Filtros de Decima\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-46&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Filtros CIC&quot;,&quot;text&quot;:&quot;Filtros CIC&quot;,&quot;link&quot;:&quot;filtros-cic&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;ENOB (Effective Number Of Bits)&quot;,&quot;text&quot;:&quot;ENOB (Effective Number Of Bits)&quot;,&quot;link&quot;:&quot;enob-effective-number-of-bits&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;THD e SINAD&quot;,&quot;text&quot;:&quot;THD e SINAD&quot;,&quot;link&quot;:&quot;thd-e-sinad&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;THD&quot;,&quot;text&quot;:&quot;THD&quot;,&quot;link&quot;:&quot;thd&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;SINAD&quot;,&quot;text&quot;:&quot;SINAD&quot;,&quot;link&quot;:&quot;sinad&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Problema do Clock Jitter&quot;,&quot;text&quot;:&quot;Problema do Clock Jitter&quot;,&quot;link&quot;:&quot;problema-do-clock-jitter&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;\u00c1udio Hi-Fi e Delta-Sigma&quot;,&quot;text&quot;:&quot;\u00c1udio Hi-Fi e Delta-Sigma&quot;,&quot;link&quot;:&quot;eb-table-content-53&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Limita\u00e7\u00f5es Fundamentais&quot;,&quot;text&quot;:&quot;Limita\u00e7\u00f5es Fundamentais&quot;,&quot;link&quot;:&quot;eb-table-content-54&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;N\u00e3o \u00e9 ideal para sinais ultrarr\u00e1pidos&quot;,&quot;text&quot;:&quot;N\u00e3o \u00e9 ideal para sinais ultrarr\u00e1pidos&quot;,&quot;link&quot;:&quot;eb-table-content-55&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Consumo Digital&quot;,&quot;text&quot;:&quot;Consumo Digital&quot;,&quot;link&quot;:&quot;consumo-digital&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Instabilidade&quot;,&quot;text&quot;:&quot;Instabilidade&quot;,&quot;link&quot;:&quot;instabilidade&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Clock extremamente cr\u00edtico&quot;,&quot;text&quot;:&quot;Clock extremamente cr\u00edtico&quot;,&quot;link&quot;:&quot;eb-table-content-58&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Delta-Sigma em Microcontroladores, FPGA e Sistemas Embarcados&quot;,&quot;text&quot;:&quot;Delta-Sigma em Microcontroladores, FPGA e Sistemas Embarcados&quot;,&quot;link&quot;:&quot;delta-sigma-em-microcontroladores-fpga-e-sistemas-embarcados&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;ADCs Delta-Sigma em Microcontroladores&quot;,&quot;text&quot;:&quot;ADCs Delta-Sigma em Microcontroladores&quot;,&quot;link&quot;:&quot;adcs-delta-sigma-em-microcontroladores&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Por que usar Delta-Sigma em Medi\u00e7\u00e3o de Corrente?&quot;,&quot;text&quot;:&quot;Por que usar Delta-Sigma em Medi\u00e7\u00e3o de Corrente?&quot;,&quot;link&quot;:&quot;eb-table-content-61&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Moduladores Externos Sigma-Delta&quot;,&quot;text&quot;:&quot;Moduladores Externos Sigma-Delta&quot;,&quot;link&quot;:&quot;moduladores-externos-sigma-delta&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Isola\u00e7\u00e3o Galv\u00e2nica Simplificada&quot;,&quot;text&quot;:&quot;Isola\u00e7\u00e3o Galv\u00e2nica Simplificada&quot;,&quot;link&quot;:&quot;eb-table-content-63&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Exemplo Real: Controle de Inversores&quot;,&quot;text&quot;:&quot;Exemplo Real: Controle de Inversores&quot;,&quot;link&quot;:&quot;exemplo-real-controle-de-inversores&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Filtros SINC&quot;,&quot;text&quot;:&quot;Filtros SINC&quot;,&quot;link&quot;:&quot;filtros-sinc&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Delta-Sigma em FPGA&quot;,&quot;text&quot;:&quot;Delta-Sigma em FPGA&quot;,&quot;link&quot;:&quot;delta-sigma-em-fpga&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;DAC Sigma-Delta em FPGA&quot;,&quot;text&quot;:&quot;DAC Sigma-Delta em FPGA&quot;,&quot;link&quot;:&quot;dac-sigma-delta-em-fpga&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Exemplo Conceitual em Verilog&quot;,&quot;text&quot;:&quot;Exemplo Conceitual em Verilog&quot;,&quot;link&quot;:&quot;exemplo-conceitual-em-verilog&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Delta-Sigma e PWM&quot;,&quot;text&quot;:&quot;Delta-Sigma e PWM&quot;,&quot;link&quot;:&quot;delta-sigma-e-pwm&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;PWM (Pulse Width Modulation)&quot;,&quot;text&quot;:&quot;PWM (Pulse Width Modulation)&quot;,&quot;link&quot;:&quot;pwm-pulse-width-modulation&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;PDM (Pulse Density Modulation)&quot;,&quot;text&quot;:&quot;PDM (Pulse Density Modulation)&quot;,&quot;link&quot;:&quot;pdm-pulse-density-modulation&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Aplica\u00e7\u00f5es em Fontes Chaveadas&quot;,&quot;text&quot;:&quot;Aplica\u00e7\u00f5es em Fontes Chaveadas&quot;,&quot;link&quot;:&quot;eb-table-content-72&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Sensores MEMS e Sigma-Delta&quot;,&quot;text&quot;:&quot;Sensores MEMS e Sigma-Delta&quot;,&quot;link&quot;:&quot;sensores-mems-e-sigma-delta&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Conversores de \u00c1udio MEMS&quot;,&quot;text&quot;:&quot;Conversores de \u00c1udio MEMS&quot;,&quot;link&quot;:&quot;eb-table-content-74&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Rela\u00e7\u00e3o com DSP Moderno&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o com DSP Moderno&quot;,&quot;link&quot;:&quot;eb-table-content-75&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Fundamentos Matem\u00e1ticos do Noise Shaping&quot;,&quot;text&quot;:&quot;Fundamentos Matem\u00e1ticos do Noise Shaping&quot;,&quot;link&quot;:&quot;eb-table-content-76&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Modelo Linear do Modulador&quot;,&quot;text&quot;:&quot;Modelo Linear do Modulador&quot;,&quot;link&quot;:&quot;modelo-linear-do-modulador&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Estrutura Linearizada&quot;,&quot;text&quot;:&quot;Estrutura Linearizada&quot;,&quot;link&quot;:&quot;estrutura-linearizada&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Signal Transfer Function (STF)&quot;,&quot;text&quot;:&quot;Signal Transfer Function (STF)&quot;,&quot;link&quot;:&quot;signal-transfer-function-stf&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Noise Transfer Function (NTF)&quot;,&quot;text&quot;:&quot;Noise Transfer Function (NTF)&quot;,&quot;link&quot;:&quot;noise-transfer-function-ntf&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Interpreta\u00e7\u00e3o F\u00edsica&quot;,&quot;text&quot;:&quot;Interpreta\u00e7\u00e3o F\u00edsica&quot;,&quot;link&quot;:&quot;eb-table-content-81&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Segunda Ordem&quot;,&quot;text&quot;:&quot;Segunda Ordem&quot;,&quot;link&quot;:&quot;segunda-ordem&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Ordem Superior&quot;,&quot;text&quot;:&quot;Ordem Superior&quot;,&quot;link&quot;:&quot;ordem-superior&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Ru\u00eddo de Quantiza\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Ru\u00eddo de Quantiza\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-84&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Oversampling e Ru\u00eddo&quot;,&quot;text&quot;:&quot;Oversampling e Ru\u00eddo&quot;,&quot;link&quot;:&quot;eb-table-content-85&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Rela\u00e7\u00e3o com OSR&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o com OSR&quot;,&quot;link&quot;:&quot;eb-table-content-86&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;SNR em Delta-Sigma&quot;,&quot;text&quot;:&quot;SNR em Delta-Sigma&quot;,&quot;link&quot;:&quot;snr-em-delta-sigma&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Zero da NTF em DC&quot;,&quot;text&quot;:&quot;Zero da NTF em DC&quot;,&quot;link&quot;:&quot;zero-da-ntf-em-dc&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Rela\u00e7\u00e3o com Sistemas de Controle&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o com Sistemas de Controle&quot;,&quot;link&quot;:&quot;eb-table-content-89&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Idle Tones&quot;,&quot;text&quot;:&quot;Idle Tones&quot;,&quot;link&quot;:&quot;idle-tones&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Dithering&quot;,&quot;text&quot;:&quot;Dithering&quot;,&quot;link&quot;:&quot;dithering&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Estabilidade Matem\u00e1tica&quot;,&quot;text&quot;:&quot;Estabilidade Matem\u00e1tica&quot;,&quot;link&quot;:&quot;eb-table-content-92&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Rela\u00e7\u00e3o com DSP Moderno&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o com DSP Moderno&quot;,&quot;link&quot;:&quot;eb-table-content-93&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;DAC Delta-Sigma (\u03a3\u0394 DAC)&quot;,&quot;text&quot;:&quot;DAC Delta-Sigma (\u03a3\u0394 DAC)&quot;,&quot;link&quot;:&quot;eb-table-content-94&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Diferen\u00e7a entre DAC Tradicional e Sigma-Delta&quot;,&quot;text&quot;:&quot;Diferen\u00e7a entre DAC Tradicional e Sigma-Delta&quot;,&quot;link&quot;:&quot;eb-table-content-95&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Estrat\u00e9gia do DAC Sigma-Delta&quot;,&quot;text&quot;:&quot;Estrat\u00e9gia do DAC Sigma-Delta&quot;,&quot;link&quot;:&quot;eb-table-content-96&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Estrutura B\u00e1sica&quot;,&quot;text&quot;:&quot;Estrutura B\u00e1sica&quot;,&quot;link&quot;:&quot;eb-table-content-97&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;PCM e Oversampling&quot;,&quot;text&quot;:&quot;PCM e Oversampling&quot;,&quot;link&quot;:&quot;pcm-e-oversampling&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;&quot;,&quot;text&quot;:&quot;&quot;,&quot;link&quot;:&quot;eb-table-content-99&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Modulador Sigma-Delta no DAC&quot;,&quot;text&quot;:&quot;Modulador Sigma-Delta no DAC&quot;,&quot;link&quot;:&quot;modulador-sigma-delta-no-dac&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Sa\u00edda de 1 Bit&quot;,&quot;text&quot;:&quot;Sa\u00edda de 1 Bit&quot;,&quot;link&quot;:&quot;eb-table-content-101&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Filtro Anal\u00f3gico de Sa\u00edda&quot;,&quot;text&quot;:&quot;Filtro Anal\u00f3gico de Sa\u00edda&quot;,&quot;link&quot;:&quot;eb-table-content-102&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Grande Vantagem do DAC Sigma-Delta&quot;,&quot;text&quot;:&quot;Grande Vantagem do DAC Sigma-Delta&quot;,&quot;link&quot;:&quot;grande-vantagem-do-dac-sigma-delta&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Rela\u00e7\u00e3o com PWM&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o com PWM&quot;,&quot;link&quot;:&quot;eb-table-content-104&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;PWM Tradicional&quot;,&quot;text&quot;:&quot;PWM Tradicional&quot;,&quot;link&quot;:&quot;pwm-tradicional&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Sigma-Delta&quot;,&quot;text&quot;:&quot;Sigma-Delta&quot;,&quot;link&quot;:&quot;sigma-delta&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Classe D e Sigma-Delta&quot;,&quot;text&quot;:&quot;Classe D e Sigma-Delta&quot;,&quot;link&quot;:&quot;classe-d-e-sigma-delta&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;DSD (Direct Stream Digital)&quot;,&quot;text&quot;:&quot;DSD (Direct Stream Digital)&quot;,&quot;link&quot;:&quot;dsd-direct-stream-digital&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;O que \u00e9 DSD?&quot;,&quot;text&quot;:&quot;O que \u00e9 DSD?&quot;,&quot;link&quot;:&quot;eb-table-content-109&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Filosofia do DSD&quot;,&quot;text&quot;:&quot;Filosofia do DSD&quot;,&quot;link&quot;:&quot;filosofia-do-dsd&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;SACD&quot;,&quot;text&quot;:&quot;SACD&quot;,&quot;link&quot;:&quot;sacd&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Vantagens do DSD&quot;,&quot;text&quot;:&quot;Vantagens do DSD&quot;,&quot;link&quot;:&quot;vantagens-do-dsd&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Problemas do DSD&quot;,&quot;text&quot;:&quot;Problemas do DSD&quot;,&quot;link&quot;:&quot;problemas-do-dsd&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Muito ru\u00eddo ultrass\u00f4nico&quot;,&quot;text&quot;:&quot;Muito ru\u00eddo ultrass\u00f4nico&quot;,&quot;link&quot;:&quot;eb-table-content-114&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Edi\u00e7\u00e3o complexa&quot;,&quot;text&quot;:&quot;Edi\u00e7\u00e3o complexa&quot;,&quot;link&quot;:&quot;eb-table-content-115&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Estabilidade e filtragem&quot;,&quot;text&quot;:&quot;Estabilidade e filtragem&quot;,&quot;link&quot;:&quot;estabilidade-e-filtragem&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;DACs Multi-Bit Sigma-Delta&quot;,&quot;text&quot;:&quot;DACs Multi-Bit Sigma-Delta&quot;,&quot;link&quot;:&quot;dacs-multi-bit-sigma-delta&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;DEM (Dynamic Element Matching)&quot;,&quot;text&quot;:&quot;DEM (Dynamic Element Matching)&quot;,&quot;link&quot;:&quot;dem-dynamic-element-matching&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Sigma-Delta em RF&quot;,&quot;text&quot;:&quot;Sigma-Delta em RF&quot;,&quot;link&quot;:&quot;sigma-delta-em-rf&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;PLL Fractional-N Sigma-Delta&quot;,&quot;text&quot;:&quot;PLL Fractional-N Sigma-Delta&quot;,&quot;link&quot;:&quot;pll-fractional-n-sigma-delta&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Sigma-Delta e CMOS Moderno&quot;,&quot;text&quot;:&quot;Sigma-Delta e CMOS Moderno&quot;,&quot;link&quot;:&quot;sigma-delta-e-cmos-moderno&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;O Problema da Quantiza\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;o-problema-da-quantiza\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Superamostragem (Oversampling)&quot;,&quot;value&quot;:&quot;superamostragem-oversampling&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estrutura Interna do Conversor Delta-Sigma&quot;,&quot;value&quot;:&quot;estrutura-interna-do-conversor-delta-sigma&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Vis\u00e3o Conceitual do Modulador&quot;,&quot;value&quot;:&quot;vis\u00e3o-conceitual-do-modulador&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O Integrador&quot;,&quot;value&quot;:&quot;o-integrador&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Quantizador de 1 Bit&quot;,&quot;value&quot;:&quot;quantizador-de-1-bit&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;DAC de Realimenta\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;dac-de-realimenta\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Fluxo de Bits (Bitstream)&quot;,&quot;value&quot;:&quot;fluxo-de-bits-bitstream&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Noise Shaping&quot;,&quot;value&quot;:&quot;noise-shaping&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Filtro Digital de Decima\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;filtro-digital-de-decima\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1. Filtrar ru\u00eddo de alta frequ\u00eancia&quot;,&quot;value&quot;:&quot;1-filtrar-ru\u00eddo-de-alta-frequ\u00eancia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2. Reduzir a taxa de amostragem&quot;,&quot;value&quot;:&quot;2-reduzir-a-taxa-de-amostragem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o entre Oversampling e Resolu\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-entre-oversampling-e-resolu\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Ordens do Modulador&quot;,&quot;value&quot;:&quot;ordens-do-modulador&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o entre Delta-Sigma, SAR, Flash e Pipeline ADC&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-entre-delta-sigma-sar-flash-e-pipeline-adc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;ADC Flash&quot;,&quot;value&quot;:&quot;adc-flash&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estrutura&quot;,&quot;value&quot;:&quot;estrutura&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-com-delta-sigma&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;ADC SAR (Successive Approximation Register)&quot;,&quot;value&quot;:&quot;adc-sar-successive-approximation-register&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Funcionamento&quot;,&quot;value&quot;:&quot;funcionamento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Tempo de Convers\u00e3o&quot;,&quot;value&quot;:&quot;tempo-de-convers\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Caracter\u00edsticas&quot;,&quot;value&quot;:&quot;caracter\u00edsticas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-com-delta-sigma&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;ADC Pipeline&quot;,&quot;value&quot;:&quot;adc-pipeline&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conceito&quot;,&quot;value&quot;:&quot;conceito&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Caracter\u00edsticas&quot;,&quot;value&quot;:&quot;caracter\u00edsticas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-com-delta-sigma&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Por que o Delta-Sigma possui Alta Lat\u00eancia?&quot;,&quot;value&quot;:&quot;por-que-o-delta-sigma-possui-alta-lat\u00eancia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Aplica\u00e7\u00f5es Ideais para Delta-Sigma&quot;,&quot;value&quot;:&quot;aplica\u00e7\u00f5es-ideais-para-delta-sigma&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;\u00c1udio Digital&quot;,&quot;value&quot;:&quot;\u00e1udio-digital&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Instrumenta\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;instrumenta\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sensores de Precis\u00e3o&quot;,&quot;value&quot;:&quot;sensores-de-precis\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Microcontroladores Modernos&quot;,&quot;value&quot;:&quot;microcontroladores-modernos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Uso em FPGAs&quot;,&quot;value&quot;:&quot;uso-em-fpgas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Moduladores Delta-Sigma de Ordens Superiores&quot;,&quot;value&quot;:&quot;moduladores-delta-sigma-de-ordens-superiores&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Noise Shaping em Diferentes Ordens&quot;,&quot;value&quot;:&quot;noise-shaping-em-diferentes-ordens&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Primeira Ordem&quot;,&quot;value&quot;:&quot;primeira-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Segunda Ordem&quot;,&quot;value&quot;:&quot;segunda-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Terceira Ordem&quot;,&quot;value&quot;:&quot;terceira-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o entre Ordem e SNR&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-entre-ordem-e-snr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Primeira ordem&quot;,&quot;value&quot;:&quot;primeira-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Segunda ordem&quot;,&quot;value&quot;:&quot;segunda-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Terceira ordem&quot;,&quot;value&quot;:&quot;terceira-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Problema da Estabilidade&quot;,&quot;value&quot;:&quot;problema-da-estabilidade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Arquitetura MASH (Multi-Stage Noise Shaping)&quot;,&quot;value&quot;:&quot;arquitetura-mash-multi-stage-noise-shaping&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Quantizadores Multi-Bit&quot;,&quot;value&quot;:&quot;quantizadores-multi-bit&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Filtros de Decima\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;filtros-de-decima\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Filtros CIC&quot;,&quot;value&quot;:&quot;filtros-cic&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;ENOB (Effective Number Of Bits)&quot;,&quot;value&quot;:&quot;enob-effective-number-of-bits&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;THD e SINAD&quot;,&quot;value&quot;:&quot;thd-e-sinad&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;THD&quot;,&quot;value&quot;:&quot;thd&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;SINAD&quot;,&quot;value&quot;:&quot;sinad&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Problema do Clock Jitter&quot;,&quot;value&quot;:&quot;problema-do-clock-jitter&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;\u00c1udio Hi-Fi e Delta-Sigma&quot;,&quot;value&quot;:&quot;\u00e1udio-hi-fi-e-delta-sigma&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Limita\u00e7\u00f5es Fundamentais&quot;,&quot;value&quot;:&quot;limita\u00e7\u00f5es-fundamentais&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;N\u00e3o \u00e9 ideal para sinais ultrarr\u00e1pidos&quot;,&quot;value&quot;:&quot;n\u00e3o-\u00e9-ideal-para-sinais-ultrarr\u00e1pidos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Consumo Digital&quot;,&quot;value&quot;:&quot;consumo-digital&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Instabilidade&quot;,&quot;value&quot;:&quot;instabilidade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Clock extremamente cr\u00edtico&quot;,&quot;value&quot;:&quot;clock-extremamente-cr\u00edtico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Delta-Sigma em Microcontroladores, FPGA e Sistemas Embarcados&quot;,&quot;value&quot;:&quot;delta-sigma-em-microcontroladores-fpga-e-sistemas-embarcados&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;ADCs Delta-Sigma em Microcontroladores&quot;,&quot;value&quot;:&quot;adcs-delta-sigma-em-microcontroladores&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Por que usar Delta-Sigma em Medi\u00e7\u00e3o de Corrente?&quot;,&quot;value&quot;:&quot;por-que-usar-delta-sigma-em-medi\u00e7\u00e3o-de-corrente&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Moduladores Externos Sigma-Delta&quot;,&quot;value&quot;:&quot;moduladores-externos-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Isola\u00e7\u00e3o Galv\u00e2nica Simplificada&quot;,&quot;value&quot;:&quot;isola\u00e7\u00e3o-galv\u00e2nica-simplificada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo Real: Controle de Inversores&quot;,&quot;value&quot;:&quot;exemplo-real-controle-de-inversores&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Filtros SINC&quot;,&quot;value&quot;:&quot;filtros-sinc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Delta-Sigma em FPGA&quot;,&quot;value&quot;:&quot;delta-sigma-em-fpga&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;DAC Sigma-Delta em FPGA&quot;,&quot;value&quot;:&quot;dac-sigma-delta-em-fpga&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo Conceitual em Verilog&quot;,&quot;value&quot;:&quot;exemplo-conceitual-em-verilog&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Delta-Sigma e PWM&quot;,&quot;value&quot;:&quot;delta-sigma-e-pwm&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;PWM (Pulse Width Modulation)&quot;,&quot;value&quot;:&quot;pwm-pulse-width-modulation&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;PDM (Pulse Density Modulation)&quot;,&quot;value&quot;:&quot;pdm-pulse-density-modulation&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Aplica\u00e7\u00f5es em Fontes Chaveadas&quot;,&quot;value&quot;:&quot;aplica\u00e7\u00f5es-em-fontes-chaveadas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sensores MEMS e Sigma-Delta&quot;,&quot;value&quot;:&quot;sensores-mems-e-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conversores de \u00c1udio MEMS&quot;,&quot;value&quot;:&quot;conversores-de-\u00e1udio-mems&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o com DSP Moderno&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-com-dsp-moderno&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Fundamentos Matem\u00e1ticos do Noise Shaping&quot;,&quot;value&quot;:&quot;fundamentos-matem\u00e1ticos-do-noise-shaping&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Modelo Linear do Modulador&quot;,&quot;value&quot;:&quot;modelo-linear-do-modulador&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estrutura Linearizada&quot;,&quot;value&quot;:&quot;estrutura-linearizada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Signal Transfer Function (STF)&quot;,&quot;value&quot;:&quot;signal-transfer-function-stf&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Noise Transfer Function (NTF)&quot;,&quot;value&quot;:&quot;noise-transfer-function-ntf&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Interpreta\u00e7\u00e3o F\u00edsica&quot;,&quot;value&quot;:&quot;interpreta\u00e7\u00e3o-f\u00edsica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Segunda Ordem&quot;,&quot;value&quot;:&quot;segunda-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Ordem Superior&quot;,&quot;value&quot;:&quot;ordem-superior&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Ru\u00eddo de Quantiza\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;ru\u00eddo-de-quantiza\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Oversampling e Ru\u00eddo&quot;,&quot;value&quot;:&quot;oversampling-e-ru\u00eddo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o com OSR&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-com-osr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;SNR em Delta-Sigma&quot;,&quot;value&quot;:&quot;snr-em-delta-sigma&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Zero da NTF em DC&quot;,&quot;value&quot;:&quot;zero-da-ntf-em-dc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o com Sistemas de Controle&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-com-sistemas-de-controle&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Idle Tones&quot;,&quot;value&quot;:&quot;idle-tones&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Dithering&quot;,&quot;value&quot;:&quot;dithering&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estabilidade Matem\u00e1tica&quot;,&quot;value&quot;:&quot;estabilidade-matem\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o com DSP Moderno&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-com-dsp-moderno&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;DAC Delta-Sigma (\u03a3\u0394 DAC)&quot;,&quot;value&quot;:&quot;dac-delta-sigma-\u03c3\u03b4-dac&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Diferen\u00e7a entre DAC Tradicional e Sigma-Delta&quot;,&quot;value&quot;:&quot;diferen\u00e7a-entre-dac-tradicional-e-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estrat\u00e9gia do DAC Sigma-Delta&quot;,&quot;value&quot;:&quot;estrat\u00e9gia-do-dac-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estrutura B\u00e1sica&quot;,&quot;value&quot;:&quot;estrutura-b\u00e1sica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;PCM e Oversampling&quot;,&quot;value&quot;:&quot;pcm-e-oversampling&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Modulador Sigma-Delta no DAC&quot;,&quot;value&quot;:&quot;modulador-sigma-delta-no-dac&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sa\u00edda de 1 Bit&quot;,&quot;value&quot;:&quot;sa\u00edda-de-1-bit&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Filtro Anal\u00f3gico de Sa\u00edda&quot;,&quot;value&quot;:&quot;filtro-anal\u00f3gico-de-sa\u00edda&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Grande Vantagem do DAC Sigma-Delta&quot;,&quot;value&quot;:&quot;grande-vantagem-do-dac-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o com PWM&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-com-pwm&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;PWM Tradicional&quot;,&quot;value&quot;:&quot;pwm-tradicional&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sigma-Delta&quot;,&quot;value&quot;:&quot;sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Classe D e Sigma-Delta&quot;,&quot;value&quot;:&quot;classe-d-e-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;DSD (Direct Stream Digital)&quot;,&quot;value&quot;:&quot;dsd-direct-stream-digital&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que \u00e9 DSD?&quot;,&quot;value&quot;:&quot;o-que-\u00e9-dsd&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Filosofia do DSD&quot;,&quot;value&quot;:&quot;filosofia-do-dsd&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;SACD&quot;,&quot;value&quot;:&quot;sacd&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Vantagens do DSD&quot;,&quot;value&quot;:&quot;vantagens-do-dsd&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Problemas do DSD&quot;,&quot;value&quot;:&quot;problemas-do-dsd&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Muito ru\u00eddo ultrass\u00f4nico&quot;,&quot;value&quot;:&quot;muito-ru\u00eddo-ultrass\u00f4nico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Edi\u00e7\u00e3o complexa&quot;,&quot;value&quot;:&quot;edi\u00e7\u00e3o-complexa&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estabilidade e filtragem&quot;,&quot;value&quot;:&quot;estabilidade-e-filtragem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;DACs Multi-Bit Sigma-Delta&quot;,&quot;value&quot;:&quot;dacs-multi-bit-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;DEM (Dynamic Element Matching)&quot;,&quot;value&quot;:&quot;dem-dynamic-element-matching&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sigma-Delta em RF&quot;,&quot;value&quot;:&quot;sigma-delta-em-rf&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;PLL Fractional-N Sigma-Delta&quot;,&quot;value&quot;:&quot;pll-fractional-n-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sigma-Delta e CMOS Moderno&quot;,&quot;value&quot;:&quot;sigma-delta-e-cmos-moderno&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">O Problema da Quantização</a><li><a href="#superamostragem-oversampling">Superamostragem (Oversampling)</a><li><a href="#estrutura-interna-do-conversor-delta-sigma">Estrutura Interna do Conversor Delta-Sigma</a><ul class="eb-toc__list"><li><a href="#eb-table-content-3">Visão Conceitual do Modulador</a><li><a href="#o-integrador">O Integrador</a><li><a href="#quantizador-de-1-bit">Quantizador de 1 Bit</a><li><a href="#eb-table-content-6">DAC de Realimentação</a><li><a href="#fluxo-de-bits-bitstream">Fluxo de Bits (Bitstream)</a><li><a href="#noise-shaping">Noise Shaping</a><li><a href="#eb-table-content-9">Filtro Digital de Decimação</a><ul class="eb-toc__list"><li><a href="#eb-table-content-10">1. Filtrar ruído de alta frequência</a><li><a href="#2-reduzir-a-taxa-de-amostragem">2. Reduzir a taxa de amostragem</a></li></ul><li><a href="#eb-table-content-12">Relação entre Oversampling e Resolução</a><li><a href="#ordens-do-modulador">Ordens do Modulador</a></li></ul><li><a href="#eb-table-content-14">Comparação entre Delta-Sigma, SAR, Flash e Pipeline ADC</a><li><a href="#adc-flash">ADC Flash</a><ul class="eb-toc__list"><li><a href="#estrutura">Estrutura</a><li><a href="#eb-table-content-17">Comparação com Delta-Sigma</a></li></ul><li><a href="#adc-sar-successive-approximation-register">ADC SAR (Successive Approximation Register)</a><ul class="eb-toc__list"><li><a href="#funcionamento">Funcionamento</a><li><a href="#eb-table-content-20">Tempo de Conversão</a><li><a href="#eb-table-content-21">Características</a><li><a href="#eb-table-content-22">Comparação com Delta-Sigma</a></li></ul><li><a href="#adc-pipeline">ADC Pipeline</a><ul class="eb-toc__list"><li><a href="#conceito">Conceito</a><li><a href="#eb-table-content-25">Características</a><li><a href="#eb-table-content-26">Comparação com Delta-Sigma</a></li></ul><li><a href="#eb-table-content-27">Por que o Delta-Sigma possui Alta Latência?</a><li><a href="#eb-table-content-28">Aplicações Ideais para Delta-Sigma</a><ul class="eb-toc__list"><li><a href="#eb-table-content-29">Áudio Digital</a></li></ul><li><a href="#eb-table-content-30">Instrumentação</a><li><a href="#eb-table-content-31">Sensores de Precisão</a><li><a href="#microcontroladores-modernos">Microcontroladores Modernos</a><li><a href="#uso-em-fpgas">Uso em FPGAs</a><li><a href="#moduladores-delta-sigma-de-ordens-superiores">Moduladores Delta-Sigma de Ordens Superiores</a><li><a href="#noise-shaping-em-diferentes-ordens">Noise Shaping em Diferentes Ordens</a><ul class="eb-toc__list"><li><a href="#primeira-ordem">Primeira Ordem</a><li><a href="#segunda-ordem">Segunda Ordem</a><li><a href="#terceira-ordem">Terceira Ordem</a></li></ul><li><a href="#eb-table-content-39">Relação entre Ordem e SNR</a><ul class="eb-toc__list"><li><a href="#primeira-ordem">Primeira ordem</a><li><a href="#segunda-ordem">Segunda ordem</a><li><a href="#terceira-ordem">Terceira ordem</a></li></ul><li><a href="#problema-da-estabilidade">Problema da Estabilidade</a><li><a href="#arquitetura-mash-multi-stage-noise-shaping">Arquitetura MASH (Multi-Stage Noise Shaping)</a><li><a href="#quantizadores-multi-bit">Quantizadores Multi-Bit</a><li><a href="#eb-table-content-46">Filtros de Decimação</a><li><a href="#filtros-cic">Filtros CIC</a><li><a href="#enob-effective-number-of-bits">ENOB (Effective Number Of Bits)</a><li><a href="#thd-e-sinad">THD e SINAD</a><ul class="eb-toc__list"><li><a href="#thd">THD</a><li><a href="#sinad">SINAD</a></li></ul><li><a href="#problema-do-clock-jitter">Problema do Clock Jitter</a><li><a href="#eb-table-content-53">Áudio Hi-Fi e Delta-Sigma</a><li><a href="#eb-table-content-54">Limitações Fundamentais</a><ul class="eb-toc__list"><li><a href="#eb-table-content-55">Não é ideal para sinais ultrarrápidos</a><li><a href="#consumo-digital">Consumo Digital</a><li><a href="#instabilidade">Instabilidade</a><li><a href="#eb-table-content-58">Clock extremamente crítico</a></li></ul><li><a href="#delta-sigma-em-microcontroladores-fpga-e-sistemas-embarcados">Delta-Sigma em Microcontroladores, FPGA e Sistemas Embarcados</a><li><a href="#adcs-delta-sigma-em-microcontroladores">ADCs Delta-Sigma em Microcontroladores</a><li><a href="#eb-table-content-61">Por que usar Delta-Sigma em Medição de Corrente?</a><li><a href="#moduladores-externos-sigma-delta">Moduladores Externos Sigma-Delta</a><li><a href="#eb-table-content-63">Isolação Galvânica Simplificada</a><li><a href="#exemplo-real-controle-de-inversores">Exemplo Real: Controle de Inversores</a><li><a href="#filtros-sinc">Filtros SINC</a><li><a href="#delta-sigma-em-fpga">Delta-Sigma em FPGA</a><li><a href="#dac-sigma-delta-em-fpga">DAC Sigma-Delta em FPGA</a><li><a href="#exemplo-conceitual-em-verilog">Exemplo Conceitual em Verilog</a><li><a href="#delta-sigma-e-pwm">Delta-Sigma e PWM</a><li><a href="#pwm-pulse-width-modulation">PWM (Pulse Width Modulation)</a><li><a href="#pdm-pulse-density-modulation">PDM (Pulse Density Modulation)</a><li><a href="#eb-table-content-72">Aplicações em Fontes Chaveadas</a><li><a href="#sensores-mems-e-sigma-delta">Sensores MEMS e Sigma-Delta</a><li><a href="#eb-table-content-74">Conversores de Áudio MEMS</a><li><a href="#eb-table-content-75">Relação com DSP Moderno</a><li><a href="#eb-table-content-76">Fundamentos Matemáticos do Noise Shaping</a><li><a href="#modelo-linear-do-modulador">Modelo Linear do Modulador</a><li><a href="#estrutura-linearizada">Estrutura Linearizada</a><li><a href="#signal-transfer-function-stf">Signal Transfer Function (STF)</a><li><a href="#noise-transfer-function-ntf">Noise Transfer Function (NTF)</a><li><a href="#eb-table-content-81">Interpretação Física</a><li><a href="#segunda-ordem">Segunda Ordem</a><li><a href="#ordem-superior">Ordem Superior</a><li><a href="#eb-table-content-84">Ruído de Quantização</a><li><a href="#eb-table-content-85">Oversampling e Ruído</a><li><a href="#eb-table-content-86">Relação com OSR</a><li><a href="#snr-em-delta-sigma">SNR em Delta-Sigma</a><li><a href="#zero-da-ntf-em-dc">Zero da NTF em DC</a><li><a href="#eb-table-content-89">Relação com Sistemas de Controle</a><li><a href="#idle-tones">Idle Tones</a><li><a href="#dithering">Dithering</a><li><a href="#eb-table-content-92">Estabilidade Matemática</a><li><a href="#eb-table-content-93">Relação com DSP Moderno</a><li><a href="#eb-table-content-94">DAC Delta-Sigma (ΣΔ DAC)</a><li><a href="#eb-table-content-95">Diferença entre DAC Tradicional e Sigma-Delta</a><li><a href="#eb-table-content-96">Estratégia do DAC Sigma-Delta</a><li><a href="#eb-table-content-97">Estrutura Básica</a><li><a href="#pcm-e-oversampling">PCM e Oversampling</a><li><a href="#eb-table-content-99"></a><li><a href="#modulador-sigma-delta-no-dac">Modulador Sigma-Delta no DAC</a><li><a href="#eb-table-content-101">Saída de 1 Bit</a><li><a href="#eb-table-content-102">Filtro Analógico de Saída</a><li><a href="#grande-vantagem-do-dac-sigma-delta">Grande Vantagem do DAC Sigma-Delta</a><li><a href="#eb-table-content-104">Relação com PWM</a><li><a href="#pwm-tradicional">PWM Tradicional</a><li><a href="#sigma-delta">Sigma-Delta</a><li><a href="#classe-d-e-sigma-delta">Classe D e Sigma-Delta</a><li><a href="#dsd-direct-stream-digital">DSD (Direct Stream Digital)</a><li><a href="#eb-table-content-109">O que é DSD?</a><li><a href="#filosofia-do-dsd">Filosofia do DSD</a><li><a href="#sacd">SACD</a><li><a href="#vantagens-do-dsd">Vantagens do DSD</a><li><a href="#problemas-do-dsd">Problemas do DSD</a><ul class="eb-toc__list"><li><a href="#eb-table-content-114">Muito ruído ultrassônico</a><li><a href="#eb-table-content-115">Edição complexa</a><li><a href="#estabilidade-e-filtragem">Estabilidade e filtragem</a></li></ul><li><a href="#dacs-multi-bit-sigma-delta">DACs Multi-Bit Sigma-Delta</a><li><a href="#dem-dynamic-element-matching">DEM (Dynamic Element Matching)</a><li><a href="#sigma-delta-em-rf">Sigma-Delta em RF</a><li><a href="#pll-fractional-n-sigma-delta">PLL Fractional-N Sigma-Delta</a><li><a href="#sigma-delta-e-cmos-moderno">Sigma-Delta e CMOS Moderno</a></ul></div></div></div></div></div>


<p class="wp-block-paragraph">Os conversores analógico-digitais do tipo Delta-Sigma, também chamados de Sigma-Delta (ΣΔ), representam uma das arquiteturas de conversão mais importantes da eletrônica moderna, especialmente em aplicações que exigem alta resolução, excelente imunidade a ruído e grande precisão. Eles são amplamente utilizados em instrumentos de medição, sistemas de áudio digital, sensores industriais, balanças eletrônicas, sistemas biomédicos, aquisição de sinais lentos e equipamentos científicos.</p>



<p class="wp-block-paragraph">Diferentemente de arquiteturas clássicas como Flash ADC, SAR (Successive Approximation Register) ou Pipeline ADC, o conversor Delta-Sigma não tenta converter instantaneamente o valor analógico em um número digital final. Em vez disso, ele utiliza uma estratégia baseada em superamostragem (oversampling), modelagem espectral de ruído (noise shaping) e filtragem digital para reconstruir o sinal com elevada precisão.</p>



<p class="wp-block-paragraph">O surgimento dessa arquitetura está diretamente ligado às limitações físicas dos conversores tradicionais. Em sistemas de alta resolução, aumentar a precisão usando apenas comparadores extremamente precisos torna-se caro, complexo e energeticamente ineficiente. O Delta-Sigma contorna esse problema utilizando princípios matemáticos e temporais para deslocar o ruído de quantização para frequências mais altas, permitindo removê-lo posteriormente através de filtros digitais.</p>



<p class="wp-block-paragraph">Uma das razões do enorme sucesso dos ADCs Delta-Sigma é que eles combinam:</p>



<ul class="wp-block-list">
<li>Alta resolução (16, 24 e até 32 bits efetivos em aplicações específicas)</li>



<li>Excelente linearidade</li>



<li>Forte rejeição a ruídos</li>



<li>Baixo custo relativo em CMOS moderno</li>



<li>Grande integração digital</li>
</ul>



<p class="wp-block-paragraph">Isso explica por que praticamente todo codec de áudio moderno, muitos sensores MEMS e diversos instrumentos industriais utilizam essa arquitetura.</p>



<p class="wp-block-paragraph">Além disso, a evolução dos microcontroladores e FPGAs tornou o estudo dos conversores Delta-Sigma ainda mais relevante. Muitos microcontroladores modernos já possuem ADCs Sigma-Delta integrados, enquanto FPGAs frequentemente implementam moduladores Delta-Sigma em aplicações de aquisição de sinais, áudio e controle de potência.</p>



<p class="wp-block-paragraph">Antes de entender profundamente o funcionamento interno do conversor Delta-Sigma, é importante compreender um conceito fundamental: o processo de amostragem e o problema do ruído de quantização.</p>



<h2 class="wp-block-heading">O Problema da Quantização</h2>



<p class="wp-block-paragraph">Todo conversor analógico-digital precisa transformar uma grandeza contínua em um conjunto discreto de valores binários. Esse processo inevitavelmente introduz um erro chamado erro de quantização.</p>



<p class="wp-block-paragraph">Imagine um sinal analógico variando continuamente entre 0V e 3,3V. Um ADC de baixa resolução possui poucos níveis possíveis para representar esse sinal. Assim, o valor real do sinal precisa ser arredondado para o nível digital mais próximo.</p>



<p class="wp-block-paragraph">Por exemplo, um ADC de 3 bits possui apenas:</p>



<p class="wp-block-paragraph">2^3 = 8</p>



<p class="wp-block-paragraph">níveis possíveis de quantização.</p>



<p class="wp-block-paragraph">Se o intervalo for de 0V até 3,3V, então cada degrau representará aproximadamente:</p>



<p class="wp-block-paragraph">\[\frac{3.3V}{8} \approx 0.4125V\]



<p class="wp-block-paragraph">Isso significa que pequenas variações menores que aproximadamente 412 mV simplesmente desaparecem na conversão.</p>



<p class="wp-block-paragraph">O erro introduzido pela diferença entre o valor analógico real e o valor digital representado é chamado ruído de quantização.</p>



<p class="wp-block-paragraph">Em arquiteturas tradicionais, esse ruído está distribuído aproximadamente de forma uniforme ao longo do espectro de frequência. O grande diferencial do Delta-Sigma é justamente modificar essa distribuição espectral do ruído, empurrando-o para regiões de frequência onde ele pode ser removido digitalmente.</p>



<p class="wp-block-paragraph">Em outras palavras:</p>



<ul class="wp-block-list">
<li>O ruído não desaparece</li>



<li>O conversor reorganiza onde ele aparece no espectro</li>
</ul>



<p class="wp-block-paragraph">Esse conceito é chamado de Noise Shaping (Modelagem de Ruído), sendo um dos pilares matemáticos do conversor Delta-Sigma.</p>



<h2 class="wp-block-heading">Superamostragem (Oversampling)</h2>



<p class="wp-block-paragraph">Outro conceito essencial no Delta-Sigma é a superamostragem.</p>



<p class="wp-block-paragraph">Um ADC convencional normalmente amostra próximo da frequência mínima necessária definida pelo Teorema de Nyquist:</p>



<p class="wp-block-paragraph">f_s \geq 2f_{max}</p>



<p class="wp-block-paragraph">Já o Delta-Sigma trabalha com frequências de amostragem extremamente maiores que a banda útil do sinal.</p>



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



<ul class="wp-block-list">
<li>Áudio de 20 kHz</li>



<li>ADC operando em vários MHz</li>
</ul>



<p class="wp-block-paragraph">Essa superamostragem traz duas vantagens fundamentais:</p>



<ol class="wp-block-list">
<li>O ruído de quantização é espalhado em uma faixa espectral muito maior</li>



<li>O filtro digital posterior consegue remover boa parte desse ruído</li>
</ol>



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



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



<li>Noise shaping</li>



<li>Filtragem digital</li>
</ul>



<p class="wp-block-paragraph">o conversor Delta-Sigma consegue atingir resoluções extremamente elevadas usando hardware analógico relativamente simples.</p>



<p class="wp-block-paragraph">Na próxima seção veremos a estrutura interna do modulador Delta-Sigma, incluindo:</p>



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



<li>Comparador</li>



<li>Realimentação (feedback)</li>



<li>DAC interno</li>



<li>Fluxo de bits do modulador</li>



<li>Funcionamento temporal do laço Sigma-Delta</li>



<li>Papel do filtro digital de decimação</li>
</ul>



<p class="wp-block-paragraph">Além disso, começaremos a comparar formalmente essa arquitetura com ADCs SAR, Flash e Pipeline.</p><p>The post <a href="https://mcu.tec.br/algoritimos/dsp/conversor-analogico-delta-sigma-%ce%b4%cf%83-adc/">Conversor Analógico Delta-Sigma (ΔΣ ADC)</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1430</post-id>	</item>
		<item>
		<title>Filtros Estatísticos em Sistemas Embarcados: EMA, Wiener e Kalman Aplicados ao RP2040</title>
		<link>https://mcu.tec.br/algoritimos/dsp/filtros-estatisticos-em-sistemas-embarcados-ema-wiener-e-kalman-aplicados-ao-rp2040/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=filtros-estatisticos-em-sistemas-embarcados-ema-wiener-e-kalman-aplicados-ao-rp2040</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Thu, 26 Feb 2026 09:24:35 +0000</pubDate>
				<category><![CDATA[DSP]]></category>
		<category><![CDATA[conectando os filtros a decisões confiáveis em sistemas de DSP embarcado]]></category>
		<category><![CDATA[destacando suas diferenças conceituais]]></category>
		<category><![CDATA[Este artigo apresenta uma abordagem didática e aprofundada sobre o uso de filtros estatísticos em sistemas embarcados]]></category>
		<category><![CDATA[explorando a média móvel exponencial (EMA)]]></category>
		<category><![CDATA[limitações e aplicações reais em microcontroladores como o RP2040. Com exemplos incrementais em linguagem C]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1137</guid>

					<description><![CDATA[<p>Este artigo apresenta uma abordagem didática e aprofundada sobre o uso de filtros estatísticos em sistemas embarcados, explorando a média móvel exponencial (EMA), o filtro de Wiener e o filtro de Kalman sob a perspectiva prática de engenharia. O texto explica como cada filtro atua na suavização, separação sinal-ruído e estimação de estados, destacando suas diferenças conceituais, limitações e aplicações reais em microcontroladores como o RP2040. Com exemplos incrementais em linguagem C, o artigo demonstra implementações eficientes e viáveis para firmware bare-metal, conectando os filtros a decisões confiáveis em sistemas de DSP embarcado, sensores e controle. Ideal para engenheiros e estudantes que desejam compreender quando e como aplicar cada filtro em projetos reais.</p>
<p>The post <a href="https://mcu.tec.br/algoritimos/dsp/filtros-estatisticos-em-sistemas-embarcados-ema-wiener-e-kalman-aplicados-ao-rp2040/">Filtros Estatísticos em Sistemas Embarcados: EMA, Wiener e Kalman Aplicados ao RP2040</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-mhzll wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-mhzll "><div class="eb-toc-container eb-toc-mhzll  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;M\u00e9dia M\u00f3vel Exponencial, Wiener e Kalman aplicados ao RP2040&quot;,&quot;text&quot;:&quot;M\u00e9dia M\u00f3vel Exponencial, Wiener e Kalman aplicados ao RP2040&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1. Introdu\u00e7\u00e3o \u2014 Por que filtros s\u00e3o decisores disfar\u00e7ados&quot;,&quot;text&quot;:&quot;1. Introdu\u00e7\u00e3o \u2014 Por que filtros s\u00e3o decisores disfar\u00e7ados&quot;,&quot;link&quot;:&quot;eb-table-content-1&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1.1 O papel dos filtros na arquitetura embarcada moderna&quot;,&quot;text&quot;:&quot;1.1 O papel dos filtros na arquitetura embarcada moderna&quot;,&quot;link&quot;:&quot;11-o-papel-dos-filtros-na-arquitetura-embarcada-moderna&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1.2 Ordem crescente de complexidade (e poder)&quot;,&quot;text&quot;:&quot;1.2 Ordem crescente de complexidade (e poder)&quot;,&quot;link&quot;:&quot;12-ordem-crescente-de-complexidade-e-poder&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1.3 Come\u00e7ando pelo mais importante: M\u00e9dia M\u00f3vel Exponencial (EMA)&quot;,&quot;text&quot;:&quot;1.3 Come\u00e7ando pelo mais importante: M\u00e9dia M\u00f3vel Exponencial (EMA)&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1.4 Conceito intuitivo da EMA&quot;,&quot;text&quot;:&quot;1.4 Conceito intuitivo da EMA&quot;,&quot;link&quot;:&quot;14-conceito-intuitivo-da-ema&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1.5 EMA como filtro passa-baixa de primeira ordem&quot;,&quot;text&quot;:&quot;1.5 EMA como filtro passa-baixa de primeira ordem&quot;,&quot;link&quot;:&quot;15-ema-como-filtro-passa-baixa-de-primeira-ordem&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1.6 Implementa\u00e7\u00e3o incremental em C (base do artigo)&quot;,&quot;text&quot;:&quot;1.6 Implementa\u00e7\u00e3o incremental em C (base do artigo)&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1.7 Escolhendo o valor de \u03b1 (engenharia, n\u00e3o tentativa)&quot;,&quot;text&quot;:&quot;1.7 Escolhendo o valor de \u03b1 (engenharia, n\u00e3o tentativa)&quot;,&quot;link&quot;:&quot;eb-table-content-8&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;1.8 Onde a EMA falha (e por qu\u00ea)&quot;,&quot;text&quot;:&quot;1.8 Onde a EMA falha (e por qu\u00ea)&quot;,&quot;link&quot;:&quot;eb-table-content-9&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;2 \u2014 Filtro de Wiener: minimiza\u00e7\u00e3o do erro m\u00e9dio e separa\u00e7\u00e3o sinal-ru\u00eddo&quot;,&quot;text&quot;:&quot;2 \u2014 Filtro de Wiener: minimiza\u00e7\u00e3o do erro m\u00e9dio e separa\u00e7\u00e3o sinal-ru\u00eddo&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.1 A ideia central do Wiener (sem f\u00f3rmulas intimidadoras)&quot;,&quot;text&quot;:&quot;2.1 A ideia central do Wiener (sem f\u00f3rmulas intimidadoras)&quot;,&quot;link&quot;:&quot;eb-table-content-11&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.2 Modelo estat\u00edstico assumido&quot;,&quot;text&quot;:&quot;2.2 Modelo estat\u00edstico assumido&quot;,&quot;link&quot;:&quot;eb-table-content-12&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.3 Wiener no dom\u00ednio da frequ\u00eancia (vis\u00e3o conceitual)&quot;,&quot;text&quot;:&quot;2.3 Wiener no dom\u00ednio da frequ\u00eancia (vis\u00e3o conceitual)&quot;,&quot;link&quot;:&quot;eb-table-content-13&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.4 Por que isso \u00e9 poderoso em sistemas embarcados?&quot;,&quot;text&quot;:&quot;2.4 Por que isso \u00e9 poderoso em sistemas embarcados?&quot;,&quot;link&quot;:&quot;eb-table-content-14&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.5 Wiener simplificado para MCU (forma escalar)&quot;,&quot;text&quot;:&quot;2.5 Wiener simplificado para MCU (forma escalar)&quot;,&quot;link&quot;:&quot;25-wiener-simplificado-para-mcu-forma-escalar&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.6 Implementa\u00e7\u00e3o incremental em C (forma pr\u00e1tica)&quot;,&quot;text&quot;:&quot;2.6 Implementa\u00e7\u00e3o incremental em C (forma pr\u00e1tica)&quot;,&quot;link&quot;:&quot;eb-table-content-16&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.7 Estimando vari\u00e2ncias em tempo real&quot;,&quot;text&quot;:&quot;2.7 Estimando vari\u00e2ncias em tempo real&quot;,&quot;link&quot;:&quot;eb-table-content-17&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.8 Onde o Wiener falha (e quando n\u00e3o usar)&quot;,&quot;text&quot;:&quot;2.8 Onde o Wiener falha (e quando n\u00e3o usar)&quot;,&quot;link&quot;:&quot;eb-table-content-18&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.9 EMA vs. Wiener (compara\u00e7\u00e3o direta)&quot;,&quot;text&quot;:&quot;2.9 EMA vs. Wiener (compara\u00e7\u00e3o direta)&quot;,&quot;link&quot;:&quot;eb-table-content-19&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;3 \u2014 Filtro de Kalman: estima\u00e7\u00e3o de estados, incerteza e predi\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;3 \u2014 Filtro de Kalman: estima\u00e7\u00e3o de estados, incerteza e predi\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-20&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.1 Intui\u00e7\u00e3o antes da matem\u00e1tica&quot;,&quot;text&quot;:&quot;3.1 Intui\u00e7\u00e3o antes da matem\u00e1tica&quot;,&quot;link&quot;:&quot;eb-table-content-21&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.2 Modelo de estado (caso 1D)&quot;,&quot;text&quot;:&quot;3.2 Modelo de estado (caso 1D)&quot;,&quot;link&quot;:&quot;32-modelo-de-estado-caso-1d&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.3 Ciclo do Kalman: previs\u00e3o e corre\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;3.3 Ciclo do Kalman: previs\u00e3o e corre\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-23&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;1\ufe0f\u20e3 Previs\u00e3o&quot;,&quot;text&quot;:&quot;1\ufe0f\u20e3 Previs\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-24&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;2\ufe0f\u20e3 Corre\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;2\ufe0f\u20e3 Corre\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-25&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.4 Compara\u00e7\u00e3o conceitual com EMA e Wiener&quot;,&quot;text&quot;:&quot;3.4 Compara\u00e7\u00e3o conceitual com EMA e Wiener&quot;,&quot;link&quot;:&quot;eb-table-content-26&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.5 Implementa\u00e7\u00e3o Kalman 1D em C (vi\u00e1vel em MCU)&quot;,&quot;text&quot;:&quot;3.5 Implementa\u00e7\u00e3o Kalman 1D em C (vi\u00e1vel em MCU)&quot;,&quot;link&quot;:&quot;eb-table-content-27&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.6 Escolhendo Q e R (engenharia pr\u00e1tica)&quot;,&quot;text&quot;:&quot;3.6 Escolhendo Q e R (engenharia pr\u00e1tica)&quot;,&quot;link&quot;:&quot;eb-table-content-28&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.7 Quando Kalman \u00e9 a escolha certa&quot;,&quot;text&quot;:&quot;3.7 Quando Kalman \u00e9 a escolha certa&quot;,&quot;link&quot;:&quot;eb-table-content-29&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.8 Onde Kalman n\u00e3o compensa&quot;,&quot;text&quot;:&quot;3.8 Onde Kalman n\u00e3o compensa&quot;,&quot;link&quot;:&quot;eb-table-content-30&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot; 4 \u2014 Compara\u00e7\u00e3o pr\u00e1tica entre EMA, Wiener e Kalman, diretrizes de escolha, encerramento e SEO&quot;,&quot;text&quot;:&quot; 4 \u2014 Compara\u00e7\u00e3o pr\u00e1tica entre EMA, Wiener e Kalman, diretrizes de escolha, encerramento e SEO&quot;,&quot;link&quot;:&quot;eb-table-content-31&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.1 O que realmente diferencia esses filtros (al\u00e9m da matem\u00e1tica)&quot;,&quot;text&quot;:&quot;4.1 O que realmente diferencia esses filtros (al\u00e9m da matem\u00e1tica)&quot;,&quot;link&quot;:&quot;eb-table-content-32&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.2 Compara\u00e7\u00e3o direta: quando cada filtro vence&quot;,&quot;text&quot;:&quot;4.2 Compara\u00e7\u00e3o direta: quando cada filtro vence&quot;,&quot;link&quot;:&quot;eb-table-content-33&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.3 Diretrizes pr\u00e1ticas de escolha (engenharia de campo)&quot;,&quot;text&quot;:&quot;4.3 Diretrizes pr\u00e1ticas de escolha (engenharia de campo)&quot;,&quot;link&quot;:&quot;eb-table-content-34&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.4 Conex\u00e3o direta com os artigos anteriores da s\u00e9rie&quot;,&quot;text&quot;:&quot;4.4 Conex\u00e3o direta com os artigos anteriores da s\u00e9rie&quot;,&quot;link&quot;:&quot;eb-table-content-35&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.5 Um erro comum: tratar filtros como \u201cp\u00f3s-processamento\u201d&quot;,&quot;text&quot;:&quot;4.5 Um erro comum: tratar filtros como \u201cp\u00f3s-processamento\u201d&quot;,&quot;link&quot;:&quot;eb-table-content-36&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.6 Encerramento conceitual&quot;,&quot;text&quot;:&quot;4.6 Encerramento conceitual&quot;,&quot;link&quot;:&quot;46-encerramento-conceitual&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;M\u00e9dia M\u00f3vel Exponencial, Wiener e Kalman aplicados ao RP2040&quot;,&quot;value&quot;:&quot;m\u00e9dia-m\u00f3vel-exponencial-wiener-e-kalman-aplicados-ao-rp2040&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1. Introdu\u00e7\u00e3o \u2014 Por que filtros s\u00e3o decisores disfar\u00e7ados&quot;,&quot;value&quot;:&quot;1-introdu\u00e7\u00e3o-por-que-filtros-s\u00e3o-decisores-disfar\u00e7ados&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.1 O papel dos filtros na arquitetura embarcada moderna&quot;,&quot;value&quot;:&quot;11-o-papel-dos-filtros-na-arquitetura-embarcada-moderna&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.2 Ordem crescente de complexidade (e poder)&quot;,&quot;value&quot;:&quot;12-ordem-crescente-de-complexidade-e-poder&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.3 Come\u00e7ando pelo mais importante: M\u00e9dia M\u00f3vel Exponencial (EMA)&quot;,&quot;value&quot;:&quot;13-come\u00e7ando-pelo-mais-importante-m\u00e9dia-m\u00f3vel-exponencial-ema&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.4 Conceito intuitivo da EMA&quot;,&quot;value&quot;:&quot;14-conceito-intuitivo-da-ema&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.5 EMA como filtro passa-baixa de primeira ordem&quot;,&quot;value&quot;:&quot;15-ema-como-filtro-passa-baixa-de-primeira-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.6 Implementa\u00e7\u00e3o incremental em C (base do artigo)&quot;,&quot;value&quot;:&quot;16-implementa\u00e7\u00e3o-incremental-em-c-base-do-artigo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.7 Escolhendo o valor de \u03b1 (engenharia, n\u00e3o tentativa)&quot;,&quot;value&quot;:&quot;17-escolhendo-o-valor-de-\u03b1-engenharia-n\u00e3o-tentativa&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.8 Onde a EMA falha (e por qu\u00ea)&quot;,&quot;value&quot;:&quot;18-onde-a-ema-falha-e-por-qu\u00ea&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2 \u2014 Filtro de Wiener: minimiza\u00e7\u00e3o do erro m\u00e9dio e separa\u00e7\u00e3o sinal-ru\u00eddo&quot;,&quot;value&quot;:&quot;2-filtro-de-wiener-minimiza\u00e7\u00e3o-do-erro-m\u00e9dio-e-separa\u00e7\u00e3o-sinal-ru\u00eddo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.1 A ideia central do Wiener (sem f\u00f3rmulas intimidadoras)&quot;,&quot;value&quot;:&quot;21-a-ideia-central-do-wiener-sem-f\u00f3rmulas-intimidadoras&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.2 Modelo estat\u00edstico assumido&quot;,&quot;value&quot;:&quot;22-modelo-estat\u00edstico-assumido&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.3 Wiener no dom\u00ednio da frequ\u00eancia (vis\u00e3o conceitual)&quot;,&quot;value&quot;:&quot;23-wiener-no-dom\u00ednio-da-frequ\u00eancia-vis\u00e3o-conceitual&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.4 Por que isso \u00e9 poderoso em sistemas embarcados?&quot;,&quot;value&quot;:&quot;24-por-que-isso-\u00e9-poderoso-em-sistemas-embarcados&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.5 Wiener simplificado para MCU (forma escalar)&quot;,&quot;value&quot;:&quot;25-wiener-simplificado-para-mcu-forma-escalar&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.6 Implementa\u00e7\u00e3o incremental em C (forma pr\u00e1tica)&quot;,&quot;value&quot;:&quot;26-implementa\u00e7\u00e3o-incremental-em-c-forma-pr\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.7 Estimando vari\u00e2ncias em tempo real&quot;,&quot;value&quot;:&quot;27-estimando-vari\u00e2ncias-em-tempo-real&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.8 Onde o Wiener falha (e quando n\u00e3o usar)&quot;,&quot;value&quot;:&quot;28-onde-o-wiener-falha-e-quando-n\u00e3o-usar&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.9 EMA vs. Wiener (compara\u00e7\u00e3o direta)&quot;,&quot;value&quot;:&quot;29-ema-vs-wiener-compara\u00e7\u00e3o-direta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3 \u2014 Filtro de Kalman: estima\u00e7\u00e3o de estados, incerteza e predi\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;3-filtro-de-kalman-estima\u00e7\u00e3o-de-estados-incerteza-e-predi\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.1 Intui\u00e7\u00e3o antes da matem\u00e1tica&quot;,&quot;value&quot;:&quot;31-intui\u00e7\u00e3o-antes-da-matem\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.2 Modelo de estado (caso 1D)&quot;,&quot;value&quot;:&quot;32-modelo-de-estado-caso-1d&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.3 Ciclo do Kalman: previs\u00e3o e corre\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;33-ciclo-do-kalman-previs\u00e3o-e-corre\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1\ufe0f\u20e3 Previs\u00e3o&quot;,&quot;value&quot;:&quot;1\ufe0f\u20e3-previs\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2\ufe0f\u20e3 Corre\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;2\ufe0f\u20e3-corre\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.4 Compara\u00e7\u00e3o conceitual com EMA e Wiener&quot;,&quot;value&quot;:&quot;34-compara\u00e7\u00e3o-conceitual-com-ema-e-wiener&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.5 Implementa\u00e7\u00e3o Kalman 1D em C (vi\u00e1vel em MCU)&quot;,&quot;value&quot;:&quot;35-implementa\u00e7\u00e3o-kalman-1d-em-c-vi\u00e1vel-em-mcu&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.6 Escolhendo Q e R (engenharia pr\u00e1tica)&quot;,&quot;value&quot;:&quot;36-escolhendo-q-e-r-engenharia-pr\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.7 Quando Kalman \u00e9 a escolha certa&quot;,&quot;value&quot;:&quot;37-quando-kalman-\u00e9-a-escolha-certa&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.8 Onde Kalman n\u00e3o compensa&quot;,&quot;value&quot;:&quot;38-onde-kalman-n\u00e3o-compensa&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot; 4 \u2014 Compara\u00e7\u00e3o pr\u00e1tica entre EMA, Wiener e Kalman, diretrizes de escolha, encerramento e SEO&quot;,&quot;value&quot;:&quot;4-compara\u00e7\u00e3o-pr\u00e1tica-entre-ema-wiener-e-kalman-diretrizes-de-escolha-encerramento-e-seo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.1 O que realmente diferencia esses filtros (al\u00e9m da matem\u00e1tica)&quot;,&quot;value&quot;:&quot;41-o-que-realmente-diferencia-esses-filtros-al\u00e9m-da-matem\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.2 Compara\u00e7\u00e3o direta: quando cada filtro vence&quot;,&quot;value&quot;:&quot;42-compara\u00e7\u00e3o-direta-quando-cada-filtro-vence&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.3 Diretrizes pr\u00e1ticas de escolha (engenharia de campo)&quot;,&quot;value&quot;:&quot;43-diretrizes-pr\u00e1ticas-de-escolha-engenharia-de-campo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.4 Conex\u00e3o direta com os artigos anteriores da s\u00e9rie&quot;,&quot;value&quot;:&quot;44-conex\u00e3o-direta-com-os-artigos-anteriores-da-s\u00e9rie&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.5 Um erro comum: tratar filtros como \u201cp\u00f3s-processamento\u201d&quot;,&quot;value&quot;:&quot;45-um-erro-comum-tratar-filtros-como-p\u00f3s-processamento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.6 Encerramento conceitual&quot;,&quot;value&quot;:&quot;46-encerramento-conceitual&quot;,&quot;isDelete&quot;:false}]" data-smooth="true" data-top-offset=""><div class="eb-toc__list-wrap"><ul class="eb-toc__list"><li><a href="#eb-table-content-0">Média Móvel Exponencial, Wiener e Kalman aplicados ao RP2040</a><li><a href="#eb-table-content-1">1. Introdução — Por que filtros são decisores disfarçados</a><li><a href="#11-o-papel-dos-filtros-na-arquitetura-embarcada-moderna">1.1 O papel dos filtros na arquitetura embarcada moderna</a><li><a href="#12-ordem-crescente-de-complexidade-e-poder">1.2 Ordem crescente de complexidade (e poder)</a><li><a href="#eb-table-content-4">1.3 Começando pelo mais importante: Média Móvel Exponencial (EMA)</a><li><a href="#14-conceito-intuitivo-da-ema">1.4 Conceito intuitivo da EMA</a><li><a href="#15-ema-como-filtro-passa-baixa-de-primeira-ordem">1.5 EMA como filtro passa-baixa de primeira ordem</a><li><a href="#eb-table-content-7">1.6 Implementação incremental em C (base do artigo)</a><li><a href="#eb-table-content-8">1.7 Escolhendo o valor de α (engenharia, não tentativa)</a><li><a href="#eb-table-content-9">1.8 Onde a EMA falha (e por quê)</a><li><a href="#eb-table-content-10">2 — Filtro de Wiener: minimização do erro médio e separação sinal-ruído</a><ul class="eb-toc__list"><li><a href="#eb-table-content-11">2.1 A ideia central do Wiener (sem fórmulas intimidadoras)</a><li><a href="#eb-table-content-12">2.2 Modelo estatístico assumido</a><li><a href="#eb-table-content-13">2.3 Wiener no domínio da frequência (visão conceitual)</a><li><a href="#eb-table-content-14">2.4 Por que isso é poderoso em sistemas embarcados?</a><li><a href="#25-wiener-simplificado-para-mcu-forma-escalar">2.5 Wiener simplificado para MCU (forma escalar)</a><li><a href="#eb-table-content-16">2.6 Implementação incremental em C (forma prática)</a><li><a href="#eb-table-content-17">2.7 Estimando variâncias em tempo real</a><li><a href="#eb-table-content-18">2.8 Onde o Wiener falha (e quando não usar)</a><li><a href="#eb-table-content-19">2.9 EMA vs. Wiener (comparação direta)</a></li></ul><li><a href="#eb-table-content-20">3 — Filtro de Kalman: estimação de estados, incerteza e predição</a><ul class="eb-toc__list"><li><a href="#eb-table-content-21">3.1 Intuição antes da matemática</a><li><a href="#32-modelo-de-estado-caso-1d">3.2 Modelo de estado (caso 1D)</a><li><a href="#eb-table-content-23">3.3 Ciclo do Kalman: previsão e correção</a><ul class="eb-toc__list"><li><a href="#eb-table-content-24">1&#x20e3; Previsão</a><li><a href="#eb-table-content-25">2&#x20e3; Correção</a></li></ul><li><a href="#eb-table-content-26">3.4 Comparação conceitual com EMA e Wiener</a><li><a href="#eb-table-content-27">3.5 Implementação Kalman 1D em C (viável em MCU)</a><li><a href="#eb-table-content-28">3.6 Escolhendo Q e R (engenharia prática)</a><li><a href="#eb-table-content-29">3.7 Quando Kalman é a escolha certa</a><li><a href="#eb-table-content-30">3.8 Onde Kalman não compensa</a></li></ul><li><a href="#eb-table-content-31"> 4 — Comparação prática entre EMA, Wiener e Kalman, diretrizes de escolha, encerramento e SEO</a><ul class="eb-toc__list"><li><a href="#eb-table-content-32">4.1 O que realmente diferencia esses filtros (além da matemática)</a><li><a href="#eb-table-content-33">4.2 Comparação direta: quando cada filtro vence</a><li><a href="#eb-table-content-34">4.3 Diretrizes práticas de escolha (engenharia de campo)</a><li><a href="#eb-table-content-35">4.4 Conexão direta com os artigos anteriores da série</a><li><a href="#eb-table-content-36">4.5 Um erro comum: tratar filtros como “pós-processamento”</a><li><a href="#46-encerramento-conceitual">4.6 Encerramento conceitual</a></li></ul></ul></div></div></div></div></div>


<h3 class="wp-block-heading">Média Móvel Exponencial, Wiener e Kalman aplicados ao RP2040</h3>



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



<h2 class="wp-block-heading">1. Introdução — Por que filtros são decisores disfarçados</h2>



<p class="wp-block-paragraph">Ao longo desta série, trabalhamos com <strong>DSP embarcado aplicado</strong>, partindo do sinal bruto até decisões confiáveis em microcontroladores de recursos limitados. Em todos os artigos anteriores, um ponto ficou claro:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Nenhum sinal real é limpo.<br>Nenhuma decisão deve confiar em uma única amostra.</strong></p>
</blockquote>



<p class="wp-block-paragraph">É exatamente nesse ponto que entram os <strong>filtros estatísticos</strong>.</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="1024" height="768" src="https://mcu.tec.br/wp-content/uploads/2026/01/image.jpeg" alt="" class="wp-image-1138" srcset="https://mcu.tec.br/wp-content/uploads/2026/01/image.jpeg 1024w, https://mcu.tec.br/wp-content/uploads/2026/01/image-300x225.jpeg 300w, https://mcu.tec.br/wp-content/uploads/2026/01/image-768x576.jpeg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Embora muitas vezes apresentados apenas como técnicas matemáticas, filtros como <strong>média móvel exponencial</strong>, <strong>Wiener</strong> e <strong>Kalman</strong> são, na prática, <strong>mecanismos de tomada de decisão temporal</strong>, capazes de separar:</p>



<ul class="wp-block-list">
<li>sinal de ruído,</li>



<li>tendência de flutuação,</li>



<li>informação de incerteza.</li>
</ul>



<p class="wp-block-paragraph">Neste artigo, vamos tratar esses filtros <strong>não como abstrações matemáticas</strong>, mas como <strong>ferramentas práticas de engenharia</strong>, aplicáveis diretamente a microcontroladores como o RP2040.</p>



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



<h2 class="wp-block-heading">1.1 O papel dos filtros na arquitetura embarcada moderna</h2>



<p class="wp-block-paragraph">Em um sistema embarcado real, filtros aparecem em três papéis fundamentais:</p>



<ol class="wp-block-list">
<li><strong>Suavização</strong>
<ul class="wp-block-list">
<li>Reduz ruído de sensores</li>



<li>Evita decisões instáveis</li>
</ul>
</li>



<li><strong>Estimativa</strong>
<ul class="wp-block-list">
<li>Inferir estados não diretamente observáveis</li>



<li>Combinar modelo e medição</li>
</ul>
</li>



<li><strong>Tomada de decisão</strong>
<ul class="wp-block-list">
<li>Controlar histerese</li>



<li>Definir quando um evento realmente ocorreu</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph">Nos artigos anteriores, usamos:</p>



<ul class="wp-block-list">
<li>EMA implicitamente (suavização de score)</li>



<li>Estatística para decisão adaptativa</li>
</ul>



<p class="wp-block-paragraph">Agora, vamos <strong>formalizar isso conscientemente</strong>.</p>



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



<h2 class="wp-block-heading">1.2 Ordem crescente de complexidade (e poder)</h2>



<p class="wp-block-paragraph">Os filtros que abordaremos seguem uma progressão natural:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Filtro</th><th>Ideia central</th><th>Custo</th><th>Uso típico</th></tr></thead><tbody><tr><td>Média móvel exponencial</td><td>Suavizar passado</td><td>Muito baixo</td><td>Ruído rápido</td></tr><tr><td>Wiener</td><td>Minimizar erro médio</td><td>Médio</td><td>SNR conhecido</td></tr><tr><td>Kalman</td><td>Estimar estado oculto</td><td>Maior</td><td>Sistemas dinâmicos</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Importante:<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>mais complexo não significa melhor</strong>.<br>Cada filtro resolve um tipo específico de problema.</p>



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



<h2 class="wp-block-heading">1.3 Começando pelo mais importante: Média Móvel Exponencial (EMA)</h2>



<p class="wp-block-paragraph">A <strong>média móvel exponencial</strong> é, sem exagero, <strong>o filtro mais importante do firmware moderno</strong>.</p>



<p class="wp-block-paragraph">Ela aparece em:</p>



<ul class="wp-block-list">
<li>sensores IoT,</li>



<li>controle de ganhos,</li>



<li>suavização de scores,</li>



<li>debouncing avançado,</li>



<li>aprendizado estatístico.</li>
</ul>



<p class="wp-block-paragraph">E, ainda assim, é frequentemente subestimada.</p>



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



<h2 class="wp-block-heading">1.4 Conceito intuitivo da EMA</h2>



<p class="wp-block-paragraph">A EMA responde a uma pergunta simples:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Quanto do passado eu quero lembrar?</em></p>
</blockquote>



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



<ul class="wp-block-list">
<li>valor anterior filtrado</li>



<li>nova amostra</li>
</ul>



<p class="wp-block-paragraph">Equação discreta:</p>



<p class="wp-block-paragraph">\[<br>y[n] = y[n-1] + \alpha \big(x[n] &#8211; y[n-1]\big)<br>\]



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



<ul class="wp-block-list">
<li>\(x[n]\): amostra atual</li>



<li>\(y[n]\): saída filtrada</li>



<li>\(\alpha \in (0,1)\): taxa de resposta</li>
</ul>



<p class="wp-block-paragraph">Interpretação física:</p>



<ul class="wp-block-list">
<li>\(\alpha\) pequeno → memória longa</li>



<li>\(\alpha\) grande → resposta rápida</li>
</ul>



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



<h2 class="wp-block-heading">1.5 EMA como filtro passa-baixa de primeira ordem</h2>



<p class="wp-block-paragraph">Embora simples, a EMA é um <strong>filtro IIR passa-baixa</strong>, com:</p>



<ul class="wp-block-list">
<li>1 polo real</li>



<li>estabilidade garantida</li>



<li>custo O(1) por amostra</li>
</ul>



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



<ul class="wp-block-list">
<li>ruído de alta frequência</li>



<li>flutuações instantâneas</li>
</ul>



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



<ul class="wp-block-list">
<li>buffers grandes</li>



<li>atrasos excessivos</li>
</ul>



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



<h2 class="wp-block-heading">1.6 Implementação incremental em C (base do artigo)</h2>



<p class="wp-block-paragraph">Começamos com a versão mais simples possível:</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>typedef struct {
    float y;
} ema_filter_t;

static inline void ema_init(ema_filter_t *f, float y0)
{
    f->y = y0;
}

static inline float ema_step(ema_filter_t *f, float x, float alpha)
{
    f->y += alpha * (x - f->y);
    return f->y;
}
</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: #D8DEE9">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">struct</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">y</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ema_filter_t</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">inline</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">ema_init</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">ema_filter_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">f</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: #D8DEE9">y0</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">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">y0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">inline</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">ema_step</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">ema_filter_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">f</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: #D8DEE9">x</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: #D8DEE9">alpha</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">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">alpha</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">x</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">y</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Características:</p>



<ul class="wp-block-list">
<li>Nenhuma alocação dinâmica</li>



<li>Uma multiplicação por amostra</li>



<li>Ideal para ISR ou loop rápido</li>
</ul>



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



<h2 class="wp-block-heading">1.7 Escolhendo o valor de α (engenharia, não tentativa)</h2>



<p class="wp-block-paragraph">Uma regra prática muito usada em firmware:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>α</th><th>Comportamento</th></tr></thead><tbody><tr><td>0.01</td><td>Muito suave, lento</td></tr><tr><td>0.05</td><td>Estável, robusto</td></tr><tr><td>0.1</td><td>Boa resposta</td></tr><tr><td>0.3+</td><td>Pouca filtragem</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Outra forma de pensar:</p>



<ul class="wp-block-list">
<li>EMA ≈ média móvel de \(N \approx \frac{2}{\alpha}\) amostras</li>
</ul>



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



<ul class="wp-block-list">
<li>α = 0.05 → ~40 amostras efetivas</li>
</ul>



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



<h2 class="wp-block-heading">1.8 Onde a EMA falha (e por quê)</h2>



<p class="wp-block-paragraph">Apesar de poderosa, a EMA tem limitações claras:</p>



<ul class="wp-block-list">
<li>Não modela dinâmica do sistema</li>



<li>Não separa ruído de sinal estatisticamente</li>



<li>Não incorpora incerteza</li>



<li>Não prevê o futuro</li>
</ul>



<p class="wp-block-paragraph">Essas limitações nos levam naturalmente aos próximos filtros.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/algoritimos/dsp/filtros-estatisticos-em-sistemas-embarcados-ema-wiener-e-kalman-aplicados-ao-rp2040/">Filtros Estatísticos em Sistemas Embarcados: EMA, Wiener e Kalman Aplicados ao 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">1137</post-id>	</item>
		<item>
		<title>Mediana em medições via ADC e o algoritmo de seleção por partição (Quickselect)</title>
		<link>https://mcu.tec.br/algoritimos/dsp/mediana-em-medicoes-via-adc-e-o-algoritmo-de-selecao-por-particao-quickselect/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mediana-em-medicoes-via-adc-e-o-algoritmo-de-selecao-por-particao-quickselect</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Thu, 19 Feb 2026 16:44:49 +0000</pubDate>
				<category><![CDATA[DSP]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1374</guid>

					<description><![CDATA[<p>Aprenda de forma didática como calcular a mediana em medições de ADC utilizando o algoritmo de seleção por partição (Quickselect) em sistemas embarcados. Este artigo explica o conceito estatístico de mediana, apresenta as fórmulas para janelas pares e ímpares, discute complexidade computacional O(N) média versus O(N log N) da ordenação completa e demonstra passo a passo a implementação em linguagem C otimizada para microcontroladores. Ideal para aplicações com STM32, ESP32, RP2040 e outros MCUs, o conteúdo mostra como reduzir ruídos impulsivos, melhorar a robustez de leituras analógicas e aplicar o filtro de mediana em janelas deslizantes de forma eficiente e segura em tempo real.</p>
<p>The post <a href="https://mcu.tec.br/algoritimos/dsp/mediana-em-medicoes-via-adc-e-o-algoritmo-de-selecao-por-particao-quickselect/">Mediana em medições via ADC e o algoritmo de seleção por partição (Quickselect)</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Em medições reais com ADC (Conversor Analógico–Digital), ruído impulsivo e leituras “espúrias” aparecem com frequência: comutação de fonte, EMI (Interferência Eletromagnética), contato ruim, saturação momentânea do front-end, etc. Se você faz apenas média aritmética, um único pico pode arrastar o resultado. A mediana, por outro lado, é um estimador robusto: ela “ignora” a magnitude dos extremos e depende basicamente da posição (ordem) dos valores. Isso a torna excelente para filtrar leituras em janelas deslizantes (por exemplo, 9, 15 ou 31 amostras), entregando um valor estável sem “amassar” tanto degraus quanto um passa-baixas forte faria.</p>



<p class="wp-block-paragraph">A ideia prática em firmware é simples: você acumula <strong>N</strong> amostras do ADC em um buffer, calcula a mediana do buffer e usa esse valor como leitura filtrada. O detalhe é que ordenar <strong>tudo</strong> (por exemplo, com quicksort) custa mais do que precisamos. Para achar a mediana, basta encontrar o elemento “do meio” na ordem — e isso pode ser feito com <strong>seleção por partição</strong>, também conhecida como <strong>Quickselect</strong>.</p>



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



<h2 class="wp-block-heading">Fórmulas: o que é a mediana (caso ímpar e par)</h2>



<p class="wp-block-paragraph">Considere uma janela com <strong>N</strong> amostras \(x_0, x_1, \dots, x_{N-1}\). Imagine a versão ordenada dessas amostras \(x_{(0)} \le x_{(1)} \le \dots \le x_{(N-1)}\), onde \(x_{(k)}\) é o k-ésimo menor valor.</p>



<p class="wp-block-paragraph">Quando <strong>N é ímpar</strong>, a mediana é o elemento central:</p>



<p class="wp-block-paragraph">\[<br>\mathrm{med}(x) = x_{\left(\frac{N-1}{2}\right)}<br>\]



<p class="wp-block-paragraph">Quando <strong>N é par</strong>, há duas convenções comuns. A mais usada em processamento numérico é a média dos dois centrais:</p>



<p class="wp-block-paragraph">\[<br>\mathrm{med}(x) = \frac{ x_{\left(\frac{N}{2}-1\right)} + x_{\left(\frac{N}{2}\right)} }{2}<br>\]



<p class="wp-block-paragraph">Em ADC (inteiro), essa divisão por 2 costuma ser feita com cuidado para não estourar o tipo (por isso somamos em 32 bits e só depois dividimos).</p>



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



<h2 class="wp-block-heading">Por que “seleção por partição” resolve melhor que ordenar tudo</h2>



<p class="wp-block-paragraph">Ordenar N valores tipicamente custa \(O(N \log N)\). Já o <strong>Quickselect</strong> encontra o k-ésimo menor em <strong>tempo médio (O(N))</strong>, porque ele faz o mesmo “corte” do quicksort (partição em torno de um pivô), mas só continua recursivamente/iterativamente <strong>no lado que contém o índice k</strong>. Para a mediana, você quer \(k = (N-1)/2\) (ou os dois centrais se N for par).</p>



<p class="wp-block-paragraph">Para firmware, isso é valioso: menos ciclos, menos consumo, e você pode rodar a cada janela sem pesar no tempo real. Em geral, o algoritmo trabalha <strong>in-place</strong> (ele rearranja o buffer). Se você precisa preservar as amostras originais, basta copiar a janela para um buffer temporário e aplicar o Quickselect nesse temporário.</p>



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



<h2 class="wp-block-heading">Código em C: Quickselect iterativo + mediana para ADC (uint16_t)</h2>



<p class="wp-block-paragraph">Abaixo vai uma implementação <strong>iterativa</strong> (evita recursão, o que é mais amigável a microcontroladores), com partição estilo Lomuto. Ela funciona bem para medianas em janelas pequenas/médias (bem típico em ADC). Está tudo comentado e pronto para colar em um projeto bare-metal/RTOS.</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>#include &lt;stdint.h>
#include &lt;stddef.h>

/**
 * @brief Troca dois elementos uint16_t.
 */
static inline void swap_u16(uint16_t *a, uint16_t *b)
{
    uint16_t t = *a;
    *a = *b;
    *b = t;
}

/**
 * @brief Particiona o array no intervalo &#91;left, right&#93; usando o pivô em pivot_index.
 *
 * Após a partição:
 * - todos os elementos &lt; pivot ficam à esquerda,
 * - todos os elementos >= pivot ficam à direita,
 * - a função retorna a posição final do pivô.
 *
 * @param a Array de amostras (será rearranjado in-place).
 * @param left Índice inicial do intervalo.
 * @param right Índice final do intervalo.
 * @param pivot_index Índice do pivô escolhido.
 * @return size_t Posição final do pivô após a partição.
 */
static size_t partition_lomuto_u16(uint16_t *a, size_t left, size_t right, size_t pivot_index)
{
    const uint16_t pivot = a&#91;pivot_index&#93;;

    // Move pivô para o final para particionar mais facilmente
    swap_u16(&amp;a&#91;pivot_index&#93;, &amp;a&#91;right&#93;);

    size_t store = left;

    for (size_t i = left; i &lt; right; i++)
    {
        if (a&#91;i&#93; &lt; pivot)
        {
            swap_u16(&amp;a&#91;i&#93;, &amp;a&#91;store&#93;);
            store++;
        }
    }

    // Coloca o pivô na posição final
    swap_u16(&amp;a&#91;store&#93;, &amp;a&#91;right&#93;);
    return store;
}

/**
 * @brief Escolha simples de pivô: "mediana de três" (left, mid, right).
 *
 * Isso reduz a chance de pior caso em dados parcialmente ordenados,
 * algo comum em ADC com rampa lenta.
 */
static size_t pivot_median_of_three_u16(uint16_t *a, size_t left, size_t right)
{
    size_t mid = left + (right - left) / 2;

    uint16_t x = a&#91;left&#93;;
    uint16_t y = a&#91;mid&#93;;
    uint16_t z = a&#91;right&#93;;

    // Retorna o índice da mediana entre x, y, z
    if ((x &lt;= y &amp;&amp; y &lt;= z) || (z &lt;= y &amp;&amp; y &lt;= x)) return mid;
    if ((y &lt;= x &amp;&amp; x &lt;= z) || (z &lt;= x &amp;&amp; x &lt;= y)) return left;
    return right;
}

/**
 * @brief Quickselect iterativo: encontra o k-ésimo menor elemento (0-based).
 *
 * @param a Array (será rearranjado in-place).
 * @param n Tamanho do array.
 * @param k Índice (0..n-1) do elemento desejado na ordem crescente.
 * @return uint16_t Valor do k-ésimo menor elemento.
 */
uint16_t quickselect_k_u16(uint16_t *a, size_t n, size_t k)
{
    size_t left = 0;
    size_t right = n - 1;

    while (left &lt;= right)
    {
        size_t pivot_index = pivot_median_of_three_u16(a, left, right);
        size_t pivot_final = partition_lomuto_u16(a, left, right, pivot_index);

        if (pivot_final == k)
        {
            return a&#91;pivot_final&#93;;
        }
        else if (k &lt; pivot_final)
        {
            // Continua só no lado esquerdo
            if (pivot_final == 0) break; // proteção contra underflow
            right = pivot_final - 1;
        }
        else
        {
            // Continua só no lado direito
            left = pivot_final + 1;
        }
    }

    // Em condições normais não chega aqui; retorno defensivo
    return a&#91;k&#93;;
}

/**
 * @brief Calcula a mediana de uma janela ADC (uint16_t).
 *
 * Observação importante: o Quickselect altera o array.
 * Se você precisa preservar o buffer original, passe uma cópia.
 *
 * @param window Buffer de N amostras.
 * @param n Número de amostras (N).
 * @return uint16_t Mediana (para N par, retorna a média dos dois centrais).
 */
uint16_t median_adc_u16_inplace(uint16_t *window, size_t n)
{
    if (n == 0) return 0;

    if (n &amp; 1u)
    {
        // N ímpar: elemento central
        size_t k = (n - 1u) / 2u;
        return quickselect_k_u16(window, n, k);
    }
    else
    {
        // N par: média dos dois centrais
        size_t k1 = (n / 2u) - 1u;
        size_t k2 = (n / 2u);

        uint16_t m1 = quickselect_k_u16(window, n, k1);
        uint16_t m2 = quickselect_k_u16(window, n, k2);

        // Soma em 32 bits para evitar overflow e divide por 2
        uint32_t sum = (uint32_t)m1 + (uint32_t)m2;
        return (uint16_t)(sum / 2u);
    }
}
</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">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">stdint</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">stddef</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></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">brief</span><span style="color: #616E88"> Troca dois elementos uint16_t.</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: #D8DEE9">inline</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">swap_u16</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">b</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">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">b</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">b</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">t</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></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">brief</span><span style="color: #616E88"> Particiona o array no intervalo &#91;left, right&#93; usando o pivô em pivot_index.</span></span>
<span class="line"><span style="color: #616E88"> *</span></span>
<span class="line"><span style="color: #616E88"> * Após a partição:</span></span>
<span class="line"><span style="color: #616E88"> * - todos os elementos &lt; pivot ficam à esquerda,</span></span>
<span class="line"><span style="color: #616E88"> * - todos os elementos &gt;= pivot ficam à direita,</span></span>
<span class="line"><span style="color: #616E88"> * - a função retorna a posição final do pivô.</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">a</span><span style="color: #616E88"> Array de amostras (será rearranjado in-place).</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">left</span><span style="color: #616E88"> Índice inicial do intervalo.</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">right</span><span style="color: #616E88"> Índice final do intervalo.</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">pivot_index</span><span style="color: #616E88"> Índice do pivô escolhido.</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"> size_t Posição final do pivô após a partição.</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: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">partition_lomuto_u16</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">left</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">right</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pivot_index</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">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> pivot </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">pivot_index</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">// Move pivô para o final para particionar mais facilmente</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">swap_u16</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">pivot_index</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">right</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: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">store</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">left</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">size_t</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: #D8DEE9">left</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">right</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>
<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: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pivot</span><span style="color: #D8DEE9FF">)</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: #88C0D0">swap_u16</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">store</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">store</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">// Coloca o pivô na posição final</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">swap_u16</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">store</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">right</span><span style="color: #D8DEE9FF">&#93;)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">store</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></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">brief</span><span style="color: #616E88"> Escolha simples de pivô: &quot;mediana de três&quot; (left, mid, right).</span></span>
<span class="line"><span style="color: #616E88"> *</span></span>
<span class="line"><span style="color: #616E88"> * Isso reduz a chance de pior caso em dados parcialmente ordenados,</span></span>
<span class="line"><span style="color: #616E88"> * algo comum em ADC com rampa lenta.</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: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">pivot_median_of_three_u16</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">left</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">right</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">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mid</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">left</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">right</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">left</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">x</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">left</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">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">mid</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">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">z</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">right</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">// Retorna o índice da mediana entre x, y, z</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">x</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">z</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">||</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">z</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">x</span><span style="color: #D8DEE9FF">)) </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mid</span><span style="color: #81A1C1">;</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">y</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">x</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">x</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">z</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">||</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">z</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">x</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">x</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF">)) </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">left</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">right</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></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">brief</span><span style="color: #616E88"> Quickselect iterativo: encontra o k-ésimo menor elemento (0-based).</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">a</span><span style="color: #616E88"> Array (será rearranjado in-place).</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 array.</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">k</span><span style="color: #616E88"> Índice (0..n-1) do elemento desejado na ordem crescente.</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"> uint16_t Valor do k-ésimo menor elemento.</span></span>
<span class="line"><span style="color: #616E88"> */</span></span>
<span class="line"><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">quickselect_k_u16</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">size_t</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">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k</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">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">left</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>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">right</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: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">while</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">left</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">right</span><span style="color: #D8DEE9FF">)</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: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pivot_index</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">pivot_median_of_three_u16</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">left</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">right</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pivot_final</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">partition_lomuto_u16</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">left</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">right</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pivot_index</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: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">pivot_final</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k</span><span style="color: #D8DEE9FF">)</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: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">pivot_final</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: #D8DEE9FF">        </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">if</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">pivot_final</span><span style="color: #D8DEE9FF">)</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 style="color: #616E88">// Continua só no lado esquerdo</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">pivot_final</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: #D8DEE9FF">) </span><span style="color: #81A1C1">break;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// proteção contra underflow</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">right</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pivot_final</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: #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: #81A1C1">else</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 style="color: #616E88">// Continua só no lado direito</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">left</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pivot_final</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: #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">// Em condições normais não chega aqui; retorno defensivo</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</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: #ECEFF4">}</span></span>
<span class="line"></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">brief</span><span style="color: #616E88"> Calcula a mediana de uma janela ADC (uint16_t).</span></span>
<span class="line"><span style="color: #616E88"> *</span></span>
<span class="line"><span style="color: #616E88"> * Observação importante: o Quickselect altera o array.</span></span>
<span class="line"><span style="color: #616E88"> * Se você precisa preservar o buffer original, passe uma cópia.</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">window</span><span style="color: #616E88"> Buffer de N amostras.</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"> Número de amostras (N).</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"> uint16_t Mediana (para N par, retorna a média dos dois centrais).</span></span>
<span class="line"><span style="color: #616E88"> */</span></span>
<span class="line"><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">median_adc_u16_inplace</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">window</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">size_t</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">if</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: #D8DEE9FF">) </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9FF"> 1</span><span style="color: #D8DEE9">u</span><span style="color: #D8DEE9FF">)</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 style="color: #616E88">// N ímpar: elemento central</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">size_t</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: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> 1</span><span style="color: #D8DEE9">u</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> 2</span><span style="color: #D8DEE9">u</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">quickselect_k_u16</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">window</span><span style="color: #ECEFF4">,</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">k</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: #D8DEE9FF">    </span><span style="color: #81A1C1">else</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 style="color: #616E88">// N par: média dos dois centrais</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k1</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"> 2</span><span style="color: #D8DEE9">u</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> 1</span><span style="color: #D8DEE9">u</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k2</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"> 2</span><span style="color: #D8DEE9">u</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">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">m1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">quickselect_k_u16</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">window</span><span style="color: #ECEFF4">,</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">k1</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">m2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">quickselect_k_u16</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">window</span><span style="color: #ECEFF4">,</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">k2</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">// Soma em 32 bits para evitar overflow e divide por 2</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">uint32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sum</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">uint32_t</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">m1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">uint32_t</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">m2</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF">)(</span><span style="color: #D8DEE9">sum</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> 2</span><span style="color: #D8DEE9">u</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>



<h3 class="wp-block-heading">Como usar em um fluxo típico de ADC (janela deslizante)</h3>



<p class="wp-block-paragraph">Em prática embarcada, você costuma ter um buffer circular com N amostras mais recentes. Quando a janela “fecha” (por exemplo, a cada amostra ou a cada bloco DMA), você copia para um buffer temporário e calcula a mediana nele, preservando o circular.</p>



<p class="wp-block-paragraph">Uma versão de uso (exemplo) ficaria assim:</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>#include &lt;string.h> // memcpy

#define N  15

static uint16_t adc_ring&#91;N&#93;;
static uint16_t tmp&#91;N&#93;;
static size_t wr = 0;

/**
 * @brief Atualiza a janela com uma nova amostra e devolve a mediana.
 *
 * @param sample Nova leitura ADC.
 * @return uint16_t Mediana das últimas N amostras.
 */
uint16_t adc_update_and_median(uint16_t sample)
{
    adc_ring&#91;wr&#93; = sample;
    wr = (wr + 1u) % N;

    // Copia a janela para processar sem bagunçar o ring
    memcpy(tmp, adc_ring, sizeof(tmp));

    return median_adc_u16_inplace(tmp, N);
}
</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">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">string</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// memcpy</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">  </span><span style="color: #B48EAD">15</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">adc_ring</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: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tmp</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: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wr</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>
<span class="line"></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">brief</span><span style="color: #616E88"> Atualiza a janela com uma nova amostra e devolve a mediana.</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">sample</span><span style="color: #616E88"> Nova leitura ADC.</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"> uint16_t Mediana das últimas N amostras.</span></span>
<span class="line"><span style="color: #616E88"> */</span></span>
<span class="line"><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">adc_update_and_median</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sample</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">adc_ring</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">wr</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sample</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">wr</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">wr</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> 1</span><span style="color: #D8DEE9">u</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>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Copia a janela para processar sem bagunçar o ring</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">memcpy</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">tmp</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">adc_ring</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sizeof</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">tmp</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: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">median_adc_u16_inplace</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">tmp</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: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esse padrão é especialmente bom quando você tem ruídos impulsivos: a mediana remove “picos” isolados com eficiência sem a latência de um filtro passa-baixas forte.</p>



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



<h2 class="wp-block-heading">Observações de engenharia para ficar “bom de firmware”</h2>



<p class="wp-block-paragraph">Como o Quickselect rearranja dados, o custo de memória vira uma decisão de projeto: se você pode destruir a janela, roda direto; se não pode, copie. Em microcontroladores pequenos, dá para manter um <code>tmp[]</code> estático do tamanho da janela. Para tempo real, prefira N pequeno (9, 15, 31) e pivô “mediana de três” como no código para reduzir casos ruins quando o sinal muda lentamente. Se você estiver usando FreeRTOS, essa função pode rodar numa tarefa de processamento após um evento do DMA, mantendo o ISR enxuto.</p>



<p class="wp-block-paragraph">Se você quiser ir além, dá para combinar mediana com média: primeiro aplica mediana para “limpar” impulsos e depois uma média móvel curta para reduzir ruído branco, o que costuma ficar excelente para sensores resistivos, NTC e shunt (onde spikes de comutação aparecem).</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/algoritimos/dsp/mediana-em-medicoes-via-adc-e-o-algoritmo-de-selecao-por-particao-quickselect/">Mediana em medições via ADC e o algoritmo de seleção por partição (Quickselect)</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1374</post-id>	</item>
		<item>
		<title>Detecção de Assobio com Goertzel e Aprendizado Estatístico no RP2040</title>
		<link>https://mcu.tec.br/algoritimos/dsp/deteccao-de-assobio-com-goertzel-e-aprendizado-estatistico-no-rp2040/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=deteccao-de-assobio-com-goertzel-e-aprendizado-estatistico-no-rp2040</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Thu, 12 Feb 2026 11:36:50 +0000</pubDate>
				<category><![CDATA[DSP]]></category>
		<category><![CDATA[aprendizado estatístico]]></category>
		<category><![CDATA[BitDogLab]]></category>
		<category><![CDATA[classificação estatística]]></category>
		<category><![CDATA[detecção de assobio]]></category>
		<category><![CDATA[DSP embarcado]]></category>
		<category><![CDATA[firmware em c]]></category>
		<category><![CDATA[Goertzel]]></category>
		<category><![CDATA[processamento de áudio]]></category>
		<category><![CDATA[RP2040]]></category>
		<category><![CDATA[sistemas adaptativos]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1127</guid>

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



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



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


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


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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



<li>Leves</li>



<li>Computacionalmente previsíveis</li>



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



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



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



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



<li>Classificador linear simples</li>



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



<li>Sensores inteligentes</li>



<li>Interfaces por som</li>



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



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



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/algoritimos/dsp/deteccao-de-assobio-com-goertzel-e-aprendizado-estatistico-no-rp2040/">Detecção de Assobio com Goertzel e Aprendizado Estatístico no RP2040</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1127</post-id>	</item>
		<item>
		<title>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 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>
	</channel>
</rss>
