IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Échantillon de son codé par des octets


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 9
    Par défaut Échantillon de son codé par des octets
    Bonjour,

    je vais commencer par les très traditionnelles excuses pour le cas où la réponse à ma question aurait échappé à mes (longues) recherches, et dans le cas où mon message serait mal placé.

    Ceci fait, venons-en au problème en lui même.

    Dans le cadre d'un projet étudiant, je souhaite réaliser un programme java qui travaillera en temps réel sur des données de type son. Plus précisément, je veux recevoir une musique via le micro et, entre autres, en détecter en temps réel les notes (fréquences des notes, durée).

    Je ne viens bien évidemment pas demander qu'on me fasse le programme, mais je bloque sur un gros détail :

    Sachant que je ne souhaite à aucun moment enregistrer le son sous la forme d'un fichier (sauf éventuellement à la toute fin), il me faut travailler directement dessus. Il y a plusieurs algorithmes à implémenter - détection d'enveloppe, transformées de Fourier et compagnie.

    Ces algorithmes prennent idéalement en entrée un tableau de type temps-fréquence.

    Voici donc le problème qui me préoccupe :

    Je créé une ligne (TargetDataLine, du package javax.sound.sampled) qui stocke les échantillons de son envoyés par la carte son. Pour pouvoir travailler sur ces échantillons, j'utilise la fonction read pour transférer ces données dans un tableau.

    Qu'ai je dans mon tableau ? Des octets.
    Mais je n'ai aucune idée de ce que représentent concrètement ces octets, et donc aucune idée de ce que je dois faire pour les manipuler. Je n'ai rien trouvé sur google...

    J'aimerais donc savoir comment sont "codés" ces octets, et comment il m'est possible à partir d'eux de récupérer les informations sur l'échantillon du son - disons l'amplitude et la fréquence du son (le temps étant toujours le même, le son étant échantillonné de façon régulière à des intervalles que j'ai défini).

    Merci d'avance à toute personne qui pourra me débloquer, parce que là, je ne vois vraiment pas trop quoi faire.

  2. #2
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Salut, je ne suis pas vraiment compétent en traitement du son mais as-tu regardé ces 2 articles qui parlent justement de la transformation de Fourier en java?
    Fun with Java, Understanding the Fast Fourier Transform (FFT) Algorithm
    Spectrum Analysis using Java, Sampling Frequency, Folding Frequency, and the FFT Algorithm
    La classe ForwardRealToComplexFFT01 du 2è article semble être celle qui implémente la transformation.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Cela demande une certaine habitude (que je n'ai pas) des formats de représentation sonore.

    Mais le format des octets que tu lis devrait être spécifié par l'objet AudioFormat que tu as passé à la méthode open().
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 9
    Par défaut
    L'implémentation de la transformée de Fourier en java n'est pas mon problème, mais merci des liens, je les visiterai à tout hasard.

    en effet, j'ai omis de spécifier le format des données que je recevais :

    format pcm, deux canaux, 16 bits, 44100 Hz, ordre des octets BigEndian. J'ai vu à peu près tous cess points dans des cours sur le traitement du son en java - je sais donc sous quel format les octets sont "recueillis", mais je ne sais toujours pas à quoi ils correspondent précisément - moi, je n'y vois qu'une suite de 0 et de 1 ; j'en tirerais volontier une amplitude et/ou une fréquence, mais comment faire ?

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Tes 0 et tes 1 sont des paquets de 16. Car tu es en 16bits et en 44100Hz.
    Tu vas avoir 44100 valeurs de 16bits par seconde d'enregistrement.
    Tu places les valeurs (donc de 0 à 65535) sur une courbe que tu devras analyser pour en tirer la fréquence du son.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 9
    Par défaut
    Oh, voilà qui m'éclaire déjà un peu, merci beaucoup.

    Je veux bien placer les valeurs sur la courbe et l'analyser ensuite, mais c'est une courbe de quoi en fonction de quoi ? Plus précisément, les nombres stockés dans les 16 bits sont en quelle unité ? Est-ce une courbe d'amplitude ?

    EDIT : bon, c'est clairement "quelque chose" en fonction du temps, mais l'inconnu à mes yeux réside dans l'unité du nombre stocké. J'imagine très bien une courbe de la forme (t, s(t) ) ou s est "l'onde" cherchée, mais je n'ai pas l'unité en tête.

    Après, à ce stade, je ne suis plus sur le bon forum je pense ^^

  7. #7
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Citation Envoyé par Lyndor Voir le message
    Dans le cadre d'un projet étudiant, je souhaite réaliser un programme java qui travaillera en temps réel sur des données de type son. Plus précisément, je veux recevoir une musique via le micro et, entre autres, en détecter en temps réel les notes (fréquences des notes, durée).
    Ceci pourrait peut etre t'interesser niveau conversion de données sonores ... (float->byte->float conversion etc) ICI

    Sinon c'est intéressant, j'ai deja fait un truc similaire il y'a qlq temps...

    Tu comptes faire un algorithme qui gère la polyphonie ou une seule note a la fois ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 9
    Par défaut
    Merci beaucoup pour vos réponses, je vais essayer de me débrouiller avec ça, ça devrait bien se passer désormais.

    @wax78 : En fait, il y a deux échéances pour notre programme JAVA - la première arrive d'ici un mois. Pour cette première échéance, nous devons présenter un "prototype allégé", donc quelque chose qui réalise une fonction donnée, mais sans détails, sans ajouts, sans fonctionnalités avancées, etc.

    Nous ne ferons bien entendu pas de polyphonique d'ici l'échéance de février. Par contre, le polyphonique est une de nos options pour la phase qui précède la seconde échéance, durant laquelle on ajoute des fonctionnalités au programme. La création automatique d'accompagnement, ou la possibilité d'utiliser ce logiciel sur un système embarqué sans perte de temps réel, en sont d'autres. Mais nous n'avons pour l'instant aucun objectif "fixé" à ce sujet, ce sont nos études qui nous les feront déterminer.

    Typiquement, il est fort possible que la séparation de sources en JAVA, indispensable au polyphonique, soit trop complexe à mettre en oeuvre et trop lente - ou que pour la rendre plus simple et plus rapide, il faille trop sacrifier du côté de la qualité et de l'efficacité. Nous verrons donc dans quelle mesure ça nous semble réalisable.

  9. #9
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Citation Envoyé par Lyndor Voir le message
    Typiquement, il est fort possible que la séparation de sources en JAVA, indispensable au polyphonique, soit trop complexe à mettre en oeuvre et trop lente - ou que pour la rendre plus simple et plus rapide, il faille trop sacrifier du côté de la qualité et de l'efficacité. Nous verrons donc dans quelle mesure ça nous semble réalisable.
    Personnelement j'ai essayé (mais je ne suis pas un expert dutout je m'amuse) la polyphonie aussi. La monophonie marchait impeccable avec toutes sorte de sons bien joué mais la polyphonie reste mon rêve pour fabriquer un petit "resynthetiseur". Mon programme actuel enregistre sur une entrée de la carte son, analyse la note et envoye un signal midi pour faire fonctionner un synthetiseur avec pas trop de latence...

    En tout cas bonne chance et bon amusement.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 9
    Par défaut
    On va bosser sur la séparation de source : notre défaut par rapport à toi, c'est que nous sommes tous de grands débutants en JAVA, pas compétents du tout de base.

    Par contre, notre avantage, c'est que là où j'étudie, nous sommes entourés d'experts et de chercheurs en tout genre qui sont tout disposés à nous aider ^^ La séparation de source et le traitement de la polyphonie, ils le font très bien en matlab. Faut juste voir si on a le temps, si on veut le faire et si ça se convertit bien en JAVA.

    Bon, et je ne pousserai pas le vice jusqu'à te demander si je pourrais jeter un coup d'oeil à ton programme ^^

  11. #11
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Je vois ce que tu vx dire c'est bien d'avoir des "mathematiciens" a ses cotés pour ce genre de projet.

    Sinon, Tu seras surpris mais je me suis servis d'un exemple fourni avec la librairie FMOD qui fait exactement la détection de notes.
    Je l'ai un peu tweaké et rajoute une interface midi et une petit interface graphique tout simplement. En gros fmod fournit la FFT et tu te tracasse pas d'analyser le signal etc, tu recupere tes != bandes de frequences, tu regarde juste quelle est la bande qui a le plus d'"amplitudes".

    Par contre je sais pas ou j'ai fourré les sources, mais tu px essayer la programme si tu es curieux http://renaud.warnotte.be/Projects/A...alogToMidi.rar
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Sélection de la langue de son site par des drapeaux ?
    Par zvath773 dans le forum Débuter
    Réponses: 12
    Dernier message: 13/06/2012, 15h37
  2. Additionner des chiffres codés sur 5 octets
    Par Menontona dans le forum C
    Réponses: 22
    Dernier message: 15/09/2010, 10h36
  3. Ouvrir/afficher un fichier avec son logiciel par défaut
    Par Alain P. dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 20/06/2009, 18h47
  4. Réponses: 1
    Dernier message: 23/07/2007, 11h00
  5. Réponses: 2
    Dernier message: 08/02/2007, 10h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo