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

Calcul scientifique Python Discussion :

Creer un .wav "monofréquence"


Sujet :

Calcul scientifique Python

  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Par défaut Creer un .wav "monofréquence"
    Bonjour, étant débutant en Python, je souhaite réaliser des fichiers .wav contenant chacun un son d’une seule fréquence. Ces fichiers me servirons plus tard pour réaliser divers test de compression, FFT…

    Je dois donc dans un premier temps générer une sinusoïde dont je n’aurais qu’à modifier la fréquence pour modifier le son obtenu.

    J’utilise donc ce code, que j’ai glané dans un autre topic :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    freq = 25000
    freqech = 40
    snliste = []
    for i in range(1000000):
        snliste.append(int(600*sin (2*pi*freq*(i/freqech))))
     
    wavfile = wave.open('AutreAmplitude.wav','w')
    wavfile.setparams ((1, 2, 11025 , 32000, 'NONE', 'not compressed'))
    for s in snliste:
        wavfile.writeframes(hex(s))
    wavfile.close()
    Problème : quelque soit la valeur de la variable fréquence, je n’obtiens de pas différence de fréquence lors d’une écoute du .wav obtenu.

    J’utilise ici le module wave. Le module pymedia serait il plus adapté ? Si oui, quelles fonctions utiliser ?

    Merci pour vos indications!

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Personnellement j'utilise numarray pour gérer ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import math, numarray as NA, wave
    freq = 25000.
    freqech = 40
    duree = 1.
    son = NA.arange(0., duree, 1./freqech)
    son = NA.sinus(2 * math.pi * freq * son)
     
    wavfile = wave.open('AutreAmplitude.wav','w')
    wavfile.setparams((1, 2, 11025 , 32000, 'NONE', 'not compressed'))
    wavfile.writeframes(son)
    wavfile.close()

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Par défaut
    Citation Envoyé par oiffrig
    Personnellement j'utilise numarray pour gérer ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import math, numarray as NA, wave
    freq = 25000.
    freqech = 40
    duree = 10.
    son = NA.arange(0., duree, 1./freqech)
    son = NA.sin(2 * math.pi * freq * son)
     
    wavfile = wave.open('AutreAmplitude.wav','w')
    wavfile.setparams((1, 2, 11025 , 32000, 'NONE', 'not compressed'))
    wavfile.writeframes(son)
    wavfile.close()
    Merci de ta suggestion. Cela dit, je n'arrive pas à obtenir un son propre, malgré de nombreux tests de paramètres. Je ne vois pas vraiment pourquoi

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    A revoir le code, ta fréquence d'échantillonnage me paraît très faible, généralement je travaille avec 44.1 kHz
    EDIT: Mon code était bourré d'erreurs, en voilà un qui fonctionne (du moins chez moi)
    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
    import math, numarray as NA, wave
     
    freq = 440.
    freqech = 44100
    duree = 1.
    omega = 2 * math.pi * freq
    son = NA.arange(0., duree, 1./freqech, NA.Float64)
    son = NA.sin(omega * son)
    son *= 32768.
    son = son.astype(NA.Int16)
     
    wavfile = wave.open('AutreAmplitude.wav','w')
    wavfile.setparams((1, 2, freqech , len(son), 'NONE', 'not compressed'))
    wavfile.writeframes(son.tostring())
    wavfile.close()
    Fichiers attachés Fichiers attachés
    • Type de fichier : py son.py (407 octets, 81 affichages)

  5. #5
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Par défaut
    Citation Envoyé par oiffrig
    A revoir le code, ta fréquence d'échantillonnage me paraît très faible, généralement je travaille avec 44.1 kHz
    EDIT: Mon code était bourré d'erreurs, en voilà un qui fonctionne (du moins chez moi)
    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
    import math, numarray as NA, wave
     
    freq = 440.
    freqech = 44100
    duree = 1.
    omega = 2 * math.pi * freq
    son = NA.arange(0., duree, 1./freqech, NA.Float64)
    son = NA.sin(omega * son)
    son *= 32768.
    son = son.astype(NA.Int16)
     
    wavfile = wave.open('AutreAmplitude.wav','w')
    wavfile.setparams((1, 2, freqech , len(son), 'NONE', 'not compressed'))
    wavfile.writeframes(son.tostring())
    wavfile.close()
    Excellent, tout fonctionne! A première vue, mon problème principal était un problème de format (j'ai tester un nombre incalculable de fréquence d'échantillonage )
    Merci beaucoup!

  6. #6
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Par défaut
    J'ai une remarque, en ajoutant en fin de code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    son2 = (NA.fromstring(son.tostring()))
    Le resultat n'est pas identique à la variable son (les chiffres sont différents). pourtant les méthodes fromstring() et tostring() ne sont elles pas censées être reversibles?

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Il faut spécifier un type pour fromstring
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    son2 = NA.fromstring(son.tostring(), NA.Int16)

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