Progetto Theremin

Transcript

Progetto Theremin
Università di Pisa
Facoltà di Ingegneria
Corso di
Architetture e Dispositivi per le Apparecchiature Biomediche
Anno Accademico 2008-2009
Progetto Theremin
Bravi
Meucci
Turturici
Andrea
Sandro
Mauro
1 Introduzione
Lo scopo di questo progetto è utilizzare gli strumenti forniti dalle lezioni di DSPLab2009 per realizzare un dispositivo che genera un segnale acustico a frequenza
variabile.
Come modello è stato scelto il principio di funzionamento del Theremin,
uno strumento musicale elettronico inventato nei primi anni del novecento. Il
suo suono è caratteristico, simile a quello di un violino, ed è stato utilizzato
nelle colonne sonore di molti lm, specialmente di fantascienza (ad esempio
Ultimatum alla terra o nella sigla originale di Star Trek ).
Figura 1: Esempio di Theremin
Quello che rende unico questo strumento è il modo in cui viene suonato: infatti il suonatore può produrre diversi suoni senza mai dover toccare il Theremin,
per questo motivo viene anche chiamato eterofono. Il controllo sul suono prodotto si ha avvicinando le mani a due antenne (vedi Figura 1), una per cambiare
la frequenza del suono (antenna di pitch) ed una per regolarne il volume.
Figura 2: Schema di un Theremin
Il funzionamento di un Theremin sfrutta il battimento di due sinusoidi con
frequenza superiore a quella udibile (ovvero
f > 20kHz),
una a frequenza ssa
ed una la cui frequenza dipende dall'accoppiamento capacitivo tra il suonatore e l'antenna di pitch (f
= 20 − 40kHz)
(Figura 3-a); le due onde vengono
moltiplicate, così da generare una coppia di sinusoidi con frequenze pari una
alla dierenza ed una alla somma delle onde originali (Figura 3-b). Se le onde
originali sono del tipo
(
s0 (t) = cos(2πf0 t)
sv (t) = cos(2πfv t)
il loro prodotto si potrà scrivere come
1
s0 (t) ∗ sv (t)
=
cos(2πf0 t) ∗ cos(2πfv t) =
=
cos[2π(fv − f0 )t] + cos[2π(fv + f0 )t]
(1)
L'uscita dello strumento è l'onda a frequenza minore che avrà un'escursione frequenziale tale da coprire l'udibile umano, l'altra onda è da considerare
disturbo e verrà ltrata con un passa basso (Figura 3-c).
L'ultimo blocco che compone un Theremin è un amplicatore a guadagno
variabile controllato dall'antenna di volume.
Figura 3: Schema di modulazione
2 Realizzazione digitale
Quanto appena descritto è stato realizzato in digitale, utilizzando un software MATLAB per generare le due onde e la scheda DSK6713 per eseguire
la modulazione ed il ltraggio.
Generazione onde
Mentre nel Theremin le due onde sono prodotte da due oscillatori ed il controllo
avviene allontanando e avvicinando una mano all'antenna di pitch, in questo
progetto la frequenza e l'ampiezza delle oscillazioni vengono variate in base alla posizione del puntatore del mouse sullo schermo, come mostrato in Figura
4-a. Un programma MATLAB campiona la posizione del puntatore ogni 10ms,
genera i due segnali e inne manda sul canale destro della line out la sinusoide di frequenza e ampiezza variabili, mentre sul canale sinistro invia quella di
ampiezza variabile e frequenza ssa.
La banda limitata riproducibile dalla scheda audio di un pc ci impedisce di
utilizzare le frequenze alle quali normalmente funziona un Theremin, quindi la
modulazione è stata riscalata a frequenze udibili, scegliendo
f0 , fmin
ed
fM AX
0 e
in modo da avere dopo la modulazione una prima sinusoide che varia tra
10k Hz
ed una seconda tra
14
e
24k Hz,
f0
7k Hz
come mostrato in Figura 4-b.
fmin
7k Hz
fM AX
17k Hz
Una conseguenza di questo riscalamento è l'entrata della sinusoide a frequenza più alta (banda rossa in Figura 4-b) nella banda udibile, rendendo il ltraggio
passa-basso un'operazione necessaria per non avere disturbi sul segnale in uscita.
2
Figura 4: Scelta della frequenza variabile (a) e bande frequenziali coinvolte e
posizione del ltro passa-basso (b)
Diversamente da quanto succederebbe se lavorassimo con normali le audio,
in cui i canali destro e sinistro vengono letti e processati separatamente, in questa
applicazione sui due canali della line in troviamo i due segnali da utilizzare nella
modulazione, ovvero dovremo leggerli separatamente, moltiplicarli e ltrare il
risultato di questa operazione. Questo ha introdotto delle complicazioni ed ha
richiesto particolare attenzione nel settaggio delle periferiche, come spiegato nel
Paragrafo 3.3.
3 Realizzazione progetto
3.1
Operazioni preliminari
Per la creazione del progetto "ex novo" abbiamo seguito le istruzioni contenute nelle slides del corso e negli appunti e, successivamente, sviluppando e
approfondendo alcuni aspetti legati al particolare scopo del progetto.
Le librerie e gli header utilizzati sono alcuni di quelli usati nelle esercitazioni,
per i dettagli si veda l'Appendice A.
3.2
Schema operativo
Il funzionamento del software implementato è il seguente:
1. Interruzione hardware chiamata dallo svuotamento del buer del Codec
audio, comunicato alla CPU attraverso il piedino 14.
2. Esecuzione di una funzione, lanciata in seguito all'interruzione hardware,
la quale si occupa di catturare le sinusoidi in ingresso, moltiplicarle fra
loro e inne ltrare e riprodurre l'uscita.
Tale schema operativo è stato realizzato tramite l'utilizzo di:
•
un elemento di interruzione hardware,
•
una routine eseguita all'arrivo dell'interruzione hardware,
•
una funzione ed una struttura di coecienti per il ltraggio.
3
•
funzioni della chip support library
•
strutture di manipolazione e congurazione dei dispositivi on board.
Altri elementi software utilizzati per la realizzazione del progetto, di interesse
generale e non della particolare applicazione, verranno in tale sede tralasciati
ed unicamente citati qualora la chiarezza della trattazione lo richiedesse. Nei
paragra seguenti tratteremo perciò i punti di cui sopra, specicando, ove richiesto, le operazioni di congurazione necessaria facendo riferimento all'ambiente
di sviluppo Code Composer Studio 3.3 Platinum.
Interruzione Hardware
Il meccanismo di interruzione hardware previsto per il dispositivo usato è attivabile mediante la dichiarazione della routine da servire nel conguratore del
DSP/BIOS e la chiamata della funzione di attivazione del particolare tipo di
interruzione.
La funzione eseguita in seguito all'arrivo dell'interruzione hard-
ware si occupa della trasmissione ed elaborazione dei dati, come descritto nel
paragrafo successivo.
I dettagli di questa operazione, non essendo di importanza per il seguito
della trattazione, sono riportati in Appendice B.
3.3
Acquisizione degli ingressi e generazione del segnale
di uscita
La funzione mandata in esecuzione dal DSP/BIOS in seguito all'interruzionehardware si occupa di acquisire le sinusoidi in ingresso, di eseguire la moltiplicazione fra esse ed inne di generare il segnale di uscita, eventualmente
ltrato.
Utilizzando la congurazione di default del codec i due canali della
porta line in vengono acquisiti a divisione di tempo, è perciò necessario eseguire due letture consecutive per poter generare il campione di uscita. I dati
in ingresso sono rappresentati su 16 bit, per cui dopo aver eseguito la moltiplicazione (il cui risultato è rappresentato da un intero a 32 bit) è necessario
riportare il dato di uscita nel medesimo formato tramite uno shift che conserva
i bit più signicativi dell'uscita.
Per ulteriori dettagli sui problemi riscontrati durante questa fase si rimanda
al Paragrafo 5.
3.4
Filtraggio
Prendendo spunto da quanto visto nell'ultima esercitazione del corso abbiamo
eseguito un operazione di ltraggio FIR. Il ltro FIR, di cui un esempio schematico in Figura 5 è ottenuto tramite un buer di campioni ed un array di
coecienti della medesima dimensione; ad ogni nuova acquisizione il buer viene shiftato e riempito con il nuovo elemento, quindi tutti i campioni vengono
moltiplicati e sommati fra loro per fornire il campione di uscita.
4
Figura 5: Schema di un ltro FIR.
Il carico computazionale di questo elemento è perciò di N x Fs moltiplicazioni,
con Fs pari alla frequenza di campionamento, stabilita in 48kHz. Per la scelta
del tipo di ltro e del numero di campioni sono state fatte diverse prove (per
ulteriori dettagli si veda il sesto punto del Paragrafo 5) e si sono scelti i settaggi
mostrati in Figura 6, dove è riportata la nestra di Matlab Filter Design Toolbox
dove si può vedere le speciche del ltro.
Figura 6: Filter Design Toolbox nella generazione del ltro FIR utilizzato.
Il ltraggio è stato ottenuto tramite una funzione che esegue due operazioni,
la prima di shift dei campioni in ingresso al ltro ed inserimento del nuovo dato,
la seconda di moltiplicazione fra i coecienti del ltro e i campioni del segnale
di ingresso.
DSK6713_DIP_get(0)).
É possibile disinserire il ltraggio attraverso il DIP 0 (
5
3.5
Main
Il ruolo del processo main è in questo caso ridotto al minimo: si tratta semplicemente di dichiarare le variabili e gli handlers necessari, eseguire la funzioni di
congurazione dei componenti della board e attivare i meccanismi di interruzione
opportuni.
Il le sorgente, comprensivo di tutte le funzioni implementate e le strutture
dati utilizzate è riportato in Appendice C.
4 Settaggio a 32 bit
Dal momento che ad ogni passo la seriale trasmette 32 bit e che i valori inviati dal
codec sono rappresentati su 16 bit si è tentato dicongurare la scheda in modo
che i due canali della line in venissero trasmessi contemporaneamente dalla
seriale, evitando il tempo morto dovuto alla necessità di attendere l'arrivo del
secondo campione per eseguire la moltiplicazione.
A questo scopo sono stati
cambiati i settaggi della Seriale McBSP0 e il codec audio AIC23.
La prima
serve a permettere lo scambio di dati tra il DSP e la seconda, che invece ha
la funzione di acquisire dati da linee audio e mandare in uscita tali dati dopo
un'eventuale elaborazione.
La problematica principale riscontrata con entrambe ha riguardato il rintracciare le informazioni sull'hardware ed il loro settaggio nel codice usato con
Code Composer studio.
Le informazioni utili a settare i registri sono state trovate nei due le TVL320AIC23 Data Manual e TMS320C6000 DSP Multichannel Buered
Serial Port (McBSP) Reference Guide e TMS320C6000 Peripherals
Reference Guide.
4.1
Codec audio
E' caratterizzato da 11 registri, i cui settaggi sono riportati nella Tabella 1, con
le relative spiegazioni.
L'accesso a questi settaggi si ha attraverso la libreria
dsk6713_BSL, più specicamente la funzione DSK6713_AIC23_cong del le
dsk6713_aic23.c. Non sono stati riscontrati problemi particolari nel settaggio.
4.2
Seriale
Ben dierente è stata l'esperienza legata al McBSP. Il manuale di 120 pagine
trovato, infatti, non spiega in modo esaustivo i concetti a cui fa riferimento.
Ciò che volevamo fare era cambiare la tempistica con cui il codec trasmette i
dati: non più inviando i due canali a divisione di tempo utilizzando i 16 bit meno
signicativi di un registro a 32 bit, ma in un unica trasmissione, mettendo un
canale nei 16 bit più signicativi e l'altro in quelli meno signicativi del registro
a 32 bit.
6
LEFTINVOL
Update non simultaneo delle due linee, linea sinistra abilitata, volume control a 0 dB (da default) :
0b000010111
RIGHTINVOL
Update non simultaneo delle due linee, linea sinistra abilitata, volume control a 0 dB (da default) :
0b000010111
LEFTHPVOL
Zero-cross disabilitato (viene fatto l'update del volume sempre, non solo quando si ha un valore di
tensione prossimo a quello del ground allo stage di
amplicazione prima dell'uscita) : 0b00101000
RIGHTHPVOL
Zero-cross disabilitato (viene fatto l'update del volume sempre, non solo quando si ha un valore di
tensione prossimo a quello del ground allo stage di
amplicazione prima dell'uscita) : 0b00101000
ANAPATH
Sidetone disabilitato (eetto di ritorno della voce,
feedback del segnale), DAC selezionato, Bypass disabilitato (cioè il segnale non va piùdirettamente dalla line-in al line-out), Input per l'ADC proveniente
dalla line-in, microfono muto : 0b00010010
DIGPATH
Niente processing dei dati in uscita : 0b00000000
POWERDOWN
Non d'interesse per questa applicazione (da default)
: 0b00000000
DIGIF
Impostazione
di
dsk6713_aic23.h
default
(modalità
della
libreria
comunicazione
con
DSP): 0b00000011
SAMPLERATE
48 kHz, modalità USB : 0b00000000
DIGACT
Interfaccia digitale abilitata : 0b000000001
RESET
Scrivere 000000000 in questo registro triggera il reset
Tabella 1: Registri del Codec audio
Per fare ciò si è ricercato tra i 13 registri della periferica, quelli che avrebbero
potuto contenere il controllo d'interesse. Così sono stati identicati RCR (Receive Control Register, Tabella 2) ed XCR (Transmit Control Register, Tabella
3).
7
MCBSP_FMKS(RCR, RPHASE, SINGLE)
MCBSP_FMKS(RCR, RFRLEN2, DEFAULT)
MCBSP_FMKS(RCR, RWDLEN2, DEFAULT)
MCBSP_FMKS(RCR, RCOMPAND, MSB)
MCBSP_FMKS(RCR, RFIG, DEFAULT)
MCBSP_FMKS(RCR, RDATDLY, DEFAULT)
MCBSP_FMKS(RCR, RFRLEN1, OF(0))
MCBSP_FMKS(RCR, RWDLEN1, 32 BIT)
MCBSP_FMKS(RCR, RWDREVRS, DEFAULT)
Fase singola di trasferimento, se
ne possono settare no a due.
Ogni trasferimento, o frame, può
essere diviso in due fasi o essere
lasciato in un'unica fase, il
vantaggio delle due fasi è di poter
avere settaggi diversi.
Numero di parole ricevute per
frame. DEFAULT=0, quindi una
parola (il numero massimo è di
128 nel caso a fase singola, 256
nel caso a frase doppia). Essendo
questo il settaggio della fase 2,
ma avento specicato un grame a
frase singola, questo valore non
incide sul processing.
Numero di bit ricevuti per parola
(il prodotto con il parametro
precedente deve essere al
massimo 4096, perché il periodo
di un frame è di 12 bit).
DEFAULT=0, quindi 8 bit.
Compressione dei dati
disabilitata, il trasferimento parte
don il byte più signicativo.
DEFAULT=0, quindi si ha il
restart del trasferimento dei dati
nel caso di ricezione di un segnale
di sincronizzazione (dopo che era
già cominciato il trasferimento
dei dati).
DEFAULT=0, quindi si ha un
delay di 0 bit nella ricezione
OF(0) indica 1 parola in ricezione
in fase 1.
Ogni parola è di 32 bit.
DEFAULT=0, non si ha il
reversal dei dati, quindi si riceve
prima il MSB, quindi l'LSB.
Tabella 2: Tabella di congurazione del Receive Control Register
Da notare che I valori di default sono dichiarati in
csl_mcbsphal.h,
mentre
la chiamata alle funzioni per il settaggio della seriale si trova all'interno di
dsk6713_aic23_opencodec.c,
csl_mcbsp.h.
dsk6713_aic23_opencodec.c, ma non
e si rifà alle funzioni specicate in
Quindi, volendo modicare la funzione
8
dsk6713bsl.lib,
essendo in grado di ricreare una library come
contenente i codici
sorgente delle funzioni delle varie periferiche (quindi anche dell'aic23), abbiamo
deciso di creare una funzione
dsk6713_aic23_opencodecNostra, all'interno della
quale sono stati cambiati i parametri di settaggio della MCBSP.
DEFAULT=0, quindi fase
singola di trasferimento.
Numero di parole trasmesse per
frame uguale a uno (non conta
tanto siamo in fase singola).
Numero di bit trasmessi per
parola pari a 8.
Compressione dei dati
disabilitata, il trasferimento
parte con il byte più
signicativo.
Si ha il restart del
trasferimento dei dati nel caso
di ricezione di un segnale di
sincronizzazione (dopo che era
già cominciato il trasferimento
dei dati).
Si ha un delay di 1 bit nella
ricezione (questo vuol dire che
il primo dato da essere
trasmesso ha bisogno di un
ritardo di un clock).
OF(0) indica 1 parola in
trasmissione in fase 1.
Ogni parola è di 32 bit.
MCBSP_FMKS(XCR, XPHASE, SINGLE)
MCBSP_FMKS(XCR, XFRLEN2, OF(0))
MCBSP_FMKS(XCR, XWDLEN2, 8BIT)
MCBSP_FMKS(XCR, XCOMPAND, MSB)
MCBSP_FMKS(XCR, XFIG, NO)
MCBSP_FMKS(XCR, XDATDLY, 1BIT)
MCBSP_FMKS(XCR, XFRLEN1, OF(0))
MCBSP_FMKS(XCR, XWDLEN1,32BIT)
Tabella 3: Tabella di congurazione del Transmit Control Register
5 Dicoltà riscontrate
Le problematiche riscontrate in fase di creazione del progetto "ex novo" sono
principalmente da imputare all'elevato numero di parametri di congurazione
del dispositivo e del DSP/BIOS; la ridotta complessità del progetto ha fatto
comunque sì che siano state arontate senza eccessivo sforzo, anche grazie agli
esempi forniti in sede di esercitazione.
Di seguito alcune delle questioni che
hanno richiesto particolare attenzione.
1. Il primo, e più banale, problema riscontrato è stato in fase di compila-
csl6713.lib);
zione a causa di una libreria mancante(
in particolare l'errore
segnalato in fase di compilazione riguardava il linker, cosa che ha inizial-
9
mente sviato l'attenzione sull'eettiva natura dell'errore. In Appendice D
il listato di uscita dal compilatore.
2. Un altro errore del compilatore, di dicile comprensione nonostante la
Build
Options; in particolare si è visto che nel parametro tracciato dal percorso Compiler>Preprocessor>Pre-Dene Symbol dopo l'opzione di default
"_DEBUG" si è dovuto aggiungere di seguito ";CHIP_6713". Con questa
banale soluzione, è stato il settaggio dei parametri nella nestra
piccola modica, ricavata da uno degli esempi forniti in sede di esercitazione è stato risolto l'errore.
Anche in questo caso il messaggio del
compilatore è stato fuorviante per la rilevazione della natura del problema, perciò alla risoluzione si è pervenuti grazie ad un approccio try and
error. In Appendice E il listatodell'errore relativo al sopracitato.
3. In fase di messa a punto della funzione
audio_inout
ci siamo confrontati
con diverse problematiche riguardanti il formato dei dati. La prima è stata sollevata dalla funzione
DSK6713_AIC23_read(), la quale utilizza come
variabile d'appoggio per il dato in ingresso un numero intero unsigned, cosa
che ci ha fatto inizialmente credere che i dati utilizzati per la codica fossero interi positivi, e quindi che le sinusoidi avessero subito una traslazione
con conseguente inserimento di un valor medio, rendendo errata la relazione 1. In realtà si è vericato che la funzione
DSK6713_AIC23_read()
restituisce un numero con segno(rappresentazione in complemento a due)
e quindi il prodotto viene fatto regolarmente senza armoniche aggiuntive
dovute ad un valor medio non nullo.
4. Come abbiamo detto precedentemente (si veda il Paragrafo 4), i valori
passati dal codec sono rappresentati su 16 bit, quindi il loro prodotto richiederà una rappresentazione a 32 bit. Tuttavia le impostazioni del codec
sono le stesse sia in lettura che in scrittura, quindi prima di poter mandare
i campioni in uscita è necessario dimezzare la loro dimensione. Il primo
tentativo di normalizzazione è stato fatto dividendo il numero a 32 bit per
216
e quindi prendendo solo i bit meno signicativi.
Questa operazione
però non dava il risultato desiderato, probabilmente a causa della codica
in complemento a due che, nel caso di numeri negativi, lasciava il bit più
signicativo ad 1 nonostante la normalizzazione, e di conseguenza la parte
meno signicativa non corrispondeva al numero rappresentato. Il problema è stato risolto prendendo la parte meno signicativa del numero a 32
bit solo dopo averlo shiftato di sedici passi verso destra: in questo modo
la codica legata al complemento a due non viene modicata ed i valori
in uscita risultano quelli che ci aspettiamo.
5. Come detto in precedenza, per la generazione di un campione di uscita occorre acquisire entrambi i canali dell'ingresso line in , questo ci ha suggerito
di leggerli contemporaneamente usando due funzioni
DSK_AIC23_read()una
di seguito all'altra; stessa cosa per la riproduzione dell'uscita si è pensato
di usare due funzioni
DSK_AIC23_write()una
10
per ogni canale. Ci siamo
però resi conto che tale meccanismo non dava il risultato sperato ed anzi ha creato da subito malfunzionamenti, a nostro avviso dovuti al fatto
che ogni interruzione legata al codec è in grado di fornire un unico dato
in ingresso. Non avendo trovato riferimenti sucienti alla comprensione
di tale problematica ci siamo orientati verso una soluzione separata per
ciascun canale, ogni volta che si ha un'interruzione, la funzione che viene
mandata in esecuzione acquisisce solo un canale e riproduce l'uscita mono
(che perciò al ciclo di avvio non sarà consistente), stessa cosa viene fatta
al ciclo successivo, quando viene acquisito, processato e riprodotto l'audio
per l'altro canale. Tale meccanismo comporta uno sfasamento fra uscita
destra e sinistra di un campione (1/48000 sec) del tutto trascurabile.
6. Un problema di più sottile interpretazione è stato riscontrato in fase di
messa appunto del ltraggio passa basso del segnale di uscita. Il primo
ltro realizzato in fase di messa a punto è stato un ltro FIR passa-basso
di ordine 483 con una frequenza di taglio di 10KHz. Facendo numerose
prove di ascolto del segnale ltrato confrontato con l'originale ci siamo resi
conto che il ltraggio non veniva eseguito in maniera corretta, nonostante
le prestazioni del ltro, dato l'elevato ordine, avrebbero dovuto essere eccellenti; in particolare il segnale di uscita era apparentemente di frequenza
più bassa rispetto a quella teorica e presentava una distorsione chiaramente udibile. Facendo riferimento a quanto visto nelle esercitazioni abbiamo
intuito potesse trattarsi un problema di carico computazionale, perciò abbiamo provato ad aumentare le prestazioni del codice scritto elevando il
livello di ottimizzazione del compilatore dal grado nullo al grado 2. In questo modo abbiamo immediatamente riscontrato un eettiva aderenza fra
il funzionamento teorico del ltro ed il ltraggio eettivamente eseguito
dal DSP. Tuttavia, considerando che un FIR di 483 campioni comporta un
pari numero di moltiplicazioni e somme per ogni campione, ovvero circa
46 milioni di MAC al secondo, con una dispendio notevole in termini di
occupazione della CPU, abbiamo preferito usare un ltro di prestazioni
inferiori ma più leggero, che utilizza soltanto 30 campioni (come mostrato
in Figura 6). Da notare che l'iniziale scelta di utilizzare un ltro di ordine
elevato è stata suggerita dalla eettiva vicinanza fra la armonicaad alta
frequenza e la gamma dell'udibile.
Appendici
A Librerie
Le librerie utilizzate per la realizzazione di questo progetto sono le seguenti:
•
csl6713.lib;
•
dsk6713bsl.lib;
11
•
dsk6713.h;
•
dsk6713_aic23.h;
•
dsk6713_dip.h.
B Congurazione dell'interruzione hardware
Di seguito sono riportati i passaggi per la congurazione dell'interruzione hardware:
1. Creazione di un nuovo DSP/BIOS Conguration
2. Utilizzando il menù ad albero aprire la sezione
Scheduling>HWI>HWI_INT12,
General>function speci-
tasto destro per aprirne le proprietà. Nella sezione
care la routine servita all'arrivo dell'interruzione hardware (se la funzione
è scritta in linguaggio C/C++ occorre anteporre il simbolo underscore "_"
al nome della funzione); quindi nella sezione
sull'opzione
Use Dispatcher.
Dispatcher abilitare la spunta
C Sorgente
//--------------------------------------------------------------------//
//-----------UNIVERSITA'-DI-PISA-----Facolta'-di-Ingegneria-----------//
//--------------------------------------------------------------------//
//----Architetture-e-Dispositivi-per-le-Apparecchiature-Biomediche----//
//---------------------------A.A.-2008/2009---------------------------//
//--------------------------------------------------------------------//
//----------------------------DSPlab--2009----------------------------//
//--------------------------------------------------------------------//
//-------------------------Progetto--Theremin-------------------------//
//--------------------------------------------------------------------//
//----------------------BRAVI---MEUCCI---TURTURICI--------------------//
//--------------------------------------------------------------------//
#include "dsk6713.h" #include "dsk6713_aic23.h" #include "dsk6713_dip.h"
#include <stdio.h> #include <std.h> #include <swi.h> #include <log.h>
#define N 31
int LeftRight=TRUE;
short Buffer[N];
Uint32 DataIn;
short AudioIn;
int AudioOut1;
int AudioOut2;
short Temp1;
short Temp2;
12
DSK6713_AIC23_CodecHandle hCodec;
DSK6713_AIC23_Config config = {
0x0017, // 0 DSK6713_AIC23_LEFTINVOL
0x0017, // 1 DSK6713_AIC23_RIGHTINVOL
0x00d8, // 2 DSK6713_AIC23_LEFTHPVOL
0x00d8, // 3 DSK6713_AIC23_RIGHTHPVOL
0x0011, // 4 DSK6713_AIC23_ANAPATH
0x0000, // 5 DSK6713_AIC23_DIGPATH
0x0000, // 6 DSK6713_AIC23_POWERDOWN
0x0043, // 7 DSK6713_AIC23_DIGIF
0x0000, // 8 DSK6713_AIC23_SAMPLERATE
0x0001 // 9 DSK6713_AIC23_DIGACT
};
Left line input channel volume
Right line input channel volume
Left channel headphone volume
Right channel headphone volume
Analog audio path control
Digital audio path control
Power down control
Digital audio interface format
Sample rate control
Digital interface activation
float FIRCOEFF[N] = {
0.003615916020563, 0.00939022030447, -0.002327276062725, -0.01489017555576,
-0.001526669438436, 0.02114958998158, 0.009117390009582, -0.02760773378687,
-0.02232581147514, 0.03360474555076, 0.04550341398387, -0.03847641516027,
-0.09450800713188, 0.04165523206708,
0.3143228176769,
0.4572403528939,
0.3143228176769, 0.04165523206708, -0.09450800713188, -0.03847641516027,
0.04550341398387, 0.03360474555076, -0.02232581147514, -0.02760773378687,
0.009117390009582, 0.02114958998158,-0.001526669438436, -0.01489017555576,
-0.002327276062725, 0.00939022030447, 0.003615916020563
};
short FIR(short* Buffer, short temp)
{
int i;
float out=0;
for (i=N-1; i>0; i--)
Buffer[i] = Buffer[i-1];
Buffer[0] = temp;
for (i=0; i<N; i++)
out += FIRCOEFF[i]*Buffer[i];
return((short)out);
}
void audio_inout()
{
DSK6713_AIC23_read( hCodec, &DataIn);
AudioIn=(short) DataIn;
if(LeftRight==TRUE)
{
Temp1= AudioIn;
DSK6713_AIC23_write(hCodec,AudioOut2);
LeftRight=FALSE;
}
else
{
13
}
Temp2= AudioIn;
AudioOut1 = (Temp2 * Temp1);
AudioOut2 = (short) (AudioOut1 >> 16);
if (DSK6713_DIP_get(0)==1)
{
AudioOut2=FIR(Buffer, AudioOut2);
}
DSK6713_AIC23_write(hCodec, AudioOut2);
LeftRight=TRUE;
}
void main()
{
CSL_init();
DSK6713_init();
hCodec = DSK6713_AIC23_openCodec(0, &config);
IRQ_globalEnable();
IRQ_enable(IRQ_EVT_XINT1);
}
D Errori di compilazione - linker
---------------------------Theremin.pjt-Debug---------------------------[Theremin.tcf] "E:\Programmi\CCStudio_v3.3\bios_5_31_02\xdctools\tconf" -b
-Dconfig.importPath="E:/Programmi/CCStudio_v3.3/bios_5_31_02/packages;"
Theremin.tcf
[Theremin.c] "E:\Programmi\CCStudio_v3.3\C6000\cgtools\bin\cl6x" -g pdsw225 -o3 -fr"E:/Programmi/CCStudio_v3.3/MyProjects/Theremin/Debug"
-d"_DEBUG" -d"CHIP_6713" -mv6710 -@"Debug.lkf" "Theremin.c"
[Theremincfg.s62] "E:\Programmi\CCStudio_v3.3\C6000\cgtools\bin\cl6x"
-g -pdsw225 -fr"E:/Programmi/CCStudio_v3.3/MyProjects/Theremin/Debug"
-d"_DEBUG" -d"CHIP_6713" -mv6710 -@"Debug.lkf" "Theremincfg.s62"
[Theremincfg_c.c] "E:\Programmi\CCStudio_v3.3\C6000\cgtools\bin\cl6x"
-g -pdsw225 -fr"E:/Programmi/CCStudio_v3.3/MyProjects/Theremin/Debug"
-d"_DEBUG" -d"CHIP_6713" -mv6710 -@"Debug.lkf" "Theremincfg_c.c"
[Linking...] "E:\Programmi\CCStudio_v3.3\C6000\cgtools\bin\cl6x"
-@"Debug.lkf" <Linking>
undefined
first referenced
symbol
in file
-----------------------_CSL6713_LIB_
E:\\Programmi\\CCStudio_v3.3\\
MyProjects\\Theremin\\Debug\\Theremin.obj
__IRQ_eventTable
E:\\Programmi\\CCStudio_v3.3\\
MyProjects\\Theremin\\Debug\\Theremin.obj
14
__CSL_init
E:\\Programmi\\CCStudio_v3.3\\
MyProjects\\Theremin\\Debug\\Theremin.obj
_MCBSP_open
E:\\Programmi\\CCStudio_v3.3\\
MyProjects\\Theremin\\dsk6713bsl.lib
_MCBSP_start
E:\\Programmi\\CCStudio_v3.3\\
MyProjects\\Theremin\\dsk6713bsl.lib
>> error: symbol referencing errors - './Debug/Theremin.out' not built
>> Compilation failure
Build Complete,
2 Errors, 0 Warnings, 0 Remarks.
E Errori di compilazione - Build Options
----------------------------Theremin.pjt-Debug---------------------------[Theremin.tcf] "E:\Programmi\CCStudio_v3.3\bios_5_31_02\xdctools\tconf"
-b -Dconfig.importPath="E:/Programmi/CCStudio_v3.3/bios_5_31_02/packages;"
Theremin.tcf
[Theremin.c] "E:\Programmi\CCStudio_v3.3\C6000\cgtools\bin\cl6x" -g -pdsw225
-o3 -fr"E:/Programmi/CCStudio_v3.3/MyProjects/Theremin/Debug" -d"_DEBUG"
-mv6710 -@"Debug.lkf" "Theremin.c"
"E:/Programmi/CCStudio_v3.3/C6000/csl/include/csl_chiphal.h", line 267: fatal
error: #error NO CHIP DEFINED (use -dCHIP_XXXX where XXXX is chip number,
i.e. 6201) 1 fatal error detected in the compilation of "Theremin.c".
Compilation terminated.
>> Compilation failure
[Theremincfg.s62] "E:\Programmi\CCStudio_v3.3\C6000\cgtools\bin\cl6x" -g
-pdsw225 -fr"E:/Programmi/CCStudio_v3.3/MyProjects/Theremin/Debug" -d"_DEBUG"
-mv6710 -@"Debug.lkf" "Theremincfg.s62"
[Theremincfg_c.c] "E:\Programmi\CCStudio_v3.3\C6000\cgtools\bin\cl6x" -g
-pdsw225 -fr"E:/Programmi/CCStudio_v3.3/MyProjects/Theremin/Debug" -d"_DEBUG"
-mv6710 -@"Debug.lkf" "Theremincfg_c.c"
Build Complete,
1 Errors, 0 Warnings, 0 Remarks.
15