You are on page 1of 103

` UNIVERSITA DEGLI STUDI DI UDINE

Facolt` di Ingegneria a Corso di Laurea Triennale in Elettronica

Tesi di Laurea

EFFETTI AUDIO SU SISTEMI A MICROPROCESSORE

Relatore: Prof. RINALDO ROBERTO

Laureando: STEFANO RONCO

Correlatore: Prof. PETRELLA ROBERTO

ANNO ACCADEMICO 2009-2010

A mia madre e mio padre Sara e Federica

Sommario
In questa tesi verranno analizzati e sviluppati alcuni dei pi` importanti e u conosciuti eetti audio utilizzati per la creazione e la elaborazione di musica, voce e strumenti musicali. Lo studio verr` sviluppato nel dominio digitale; a la naturale prosecuzione di questo lavoro ci porter` ad implementare su un a microprocessore, un sistema digitale, gli eetti studiati cos` da poter poi anche vericare la buona riuscita o meno della ricostruzione delleetto desiderato. I linguaggi di programmazione utilizzati in questa tesi sono essenzialmente due: il linguaggio MATLAB per una prima fase di studio e sviluppo, il linguaggio C per la denitiva programmazione del microprocessore. Il microprocessore utilizzato appartiene alla famiglia 28x Delno Floating-point Series, del produttore TEXAS INSTRUMENTS. Questo processore ` pre-montato su e una scheda; il tutto fa parte di un prodotto denito come TMDXDOCK28343 experiment kit. Non ` obbiettivo di questo studio lo sviluppo di una apparecchiatura per uso e professionale ma bens` cercare di comprendere quale sia il modello sico di un determinato eetto e come questo possa essere implementato in un sistema digitale quale un microprocessore.

vi

Sommario

Indice
Sommario Elenco delle gure Introduzione 1 La Scheda di elaborazione 1.1 Caratteristiche tecniche . . . . . . . . . . . . . . . . . 1.2 Il processore . . . . . . . . . . . . . . . . . . . . . . . 1.3 Il sistema di sviluppo . . . . . . . . . . . . . . . . . . 1.3.1 Installazione del Code Composer Studio . . . 1.3.2 Installazione dei driver dellemulatore . . . . . 1.3.3 Note preliminari . . . . . . . . . . . . . . . . 1.3.4 Avvio del programma Code Composer Studio 1.3.5 Esecuzione del programma . . . . . . . . . . . 2 Filtri Digitali 2.1 Filtri FIR . . . . 2.2 Filtri IIR . . . . . 2.3 Filtri Parametrici 2.4 Filtri a Pettine . v ix xi 1 1 3 3 3 4 4 4 5 11 11 13 14 15

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

3 Eetti Audio 17 3.1 Il buer circolare . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.2 Motivazione delle scelte . . . . . . . . . . . . . . . . . . . . . . . 18 4 Ritardo temporale 4.1 Delay . . . . . . . 4.1.1 Parametri 4.2 Slapback Eco . . 4.2.1 Parametri 4.3 Multi-tap Eco . . 21 21 25 26 26 29

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . . vii

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

viii 4.3.1

INDICE Parametri . . . . . . . . . . . . . . . . . . . . . . . . . . 31 33 33 36 39 41 43 44 46 48

5 Modulazione della linea temporale 5.1 Chorus . . . . . . . . . . . . . . . 5.1.1 Parametri . . . . . . . . . 5.2 Flanger . . . . . . . . . . . . . . 5.2.1 Parametri . . . . . . . . . 5.3 Vibrato . . . . . . . . . . . . . . 5.3.1 Parametri . . . . . . . . . 5.4 Pitch Shifter . . . . . . . . . . . . 5.4.1 Parametri . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

6 Riverbero digitale 51 6.1 Parametri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 7 Variazione di Ampiezza 7.1 Distorsione . . . . . . 7.1.1 Parametri . . . 7.2 Tremolo . . . . . . . . 7.2.1 Parametri . . . 8 Processi sulla dinamica 8.1 Compressione . . . . . 8.1.1 Parametri . . . 8.2 Soppressore di rumore 8.2.1 Parametri . . . Conclusioni A Codice C per la programmazione del DSP Bibliograa 59 59 61 62 63 65 65 69 71 73 75 77 89

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

Elenco delle gure


1.1 Diagramma Blocchi Funzionali 1.2 Simulazione . . . . . . . . . . 1.3 Menu Breakpoints. . . . . . . 1.4 Il Sistema di Sviluppo . . . . 2.1 2.2 2.3 2.4 3.1 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 5 6 7 12 13 14 15

Struttura di un ltro FIR . . . . . . . . . . . Struttura di un ltro IIR . . . . . . . . . . . . Risposta in frequenza di un ltro parametrico Risposta in frequenza di un ltro a pettine . .

Struttura del buer Circolare . . . . . . . . . . . . . . . . . . . 18 Struttura sica del Delay . . . . . Implementazione, Delay . . . . . Filtro nel tempo, Delay . . . . . . Filtro in frequenza, Delay . . . . Implementazione, Slapback Eco . Filtro nel tempo, Slapback Eco . Filtro in frequenza, Slapback Eco Implementazione, Multi-tap Eco . Filtro nel tempo, Multi-tap Eco . Filtro in frequenza, Multi-tap Eco Implementazione, Chorus . . Filtro in frequenza, Chorus . Coecienti, Chorus . . . . . Parametri ritardo, Chorus . Implementazione, Flanger . Filtro in frequenza, Flanger Coeciente, Flanger . . . . Implementazione, Vibrato . Coeciente, Vibrato . . . . . . . . . . . . . ix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 22 23 23 26 27 27 29 30 30 34 34 35 36 39 40 40 43 44

ELENCO DELLE FIGURE 5.10 Implementazione, Pitch Shifter . . . . . . . . . . . . . . . . . . 46 5.11 Coeciente, Pitch Shifter . . . . . . . . . . . . . . . . . . . . . 47 5.12 Filtro Passa-basso, Pitch Shifter . . . . . . . . . . . . . . . . . . 47 6.1 6.2 6.3 6.4 7.1 7.2 7.3 7.4 8.1 8.2 8.3 8.4 8.5 8.6 Risposta Impulsiva, Riverbero Implementazione, Riverbero . Filtro FIR, Riverbero . . . . . Cella IIR, Riverbero . . . . . Implementazione, Distorsione Segnali nel tempo, Distorsione Implementazione, Tremolo . . Coeciente, Tremolo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 52 53 54 59 60 62 63 66 67 68 71 72 72

Implementazione, Compressore Comportamento, Compressore . Segnale di Uscita, Compressore Implementazione, Soppressore . Comportamento, Soppressore . Segnale nel tempo, Soppressore

A.1 Struttura del Programma

. . . . . . . . . . . . . . . . . . . . . 77

Introduzione
Gli eetti musicali trovano la loro applicazione pratica sin dagli inizi degli anni 60 con la comparsa sulla scena mondiale dei primi strumenti musicali elettrici e la nascita dei pi` famosi gruppi rock. In quegli anni infatti gli artisti iniziarono u a sperimentare ed utilizzare dispositivi capaci di alterare le normali procedure di registrazione e di riproduzione del usso audio. I primi a sfruttare i risultati di queste sperimentazioni furono i Rolling Stone, Jimmy Page, Je Beck, Jimi Hendrix, per citarne alcuni; nei loro brani degli anni 60 ` gi` possibile e a infatti ascoltare i primi eetti di distorsione, vibrato, tremolo e wah wah. Con il passare degli anni se ne sono sviluppati e perfezionati altri come il anger, il phaser, il chorus e il delay; potevano essere creati live dagli artisti durante gli spettacoli o aggiunti in fase di registrazione dai tecnici del suono; la loro creazione era comunque sempre un processo che prevedeva lalterazione sica del supporto di registrazione o lalterazione dei dispositivi di lettura di tale supporto. Ad esempio il delay consiste nella riproduzione di due tracce audio uguali su due linee temporali diverse; il anger ` lo spostamento continuo sul e nastro magnetico della testina di lettura. Gi` agli inizi degli anni 70 vennero sviluppati i primi sistemi digitali per la rea gistrazione di tracce audio, ancora sperimentali, ma che si dimostrarono subito particolarmente interessanti per le possibilit` di sviluppo in campo musicale. a Fu solo nel 1978 che si registr` la prima canzone in digitale, una cover dei Rose o Royce cantata dai MorrisseyMullen. Questo sistema di registrazione digitale necessitava di nuovi supporti di memorizzazione e lanno dopo, frutto di una collaborazione tra Philips e Sony, nasce il primo Compact-Disk. Nel 1982 fu messo in commercio il primo compact-disk musicale, The visitors, un successo degli Abba. I dispositivi analogici, quali dischi in vinile e audio-cassette, continuarono per` a svolgere il loro compito no alla ne del secolo quando o vennero denitivamente soppiantati. Dal 78 ad oggi la tecnologia digitale si ` sviluppata con un trend esponenziale che lha portata ad invadere il mercae to a discapito dei sistemi analogici. Questo non riguarda solamente il settore musicale, si pensi ad esempio ai personal computer, ai telefoni cellulari e agli impianti hi-. Il settore musicale non poteva che seguire lo standard che si staxi

xii

Introduzione

va creando, unendo cos` alla qualit` digitale le enormi potenzialit` che questo a a sistema oriva soprattutto nel settore della musica che tratta gli eetti audio. Ora si pu` aermare con certezza che la maggior parte di questi viene oggi o implementata con algoritmi al computer o con dispositivi dedicati (DSP). Le dierenze tra le due metodologie sono evidenti e riguardano essenzialmente il usso audio in ingresso e la catena di elaborazione del segnale. Nei sistemi analogici, il usso audio `, a meno di amplicazioni, esattamente quello che e viene generato da un microfono, i processi mediante i quali il segnale viene alterato sono di natura analogica, prodotti da amplicatori valvolari prima e amplicatori operazionali o transistor dopo. Per i dispositivi digitali invece il usso audio viene ltrato e campionato prima di essere elaborato da un processore ed al termine dellelaborazione viene interpolato per renderlo nuovamente analogico, tale tipologia di segnale ` richiesta dai dispositivi di diusione. e La possibilit` di scegliere tra due tecnologie porta con s` intrinsecamente loba e bligo di una valutazione delle caratteristiche favorevoli o meno di ogni tecnica. Se lintroduzione di campionatori ed interpolatori pu` generare nel segnale del o rumore indesiderato, lutilizzo di un solo componente programmabile per la produzione di eetti, ne permette la simultanea presenza senza doverne aumentare le dimensioni ed i costi. Lutilizzo della tecnologia analogica presenta un vantaggio in termini di qualit` del suono ed alta fedelt` a discapito per` a a o dei costi e delle dimensioni dei dispositivi. Valutando opportunamente tutti i parametri sar` cura del progettista operare una scelta verso la metodologia a che pi` si adatta alle richieste dellutilizzatore. u

Come anticipato nel sommario, in questo progetto si ` deciso di utilizzare un e sistema digitale per la creazione di un dispositivo capace di generare un insieme di eetti digitali utili per un uso domestico dello stesso anche se le prestazioni del supporto permetterebbero di ottenere una qualit` superiore. Laccuratezza a del convertitore analogico-digitale a 12 bit permette infatti di ottenere una buona qualit` e la velocit` di elaborazione ci consentirebbe il campionamento a a ad una frequenza di 44100 Hz, standard utilizzato dai Compact-disk audio comunemente in commercio. Si ` per` deciso di utilizzare una frequenza inferioe o re, 22050 Hz, per evitare alcuni problemi legati alle dimensioni della memoria del dispositivo che verranno arontati in seguito. Per semplicit` si ` deciso a e di arontare il problema su un solo canale audio; quindi questo dispositivo lavorer` su tracce Mono e non Stereo. Nonostante questa risulti unevidente a limitazione pratica, ` interessante sapere che in futuro sar` possibile applicare e a la tecnologia su tracce stereo, previa delle piccole modiche al codice sorgente. Si ` deciso di arontare lo studio solamente degli eetti pi` conosciuti notando e u comunque che anche quelli pi` particolari sono una semplice sovrapposizione u

xiii e combinazione degli eetti base. Si possono suddividere in quattro grandi famiglie a seconda di come vengono realizzati: Eetti generati da un ritardo temporale: delay, slapback eco, multi-tap eco. Eetti generati dalla modulazione della linea temporale: chorus, anger, vibrato, pitch shifter. Eetti generati dalla variazione dellampiezza: distorsione, tremolo. Eetti generati da processi sulla dinamica: soppressore di rumore, limitatore, compressore. La struttura di questa tesi prevede un primo capitolo, dove viene presentata la scheda utilizzata e il sistema di sviluppo, una piccola guida pratica per avvicinarsi al suo utilizzo; un secondo capitolo in cui sono spiegati i concetti alla base del funzionamento di principio di alcuni ltri digitali utilizzati. Nel terzo capitolo si eettua una introduzione dei vari eetti con approfondimenti sulle strutture utilizzate e un paragrafo che contiene le motivazioni delle scelte eettuate per le implementazioni. Nel successivo capitolo si concentrano tutti gli studi fatti sugli eetti creati con la struttura delay; per ognuno di essi si pu` trovare una breve introduzione dove si cerca di capire anche il processo o sico che ne sta alla base, i graci esplicativi e le strutture implementative seguite dal codice Matlab con cui ` stato simulato allelaboratore. Nel quinto e capitolo verranno invece arontati gli eetti generati dalla modulazione della linea temporale; il sesto ` interamente dedicato allo studio del riverbero. Nel e settimo aronteremo gli eetti legati alla variazione di ampiezza del segnale. Lultimo dar` una breve spiegazione delle strutture che attuano processi legati a alla dinamica del segnale. A seguire vi sar` un appendice nella quale ` riportato a e parte del codice necessario per la programmazione della scheda Texas.

xiv

Introduzione

Capitolo 1 La Scheda di elaborazione


La scheda utilizzata per lo sviluppo di questa tesi ` la TMDXDOCK28343, un e kit di sviluppo prodotto da TEXAS INSTRUMENTS che comprende due parti: la scheda, che include il processore e le periferiche di supporto ed una basetta per interfacciare la suddetta con qualunque periferica esterna, ` molto utile in e fase di progettazione perch` permette di eseguire loperazione in modo pratico e portando allesterno comodi connettori e consente la realizzazione di piccoli circuiti negli appositi spazi in essa ricavati. La scheda risulta inoltre ideale per operazioni in virgola mobile ed ` studiata per applicazioni di controllo in e tempo reale.

1.1

Caratteristiche tecniche

Le periferiche di nostro interesse integrate su questa scheda sono: 6 canali DMA 3 CPU-Timer da 32 bit Fino a 9 moduli ePWM Convertitore Analogico-Digitale (ADC) da 12 bit Fino a 3 moduli di interfaccia per comunicazioni seriali Fino a 2 moduli per linterfaccia seriale delle periferiche Ingressi e uscite digitali Interfaccia esterna Fino ad 88 GPIO pins programmabili singolarmente 1

La Scheda di elaborazione

Figura 1.1: Diagramma Blocchi Funzionali

1.2 Il processore

1.2

Il processore

Il processore montato su questa scheda si basa sullarchitettura del precedente c28x MCUs al quale ` stata aggiunta una FPU (oating-point unit) in singola e precisione a 32 bit, il tutto con una frequenza di clock di 200 Mhz. Il risultato ` un sistema ad alte prestazioni che per la sua ecienza rende superuo un see condo core anche per le elaborazioni pi` complesse. A questo poi si aggiunge un u veloce sistema di risposta agli interupt che permette il salvataggio dei registri e la gestione di molti interupt asincroni con tempi di latenza davvero molto brevi. Lo strumento della pipeline a 8 livelli di profondit`, con la possibilit` a a di accesso alla memoria di pipeline, conferisce al dispositivo una gran velocit` a senza richiedere dispendio di risorse ed elevata velocit` alle memorie. a

1.3

Il sistema di sviluppo

La scheda utilizzata viene accompagnata da un software di sviluppo chiamato Code Composer Studio. E un programma sviluppato dalla casa produttrice, la Texas Instruments, quindi un programma studiato appositamente per i sistemi Texas. Nella programmazione il linguaggio utilizzato ` il C, un linguaggio e ad alto livello che verr` opportunamente convertito dal software di sviluppo a nel linguaggio macchina della scheda di elaborazione. Per completare la programmazione della scheda ` necessario lutilizzo di un emulatore. Lemulatore e ` un dispositivo che permette di connettere la scheda di elaborazione al Pc, e ` dotato di una porta usb adatta alla connessione al Pc ed una porta con un e connettore a pettine adatta al DSP.

1.3.1

Installazione del Code Composer Studio

La suite di sviluppo viene installata aprendo il le setup.exe, a cui seguono le richieste di dove e di quali componenti installare. E consigliabile seguire le impostazioni tipiche. Al termine dellinstallazione verr` eseguito il programma a Code Composer Studio Setup. Allavvio sar` necessario selezionare il disposa itivo che si ` deciso di utilizzare. E per` possibile che non sia presente nella e o lista; per ovviare a questo problema bisogner` in primo luogo aggiornare il a CCS3, ed in seguito installare il software contenuto nel cd allegato allemulatore. In questa tesi ` stato scelto il sistema C28343 con emulatore BlackHawk: e selezioneremo quindi la voce Blackhawk USB2000 - C28343 Controller. Al termine di questa procedura verr` chiuso il programma e verr` avviato il Code a a Composer Studio.

La Scheda di elaborazione

1.3.2

Installazione dei driver dellemulatore

Per la programmazione e la simulazione su Pc della scheda ` necessario utie lizzare un emulatore. Come tutte le periferiche, anche questa va opportunamente installata sul pc attraverso il cd allegato. Il dispositivo a disposizione per questo progetto ` il Blackhawk USB2000. E importante installare correte tamente questo software perch` altrimenti il CCS3 non sar` in grado di trovare e a i le necessari allavvio del sistema per il DSP in nostro possesso.

1.3.3

Note preliminari

Trattandosi di un micro-controllore il programmatore dovr` andare a denire a tutti i parametri delle periferiche interne, dalla frequenza di clock alluso o meno dei vari convertitori, quindi inizializzare tutti i registri di sistema. Queste operazioni risultano estremamente complesse per una persona che si avvicina per la prima volta al mondo dei DSP. Per questo motivo Texas mette a disposizione dellutilizzatore un software chiamato Baseline Software che, una volta installato, copia sullhard disk nella cartella TIF28xxxSysSW un programma esempio dal quale partire per sviluppare i propri progetti. Questultimo programma la scheda in modo che una volta avviato il programma questa faccia lampeggiare il LED integrato. Il lavoro forse pi` complesso, quello di u inizializzare tutto il sistema, viene quindi gi` svolto dal programma creato da a Texas. Ogni utilizzatore pu` poi modicarlo per renderlo pi` coerente alle o u proprie necessit`, ma, per compiere i primi passi nel mondo dei DSP, ` una a e congurazione base che risulta suciente.

1.3.4

Avvio del programma Code Composer Studio

Allavvio il programma presenta sulla sinistra una nestra che mostra i le contenuti nella cartella di lavoro, il resto dello schermo rester` vuoto in quanto non a ` stato ancora aperto nessun progetto. Dal menu project selezioniamo open e e apriamo il progetto FlashingLeds. Il programma vero e proprio di lampeggiamento ` contenuto nella cartella source alla voce FlashingLed-main.c. e Ora lutente ha a disposizione un programma funzionate da modicare per far compiere al DSP i processi che desidera. Questo procedimento operativo ` e stato seguito anche per lo sviluppo del progetto trattato in questa tesi.

1.3 Il sistema di sviluppo

1.3.5

Esecuzione del programma

Per eseguire un programma si collega lemulatore al pc quindi questultimo alla scheda; dal menu debug selezioniamo connect e la scheda verr` connessa a al pc. Una volta generato il programma in linguaggio C dal menu project si seleziona la voce build, il software generer` il le in formato .out per il DSP. a Il comando re-build all ` disponibile anche in formato icona nella project e toolbar, assieme a questa troviamo licona incremental build che realizza un processo pi` rapido andando a riscrivere solamente le parti di codice che u sono state modicate dallultimo build. Dal menu le selezioniamo la voce load program, il programma viene trasferito alla scheda; inne si seleziona dal menu debug la voce run ed il nostro programma verr` eseguito dalla a scheda.

Connect.

Build.

Load.

Run. Figura 1.2: Simulazione

6 1.3.5.1 Luso dei breakpoint

La Scheda di elaborazione

Durante la simulazione di un programma uno degli strumenti pi` utili u per vericare il funzionamento del software ` il breakpoint. Il Code e composer studio permette di inserire breakpoint nel codice semplicemente cliccando sulla colonna grigia alla sinistra del codice. Il breakpoint verr` a aggiunto nel menu dei breakpoint e sar` possibile selezionare la varie a azioni da intraprendere. E infatti possibile, oltre al semplice blocco del programma implementare delle funzioni quali ad esempio leggere o scrivere dati su le. Queste funzionalit` a si sono rivelate, nel nostro progetto, Figura 1.3: Menu Breakpoints. molto utili perch` hanno permesso di e simulare un usso audio che era stato precedentemente salvato in formato testo senza dover realizzare sicamente un circuito di condizionamento del segnale ed utilizzare un dispositivo di riproduzione audio, viceversa la riproduzione del segnale elaborato dalla scheda non ha richiesto hardware esterno come amplicatori e diusori. La procedura ` la seguente: una volta inserito il breakpoint e si apra la property window. Alla voce action si selezioni read data from le, alla voce le va inserito il percorso dove il le risulta salvato inne il campo start address va completato con il simbolo &, seguito dal nome della variabile che si vuole aggiornare con il contenuto del le. E molto importante che il le sia in formato .dat e la prima riga del le deve contenere una particolare stringa di valori formata da: un numero standard, un numero di formato, un indirizzo di partenza, un numero di pagina ed una lunghezza. Il numero standard ` 1651; il numero di formato ` un numero da 1 a 4 che e e rappresenta esadecimali, integer, long, o oat; lindirizzo di partenza del blocco fornisce le informazione a riguardo del salvataggio del blocco; il numero di pagina rappresenta la pagina dal quale il blocco ` stato estratto; la lunghezza e ` la dimensione del blocco. Una possibile stringa di valori ` 1651 2 c00e 1 1. e e

1.3 Il sistema di sviluppo 1.3.5.2 Visualizzazione delle variabili

Risulta molto pratico in fase di simulazione controllare costantemente il valore delle variabili del programma, il Code composer studio permette di visualizzarne il contenuto in tempo reale. Per fare ci` ` suciente selezionare dal o e menu View la voce Watch window. Si aprir` quindi una nestra vuota, a in essa si selezioner` la scheda Watch 1, da qui ` possibile, semplicemente a e scrivendo il nome della variabile, visualizzare il valore aggiornato in tempo reale del contenuto stesso. E ora possibile ora inserire tutte le variabili di nostro interesse. 1.3.5.3 Salvataggio del Workspace

Durante lo sviluppo del progetto ` necessario simularne delle parti, inserire e dei breakpoint, mostrare il contenuto di alcune variabili o altro. Per fare ci` ` necessario congurare tutti questi parametri, quindi aprire nestre di o e visualizzazione e tali settaggi vengono persi alla chiusura del Code Composer Studio. Per evitare ad ogni riavvio di dover ricongurare tutto, il software permette di salvare il proprio workspace, cio` tutti i le aperti, i breakpoint e inseriti, le variabili visualizzate e tutto ci` che ` stato congurato allultimo o e utilizzo. Per eettuare questo ` suciente dal menu le selezionare la voce e Workspace e successivamente save workspace oppure load workspace.

Figura 1.4: Il Sistema di Sviluppo

8 1.3.5.4 Organizzazione della memoria

La Scheda di elaborazione

Il programma di prova visto in precedenza organizza la memoria in due pagine, la pagina uno dedicata al programma mentre la pagina due dedicata ai dati. Le pagine vengono poi ulteriormente divise in blocchi di lunghezza variabile. La pagina dei dati invece ha blocchi di dimensione ssata pari a 2000 byte ciascuno. Per i nostri scopi questa ` una grande limitazione, vogliamo infatti creare e variabili di buer della lunghezza di almeno 22050 campioni. Per risolvere il problema ` suciente modicare il le C28345-RAM-FlashingLeds.CMD, e che ` il le in cui il programmatore gestisce la memoria, pi` precisamente la e u parte relativa alla pagina due. Il codice modicato ` quello mostrato di see guito, si noti che si ` preferito non cancellare la versione precedente del le e ma di trasformare il vecchio codice in commento ed aggiungere il nuovo codice a seguire. I commenti, le parti di codice compreso tra i simboli /* e */ non vengono eseguiti dallelaboratore. MEMORY { ... PAGE 1 : RAMM1 : origin = 0x000400, /* on-chip RAM block M1 */ /* RAML1 : origin = 0x00a000, RAML2 : origin = 0x00C000, RAML3 : origin = 0x00E000, RAML4 : origin = 0x010000, RAML5 : origin = 0x012000, RAML6 : origin = 0x014000, RAML7 : origin = 0x016000, RAMBUFFER : origin = 0x00a000, ZONE7B : origin = 0x20FC00, /* XINTF zone 7 - data space */ RAMHBUFFER : origin = 0x300000, RAMH3 : origin = 0x318000, RAMH4 : origin = 0x320000, RAMH5 : origin = 0x328000, }

length = 0x000400 length length length length length length length length length length length length length = = = = = = = = = = = = = 0x002000 0x002000 0x002000 0x002000 0x002000 0x002000 0x002000 */ 0x00e000 0x000400 0x010000 0x008000 0x008000 0x008000

1.3 Il sistema di sviluppo

Una volta denita la composizione della memoria, sempre nello stesso le C28345-RAM-FlashingLeds.CMD vengono denite le allocazioni delle varie sezioni del codice. Imposteremo quindi che le variabili buer siano allocate nella pagina 1 nelle sezioni create in precedenza RAMBUFFER e RAMHBUFFER come mostra il listato seguente. SECTIONS { /* Setup for "boot to SARAM" mode: The codestart section (found in DSP28_CodeStartBranch.asm) re-directs execution to the start of user code. */ codestart : > BEGIN, PAGE = 0 ramfuncs : > RAML0, PAGE = 0 .text : > RAML0, PAGE = 0 .cinit : > RAML0, PAGE = 0 .pinit : > RAML0, PAGE = 0 .switch : > RAML0, PAGE = 0 .stack .ebss .ebss:buffer .ebss:hbuffer .econst .esysmem ... } Per indirizzare le variabili create nel codice sorgente del programma non sar` suciente dichiarare solamente il tipo ed il nome del vettore ma sar` a a necessario lutilizzo del comando PRAGMA per dichiarare la creazione della variabile e la sua allocazione nella zona di memoria desiderata. Questa sintassi ` mostrata nel codice sorgente riportato di seguito. e #pragma DATA_SECTION(buffer , ".ebss:buffer") int buffer[28000]; //` lungo e000 e #pragma DATA_SECTION(h1buffer , ".ebss:hbuffer") int h1buffer[28000]; #pragma DATA_SECTION(h2buffer , ".ebss:hbuffer") int h2buffer[28000]; : : : : : : > > > > > > RAMM1, PAGE RAML0, PAGE RAMBUFFER, PAGE RAMHBUFFER,PAGE RAML0, PAGE RAMM1, PAGE = = = = = = 1 0 1 1 0 1

10 1.3.5.5 Combinazioni di tasti rapide

La Scheda di elaborazione

Una volta presa condenza con il software per velocizzare la creazione di un progetto diventa naturale lutilizzo di scorciatoie da tastiera, combinazioni di tasti rapide, senza dover cercare le voci nei menu. Di seguito vengono elencate alcune delle funzionalit` pi` utilizzate: a u alt-C Connette il pc alla scheda; ctr-L Apre una nestra nella quale selezionare il programma da caricare nella scheda; ctr-shift-L Carica nella scheda il programma caricato in precedenza con le eventuali modiche apportate; F5 Avvia la simulazione del programma; shift-F5 Blocca lesecuzione del programma; ctr-M Visualizza il le Main, utile quando sono aperte pi` funzioni; u ctr-R Eettua un reset della scheda; F11 Permette lesecuzione di una singola istruzione C, ` una esecuzione passo e passo; F10 Esegue interi cicli di codice; shift-F11 Allinterno di un ciclo permette di nire lesecuzione del ciclo e fermarsi al termine di questo;

Capitolo 2 Filtri Digitali


La maggior parte degli eetti musicali viene generata, partendo dal usso audio originale, semplicemente interponendo tra lingresso e luscita un opportuno ltro. Un semplice esempio pu` essere un equalizzatore, al suo interno ne o contiene diversi che amplicano in modo opportuno determinate frequenze. I ltri qui utilizzati saranno di tipo digitale, dovendo essere elaborati da un processore, e come per i ltri analogici anche quelli digitali vengono classicati in quattro gruppi: passa-basso, passa-alto, passa-banda ed elimina-banda. La modalit` di progettazione genera due tipologie distinte di ltri: i ltri FIR e a quelli IIR. Dallutilizzo combinato di questi si pu` ottenere tutta la gamma di o ltri analogici come i ltri parametrici, e i ltri a pettine.

2.1

Filtri FIR

Il termine FIR ` lacronimo di Finite Impulse Response che appunto signica e risposta impulsiva di durata nita. Dal nome stesso del ltro si pu` capire che o il valore in uscita sar` una combinazione lineare di un numero nito di valori a precedenti. Denendo x il valore in ingresso, h un opportuno coeciente e y il valore del segnale in uscita; matematicamente possiamo esprimere questo concetto come segue:
K

y(n) =
i=0

hi x(n i)

(2.1.1)

e anche gracamente come mostra Figura 2.1.

11

12

Filtri Digitali

Figura 2.1: Struttura di un ltro FIR

2.2 Filtri IIR

13

2.2

Filtri IIR

Lacronimo IIR sta per Innite Impulse Response, cio` risposta impulsiva di e durata innita. Questo signica che il segnale processato dal ltro sar` una a combinazione degli inniti istanti precedente, ovviamente non ha un signicato letterale infatti risulta palese che un sistema non possa avere inniti campioni ma tale espressione ` da interpretare nel senso che lultimo campione in e uscita dal ltro ` formato in parte anche dal contributo dato dal primo. Ci` e o ` possibile in quanto assieme al segnale di ingresso viene elaborata una certa e percentuale del segnale di uscita precedente. Dal punto di vista matematico risulta:
M L

y(n) =
i=1

ai y(n i) +
j=0

bj x(n j)

(2.2.1)

Gracamente si pu` esprimere come in Figura 2.2. o

Figura 2.2: Struttura di un ltro IIR

14

Filtri Digitali

2.3

Filtri Parametrici

I ltri parametrici sono molto utilizzati nella industria del suono perch` hanno e la capacit` di amplicare o attenuare particolarmente speciche frequenze che a compongono il segnale. I parametri di progetto sono la larghezza di banda, il centro di banda, ed il guadagno; da questi, utilizzando delle semplici formule si ricavano i quattro coecienti necessari alla realizzazione del ltro. Sono ltri che hanno una risposta in frequenza che ` per lo pi` piatta e di valore unitario e u sullintero spettro di interesse mentre amplicano o attenuano molto in un intorno ristretto di 0 , come si pu` osservare dalla Figura 2.3. Sono quindi dei o Notch-lter oppure dei Peak-lter a seconda di come vengono impostati i poli e gli zeri della funzione di trasferimento. Esprimendo in termini matematici il valore delluscita risulta: y(n) = b0 x(n) + b1 x(n 1) + b2 x(n 2) + a1 y(n 1) + a2 y(n 2) (2.3.1)

Figura 2.3: Risposta in frequenza di un ltro parametrico

2.4 Filtri a Pettine

15

2.4

Filtri a Pettine

I ltri a pettine, pi` comunemente conosciuti con la loro traduzione inglese u comb-lter, vengono utilizzati per ridurre il disturbo dovuto a segnali periodici e sono impiegati nella generazione di eetti musicali quali leco, il chorus, il anger e il riverbero. Il loro funzionamento ` molto semplice: al segnale e originale viene sommato il segnale ritardato ed attenuato: Questo processo altera lampiezza del segnale in maniera non costante sullo spettro del segnale. Orfanidis [1] nel suo studio, ha dimostrato che tale ltro pu` essere derivato o sia attraverso lutilizzo della struttura FIR sia attraverso quella IIR. Matematicamente i concetti formulati da Orfanidis si possono esprimere cos` : HIIR = b HF IR = 1 + z D 1 az D (2.4.1) (2.4.2)

1 1 z N D N 1 z D

Come dice il nome stesso la risposta in frequenza di questo ltro ha una caratteristica forma a pettine come si pu` notare in Figura 2.4. o

Figura 2.4: Risposta in frequenza di un ltro a pettine

16

Filtri Digitali

Capitolo 3 Eetti Audio


I vari eetti che si possono ricreare vengono suddivisi in eetti audio di ritardo temporale, eetti digitali basati sulla modulazione della linea temporale ed eetti audio basati sulle variazioni del valore di ampiezza. Per la realizzazione dei primi e dei secondi ` necessario introdurre il concetto di linea temporale. e In elettronica digitale un usso audio ` una sequenza di campioni equispaziati e nel tempo di un valore T sample (equivalente a 1/F sample ). Tutti i campioni rispecchiano quindi un valore di ampiezza del segnale in ingresso in un determinato istante. La linea temporale ` quindi un susseguirsi ordinato di questi, e una riproduzione non ordinata dei campioni produce alcuni degli eetti pi` u interessanti nel settore della manipolazione del suono. Gli eetti che sfruttano le modicazioni della linea temporale dovranno quindi necessariamente avere a disposizione intere porzioni del segnale e non solamente un singolo campione; per questo motivo ` necessario dedicare parte di memoria allimmagazzinamene to dei dati. Questo settore di memoria viene chiamato buer ed organizzato secondo lo schema del buer circolare.

3.1

Il buer circolare

La sua importanza, la semplicit` di utilizzo e realizzazione rendono questo strua mento fondamentale per limplementazione digitale di eetti audio. Il buer ` e un dispositivo in grado di immagazzinare informazioni; si pu` immaginare in o termini matematici come un vettore dotato di lunghezza nita. Supponendo di voler immagazzinare dati allinterno del vettore, ogni dato che viene ricevuto ` salvato nella prima posizione. Per fare ci` il codice avrebbe dovuto prevene o tivamente traslare il dato che precedentemente occupava la prima posizione nella seconda, il secondo nella terza il terzo nella quarta e cos` via. Questo procedimento avrebbe un costo computazionale notevole; pensando infatti che 17

18

Eetti Audio

il buer sia formato da 28000 campioni, signica che ad ogni nuovo dato in ingresso il processore dovr` compiere 28000 trasferimenti. Per ovviare a questo a problema si ` sviluppato il concetto di buer circolare: anzich` traslare tutti e e i dati, ed inserire quello in ingresso nella prima posizione, viene considerato variabile lindice del vettore ed incrementato ad ogni nuovo dato. In tal modo i dati vengono lasciati ssi nelle loro posizioni e sostituiti di volta in volta che lindice punta la locazione ed un nuovo dato ` presente allingresso. Quando e poi lindice raggiunge il fondo del vettore basta semplicemente riportarlo alla prima posizione e ricominciare il ciclo. In questo modo ` possibile muoversi e con semplicit` allinterno della linea temporale variando solamente lindice del a buer.

Figura 3.1: Struttura del buer Circolare

3.2

Motivazione delle scelte

Per lo sviluppo di questo progetto ` stato utilizzato il software di calcolo Mate lab, una ` stata una scelta obbligata data dalla facilit` nel suo utilizzo e la sua e a velocit` di simulazione. Si ` deciso quindi di creare un codice per ogni eetto e a e poi una volta testata la funzionalit` si ` convertito il codice in linguaggio C per a e lelaboratore nale, il DSP. Per semplicit` di simulazione in Matlab si ` scelto a e di non creare un sistema in grado di leggere un campione per volta ma si ` e preferito lavorare oine. Questa metodologia richiede quindi di inserire sotto forma di vettore lintero usso audio da elaborare; le modiche da apportare per rendere il codice utilizzabile online sono minime. Per le simulazioni con Matlab non sar` necessario luso del buer circolare. Le funzioni realizzate nel a seguito prevedono, dove possibile, lutilizzo di algoritmi gi` implementati nel a

3.2 Motivazione delle scelte

19

software Matlab, quali ad esempio le funzioni lter e freqz che hanno, per`, la o particolarit` di ricevere in ingresso i vettori contenenti i coecienti del ltro a ed il segnale da ltrare. Risultano molto utili per quel settore di eetti che ha ltri costanti perch` ne rendono il codice pi` snello e di facile lettura. In e u questa categoria rientra la famiglia degli eetti a ritardo temporale. E necessario precisare che tali funzioni nella traduzione al linguaggio C per il DSP sono state sostituite dalla implementazione matematica che le compone. Sono invece totalmente inecaci nel settore della modulazione della linea temporale dove le funzioni lter e freqz non sono state utilizzate; si ` deciso di realizzarle e esplicitamente applicando la relazione matematica che ogni eetto comporta ed utilizzando un ciclo che processa tutto il segnale. Proprio per questo motivo si evidenzia la necessit` di dover lavorare oine. a Un problema che ` stato necessario arontare riguarda la capacit` di memoria e a del DSP. La memoria viene suddivisa di default in sezioni di dimensioni relativamente ridotte per gli usi che ne faremo. La suddivisione della memoria impedisce infatti di creare lunghi vettori in quanto alla dichiarazione del vettore segue un allocamento contiguo di memoria. E stato necessario riprogrammare queste sezioni al ne di accorparne alcune e creare due gruppi di lunghezza e000 e 10000 espressi in base esadecimale (57344 e 65536 in base decimale). Nonostante queste modiche abbiano migliorato la disposizione della memoria per i nostri scopi, non ` stato possibile dedicare ulteriore memoria alle variabili e del software cos` da costringere il programmatore a dedicare solamente 28000 valori per il buer circolare (vedi Figura 3.1). Questa ` stata la motivazione e principale che ha portato alla scelta di una frequenza di campionamento pari a 22050 Hz per ottenere un buer di circa 1,27 secondi, necessario per la realizzazione di eetti quali ad esempio quelli appartenenti alla famiglia del ritardo temporale.

20

Eetti Audio

Capitolo 4 Ritardo temporale


Questa tipologia di eetti si basa su una riproduzione di campioni presenti in ingresso e contemporaneamente di altri allocati in istanti di tempo precedenti, dove per` la distanza temporale resta sempre costante. o

4.1

Delay

Leetto delay ` uno degli eetti pi` semplici da realizzare, ma funge da base e u per la realizzazione di quelli pi` complessi. Fisicamente il delay ` la ripropou e sizione del segnale, in forma attenuata, dopo un certo lasso di tempo. Le onde sonore, emesse dalla sorgente raggiungono lascoltatore in linea sia diretta che indiretta. Le prime dalla sorgente sono ricevute direttamente dallascoltatore, le seconde come conseguenza di diverse riessioni dellonda originale nellambiente circostante, saranno quindi ritardate ed attenuate.

Figura 4.1: Struttura sica del Delay

21

22

Ritardo temporale

Il ritardo ` causa della maggior distanza percorsa mentre il valore di ampieze za inferiore ` una concausa di perdite nel mezzo trasmissivo, propagazione ome nidirezionale e perdite dovute alla non perfetta riessione da parte dellostacolo che non pu` essere denito uno specchio ideale con coeciente di riessione o unitario. Si parla di delay a singola riessione. Limplementazione matematica risulta essere quindi: y(n) = x(n) + ax(n D) (4.1.1)

dove y ` il segnale di uscita, x quello di ingresso, un coeciente di ate tenuazione e D il valore in numero di campioni del ritardo. Alla frequenza di lavoro, 22050 Hz, se si vogliono ottenere 0,5 secondi di ritardo, D sar` uguale a a 11025. La funzione di trasferimento ` quindi: e H(z) = 1 + az D (4.1.2)

Figura 4.2: Implementazione, Delay

Come si vede in Figura 4.3, data la frequenza di campionamento di 22050 Hz, si ` deciso di riproporre la versione riessa del segnale dopo 17640 campioni, e ci` signica 0,8 secondi dopo la versione originale e con una attenuazione di o un fattore 10. Dalla Figura 4.4 si nota invece che in frequenza il ltro ha un comportamento sinusoidale. Questo signica che alcune frequenze vengono amplicate ed altre attenute. Londa che si propaga viene riessa dallostacolo e londa riessa va a sommarsi allonda diretta, a determinate frequenze le due onde saranno perfettamente in fase; producendo cos` un valore di ampiezza maggiore, ad altre le due onde si trovano in contro-fase e la loro somma sar` a quindi inferiore.

4.1 Delay

23

Figura 4.3: Filtro nel tempo, Delay

Figura 4.4: Filtro in frequenza, Delay

24

Ritardo temporale

Eetto Delay function out=delay(in) Fs=22050; %denisce la frequenza di campionamento rit del ms=900; %denisce il ritardo del delay in ms rit del=round(rit del msFs/1000); %ritardo in numero di campioni temp=zeros(rit del, 1); %genera un vettore di zeri per estendere il segnale ingresso=vertcat(in, temp); %estende il segnale b=zeros(1, Fs); %genera il vettore dei coecienti del ltro b(rit del)=0.1; %denisce i coecienti del ltro b(1)=1; %denisce i coecienti del ltro gure(1) stem(b); %stampa a video il ltro title(Risposta nel tempo del ltro) axis([500 Fs 0 1.1]) [H,F] = freqz(b, 1, 10Fs, Fs); %trova la risposta in frequenza del ltro gure(2) plot(F,abs(H)); %stampa a video il ltro title(Risposta in frequenza del ltro) axis([0 20 0.85 1.15]) out=lter(b, 1, ingresso); %eettua il ltraggio del segnale in ingresso soundsc (out,Fs); %riproduce il segnale duscita end

10

12

14

16

18

20

22

24

Il codice ` il listato della funzione Matlab che genera leetto delay. Al e segnale di ingresso viene concatenata una stringa di zeri della lunghezza del ritardo massimo, questo procedimento ` necessario altrimenti lelaborazione e dellultimo campione del segnale di ingresso non verrebbe riprodotta in uscita. Il segnale elaborato con lo scopo di ottenere leetto eco ` necessariamente e pi` lungo del segnale di ingresso in quanto deve prevedere anche la ripetizione u degli ultimi campioni. Come si pu` notare viene generato un vettore b che contiene i coecienti del o ltro FIR che vengono successivamente passati alla funzione lter del Matlab che restituisce il vettore dei campioni uscita. Lutilizzo della funzione lter ha come unico scopo un maggior ordine ed una maggior leggibilit`. La versione a senza tale funzione ` in ogni caso semplice perch` basterebbe semplicemente e e implementare la 4.1.1.

4.1 Delay

25

4.1.1

Parametri

I parametri che ` possibile gestire per generare leetto che pi` soddisfa le e u speciche dellutente sono: Ritardo del delay in questo progetto si pu` variare tra 0 e 1 secondi; o Valore di ampiezza del segnale ritardato ` stato selezionato un valore e pari a 0,1;

26

Ritardo temporale

4.2

Slapback Eco

Con la stessa architettura vista per leetto delay, Figura 4.5, modicando solamente il ritardo della versione traslata si possono ottenere varianti interessanti come ad esempio lo Slapback Eco. Questultimo ha la particolarit` a di avere un ritardo estremamente breve (intorno ai 15-40 millisecondi) ed un rapporto unitario tra segnale originale e copia traslata, per evitare possibili overow vengono quindi amplicati entrambi di un fattore 1/2. La formula risulta essere sempre: y(n) = ax(n) + ax(n D) (4.2.1)

Questa volta quindi con un D molto piccolo ed il coeciente a pari a 0,5.

Figura 4.5: Implementazione, Slapback Eco

Il comportamento del ltro utilizzato si pu` vedere in formato graco in o Figura 4.6 nella sua versione nel tempo e in Figura 4.7 nella sua versione in frequenza. Si nota la tipica forma a pettine che permette di realizzare questa tipologia di eetti.

4.2.1

Parametri

I parametri che ` possibile gestire per generare leetto che pi` soddisfa le e u speciche dellutente sono: Ritardo del delay per ottenere un eetto realistico il ritardo deve essere compreso tra i 15 e i 40 millisecondi; Valore di ampiezza del segnale ritardato per un eetto migliore ` cone sigliabile mantenere la congurazione proposta in questa tesi con i due coecienti uguali e pari a 0,5;

4.2 Slapback Eco

27

Figura 4.6: Filtro nel tempo, Slapback Eco

Figura 4.7: Filtro in frequenza, Slapback Eco

28

Ritardo temporale

Eetto Slapback Eco function out=slapback(in) Fs=22050; %denisce la frequenza di campionamento rit eco ms=20; %denisce il ritardo delleco in ms rit eco=round(rit eco msFs/1000); %ritardo in numero di campioni temp=zeros(rit eco, 1); %genera un vettore di zeri per estendere il segnale ingresso=vertcat(in, temp); %estende il segnale b=zeros(1, Fs); %genera il vettore dei coecienti del ltro b(rit eco)=0.5; %denisce i coecienti del ltro b(1)=0.5; %denisce i coecienti del ltro gure(1) stem(b); %stampa a video il ltro title(Risposta nel tempo del ltro) axis([500 Fs 0 1.1]) [H,F] = freqz(b, 1, 10Fs, Fs); %trova la risposta in frequenza del ltro gure(2) plot(F,abs(H)); %stampa a video il ltro title(Risposta in frequenza del ltro) axis([0 150 0.15 1.15]) out=lter(b, 1, ingresso); %eettua il ltraggio del segnale in ingresso soundsc (out,Fs); %riproduce il segnale duscita end

10

12

14

16

18

20

22

24

Il codice Matlab riportato realizza la funzione delleetto. Leetto Slapback, seppur molto semplice restituisce un segnale che fa si che limpressione dellascoltatore sia che ad interpretare il brano siano due musicisti; da infatti maggior una profondit` allaudio. Vedremo in seguito che esistono algoritmi a pi` ranati per generare questo tipo di percezione. Applicando questo algou ritmo ad un usso audio che riproduce della voce in uscita avremo un suono quasi metallico.

4.3 Multi-tap Eco

29

4.3

Multi-tap Eco

Anche questo secondo eetto ` una elaborazione del delay. Per generarlo ` e e suciente implementare una sequenza di delay (eco), questo permette di ottenere un suono pi` realistico, che ripropone pi` versioni ritardate e attenuate u u del segnale originale. In questo progetto si ` implementato un tri-tap eco, sono e presenti 3 riproposizioni con attenuazioni e ritardi diversi. Limplementazione matematica del ltro ` la seguente: e y(n) = x(n) + a1 x(n D) + a2 x(n 2D) + a3 x(n 3D) e la funzione del ltro risulta essere: H(z) = 1 + a1 z D + a2 z 2D + a3 z 3D (4.3.2)

(4.3.1)

In questo progetto, a causa di una ristrettezza della memoria da dedicare ai buer, si ` deciso di utilizzare come ritardo base D un valore di 8820 campioni e che corrisponde a 400 millisecondi come si vede in Figura 4.9 . E decisamente troppo poco per ricreare leetto di un eco in alta montagna, infatti sapendo che la velocit` del suono ` di circa 343 m/s possiamo stimare che con questo a e algoritmo la distanza dallostacolo riettente sia solamente di 68 metri circa. Utilizzando DSP dotati di maggiore memoria, sar` suciente modicare a il codice sorgente e pi` precisamente la variabile rit eco ms al valore che si u desidera.

Figura 4.8: Implementazione, Multi-tap Eco

30

Ritardo temporale

Figura 4.9: Filtro nel tempo, Multi-tap Eco

Figura 4.10: Filtro in frequenza, Multi-tap Eco

4.3 Multi-tap Eco

31

Eetto Multitap Eco function out=multitap(in) Fs=22050; %denisce la frequenza di campionamento rit eco ms=400; %denisce il ritardo delleco in ms rit eco=round(rit eco msFs/1000); %ritardo in numero di campioni temp=zeros(3rit eco, 1); %genera un vettore di zeri per estendere il segnale ingresso=vertcat(in, temp); %estende il segnale b=zeros(1, Fs); %genera il vettore dei coecienti del ltro b(rit eco)=0.1; %denisce i coecienti del ltro b(2rit eco)=0.05; %denisce i coecienti del ltro b(2rit eco)=0.025; %denisce i coecienti del ltro b(1)=1; %denisce i coecienti del ltro gure(1) stem(b); %stampa a video il ltro title(Risposta nel tempo del ltro) axis([500 Fs 0 1.1]) [H,F] = freqz(b, 1, 10Fs, Fs); %trova la risposta in frequenza del ltro gure(2) plot(F,abs(H)); %stampa a video il ltro title(Risposta in frequenza del ltro) axis([0 20 0.85 1.2]) out=lter(b, 1, ingresso); %eettua il ltraggio del segnale in ingresso soundsc (out,Fs); %riproduce il segnale duscita end

10

12

14

16

18

20

22

24

26

4.3.1

Parametri

I parametri che ` possibile gestire per generare leetto che pi` soddisfa le e u speciche dellutente sono: Ritardo del delay base in questo progetto non pu` superare i 0,4 secondi, o in caso di DSP con maggiore memoria ` possibile aumentarlo; e Valore di ampiezza dei singoli segnali ritardati buona norma ` ricordare e che la somma di tutti coecienti non deve scostarsi troppo da 1 per evitare possibili distorsioni per overow nel segnale di uscita;

32

Ritardo temporale

Capitolo 5 Modulazione della linea temporale


Questa classe di eetti trova le sue basi nella variazione della linea temporale. Vengono riprodotti sia i campioni del segnale originale sia alcuni campioni che compongono la linea temporale, con la condizione che non ` necessario e mantenere costante il ritardo D.

5.1

Chorus

Il chorus ` uno degli eetti pi` utilizzati e pi` interessanti perch` il usso e u u e audio elaborato ha una profondit` e un corpo che lo rendono particolarmente a piacevole allascolto. D` limpressione che pi` musicisti stiano suonando lo a u stesso brano anche se in realt` il musicista ` uno solo. Limplementazione ` a e e basata sulla cella delay. I due musicisti non saranno mai perfettamente sincronizzati; si ` stimato che il ritardo massimo ` compreso circa tra i 15 e i e e 35 millisecondi; non solo, anche il valore dellampiezza del segnale non sar` a sempre lo stesso quindi anche questo valore varier` di intensit` nel tempo. Il a a usso audio di uscita sar` quindi la sovrapposizione del segnale originale e a una versione traslata con un ritardo variabile e amplicata con un coeciente anchesso variabile nel tempo. Per ottenere un risultato ottimale ` necessario e che il ritardo venga modulato da un oscillatore a bassa frequenza casuale (random low-frequency oscillator); per lo sviluppo di questo progetto ` stato invece e scelto, per comodit` di programmazione, di utilizzare una sinusoide a bassa a frequenza.

33

34

Modulazione della linea temporale

Matematicamente possiamo esprimere questi concetti come mostrato di seguito: y(n) = a1 x(n) + a2 (n)x(n D(n)) la cui implementazione risulta essere quella mostrata in Figura 5.1 (5.1.1)

Figura 5.1: Implementazione, Chorus

Figura 5.2: Filtro in frequenza, Chorus

5.1 Chorus

35

Nellespressione precedente, a1 ` ssato a 0,5 per evitare possibili distore sioni dovute a overow del segnale e a2 invece `, come mostra Figura 5.3, un e segnale sinusoidale lentamente variabile (0,3 Hz). Il termine D, che rappresenta il ritardo, ` anche un segnale sinusoidale lentamente variabile (0,1 Hz), e rappresentato in Figura 5.3. a2 (n) = (1 + V ariazione)cos(2nT sF a) D(n) = Ritardo massimo (1 + sin(2nT sF d)) 2 (5.1.2) (5.1.3)

Figura 5.3: Coecienti, Chorus

36

Modulazione della linea temporale

5.1.1

Parametri

Per leetto chorus i parametri che lutente pu` denire sono molti e si possono o suddividere in parametri di ampiezza e parametri di ritardo. Una rappresentazione graca dei parametri di ritardo ` in Figura 5.4 e Valore di variazione percentuale dellampiezza designa quanto lintensit` della seconda versione del segnale si discosta dalla prima; a Frequenza della sinusoide che modula la variazione di ampiezza ` un e valore tipicamente inferiore ad 1 Hz, per valori superiori si prola una distorsione eccessiva del segnale che deteriore le caratteristiche stesse delleetto; Ritardo nominale denisce la profondit` media del ritardo applicato, in a questo progetto ` stata ssata a met` del ritardo massimo; e a Frequenza della sinusoide che modula la variazione temporale coeciente ssato attorno a qualche frazione di Hz, variazioni troppo rapide producono infatti modicazioni della frequenza del segnale originale;

Figura 5.4: Parametri ritardo, Chorus

5.1 Chorus

37

Eetto Chorus function out=chorus(in) Fs=22050; %denisce la frequenza di campionamento Ts=1/Fs; Fa=0.3; %frequenza che modula la variazione di ampiezza Fd=0.1; %frequenza che modula la variazione di ritardo rit cho ms=25; %denisce il ritardo delleco in ms rit cho max=round(rit cho msFs/1000); %ritardo massimo in campioni amp var max=30; %massima variazione di ampiezza percentuale temp=zeros(rit cho max, 1); %genera un vettore per estendere il segnale ingresso=vertcat(in, temp); %estende il segnale lung=length(ingresso); n=0:1:lung; s=round((rit cho max/2)(1+sin(2piTsFdn))); p=(1+(amp var max/100)cos(2piTsFan)); out=zeros(lung,1); for i=1:lung %eettua il ltraggio a=is(i); if (a<=0); a=1; end; out(i)=0.5ingresso(i)+0.5p(i)ingresso(a); end; gure(1) %stampa a video i segnali subplot(2,1,1), plot(ingresso); title(segnale ingresso); subplot(2,1,2), plot(out); title(segnale uscita); gure(2) %stampa a video i coecienti subplot(2,1,1), plot(p); title(fattore di ampiezza); subplot(2,1,2), plot(s); title(coeciente di ritardo); soundsc (out,Fs); %riproduce il segnale duscita end

10

12

14

16

18

20

22

24

26

28

30

32

34

36

38

Modulazione della linea temporale

Come si vede dal listato Matlab per questa implementazione non ` stato e possibile utilizzare la funzione lter, in quanto i coecienti b del ltro sono variabili nel tempo. Per ovviare a ci` si ` deciso di realizzare esplicitamente lo o e stesso algoritmo della funzione lter con le opportune modiche per rendere variabili i coecienti. Si realizza quindi un ciclo FOR che percorre tutta la lunghezza del segnale e applica la 5.1.1. Questo procedimento ` possibile e solamente perch` stiamo elaborando segnali oine, cio` elaboriamo i dati dopo e e averli acquisiti completamente. Il codice che invece ` stato implementato sul e DSP prevede comunque una elaborazione in real time. In appendice ` possibile e trovare il listato di questo codice.

5.2 Flanger

39

5.2

Flanger

Leetto Flanger origina da un evento fortuito; la leggenda vuole che un tecnico del suono in fase di registrazione di uno stesso brano su due nastri magnetici cercando di riprodurre un eetto di sdoppiamento si rese conto che variando la velocit` relativa tra i due nastri si otteneva un eetto simile a quello crea ato dalle turbine dei jet, uno swooshing. Limplementazione di questo si basa quindi su una diversa velocit` di riproduzione di un brano che va a sommarsi a al brano riprodotto alla velocit` corretta. La struttura ` quindi identica a a e quella delleetto chorus con la dierenza che i coecienti di amplicazione sono costanti e pari a 0,5 al ne di evitare possibili problemi di overow e la modulazione del ritardo non avviene tramite un oscillatore casuale a bassa frequenza ma seguendo una sinusoide. Mentre per il chorus il ritardo era compreso tra i 15 e i 35 millisecondi per ottenere un buon risultato il anger deve avere un ritardo compreso tra 0,25 e 25 millisecondi. Matematicamente: y(n) = 0, 5x(n) + 0, 5x(n D(n)) dove D(n) ` appunto un segnale lentamente variabile. e Ritardo massimo (1 cos(2nT sF d)) (5.2.2) 2 Questi concetti vengono poi implementati quindi nella forma che si pu` trovare o D(n) = sotto. (5.2.1)

Figura 5.5: Implementazione, Flanger Come si pu` vedere in Figura 5.7 il valore del ritardo varia sinusoidalmente o tra 0 e 221 campioni che corrispondono a 10 millisecondi. Viene maggiormente apprezzato se applicato a segnali musicali piuttosto che a segnali vocali.

40

Modulazione della linea temporale

Figura 5.6: Filtro in frequenza, Flanger

Figura 5.7: Coeciente, Flanger

5.2 Flanger

41

5.2.1

Parametri

Per leetto anger i parametri che lutente pu` denire sono: o Ritardo nominale ` la profondit` media del ritardo applicato, in questo e a progetto, ` stata ssata a met` del ritardo massimo; e a Ritardo massimo ` la profondit` massimo del ritardo applicato; e a Frequenza della sinusoide che modula la variazione temporale ` il coe eciente ssato attorno a qualche frazione di Hz, variazioni troppo rapide producono infatti modicazioni della frequenza del segnale originale, in questo progetto si ` deciso di imporla pari a 0,5 Hz; e

42

Modulazione della linea temporale

Eetto Flanger function out=anger(in) Fs=22050; %denisce la frequenza di campionamento Ts=1/Fs; Fd=0.5; %frequenza che modula la variazione di ritardo rit a ms=20; %denisce il ritardo delleco in ms rit a max=round(rit a msFs/1000); %ritardo massimo in campioni temp=zeros(rit a max, 1); %genera un vettore per estendere il segnale ingresso=vertcat(in, temp); %estende il segnale lung=length(ingresso); n=0:1:lung; s=round((rit a max/2)(1cos(2piTsFdn))); out=zeros(lung,1); for i=1:lung a=is(i); if (a<=0); a=1; end; out(i)=0.5ingresso(i)+0.5ingresso(a); end gure(1) %stampa a video i segnali subplot(2,1,1), plot(ingresso); title(segnale ingresso); subplot(2,1,2), plot(out); title(segnale uscita); gure(2) %stampa a video i coecienti plot(s); title(coeciente di ritardo); soundsc (out,Fs); end

10

12

14

16

18

20

22

24

26

28

30

32

5.3 Vibrato

43

5.3

Vibrato

Il vibrato si pone come obbiettivo quello di simulare quel particolare eetto che genera un chitarrista quando muove la whammy bar oppure un violinista quando muove ciclicamente la mano sinistra sulle corde. Fisicamente ` e una modicazione ciclica e ripetitiva della frequenza del segnale attorno alla frequenza originale. Il segnale avr` quindi un susseguirsi di suoni la cui a frequenza si incrementa e decrementa. Ipotizziamo per semplicit` di voler sota toporre allelaboratore una nota di violino, come sappiamo ogni nota ha la sua determinata frequenza che la rende distinguibile dalle altre, luscita sar` un a suono variabile con continuit` e sonorit` che diventano pi` acute e pi` gravi a a u u nellintorno della nota originale. La struttura implementativa ricalca a grandi linee quella degli altri eetti che fanno parte della famiglia della modulazione del ritardo. Infatti come si pu` vedere in Figura 5.8 ` presente un ltro che introduce un ritardo variabile, o e modulato da una sinusoide. A dierenza per` delle altre strutture questa non o prevede la sovrapposizione di due segnali, il segnale originale viene cancellato e riprodotto solamente quello elaborato. Questi concetti vengono espressi matematicamente dalle seguenti relazioni. y(n) = x(n D(n)) con D(n) = Ritardo massimo (1 + sin(2nT sF d)) 2 (5.3.1) (5.3.2)

Figura 5.8: Implementazione, Vibrato

Nellesempio proposto in questa tesi si ` ssato il ritardo massimo a 3 e millisecondi ed una frequenza Fd di 10 Hz, come si vede in Figura 5.9 .

44

Modulazione della linea temporale

Aumentando il valore di ritardo massimo viene aumentato il range di frequenze esplorato dal segnale attorno alla frequenza portante della nota in ingresso mentre modicando la frequenza Fd varia il numero di ripetizioni cicliche che si creano.

Figura 5.9: Coeciente, Vibrato

5.3.1

Parametri

Per leetto vibrato i parametri che lutente pu` denire sono: o Profondit` del ritardo ovvero la variazione di frequenze attorno alla frea quenza di ingresso; Frequenza di ripetizione rappresenta il numero di cicli da eettuarsi in un secondo;

5.3 Vibrato

45

Eetto Vibrato function out=vibrato(in) Fs=22050; %denisce la frequenza di campionamento Ts=1/Fs; Fd=10; %frequenza che modula la variazione di ritardo rit vib ms=3; %denisce il ritardo delleco in ms rit vib max=round(rit vib msFs/1000); %ritardo massimo in campioni temp=zeros(rit vib max, 1); %genera un vettore per estendere il segnale ingresso=vertcat(in, temp); %estende il segnale lung=length(ingresso); n=0:1:lung; s=round((rit vib max/2)(1+sin(2piTsFdn))); out=zeros(lung,1); for i=1:lung %eettua il ltraggio a=is(i); if (a<=0); a=1; end; out(i)=ingresso(a); end; gure(1) %stampa a video i segnali subplot(2,1,1), plot(ingresso); title(segnale ingresso); subplot(2,1,2), plot(out); title(segnale uscita); gure(2) %stampa a video il coeciente plot(s); title(coeciente di ritardo); axis([0 22050 0 80]) soundsc (out,Fs); %riproduce il segnale duscita end

10

12

14

16

18

20

22

24

26

28

30

32

46

Modulazione della linea temporale

5.4

Pitch Shifter

Il pitch shifter ` uno dei pi` interessanti ed utilizzati eetti per la modicazione e u del timbro della sorgente. Viene realizzato in due diversi modi, utilizzando la struttura implementativa del chorus, se si vuole ottenere un segnale in uscita che ` una sovrapposizione del segnale originale e quello alterato, oppure e la struttura del vibrato, che quindi riproduce in uscita solamente il segnale modicato. La dierenza rispetto a queste due strutture ` il modulante del e ritardo, per chorus e vibrato era infatti un segnale sinusoidale, per generare questo particolare eetto viene usata un rampa o meglio un segnale e dente di sega. Viene applicato cio` un ritardo che varia linearmente no ad un massimo e per poi ripartire da zero come si vede in Figura 5.11. Modicare il timbro della sorgente restituisce, applicato alla voce, un usso audio nel quale ` possibile di e distinguere chiaramente il contenuto ma la voce risulta irriconoscibile. Viene comunemente applicato nelle interviste televisive in cui linterlocutore vuole restare anonimo. Questi concetti possono essere espressi matematicamente: y(n) = x(D(n)) dove D(n) ` come mostra Figura 5.11 un segnale a dente di sega. e (5.4.1)

Figura 5.10: Implementazione, Pitch Shifter Come si pu` vedere in Figura 5.10 il segnale modulato con il ritardo vario abile viene, prima di essere portato in uscita, ltrato da un ltro passa basso. Questa operazione risulta necessaria per ottenere un segnale dal contenuto distinguibile e per attenuare le alte frequenze che vengono a crearsi in seguito alla modulazione del ritardo. Il ltro che si ` deciso di usare ` mostrato in e e Figura 5.12 ed ha una frequenza della banda passante di 3000Hz e quella della banda attenuata di 3500Hz. Tale ltro viene creato con le funzioni Matlab ellipord ed ellip che restituiscono i coecienti del ltro ellittico. Luscita viene poi generata dalla funzione Matlab lter.

5.4 Pitch Shifter

47

Figura 5.11: Coeciente, Pitch Shifter

Figura 5.12: Filtro Passa-basso, Pitch Shifter

48

Modulazione della linea temporale

5.4.1

Parametri

Per leetto Pitch Shifter i parametri che lutente pu` denire sono: o Profondit` del ritardo ovvero la variazione di frequenze attorno alla frea quenza di ingresso; Pendenza della rampa imposta la velocit` con cui avviene la variazione di a frequenza, denendo un valore troppo alto il segnale elaborato presenta frequenze troppo elevate ed il contenuto diventa indistiguibile, sperimentalmente ` stato ssato il valore di 2.5 che comporta un buon comproe messo tra irriconoscibilit` della voce e distinguibilit` del contenuto; a a

5.4 Pitch Shifter

49

Eetto Pitch shifter function out=pitch shifter(in) Fs=22050; %denisce la frequenza di campionamento indice=1; rit pit ms=4; %denisce il ritardo in ms rit pit max=round(rit pit msFs/1000); %ritardo massimo in campioni temp=zeros(rit pit max, 1); %genera un vettore per estendere il segnale ingresso=vertcat(in, temp); %estende il segnale lung=length(ingresso); out temp=zeros(lung,1); saw=zeros(lung,1); for i=1:lung %eettua il ltraggio while (indice>=rit pit max); indice=indicerit pit max; %genero il segnale a dente di sega end; %utilizzando lasse dei tempi saw(i)=round(2.5indice); %come base e la variabile indice a=(isaw(i)); %tiene conto dellazzeramento ogni if (a<=0); %volta che si raggiunge il valore massimo a=1; end; out temp(i)=ingresso(a); indice=i; end; Rp=20log10(0.95); Rs=20log10(0.05); Wp=3000/Fs2; Ws=3500/Fs2; [N, Wn] = ellipord(Wp, Ws, Rp, Rs); [b, a]=ellip (N,Rp,Rs,Wn); [H, f]=freqz(b,a,220500,Fs); out=lter(b,a,out temp); gure(1) %stampa a video i segnali subplot(2,1,1), plot(ingresso); axis([0 lung 1.1 1.1]) title(Segnale in ingresso); subplot(2,1,2), plot(out); axis([0 lung 1.1 1.1]) title(Segnale in uscita); gure(2) %stampa a video i coecienti plot(saw); title(Coeciente di ritardo); axis([0 350 0 250]) gure(3) %stampa a video i coecienti plot(f, abs(H)); title(Filtro passa basso); soundsc (out,Fs); %riproduce il segnale duscita end

10

12

14

16

18

20

22

24

26

28

30

32

34

36

38

40

42

44

46

48

50

50

Modulazione della linea temporale

Capitolo 6 Riverbero digitale


E chiamato riverbero leetto sonoro che si produce in un grande ambiente. E quasi certamente una delle elaborazioni pi` complesse da realizzare in quanto u per ottenere un eetto realistico sono necessarie diverse manipolazioni successive del segnale. M.A Schroeder e James A. Moorer svilupparono un algoritmo che permetteva di ottenere una simulazione sucientemente realistica, lalgoritmo da loro proposto sar` quello che verr` utilizzato e studiato in a a questa tesi. Analizziamo ora in dettaglio quali sicamente siano i fattori che producono leetto riverbero. Il usso audio ricevuto dallascoltatore ` una e combinazione lineare di principalmente tre contributi: il primo dovuto alla ricezione diretta (direct sound ), il secondo dalla formato dalle riessioni singole (early reections) mentre il terzo composto dalle riessioni multiple (late reections).

Figura 6.1: Risposta Impulsiva, Riverbero Le riessioni singole rappresentano sicamente le onde che, rimbalzando contro le pareti della grande sala, raggiungono lascoltatore entro un ritardo massimo di 100 millisecondi, dopo tale ritardo vengono denite late reections. 51

52

Riverbero digitale

Possiamo denire le late reections anche come riessioni multiple in quanto avendo un ritardo superiore a 100 millisecondi, signica che hanno subito diverse riessioni su pareti diverse prima di giungere allascoltatore. In Figura 6.1 possiamo vedere la risposta impulsiva generata da un grande auditorium e notare quindi la composizione del segnale ricevuto. Moorer in [2] prosegu` gli studi e propose un nuovo algoritmo che imposta il problema come una combinazione lineare di tre contributi. Il segnale in uscita ` composto infatti dal e segnale originale, dalluscita di un ltro FIR che genera 18 ritardi diversi e da una componente che deriva da un banco di sei ltri a pettine passa-basso che generano le riessioni multiple. Lo schema implementativo risulta quindi quello di Figura 6.2.

Figura 6.2: Implementazione, Riverbero Filtro FIR: Il ltro FIR genera una serie di delay molto ravvicinati; il pi` ritardato infatti ` denito solamente ad 80 millisecondi circa. Dagli studi u e svolti da Moorer ` emerso che per ottenere un suono realistico ` suciente e e riprodurre 18 delay con ampiezze e ritardi che soddisfano i valori mostrati in Figura 6.3 ed elencati nella Tabella 6.1.

53

Figura 6.3: Filtro FIR, Riverbero Ritardo in ms 43 215 225 268 270 298 459 485 572 587 595 612 707 708 726 741 753 797 Ritardo in campioni 95 475 497 592 596 658 1011 1070 1262 1295 1313 1350 1560 1562 1601 1634 1661 1758 Ampiezza .841 .504 .490 .379 .380 .346 .289 .272 .192 .193 .217 .181 .180 .181 .176 .142 .167 .134

Tabella 6.1: Coecienti del ltro FIR, Riverbero

54

Riverbero digitale

Filtri a Pettine Passa-Basso: il banco di sei ltri a pettine passa-basso ` stato inserito in cascata al ltro FIR per generare innite ripetizioni attenue ate che generano quindi le late reections. Moorer ha dimostrato che lutilizzo di sei ltri IIR ottimizza il rapporto tra la qualit` del risultato ed il costo a computazionale, si ` dimostrato infatti che lutilizzo di ulteriori stadi apporta e migliorie trascurabili. I ltri IIR implementati sono inoltre dei passa basso, questa particolarit` ` stata ricercata da Moorer in quanto studiando sicaa e mente le onde sonore ha dimostrato che le alte frequenze vengono attenuate dal mezzo trasmissivo e dalle pareti riettenti molto di pi` rispetto alle basse u frequenze, segnali a 4 kHz subiscono infatti una attenuazione di oltre 60 dB rispetto ad altri attorno ad 1 kHz. Moorer poi nel suo trattato sullargomento ha sviluppato una struttura per la cella che contiene allinterno del loop il ltro passa basso; struttura rappresentata in Figura 6.4

Figura 6.4: Cella IIR, Riverbero Matematicamente possiamo esprimere la cella come segue y(n) = x(n m) + g2 y(n m) + g1 g2 y(n m 1); (6.0.1)

6.1 Parametri Ritardo in ms 50 56 61 68 72 78 Ritardo in campioni 1103 1235 1345 1500 1588 1720 g1 .24 .26 .28 .29 .30 .32 g2 .63 .61 .60 .59 .58 .56

55

Tabella 6.2: Coecienti dei ltri IIR, Riverbero I coecienti dei sei ltri sono stati impostati seguendo le direttive suggerite dagli studi di Moorer e riportati in Tabella 6.2 I coecienti g1 sono dei coecienti consigliati da Moorer mentre per trovare i coecienti g2 ` necessario prima imporre il tempo di riverbero, ad e esempio, 2 secondi. Dalla formula 6.0.2 ricaviamo il termine g ed ora per trovare il coeciente g2 cercato baster` risolvere la formula 6.0.3. a g = 1 (0.366/T ); g2 = g(1 g1 ); (6.0.2) (6.0.3)

6.1

Parametri

Per leetto riverbero i parametri di progetto sono quasi tutti ottimizzati dagli studi di Moorer quindi ` consigliabile non modicare i vari ritardi dei ltri e e i coecienti g1 . Lunica variabile che risulta modicabile dallutente risulta essere: Variabile temporale T ` il tempo di riverbero. In questo progetto si ` deciso e e di imporlo pari a due secondi. Ricordiamo che in caso di modiche su tale parametro ` necessario in seguito ricalcolare la variabile g ed i sei e coecienti g2 del ltro IIR.

56

Riverbero digitale

Eetto Riverbero Digitale function out=riverbero(in) lunghezza=length(in); Fs=22050; q=zeros(lunghezza+15000,1); y=zeros(lunghezza+15000,1); y1=zeros(lunghezza+15000,1); y2=zeros(lunghezza+15000,1); y3=zeros(lunghezza+15000,1); y4=zeros(lunghezza+15000,1); y5=zeros(lunghezza+15000,1); y6=zeros(lunghezza+15000,1); u=zeros(lunghezza+15000,1); m=zeros(15000,1); out=zeros(lunghezza+15000,1); k=vertcat(in,m); ampli=[.841,.504,.490,.379,.380,.346,.289,.272, .192,.193,.217,.181,.180,.181,.176,.142,.167,.134]; ritar=[95,475,497,592,596,658,1011,1070,1262, 1295,1313,1350,1560,1562,1601,1634,1661,1758]; g1=[.24,.26,.28,.29,.30,.32]; g2=[.63,.61,.60,.59,.58,.56]; ritar1=[1103,1235,1345,1500,1588,1720]; a1=1; a2=0.25; a3=0.075; alfa=0.7; %EARLY REFLECTIONS

10

12

14

16

18

20

22

24

26

28

30

32

34

36

38

40

for i=1:(lunghezza+15000); for j=1:18; a=(iritar(j)); if (a<=0); a=1; end; q(i)=q(i)+ampli(j)k(a); end; end;

6.1 Parametri

57

%LATE REFLECTIONS

10

12

14

for p=1:(lunghezza+15000); l=1; r=pritar1(l); if (r<=0);r=lunghezza+15000; end; s=r1; if (s<=0); s=lunghezza+15000; end; y1(p)=q(r)+g2(l)y1(r)+g1(l)g2(l)y1(s); end; for p=1:(lunghezza+15000); l=2; r=pritar1(l); if (r<=0);r=lunghezza+15000; end; s=r1; if (s<=0); s=lunghezza+15000; end; y2(p)=q(r)+g2(l)y2(r)+g1(l)g2(l)y2(s); end; for p=1:(lunghezza+15000); l=3; r=pritar1(l); if (r<=0);r=lunghezza+15000; end; s=r1; if (s<=0); s=lunghezza+15000; end; y3(p)=q(r)+g2(l)y3(r)+g1(l)g2(l)y3(s); end; for p=1:(lunghezza+15000); l=4; r=pritar1(l); if (r<=0);r=lunghezza+15000; end; s=r1; if (s<=0); s=lunghezza+15000; end; y4(p)=q(r)+g2(l)y4(r)+g1(l)g2(l)y4(s); end;

16

18

20

22

24

26

28

30

32

34

36

38

40

42

44

58

Riverbero digitale

10

12

14

16

18

20

for p=1:(lunghezza+15000); l=5; r=pritar1(l); if (r<=0);r=lunghezza+15000; end; s=r1; if (s<=0); s=lunghezza+15000; end; y5(p)=q(r)+g2(l)y5(r)+g1(l)g2(l)y5(s); end; for p=1:(lunghezza+15000); l=6; r=pritar1(l); if (r<=0);r=lunghezza+15000; end; s=r1; if (s<=0); s=lunghezza+15000; end; y6(p)=q(r)+g2(l)y6(r)+g1(l)g2(l)y6(s); end; y=(y1+y2+y3+y4+y5+y6);

22

24

26

28

30

for t=1:lunghezza+15000; w=(t130); %circa 6 millisecondi if w<=0; w=1; end; u(t)=alfay(t)+alfau(w)+y(w); end;

32

34

36

for s=1:lunghezza+15000; out(s)=a1k(s)+a2q(s)+a3u(s); end; soundsc(out,Fs); end

Capitolo 7 Variazione di Ampiezza


7.1 Distorsione

La distorsione ` un semplice eetto utilizzato per dare incisivit` al suono di e a strumenti musicali quali, ad esempio, le chitarre. Leetto consiste nel creare un segnale di uscita che non ha una corrispondenza lineare con quello in ingresso. Per ottenere questo risultato si possono adottare due metodologie dierenti: amplicare il segnale al tal punto da portare i picchi pi` alti oltre u la soglia di fondo scala oppure troncare le componenti con valore di ampiezza superiore ad un soglia ssata. Leetto che si ottiene ` lo stesso perch`, rie e cordiamo che, sia nei sistemi digitali che in quelli analogici, la componente di ampiezza risulta sempre limitata entro un certo intervallo dato dalla tensione massima di uscita negli amplicatori analogici e dalla dimensione nita delle variabili nei sistemi digitali. In questo progetto si ` deciso di sviluppare la e metodologia del troncamento dellampiezza; laltra via avrebbe, infatti, comportato un costo computazionale superiore in quanto il segnale avrebbe dovuto essere prima amplicato portando i picchi pi` alti fuori scala e poi attenuato u per riportare lampiezza del segnale al valore originale per non modicare il volume del usso audio.

Figura 7.1: Implementazione, Distorsione 59

60

Variazione di Ampiezza

La struttura implementativa risulta perci` quella mostrata in Figura 7.1 o dove si sono disegnate due bande orizzontali che deniscono il valore di soglia. I due picchi negativi che si notano in Figura 7.1 saranno quindi troncati dal processo. Matematicamente si pu` esprimere questo concetto come segue: o y(n) = x(n) mentre |y(n)| = soglia se |x(n)| soglia (7.1.2) se |x(n)| < soglia (7.1.1)

Risulta molto utile per capire il concetto espresso osservare la Figura 7.2 dove viene mostrato il usso audio originale nel tempo e quello elaborato dal DSP. In questo esempio si ` ssata una soglia pari al 10 % del segnale originale. e Si pu` vedere infatti come, essendo il segnale di ingresso normalizzato ad 1, o il segnale di uscita non presenti valori di ampiezza superiori a 0,1; quelli che superavano la soglia sono stati infatti troncati a tale valore.

Figura 7.2: Segnali nel tempo, Distorsione

7.1 Distorsione

61

Eetto Distorsione function out=distorsione(in) Fs=22050; soglia percentuale=25; %denisce il valore della soglia massimo=max(in); soglia=(soglia percentuale/100)massimo; lung=length(in); out=zeros(lung,1); for i=1:lung %applica lalgoritmo delleetto if in(i)>soglia; out(i)=soglia; elseif in(i)<soglia; out(i)=soglia; else out(i)=in(i); end; end gure(1); %stampa i risultati subplot(2,1,1), plot(in); title(Segnale originale); axis([0 lung 1.15 1.15]) subplot(2,1,2), plot(out); title(Segnale elaborato); axis([0 lung .2 .2]) soundsc (out,Fs); end

10

12

14

16

18

20

22

24

26

7.1.1

Parametri

Per leetto distorsione lutente pu` congurare un solo parametro: o Soglia ` il valore che denisce lo sbarramento in ampiezza del segnale in e uscita. Viene espresso in termini percentuali relativi al valore massimo che il segnale in ingresso pu` assumere. In questo progetto si ` deciso di o e impostare un valore pari al 25%. In questo progetto si ` invece deciso e di ssare la soglia in valori percentuali relativi al valore massimo che il segnale assume; ci` ` possibile in quanto per le simulazioni Matlab si ` oe e deciso di lavorare oine; il programma per il DSP rispetta le condizioni di lavoro in tempo reale e per questo motivo la soglia ` appunto ssata e ad un valore riferito al fondoscala massimo.

62

Variazione di Ampiezza

7.2

Tremolo

Leetto tremolo, come gli altri eetti di questa famiglia, consiste nel modulare lampiezza del segnale; la forma donda modulante ` una sinusoide a bassa e frequenza. Viene spesso erroneamente confuso con leetto vibrato. Concettualmente per` si tratta di due tipologie completamente diverse; il vibrato o infatti modica la frequenza del segnale, variandola con un segnale sinusoidale, e non la sua ampiezza. Limplementazione delleetto tremolo ` quindi semplicemente quella mostrata e in Figura 7.3.

Figura 7.3: Implementazione, Tremolo

Matematicamente si pu` esprimere come: o y(n) = x(n)[1 + sin(2nT sF d)] (7.2.1)

Nellequazione precedente con si intende il termine Amp rappresenta lampiezza della variazione mentre F d denisce la frequenza del segnale modulante.

7.2 Tremolo

63

7.2.1

Parametri

Per leetto tremolo lutente pu` denire: o Amp ` il valore, compreso tra 0 ed 1, che rappresenta la variazione dampieze za del segnale in uscita. Se a = 0 il usso audio di uscita ` esattamente e quello in ingresso; se a = 1, che rappresenta la massima variazione possibile, il segnale presenter` degli istanti in cui il valore di ampiezza si a annulla ed altri in cui il valore ` pari al doppio di quello in ingresso. In e questo progetto si ` ssato a pari all80% del segnale. e Fd rappresenta la frequenza di oscillazione della sinusoide modulante. Ricordiamo che questa deve essere un segnale lentamente variabile. Per questo motivo si ` deciso di utilizzare un valore pari a 3Hz. e

La Figura 7.4 mostra evolve il segnale Amp avendo denito i parametri Amp pari all80% e F d pari a 3 Hz.

Figura 7.4: Coeciente, Tremolo

64

Variazione di Ampiezza

Eetto Distorsione function out=tremolo(in) Fs=22050; Fd=3; Amp percentuale=80; %denisce il parametro Amp Amp=Amp percentuale/100; lung=length(in); out=zeros(lung,1); ampli=zeros(lung,1); for i=1:(lung) ampli(i)=1+Ampsin(2piFdi/Fs); %genera la modulante out(i)=in(i)ampli(i); %applica la modulazione end; gure(1); %stampa i risultati subplot(2,1,1), plot(in); axis([0 lung 1.25 1.25]) subplot(2,1,2), plot(out); axis([0 lung 1.25 1.25]) gure(2) plot(ampli); title(Coeciente di Ampiezza); axis([0 14000 0 2]) soundsc (out,Fs); end

10

12

14

16

18

20

22

24

26

Capitolo 8 Processi sulla dinamica


8.1 Compressione

La compressione ` una elaborazione che ha eetti sulla dinamica del segnale; e questultima la possiamo denire come la distanza in termini di ampiezza tra parti dello stesso usso audio. Il compressore pu` quindi essere denito come o un amplicatore con guadagno variabile. In accordo con questa denizione possiamo quindi classicarli come: compressori verso il basso (downward compressors) o compressori verso lalto (upward compressors). I primi hanno la caratteristica di mantenere unitario il guadagno per segnali bassi mentre impongono unattenuazione per quelli pi` alti; mentre i secondi applicano una u amplicazione dei segnali pi` deboli mantenendo un guadagno unitario per u quelli pi` forti. Viene molto utilizzato nei sistemi di riproduzione portatili o u sistemi home theater perch` permette di correggere in parte le problematiche e dovute ai rumori ambientali che, se intensi, coprirebbero le parti pi` deboli del u segnale; la soluzione che prevede di amplicare con lo stesso guadagno lintero segnale, per permettere di percepire i suoni pi` deboli, viene scartata in quanto u produrrebbe dei picchi fastidiosi durante le parti in cui il segnale originale ` pi` e u forte; luso quindi di amplicatori variabili ` lideale per arontare e risolvere e queste problematiche.

65

66

Processi sulla dinamica La struttura che implementa il compressore ` mostrata in Figura 8.1 e

Figura 8.1: Implementazione, Compressore

Matematicamente la realizzazione di questo eetto si pu` esprimere come: o y(n) = x(n) mentre |y(n)| = soglia + 1 (x(n) soglia) ratio se |x(n)| soglia (8.1.2) se |x(n)| < soglia (8.1.1)

In Figura 8.2 si possono notare i diversi comportamenti delle due tipologie di compressore: compressione verso lalto e compressione verso il basso. I risultati dellutilizzo delle due tipologie sono molto simili; hanno entrambi lobbiettivo di amplicare i suoni pi` deboli ed attenuare quelli pi` forti. u u

8.1 Compressione

67

Figura 8.2: Comportamento, Compressore In Figura 8.3 si pu` vedere il risultato dellapplicazione dei compressori o mostrati in Figura 8.2 ad una sinusoide di ampiezza 100. Nel graco di sinistra risulta immediato vericare come la dinamica venga ridotta, i picchi pi` alti vengono infatti attenuati; nella gura di destra pu` risultare meno u o evidente questo risultato ma si nota come i valori pi` deboli del segnale vengano u amplicati maggiormente rispetto al resto della sinusoide, infatti la pendenza dei settori di segnale che hanno valori attorno allo zero ` superiore. e

68

Processi sulla dinamica

Figura 8.3: Segnale di Uscita, Compressore In Figura 8.3 la linea rossa rappresenta il segnale sinusoidale originale di ingresso mentre quella blu rappresenta luscita elaborata dal DSP.

8.1 Compressione

69

8.1.1

Parametri

Come mostra la Figura 8.1 i parametri che lutente pu` denire sono: o Soglia ` il valore che denisce la soglia oltre la quale cambia il valore del e guadagno. Ratio denisce il rapporto tra lampiezza del segnale in ingresso e quella in uscita in zona di compressione, per i compressori verso il basso, mentre per la zona che comprende i piccoli valori di ampiezza, al di sotto della soglia, per i compressori verso lalto. Tempo di Attacco questo parametro corrisponde al ritardo temporale dopo il quale la compressione si attiva. I compressori pi` ranati prevedono la u possibilit` di non attenuare immediatamente tutti i valori che superano a la soglia ma attivano lattenuazione solamente se lampiezza del segnale supera la soglia per un tempo superiore al tempo di attacco. Tempo di Rilascio ` un parametro che, come il tempo di attacco, gestisce il e rilascio dellattenuazione. E infatti preferibile che il guadagno dellamplicatore non ritorni istantaneamente ad un valore unitario nel momento in cui il segnale scende al di sotto della soglia, ma lo faccia con un determinato ritardo dato appunto dal tempo di rilascio.

In questo progetto, per rendere lalgoritmo pi` semplice, si ` deciso di u e trascurare i parametri tempo di attacco e tempo di rilascio. Linverso di un compressore viene denito espansore e applica lalgoritmo inverso; attenua infatti le componenti pi` deboli del segnale e amplica quelle u pi` forti. Applicando quindi in cascata un compressore ed un espansore si u ottiene il segnale di ingresso originale. Per questo progetto si ` deciso di e evitare limplementazione di questo eetto data la sua semplicit`; basta infatti a invertire le zone di applicazione del guadagno ratio.

70

Processi sulla dinamica

Eetto Compressione function out=compressione(in) Fs=22050; lung=length(in); ratio=2; %denisco il valore del ratio soglia percentuale=50; %denisco il valore della soglia out=zeros(lung,1); massimo=max(in); soglia=(soglia percentuale/100)massimo; for i=1:lung %applico lalgoritmo if in(i)<0 if in(i)<soglia; ampli=1/ratio; out(i)=soglia+ampli(in(i)+soglia); else out(i)=ampliin(i); out(i)=in(i); end; end if in(i)>0 if in(i)<soglia; ampli=1; out(i)=ampliin(i); else ampli=1/ratio; out(i)=soglia+ampli(in(i)soglia); end; end end gure(1); %stampa i risultati title(Compressione); subplot(2,1,1), plot(in); title(Segnale in Ingresso) axis([0 lung 1 1]); subplot(2,1,2), plot(out); title(Segnale in Uscita) axis([0 lung 1 1]); soundsc (out,Fs); end

10

12

14

16

18

20

22

24

26

28

30

32

34

36

38

40

42

8.2 Soppressore di rumore

71

8.2

Soppressore di rumore

Il soppressore di rumore ` un semplice algoritmo che si applica ad un segnale e per eliminare il rumore di fondo sempre presente in esso. Supponendo infatti che i disturbi abbiano una ampiezza molto inferiore rispetto al segnale desiderato, per eliminarli, ` suciente azzerare tutti i campioni che presentano una e ampiezza inferiore ad una determinata soglia. Questo per` comporta una cero ta distorsione in quanto a venire azzerati saranno anche i campioni di segnale desiderato con ampiezza inferiore alla soglia; ` questa per` una distorsione e o trascurabile. Questo algoritmo trova la sua applicazione soprattutto in ussi audio che contengono sezioni in cui il segnale dovrebbe essere nullo. Un esempio di tale applicazione ` quello dei segnali audio che esprimono tracce e vocali; ci saranno alcuni istanti in cui loratore non parler` ed ` proprio in a e questi periodi che il soppressore di rumore agisce in maniera pi` signicativa u eliminando ronzii oppure rumori di sottofondo. La struttura che implementa il soppressore di rumore ` mostrata in Figura 8.4 e

Figura 8.4: Implementazione, Soppressore Matematicamente si pu` esprimere come: o y(n) = 0 mentre |y(n)| = x(n) se |x(n)| soglia (8.2.2) se |x(n)| < soglia (8.2.1)

Il comportamento del soppressore di rumore ` mostrato in Figura 8.5 dove, e a titolo di esempio, si ` ssata una soglia pari a 10; come si vede quindi e campioni con valore di ampiezza inferiore a 10 verranno azzerati. In Figura 8.6 ` mostrato un secondo esempio dove si vede come i campioni e con ampiezza inferiore alla soglia vengono azzerati in uscita.

72

Processi sulla dinamica

Figura 8.5: Comportamento, Soppressore

Figura 8.6: Segnale nel tempo, Soppressore

8.2 Soppressore di rumore

73

8.2.1

Parametri

Lunico parametro denibile dallutente `: e Soglia ` il valore che denisce la soglia al di sotto della quale lampiezza viene e annullata.

74

Processi sulla dinamica

Eetto soppressione function out=soppressione(in) Fs=22050; lung=length(in); soglia percentuale=1; %denisco il valore della soglia out=zeros(lung,1); massimo=max(in); soglia=(soglia percentuale/100)massimo; for i=1:lung %applico lalgoritmo if in(i)<0 if in(i)<soglia; out(i)=in(i); else out(i)=0; end; end if in(i)>0 if in(i)<soglia; out(i)=0; else out(i)=in(i); end; end end gure(1); %stampa i risultati title(Soppressione); subplot(2,1,1), plot(in); title(Segnale in Ingresso) axis([0 lung 1 1]); subplot(2,1,2), plot(out); title(Segnale in Uscita) axis([0 lung 1 1]); soundsc (out,Fs); end

10

12

14

16

18

20

22

24

26

28

30

32

34

36

Conclusioni
Lobiettivo di questo progetto non ` certo la creazione di un dispositivo per e uso professionale quanto la realizzazione di un apparecchio in grado di implementare alcuni dei pi` conosciuti eetti audio digitali. u Le potenzialit` della scheda sono molto alte, la velocit` di calcolo e la qualit` a a a dei convertitori analogico-digitali ne permetterebbero luso per utilizzi in settori di fascia medio-alta; ci` che forse ` mancato per raggiungere questa qualit` o e a superiore ` stata la carenza di memoria RAM sul dispositivo che non ha pere messo luso di buer di grandi dimensioni. La quantit` di memoria ridotta a ha infatti costretto la scelta di una frequenza di campionamento inferiore alle eettive potenzialit` oerte dalla scheda. a Si pu` aermare quindi che i prossimi sviluppi e migliorie che si potranno apo portare a questo progetto dovranno avere come base lincremento di memoria a disposizione delle variabili del software. Questo studio non ha la pretesa di essere considerato una guida tecnica specializzata quanto invece pu` essere inteso come un primo approccio, o dal carattere prettamente didattico, al vasto campo degli eetti audio digitali implementati su DSP.

75

76

Conclusioni

Appendice A Codice C per la programmazione del DSP


Il codice che viene riportato in seguito rappresenta il programma principale in linguaggio C usato per programmare il DSP. Il programma ` strutturato di modo che lutente possa selezionare pi` eete u ti contemporaneamente, uno per famiglia; sar` quindi possibile, ad esempio, a applicare al usso audio in ingresso un eetto delay che si sovrappone ad un tremolo seguito da una distorsione. E anche possibile selezionare solamente uno di questi oppure non selezionarne alcuno cos` che luscita risulti esattamente uguale allingresso. La struttura risulta quindi essere quella di Figura A.1:

Figura A.1: Struttura del Programma Si ` deciso di omettere in questo testo le altre parti necessarie al fune zionamento della scheda, quali ad esempio: lorganizzazione della memoria, la denizione delle costanti globali o linizializzazione dei registri.

77

78

Codice C per la programmazione del DSP

#include #include #include #include #include #include

FlashingLedsSettings.h PeripheralHeaderIncludes.h DSP280x EPWM denes.h //OK to use 280x le oat.h math.h stdlib.h

10

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // FUNCTION PROTOTYPES //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // FRAMEWORK void DeviceInit(void); void SCIA Init(); void SerialHostComms(); void InitFlash();

12

14

16

18

20

22

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // VARIABLE DECLARATIONS GENERAL //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // FRAMEWORK int16 int16 int16 int16 int16 int16 int16 VTimer0[4]; // Virtual Timers slaved o CPU Timer 0 VTimer1[4]; // Virtual Timers slaved o CPU Timer 1 VTimer2[4]; // Virtual Timers slaved o CPU Timer 2 SerialCommsTimer; CommsOKg; HRmode; BlinkStatePtr, LED TaskPtr;

24

26

28

30

32

34

36

38

40

42

44

46

48

50

// Used to indirectly access all EPWM modules, very useful! volatile struct EPWM REGS ePWM[] = { &EPwm1Regs, //intentional: (ePWM[0] not used) &EPwm1Regs, &EPwm2Regs, &EPwm3Regs, &EPwm4Regs, #if (!DSP2802x DEVICE H) &EPwm5Regs, &EPwm6Regs, #if (DSP2803x DEVICE H || DSP2804x DEVICE H) &EPwm7Regs, #if (DSP2804x DEVICE H) &EPwm8Regs #endif #endif #endif };

79

// Used for running BackGround in ash, and ISR in RAM extern Uint16 RamfuncsLoadStart, RamfuncsLoadEnd, RamfuncsRunStart;

10

12

14

16

18

20

22

24

// USER int Fs,i,j,lunghezza buer,indice,indice 1,indice 2,indice 3; int ritardo eco ms, ritardo eco; int ritardo multi eco ms, ritardo multi eco 1, ritardo multi eco 2; int ritardo multi eco 3; int ritardo chorus ms, ritardo chorus, ritardo chorus max; int percentuale var amp; int ritardo a ms, ritardo a max, ritardo a; int ritardo vib ms, ritardo vib max, ritardo vib; int ritardo pit ms, ritardo pit max, ritardo pit, temp; int soglia percent, soglia; oat variaz tre percent, variaz tre max; oat ampli[9]; int ritar[9]; oat ampiezza, a1, a2; int soglia1, ratio; int soglia2; int beta; int sel e temp, sel e amp, sel riv, sel e din; #pragma DATA SECTION(buer , .ebss:buer) int buer[28000]; //e lungo e000 #pragma DATA SECTION(h1buer , .ebss:hbuer) int h1buer[28000]; #pragma DATA SECTION(h2buer , .ebss:hbuer) int h2buer[28000]; //hbuer ha dimensione 10000h

26

28

30

32

34

36

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // VARIABLE DECLARATIONS CCS WatchWindow / GUI support //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // FRAMEWORK

38

40

42

44

46

//GUI support variables // sets a limit on the amount of external GUI controls increase as necessary int16 varSetTxtList[16]; //16 textbox controlled variables int16 varSetBtnList[16]; //16 button controlled variables int16 varSetSldrList[16]; //16 slider controlled variables int16 varGetList[16]; //16 variables sendable to GUI int16 arrayGetList[16]; //16 arrays sendable to GUI // USER

48

80

Codice C per la programmazione del DSP

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // MAIN CODE starts here //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% void main(void) { //============================================= // INITIALISATION General //============================================= // FRAMEWORK

10

12

14

DeviceInit(); // Device Life support & GPIO SCIA Init(); // Initalize the Serial Comms A peripheral // Only used if running from FLASH // Note that the variable FLASH is dened by the compiler with d FLASH // (see TwoChannelBuck.pjt le) #ifdef FLASH // Copy time critical code and Flash setup code to RAM // The RamfuncsLoadStart, RamfuncsLoadEnd, and RamfuncsRunStart // symbols are created by the linker. Refer to the linker les. MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart); // Call Flash Initialization to setup ash waitstates // This function must reside in RAM InitFlash(); // Call the ash wrapper init function #endif //(FLASH) // Timing sync for background loops // Timer period denitions found in PeripheralHeaderIncludes.h CpuTimer0Regs.PRD.all = uSec45; // A tasks CommsOKg = 0; SerialCommsTimer = 0; HRmode = 1; // Default to HR mode enabled // USER // put common initialization/variable denitions here sel e temp = 0; sel e amp=0; sel e din=0; sel riv=1; j=1; i=0; Fs=22050; lunghezza buer=28000;

16

18

20

22

24

26

28

30

32

34

36

38

40

42

44

46

48

81

//parametri eetti //eetto Eco ritardo eco ms=900; //espresso in ms ritardo eco=(Fs/1000)ritardo eco ms; //eetto Multi tap Eco ritardo multi eco ms=400; //espresso in ms ritardo multi eco 1=(Fs/1000)ritardo multi eco ms; ritardo multi eco 2=(Fs/1000)2ritardo multi eco ms; ritardo multi eco 3=(Fs/1000)3ritardo multi eco ms; //eetto Chorus ritardo chorus ms=25; //espresso in ms ritardo chorus max=(Fs/1000) ritardo chorus ms; percentuale var amp=30; //eetto Flanger ritardo a ms=25; //espresso in ms ritardo a max=(Fs/1000)ritardo a ms; //eetto Vibrato ritardo vib ms=3; //espresso in ms ritardo vib max=(Fs/1000)ritardo vib ms; //eetto Pitch Shifter ritardo pit ms=5; //espresso in ms ritardo pit max=(Fs/1000)ritardo vib ms; temp=0; //eeto Distorsione soglia percent=2; //espresso in % soglia=(32767/100soglia percent); //eetto Tremolo variaz tre percent=80; //espresso in % variaz tre max=variaz tre percent/100; //eetto Riverbero ampli[0]=.841; ampli[1]=.504; ampli[2]=.289; ampli[3]=.192; ampli[4]=.176; ampli[5]=.167; ampli[6]=.134; ampli[7]=.29; ampli[8]=.24; ritar[0]=95; ritar[1]=475; ritar[2]=1011; ritar[3]=1262; ritar[4]=1601; ritar[5]=1661; ritar[6]=1758; ritar[7]=3103; ritar[8]=3478; beta=0; a1=1; a2=0.25;

10

12

14

16

18

20

22

24

26

28

30

32

34

36

38

40

42

44

46

48

82

Codice C per la programmazione del DSP

//eetto Compressione soglia1=16384; ratio=2; //eetto Soppressione del rumore soglia2=50; //============================================= // INITIALISATION BUILD OPTIONS NOTE: select via ProjectSettings.h //============================================= // USER // Put build specic initialisation here for (j=0; j<=lunghezza buer; j++) { buer[j]=0; h1buer[j]=0; h2buer[j]=0; } //============================================= // BACKGROUND (BG) LOOP //============================================= // FRAMEWORK for (;;) //innite loop { if (CpuTimer0Regs.TCR.bit.TIF == 1) { CpuTimer0Regs.TCR.bit.TIF = 1; // clear ag // linterupt fa partire la conversione dellADC // il dato proveniente dallADC `sar poi elaborato a // come segue: if (i == 0) { temp=temp; } // // // // // // // La parte di codice soprariportata risulta necessaria in fase di simulazione in quanto per rendere piu semplice tale processo si e deciso di utilizzare campioni salvati in precedenza sul pc. Lespressione temp = temp serve infatti a generare un punto in cui e possibile inserire un breakpoint di lettura dal le. Per rendere la simulazione piu veloce si e deciso di leggere 28000 campioni alla volta e terminata lelaborazione scrivere 28000 campione in uscita.

10

12

14

16

18

20

22

24

26

28

30

32

34

36

38

40

42

44

46

48

83

//selezione delleetto desiderato switch (sel e temp) { case (0): //eetto:nessun eetto selezionato buer[i]=h2buer[i]; h1buer[i]=buer[i]; break; case (1): // eetto: Eco buer[i]=h2buer[i]; indice=iritardo eco; if (indice<0) { indice=indice+lunghezza buer; } h1buer[i]=0.8buer[i]+0.2buer[indice]; break; case (2): // eetto: Multitap Eco buer[i]=h2buer[i]; indice 1=iritardo multi eco 1; if (indice 1<0) { indice 1=indice 1+lunghezza buer; } indice 2=iritardo multi eco 2; if (indice 2<0) { indice 2=indice 2+lunghezza buer; } indice 3=iritardo multi eco 3; if (indice 3<0) { indice 3=indice 3+lunghezza buer; } h1buer[i]=buer[i]+0.2buer[indice 1]+0.05buer[indice 2]+ +0.01buer[indice 3]; break;

10

12

14

16

18

20

22

24

26

28

30

32

34

36

38

40

42

84

Codice C per la programmazione del DSP

10

12

14

case (4): // eetto: Chorus buer[i]=h2buer[i]; ritardo chorus=(((ritardo chorus max)/2) (1+sin((23.140.1i)/Fs))); ampiezza=(1+(percentuale var amp0.01cos((23.140.3i)/Fs))); indice=iritardo chorus; if (indice<0) { indice=indice+lunghezza buer; } h1buer[i]=0.5buer[i]+0.5ampiezzabuer[indice]; break; case (8): // eetto: Flanger buer[i]=h2buer[i]; ritardo a=(((ritardo a max)/2)(1cos((23.140.3i)/Fs))); indice=iritardo a; if (indice<0) { indice=indice+lunghezza buer; } h1buer[i]=buer[indice]; break; case (16): // eetto:Pitch Shifter buer[i]=h2buer[i]; if (temp>ritardo pit max) { temp=tempritardo pit max; } indice=i3temp; temp=temp+1; if (indice<0) { indice=indice+lunghezza buer; } indice 1=i1; if (indice 1<0) { indice 1=indice 1+lunghezza buer; } h1buer[i]=0.5buer[indice]+0.5buer[indice 1]; break; default: break;

16

18

20

22

24

26

28

30

32

34

36

38

40

42

44

46

48

50

85

10

12

case (32): // eetto: Vibrato buer[i]=h2buer[i]; ritardo vib=(((ritardo vib max)/2)(sin((23.1410i)/Fs))); indice=iritardo vib; if (indice<0) { indice=indice+lunghezza buer; } h1buer[i]=buer[indice]; break; switch (sel e amp) { case (0): //eetto:nessun eetto selezionato break; case (1): // eetto: Distorsione if (h1buer[i]>=soglia) { h1buer[i]=soglia; } else if (h1buer[i]<=soglia) { h1buer[i]=soglia; } else { h1buer[i]=h1buer[i]; } break; case (2): // eetto: Tremolo ampiezza=1+variaz tre max(sin((23.1410i)/Fs)); h1buer[i]=h1buer[i]ampiezza; break; default: break; } switch (sel e din) { case (0): //eetto:nessun eetto selezionato break;

14

16

18

20

22

24

26

28

30

32

34

36

38

40

42

44

46

86

Codice C per la programmazione del DSP

10

12

14

16

18

case (1): // eetto: compressione if (h1buer[i] < 0) { if (h1buer[i] < soglia1) { h1buer[i]=soglia1+(h1buer[i]+soglia1)/ratio; } } else { if (h1buer[i] > soglia1) { h1buer[i]=soglia1+(h1buer[i]soglia1)/ratio; } } break; case (2): // eetto: soppressore di rumore if (h1buer[i] < 0) { if (h1buer[i] > soglia2) { h1buer[i]=0; } } else { if (h1buer[i] < soglia2) { h1buer[i]=0; } } break; default: break; } switch (sel riv) { case (0): //eetto:nessun eetto selezionato break;

20

22

24

26

28

30

32

34

36

38

40

42

87

10

12

case (1): // eetto: riverbero for (temp = 0; temp < 9; temp++) { beta=iritar[temp]; if (beta<=0) { beta=1; } buer[i]=buer[i]+ampli[temp]h1buer[beta]; } break; default: break;

14

16

} // // // // // // // // // A causa di problemi legati alla memoria e alla allocazione della stessa e stato impossibile riuscire ad implementare leetto riverbero come mostrato in questa tesi ma si e scelto di realizzarlo comunque con un algoritmo meno sosticato omettendo la parte dei ltri IIR e il ltro passa tutto, realizzando solamente un banco di ltri FIR con tempi di ritardo che generano sia le early reection che le late reection. E questa una semplicazione dellalgoritmo di Moorer necessaria per risolvere i suddetti problemi di allocazione che non trovavano altrimenti soluzione. Le variabili buer utilizzate non potevano infatti essere modicate in quanto gia in uso dagli eetti implementati in precedenza.

18

20

22

24

26

28

30

32

34

36

38

40

42

if (i == 27999) { if (sel riv==1) { temp=temp; i=1; } else { temp=temp; i=1; } } i=i+1; }} }//END MAIN CODE // // // // // Questa sezione del codice, come quella iniziale ha lo scopo di creare una parte di codice dove sia corretto inserire i breakpoint in questo caso di scrittura. Per problemi legati alle variabili utilizzate per leetto riverbero sono stati creati due punti diversi per lapplicazione del breakpoint in base allutilizzo o meno di tale eetto.

44

46

48

88

Codice C per la programmazione del DSP

Bibliograa
[1] S. J. Orfanidis, Introduction to Signal Processing, Capitolo 8, Sez 8.2, pp. 355-383, Prentice Hall, Englewood Clis, NJ, (1996). [2] J. A. Moorer, About this reverberation business,Computer Music journal, 3, 13 (1979). [3] J. Tomarakos, D. Ledger, Using The Low-Cost, High Performance ADSP21065L Digital Signal Processor For Digital Audio Applications, (1998). [4] D. Oboril, M. Balik, J. Schimmel, Z. Smekal, P. Krkavec, Modelling Digital Musical Eects For Signal Processors, Based On Real Eects Manifestation Analysis, (2000) [5] Code Composer Studio getting started guide, Texas Instruments, (2001) [6] TMS320C28343 Delno Microcontrollers Data Manual, Texas Instruments, (2009) [7] TMS320C28343 Experimenters Kit Overview, Texas Instruments, (2009) [8] Delno C28343 controlCARD Overview, Texas Instruments, (2009)

89

You might also like