Determination de la frequence d'un son simple

ffroggy Messages postés 10 Date d'inscription jeudi 28 avril 2005 Statut Membre Dernière intervention 2 novembre 2007 - 19 août 2005 à 06:20
agomopot Messages postés 3 Date d'inscription mardi 21 avril 2009 Statut Membre Dernière intervention 10 juillet 2009 - 10 juil. 2009 à 20:09
salut à tous

comme on dit, j'ai un pb !!!!!
le voilà :
j'ai besoin de décoder un son qui arrive sur la carte son.
en fait de sons, il s'agit de frequence DTMF standard. je connais ces differentes frequences et à quelles touches cela correspond. pas de probleme.
par contre, je ne sais pas comment recupérer ce son pour en extraire sa frequence.

pourriez vous m'aider là dessus.

Merci à tous

19 réponses

neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
19 août 2005 à 07:25
Récupérer le son depuis la carte je peu pas te dire comment faire, mais pour ce qui est de trouver sa fréquence tu peut chercher coté des FFT (transformées de fourier rapides).

neodelphi
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
19 août 2005 à 16:45
"Acquisitionner"
Si tu veut le faire toi meme comme un pro je pense qu'il doit être possible de trouver les infos sur la MSDN et utiliser les API windows. J'ai essayé pour faire de la capture video à l'aide de la carte grâphique.
Bon courage

neodelphi
0
ffroggy Messages postés 10 Date d'inscription jeudi 28 avril 2005 Statut Membre Dernière intervention 2 novembre 2007
19 août 2005 à 18:35
Slaut à tous,

merci pour vos infos.
alors pour "Acquisitionner" !! j'dirais plutot acquérir hi
mais c rien, tu as repondu c bien et merci.
en ce qui concerne donc ce fameux son que je ve acquerir et decoder,
j'ai vu avec le composant WaveIn. la demo est bien c'est kler, mais comme ont dit NeoDelphi et GrandVizir, c'est pas encore fini.
Le son représente ce que vous avez qd vous faites un numéro de telephone. c'est le meme son que je dois decoder, ni plus ni moins, encore faut il que j'y arrive.
Alors aussi, les maths et Fourrier, on est pas trop copain hi
Si quelqu'un en connait plus que moi, et c'est facile, pourrait il m'en dire plus sur le principe. car je vois pas tres bien à quoi peut servir cette transformée, au risque de paraitre vraiment idiot. excusez moi.

Merci pour votre aide à tous
0
ffroggy Messages postés 10 Date d'inscription jeudi 28 avril 2005 Statut Membre Dernière intervention 2 novembre 2007
19 août 2005 à 18:36
ah, j'ai encore oublié,

je bosse sur Delphi 7.

merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
19 août 2005 à 23:34
Hummm pour ce qui est de l'acquisition, je serai toi je chercherai du coté des api windows avant d'utiliser un composant, ou alors décortiquer le composant pour en extraire ce qui t'es utile... c'est plus long mais aussi plus pédagogique !

Pour ce qui est de la transformée de fourier, je n'en connai que le nom et les application, ça consiste en gros à décomposer un signal périodique (ou presque) en une multitude de fréquences. Mais si dans ton cas le signal ne comporte qu'une seule fréquence (en ignorant les parasites léger de l'entrée), tu doit avoir moyen de bricoler ça toi meme sans fourier: par exemple relever les temps ou le signal est le plus fort, et calculer la moyenne séparant deux "pics" de son... ça doit etre simple à faire ça.

neodelphi
0
ffroggy Messages postés 10 Date d'inscription jeudi 28 avril 2005 Statut Membre Dernière intervention 2 novembre 2007
20 août 2005 à 14:11
salut à tous,

je reviens pour vous donner qques infos de l'avancement, çà peut servir ....

alors en ce qui concerne le son qu arrive sur la carte, j'ai utilisé WaveIn.
pour le decodage dtmf, j'ai trouvé dsplab mais pas finalisé encore çà.
par contre je me suis rendu compte que j'utilise la fonction suivante donc voici un bout de code :
procedure TForm1.WaveIn1BufferFull(Sender: TObject);
var
i: Integer;
begin
ProgressBar1.Position:= WaveIn1.Level*3;
try
DTMF.Threshold:= 0; // Seuil amplitude
for i:=0 to WaveIn1.BufferLength-1 do
begin
DTMF.Put(WaveIn1.data[i]);
end;
DTMF.Finilize;
finally
Wave.Free;
end;
end;

mais lorsque le signal reçu est assez court, tout va bien, je decode mon dtmf
par contre si je reste coincé sur ma touche dtmf, là par contre mon appli va m'en compter 2, 3 ou 4 ... alors que je n'ai appuyé qu'une seule fois, mais longtps.

que puis je utiliser comme fonction de WaveIn je pense pour justement ne prendre que les 25 premieres milliseconde du tone reçu ?
ou bien que puis je faire autrement (timer, ...) ? je seche là...

Merci pour votre aide.
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
20 août 2005 à 15:52
salut

le problème du timer c'est qu'il n'est intialiser qu'après la sortie de
la procédure.Essayes d'utliser le double click ou l'évement on mouseup
qui ne déclenchera la procédure qu'aprés relachemnt de la touche.

bonne prog
0
ffroggy Messages postés 10 Date d'inscription jeudi 28 avril 2005 Statut Membre Dernière intervention 2 novembre 2007
20 août 2005 à 20:33
salut,

ton idee est bien mais ds mon appli, elle devra au futur etre totalement autonome sans aucune intervention de declenchement manuel (relais radioamateur).
Y'a t il un autre moyen d'intercepter et de "brider" le tps d'acquisition qui est mon pb en ce moment.
par contre je decode parfaiement sans erreur, or mis qu'il me double de tps en tps les tones si elles sont trop longues.

Merci
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
20 août 2005 à 21:25
est-ce que tu peux piloter ton relai?
0
ffroggy Messages postés 10 Date d'inscription jeudi 28 avril 2005 Statut Membre Dernière intervention 2 novembre 2007
20 août 2005 à 21:46
oui, mon relais si tu ve sera autonome. et en veille.
mais lorsqu'il reçoit un code DTMF donné, il passe en emission apres decodage avec l'envoi des infos coorespondantes au code donné.
c'est pour çà que le code dtmf doit etre autonome et fiable lorsque l'appli va le decoder.
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
20 août 2005 à 21:50
qu'est ce qui declenche ta procedure?
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
20 août 2005 à 21:56
je m'explique:

quand tu reçois le signal tu envoies l'ordre au relai c'est cela?

comme il n'est pas possible d'utilser un timer directement dans la
procedure pour interrompre la procedure (il faut sortir de la procedure
pour que le timmer soit reelement intialiser on peut se servir du temps
de réponse du relai pour arrêter la procedure;

à la réception du collage on interrompt la procedure. pour cela on peut utliser la sortie imprimante.
0
ffroggy Messages postés 10 Date d'inscription jeudi 28 avril 2005 Statut Membre Dernière intervention 2 novembre 2007
20 août 2005 à 22:05
non c'est pas tt à fait çà.
mon relais sera activé apres. je m'explique :
pour activer le relais il faut qu'il recoive un code dtmf ex *0 et # pour valider la cde
des que je decode le #, je declnche une fonction ki va ouvrir le relais par ex.
mais le pb n'est pas là. le pb est que le decodage dtmf est pas fiable ds le sens ou je decode plusieur "0" par ex car la personne a l'autre bout ki fait le code a appuyé plus longtps sur sa touche. donc avec çà c pas fiable. je cherche donc un moyen qui va me permettre justement de toujours decoder un son dtmf de meme longueur pour avoir tjrs la meme reference de decodage.
procedure :
code dtmf reçu -> decodage pendant xx ms -> arret de "l'ecoute" -> decodage et enregistrement du caractere reçu -> reprise de l'ecoute du chiffre suivant -> ......

voilà

Merci
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
20 août 2005 à 22:46
comme le timer ne fonctionne pas dans ce cas on peut utiliser une
boucle for to pour faire une temporisation c'est bloquant mais efficace
et pour une vingtaine c'est acceptable compte environ 30000 à
100000boucles pour 20ms à ajuster .

en fin de tempo tu interromps le décodage.

tu peux aussi appeller une fonction qui décrémente une variable globale



var temps:integer;

function decomptetemps:boolean;

begin

dec(temps);

if temps=0 then result:=true else reult:=false;

end;



dans ta fonction à l'entrée tu intialises temps par exemple à 30000

puis dans ta boucle de décodage

if decomptetemps then fin de decodage;
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
24 août 2005 à 10:59
Dans ton exemple, entre 0 et #, vu que c'est un humain qui tape, il y a
forcement un blanc, donc si ton prog détecte 3 ou 4 zéro à la suite
sans blanc, c'est que la touche à été appuyée plus longtemps que
necessaire. Reste à faire un filtre du genre:



if DecodedChar = PreviouslyDecodedChar and not PreviousCharFollowedByBlank then

DumpDecodedChar;
0
ffroggy Messages postés 10 Date d'inscription jeudi 28 avril 2005 Statut Membre Dernière intervention 2 novembre 2007
24 août 2005 à 11:19
salut,

ok pour ton filtre, mais il faudrait alors que je l'integre où ?
jsute avant de "valider" le caractere décodé ?
du style :

if DecodedChar = PreviouslyDecodedChar and not PreviousCharFollowedByBlank then
begin
DumpDecodedChar;
exit;
end
else
Edit1.Text: = Edit1.Text + Tone;

ensuite, les variables DecodedChar, previouly, ... sont de quel type ?

merci pour ton aide
0
ffroggy Messages postés 10 Date d'inscription jeudi 28 avril 2005 Statut Membre Dernière intervention 2 novembre 2007
24 août 2005 à 11:23
salut,

ok pour ton filtre, mais il faudrait alors que je l'integre où ?
jsute avant de "valider" le caractere décodé ?
du style :

if DecodedChar = PreviouslyDecodedChar and not PreviousCharFollowedByBlank then
begin
DumpDecodedChar;
exit;
end
else
Edit1.Text: = Edit1.Text + Tone;

ensuite, les variables DecodedChar, previouly, ... sont de quel type ?

merci pour ton aide
0
fersouce Messages postés 23 Date d'inscription lundi 7 août 2006 Statut Membre Dernière intervention 28 novembre 2012
21 oct. 2006 à 11:05
  Salut ffroggy,
je ne vais apporté rien mais au contraire je veut savoir si tu a réussi a faire 1 pgm qui fait la distinction entre les codes DTMF entrant en principe 1 an de recherche
tu maitrise le sujet
0
agomopot Messages postés 3 Date d'inscription mardi 21 avril 2009 Statut Membre Dernière intervention 10 juillet 2009
10 juil. 2009 à 20:09
je suis etudiant en génie electrique et je suis interessé par ce que vous aurez pu decouvrir, je fais aussi la detectio des fréquences des touches DTMF et je ne sais par où commener,je voudrais que vous m'aidiez
0
Rejoignez-nous