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