Toni DTMF

« Older   Newer »
  Share  
Elemento 38
view post Posted on 30/4/2018, 18:42




QUOTE
Non mi esprimo, altrimenti se mi scappa detto qualcosa sull'hardware Ele mi sgrida. :cry: ......... :rolleyes:

:lol: :lol:

Non mi esprimo sui calcoli perche' queste cose le ho toccate troppo tempo fa, e rischierei di dire qualcosa di sbagliato, anche se quello che hai scritto mi sembra abbia senso.

Se non sbaglio, DFT e FFT sono esattamente la stessa cosa, solo due modi diversi (uno piu' veloce) di approcciare il problema, ed entrambi dipendono dal numero di campioni per il numero di frequenze in uscita. Di FFT ce ne sono varie implementazioni, e la precisione e' la stessa di una DFT (a meno che l'algoritmo scelto non diminuisce la precisione apposta per andare piu' veloce, come usare dati a 8/16bit invece che 32)
 
Top
view post Posted on 30/4/2018, 18:49
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ho fatto oggi delle prove, ma mi sa che che ho azzardato troppo, e il progetto è un po' oltre le mie capacità e conoscenze
temo.
Il problema è che non ricordo (o forse non l'ho mai saputa bene) la teoria della FFT.
Magari voi mi potete dare una mano:
Ho rispolverato l'algoritmo in C, e come prova ho fatto una sinusoide a 400 hz su audacity.
Salvo a 44100 hz di sample rate, modalità wav, 16 bit.
Apro il programma in C, leggo i dati, li elaboro con fft, li reindirizzo su file e li grafico.
Si vede benissimo il picco netto dei 400 hz.
Il problema è che una sinusoide è un segnale periodico. Una registrazione no.
Ora, non mi ricordo, ma sono sicuro di aver letto qualcosa sui segnali periodici e quelli no.
La domanda è: se io ho una finestra di 1024 punti di FFT, analizzando solo un pezzettino (essendo periodica e tutta uguale)
estraggo le linee spettrali correttamente. Giusto ?
Ma sui segnali non periodici? Mi sorge il dubbio che debba fare più FFT. Non so, non mi ricordo se la cosa l'avevo già
affrontata o meno.
Cioè se io ho una finestra di 1024 punti, quando leggo il file, i 1024 punti operano solo all'inizio?
E quindi devo fare n fft totali= dimensione file/punti fft ?
Oppure qui 1024 punti si "spalmano" su tutto il segnale ?
 
Top
Elemento 38
view post Posted on 30/4/2018, 19:30




Quando fai una FFT e' come se facessi un'analisi instantanea delle frequenze, ma invece che essere instantanea hai bisogno di N campioni (e del tempo che serve per campionarli).
La FFT considera quel segnale di N campioni come se fosse un segnale periodico, che si ripete nel tempo, con periodo "N campioni"

Bisognerebbe tirare fuori i libri di nuovo, sono arrugginito anche io su questa materia....
 
Top
view post Posted on 30/4/2018, 19:54
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE (Elemento 38 @ 30/4/2018, 20:30) 
Quando fai una FFT e' come se facessi un'analisi instantanea delle frequenze, ma invece che essere instantanea hai bisogno di N campioni (e del tempo che serve per campionarli).
La FFT considera quel segnale di N campioni come se fosse un segnale periodico, che si ripete nel tempo, con periodo "N campioni"

Bisognerebbe tirare fuori i libri di nuovo, sono arrugginito anche io su questa materia....

Grazie Ele.
Comunque ho aggiustato adesso. Ho esteso al tutto il wav, cioè tante fft da coprire tutto il wav, e ora viene.
Po magari posto un grafico.
Il bello che guardando i vecchi programmi avevo già affrontato la cosa: completamente rimosso.
Bon, fino a qui ci siamo. Ma gli inghippi non sono finiti...te l'avevo detto... :D
Detta in breve: faccio la mia fft, ottengo 2 righe spettrali per esempio del tasto 5
Cerco il picco più alto 1136 hz, magari corrispondente a un valore fft di 100000.
Ora tocca al minore. Ma il minor picco, non è il secondo numero più grande dopo il 100000
potrebbe essere 100000 il piu grande, è 40000 il secondo...
Ora sono di fretta, domani spiego meglio.
 
Top
Elemento 38
view post Posted on 30/4/2018, 20:05




Secondo me e' molto piu' semplice trovare gli indici dei due valori piu' grandi, e usare una tabella che ti da' la frequenza del tono:

CODE
v = 0
f1 = -1
for k in range(len(fft_result)):
   if (fft_result[k]>v):
      v = fft_result[k]
      f1 = k

fft_result[f1] = 0 // sarebbe meglio azzerare tutti i valori intorno al massimo
v = 0
f2 = -1
for k in range(len(fft_result)):
   if (fft_result[k]>v):
      v = fft_result[k]
      f2 = k

if f1<704 and f1>690:
  f1=697
if f2<704 and f2>690:
  f2=697

[...]

if f1==697 and f2 == 697:
  tone = '1'

[...]


Ovviamente ci sono migliori modi per implementarlo, ma questa e' solo un'idea

Edited by Elemento 38 - 30/4/2018, 23:23
 
Top
view post Posted on 30/4/2018, 22:18
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Devo vedere bene il codice che hai messo Ele, e qui sul cell faccio fatica.
Pero' i 2 indici piu' grossi, come ho detto non sono per forza i 2 picchi piu' significativi.
Il picco maggiore, non e' isolato, ma man mano scala, immagina di vedere una "guglia" quindi a dx e sx, ci sono 2 picchi minori del maggiore, ma comunque piu' alti dell'altra frequenza che io vado a cercare. Ci devo pensare.
Anche il metodo di cercare nel file, fino a dove trovo un volume significativo (presenza di tono dtmf) per poi fare la fft potrebbe non essere valido al 100% :
Ciclo finche' il volume sta sotto una certa sogli, es 100. Ora sono in presenza di toni, quindi si alza. Sono entrato nella porzione audio. Quindi ok, da li in poi registro, finche' il volume sta alto.
Sembra filare.Ma se ci rifletto, all'interno del tono, passero' per le semionde negative, interropendo prematuramente la registrazione.
Sono grane d'aggirare secondo me.
Una cosa alla volta.Oggi dovrei avere sistemato la fft, che ora sembra dare risultati giusti, poi ci penso. In fondo non ho tempi di consegna.
Aspetto ( se avete voglia) conferme o smentite di questi ragionamenti.
Scusate eventuali errori, ma al cellulare divento pazzo a scrivere ...
 
Top
Elemento 38
view post Posted on 30/4/2018, 22:29




QUOTE
Pero' i 2 indici piu' grossi, come ho detto non sono per forza i 2 picchi piu' significativi.
Il picco maggiore, non e' isolato, ma man mano scala, immagina di vedere una "guglia" quindi a dx e sx, ci sono 2 picchi minori del maggiore, ma comunque piu' alti dell'altra frequenza che io vado a cercare.

Un metodo sarebbe azzerare tutti i valori intorno al più alto, dopo averlo trovato. Ovviamente il numero di valori da azzerare deve essere
- abbastanza alto per non mascherare la seconda armonica più alta
- non troppo alto in modo da non mascherare altre frequenze utili

Continuo a dire che, secondo me, analizzare il file per capire quando hai una un tono e poi applicare la FFT rende il tutto più complicato. Sarebbe molto più semplice applicare di continuo una FFT ogni X valori campionati ed analizzare le frequenze in uscita, se hai due armoniche che sono più alte del rumore, sei in presenza di un tono. Il tutto va calibrato per capire quanto rumore c’è, ma una calibrazione è più semplice che analizzare il file campionato nel dominio del tempo.
 
Top
view post Posted on 30/4/2018, 22:42
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Potrebbe essere un'idea.
Devo provare.
Bho, poi se davvero e' un progetto assurdo, che fa perdere solo tempo...pazienza, non lo potevo sapere.
Rifletto sulla tua idea, grazie !
 
Top
view post Posted on 1/5/2018, 08: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
Sembra filare.Ma se ci rifletto, all'interno del tono, passero' per le semionde negative, interropendo prematuramente la registrazione.
Sono grane d'aggirare secondo me.

Non so come funzioni la funzione fft, ma, se non è fatta da bestia, deve tenere conto del fatto che sta elaborando un segnale variabile (periodico o aperiodico poco importa) e non sta invece misurando una tensione. Quello che intendo dire è che l'analisi viene effettuata su un segnale elettrico che varia nel tempo, con una sua frequenza e una sua ampiezza, quindi è ovvio che avrà dei picchi positivi e altri negativi.
Prova di pensare ad un voltmetro in alternata (o anche al classico Vu-meter): non è che nei picchi positivi arrivi al valore massimo e poi torna a scendere su quelli negativi; semplicemente misura il valore di picco del segnale durante le semionde positive e si disinteressa di quelle negative (o magari usa anch'esse per misurare il valore di picco, questa volta negativo).
Se la funzione fft cambiasse responso in base allla semionda significherebbe che sta funzionando male, perchè puoi calcolare una fft su un segnale che varia nel tempo, non su uno fisso di valore x.

CITAZIONE
Sarebbe molto più semplice applicare di continuo una FFT ogni X valori campionati ed analizzare le frequenze in uscita, se hai due armoniche che sono più alte del rumore, sei in presenza di un tono. Il tutto va calibrato per capire quanto rumore c’è, ma una calibrazione è più semplice che analizzare il file campionato nel dominio del tempo.

Beh, i rumore, in quanto tale, contiene praticamente tutte le frequenze dello spettro, fino a x MHz. Poi c'è la questione, in campo audio, del rumore bianco (che ha una banda passante maggiore, quindi anche una buona quantità di componenti in frequenza alte) e il rumore rosa che è più limitato sulle alte frequenze.
Per realizzare una buona discriminazione bisogna, a mio parere, fare come dici tu, Ele, continuando a calcolare la fft ogni n campioni ed estrarre l'ampiezza massima del valore rilevato.
Quando nei calcoli (scansioni) successive viene superato tale valore moltiplicato per una fattore N (per esempio per 2, tanto per evitare che le normali variazioni di ampiezza del rumore di fondo possano venire considerati come toni), consideri di avere ricevuto i toni e puoi procedere con l'elaborazione.
 
Top
view post Posted on 1/5/2018, 08:49
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Finestre multiple di fft potrebbero dare risultati errati.
Che succede se si accavallano. Il tono verrebbe rilevato 2 volte, quando invece non e' cosi...

EDIT: metto le mie considerazioni fatte fin'ora in rapporto anche alle vostre idee:
CITAZIONE

CITAZIONE
Finestre multiple di fft potrebbero dare risultati errati.

come detto sopra, la mia paura è che se una finestra di FFT mi acchiappa (ipotesi) per metà un tono e di fortuna me lo
legge, quando va a fare la seconda metà e sempre di fortuna lo interpreta, mi darà esempio un tasto 5,5 a fronte
di un solo 5

CITAZIONE
Se la funzione fft cambiasse responso in base allla semionda significherebbe che sta funzionando male, perchè puoi calcolare una fft su un segnale che varia nel tempo, non su uno fisso di valore x.

I discorso delle semionde positive \negative era riferito prima della FFT.
Si era detto: provo a leggere il file: finchè c'è silenzio non registro (per poi fare fft)
Ora arriva il suono, mi attivo e salvo in array, ma sempre all'interno del tono, con questa logica m'interrompo non'appena
la semionda si avvicina alla zona che io non voglio considerare. E sappiamo che prima o poi ci arriva.

Il discorso che dice Elemento 38, è valido: fare una fft, senza andare a cercare zone di tono o silenzio.
Solo che per come so io, il risultato temporale della FFT lo perdo.
Se io faccio 2 frequenze es: 500 e 100 hz in un file con audacity (programma che genera anche toni e fa fft)
e poi analizzo, sulla sinistra vedo prima la frequenza di 100 hz, anche se nel file registrato arriva dopo.
Lo stesso con la mia fft in C. Buttando su un file txt i risultati vedo i picchi (in termini numerici), ma non so nulla dell'ordine.
é verissimo che da una fft, puoi tornare indietro (i filtri fanno così), e quindi conservi il tempo, ma io non ho idea di come
fare. Magari devi far uso della parte immaginaria della FFT, cosa che io non so fare e non ho mai usato.
Quindi a meno che qualcuno sappia come, credo di essere costretto a cercare i toni nel "silenzio" del file.
Ma mi sto rendendo conto che è un progetto un po' troppo complicato.
Appena posso, grafico le FFT restituite per esempio da audacity.

Edited by GILA75 - 1/5/2018, 13:00
 
Top
view post Posted on 1/5/2018, 14:00
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
come detto sopra, la mia paura è che se una finestra di FFT mi acchiappa (ipotesi) per metà un tono e di fortuna me lo
legge, quando va a fare la seconda metà e sempre di fortuna lo interpreta, mi darà esempio un tasto 5,5 a fronte
di un solo 5

A livello software devi realizzare l'equivalente informatico del Trigger di Schmitt nel senso che quando riconosci un bitono non devi dire "Bene, da questo momento posso riconoscere il prossimo", ma devi aspettare che il volume torni al disotto del livello imposto come "volume 0".
Sostanzialmente se un bitono dovesse avere una durata di 10" e il software avesse bisogno di 0,5" per riconoscerlo, non deve darti 20 letture (10/0,5=20), ma una sola.
 
Top
view post Posted on 1/5/2018, 15:41
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Il trigger di Schmitt !!! L' avevo rimosso.
Vediamo se ricordo bene: simolo elettrico: triangolo con dentro una specie di esse ?
Comunque grazie Robo, rifletto sul tuo ultimo post, ma la vedo dura...non vorrei venisse fuori un pasticcio...
Oltre la teoria c'e' anche la parte implrmentativa, e io programmo in C si e no. Nel senso non sono programmatore esperto.
Ai prossimi aggiornsmenti, o se avete nuove, io sono qui ;)

Questa è la FFT prodotta da audacity sul tasto 5 (scusate il formato), non ricordo come si fa a caricare in piccolo
Poi posterò quella che ottengo con il C, graficata con excel

Edited by GILA75 - 1/5/2018, 17:02

Attached Image: fft tasto 5

fft tasto 5

 
Top
Elemento 38
view post Posted on 1/5/2018, 18:35




QUOTE
A livello software devi realizzare l'equivalente informatico del Trigger di Schmitt nel senso che quando riconosci un bitono non devi dire "Bene, da questo momento posso riconoscere il prossimo", ma devi aspettare che il volume torni al disotto del livello imposto come "volume 0".
Sostanzialmente se un bitono dovesse avere una durata di 10" e il software avesse bisogno di 0,5" per riconoscerlo, non deve darti 20 letture (10/0,5=20), ma una sola.

Questo e' un buon esercizio di programmazione. Dato un array con valori ripetuti e consecutivi, eliminarli; esempio:
QUOTE
[- - - - - 5 5 5 5 5 - - - - 6 6 6 6 6 6 6 - - - - 5 5 5 5 - - 2 2 2] --> [- 5 - 6 - 5 - 2]
 
Top
view post Posted on 1/5/2018, 21:29
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Vietato usare i dizionari o gli insiemi python pero'.. Sarebbe troppo semplice :)
Edit:
@robo: interessante, ho aperto il link del trigger che hai messo. Non ricordavo ci fossero differenze tra trigger e comparatore. Cerco di approfondire e magari "girarlo" via software

Edited by GILA75 - 1/5/2018, 23:31
 
Top
Elemento 38
view post Posted on 1/5/2018, 22:21




Credo che la soluzione in Python sarebbe identica a quella in C, il problema e' rimuovere elementi ripetuti e _consecutivi_... se fosse solo ripetuti si potrebbe (in Python) cambiare la lista in un set, che non contiene nessun elemento ripetuto (e non risolve il problema, perche' puoi avere piu' volte lo stesso tono in una sequenza).
 
Top
102 replies since 29/4/2018, 08:38   907 views
  Share