Faza 01 · lecția 20

Transformata Fourier

Scopul lecției: Orice semnal discret finit poate fi exprimat ca o sumă de sinusoide complexe. Transformata Fourier vă arată care sunt acestea.

Versiunea curentă AlexBred.com: primele 100 de lecții ale programului în limba română.

Curs
AI Engineering from Scratch
Fază
Fundamente matematice
Lectură
24 min.
Verificat
Cuprinsul lecției
  1. Obiective de învățare
  2. Problema
  3. Conceptul
  4. Definiția DFT
  5. Ce înseamnă fiecare coeficient
  6. DFT inversă
  7. FFT: cum o facem rapidă
  8. Analiza spectrală
  9. Rezoluția în frecvență
  10. Teorema convoluției
  11. Aplicarea ferestrelor
  12. Proprietățile DFT
  13. Legătura cu codificările poziționale
  14. Legătura cu CNN-urile
  15. Spectrograme și transformata Fourier pe termen scurt
  16. Aliasing
  17. Completarea cu zerouri nu mărește rezoluția
  18. Construiți soluția
  19. Pasul 1: DFT de la zero
  20. Pasul 2: DFT inversă
  21. Pasul 3: FFT Cooley–Tukey
  22. Pasul 4: funcții auxiliare pentru analiza spectrală
  23. Folosiți soluția
  24. Livrați rezultatul
  25. Exerciții
  26. Termeni-cheie
  27. Lecturi suplimentare

Orice semnal discret finit poate fi exprimat ca o sumă de sinusoide complexe. Transformata Fourier vă arată care sunt acestea.

Tip: Construire Limbaj: Python Cerințe preliminare: Faza 1, lecțiile 01–04 și 19 (numere complexe) Durată: ~90 de minute

Obiective de învățare

  • Implementați DFT de la zero și verificați-o față de FFT Cooley–Tukey cu complexitate O(N log N)
  • Interpretați coeficienții de frecvență: extrageți amplitudinea, faza și spectrul de putere al unui semnal
  • Aplicați teorema convoluției pentru a efectua convoluția prin înmulțire după FFT
  • Legați descompunerea Fourier în frecvențe de codificările poziționale Transformer și de straturile convoluționale ale CNN-urilor

Problema

O înregistrare audio este o secvență de măsurători ale presiunii în timp. Prețul unei acțiuni este o secvență de valori de-a lungul zilelor. O imagine este o grilă de intensități ale pixelilor în spațiu. Toate acestea sunt date în domeniul timpului sau al spațiului: vedeți valori care se modifică de-a lungul unui indice.

Multe tipare sunt însă invizibile în domeniul timpului. Semnalul audio este un ton pur sau un acord? Prețul acțiunii are un ciclu săptămânal? Imaginea conține o textură repetitivă? Aceste întrebări privesc conținutul în frecvență, pe care domeniul timpului îl ascunde.

Transformata Fourier convertește datele din domeniul timpului în domeniul frecvenței. Ea descompune un semnal în sinusoide de frecvențe diferite. Fiecare sinusoidă are o amplitudine, care arată intensitatea sa, și o fază, care arată decalajul său. Transformata Fourier furnizează informații despre ambele, după aplicarea convenției de normalizare potrivite.

Acest lucru contează în învățarea automată deoarece perspectiva domeniului frecvenței apare peste tot. Rețelele neuronale convoluționale efectuează convoluții, care corespund înmulțirii în domeniul frecvenței. Codificările poziționale Transformer folosesc sinusoide de frecvențe diferite pentru a reprezenta poziția. Modelele audio pentru recunoașterea vorbirii și generarea muzicii operează adesea pe spectrograme, adică reprezentări în frecvență ale sunetului. Modelele pentru serii temporale caută tipare periodice. Înțelegerea transformatei Fourier vă oferă vocabularul necesar pentru toate aceste aplicații.

Conceptul

Definiția DFT

Pentru N eșantioane x[0], x[1], ..., x[N-1], transformata Fourier discretă produce N coeficienți de frecvență X[0], X[1], ..., X[N-1]:

X[k] = sum_{n=0}^{N-1} x[n] * e^(-2*pi*i*k*n/N)

pentru k = 0, 1, ..., N-1

Fiecare X[k] este un număr complex. Modulul |X[k]| măsoară intensitatea componentei din bin-ul k, iar unghiul angle(X[k]) reprezintă faza acelei componente. Conversia modulului într-o amplitudine fizică depinde de normalizarea DFT, de lungimea semnalului și de folosirea unui spectru cu una sau două laturi.

Notă tehnică a traducerii: Originalul identifică direct |X[k]| cu amplitudinea frecvenței k. Pentru convenția DFT nenormalizată din lecție, amplitudinea unei sinusoide reale aflate exact într-un bin este de regulă 2|X[k]|/N într-un spectru unilateral, cu tratament separat pentru DC și Nyquist. Ferestrele și alte convenții de scalare modifică factorul.

Ideea centrală: e^(-2*pi*i*k*n/N) este un fazor rotitor asociat frecvenței k. DFT calculează produsul scalar complex dintre semnal și fiecare dintre cele N frecvențe discrete. Dacă semnalul conține energie în bin-ul k, coeficientul are modul mare. În caz contrar, este aproape de zero.

Ce înseamnă fiecare coeficient

X[0]: componenta DC. Este suma tuturor eșantioanelor, deci este proporțională cu media. Reprezintă deplasarea constantă, de frecvență zero, a semnalului.

X[0] = sum_{n=0}^{N-1} x[n] * e^0 = suma tuturor eșantioanelor

X[k] pentru frecvențele pozitive. Indicele k corespunde frecvenței k cicluri la N eșantioane, adică k fs/N Hz la rata de eșantionare fs. Un k mai mare în jumătatea pozitivă înseamnă o frecvență mai mare.

X[N/2]: bin-ul Nyquist pentru N par. Acesta reprezintă frecvența Nyquist, fs/2, care este simultan capătul pozitiv și cel negativ al reprezentării discrete. Componentele analogice deasupra lui fs/2 se repliază prin aliasing în banda reprezentabilă.

Coeficienții frecvențelor negative. Pentru semnale reale, X[N-k] = conj(X[k]). Frecvențele negative sunt imaginile conjugate ale celor pozitive. De aceea, informația independentă se află în primii floor(N/2) + 1 coeficienți, incluzând DC și, numai pentru N par, bin-ul Nyquist.

Notă tehnică a traducerii: Intervalele originale 1 <= k <= N/2, X[N/2] și N/2 < k < N sunt corecte literal numai când N este par. Pentru N impar nu există un eșantion exact la frecvența Nyquist, iar cel mai mare bin pozitiv este (N-1)/2.

DFT inversă

DFT inversă reconstruiește semnalul original din coeficienții săi de frecvență:

x[n] = (1/N) * sum_{k=0}^{N-1} X[k] * e^(2*pi*i*k*n/N)

pentru n = 0, 1, ..., N-1

Față de DFT directă, semnul exponentului este pozitiv, nu negativ, și apare factorul de normalizare 1/N.

În aritmetică exactă, DFT inversă reconstruiește perfect semnalul și nu pierde informație. DFT este o schimbare de bază care exprimă aceeași informație într-un alt sistem de coordonate. Într-o implementare în virgulă mobilă, revenirea introduce erori mici de rotunjire.

Notă tehnică a traducerii: Originalul promite revenirea „fără nicio eroare”. Aceasta este proprietatea matematică a transformatei exacte; implementările numerice recuperează semnalul numai până la precizia aritmeticii și a algoritmului folosit.

FFT: cum o facem rapidă

DFT definită mai sus are complexitatea O(N^2): pentru fiecare dintre cei N coeficienți de ieșire, însumați peste N eșantioane. Pentru N = 1 milion, aceasta înseamnă ordinul a 10^12 operații.

Transformata Fourier rapidă (FFT) calculează același rezultat în O(N log N). Pentru N = 1 milion, ordinul de mărime este de aproximativ 20 de milioane de operații, în loc de un trilion. Această reducere face practică analiza în frecvență.

Algoritmul Cooley–Tukey în forma radix-2, cea mai simplă variantă recursivă, folosește divide et impera:

  1. Împarte semnalul în eșantioane cu indici pari și impari.
  2. Calculează recursiv DFT pentru fiecare jumătate.
  3. Combină cele două transformate de jumătate de dimensiune folosind factorii de rotație (twiddle factors) e^(-2*pi*i*k/N).
X[k] = E[k] + e^(-2*pi*i*k/N) * O[k]          pentru k = 0, ..., N/2 - 1
X[k + N/2] = E[k] - e^(-2*pi*i*k/N) * O[k]    pentru k = 0, ..., N/2 - 1

unde E = DFT a eșantioanelor cu indici pari
     O = DFT a eșantioanelor cu indici impari

Simetria face ca fiecare nivel al recursiei să necesite O(N) operații, iar numărul nivelurilor este log2(N) în cazul radix-2. Totalul este O(N log N).

Диаграмма к уроку «Transformata Fourier»

Notă tehnică a traducerii: Diagrama originală atribuie FFT-ului în 8 puncte 24 de înmulțiri. Pentru implementarea radix-2 prezentată, cele log2(8) = 3 niveluri au câte N/2 = 4 fluturi, deci efectuează 12 înmulțiri cu factori de rotație și 24 de adunări sau scăderi complexe. Diagrama tradusă explicitează această diferență de numărare.

Implementarea radix-2 prezentată în lecție este cea mai eficientă când lungimea semnalului este o putere a lui 2, iar semnalele sunt adesea completate cu zerouri până la o lungime rapidă potrivită.

Notă tehnică a traducerii: Originalul afirmă că FFT „necesită” o lungime putere a lui 2. Numai varianta radix-2 are această cerință. Cooley–Tukey acceptă lungimi compuse prin alte radixuri, iar bibliotecile moderne gestionează și lungimi prime prin algoritmi precum Bluestein sau Rader. Următoarea lungime rapidă nu este neapărat următoarea putere a lui 2.

Analiza spectrală

Spectrul de modul pătrat, numit adesea spectru de putere după scalarea corespunzătoare, este |X[k]|^2. El arată cum se distribuie energia între frecvențe în convenția aleasă.

Spectrul de fază este angle(X[k]), adică decalajul de fază al fiecărei frecvențe. În unele sarcini de detecție spectrală analiza se concentrează pe modul sau putere, dar faza este indispensabilă pentru reconstrucție și pentru informația temporală.

Putere la frecvența k:  P[k] = |X[k]|^2 = X[k].real^2 + X[k].imag^2
Fază la frecvența k:    phi[k] = atan2(X[k].imag, X[k].real)

Notă tehnică a traducerii: |X[k]|^2 este spectrul de modul pătrat brut. Pentru a obține putere, densitate spectrală de putere sau amplitudine cu unități fizice corecte trebuie precizate normalizarea, rata de eșantionare, fereastra și folosirea unui spectru unilateral ori bilateral.

Rezoluția în frecvență

Rezoluția în frecvență a DFT depinde de numărul de eșantioane N și de rata de eșantionare fs.

Frecvența bin-ului k:       f_k = k * fs / N
Rezoluția în frecvență:     delta_f = fs / N
Frecvența maximă:           f_max = fs / 2  (Nyquist)

Pentru a separa două frecvențe apropiate aveți nevoie de o durată de observare mai mare. Pentru a reprezenta fără aliasing componente de frecvență mai înaltă aveți nevoie de o rată de eșantionare mai mare și de filtrare anti-aliasing adecvată.

Teorema convoluției

Acesta este unul dintre cele mai importante rezultate din prelucrarea semnalelor și este direct relevant pentru CNN-uri.

Convoluția în domeniul timpului corespunde înmulțirii punct cu punct în domeniul frecvenței.

x * h = IFFT(FFT(x) . FFT(h))

unde * este convoluția, iar . este înmulțirea element cu element

De ce contează:

  • Convoluția directă a două semnale de lungimi N și M necesită O(N*M) operații.
  • Convoluția prin FFT necesită aproximativ O(L log L), unde L >= N + M - 1 este lungimea de completare.
  • Pentru nuclee mari, convoluția FFT poate fi mult mai rapidă.
  • Unele implementări ale straturilor convoluționale cu câmp receptiv mare exploatează exact această echivalență.

Observație: DFT calculează în mod natural convoluția circulară, în care semnalul revine la început. Pentru convoluție liniară, fără revenire, completați ambele semnale cu zerouri până la cel puțin lungimea N + M - 1 înaintea transformării.

Диаграмма к уроку «Transformata Fourier»

Aplicarea ferestrelor

DFT tratează cele N eșantioane ca pe o perioadă a unui semnal care se repetă la infinit. Dacă semnalul nu se potrivește la capetele intervalului, repetarea creează o discontinuitate la frontieră, care apare ca un conținut spectral răspândit. Fenomenul se numește scurgere spectrală.

Aplicarea unei ferestre reduce scurgerea prin atenuarea semnalului spre zero la capete înainte de calcularea DFT.

Ferestre uzuale:

Fereastră Formă Lățimea lobului principal Nivelul lobilor laterali Caz de utilizare
Dreptunghiulară Plată, fără fereastră Cea mai îngustă Cel mai ridicat (-13 dB) Semnal exact periodic în cele N eșantioane
Hann Cosinus ridicat Moderată Scăzut (-31 dB) Analiză spectrală generală
Hamming Cosinus modificat Moderată Mai scăzut (-42 dB) Prelucrare audio și analiza vorbirii
Blackman Cosinus triplu Largă Foarte scăzut (-58 dB) Când suprimarea lobilor laterali este critică
Fereastră Hann:    w[n] = 0.5 * (1 - cos(2*pi*n / (N-1)))
Fereastră Hamming: w[n] = 0.54 - 0.46 * cos(2*pi*n / (N-1))

Aplicați fereastra prin înmulțire element cu element înainte de DFT: X = DFT(x * w).

Proprietățile DFT

Proprietate Domeniul timpului Domeniul frecvenței
Liniaritate a*x + b*y a*X + b*Y
Deplasare circulară în timp x[n - k] X[f] * e^(-2*pi*i*f*k/N)
Deplasare circulară în frecvență x[n] * e^(2*pi*i*f0*n/N) X[f - f0]
Convoluție circulară x * h X * H, punct cu punct
Înmulțire punct cu punct x * h Convoluția circulară a lui X și H, scalată cu 1/N
Teorema lui Parseval sum |x[n]|^2 (1/N) * sum |X[k]|^2
Simetrie conjugată pentru intrare reală x[n] real X[k] = conj(X[N-k])

Notă tehnică a traducerii: Formulele de deplasare din tabelul original trebuie interpretate modulo N, adică drept deplasări circulare. De asemenea, în rândul despre înmulțire, operația din domeniul frecvenței este convoluție circulară, nu înmulțire; traducerea explicitează această distincție.

Teorema lui Parseval afirmă că energia totală este aceeași în ambele domenii după includerea factorului de normalizare al convenției. Transformata păstrează energia.

Legătura cu codificările poziționale

Arhitectura Transformer originală folosește codificări poziționale sinusoidale:

PE(pos, 2i)   = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))

Fiecare pereche de dimensiuni (2i, 2i+1) oscilează la o frecvență diferită. Frecvențele sunt distanțate geometric, de la cea mai înaltă în dimensiunile 0 și 1 până la cele joase din ultimele dimensiuni. Astfel, fiecare poziție primește un tipar pe mai multe benzi de frecvență, analog modului în care coeficienții Fourier descriu un semnal.

Proprietăți importante:

  • Distinctivitate matematică: pozițiile întregi distincte au codificări distincte în aritmetică exactă pentru formula dată; în practică, precizia finită și extrapolarea trebuie evaluate.
  • Valori mărginite: sin și cos se află întotdeauna în [-1, 1].
  • Poziție relativă: codificarea poziției p+k se poate exprima ca o transformare liniară dependentă de k a codificării poziției p. Modelul poate învăța relații între poziții relative.

Legătura cu CNN-urile

Un strat convoluțional aplică intrării un filtru învățat, numit nucleu, prin deplasarea lui de-a lungul semnalului sau imaginii. Matematic, aceasta este operația de convoluție sau, în multe API-uri de deep learning, corelația încrucișată echivalentă după inversarea nucleului.

Prin teorema convoluției, convoluția se poate calcula astfel:

  1. Aplicați FFT intrării.
  2. Aplicați FFT nucleului completat corespunzător.
  3. Înmulțiți în domeniul frecvenței.
  4. Aplicați IFFT rezultatului.

Implementările CNN standard folosesc adesea metode directe sau algoritmi specializați, mai rapizi pentru nuclee mici precum 3 × 3. Pentru nuclee mari sau convoluții globale, abordările bazate pe FFT pot fi considerabil mai rapide. Unele arhitecturi, precum FNet, înlocuiesc subnivelul de auto-atenție cu transformate Fourier și obțin în experimentele raportate o mare parte din acuratețea modelelor de referință, cu un mixer de tokeni de complexitate O(N log N) în locul atenției dense O(N^2).

Spectrograme și transformata Fourier pe termen scurt

O singură FFT oferă conținutul în frecvență al întregului semnal, dar nu arată când apar frecvențele. Un ciripit (chirp), a cărui frecvență crește în timp, și un acord, în care toate frecvențele apar simultan, pot avea același spectru de modul global.

Transformata Fourier pe termen scurt (STFT) rezolvă problema calculând FFT pe ferestre suprapuse ale semnalului. Rezultatul poate fi afișat ca o spectrogramă: o reprezentare 2D cu timpul pe o axă și frecvența pe cealaltă. Intensitatea fiecărui punct indică energia frecvenței la acel moment, conform scalării alese.

Procedura STFT:
1. Alegeți dimensiunea ferestrei (de exemplu, 1024 de eșantioane)
2. Alegeți pasul dintre ferestre (de exemplu, 256 de eșantioane — suprapunere de 75%)
3. Pentru fiecare poziție a ferestrei:
   a. Extrageți segmentul curent
   b. Aplicați o fereastră Hann sau Hamming
   c. Calculați FFT
   d. Stocați spectrul de modul drept o coloană a spectrogramei

Spectrogramele sunt o reprezentare de intrare standard pentru multe modele audio de învățare automată. Modelele de recunoaștere a vorbirii, precum Whisper și DeepSpeech, folosesc reprezentări spectrale; Whisper folosește log-spectrograme Mel, în care frecvențele sunt proiectate pe scara Mel, concepută să aproximeze mai bine rezoluția auditivă umană.

Notă tehnică a traducerii: Originalul afirmă că atât Whisper, cât și DeepSpeech operează pe spectrograme Mel. Whisper folosește log-spectrograme Mel, însă lucrarea Deep Speech din 2014 descrie spectrograme de putere și bănci de filtre logaritmice distanțate liniar și precizează că autorii nu au evaluat bănci de filtre logaritmice pe scara Mel.

Aliasing

Dacă un semnal conține frecvențe deasupra lui fs/2, eșantionarea la rata fs creează copii aliased în banda de bază. O sinusoidă de 90 Hz eșantionată la 100 Hz produce aceleași valori ca o sinusoidă de 10 Hz cu semn opus, echivalent cu un decalaj de fază de pi; un cosinus de 90 Hz produce aceleași valori ca unul de 10 Hz cu aceeași fază. Numai din eșantioane nu puteți stabili care componentă analogică le-a generat.

Exemplu:
  Semnal real: sinusoidă de 90 Hz
  Rată de eșantionare: 100 Hz
  Frecvență aparentă: 100 - 90 = 10 Hz

  Eșantioanele semnalului de 90 Hz la rata de eșantionare de 100 Hz
  coincid cu cele ale unei sinusoide de 10 Hz cu faza ajustată.
  Niciun calcul nu poate recupera frecvența originală de 90 Hz.

Notă tehnică a traducerii: Pentru eșantioane la momentele n/100, sin(2π·90·n/100) = -sin(2π·10·n/100), nu +sin(2π·10·n/100). Afirmația din bloc devine corectă dacă se permite ajustarea fazei sau dacă exemplul folosește cosinus.

Acesta este motivul pentru care convertoarele analog–digitale includ filtre anti-aliasing care elimină frecvențele deasupra benzii Nyquist înainte de eșantionare. În învățarea automată, aliasing-ul apare când hărțile de caracteristici sunt subeșantionate fără filtrare trece-jos adecvată; unele arhitecturi folosesc straturi de pooling cu anti-aliasing.

Completarea cu zerouri nu mărește rezoluția

O concepție greșită frecventă este că adăugarea zerourilor la semnal înainte de FFT îmbunătățește rezoluția în frecvență. Nu o face. Completarea cu zerouri eșantionează mai dens transformata în frecvență și interpolează vizual între bin-urile existente, oferind un spectru cu aspect mai neted. Nu poate dezvălui detalii de frecvență absente din durata observației originale.

Rezoluția reală depinde de durata de observare T = N / fs. Pentru a separa frecvențe la distanța delta_f, aveți nevoie, ca ordin de mărime, de cel puțin T = 1 / delta_f secunde de date, iar capacitatea efectivă de separare depinde și de fereastră și de raportul semnal–zgomot. Completarea cu zerouri nu schimbă această limită fundamentală.

fourier-synthesis

Construiți soluția

Pasul 1: DFT de la zero

DFT cu complexitate O(N^2) rezultă direct din definiție.

import math

class Complex:
    ...

def dft(x):
    N = len(x)
    result = []
    for k in range(N):
        total = Complex(0, 0)
        for n in range(N):
            angle = -2 * math.pi * k * n / N
            w = Complex(math.cos(angle), math.sin(angle))
            xn = x[n] if isinstance(x[n], Complex) else Complex(x[n])
            total = total + xn * w
        result.append(total)
    return result

Pasul 2: DFT inversă

Aceeași structură, exponent pozitiv și împărțire la N.

def idft(X):
    N = len(X)
    result = []
    for n in range(N):
        total = Complex(0, 0)
        for k in range(N):
            angle = 2 * math.pi * k * n / N
            w = Complex(math.cos(angle), math.sin(angle))
            total = total + X[k] * w
        result.append(Complex(total.real / N, total.imag / N))
    return result

Pasul 3: FFT Cooley–Tukey

FFT recursivă implementată aici este optimizată pentru lungimi puteri ale lui 2. Împărțiți în indici pari și impari, apelați recursiv și combinați rezultatele cu factori de rotație.

def fft(x):
    N = len(x)
    if N <= 1:
        return [x[0] if isinstance(x[0], Complex) else Complex(x[0])]
    if N % 2 != 0:
        return dft(x)

    even = fft([x[i] for i in range(0, N, 2)])
    odd = fft([x[i] for i in range(1, N, 2)])

    result = [Complex(0)] * N
    for k in range(N // 2):
        angle = -2 * math.pi * k / N
        twiddle = Complex(math.cos(angle), math.sin(angle))
        t = twiddle * odd[k]
        result[k] = even[k] + t
        result[k + N // 2] = even[k] - t
    return result

Notă tehnică a traducerii: Pentru o intrare goală, ramura N <= 1 încearcă să acceseze x[0] și ridică IndexError. Implementarea trebuie fie să interzică explicit N = 0, fie să returneze o listă goală înaintea acestei ramuri. Blocul executabil a fost păstrat exact.

Pasul 4: funcții auxiliare pentru analiza spectrală

def power_spectrum(X):
    return [xk.real ** 2 + xk.imag ** 2 for xk in X]

def convolve_fft(x, h):
    N = len(x) + len(h) - 1
    padded_N = 1
    while padded_N < N:
        padded_N *= 2

    x_padded = x + [0.0] * (padded_N - len(x))
    h_padded = h + [0.0] * (padded_N - len(h))

    X = fft(x_padded)
    H = fft(h_padded)

    Y = [xk * hk for xk, hk in zip(X, H)]

    y = idft(Y)
    return [y[n].real for n in range(N)]

Folosiți soluția

Pentru aplicații reale, folosiți FFT din NumPy, susținută de implementări native foarte optimizate.

import numpy as np

signal = np.sin(2 * np.pi * 5 * np.arange(256) / 256)
spectrum = np.fft.fft(signal)
freqs = np.fft.fftfreq(256, d=1/256)

power = np.abs(spectrum) ** 2

positive_freqs = freqs[:len(freqs)//2]
positive_power = power[:len(power)//2]

Pentru ferestre și analiză spectrală mai avansată:

from scipy.signal import windows, stft

window = windows.hann(256)
windowed = signal * window
spectrum = np.fft.fft(windowed)

Pentru convoluție:

from scipy.signal import fftconvolve

result = fftconvolve(signal, kernel, mode='full')

Pentru spectrograme:

from scipy.signal import stft

frequencies, times, Zxx = stft(signal, fs=sample_rate, nperseg=256)
spectrogram = np.abs(Zxx) ** 2

Matricea spectrogramei are forma (n_frequencies, n_time_frames). Fiecare coloană este spectrul de modul pătrat pentru o fereastră temporală. Aceasta este o formă de intrare folosită de modelele audio de învățare automată.

Livrați rezultatul

Rulați code/fourier.py pentru a genera outputs/prompt-spectral-analyzer.md.

Exerciții

  1. Identificarea unui ton pur. Creați un semnal cu o singură sinusoidă de frecvență necunoscută între 1 și 50 Hz, eșantionată la 128 Hz timp de 1 secundă. Folosiți DFT implementată de dumneavoastră pentru a identifica frecvența. Verificați răspunsul. Adăugați apoi zgomot gaussian cu abaterea standard 0,5 și repetați. Cum afectează zgomotul spectrul?

  2. Verificarea FFT față de DFT. Generați un semnal aleatoriu de lungime 64. Calculați atât DFT, cu O(N^2), cât și FFT. Verificați că toți coeficienții coincid cu toleranța 1e-10. Cronometrați funcțiile pentru semnale de lungimile 256, 512, 1024 și 2048. Reprezentați grafic raportul dintre timpul DFT și timpul FFT.

  3. Demonstrarea teoremei convoluției prin exemplu. Creați semnalul x = [1, 2, 3, 4, 0, 0, 0, 0] și filtrul h = [1, 1, 1, 0, 0, 0, 0, 0]. Calculați direct convoluția lor circulară prin bucle imbricate. Apoi calculați-o prin FFT: transformați, înmulțiți și aplicați inversa. Verificați că rezultatele coincid. Calculați apoi convoluția liniară prin completare adecvată cu zerouri.

  4. Efectele ferestrelor. Creați un semnal compus din două sinusoide la 10 Hz și 12 Hz, foarte apropiate. Eșantionați la 128 Hz timp de 1 secundă. Calculați spectrul de putere fără fereastră, cu fereastră Hann și cu fereastră Hamming. Cu ce variantă distingeți cel mai ușor cele două vârfuri în acest caz și de ce? Luați în calcul faptul că ambele frecvențe cad exact în bin-uri pentru durata de 1 secundă.

  5. Analiza codificării poziționale. Generați codificările poziționale sinusoidale pentru d_model = 128 și max_pos = 512. Pentru fiecare pereche de poziții (p1, p2), calculați produsul scalar al codificărilor. Arătați că el depinde numai de |p1 - p2|, nu de pozițiile absolute. Reprezentați produsul scalar în funcție de distanță și observați comportamentul său oscilatoriu, care nu este în general monoton.

Notă tehnică a traducerii: Întrebarea originală „ce se întâmplă pe măsură ce distanța crește?” poate sugera o scădere monotonă. Produsul scalar este o sumă de cosinusuri la frecvențe diferite și poate oscila; formula sinusoidală nu garantează o descreștere monotonă cu distanța.

Termeni-cheie

Termen Ce înseamnă
DFT (transformata Fourier discretă) Convertește N eșantioane din domeniul timpului în N coeficienți din domeniul frecvenței. Fiecare coeficient este produsul scalar cu o sinusoidă complexă la frecvența respectivă
FFT (transformata Fourier rapidă) Familie de algoritmi cu complexitate tipică O(N log N) pentru calcularea DFT. Varianta Cooley–Tukey radix-2 împarte recursiv indicii pari și impari
DFT inversă Reconstruiește semnalul din domeniul timpului pe baza coeficienților de frecvență. Folosește formula DFT cu semnul exponentului inversat și scalarea 1/N în convenția lecției
Bin de frecvență Fiecare indice k al ieșirii DFT reprezintă frecvența k*fs/N Hz înaintea interpretării indicilor frecvențelor negative. Bin-ul este poziția discretă de frecvență
Componentă DC X[0], coeficientul de frecvență zero. Este proporțional cu media semnalului
Frecvență Nyquist fs/2, limita benzii reprezentabile unic la rata de eșantionare fs. Componentele deasupra ei produc aliasing în lipsa filtrării
Spectru de putere O versiune scalată a lui |X[k]|^2, modulul pătrat al coeficienților. Arată distribuția energiei sau puterii între frecvențe conform convenției
Spectru de fază angle(X[k]), decalajul de fază al fiecărei componente de frecvență. Este esențial pentru reconstrucție, chiar dacă unele analize folosesc numai modulul
Scurgere spectrală Răspândire aparentă a conținutului în frecvență cauzată de tratarea unei porțiuni neperiodice drept perioadă. Se reduce prin aplicarea ferestrelor
Funcție fereastră Funcție de atenuare, precum Hann, Hamming sau Blackman, aplicată înainte de DFT pentru reducerea scurgerii spectrale
Factor de rotație Exponențiala complexă e^(-2*pi*i*k/N) folosită la combinarea subtransformatelor DFT în calculul fluture al FFT
Teorema convoluției Convoluția în domeniul timpului corespunde înmulțirii punct cu punct în domeniul frecvenței. Este fundamentală în prelucrarea semnalelor și relevantă pentru CNN-uri
Convoluție circulară Convoluție în care semnalul revine circular la început. Este forma calculată natural de DFT
Convoluție liniară Convoluția standard fără revenire circulară. Se obține prin completare cu zerouri înainte de DFT
Teorema lui Parseval Energia totală se păstrează prin transformata Fourier: sum |x[n]|^2 = (1/N) sum |X[k]|^2 în convenția lecției
Aliasing Fenomenul prin care frecvențele din afara benzii Nyquist apar la alte frecvențe din cauza unei rate de eșantionare insuficiente

Lecturi suplimentare


Sursă: The Fourier Transform — original

Navigare: înapoi: 01.19 — Numere complexe pentru inteligența artificială · Faza 1 — Fundamente matematice · Catalog complet · în continuare: 01.21 — Teoria grafurilor pentru învățarea automată.