<?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>espectro de frequência - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/espectro-de-frequencia/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Fri, 21 Mar 2025 21:39:54 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</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>espectro de frequência - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>A Transformada de Fourier: Fundamentos, Demonstração e Implementação em C</title>
		<link>https://mcu.tec.br/algoritimos/a-transformada-de-fourier-fundamentos-demonstracao-e-implementacao-em-c/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-transformada-de-fourier-fundamentos-demonstracao-e-implementacao-em-c</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Tue, 25 Mar 2025 16:21:06 +0000</pubDate>
				<category><![CDATA[Algoritimos]]></category>
		<category><![CDATA[análise de vibração]]></category>
		<category><![CDATA[análise espectral]]></category>
		<category><![CDATA[código em C]]></category>
		<category><![CDATA[dft]]></category>
		<category><![CDATA[domínio da frequência]]></category>
		<category><![CDATA[engenharia elétrica]]></category>
		<category><![CDATA[espectro de frequência]]></category>
		<category><![CDATA[fft]]></category>
		<category><![CDATA[ifft]]></category>
		<category><![CDATA[implementação em C]]></category>
		<category><![CDATA[processamento de sinais]]></category>
		<category><![CDATA[processamento digital]]></category>
		<category><![CDATA[reconstrução de sinal]]></category>
		<category><![CDATA[sinais de áudio]]></category>
		<category><![CDATA[sinais de sensores]]></category>
		<category><![CDATA[sinais digitais]]></category>
		<category><![CDATA[sinal no tempo]]></category>
		<category><![CDATA[transformada de fourier]]></category>
		<category><![CDATA[transformada rápida de fourier]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=212</guid>

					<description><![CDATA[<p>Entenda a Transformada de Fourier e veja como implementá-la em C com exemplos práticos, FFT, iFFT e aplicação em sinais reais de sensores e áudio.</p>
<p>The post <a href="https://mcu.tec.br/algoritimos/a-transformada-de-fourier-fundamentos-demonstracao-e-implementacao-em-c/">A Transformada de Fourier: Fundamentos, Demonstração e Implementação em C</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading"><strong>Introdução</strong></h2>



<p class="wp-block-paragraph">A Transformada de Fourier (TF) é uma das ferramentas matemáticas mais poderosas na análise de sinais e sistemas. Ela permite converter um sinal do domínio do tempo para o domínio da frequência, revelando componentes espectrais que não são diretamente perceptíveis no tempo. Aplicações da TF vão desde o processamento digital de sinais (DSP) até física, telecomunicações, engenharia biomédica e eletrônica.</p>



<p class="wp-block-paragraph">Neste artigo, exploraremos a base teórica da Transformada de Fourier, sua demonstração matemática e uma implementação completa em linguagem C, focando em clareza e didática para leitores iniciantes.</p>



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



<h2 class="wp-block-heading"><strong>Fundamentos da Transformada de Fourier</strong></h2>



<p class="wp-block-paragraph">Imagine um sinal contínuo no tempo, como uma onda sonora. Esse sinal pode ser decomposto como a soma de muitas senóides (ondas senoidais) com diferentes frequências, amplitudes e fases. A Transformada de Fourier é o processo que encontra essas senóides componentes.</p>



<p class="wp-block-paragraph">Matematicamente, para um sinal contínuo x(t)x(t), a Transformada de Fourier é dada por: </p>



<p class="wp-block-paragraph">\[<br>X(f) = \int_{-\infty}^{\infty} x(t) e^{-j 2\pi f t} \, dt<br>\]



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



<ul class="wp-block-list">
<li>x(t): sinal no tempo contínuo.</li>



<li>X(f): espectro de frequências do sinal.</li>



<li>f: frequência.</li>



<li>j: unidade imaginária \((j^2 = -1)\).</li>
</ul>



<p class="wp-block-paragraph">A transformada inversa é dada por: </p>



<p class="wp-block-paragraph">\[<br>x(t) = \int_{-\infty}^{\infty} X(f) e^{j 2\pi f t} \, df<br>\]



<p class="wp-block-paragraph">Ou seja, é possível reconstruir o sinal original a partir de suas componentes de frequência.</p>



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



<h2 class="wp-block-heading"><strong>Transformada de Fourier Discreta (DFT)</strong></h2>



<p class="wp-block-paragraph">Na prática, lidamos com sinais amostrados digitalmente. Para isso, usamos a versão discreta da TF: a <strong>Transformada de Fourier Discreta (DFT)</strong>, definida por: </p>



<p class="wp-block-paragraph">\[<br>X_k = \sum_{n=0}^{N-1} x_n \cdot e^{-j \frac{2\pi}{N}kn}, \quad k = 0, 1, &#8230;, N-1<br>\]



<p class="wp-block-paragraph">E a transformada inversa: </p>



<p class="wp-block-paragraph">\[<br>x_n = \frac{1}{N} \sum_{k=0}^{N-1} X_k \cdot e^{j \frac{2\pi}{N}kn}<br>\]



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



<ul class="wp-block-list">
<li>\(x_n\): amostras no tempo.</li>



<li>\(X_k\): componente espectral da frequência kk.</li>



<li>N: número total de amostras.</li>
</ul>



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



<h2 class="wp-block-heading"><strong>Implementação em C da DFT</strong></h2>



<p class="wp-block-paragraph">A seguir, apresentamos um código simples em linguagem C que calcula a DFT de um vetor de números reais. Para isso, usaremos números complexos representados por duas variáveis (parte real e imaginária).</p>



<h3 class="wp-block-heading"><strong>Código C:</strong></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" data-code="#include <stdio.h&gt;
#include <stdlib.h&gt;
#include <math.h&gt;

#define PI 3.141592653589793

typedef struct {
    double real;
    double imag;
} Complex;

void DFT(double* x, Complex* X, int N) {
    for (int k = 0; k < N; k++) {
        X[k].real = 0;
        X[k].imag = 0;
        for (int n = 0; n < N; n++) {
            double angle = -2.0 * PI * k * n / N;
            X[k].real += x[n] * cos(angle);
            X[k].imag += x[n] * sin(angle);
        }
    }
}

int main() {
    int N = 8;
    double x[8] = {1, 0, -1, 0, 1, 0, -1, 0}; // Sinal de teste

    Complex* X = (Complex*)malloc(N * sizeof(Complex));

    DFT(x, X, N);

    printf(&quot;DFT Result:\n&quot;);
    for (int k = 0; k < N; k++) {
        printf(&quot;X[%d] = %.2f + %.2fi\n&quot;, k, X[k].real, X[k].imag);
    }

    free(X);
    return 0;
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">#include &lt;stdio.h&gt;</span></span>
<span class="line"><span style="color: #616E88">#include &lt;stdlib.h&gt;</span></span>
<span class="line"><span style="color: #616E88">#include &lt;math.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">#define PI 3.141592653589793</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">real</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">imag</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">} Complex;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">DFT</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">double*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Complex</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">X,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">k</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</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: #88C0D0">k</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">k++</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">X[k].real</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</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: #88C0D0">X[k].imag</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</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: #81A1C1">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</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: #88C0D0">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">n++</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">angle</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-2.0</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">PI</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">k</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">X[k].real</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x[n]</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">cos</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">angle</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">X[k].imag</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x[n]</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">sin</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">angle</span><span style="color: #ECEFF4">)</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 style="color: #D8DEE9FF">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">main</span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x[</span><span style="color: #B48EAD">8</span><span style="color: #A3BE8C">]</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-1,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-1,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">}</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Sinal</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">de</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">teste</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">Complex*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">X</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> (Complex*)malloc</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">N</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">sizeof</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">Complex</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">DFT(x,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">X,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">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: #88C0D0">&quot;DFT Result:\n&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">k</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</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: #88C0D0">k</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">k++</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">&quot;X[%d] = %.2f + %.2fi\n&quot;</span><span style="color: #88C0D0">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">k,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">X[k].real,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">X[k].imag</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>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">free(X</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: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esse código implementa diretamente a fórmula da DFT. Note que o tempo de execução cresce com \(N^2\), por isso para sinais muito longos recomenda-se usar a Transformada Rápida de Fourier (FFT), que veremos em outra seção.</p>



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



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



<h2 class="wp-block-heading"><strong>A Transformada Rápida de Fourier (FFT)</strong></h2>



<h3 class="wp-block-heading"><strong>Por que otimizar?</strong></h3>



<p class="wp-block-paragraph">Como vimos, a DFT exige N2N^2 operações para calcular todas as NN frequências de um sinal com NN amostras. Isso pode ser extremamente lento para sinais grandes. A <strong>Transformada Rápida de Fourier (FFT)</strong> resolve esse problema ao reduzir a complexidade para Nlog⁡2NN \log_2 N, um ganho <strong>drástico</strong> em eficiência.</p>



<p class="wp-block-paragraph">A FFT é uma maneira inteligente de reorganizar os cálculos da DFT, explorando simetrias matemáticas para evitar repetições desnecessárias.</p>



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



<h2 class="wp-block-heading"><strong>Ideia por trás da FFT</strong></h2>



<p class="wp-block-paragraph">A FFT mais conhecida é o algoritmo de <strong>Cooley-Tukey</strong>, que se baseia em dividir o sinal original em duas partes:</p>



<ul class="wp-block-list">
<li>Amostras de índices pares: \(x_0, x_2, x_4, \ldots\)</li>



<li>Amostras de índices ímpares: \(x_1, x_3, x_5, \ldots\)</li>
</ul>



<p class="wp-block-paragraph">Essa divisão é aplicada recursivamente, até que reste apenas DFTs de tamanho 2, cuja solução é trivial.</p>



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



<h2 class="wp-block-heading"><strong>Implementação em C da FFT (Radix-2, Recursiva)</strong></h2>



<p class="wp-block-paragraph">Abaixo temos uma implementação simples e didática da FFT recursiva. Vamos assumir que o número de amostras NN seja uma potência de 2.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="#include <stdio.h&gt;
#include <stdlib.h&gt;
#include <math.h&gt;

#define PI 3.141592653589793

typedef struct {
    double real;
    double imag;
} Complex;

void fft(Complex* x, int N) {
    if (N <= 1) return;

    // Divide: cria vetores para pares e ímpares
    Complex* even = (Complex*)malloc(N/2 * sizeof(Complex));
    Complex* odd  = (Complex*)malloc(N/2 * sizeof(Complex));

    for (int i = 0; i < N/2; i++) {
        even[i] = x[2*i];
        odd[i]  = x[2*i + 1];
    }

    // Conquista: aplica FFT recursivamente
    fft(even, N/2);
    fft(odd, N/2);

    // Combina: calcula FFT final com os pares e ímpares
    for (int k = 0; k < N/2; k++) {
        double angle = -2 * PI * k / N;
        Complex twiddle = {cos(angle), sin(angle)};
        Complex t = {
            twiddle.real * odd[k].real - twiddle.imag * odd[k].imag,
            twiddle.real * odd[k].imag + twiddle.imag * odd[k].real
        };
        x[k].real       = even[k].real + t.real;
        x[k].imag       = even[k].imag + t.imag;
        x[k + N/2].real = even[k].real - t.real;
        x[k + N/2].imag = even[k].imag - t.imag;
    }

    free(even);
    free(odd);
}

int main() {
    int N = 8;

    // Sinal de entrada (parte imaginária zero)
    Complex x[8] = {
        {1,0}, {0,0}, {-1,0}, {0,0},
        {1,0}, {0,0}, {-1,0}, {0,0}
    };

    fft(x, N);

    printf(&quot;FFT Result:\n&quot;);
    for (int i = 0; i < N; i++) {
        printf(&quot;X[%d] = %.2f + %.2fi\n&quot;, i, x[i].real, x[i].imag);
    }

    return 0;
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">#include &lt;stdio.h&gt;</span></span>
<span class="line"><span style="color: #616E88">#include &lt;stdlib.h&gt;</span></span>
<span class="line"><span style="color: #616E88">#include &lt;math.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">#define PI 3.141592653589793</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">real</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">imag</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">} Complex;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">fft</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">Complex*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">N</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">return;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Divide:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">cria</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">vetores</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">para</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">pares</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">e</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ímpares</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">Complex*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">even</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> (Complex*)malloc</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">N/2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">sizeof</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">Complex</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">Complex*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">odd</span><span style="color: #D8DEE9FF">  </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> (Complex*)malloc</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">N/2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">sizeof</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">Complex</span><span style="color: #ECEFF4">))</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: #ECEFF4">(</span><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</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: #88C0D0">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N/2</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">i++</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">even[i]</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x[</span><span style="color: #B48EAD">2</span><span style="color: #81A1C1">*</span><span style="color: #A3BE8C">i]</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">odd[i]</span><span style="color: #D8DEE9FF">  </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x[</span><span style="color: #B48EAD">2</span><span style="color: #81A1C1">*</span><span style="color: #A3BE8C">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C">]</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: #D8DEE9FF">    </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Conquista:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">aplica</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">FFT</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">recursivamente</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">fft(even,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N/2</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">fft(odd,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N/2</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">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Combina:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">calcula</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">FFT</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">final</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">com</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">os</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">pares</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">e</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ímpares</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">k</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</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: #88C0D0">k</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N/2</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">k++</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">angle</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">PI</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">k</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">Complex</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">twiddle</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{cos</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">angle</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">sin</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">angle</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">Complex</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">t</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">twiddle.real</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">odd[k].real</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">twiddle.imag</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">odd[k].imag,</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">twiddle.real</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">odd[k].imag</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">twiddle.imag</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">odd[k].real</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">x[k].real</span><span style="color: #D8DEE9FF">       </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">even[k].real</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">t.real</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">x[k].imag</span><span style="color: #D8DEE9FF">       </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">even[k].imag</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">t.imag</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">x[k</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N/2].real</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">even[k].real</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">t.real</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">x[k</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N/2].imag</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">even[k].imag</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">t.imag</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">free(even</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">free(odd</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">main</span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Sinal</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">de</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">entrada</span><span style="color: #D8DEE9FF"> (parte </span><span style="color: #A3BE8C">imaginária</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">zero</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">Complex</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x[</span><span style="color: #B48EAD">8</span><span style="color: #A3BE8C">]</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">{</span><span style="color: #88C0D0">1,0},</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,0},</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #B48EAD">-1</span><span style="color: #A3BE8C">,0},</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,0},</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">{</span><span style="color: #88C0D0">1,0},</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,0},</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #B48EAD">-1</span><span style="color: #A3BE8C">,0},</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,0}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">fft(x,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">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: #88C0D0">&quot;FFT Result:\n&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</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: #88C0D0">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">i++</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">&quot;X[%d] = %.2f + %.2fi\n&quot;</span><span style="color: #88C0D0">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">i,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x[i].real,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x[i].imag</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>
<span class="line"><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 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"><strong>Comparando FFT e DFT</strong></h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Característica</th><th>DFT</th><th>FFT</th></tr></thead><tbody><tr><td>Complexidade</td><td>\(O(N^2)\)</td><td>\(O(N \log_2 N)\)</td></tr><tr><td>Requisitos</td><td>Nenhum</td><td>NN deve ser potência de 2</td></tr><tr><td>Código</td><td>Simples, direto</td><td>Recursivo, mais eficiente</td></tr><tr><td>Uso prático</td><td>Pequenos sinais</td><td>Sinais grandes (áudio, imagem, etc.)</td></tr></tbody></table></figure>



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



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



<h2 class="wp-block-heading"><strong>Aplicando a FFT a Sinais Reais de Sensores ou Áudio</strong></h2>



<h3 class="wp-block-heading"><strong>Captura e amostragem de sinais reais</strong></h3>



<p class="wp-block-paragraph">Sensores — como acelerômetros, termistores ou microfones — produzem sinais analógicos contínuos no tempo. Para aplicar a FFT, é necessário amostrar esses sinais com um conversor analógico-digital (ADC), obtendo um vetor de amostras igualmente espaçadas no tempo.</p>



<p class="wp-block-paragraph">Esse processo gera um vetor \(x[n]\) com N amostras igualmente espaçadas por um intervalo de tempo \(T_s\), definido pela taxa de amostragem \(f_s: T_s = \frac{1}{f_s}\)</p>



<p class="wp-block-paragraph">Por exemplo, uma taxa de 1000 Hz implica em uma amostra a cada 1 ms.</p>



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



<h3 class="wp-block-heading"><strong>Pré-processamento</strong></h3>



<p class="wp-block-paragraph">Antes de aplicar a FFT em um sinal real, recomenda-se:</p>



<ol class="wp-block-list">
<li><strong>Remover a média (DC)</strong>: \(x[n] := x[n] &#8211; \frac{1}{N} \sum_{i=0}^{N-1} x[i]\) Isso evita picos indesejados na frequência zero (DC offset).</li>



<li><strong>Aplicar janela (windowing)</strong>: Sinais reais nem sempre são periódicos no intervalo analisado. O uso de uma janela como a de Hanning, Hamming ou Blackman suaviza as bordas do sinal e reduz o vazamento espectral (aliasing).</li>
</ol>



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



<h3 class="wp-block-heading"><strong>Exemplo prático com FFT</strong></h3>



<p class="wp-block-paragraph">A seguir, adaptamos nosso código para aplicar FFT a um sinal real simulado — representando, por exemplo, a vibração medida por um acelerômetro.</p>



<h4 class="wp-block-heading"><strong>Sinal de teste</strong>:</h4>



<p class="wp-block-paragraph">Simularemos um sinal real com duas senóides: uma de 50 Hz e outra de 120 Hz, amostradas a 1000 Hz: </p>



<p class="wp-block-paragraph">\[<br>x[n] = \sin(2\pi 50 n T_s) + 0.5 \cdot \sin(2\pi 120 n T_s)<br>\]



<h4 class="wp-block-heading"><strong>Código em C:</strong></h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="#include <stdio.h&gt;
#include <stdlib.h&gt;
#include <math.h&gt;

#define PI 3.141592653589793
#define FS 1000  // taxa de amostragem (Hz)
#define N 1024   // número de amostras (potência de 2)

typedef struct {
    double real;
    double imag;
} Complex;

// Mesma função FFT da seção anterior (recursiva)
void fft(Complex* x, int N);

// Gera um sinal real composto por duas senóides
void gerar_sinal(Complex* x) {
    for (int n = 0; n < N; n++) {
        double t = (double)n / FS;
        double s = sin(2 * PI * 50 * t) + 0.5 * sin(2 * PI * 120 * t);
        x[n].real = s;
        x[n].imag = 0;
    }
}

// Calcula módulo da FFT
double modulo(Complex c) {
    return sqrt(c.real * c.real + c.imag * c.imag);
}

int main() {
    Complex x[N];
    gerar_sinal(x);

    fft(x, N);

    printf(&quot;Frequência (Hz)\tMagnitude\n&quot;);
    for (int i = 0; i < N/2; i++) {
        double freq = (double)i * FS / N;
        double mag = modulo(x[i]) * 2.0 / N; // normaliza e dobra por ser simétrica
        printf(&quot;%.1f\t\t%.4f\n&quot;, freq, mag);
    }

    return 0;
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">#include &lt;stdio.h&gt;</span></span>
<span class="line"><span style="color: #616E88">#include &lt;stdlib.h&gt;</span></span>
<span class="line"><span style="color: #616E88">#include &lt;math.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">#define PI 3.141592653589793</span></span>
<span class="line"><span style="color: #616E88">#define FS 1000  // taxa de amostragem (Hz)</span></span>
<span class="line"><span style="color: #616E88">#define N 1024   // número de amostras (potência de 2)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">real</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">imag</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">} Complex;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Mesma</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">função</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">FFT</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">da</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">seção</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">anterior</span><span style="color: #D8DEE9FF"> (recursiva)</span></span>
<span class="line"><span style="color: #88C0D0">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">fft</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">Complex*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Gera</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">um</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">sinal</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">real</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">composto</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">por</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">duas</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">senóides</span></span>
<span class="line"><span style="color: #88C0D0">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">gerar_sinal</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">Complex*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</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: #88C0D0">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">n++</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">t</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> (double)n / FS</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">s</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">sin</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">PI</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">50</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">t</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.5</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">sin</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">PI</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">120</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">t</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">x[n].real</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">s</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">x[n].imag</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</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: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Calcula</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">módulo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">da</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">FFT</span></span>
<span class="line"><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">modulo</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">Complex</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">c</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">sqrt</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">c.real</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">c.real</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">c.imag</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">c.imag</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">main</span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">Complex</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x[N]</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">gerar_sinal(x</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">fft(x,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">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: #88C0D0">&quot;Frequência (Hz)\tMagnitude\n&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</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: #88C0D0">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N/2</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">i++</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">freq</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> (double)i </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> FS / N</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mag</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">modulo</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">x[i]</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2.0</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">normaliza</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">e</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">dobra</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">por</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ser</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">simétrica</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">&quot;%.1f\t\t%.4f\n&quot;</span><span style="color: #88C0D0">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">freq,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mag</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>
<span class="line"><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 style="color: #D8DEE9FF">}</span></span>
<span class="line"></span></code></pre></div>



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



<h3 class="wp-block-heading"><strong>Interpretando o resultado</strong></h3>



<ul class="wp-block-list">
<li>O vetor FFT possui NN valores complexos.</li>



<li>Para sinais reais, os valores são simétricos: basta analisar os primeiros N/2 pontos.</li>



<li>Cada índice ii corresponde a uma frequência:\(f_i = \frac{i \cdot f_s}{N}\)</li>



<li>A magnitude |X[i]| representa a “força” (amplitude) do sinal naquela frequência.</li>



<li>Os picos na magnitude indicam quais frequências dominam o sinal.</li>
</ul>



<h4 class="wp-block-heading"><strong>Saída esperada (parcial):</strong></h4>



<pre class="wp-block-code"><code>Frequência (Hz)	Magnitude
...
50.0		    1.0000
...
120.0		    0.5000
...
</code></pre>



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



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



<h2 class="wp-block-heading"><strong>A Transformada Inversa de Fourier (iFFT)</strong></h2>



<h3 class="wp-block-heading"><strong>O que é a iFFT?</strong></h3>



<p class="wp-block-paragraph">A Transformada Inversa de Fourier, ou <strong>iFFT</strong>, permite reconstruir um sinal no tempo a partir de suas componentes de frequência.</p>



<p class="wp-block-paragraph">Ela é definida como: x[n]=1N∑k=0N−1X[k]⋅ej2πNknx[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] \cdot e^{j \frac{2\pi}{N}kn}</p>



<p class="wp-block-paragraph">Ou seja, usamos os mesmos valores complexos X[k]X[k] da FFT e, com uma fórmula semelhante, obtemos novamente as amostras originais do sinal.</p>



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



<h3 class="wp-block-heading"><strong>Quando a iFFT é usada?</strong></h3>



<ul class="wp-block-list">
<li>Após aplicar filtros no domínio da frequência.</li>



<li>Na decodificação de sinais comprimidos (ex: MP3, JPEG).</li>



<li>Para criar sons ou sinais com componentes espectrais específicas.</li>



<li>Para análise de sistemas (ex: resposta impulsiva via FFT/iFFT).</li>
</ul>



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



<h3 class="wp-block-heading"><strong>Implementação em C da iFFT</strong></h3>



<p class="wp-block-paragraph">A iFFT é quase idêntica à FFT — a diferença está no sinal do expoente (usa +j+j ao invés de −j-j) e na normalização final por NN.</p>



<h4 class="wp-block-heading"><strong>Código: iFFT em C</strong></h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="#include <stdio.h&gt;
#include <stdlib.h&gt;
#include <math.h&gt;

#define PI 3.141592653589793
#define N 8

typedef struct {
    double real;
    double imag;
} Complex;

// Função auxiliar para inverter os sinais do imaginário
void conjugar(Complex* x, int N) {
    for (int i = 0; i < N; i++)
        x[i].imag = -x[i].imag;
}

// Reaproveitamos a mesma FFT, trocando o sinal antes e depois
void fft(Complex* x, int N);  // Assume-se definida (como antes)

// iFFT com normalização
void ifft(Complex* x, int N) {
    // Conjuga
    conjugar(x, N);

    // Aplica FFT &quot;espelhada&quot;
    fft(x, N);

    // Conjuga novamente e divide por N
    conjugar(x, N);
    for (int i = 0; i < N; i++) {
        x[i].real /= N;
        x[i].imag /= N;
    }
}

int main() {
    Complex X[N] = {
        {0,0}, {4,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}
    };

    ifft(X, N);

    printf(&quot;Sinal reconstruído:\n&quot;);
    for (int i = 0; i < N; i++) {
        printf(&quot;x[%d] = %.4f\n&quot;, i, X[i].real);  // ignorando parte imaginária residual
    }

    return 0;
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">#include &lt;stdio.h&gt;</span></span>
<span class="line"><span style="color: #616E88">#include &lt;stdlib.h&gt;</span></span>
<span class="line"><span style="color: #616E88">#include &lt;math.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">#define PI 3.141592653589793</span></span>
<span class="line"><span style="color: #616E88">#define N 8</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">real</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">imag</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">} Complex;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Função</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">auxiliar</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">para</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">inverter</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">os</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">sinais</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">do</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">imaginário</span></span>
<span class="line"><span style="color: #88C0D0">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">conjugar</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">Complex*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</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: #88C0D0">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">i++</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">x[i].imag</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-x</span><span style="color: #ECEFF4">[</span><span style="color: #A3BE8C">i</span><span style="color: #ECEFF4">]</span><span style="color: #A3BE8C">.imag</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Reaproveitamos</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">a</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mesma</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">FFT,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">trocando</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">o</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">sinal</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">antes</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">e</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">depois</span></span>
<span class="line"><span style="color: #88C0D0">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">fft</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">Complex*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Assume-se</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">definida</span><span style="color: #D8DEE9FF"> (como </span><span style="color: #A3BE8C">antes</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">iFFT</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">com</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">normalização</span></span>
<span class="line"><span style="color: #88C0D0">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ifft</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">Complex*</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Conjuga</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">conjugar(x,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">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">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Aplica</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">FFT</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">espelhada</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">fft(x,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">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">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Conjuga</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">novamente</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">e</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">divide</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">por</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">conjugar(x,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</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: #88C0D0">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">i++</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">x[i].real</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">x[i].imag</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">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>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">main</span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">Complex</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">X[N]</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">{</span><span style="color: #88C0D0">0,0},</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #B48EAD">4</span><span style="color: #A3BE8C">,0},</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,0},</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,0},</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,0},</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,0},</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,0},</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,0}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ifft(X,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">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: #88C0D0">&quot;Sinal reconstruído:\n&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</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: #88C0D0">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">i++</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">&quot;x[%d] = %.4f\n&quot;</span><span style="color: #88C0D0">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">i,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">X[i].real</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ignorando</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">parte</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">imaginária</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">residual</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: #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 style="color: #D8DEE9FF">}</span></span>
<span class="line"></span></code></pre></div>



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



<h3 class="wp-block-heading"><strong>Sobre a parte imaginária</strong></h3>



<p class="wp-block-paragraph">A parte imaginária <strong>após a iFFT de um sinal real</strong> deve ser próxima de zero (por erro numérico). Em aplicações práticas, ela é ignorada ou descartada:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="double x_real = X[i].real; // Parte útil
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">double</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x_real</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">X[i].real</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Parte</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">útil</span></span>
<span class="line"></span></code></pre></div>



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



<h3 class="wp-block-heading"><strong>Validação: FFT + iFFT</strong></h3>



<p class="wp-block-paragraph">Um teste típico para validar seu código de FFT/iFFT é:</p>



<ol class="wp-block-list">
<li>Criar um sinal x[n].</li>



<li>Aplicar FFT para obter X[k].</li>



<li>Aplicar iFFT em X[k].</li>



<li>Comparar os valores de x[n] com os reconstruídos.</li>
</ol>



<p class="wp-block-paragraph">Se os valores coincidirem (até erros mínimos), seu sistema está funcionando corretamente.</p>



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



<h3 class="wp-block-heading"><strong>Aplicações avançadas</strong></h3>



<ul class="wp-block-list">
<li><strong>Equalização de áudio</strong>: ajustar frequências específicas e depois aplicar iFFT.</li>



<li><strong>Cancelamento de ruído</strong>: eliminar certas frequências antes da iFFT.</li>



<li><strong>Compressão</strong>: manter só os coeficientes mais relevantes (ex: JPEG).</li>



<li><strong>Síntese sonora</strong>: construir sons pela manipulação direta do espectro.</li>
</ul>



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



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



<h2 class="wp-block-heading"><strong>11. Conclusão</strong></h2>



<p class="wp-block-paragraph">A Transformada de Fourier é uma ferramenta indispensável para engenheiros, programadores e cientistas que trabalham com sinais, vibrações, sons, imagens ou qualquer fenômeno periódico ou oscilatório. Ela permite revelar o conteúdo de frequência de um sinal, detectar padrões invisíveis no domínio do tempo e aplicar uma vasta gama de técnicas de processamento, filtragem e reconstrução.</p>



<p class="wp-block-paragraph">Neste artigo, vimos:</p>



<ul class="wp-block-list">
<li>A base teórica da Transformada de Fourier contínua e discreta;</li>



<li>A implementação direta da DFT em linguagem C;</li>



<li>A otimização via FFT (Fast Fourier Transform);</li>



<li>A aplicação prática da FFT em sinais reais de sensores ou áudio;</li>



<li>A reconstrução do sinal original usando a iFFT;</li>



<li>E a importância da interpretação correta dos resultados espectrais.</li>
</ul>



<p class="wp-block-paragraph">Tudo foi feito com um olhar didático e com exemplos práticos, prontos para adaptação em sistemas embarcados, análise de sinais em tempo real ou mesmo aplicações científicas mais robustas.</p>



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



<h3 class="wp-block-heading"><strong>Próximos passos sugeridos</strong></h3>



<p class="wp-block-paragraph">Caso queira aprofundar ainda mais o estudo e uso da Transformada de Fourier, recomenda-se explorar:</p>



<ul class="wp-block-list">
<li>Implementações de FFT otimizadas para microcontroladores (ex: CMSIS-DSP para ARM Cortex-M);</li>



<li>Visualização gráfica com Python/Matplotlib para depuração e análise;</li>



<li>Filtragem digital (passa-baixas, passa-altas, notch) no domínio da frequência;</li>



<li>Algoritmos FFT para sinais de tamanho não potência de 2 (Bluestein ou Mixed-Radix);</li>



<li>Uso de janelas (Hamming, Blackman, etc.) para melhorar a resolução espectral.</li>
</ul>



<p class="wp-block-paragraph">Se quiser, posso te ajudar a gerar qualquer um desses tópicos em novas seções ou aplicações.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/algoritimos/a-transformada-de-fourier-fundamentos-demonstracao-e-implementacao-em-c/">A Transformada de Fourier: Fundamentos, Demonstração e Implementação em C</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">212</post-id>	</item>
	</channel>
</rss>
