1) Caricare un segnale da 8 campioni: sg1 = loadSignal("Image.txt", 1032, 8, 3, 1, 2); 2) mostrarlo con: plot(sg1); 3) costruire una base (non ortonormale) di 8 gaussiane: ba1 = normpdf(1:8, 1, 0.7); ba2 = normpdf(1:8, 2, 0.7); ba3 = normpdf(1:8, 3, 0.7); ba4 = normpdf(1:8, 4, 0.7); ba5 = normpdf(1:8, 5, 0.7); ba6 = normpdf(1:8, 6, 0.7); ba7 = normpdf(1:8, 7, 0.7); ba8 = normpdf(1:8, 8, 0.7); - il comando 1:8 restituisce un vettore con 8 elementi: [1,2,...,8] quindi normpdf calcola una gaussiana con centro il secondo parametro e larghezza il terzo. 3b) visualizzare le basi con: ba1 [invio] - per mostrare i valori dei punti della prima base plot(ba1) 4) inserire le 8 basi in una matrice: ba = [ba1; ba2; ba3; ba4; ba5; ba6; ba7; ba8]; 4b) visualizzare le basi con: ba [invio] - per mostrare i valori dei punti della prima base plot(ba') - L'operatore ' esegue la trasposta della matrice. Questo serve perche' il comando plot legge le funzioni da plottare per colonna, mentre noi abbiamo costruito la matrice per riga 5) definire la funzione reconstructSignal(a, b) che restituisce il segnale costruito sommando le basi in b, moltiplicate ognuna per i coefficienti in a. 5b) provarla su un vettore a caso: plot(reconstructSignal([1,0,0,0,1,0,0,1], ba)) 6) ricavare i coefficienti in modo da ricostruire il segnale in ingresso: coeff = sg1 * inv(ba) - inv(ba) inverte la matrice delle basi. In questo modo trova i coefficenti per cui sg1 = coeff * ba 7) ricostruire il segnale richiamando la funzione reconstructSignal: sg1r = reconstructSignal(coeff, ba) - quindi plottarla confrontandola con il segnale originale plot(sg1, "-", sg1r, "-") - il "-" serve perche' il comando plot altrimenti interpreta il secondo valore come asse delle ordinate 8) Per dimostrare che il segnale e' veramente ricostruito con i coefficienti, mettere a 0 un coefficiente e ripetere: coeff(7) = 0 sg1r = reconstructSignal(coeff, ba) plot(sg1, "-", sg1r, "-") 9) Caricare un altro segnale, da 256 campioni e mostrarlo: sg2 = loadSignal("Sound.dat", 1000, 256, 3); plot(sg2); 10) creare una nuova base (non ortonormale) bb1 = normpdf(1:256, 32, 32); bb2 = normpdf(1:256, 80, 64); bb3 = normpdf(1:256, 128, 32); bb4 = normpdf(1:256, 176, 64); bb5 = normpdf(1:256, 224, 32); bb = [bb1; bb2; bb3; bb4; bb5]; - mostrare le basi plot(bb') 11) Definire la funzione di proiezione projectSignal(a, b) che calcola la proiezione del segnale a sul segnale b 12) Utilizzare la funzione per provare che la base non e' ortonormale projectSignal(bb1, bb2) projectSignal(bb1, bb3) 13) definire la funzione calcCoeffNonOrtoBase(s, b) che calcola i migliori coefficienti per la base (non ortonormale) b con cui ricostruire il segnale s 14) Utilizzare i coefficienti trovati per ricostruire il segnale e confrontarlo con l'originale cb = calcCoeffNonOrtoBase(sg2, bb) sg2r = reconstructSignal(cb, bb); plot(sg2,"-",sg2r,"-") 15) Calcolare "l'errore" e mostrare come questo sia ortogonale ad ogni base err2 = sg2-sg2r; projectSignal(err2, bb1) projectSignal(err2, bb2) projectSignal(err2, bb3) projectSignal(err2, bb4) projectSignal(err2, bb5) 16) Creare la procedura constructDCTbase(n, m) che restituisce una matrice n x m, che contiene sulle righe le prime n basi di una DCT su m campioni. 17) Creare le prime 5 basi, e visualizzarle dctbase = constructDCTbase(5, 256); plot(dctbase') 17b) Verificare se le prime 3 basi sono ortonormali projectSignal(dctbase(1,1:256), dctbase(1,1:256)) projectSignal(dctbase(1,1:256), dctbase(2,1:256)) - le basi non sono ortonormali, perche' in realta' lo sono quelle simmetriche (che considerano anche l'altra parte del segnale) 17c) costruire la procedura constructDCTbase2(n, m) che crea la base DCT su 2*m campioni (in pratica senza dimezzare la base), e provare che questa nuova base e' ortogonale dctbase2 = constructDCTbase2(5, 256); projectSignal(dctbase2(2,1:512), dctbase2(4,1:512)) - Attenzione! In questo caso bisogna raddoppiare l'estremo dell'indice perche' i campioni sono raddoppiati (considerando il campione simmetrico). projectSignal(dctbase2(2,1:512), dctbase2(2,1:512)) - il segnale pero' non e ancora NORMALE, in quanto la proiezione di una base su se stessa da N. Per renderla normale, occorre dividere la base per sqrt(m) (quella simmetrica) e per sqrt(m/2) quella originale. 18) creare la procedura calcCoeffOrtoBase(s, b) che calcola i coefficienti nel caso di una base ortonormale. 19) utilizzare la procedura per calcolare i coefficienti della DCT, ricostruire il segnale e confrontarlo con l'originale. c2dct = calcCoeffOrtoBase(sg2, dctbase) sg2dct = reconstructSignal(c2dct, dctbase); plot(sg2,"-",sg2dct,"-") 20) riprovare a ricostruire il segnale con una base dct con 64 curve dctbase64 = constructDCTbase(64, 256); c2dct64 = calcCoeffOrtoBase(sg2, dctbase64); sg2dct64 = reconstructSignal(c2dct64, dctbase64); plot(sg2,"-",sg2dct,"-",sg2dct64,"-") 21) vedere infine con 256 curve (tante quante i campioni) e valutare l'errore dctbase256 = constructDCTbase(256, 256); c2dct256 = calcCoeffOrtoBase(sg2, dctbase256); sg2dct256 = reconstructSignal(c2dct256, dctbase256); plot(sg2,"-",sg2dct,"-",sg2dct256,"-") err256 = sg2-sg2dct256; projectSignal(err256, err256) 22) caricare un nuovo segnale con 64 campioni sg3 = loadSignal("Image.txt", 1024, 64, 3); 23) creare una funzione calcDFT(s) che calcola la DFT del segnale s. 24) calcolare e mostrare i coefficienti della DFT: c3dft = calcDFT(sg3) plot(c3dft') 25) caricare un nuovo segnale piu' lungo (512) campioni, di cui calcolare e mostrare la DFT: sg4 = loadSignal("Image.txt", 1024, 512, 3); c4dft = calcDFT(sg4) plot(c4dft') 26) costruire la funcione calcIDFT(c) che calcola la trasformata inversa: data una matrice con coefficienti reali ed immaginari su due righe, ricostruisce il segnale. 27) ricostruire il segnale (quello da 63 campioni) e verificare l'errore: sg3r = calcIDFT(c3dft); plot(sg3r, "-", sg3, "-") err3 = sg3 - sg3r; projectSignal(err3, err3) 28) scrivere la funzione calcFFT(s) che calcola la FFT del segnale s. 29) confrontare i tempi di calcolo per la FFT su sg4, rispetto alla DFT sullo stesso segnale e valutare le (eventuali) differenze c4fft = calcFFT(sg4) err4fft = c4dft - c4fft projectSignal(err4fft, err4fft)