Progetto finale di Geometria Computazionale

Anno Accademico 2014/2015

Teoria

Teoria Audio

Seppur lo scopo del progetto sia quello di dare enfasi alla produzione grafica, è stato necessario uno studio sull'analisi e processamento del segnale audio.

L'analisi si è concentrata sul campionamento del segnale in ingresso (inizialmente analogico), trasformazione del segnale campionato nel dominio delle frequenze, e calcolo della frequenza fondamentale.

L’analisi in frequenza dei segnali a tempo discreto può essere ottenuta mediante la Trasformata Discreta di Fourier (DFT).
Il calcolo della trasformata discreta di Fourier richiede di moltiplicare un vettore a N componenti [f (0), . . . , f (N − 1)] per la matrice N × N la cui componente alla riga n e colonna k  è:
e−i2πnk/N

Il calcolo della Trasformata Discreta di Fourier ha una complessità computazionale O(N2), poichè il calcolo di ognuna delle N componenti F(n) richiede O(N) operazioni.
Esistono algoritmi più rapidi e leggeri aventi complessità O(N log(N) ) e per tal motivo sono chiamati FFT (Fast Fourier Transform algorithm). Un esempio è l'algoritmo di Cooley-Tukey. Questo algoritmo si basa sul principio divide et impera, e spezza ricorsivamente una DFT di qualsiasi dimensione N in DFT più piccole di dimensioni N1 ed N2, insieme a O(n) moltiplicazioni per l'unità immaginaria, detti fattori twiddle.

Ricapitolando, il segnale è stato digitalizzato, è stato inoltre applicato un filtro passa banda per eliminare frequenze non utili ai fini del calcolo della frequenza fondamentale (vedi frequenze al di sotto dei 20Hz e comunque sopra i 1000 Hz non rientrano nel nostro caso di utilizzo). È stata applicata la trasformata di fuorier sui segnali ricevuti dalla Classe Recorder che gestisce il microfono e calcolata la frequenza fondamentale.

Curve di Bézier

Pierre Bézier, Ingegnere della Renault, pensò che le curve dovessero essere adattabili alla forma desiderata, dovessero cioè dare al designer la possibilità di modificarle fino a completa soddisfazione. Introdusse la base di Bernstein e dei punti di controllo, che consentono di effettuare, passo dopo passo, le correzioni necessarie fino al raggiungimento del massimo grado di corrispondenza tra forma rappresentata e forma voluta.

Le curve di Bézier sono il più importante tipo di curve polinomiali. Vengono definite tramite un poligono di controllo in un intervallo [0, 1] ed hanno grado pari al numero di vertici -1 del poligono di controllo.

Nel caso delle corde della chitarra, sono state utilizzati dei polinomi di controllo a 3 vertici, ottenendo quindi delle curve di Bézier di 2° grado.

Una curva di Bézier di grado pari a due corrisponde ad un arco di parabola. Occorre creare due curve ausiliare di grado inferiore (grado 1), ottenute dal poligono di partenza. Queste due curve saranno date dai segmenti P0P1 e P1P2.

Considerato un valore t nell'intervallo [0,1], si definiscono due punti sui due segmenti P0P1 e P1P2, che nominiamo P01 P11. Unendo i due punti otteniamo un ulteriore segmento detto poligonale di primo livello.

Poligonale

Ora, sul segmento che congiunge questi due punti, si definisce un terzo punto, sempre in funzione di t. Il terzo punto è quello corrispondente alla curva di Bézier di grado 2 per il valore di t.

L'algoritmo procede allo stesso modo per ogni valore di t compreso nell'intervallo I = [0,1], permettendo di ottenere quindi la curva desiderata.

Osservando con attenzione le formule delle curve di Bézier di grado si nota che i polinomi (1-t) e t sono sempre presenti, corredati da un coefficiente ed un esponente. È evidente inoltre che questi polinomi dipendono chiaramente dal grado della curva in esame. I polinomi di Bernstein sono quindi così definiti:


con i = 0...k e k = grado della curva.
Caratteristica dei polinomi di Bernstein è che la loro somma è sempre pari ad 1, quindi per affinare una curva si rende sufficiente trasformare i vertici del poligono di controllo.

La curva di Bézier ottenuta tramite i polinomi di Bernstein si definisce:

Manuale Utente

L'applicazione si presenta con cinque widget principali:

  • Un bottone di start/stop rilevatore frequenza ed un bottone per uscire dall'applicativo
  • Un widget raffigurante il rilevatore ed indicatore di frequenza
  • Un widget per la raffigurazione dell'andamento sinusoidale di un suono, con la possibilità di selezionare il suono da raffigurare
    (Mi, La, Re, Sol, Si, Mic)
  • Un widget che raffigura il manico della chitarra su cui è possibile far vibrare le corde ed udirne il suono
  • Dei bottoni che rimandano alla riproduzione di campioni sonori per il test dell'indicatore di frequenza

Cliccando sul bottone Start  viene avviato il rilevatore di frequenza insieme all'oscilloscopio.
È possibile selezionare una nota e vederne rappresentato l'andamento nel corso del tempo.
Il rilevatore di frequenza cambia l'angolo dell'indicatore a seconda di quanto dista la frequenza percepita,
dalla frequenza (quindi nota della scala cromatica) più vicina. Cliccando su una delle corde sarà possibile udire il suono di tale corda e vederne l'oscillazione.

Per poter lanciare il progetto è necessario disporre del seguente ambiente:

  • Python, versione 3 o superiore
  • Librerie Qt4 e PyQt4
  • Libreria Numpy e pyAudio

Download

Applicazione

L'applicazione è stata sviluppata e testata in ambiente Ubuntu/Linux.

Una volta scaricato il progetto, scompattarlo (unzip progetto.zip), da terminale vi posizionate all'interno della cartella estratta e lanciate python3 gui.py oppure start.sh