Voila je voudrais pouvoir visualiser le spectre du signal qui rentre sur ma carte son !
Et si possible afficher la frequence qui est la max sur le graphe de l'analyseur MERCI A TOUS et BONNE PROG !!!
Voila je voudrais pouvoir visualiser le spectre du signal qui rentre sur ma carte son !
Et si possible afficher la frequence qui est la max sur le graphe de l'analyseur MERCI A TOUS et BONNE PROG !!!
Personne n'as d'idée ?? le but est d'entrer un signal BF sur la cart son qui ossile entre 300 3000hz et de recupere la frequence qui rentre afin de l'enregistrer dans un fichier !
Des idées ? En voici :
- As-tu été faire un tour sur l'espace perso de notre ami Sub0 : http://sub0.developpez.com/ ?
- La semaine dernière, j'ai écris rapidement un code pour réaliser un spectrogramme, ça peut peut-être t'aider, et j'ai mis en lien le site où j'ai été chercher mon inspiration : http://www.developpez.net/forums/vie...218&highlight=
Bon dev
merci Waskol pour ces aides mais je ne trouve pas ma reponse en gros ce que je voudrais pouvoir faire c'est enregistré la frequence tout les x temps (reglable) dans un fichier texte en gros si j'envoie des suites de frequences (et ce sera le cas) le fichier a la reception recemblera a
400 400 400 400 400 1200 1200 400 1200 800 400 ....
Ouille... je pense que pour du temps réel, à la cadence ou ton son va pulser ses fréquence BF, l'enregistrement dans un fichier texte ne me semble pas le mieux à cause du temps d'écriture : il faut voir que là, tu n'est pas loin du principe de la reconnaissance vocale en temps réel quand même...Envoyé par jmjmjm
Sinon si, ta réponse est là dedans, mais disséminée un peu partout ! bref il faut que tu fasses un travail de tri la dedans, mais pas que tu prenne le tout comme une réponse directe à ta question !
Donc je continue a te mettre sur la voie...
Je pense donc qu'il faut scinder ton problème en trois morceaux :
1) L'acquisition des données.
2) Le traitement
3) La sauvegarde des données
Je commence par le plus facile :
3) La sauvegarde des données :
Tu peux toujours enregistrer le résultat dans un TMemoryStream en enregistrant dedans des integer, puis tu enregistres le contenu de ce stream dans un fichier binaire à intervalles réguliers (comme tu pensais faire). Ou alors tu enregistre a format binaire directement via un TFileStream la suite d'entiers.
1) L'acquisition des données.
Regarde les codes sources de Sub0 sur l'enregistrement direct-to-disk, l'oscilloscope et le vu-mêtre, je pense que c'est une bonne base de travail pourt se donner des idées (surtout l'oscilloscope ).
2) Le traitement des données.
Là, la base de travail, c'est le programme de génération de spectrogramme que je t'ai donné en lien : donc il va falloir que tu te familiarise avec les FFT (transformée de Fourrier Rapide), nombres complexes et autres joyeusetés. A ce propos, Sub0 (toujours lui !), à retrouvé ce post qui devrait t'aider à comprendre le principe de fonctionnement :
http://sub0.developpez.com/delphi/topic.htm
Sinon, une autre idée peut être de s'inspirer du code source des émulateurs de micro-ordinateurs. Je m'explique : à l'époque des ZX Spectrum, Oric (1 et Atmos), Commodore (VIC20, C64) et Amstrad (CPC464), on enregistrait nos programmes sur des K7 audio. L'enregistrement des données consistait tout simplement à enregistrer une succession de signaux de fréquences différentes.
Maintenant, ces K7 sont enregistrées soit
- sous forme de fichiers WAV (comme ta source de fréquences qui arrive à ta carte son),
- soit sous formes de fichiers binaires qui représentent les valeurs successives de ces fréquences (comme ce que tu souhaite obtenir). C'est fichiers portent en général l'extension ".tzx", ".cdt" ou ".tap"
Or, tu trouveras très très facilement des utilitaires de conversion WAV<->TAP ou WAV<->TZX sur internet, avec leur code source.
Leur principe est toujours le même et ne sont, ni plus ni moins, que des convertisseurs "Onde sonore"<-->"Suite de valeurs entières de fréquences dans un fichier binaire".
Tu peux trouver par exemple de tels programmes ici : http://oric.free.fr/emulator.html
L'avantage de ces bouts de codes, c'est qu'ils sont en général assez bien documentés, courts et faciles à comprendre, l'inconvénient c'est qu'ils sont la plupart du temps écrits en C++.
Bref, ici, il n'y a juste qu'un travail de traduction de code (dans un premier temps) et un GROS travail d'adaptation du code (dans un deuxième temps) pour aboutir normalement à une fonction unique qui résudra 90% de ton propblème :
Cependant, je pense que tu devrais pouvoir aboutir à quelque chose de fonctionnel assez vite de ce coté là : dans un premier temps, essayes de convertir des fichiers Wav stockés sur ton disque dur représentatifs de ton problèmes (bref des enregistrements de ce que tu dois traiter). Le passage au temps réel, sera une deuxième étape...
Code : Sélectionner tout - Visualiser dans une fenêtre à part procedure WavVersFrequences(Source,Destination:Tfilestream);
Normalement, avec tout ça tu devrais pouvoir faire quelque chose, et ça ne fera pas 10000 lignes de codes à écrire, ton programme final devrait même être plutôt court à l'arrivée . Après, la difficulté est plutôt de tout mettre ensemble et que celà fonctionne....
Voilà, voilà
A part tout ça, j'ai trouvé quelque chose d'intéressant ici :
http://www.relisoft.com/science/Physics/sound.html
et là :
http://www.relisoft.com/Freeware/recorder.html
Merci pour tout Waskol je vais regarder tout ca ! !
De plus meme si ce n'est pas du temps reel ce n'est pas si grave mais je prefererai
Pour expliquer mais recherche je ne sais pas si tu connais mais en gros je veux faire de la transmission d'image par radio (SSTV)
Sinon, j'ai trouvé encore quelque chose de mon coté qui pourrais fonctionner que si tu recherches certaines fréquences bien déterminées dans ton signal, et qui est utilisé pour détecter des signaux DTMF (tons du téléphone) par exemple.
Celà s'appelle l'algorithme de Goertzel.
Il y a du code ici (2 articles dont un avec bout en assembleur Delphi/Pascal :
http://www.musicdsp.org/archive.php?classid=2#107
sinon la fonction présentée en Delphi dans le lien que je t'ai indiqué donnerais ceci :
Et là, aussi avec des explications, un listing et les résultats d'une détection :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 function Goertzel(Buffer: array of double; frequency, samplerate: double):double; var Qkn, Qkn1, Qkn2, Wkn, Mk : double; i : integer; begin Qkn:=0; Qkn1:=0; Wkn:=2*PI*frequency/samplerate; Mk:=2*Cos(Wkn); for i:=0 to High(Buffer) do begin Qkn2 := Qkn1; Qkn1 := Qkn; Qkn := Buffer[i] + Mk*Qkn1 - Qkn2; end; Result := sqrt(Qkn*Qkn + Qkn1*Qkn1 - Mk*Qkn*Qkn1); end;
http://www.embedded.com/story/OEG20020819S0057
Bon dev
Je vois, je vois (jette un oeil ici : http://www.developpez.net/forums/vie...=sstv&start=15)Envoyé par jmjmjm
Pour ce qui est du temps réel, ne te focalise pas tout de suite dans un premier temps.
A partir du moment où tu auras réussi à obtenir de bon résultats (qualité de détection, vitesse de traitement) à partir d'un fichier WAV, je pense que pour le reste ça ira tout seul...
Bon courage
Merci bien pour ta derniere fonction mais je vois pas trop comment elle marche !
suis pas trop doué en anglais
La fonction n'est pas si compliquée à utiliser ::Envoyé par jmjmjm
- Le premier paramètre (Buffer) est un tableau des différentes valeurs du son ou du signal (juste un échantillon, donc par exemple, une (ou quelques) milliers(s) de valeurs successives du fichier WAV) (faudra faire des test pour trouver la taille ad'hoc qui doit dépendre de la fréquence recherchée la plus basse et du taux d'échantillonnage).
- Le second paramètre, frequency, c'est la fréquence que tu recherches
- SampleRate, c'est le taux d'échantillonnage de ton échantillon
- Le résultat, te donne une valeur (qui prise toute seule, ne sert à rien)
Admettons que tu veuilles detecter quelle est la fréquence la plus probable entre 400Hz, 800Hz et 1200Hz dans ton échantillon (qui comporte en fait une fréquence de 811 Hz à cause d'une mauvaise qualité de transmission ou je ne sais quoi d'autre), avec un taux d'échantillonnage de 44,1KHz (44100Hz).
tu écriras :
au final, tu obtiens une valeur différente pour chaque fréquence recherchée. Ici, la valeur la plus élevée sera valeur800 puisque 800Hz est ce qu'il y a de plus proche de la fréquence que tu as réellement reçu (811 Hz). Donc fatalement on vient de t'envoyer un signal de 800Hz...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 const SAMPLERATE=44100; BUFFERSIZE=2000; //<-- au pif ! var UnBuffer:array[0...BUFFERSIZE-1] of double; valeur400,valeur800,valeur1200:double; .... begin valeur400:=Goertzel(UnBuffer,400,SAMPLERATE); valeur800:=Goertzel(UnBuffer,800,SAMPLERATE); valeur1200:=Goertzel(UnBuffer,1200,SAMPLERATE); ... end;
Si tu suis le second lien (où il y a le listing et l'exemple : http://www.embedded.com/story/OEG20020819S0057), tu remarqueras que l'auteur essaie de détecter la fréquence 941Hz.
Alors il essaie avec diverses fréquences et obtient une valeur ("Relative magnitude") énorme avec la fréquence 941Hz.
PS : son listing est ici -->ftp://ftp.embedded.com/pub/2002/09banks
Comment charger le fichier wave dans le buuffer ??
En fait il faut prendre le fichier wav en tant que fichier "brut de brut",
regarde la fonction LoadWaveFile que j'ai écris dans le lien que je t'avais donné au tout début, dans la partie2 (http://www.developpez.net/forums/vie...218&highlight=)
J'utilise cette fonction dans la partie3 de mon code :
et Y contient toutes les données du fichier WAV (de l'onde)
Code : Sélectionner tout - Visualiser dans une fenêtre à part LoadWaveFile(WavFileName, Y, NumChannels,BitsPerSample,SampleRate,NumSamples)
que je dessine alors :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 for c:=0 to NumChannels - 1 do begin ABitmap:=TBitmap.Create; ABitmap.PixelFormat:=pf24bit; ABitmap.Height:=AHeight; ABitmap.Width:=AWidth; ABitmap.Canvas.FillRect(Bounds(0,0,AWidth,AHeight)); //dessine la courbe paramétrique for xx:=0 to NumSamples-1 do begin PointList[xx].X:=(xx*AWidth) div NumSamples; PointList[xx].Y:=round((Y[xx,c]+1)*AHeight/2); //<--utilisation de Y end; ABitmap.Canvas.Polyline(PointList); WavMapArray.Add(ABitmap,nil); ABitmap:=nil; end;
Je ne veux pas dire, mais si tu ne lis pas les tutos et codes source qu'on te donne gentiment en lien, tu ne risques pas :
1) de savoir utiliser un fichier Wav, ce qui est un minimum pour ce que tu veux réaliser.
2) d'arriver au bout de ton code.
Personellement, j'ai pris le temps de lire, de comprendre et d'aller fouiner via google pour t'expliquer, fait pareil STP et lances toi...
Allez, courage, je suis sur que tu vas y arriver...
Je suis tout a fait d'accord avec toi et en meme temps vraiment désolé de ne pas avoir tout eplucher mais je ne suis pas chez moi mais en stage pour mon boulot donc mes acces internet sont assez liniter en gros je pe me connecter de temps en temps pour voir les messages et les mettres sur une clé et de temps en temps reposé une question
UN GRAND MERCI pour ton aide et je vais essayer de me debrouiller tout seul ce WE !!!
Ha je comprends mieux... tu es tout excusé alors...Envoyé par jmjmjm
T'en fait pas va, comme ton projet me parait plus qu'intéressant, je faire mon maximum pour t'aider au mieux. Je ne te garantie pas pour autant être là 24H/24 7J/7, mais bon, si je peu t'apporter du code de temps a autre pas de problêmes...
Salut!Envoyé par jmjmjm
Ce que tu veux faire ressemble à de la reconnaissance vocale je me trompe ? Tu peux éventuellement utiliser le code de ma démo du vumètre sur mon article pour récupérer les données d'enregistrement. Si tu décides de travailler directement à partir d'un fichier Wav, tu n'en auras pas besoin. Récupères les données audio au format 8 bits mono (convertir les données audio si nécessaire, voir mon tuto). A partir de là, il faut appliquer un filtre aux données, une formule... Voici celle que j'ai utilisé (merci à Phuphus) :
http://sub0.developpez.com/delphi/topic.htm
Prochainement, je mettrais en ligne mon unité "spectre.pas" qui m'a permis de réaliser le vumètre à barre de cet enregistreur Wav direct-to-disk :
http://sub0.developpez.com/delphi/exe/HDRec12.zip
ps: Si ça te branche, je possède le schéma d'un montage électronique super simple à brancher sur le port série, parrallèle ou joystick pour réaliser un fréquencemètre si ton signal d'entrée est du type tout ou rien (numérique)...
à+
merci sub0 je vais regarder tes sources ! Pour le montage numerique c'est pas possible car j'ai besoin d'un plage de fq de 300 a 3000 en gros ce n'est pas du tout ou rien mais une variation assez large !
Apparemment, il faut que tu saches que les fréquences sont générées par un signal tout ou rien en général. Pour le son, il ne s'agit pas de fréquences mais d'amplitude (analogique) : Selon la vitesse et la valeur de la courbe, les fréquences sont générées. Prenons par exemple le cas du speaker du pc : Il s'agit ici d'un signal tout ou rien (0 ou 5V) et c'est la vitesse à laquelle l'état du signal change qui produit les différentes notes...
en gros je pense qu'un myen simple pour recup la fq serait de reprendre la source de ton oscillo et de recup la periode de chaqe sinusoide qu'en pense tu et est ce fesable ??
sinon sub£0 peut tu m'envoyer quand meme tes schema electronique pour que je regarde merci
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager