Toni DTMF

« Older   Newer »
  Share  
view post Posted on 29/4/2018, 08:38
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ciao a tutti, apro questa nuova discussione, su un progetto di anni fa che vorrei riprendere.
I toni DTMF (https://it.wikipedia.org/wiki/Dual-tone_multi-frequency),
sono i classici toni delle tastiere dei telefoni.
Come si vede dal link, ogni singolo tasto è la somma (mix) di 2 frequenze.
E la frequenza alta ha intensità leggermente maggiore se non erro.
Il progetto era: in base alla registrazione estrarre e stampare i relativi numeri.
La bozza del progetto io l'avevo fatta in C, ma le idee sono generali.
Il problema dove sta?
Allora, io avevo pensato inizialmente di fare una registrazione separata, e salvare come file wave.
Gli altri file, mp3 ecc, hanno algoritmi di compressione che non conosco e che complicano la faccenda.
Registro perchè un'acquisizione direttamente da scheda audio in C non la so fare.
O meglio sono riuscito, ma non ho molta dimestichezza.
Quindi un passo alla volta: registro.
Una volta fatta la registrazione, potrei da programma andare a leggere i dati che compongono il suono,
e leggere il contenuto in modo binario.
Quindi la cosa più logica sarebbe fare un FFT che mi estrae le frequenze, e da li compararle, visto
che so a priori freq x=tasto Y.
Per la FFT in C c'è la libreria FFT3, velocissima, quindi non sarebbe un problema, ma non precisa al singolo Hz, se
non erro.
Oppure mi ero scritto una mia routine di DFT (è postata anche qui sul forum), estremamente lenta in confronto, ma precisa.
Almeno, se non ricordo male.
Però...c'è un però.
Al di la dei problemi che incontrerò, se non erro c'erano grane che ora non ricordo, la cosa peggiore è:
con la FFT io perdo la componente tempo.
Sei io digito 1,2,3 potrei anche estrarli, ma non saprei più l'ordine.
La FFT di una canzone a velocità normale, è uguale a un FFT della stessa, ma rallentata.
Mi estrae solo le frequenze e mi indica l'intensità.
Poi, non vorrei dire vaccate, sono cose complicate, magari non lo so io.
Quindi, consigli?
Bisognerebbe credo acquisire in modo interattivo: appena arriva un suono, elabora, e stampa, poi ascolta di nuovo.
Ma così facendo ho paura che dovrei usare processi o thread, che non so usare il C. Mi sono sempre
ripromesso di studiarli...ma...
e un loop, stile polling non so se funziona
Mha, se avete voglia, io sono qui
 
Top
view post Posted on 29/4/2018, 09:17
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


Bel progetto Gila.

Una cosa che non ho capito è se tu voglia discriminare la presenza contemporanea di più toni DTMF o se assumi che ne arrivi uno per volta.

Se si tratta di discriminarne uno singolo mi sembra strano che non si possa fare nulla col discorso della FFT, dato che fra il termine di un tono e l'inizio del successivo vedresti una pausa (assenza o quasi di livello audio) e questo ti dovrebbe consentire di rilevare non solo la sequenza dei tasti, ma anche di rilevare più pressioni consecutive dello stesso tasto.
In ogni caso se usassi una DFT con campioni brevi dal mio punto di vista riusciresti ad ottenere un compromesso fra velocità e accuratezza.

Forse mi manca qualcosa in tutto il discorso (tanto per dire la teoria della FFT non me l'hanno mai insegnata a scuola e, non avendo mai avuto bisogno di usarla me la sono letta in qualche occasione per conto mio ma non l'ho mai approfondita), ma dal mio punto di vista si tratta solo di parametrizzare la DFT che hai già fatto.

CITAZIONE
Bisognerebbe credo acquisire in modo interattivo: appena arriva un suono, elabora, e stampa, poi ascolta di nuovo.
Ma così facendo ho paura che dovrei usare processi o thread, che non so usare il C. Mi sono sempre
ripromesso di studiarli...ma...
e un loop, stile polling non so se funziona

La cosa più logica è quella del polling, legato ad un timer (per esempio legato all'orologio del PC o ad un brutale timer software con ciclo for o simile).
E' chiaro però che tutta ruoto attorno al discorso FFT o DFT.

Altrimenti usi una scorrettezza e impieghi una soluzione hardware; c'è un integrato (a dire il vero ce ne sono diversi, a cominciare dall'M8870 che usai più di 20 anni fa, che penso sia ora obsoleto ma trovabile nel web) che fanno la decodifica "al volo" dei toni DTMF e forniscono un codice binario in uscita corrispondente al bitono ricevuto.

Ecco il data sheet

Se questo integrato lo interfacci ad un microcontrollore puoi inviare il tutto al PC tramite porta seriale (semplice) o USB (decisamente più complicato ma fattibile).
Ma d'altronde si sa: sono un elettronico, non un informatico. :rolleyes:
 
Top
view post Posted on 29/4/2018, 10:05
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Si, la soluzione hardware mi era stata proposta anche altrove.
Sicuramente è più veloce e prestante, ma volevo provare via software.
Anche perchè di hardware non tocco nulla da anni e PORCO-DI-QUEL-MONDO mi stai facendo venire una
voglia matta di ritirare fuori tutto...vedremo.

CITAZIONE
Una cosa che non ho capito è se tu voglia discriminare la presenza contemporanea di più toni DTMF o se assumi che ne arrivi uno per volta.

In che senso ? Io potrei digitare 1,5,6 e registro in un file.
In quel file ci saranno le frequenze che compongono 1,5,6.
Se io faccio la fft, mi restituisce le frequenze, ma non l'ordine:
l'asse x è la frequenza, y l'intensità.
Quindi supponiamo che il 5 abbia frequenze più basse, io lo vedo prima dell'1 ma è stato digitato dopo.
Poi, ma ci devo ragionare, prendilo con le pinze.
Se noti due numeri diversi es:
3=697 hz e 1477 hz
6=770 hz e 1477 hz

supponiamo questi 2 numeri nella registrazione.
Se non ragiono male, facendo una fft troveri:
un picco da 697, uno da 770 e uno da 1477 quando invece sono 2 !!!
Ora non mi chiedere se quello da 1477 lo vedo doppio in intensità perchè si somma....non saprei
Anche io come te, anzi di più, non conosco bene la fft, solo e puro hobby.
Quindi devo trovare una strada alternativa.
Che potrebbe essere:
Registro e salvo come wave.
Parto con il mio programma in C, e inizio a leggere i dati.
Se l'intensità, è molto bassa, significa che non sta entrando nulla, e non memorizzo nell'array di float o duble
che servirà per la FFT.
Quando il volume è significativo, inizio a memorizzare. Quando torna a essere basso mi fermo.
Memorizzo dove sono arrivato a leggere nel file e mi fermo.
Analizzo l'array con fft e comparo, stampo.
Ora ricomincio da dove ero rimasto.
Potrebbe essere un modo.
Certo, tra un tono e l'atro non ci devono essere disturbi, altrimenti il metodo viene ingannato.
C'è poi la grana: ok, ma volume basso non memorizzo.
Ma quanto basso ? E se faccio una registrazione successiva e i volumi sono differenti ?
lo standard di prima non mi va più bene.
Si potrebbe ovviare normalizzando sempre allo stesso livello.
Buttata li: potrei cercare il volume massimo nel file e da li "traslare" il tutto in proporzione a un livello scelto
a priori.
Come sai, anche dietro banalità ci sono un sacco di cose da risolvere.
Vale la pena via software? Decisamente no.
Ma a volte sono sfide. Se non ci lavori te lo puoi permettere.
Che ne pensi dei ragionamenti, ti sembrano validi/fattibili?
 
Top
Elemento 38
view post Posted on 29/4/2018, 10:27




QUOTE
Io potrei digitare 1,5,6 e registro in un file.
In quel file ci saranno le frequenze che compongono 1,5,6.
Se io faccio la fft, mi restituisce le frequenze, ma non l'ordine

È un po’ che non guardò FFT e simili(almeno la parte di matematica), ma secondo me il ragionamento da cui parti è sbagliato.
Dopo aver trasformato in frequenza un segnale, portandolo di nuovo nel dominio del tempo ti darebbe un segnale periodico con ogni periodo uguale al tuo segnale.
Segnale originale : ___1 5 6 ___
Segnale dopo trasformata inversa: ___1 5 6 ______1 5 6 ______1 5 6 ______1 5 6 ___...

Quello che dovresti fare, secondo me, è non analizzare la tua registrazione tutta in una volta, ma tono per tono. Alcuni esempi su come fare:
- potresti pre-processare la registrazione e dividerla in più registrazioni usando come punti di taglio dove non si sente alcun suono
- potresti avere una finestra sulla registrazione abbastanza stretta da non includere più tasti premuti, ma abbastanza larga da non perdere precisione
 
Top
view post Posted on 29/4/2018, 10:51
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


E' vero Ele, se fai la trasformazione inversa recuperi il tempo. Devo ripassare un po'.
Si l'idea e' piu' o meno quella, dividere il file
 
Top
view post Posted on 29/4/2018, 12:55
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


CITAZIONE
Parto con il mio programma in C, e inizio a leggere i dati.
Se l'intensità, è molto bassa, significa che non sta entrando nulla, e non memorizzo nell'array di float o duble
che servirà per la FFT.
Quando il volume è significativo, inizio a memorizzare. Quando torna a essere basso mi fermo.
Memorizzo dove sono arrivato a leggere nel file e mi fermo.
Analizzo l'array con fft e comparo, stampo.
Ora ricomincio da dove ero rimasto.

In realtà era la soluzione che intendevo io: quando il volume si alza fai l'analisi, quando si abbassa la termini e tiri le conclusioni. Poi riavvi e aspetti il nuovo innalzamento del volume....e così via.

CITAZIONE
Ma quanto basso ? E se faccio una registrazione successiva e i volumi sono differenti ?
lo standard di prima non mi va più bene.
Si potrebbe ovviare normalizzando sempre allo stesso livello.
Buttata li: potrei cercare il volume massimo nel file e da li "traslare" il tutto in proporzione a un livello scelto
a priori.

Quando sviluppo dei sensori (di fatto anche questo che stai facendo tu è un sensore) aggiusto i livelli selezionando i livelli medi minimo e massimo e scegliendo com livello di discriminazione il valore intermedio.
Nel tuo caso, visto che hai un file preregistrato, potresti "ascoltartelo" tutto e campionare i volumi. A questo punto potresti calcolarti il valore che si trova a metà e usarlo, durante il secondo ascolto, come soglia di discriminazione suono/non suono.

E' chiaro che se i volumi, da un file all'altro, possono variare di molto questa è l'unica strada, altrimenti potresti fissare una soglia arbitraria di partenza e adeguarla durante l'ascolto (in questo caso non dovresti fare una prima scansione per campionare i volumi e una seconda per discriminare il suono, ma te ne basterebbe una sola).
Sinceramente il rumore di fondo dovrebbe essere sempre limitato (con gli hardware moderni il rapporto segnale/disturbo è aumentato), quindi fruscii vari dovrebbero essere poco percettibili e la stessa soglia arbitraria che ti dicevo prima dovrebbe avere una bella tolleranza.
 
Top
view post Posted on 29/4/2018, 13:13
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Grazie GWF, devo mettere insieme un po' le idee, poi magari ci provo.
Una bozza ce l'avevo già, ma a sto punto meglio se ricomincio daccapo.
Mi ha messo la pulce nell'orecchio Elemento 38: in effetti quando fai una fft, puoi sempre fare un reverse, e quindi il tempo
non va perso.
Ma io non so perchè mi pare di ricordare di avere avuto questo problema.
C'è da dire che la FFT è complessa e magari io la usavo in modo errato, ma per i miei scopi andava bene.
Per esempio metà dei dati se non ricordo male sono uguali alla prima metà, quindi io non li usavo...bhò...
Bisogna leggere un po' è fare prove
 
Top
Elemento 38
view post Posted on 29/4/2018, 18:11




Secondo me qua si sta complicando un affare che è relativamente semplice :)
Visto che l’obiettivo non è fare qualcosa in HW (vista la sezione), molte parti discusse sono superflue a mio parere.

Prima cosa, bisogna decidere il tipo di input, che può essere:
- un file pre registrato
- valori in real time dalla scheda audio, Con un processo che appende su file ogni valore campionato

Il programma che decodifica i toni deve:
1. leggere i primi N valori dal file, eliminarli e applicare l’algoritmo FFT o simili. N deve essere una potenza di 2 (2048 ad esempio), calcolato usando il valore della frequenza di campionamento in modo tale da permettere di visualizzare tutte le frequenze interessate dopo aver applicato la trasformata
2a. se il valore medio delle ampiezze alle varie frequenze è sotto una certa soglia, non c’e nessun tono da analizzare
2b. se il valore medio è più alto del previsto, siamo in presenza di un tono. Bisogna estrarre dall’array risultato della FFT i due valori più alti, è gli indici ci diranno a che frequenza corrispondono. Una interpolazione con la tabella è il tono è decodificato
3. Ripartire da 1

Ovviamente questo non è il metodo che userei in un microcontrollore o sistema embedded, ma visto che non ci sono constraints sul sistema, meglio prendere una strada semplice :)
 
Top
view post Posted on 29/4/2018, 19:37
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE
Secondo me qua si sta complicando un affare che è relativamente semplice :)

Può essere, ma la mia piccola esperienza m'insegna che le insidie sono sempre di più di quello che ti aspetti.
Sia dal punto di vista teorico, sia implementativo (il C poi non aiuta).

CITAZIONE
Prima cosa, bisogna decidere il tipo di input, che può essere:
- un file pre registrato
- valori in real time dalla scheda audio, Con un processo che appende su file ogni valore campionato

Un file direi che per iniziare è meglio. Avevo provato a studiare Alsa ma ci ho rinunciato. Riesco a importare direttamente
dalla scheda con portaudio, ma l'ho usato solo poche volte.
File è meglio per ora.
Direi, wave, senza complicarci la vita: vado al 44° byte (se ricordo bene) e in modalità binaria leggo.

CITAZIONE
1. leggere i primi N valori dal file, eliminarli e applicare l’algoritmo FFT o simili. N deve essere una potenza di 2 (2048 ad esempio), calcolato usando il valore della frequenza di campionamento in modo tale da permettere di visualizzare tutte le frequenze interessate dopo aver applicato la trasformata

Ok, qui un piccolo problema (se ricordo bene), tu sei fresco di matematica e mi puoi confermare smentire:
Supponi un wave a 44100 Hz di sample rate, quindi 44100/2=22050 massima frequenza registrabile, secondo il teorema
di...di...insomma un tizio forse Nyquist, non ricordo.
FFT di 1024 punti, quindi avrò una risoluzione di 22050/ (1024/2)= 43 hz
E quindi nel cercare i picchi dovrò tenere conto di queste tolleranze.
La DFT invece che mi ero scritto (non ho inventato nulla eh!!! ) è molto lenta ma precisa al singolo Hz.

CITAZIONE
2a. se il valore medio delle ampiezze alle varie frequenze è sotto una certa soglia, non c’e nessun tono da analizzare

Anche qui, sembra facile, ma non credo sia così semplice...ma non so, bisogna provare.
Una sorta di "normalizzazione" secondo me va fatta. A meno che non sia ha l'accortezza di registrare sempre nello stesso
modo.

Appena ho tempo mi metto in ballo e faccio prove con Audacity, dove posso generare frequenze, anche toni dtmf ecc..
e poi ci sarebbe da ripassare la fft, almeno il grosso.
Se non erro però il discorso della risoluzione degli hz in base alla finestra è quello,
Per ridurre devi aumentare i punti della fft, con conseguente aggravio prestazionale.
Ma quello non credo sia un problema. La fftw3 è velocissima.

Certo che via hardwre sarebbe una figata da provare....
M'interessa il tuo\vostro parere su:
CITAZIONE
Ok, qui un piccolo problema (se ricordo bene), tu sei fresco di matematica e mi puoi confermare smentire:
Supponi un wave a 44100 Hz di sample rate, quindi 44100/2=22050 massima frequenza registrabile, secondo il teorema
di...di...insomma un tizio forse Nyquist, non ricordo.
FFT di 1024 punti, quindi avrò una risoluzione di 22050/ (1024/2)= 43 hz
E quindi nel cercare i picchi dovrò tenere conto di queste tolleranze.
 
Top
view post Posted on 29/4/2018, 21:23
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


Non mi esprimo, altrimenti se mi scappa detto qualcosa sull'hardware Ele mi sgrida. :cry: ......... :rolleyes:
 
Top
view post Posted on 29/4/2018, 21:44
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


In che senso ?
Dai, di la tua, non e' vietato parlare anche di hardware.
 
Top
view post Posted on 29/4/2018, 22:03
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


CITAZIONE
Dai, di la tua, non e' vietato parlare anche di hardware.

Ovviamente scherzavo. :lol:

Ma come ha detto Ele non ha senso parlare nella sezione informatica di una soluzione hardware.
Capisco la libertà di espressione, gli OT, le divagazioni, ma se cominciamo a mescolare tutto creiamo una macedonia chef , cosa che voglio evitare perchè altrimenti mi sembra di frequentare uno dei social da cui sto cercando di fuggire.

Vai a vedere la foto di intestazione sulla mia pagina di FB, così ti rendi conto di come la penso.
 
Top
view post Posted on 29/4/2018, 22:21
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ok, forse si hai ragione, meglio non far casino...e sai benissimo che io di natura...diciamo che ci metto (in buona fede) meno di zero ad andare OT !!
Appena posso faccio le prime prove.
 
Top
view post Posted on 29/4/2018, 22:24
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


Eventualmente si può aprire una discussione sulla versione hardware di quello che stai facendo tu in una delle sezioni di elettronica.
 
Top
view post Posted on 29/4/2018, 23:19
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ok, sarei curioso di sapere un po' il principio di funzionamento di integrati simili. Presumo abbiano filtri "strettissimi" per poi elaborare il tutto. Ma mi fermo.
 
Top
102 replies since 29/4/2018, 08:38   907 views
  Share