Home
Accesso / Registrazione
 di 

Generatore di segnali mediante MATLAB: Esempio DTMF in telefonia

Generatore di segnali mediante MATLAB: Esempio DTMF in telefonia

Campionamento e generazione: Da un punto di vista matematico un segnale è una funzione reale di variabile reale f(t). Volendo specializzare tale definizione nel caso elettrico si può dire che esso rappresenti l'evoluzione di una tensione (o una corrente) nel tempo.

Lo schema semplificato per la generazione di un segnale arbitrario v(t) a partire dal campionamento digitale v(i) è il seguente:

Lo schema semplificato per la generazione di un segnale arbitrario

Originariamente l'informazione è disponibile in forma digitale, contenuta in un file sotto la forma di un vettore di numeri (campioni). Mediante l'ausilio di un buffer di memoria i campioni digitali vengono forniti in ingresso ad un convertitore digitale-analogico che produce alla sua uscita un segnale di tensione che viene proposto al mondo esterno dopo un opportuno stadio di amplificazione.

Per il teorema Shannon è necessario che la frequenza di campionamento fs deve soddisfare la relazione:

fs ≥ 2B
, dove B è la banda assoluta del segnale in questione.

Dettagli sul teorema del campionamento possono essere trovati in letteratura oppure anche in wikipedia.

Anche se il convertitore è in grado di assicurare un'elevate frequenza di campionamento, la banda assoluta del segnale da generare è legata alle prestazioni dello stadio d'uscita della scheda audio.

Essendo progettata per applicazioni sonore, essa è munita di un amplificatore con banda (nel caso ideale) 20KHz. A ciò va aggiunto l'inevitabile distorsione (ampiezza e fase) di cui il segnale d'uscita è affetto, maggiormente accentuata nell'intorno della frequenza di taglio superiore. Tutto ciò limita la generazione di segnali con una banda tipicamente non maggiore della decina di KHz.

Le problematiche che sorgono sono:

1- Occorre produrre il file che contiene il segnale in forma digitale.

2- E' necessario una struttura hw/sw capace di implementare la catena di conversione Digitale-Analogica (DAC).

Matlab e la scheda audio del PC

Una possibile soluzione al problema è costituita dall'uso combinato di Matlab e della scheda audio del PC. Matlab è un ambiente di calcolo numerico basato sulla struttura matriciale. Esso è pertanto capace di generare una funzione del tempo con estrema facilità(vettore unidimensionale). Inoltre, mediante funzioni specializzate, esso è capace di produrre il segnale della forma d'onda generata in un formato .wav ,che è compatibile con un qualunque 'sound player' per PC, sfruttando pertanto il convertitore e l'amplificatore d'uscita della scheda audio del PC. Quasi sempre occorre uno stadio esterno di condizionamento del segnale audio in base alle esigenze specifiche.

Matlab fornisce diverse funzioni per generare forme d'onda. La maggior parte di queste richiede la dichiarazione preliminare di un vettore tempo. Considerando una frequenza di campionamento (sample rate) pari a fs[Hz] è possibile creare il vettore tempo mediante la scrittura: t=linspace(0, end, end*fs

L'operazione crea un vettore tempo da zero a end secondi, partizionato in end*fs punti.

Volondo generare un tono a 20Hz di 2 secondi, il codice è:

t=linspace(0, 2, 2*10000)

y=sin(2*pi*20*t)

plot(t, y)

wavwrite(y, 10000, prova.wav)

generatore_di_segnale_mediante_grafico1

La funzione wavwrite(y,fs,'nomefile') genera il file audio nomefile.wav del vettore y campionandolo alla frequenza fs.

Esempio di generazioni toni DTMF

A titolo di esempio si considera la generazione dei toni dtmf della tastiera telefonica. Il Dual-Tone Multi-Frequency è un sistema di codifica usato in telefonia per codificare codici numerici sotto forma di segnali sonori in banda audio. La tastiera DTMF è costituita da una matrice 4x4, in cui ogni riga rappresenta una frequenza bassa e ogni colonna rappresenta una frequenza alta. Premendo per esempio il tasto 1 vengono inviate due onde sinusolidali alle frequenze di 697 e 1209 Hz il termine multifrequenza deriva da questo uso contemporaneo di due toni.

generatore_segnale_mediante_tabella

Le frequenze sono state scelte in modo che le armoniche e le intermodulazioni non generino segnali rilevanti. Il codice proposto di seguito permette di generare, mediante Matlab, il file dtmf.wav di 12 secondi che riproduce, ad intervalli di un secondo, la sequenza di toni DTMF dei tasti:
0-1-2-3-4-5-6-7-8-9-*-#


%------------------------------
%-- EXAMPLE OF DTMF GENERATION
%------------------------------

l=12; 				%-- durata segnale in secondi
fs=10000; 			%-- frequenza di campionamento in HZ
t=linspace(0,l,l*fs);	%-- genero l'asse temporale
 
fc1=697;			%-- frequenze
fc2=770;
fc3=852;
fc4=941;
fr1=1209;
fr2=1336;
fr3=1477;
 
y0 = sin(2*pi*fc3*t) + sin(2*pi*fr2*t); 	% 0
y1 = sin(2*pi*fc1*t) + sin(2*pi*fr1*t); 	% 1
y2 = sin(2*pi*fc1*t) + sin(2*pi*fr2*t); 	% 2
y3 = sin(2*pi*fc1*t) + sin(2*pi*fr3*t); 	% 3
y4 = sin(2*pi*fc2*t) + sin(2*pi*fr1*t); 	% 4
y5 = sin(2*pi*fc2*t) + sin(2*pi*fr2*t); 	% 5
y6 = sin(2*pi*fc2*t) + sin(2*pi*fr3*t); 	% 6
y7 = sin(2*pi*fc3*t) + sin(2*pi*fr1*t); 	% 7
y8 = sin(2*pi*fc3*t) + sin(2*pi*fr2*t); 	% 8
y9 = sin(2*pi*fc3*t) + sin(2*pi*fr3*t); 	% 9
y_start = sin(2*pi*fc3*t) + sin(2*pi*fr1*t); 	% *
y_canc  = sin(2*pi*fc3*t) + sin(2*pi*fr3*t); 	% #
 
y=zeros(1,length(t));
 
k=0;
s=length(y)-1;
s=s+1;


 
for i=1:s
    if k < s/12
        y(i)=y0(i);
    elseif k >= s/12 && k <((2*s)/12)
        y(i)=y1(i);
    elseif k >= ((2*s)/12) && k <((3*s)/12)
        y(i)=y2(i);
    elseif k >= ((3*s)/12) && k <((4*s)/12)
        y(i)=y3(i);
    elseif k >= ((4*s)/12) && k <((5*s)/12)
        y(i)=y4(i);
    elseif k >= ((5*s)/12) && k <((6*s)/12)
        y(i)=y5(i);
    elseif k >= ((6*s)/12) && k <((7*s)/12)
        y(i)=y6(i);
    elseif k >= ((7*s)/12) && k <((8*s)/12)
        y(i)=y7(i);
    elseif k >= ((8*s)/12) && k <((9*s)/12)
        y(i)=y8(i);
    elseif k >= ((9*s)/12) && k <((10*s)/12)
        y(i)=y9(i);
    elseif k >= ((10*s)/12) && k <((11*s)/12)
        y(i)=y_start(i);
    else
        y(i)=y_canc(i);
    end
    k=k+1;
end 

plot(t,y*0.4); wavwrite(y*0.4,fs,'dtmf.wav');

generatore_di_segnale_mediante_grafico2

eostech Umberto Calari, EOStech Srl

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 10 utenti e 56 visitatori collegati.

Ultimi Commenti