V primeru, da imamo signal, v katerem nastopa relativno malo frekvenc, lahko pretvorbo v frekvenčni prostor izkoristimo tudi za izgubno stiskanje podatkov (za ta namen se pogosteje uporablja kosinusna in valčna transformacija).
V našem primeru bomo poskusili stisniti tone, ki nastopajo pri prejšnji nalogi. Postopek stiskanja pa bo naslednji:
signal pretvorimo v frekvenčni prostor, delali bomo v pravokotnih koordinatah
obe amplitudi (kosinus in sinus) pri frekvencah, pri katerih je absolutna amplituda kosinusov manjša od podanega praga, postavimo na 0
podatke stisnemo z uporabo naslednjih pravil:
Primer: X=[9 3+2i 0 0 5+3i 0 8+9i....] bi stisnili v vektor [9 0 3 2 0 4 5 3 0 2 8 9].
Napišite še postopek za dekompresijo, ki bo ponovno razširil stisnjeni posnetek. Za pretvorbo iz frekvenčnega v časovni prostor uporabite funkcijo ifft.
Oddati morate postopek za kompresijo in dekompresijo, oddajte pa tudi tekstovno datoteko, v kateri opišite, kako se je kompresija obnesla (kakšen signal, prag, dosežena kvaliteta, razmerje velikosti) .
Zgradba vašega programa naj bo naslednja:
POZOR! Podatki, ki so zrcaljeni čez polovico so tudi konjugirani (imaginarnemu delu se spremeni predznak. npr. če X(2)=2+3i, potem X(end)=2-3i). Uporabite vgrajeno funkcijo conj.
Ko glasbeniki igrajo na glasbila, ustvarjajo tone. Vsak ton je definiran s točno določeno frekvenco (npr. ton a1 ima frekvenco 440 Hz). Frekvence tonov lahko razberemo iz “tabele tonskih frekvenc”.
V kolikor nam glasbena teorija ne leži najbolje ali pa nimamo absolutnega posluha, lahko posamezen ton ugotovimo s pomočjo DFT-ja. Pogoj za to je, da v signalu nastopa le en ton. V tem primeru lahko signal pretvorimo v frekvenčni prostor, ter poiščemo frekvenco, pri kateri je amplituda največja (v polarnih koordinatah). S pomočjo tabele tonskih frekvenc lahko nato ugotovimo, ta kateri ton gre.
Napišite funkcijo ton=ugotovi_ton(signal, fvz), ki kot vhod sprejme posnet signal in vzorčevalno frekvenco, kot izhod pa vrne ton (v obliki niza – npr. ‘C1′). Pričakujete lahko tone od C1 do C2. V kolikor najdena frekvenca ne ustreza natančno tonu, vrnite ton, ki je najbližji zaznani frekvenci.
Za test lahko uporabite posnetke tonov A, C, E, ki so bili pobrani s te strani.
Napišite funkcijo za konvolucijo z uporabo FFT y=moja_konvolucija(x, h) (3t). Dolžina izhodnega signala mora biti enaka vsoti dolžin signala x ter impulznega odziva h zmanjšane za 1 (length(x)+length(h)-1) (n:-3t). Da boste kompatibilni z matlabovo funkcijo conv, uporabite še drugi parameter pri fft, ki pove, kako dolžino signala naj uporabi (dodajo se ničle na začetek in konec signala).
DFT nam nudi odlično orodje za opazovanje obnašanja nekega sistema. Impulzni odziv h=[0.03806, 0.14645, 0.30866, 0.5, 0.69134, 0.85355, 0.96194, 1, 0.96194, 0.85355, 0.69134, 0.5, 0.30866, 0.14645, 0.03806] s pomočjo funkcije fft pretvorite v frekvenčni prostor (1t). Izrišite amplitude in faze, pri čemer naj bodo na osi X vrednosti med [0 1) (2t). V komentar funkcije zapišite, za kakšen filter gre in kako se obnaša – katere frekvence imajo amplitudo blizu 0 (1t). Z rdečo črto označite točno mesto na grafu, kjer se amplitude začnejo zrcaliti (1t).
Grafa naj bosta na eni sliki. Pazite, da bodo osi pravilno označene (ob napaki -5t)!
Vse skupaj naj se naredi v funkciji izrisi_sistem.
Napišite DFT s pomočjo skalarnega produkta. Ustvarite torej funkcijo X=moj_dft(x, Fvz) (7t), kjer je x vektor v časovnem prostoru in Fvz vzorčevalna frekvenca. Vaš rezultat mora biti primerljiv z rezultatom matlabovega FFT (tako v realnem kot v imaginarnem delu rezultata)! Bodite pozorni na to, da je dolžina FFTja N vzorcev, dolžina rezultata vaše funkcije pa bo N/2+1, zato sistem tudi pričakuje tako dolžino. Dolžina naj bo potenca števila 2. Uporaba matlabovih funkcij fft, fft2, fftn, fftw… ni dovoljena!
V funkciji izrišite amplitudo in fazo rezultata v frekvenčnem prostoru (3t). Na osi X naj bodo pravilno označene frekvence, na osi Y pa amplitude oz. faze. Ne pozabite na oznake osi. Oba grafa naj bosta prikazana na eni sliki (uporabite funkcijo subplot)!