1. DESCRIZIONE DEL PROBLEMA "Codifica-Decodifica DTMF" Function file deve implementa: 1. La codifica DTMF di un numero di telefono di 7 cifre. Il segnale generato è costituito per ogni cifra da un tono di 0.5sec. seguito da un silenzio di 0.2sec. La frequenza di campionamento è Fs=8000Hz. Parametri di input: nume ro (stringa di caratteri relativa al numero) Parametri di output: tone (vettore contenente il segnale discreto che rappresenta il numero) 2. La decodifica di un segnale che individua un numero di telefono di 7 cifre. Il segnale è composto da un tono di 0.5sec. per ogni cifra seguito da un silenzio di 0.2sec. La frequenza di campionamento è Fs=8000Hz. Parametri di input: tone (vettore contenente il segnale discreto che rappresenta il numero) Parametri di output: numero (stringa di caratteri relativa al numero) 2. DESCRIZIONE DELL ALGORITMO L elaboratosi articola in due function : DTMFdec.m DTMF.m E di uno script per effettuare il test delle due function (TestDTMF.m). 2.1 function " TestDTMF.m" Lo script da la possibilità di lanciare le due function con un numero di 7 cifre. clear; clc; d = input ('inserisci un numero di 7 cifre [2542386]\n'); if isempty( d) numero = '2542386'; else numero = d; disp (['numero da codificare = ' numero]); %ottengo la codifica del numero tone = DTMF( numero); soundsc( tone, 8000); %riottengo il numero decodificato decoded_number= DTMFdec( tone); disp (['numero decodificato = ' decoded_number]); %controlla che il numero originale ed il decodificato siano uguali assert( all( numero== decoded_number )); Guerra Stefano Pagina 2
2.2 function " DTMF.m" Questa Function realizza la codifica DTMF di un numero di 7 cifre produco un output sonoro ed un grafico dello spettro equivalente alle frequenza codificanti il tono. SINTASSI: tone = DTMF(number) function tono = DTMF( numero) % Controllo sul numero di parametri in ingresso if ( nargin< 1) error ('La funzione prevede in ingresso un solo parametro' ); if length( numero) ~= 7 error ('Il numero in ingresso deve essere composto da 7 cifre' ); symbols = ['1' '2' '3' 'A'; '4' '5' '6' 'B'; '7' '8' '9' 'C'; '*' '0' '#' 'D']; gbf = [ 697 770 852 941 ]; %Gruppo a bassa frequenza faf = [ 1209 1336 1477 1633 ]; %Gruppo ad alta frequenza lnum = length( numero); Fc = 8000 ; %Frequenza di campionamento 8 khz N = 0.5* Fc ; %Numero di campioni equivalenti %ad un segnale di durata 0.5 sec alla freq di 8 khz t = 0: 1/ Fc:( N- 1)/ Fc ; % [0:1/Fc:0.4999] dpit = 2* pi* t ; %Definizioni di costanti utilizzate in seguito Lun_Tono = Fc* 0.5 ; %Lunghezza del tono Lun_Tono_Pausa = Fc* 0.7 ; %Lunghezza del tono compreso di intervallo silenzioso Lun_Tot_Toni = Lun_Tono_Pausa * lnum ; %Lunghezza del segnale complessivo di 7 toni tono = zeros( 1, Lun_Tot_Toni); %A partire dalle frequenze previste dalla codifica DTMF si realizza una %matrice che ad ogni simbolo associa la coppia prevista di frequenze. for i= 1: lnum %Determino le frequenze corrispondenti ai caratteri della stringa in %ingresso [ a b] = find( symbols == numero( i)); if ( isempty( a)) error ('Il numero inserito contiene caratteri non validi' ); singletone = sum( sin([ gbf( a); faf( b)]* dpit)); %Individuo il numero del campione a partire dal quale comincia il tono tindex = round(( i- 1)* Lun_Tono_Pausa); %Genero la sequenza di toni intervallati dalla pausa di 0.2 secondi Guerra Stefano Pagina 3
tono(( tindex+ 1):( tindex+ Lun_Tono )) = singletone; %Ascolto del segnale ottenuto. soundsc( tono, Fc); %Visualizziamo la curva del segnale sull'asse dei tempi tonetime = 0: 1/ Fc:( Lun_Tot_Toni - 1)/ Fc; figure( 1); plot( tonetime, tono); title ('signal'); xlabel ('sec'); Parametri di ingresso: numero: stringa di caratteri contenente la sequenza da codificare. Parametri di uscita: tono: segnale sonoro corrispondente alla codifica DTMF della sequenza in ingresso. Il segnale generato è costituito: per ogni cifra da un tono di 0.5 sec seguito da un silenzio di 0.2 sec La frequenza di campionamento è Fs=8000 Hz. Le frequenze associate ai tasti della tastiera di un comune telefono sono mostrate qui di seguito: 1209 Hz 1336 Hz 1477 Hz 1633 Hz ABC DEF KEY 697 Hz 1 2 3 A _ _ GHI JKL MNO KEY 770 Hz 4 5 6 B _ _ _ _ PQRS TUV WXYZ KEY 852 Hz 7 8 9 C _ _ _ _ KEY 941 Hz * 0 # D _ _ _ _ 2.3 funcion " DTMFdec.M " Questa Function realizza la conversione di un segnale sonoro in una sequenza di 7 cifre in base alla codifica DTMF. SINTASSI: numero = DTFMdec(toni) Parametri di ingresso: toni: segnale sonoro corrispondente alla codifica DTMF di una sequenza di cifre. Guerra Stefano Pagina 4
numero: numero di cifre corrispondente alla decodifica del segnale sonoro. function numero = DTMFdec( toni) %Controllo sul numero di parametri in ingresso if ( nargin< 1) error ('La funzione prevede in ingresso un solo parametro' ); if isvector( toni) == 0 error ('Il parametro in ingresso deve essere un vettore' ); Fc = 8000 ; %Frequenza di campionamento 8 khz Lun_Tono = Fc* 0.5 ; %Lunghezza del tono Lun_Tono_Pausa = Fc* 0.7 ; %Lunghezza del tono compreso di intervallo silenzioso Lun_Tot_Toni = length( toni ); %Lunghezza del segnale complessivo di 7 toni NumDigit = Lun_Tot_Toni / Lun_Tono_Pausa ; %Numeri digitati gbf = [ 697 770 852 941 ]; %Gruppo a bassa frequenza faf = [ 1209 1336 1477 1633 ]; %Gruppo ad alta frequenza original_f = [ gbf faf]; symbols = ['1' '2' '3' 'A'; '4' '5' '6' 'B'; '7' '8' '9' 'C'; '*' '0' '#' 'D']; %Inizializzazione di alcuni elementi utilizzati più avanti numero = zeros( 1, NumDigit); freqtono = ( 0:( Lun_Tono / 2))* Fc/ Lun_Tono ; %Vettore delle frequenze %A ciascun passo del ciclo lavoriamo su un tono distinto Figure(2); for i = 1 : NumDigit %Separo ciascun tono della sequenza tindex = round(( i- 1)* Lun_Tono_Pausa); singletone = toni(( tindex+ 1):( tindex+ Lun_Tono )); %Calcolo la dft di ciascun tono dfttono = fft( singletone ); %Visualizza il grafico dell'ampiezza della DFT figure( 1); amptono = abs( dfttono( 1:( Lun_Tono / 2)+ 1)); subplot( NumDigit, 1, i), stem( freqtono, amptono); set( gca, 'XTick', original_f, 'XTickLabel', original_f, 'Xlim', [ 650 1550]); %Individuo le frequenze in corrispondenza delle quali ho le componenti %di massima ampiezza. freqsfound = freqtono( amptono > 0.5* max( amptono)); Guerra Stefano Pagina 5
%Confronto le frequenze individuate con quelle previste dalla codifica %DTMF, valutandone la distanza relativa. distanza = abs([ gbf - min( freqsfound); faf - max( freqsfound)]); %Alle frequenze a distanza minima associamo una coppia di indici, che %poi utilizzeremo per individuare un simbolo nella matrice symbol. [ mini index] = min( distanza, [], 2); %Ad ogni passo dell'algoritmo aggiungo il valore così individuato alla %sequenza parziale. numero( i) = symbols( index( 1), index( 2)); xlabel ('Frequenze [Hz]'); title (['DFT del tono ' num2str( i ) ' il tasto premuto è: ' symbols( index( 1), index( 2 ))]); % num2str converte numeri in stringhe %Convertiamo la sequenza ottenuta in una stringa di caratteri. numero = char( numero); 3. ECCEZIONI PREVISTE Abbiamo previsto tre indicatori di errore: Numero errato di parametri di ingresso: >> tono = DTFM();??? Error using ==> number2tone at 19 La funzione prevede in ingresso un solo parametro Dimensione errata del parametro in ingresso: >> tono = DTFM('081');??? Error using ==> number2tone at 23 Il numero in ingresso deve essere composto da 7 cifre Numero in ingresso composto da cifre non previste: >> tone = DTFM('081223P');??? Error using ==> number2tone at 59 Il numero inserito contiene caratteri non validi. 4. ESEMPI D USO Effettuiamo un test con i numeri di default presentandone l output: Guerra Stefano Pagina 6
Guerra Stefano Pagina 7