Partage
  • Partager sur Facebook
  • Partager sur Twitter

Synthèse sonor - Modulation en fréquence

    3 mai 2019 à 8:47:20

    Bonjour, (Je ne sais pas si ce sujet doit être dans la partie physique ou python, je m'en escuse par avance si je me suis trompé)

    Dans le cadre d'un projet perso, j'ai eu envie de pouvoir synthétiser des sons via python en utilisant un procéssus de synthèse sonor. J'utilise pour ça la modulation en fréquence.

    Voici mon code : 

    import wave
    import winsound
    import scipy.io.wavfile as wav
    import matplotlib.pyplot as plt
    import numpy as np
    import math
    
    
    
    temps = 4
    number = 44000
    
    
        
        
    
    def SyntheseSimple (fp,fm,I,fileName): #number: number of point per second
        
        liste=[0]*temps*number   # create a list which will contain the result
        Time= np.linspace(0,temps,temps*number)    # Time
        
        # We do FM synthesis.
        
        for i in range(temps*number):  
            
            # The formula
            
            liste[i]=math.sin(2*math.pi*(fp*Time[i] +I*math.sin(2*math.pi*fm*Time[i])))
            
            
            #Creating the ADSR envellop
             
            Decay = 0.35
            Sustain = 0.4
            Release = 0.6
            if i < Decay*temps*number:
                liste[i] = (i /(Decay*temps*number)*liste[i])
            elif i <Sustain*temps*number :
                liste[i] = (1-0.2*(i-Decay*temps*number)/((Sustain-Decay)*temps*number))*liste[i]
            elif i < Release*temps*number:
                liste[i] = 0.8*liste[i]
            else : 
                liste[i] = (0.8-0.8*(i-Release*temps*number)/((1-Release)*temps*number))*liste[i]
            
            #I=I-(1/number)*(I/temps)
            
        #ploting the result
        
        liste= np.array(liste)
        fig, axs = plt.subplots(2, 2, figsize=(5, 5))
        axs[0,0].plot(range(temps*number),liste)
        
        #ploting the fft
        
        data = liste
        ps = np.abs(np.fft.fft(data))**2
        time_step = 1 / (number)
        freqs = np.fft.fftfreq(data.size, time_step)
        idx = np.argsort(freqs)
        axs[0,1].plot(freqs[idx], ps[idx])
        plt.show()
        
        
        
        #creating wav file with the result
        wav.write(fileName+".wav",44000,liste)
        
        
        return liste
    
    
    name = "Deuxieme test fp = 300 fm =300, I = ,nature =normal,type = piano"
    SyntheseSimple(300,300,1,name)



    A priori, celui-ci fonctionneet me produit bien un son modulé comme attendu. (J'ai d'ailleurs réutilisé ce code pour d'autre production plus complexe).

    Toutefois j'aurais bien aimé pouvoir créer des sons se rapprochant d'un instrument. J'ai cru comprendre qu'il était possible de simuler un piano par exemple - (dans la mesure du raisonnable) - mais je n'arrive pas à trouver les bonnes fréquences modulante / porteuse et indice de modulation pour que ça marche. 

    Si quelqu'un pouvais me depanner j'en serai absolument ravi ! 

    Merci

    • Partager sur Facebook
    • Partager sur Twitter

    Synthèse sonor - Modulation en fréquence

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    • Editeur
    • Markdown