Kieliteknologian oppiaine

Matematiikan perusteita puheteknologiaa varten

- KIT-verkosto | Yleisen kielitieteen laitos| Kieliteknologian opetus| Helsingin yliopisto -
Yleisiä tietoja kurssista
Kurssin kalenteri
Kurssin kuvaus
Luennoitsija
Kurssin materiaali
Matemaattisia kaavoja (PS)
Scilabin käyttö
FFT Scilabilla
Viikkomateriaalit
Viikon 1 materiaali PostScript-muodossa
Viikon 1 materiaali PDF-muodossa
Viikon 2 materiaali PostScript-muodossa
Viikon 2 materiaali PDF-muodossa
Viikon 3 materiaali PostScript-muodossa
Viikon 3 materiaali PDF-muodossa
Viikon 4 materiaali PostScript-muodossa
Viikon 4 materiaali PDF-muodossa
Viikkojen 5 ja 6 materiaali PostScript-muodossa
Viikkojen 5 ja 6 materiaali PDF-muodossa
Viikon 7 materiaali (lopputyö)
Ohjelmia
Scilab-ohjelman manuaali
gnuplot -manuaali (HTML)
gnuplot -manuali (PS)
gnuplot -ohje LaTeXia varten (PS)
C-kielinen FFT-ohjelma

FFT-transformaatio SCILAB-ohjelmalla

Tehdään ensin aikavektori t, johon 32 arvoa siten, että kasvavat 0:sta kohti 2*pi:tä. (Ensin laitetaan tulostusasuun vähän niukemmin desimaaleja.)

      -->format('v',6)
 
      -->t=(0:31)/16*%pi
    

Yksinkertainen esimerkki aikasarjasta

Lasketaan aikasarja, jossa on kyseisellä aikavälillä viisi heilahdusta ja jonka vaihesiirto on 1/8 kierrosta (45 astetta) ja tarkistetaan tulos piirtämällä:

      -->cc1 = cos(5*(t)+%pi*0.25)

      cc1  = [ 0.707, -0.195, -0.924, -0.831, -0.000, 0.831, 0.924, ...
          0.195, -0.707, -0.981, -0.383, 0.556, 1., 0.556, -0.383, ...
         -0.981, -0.707, 0.195, 0.924, 0.831, -0.000, -0.831, -0.924, ...
         -0.195, 0.707, 0.981, 0.383, -0.556, -1., -0.556, 0.383, 0.981 ]

      -->plot2d(t,cc1)
    
cos(3*t+0.25*pi)

Lasketaan tästä aikasarjasta FFT (ja funktiolla clean siistitään lähellä nollaa olevat arvot tasan nolliksi):

      -->ff1 = clean(fft(cc1,-1),0.001)
 
      ff1 =  [ 0, 0, 0, 0, 0, (11.31+11.31*%i), 0, 0, 0, 0, 0, ...
               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
               (11.31-11.31*%i), 0, 0, 0, 0) ]
    

Huomaa että yllä vektorit on esitetty toisin kuin ohjelma ne tulostaa. Muodoksi on valittu sellainen, jossa arvot voisi syöttää takaisin ohjelmalle. Kolme pistettä rivin lopussa toimii jatkorivin merkkinä, jolloin koko lausekkeenkin voisi syöttää leikkaamalla ja liimaamalla ohjelmalle. Hakasulut puolestaan rajaavat vektoria.

  • Ensimmäinen alkio on 0, koska värähtelyssä ei ole vakiotermiä.
  • Toinen, kolmas, neljäs ja viides alkio ovat myös nollia, koska käyrässä ei ole värähtelyjä jotka heilahtelisivat koko jakson 1, 2, 3, tai 4 kertaa.
  • Aikasarjaan sisältyy siis värähtelyä taajuudella, joka vastaa viittä edestakaista heilahdusta sarjan aikana. Alkion suuruus on 11.31+11.31*%i, joten vaihesiirtymä on 0.25*%pi ja cosinikertoimem suuruus on 1.0 koska kyseisen kompleksiluvun itseisarvo on 16 (= puolet pisteiden määrästä).
  • Seitsemännestä alkiosta eteenpäin on nollia, koska 6, 7, ... kertaa heilahtelevia kosiniaaltoja ei ole signaalissa.
  • Loppupää kertoimista on peilikuva alkupäästä, paitsi ensimmäistä alkiota, joka ei toistu lopussa ja että kompleksiarvot ovat konjugaattilukuja (s.o. imaginääriosa vastakkaismerkkinen).

Kosinien yhdistelmäkäyrän rekonstruktio

Olkoon annettuna seuraava 32 pisteen aikasarja, josta oletetaan, että se on summa kosineista, joiden jakso on askelvälin monikertoja ja kullakin mahdollinen vaihesiirtymä:

  --> cc2 = [ 0.646, 1., 1.278, 1.247, 0.907, 0.472, 0.182, 0.098 ...
         0.071, -0.097, -0.453, -0.833, -1.007, -0.887, -0.624, ...
         -0.490, -0.646, -1., -1.278, -1.247, -0.907, -0.472, ...
         -0.182, -0.098, -0.071, 0.097, 0.453, 0.833, 1.007, ...
         0.887, 0.624, 0.490]
  --> plot2d(t,cc2)
    
tuntematon cos-lauseke

Etenemme aiemman esimerkin mukaisesti laskemalla FFT:n.

    --> ff2 = clean(fft(cc2,-1),0.001)                             
      ff2 = [ 0, 16., 0, (-2.263 - 2.263*%i), 0, (-3.394-3.394*%i), ...
        0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
        0, 0, (-3.394+3.394*%i), 0, (-2.263+2.263*%i), 0, 16. ]
    

Tästä voidaan jo nähdä jotakin, esim. että taajuudet ovat yksinkertainen, kolminkertainen ja viisinkertainen verrattuna koko välin pituuteen 32, siis yksi koko jakso, kolme jaksoa ja viisi jaksoa koko aikavällä. Ottamalla itseisarvo ja jakamalla puolella jaksojen määrästä saamme 16 ensimmäistä alkiota:

   --> abs(ff2(1:16))/16
      ans  =
        0.    1.    0.    0.2    0.    0.3    0.    0. 
        0.    0.    0.    0.     0.    0.     0.    0.
    

Tästä nähdään, että aikasarja koostuu vaihekulmia paitsi lausekkeesta cos(t)+0.2*cos(3t)+0.3*cos(5*t). Vaihekulmat saadaan kompleksiarvoisesta ff2:sta:

  --> atan(imag(ff2(4)),real(ff2(4)))/%pi
    ans =  -0.75
  --> atan(imag(ff2(6)),real(ff2(6)))/%pi
    ans =  -0.75  
    

Siis kolminkertaisen aallon vaihekulma on -0.75*%pi. Sama pätee viisinkertaiseen aaltoon. Siis aikasarja on saatavissa lausekkeesta: cos(t) + 0.2*cos(3*t-0.75*%pi) + 0.3*cos(5*t-%pi*0.75). Piirrettynä tämä onkin sama käyrä kuin annettujen pisteiden muodostama.