„Fourier transzformáció” változatai közötti eltérés
(elírás) |
|||
| (17 közbenső módosítás, amit 4 másik szerkesztő végzett, nincs mutatva) | |||
| 1. sor: | 1. sor: | ||
| + | Egy időben változó [[A jel matematikai leírása|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 == | == 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? | '''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( | + | 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> | <gnuplot> | ||
| 11. sor: | 15. sor: | ||
set size 1.2, 0.4 | set size 1.2, 0.4 | ||
set yrange [-1.5:1.5] | set yrange [-1.5:1.5] | ||
| + | set xrange [0:20] | ||
set xlabel "Ido" | set xlabel "Ido" | ||
| − | set ylabel " | + | set ylabel "Amplitudo" |
| + | set samples 300 | ||
PI=3.14159 | PI=3.14159 | ||
| − | plot 4/PI*(sin(x)), 4/PI*(sin(x)+sin(3*x)/3), 4/PI*(sin(x)+sin(3*x)/3+sin(5*x)/5) | + | plot 4/PI*(sin(x)) title "4/PI*(sin(t))", 4/PI*(sin(x)+sin(3*x)/3) title "4/PI*(sin(t)+sin(3*t)/3)", 4/PI*(sin(x)+sin(3*x)/3+sin(5*x)/5) title "4/PI*(sin(t)+sin(3*t)/3+sin(5*t)/5)" |
</gnuplot> | </gnuplot> | ||
| 21. sor: | 27. sor: | ||
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. | 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ó == | == Folytonos Fourier transzformáció == | ||
| − | Egy jel Fourier | + | 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 [http://en.wikipedia.org/wiki/Fourier_transform angol nyelvű wikipedia egy cikke] nagyon hasznos segitségnek bizonyult. Ugyanitt vannak táblázatba foglalva a Fourier transzformáció azonosságai. | ||
| + | |||
| + | |||
| + | <!-- Háreszigorlat, fincsi, mi? --> | ||
| + | |||
| + | == DFT == | ||
| + | |||
| + | '''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> | ||
| + | |||
| + | ;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π pedig azért szerepel itt, hiszen 2π radián egy teljes kör. | ||
| − | |||
| − | A | + | 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ó ('''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: | |
| − | + | * 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 | + | 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) ) ") | ||
| − | + | v=idobeli_jelre_vissza(f) | |
| + | kepernyore_ir(v, "Ismet az idobeli jel - spektrumbol visszaszamitva") | ||
| + | </source> | ||
| − | + | == 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., 09: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.
Tartalomjegyzék
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]

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.
<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) ) ")
v=idobeli_jelre_vissza(f)
kepernyore_ir(v, "Ismet az idobeli jel - spektrumbol visszaszamitva")
</source>
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.