„Fourier transzformáció” változatai közötti eltérés

Innen: HamWiki
Ugrás a navigációhoz Ugrás a kereséshez
a (Javítva: e^(előjel) és az együttható transzformációnál (ld. unitary fourier transform az angol és a német wikipedián))
(elírás)
 
(6 közbenső módosítás ugyanattól a szerkesztőtől nincs mutatva)
50. sor: 50. sor:
 
<!-- Háreszigorlat, fincsi, mi? -->
 
<!-- Háreszigorlat, fincsi, mi? -->
  
== Diszkrét Fourier Transzformáció (DFT) ==
+
== DFT ==
  
Az előző részben ismertetett folytonos Fourier transzformáció szép, azonban a gyakorlatban, mivel diszkrét idejű jelekkel dolgozunk, a transzformációt is ennek megfelelően egyszerűsítjük. Az alábbi összefüggéssel tehát az elemi színuszos komponensek számíthatóak ki.
+
'''D'''iszkrét '''F'''ourier '''T'''ranszformáció: az előző részben ismertetett folytonos Fourier transzformáció szép, azonban a gyakorlatban, mivel diszkrét idejű jelekkel dolgozunk, a transzformációt is ennek megfelelően egyszerűsítjük. Az alábbi összefüggéssel tehát az elemi színuszos komponensek számíthatóak ki.
  
 
<math>X[k] = \sum_{n=0}^{N-1} x[n] \,e^{-j 2 \pi \frac{k}{N} n}</math>
 
<math>X[k] = \sum_{n=0}^{N-1} x[n] \,e^{-j 2 \pi \frac{k}{N} n}</math>
  
A jelet pedig visszaállíthatjuk az egyes színuszos oszcillátorok jeleinek összegeként:
+
;ahol:
 +
* N: a minta adatblokkjának elemszáma, amire a DFT-t el kívánjuk végezni.
 +
* k az egyik alkotó frekvenciával arányos konstans. Frekvenciában kifejezve: k = N * frekvencia/mintavételi_sebesség
 +
* e<sup>-j valami</sup> - rádióamatőrök között kevésbé közismert matematikai kifejezés a cos(valami) - j*sin(valami) kifejezésére, amely a [[komplex számok]] témaköre.
 +
* 2&pi; pedig azért szerepel itt, hiszen 2&pi; radián egy teljes kör.
 +
 
 +
 
 +
A spektrális felbontás számhalmazából a jelet visszaállíthatjuk az egyes színuszos oszcillátorok jeleinek összegeként:
  
 
<math>x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{j 2 \pi \frac{k}{N} n} \quad \quad n = 0, 1, \dots, N-1 \,</math>
 
<math>x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{j 2 \pi \frac{k}{N} n} \quad \quad n = 0, 1, \dots, N-1 \,</math>
  
== Fast Fourier Transformáció (FFT) ==
+
== FFT ==
  
A gyors Fourier transzformáció eredménye egyezik a fenti DFT eredményével, azonban a művelethez szükséges idő nem N<sup>2</sup>, hanem N*log(N), ami például egy 1024 pontos transzformációnál 300-szor gyorsabb számítást jelent.
+
A gyors Fourier transzformáció ('''F'''ast '''F'''ourier '''T'''ransform) eredménye egyezik a fenti DFT eredményével, azonban a művelethez szükséges számítási teljesítmény igénye sokkal kisebb. Azaz:
  
Az FFT egyetlen korlátja, hogy a pontszám nem lehet tetszőleges, például nem lehet 1000 pontos, csak 2 valamely hatványa lehet. Azonban az említett sebességnövekedés miatt ezt a kompromisszumot elfogadjuk.
+
* DFT esetén a számítás lépésszáma: N<sup>2</sup> * (t<sub>mul</sub> + t<sub>add</sub>)
 +
* FFT esetén ugyanez a számítás N*log<sub>2</sub>(N) * (t<sub>mul</sub>/2 + t<sub>add</sub>) lépésszámból teljesíthető.
 +
 
 +
ami például egy 1024 pontos transzformációnál nagyságrendileg század akkora processzorteljesítmény felhasználását teszi szükségessé.
 +
 
 +
Az FFT egyetlen korlátja, hogy a pontszám nem lehet tetszőleges, például nem lehet 1000 pontos, csak 2 valamely hatványa lehet RADIX-2 FFT esetén, illetve 3 valamely hatványa RADIX-3 FFT esetén. Azonban az említett sebességnövekedés miatt ezt a kompromisszumot elfogadjuk.
 +
 
 +
Kiegészítés: 1536 pontos FFT-t alkalmaznak az új mobiltelefon-rendszernél (3GPP LTE), ahol RADIX-3 trükkjével 3 darab 512 pontos FFT-re bontják a blokkot és ezeket dolgozzák fel RADIX-2 FFT-vel. Másik érdekesség, hogy további optimalizálhatóság miatt a RADIX-4 FFT is elterjedt, ahol csak 4 valamelyik hatványa lehet a feldolgozható blokk mérete.
 +
 
 +
Amennyiben csak kevés spektrumvonalra kell szétbontani, akkor a fennt említett DFT algoritmus sem rossz választás. Ilyen, kevés spektrumvonalat igénylő felbontás a [[DTMF]], ahol mindössze 8 spektrumvonal érdekel bennünket, illetve az [[AFSK]], ahol pedig csak kettő frekvencia energia-aránya érdekel bennünket.
  
 
== FFT megvalósítása ==
 
== FFT megvalósítása ==
  
FFT-t kétféleképpen csinálhatunk. Vagy letöltjük a http://www.fftw.org -ról az FFT függvénykönyvtárat, vagy saját magunk írunk egy FFT algoritmust.
+
FFT-t többféleképpen csinálhatunk. Vagy letöltjük a http://www.fftw.org -ról az FFT függvénykönyvtárat, vagy saját magunk írunk meg egy hatékony [http://en.wikipedia.org/wiki/Category:FFT_algorithms FFT algoritmust]. Python programnyelv esetén pedig a python-numpy csomag segíthet.
 +
 
 +
Az alábbiakban egy igen egyszerűen felhasználható FFT számító példa kerül ismertetésre. Ez a közvetlen felhasználhatóságán túl alkalmas arra is, hogy egy saját magunk által például [[mikrovezérlő]]re megírt FFT-algoritmus hibátlanságát ellenőrizzünk.
 +
 
 +
<source lang=python>
 +
#!/usr/bin/python
 +
# -*- coding: utf8 -*-
 +
 
 +
import numpy
 +
 
 +
def negyszogjel_generator(mintaszam):
 +
        m=[]
 +
        for i in range(mintaszam/2): m.append(1.0)
 +
        for i in range(mintaszam/2): m.append(-1.0)
 +
        return m
 +
 
 +
def spektrum_szamitas(minta):
 +
        f=numpy.fft.ifft(minta)
 +
        return f
 +
 
 +
def idobeli_jelre_vissza(f):
 +
        v=numpy.fft.fft(f)
 +
        return v
 +
 
 +
def kepernyore_ir(mit, szoveg):
 +
        print "=== %s ==="%(szoveg)
 +
        i=0
 +
        for s in mit:
 +
                print "%4d. elem: "%(i), s
 +
                i+=1
 +
        print
 +
 
 +
 
 +
if __name__ == "__main__":
 +
 
 +
        # külső A/D átalakítás helyett itt a példában gyártunk fiktív mintát
 +
        minta=negyszogjel_generator(64)
 +
        kepernyore_ir(minta, "negyszogjel")
 +
 
 +
        f=spektrum_szamitas(minta)
 +
        kepernyore_ir(f, "Spektrumbeli harmonikusok ( x*cos(wt)+y*sin(wt) ) ")
  
Az alábbiakban egy rádióamatőr célokra igen jól felhasználható FFT számító példa kerül ismertetésre.
+
        v=idobeli_jelre_vissza(f)
 +
        kepernyore_ir(v, "Ismet az idobeli jel - spektrumbol visszaszamitva")
 +
</source>
  
-- folyt köv --
+
== Egyéb, nem szinuszos komponensekkel végzett spektrális felbontások ==
  
 +
* [[Wavelet transzformáció]] - alapja nem a sin() és cos(), hanem az elemi négyszögjel.
  
 
[[Kategória:Digitális jelfeldolgozás]]
 
[[Kategória:Digitális jelfeldolgozás]]

A lap jelenlegi, 2010. június 26., 10:24-kori változata

Egy időben változó jel előállítható különböző freknvenciájú, fázisú és amplitúdójú jelek összegeként. A Fourier-transzformáció az a művelet, amely egy adott jelhez megadja ezt a felbontást. A Fourier-transzformáció inverze szolgál arra, hogy a frekvencia spektrumból (frekvenciatartomány) megadja az időfüggő jelet (időtartomány).

A Fourier-transzformáció ismerete alapvető fontosságú a lineáris rendszerek tulajdonságainak vizsgálatához. Mivel az áramkörök jelentős része frekvenciafüggő jelleget mutat, ezért a frekvenciatartománybeli viselkedés sokszor könnyebben leírható, mint az időtartománybeli.

A Fourier-transzformáció felhasználása

Egy fontos alkalmazás különféle transzformációk elvégezése a jelen.

Például: egy négyszögjelből lehet-e kis torzítású színuszjelet csinálni?

Igen. A négyszögjel Fourier-sora [math]f(t)=\frac{4}{\pi}\Big( \sin(\omega t)+\frac{1}{3}\sin(3\omega t)+\frac{1}{5}\sin(5\omega t)+\frac{1}{7}\sin(7\omega t)+\dots \Big)[/math]

Gnuplot Plot

A fenti Fourier sorból és a mellékelt ábrából látható, amennyiben beépítünk a jelútba egy olyan aluláteresztő szűrőt, amely a négyszögjel alapfrekvenciájának 3-szorosát már nem engedi át, akkor színuszjelet kapunk.

További érdekes alkalmazása a szűrések és kiemelések. Azaz például egy hangfrekvenciás jelből egy sípolást el szeretnénk nyomni, vagy pedig egy bizonyos frekvenciatartományt fel szeretnénk hangosítani.

Rádiófrekvenciás jel esetén a Fourier transzformáció legfontosabb alkalmazása az OFDM jel demodulálása során kerül előtérbe, ahol a sok vivőfrekvenciát nem sok digitális szűrővel választjuk szét, hanem egyetlen Fourier transzformációval.

Folytonos Fourier transzformáció

Egy jel Fourier transzformáltja az a jel, amin ha elvégezzük az alább látható inverz-Fourier transzformációt, visszakapjuk a jelet:

[math]f \left( t \right) = \frac{1}{\sqrt{2\pi}} \int\limits_{-\infty}^\infty F\left(j\omega\right) e^{j\omega t}\,d\omega[/math]

Tehát a Fourier transzformáció:

[math]F \left( j\omega \right) = \frac{1}{\sqrt{2\pi}} \int\limits_{-\infty}^\infty f\left( t \right) e^{-j\omega t}\,dt[/math]

Ha már ilyen szép integráloknál tartunk, fontos megemliteni, hogy ez csak akkor végezhető el, ha a jel abszolút vagy négyzetesen integrálható. Tehát véges az energiatartalma. Megjegyzés: nem véges energiatartalmú jeleknek is létezhet Fourier transzformáltja, de azt nem ezzel az integrállal kell előállitani.

A fenti összefüggésnél a [math]e^{j\omega t}=\cos(\omega t)+j \cdot \sin(\omega t)[/math], az [math]|F\left(j \omega\right)|[/math] az amplitudóspektrum, az [math]arc(F(j\omega))[/math] pedig a fázisspektrum.

A Fourier transzformált előállitására egy kellemesebb módszer azt egy táblázatból kikeresni. Ebben az angol nyelvű wikipedia egy cikke nagyon hasznos segitségnek bizonyult. Ugyanitt vannak táblázatba foglalva a Fourier transzformáció azonosságai.


DFT

Diszkrét Fourier Transzformáció: az előző részben ismertetett folytonos Fourier transzformáció szép, azonban a gyakorlatban, mivel diszkrét idejű jelekkel dolgozunk, a transzformációt is ennek megfelelően egyszerűsítjük. Az alábbi összefüggéssel tehát az elemi színuszos komponensek számíthatóak ki.

[math]X[k] = \sum_{n=0}^{N-1} x[n] \,e^{-j 2 \pi \frac{k}{N} n}[/math]

ahol
  • N: a minta adatblokkjának elemszáma, amire a DFT-t el kívánjuk végezni.
  • k az egyik alkotó frekvenciával arányos konstans. Frekvenciában kifejezve: k = N * frekvencia/mintavételi_sebesség
  • e-j valami - rádióamatőrök között kevésbé közismert matematikai kifejezés a cos(valami) - j*sin(valami) kifejezésére, amely a komplex számok témaköre.
  • 2π pedig azért szerepel itt, hiszen 2π radián egy teljes kör.


A spektrális felbontás számhalmazából a jelet visszaállíthatjuk az egyes színuszos oszcillátorok jeleinek összegeként:

[math]x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{j 2 \pi \frac{k}{N} n} \quad \quad n = 0, 1, \dots, N-1 \,[/math]

FFT

A gyors Fourier transzformáció (Fast Fourier Transform) eredménye egyezik a fenti DFT eredményével, azonban a művelethez szükséges számítási teljesítmény igénye sokkal kisebb. Azaz:

  • DFT esetén a számítás lépésszáma: N2 * (tmul + tadd)
  • FFT esetén ugyanez a számítás N*log2(N) * (tmul/2 + tadd) lépésszámból teljesíthető.

ami például egy 1024 pontos transzformációnál nagyságrendileg század akkora processzorteljesítmény felhasználását teszi szükségessé.

Az FFT egyetlen korlátja, hogy a pontszám nem lehet tetszőleges, például nem lehet 1000 pontos, csak 2 valamely hatványa lehet RADIX-2 FFT esetén, illetve 3 valamely hatványa RADIX-3 FFT esetén. Azonban az említett sebességnövekedés miatt ezt a kompromisszumot elfogadjuk.

Kiegészítés: 1536 pontos FFT-t alkalmaznak az új mobiltelefon-rendszernél (3GPP LTE), ahol RADIX-3 trükkjével 3 darab 512 pontos FFT-re bontják a blokkot és ezeket dolgozzák fel RADIX-2 FFT-vel. Másik érdekesség, hogy további optimalizálhatóság miatt a RADIX-4 FFT is elterjedt, ahol csak 4 valamelyik hatványa lehet a feldolgozható blokk mérete.

Amennyiben csak kevés spektrumvonalra kell szétbontani, akkor a fennt említett DFT algoritmus sem rossz választás. Ilyen, kevés spektrumvonalat igénylő felbontás a DTMF, ahol mindössze 8 spektrumvonal érdekel bennünket, illetve az AFSK, ahol pedig csak kettő frekvencia energia-aránya érdekel bennünket.

FFT megvalósítása

FFT-t többféleképpen csinálhatunk. Vagy letöltjük a http://www.fftw.org -ról az FFT függvénykönyvtárat, vagy saját magunk írunk meg egy hatékony FFT algoritmust. Python programnyelv esetén pedig a python-numpy csomag segíthet.

Az alábbiakban egy igen egyszerűen felhasználható FFT számító példa kerül ismertetésre. Ez a közvetlen felhasználhatóságán túl alkalmas arra is, hogy egy saját magunk által például mikrovezérlőre megírt FFT-algoritmus hibátlanságát ellenőrizzünk.

#!/usr/bin/python
# -*- coding: utf8 -*-

import numpy

def negyszogjel_generator(mintaszam):
        m=[]
        for i in range(mintaszam/2): m.append(1.0)
        for i in range(mintaszam/2): m.append(-1.0)
        return m

def spektrum_szamitas(minta):
        f=numpy.fft.ifft(minta)
        return f

def idobeli_jelre_vissza(f):
        v=numpy.fft.fft(f)
        return v

def kepernyore_ir(mit, szoveg):
        print "=== %s ==="%(szoveg)
        i=0
        for s in mit:
                print "%4d. elem: "%(i), s
                i+=1
        print


if __name__ == "__main__":

        # külső A/D átalakítás helyett itt a példában gyártunk fiktív mintát
        minta=negyszogjel_generator(64)
        kepernyore_ir(minta, "negyszogjel")

        f=spektrum_szamitas(minta)
        kepernyore_ir(f, "Spektrumbeli harmonikusok ( x*cos(wt)+y*sin(wt) ) ")

        v=idobeli_jelre_vissza(f)
        kepernyore_ir(v, "Ismet az idobeli jel - spektrumbol visszaszamitva")

Egyéb, nem szinuszos komponensekkel végzett spektrális felbontások