Indice |
Generalità
In conformità, per questa volta, col sottotitolo del presente blog "piccole avventure in laboratorio", racconto come ho sviluppato un'idea: quella di fare un relè fonico che sia in grado di riconoscere il suono di una percussione campionato. Ho dedicato attenzione sopratutto all'approccio e al risultato, lasciando correre qualche ingenuità nella parte elettronica e qualche arbitrio nei calcoli.
La scheda
L'hardware è costituito da una scheda con microcontrollore DsPic33. Riporto lo schema con qualche avvertenza:
Le resistenze di polarizzazione dei transistor vanno verificate accertandosi che la tensione di collettore dei primi due stadi e principalmente la tensione di uscita dell'emitter follower siano pari a 1,65V.
Un partitore resistivo fornisce alla MCU le tensioni di riferimento Vref+, Vref- per il corretto funzionamento dello Analog to Digital Converter.
La banda passante audio è circa 50 Hz - 10 kHz, il microfono è un elettrete piccolo.
E' chiaro che manca il relè vero e proprio, a buon intenditor..
Riporto una foto della realizzazione fatta, con piccole differenze sopratutto nella parte di alimentazione: il regolatore di tensione a componenti discreti consente un bassissimo dropout per cui la batteria da 3,6V è sufficiente.
Lo spettro di frequenza
Per ricavare lo spettro discreto cioè "a barre" si è simulata una serie di risonatori. Lo schema di ciascun risonatore è il seguente, in cui si è evidenziato il nodo N:
Eguagliamo la corrente entrante nel nodo N dalla resistenza R, alla somma delle due correnti uscenti verso l'induttanza L e verso il condensatore C. La corrente nell'induttanza viene indicata semplicemente con i.
Pertanto abbiamo:
Quanto sopra tiene conto dei valori medi durante un generico passo di iterazione, V1p e V2p sone le tensioni iniziali, V1 e V2 le tensioni finali e dt è la durata del passo.
Per il passo successivo dobbiamo aggiornare la corrente nell'induttanza.

pertanto:

Dobbiamo ancora aggiornare le "tensioni precedenti" per il passo successivo:

I parametri circuitali R, L, C si riferiscono a uno schema elettrico fisicamente inesistente.
Possiamo sostituirli coi parametri che ci interessano: pulsazione Ω di risonanza, e fattore di merito Q.
Le relazioni sono:


Essendovi un parametro circuitale libero possiamo porre semplicemente R=1.
E' chiaro che ogni pulsazione di risonanza di un filtro corrisponde alla frequenza di una barra dello spettro, e il relativo fattore di merito fornisce la risoluzione o "larghezza" della stessa barra. L'altezza della barra è invece data dal picco raggiunto dal segnale di uscita V2.
La (1), risolta rispetto a V2, la (2) e la (3) costituiscono i tre gradini che compongono ogni passo di elaborazione.
Con questo metodo ho ottenuto risposte attendibili rispettando le seguenti condizioni:
- Il numero di passi elaborati è tale da coprire almeno Q periodi della frequenza di risonanza del filtro.
- La frequenza di campionamento 1/dt è almeno pari a 6 volte la frequenza di risonanza del filtro.
- La frequenza di campionamento 1/dt è almeno pari a 2 volte la massima frequenza contenuta nel segnale V1.
Quindi si può risparmiare del tempo di elaborazione, alle frequenze più alte limitando il numero dei passi elaborati, e alle frequenze più basse riducendo anche la frequenza di campionamento cioè prendendo i campioni "a saltare".
Comunque in virgola mobile non ci sono da fare divisioni e le moltiplicazioni che occorre fare in tutti i passi sono soltanto quattro, che con piccole varianti al metodo potrebbero ridursi ulteriormente.
Allo stato attuale abbiamo 30 barre con frequenze da 50 a 9891 Hertz spaziate in progressione geometrica con ragione 1,2. Di conseguenza Q=5 e il numero totale dei campioni acquisiti è 7540 con intervallo dt=15,91 microsec, dato direttamente dallo stesso ADC in free running.
I campioni sono da 12 bit e vengono salvati in un vettore dichiarato nel main program, poichè nell'area common non ci stava, come int camp[7540];. Ogni barra dello spettro viene calcolata in floating point e poi salvata in formato intero in un vettore, dichiarato come unsigned int bars [30];.
La funzione di valutazione
E veniamo al dunque. Eseguendo manualmente più volte la stessa percussione, anche se apparentemente allo stesso modo, in realtà si ottengono campioni sempre diversi. L'unica cosa che mostra qualche ripetitività è la posizione dei picchi "principali" (?) del relativo spettro. Preciso che la lettura dei 7540 campioni della "bussata" viene avviata non appena il segnale in ingresso arriva al livello metà del massimo. Procediamo per elaborazioni successive:
- Ricordiamo che il vettore bars[30] contiene l'altezza delle 30 barre che compongono lo spettro mentre l'indice dello stesso vettore rappresenta la frequenza della barra. In tale vettore vengono ricercati i picchi, nel seguente modo: gli elementi del vettore a partire dal secondo vengono confrontati col precedente. Se c'è una crescita, il valore del picco viene aggiornato, se c'è una decrescita il valore così aggiornato viene accettato come picco a condizione che possieda abbastanza accentuazione cioè sia abbastanza maggiore della media delle due barre adiacenti.
- Per ospitare i soli picchi, viene prodotta una matrice con 10 colonne e 2 righe dichiarata come unsigned int ipicc [10][2];. La prima riga di tale matrice contiene il numero indice della barra del picco, che ne rappresenta la frequenza, mentre la seconda riga contiene l'accentuazione del picco come sopra calcolata.
- Le 10 colonne della detta matrice ipicc [10][2] vengono ordinate prima per accentuazione decrescente, e poi le prime 4 colonne vengono riordinate per frequenza crescente. In tal modo, la matrice conterrà prima il picco a frequenza più bassa e poi i picchi più accentuati. Soltanto le prime 4 colonne, da questo punto della elaborazione in avanti, vengono considerate significative.
- Se il tastino "memo" è chiuso vuol dire che ci troviamo nella prima sessione di campionamento, in tal caso la prima riga della matrice ipicc [10][2] viene salvata in Eprom. Nelle altre sessioni verrà invece riletta dalla stessa Eprom e usata come termine di paragone. (per inciso debbo notare che il dspic33 è privo di una vera e propria Eprom, pertanto occorre emularla in flash memory tramite del software apposito).
- Alla fine dobbiamo confrontare 4 numeretti che rappresentano le frequenze più significative, privilegiando il primo che rappresenta il picco dello spettro a frequenza più bassa. Non mi dilungo sulla funzione di valutazione vera e propria ma è molto elementare e fornisce risultati abbastanza piacevolmente rispondenti.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)
