Réponse impulsionnelle
        Ici, la réponse impulsionnelle qui vous est donnée est celle d'une église.
      
      
        [clap, F2] = audioread('clap.wav');
        
       
        
Vous pouvez vérifier que les deux fréquences F et F2 sont identiques, ce qui signifie que l'enregistrement de la vache et de la réponse impulsionnelle s'est fait avec la même fréquence d'échantillonnage.
        Si vous l'écoutez, vous remarquerez la chose suivante. La réponse impulsionnelle acoustique de cette église correspond à ce qui serait enregistré par un microphone et qu'un bruit d'intensité très forte et très courte a été produit dans cette
            église. Voilà une façon auditive de se représenter un Dirac.
        Vous remarquerez ainsi que le "clap" semble durer (cela est dû aux nombreuses réflexions des sons sur les parois de l'église).
        
        
        
            Convolution
            
                Vous aimeriez bien utiliser la convolution pour prédire comment la vache va "sonner" dans cette église, mais pour cela, il faut que l'église constitue bien un système linéaire et invariant.
                Est-ce le cas ?
                
                    - Invariant : tant que les murs, les meubles, et que la température, humidité, etc., ne changent ou ne bougent pas, il n'y a pas de raison que l'église change sa façon de résonner...
 
                    - Linéaire : voilà qui est plus délicat. Ici les signaux qui nous intéressent sont des signaux sonores, qui correspondent à des amplitudes de vibration des couches d'air. Il se trouve que ce phénomène ondulatoire est
                        linéaire (tant que l'amplitude de vibration n'est pas trop grande). C'est-à-dire que deux ondes sonores s'ajoutent et peuvent interférer d'ailleurs. Nous allons admettre que nous sommes bien dans le régime linéaire de l'église.
                    
 
                
                Nous pouvons donc utiliser la convolution pour prédire le résultat sonore :
              
              
                prediction = conv(vacheG,clapG); % attention, vu la taille des signaux, il se peut que cette étape soit longue sur des ordinateurs peu performants
                
               
             
         
        
Voilà, vous pouvez essayer d'écouter le résultat (attention à vos oreilles) :
      
        sound(prediction,F); % baissez le son !
        
       
        
C'est horrible ! le son sature énormément.
        Comment cela se fait-il ? Comme le signal clap n'était pas de somme totale égale à 1, le résultat de la convolution est d'amplitude beaucoup plus grande que le signal de départ.
        
            
            
                Normalisation du niveau sonore
                
                    Pour avoir un résultat écoutable, il faut normaliser le signal obtenu. Mais comment le normaliser ?
                    Il y a beaucoup de choix possibles, nous pourrions vouloir que la puissance de sortie soit la même que la puissance d'entrée. Vouloir que l'énergie de sortie soit la même que l'énergie d'entrée. Ou bien encore, nous pourrions tout
                        simplement souhaiter que jamais l'amplitude de sortie ne dépasse 1 (pour qu'il n'y ait jamais saturation).
                    Ici, je pense qu'un bon critère serait que le nouveau signal ait le même "niveau sonore" que le signal d'origine.
                    Et là se pose une question très intéressante : que signifie "niveau sonore" ? Là encore il va falloir faire un choix. Le choix que je vais faire est de dire que niveau sonore signifie : valeur efficace                        du signal pendant les trois première secondes (pour prendre des durées équivalentes).
                  
                  
                    %calcul des valeurs efficaces
debutOri = vacheG(1:F*3); %en trois secondes, il y a F*3 points 
P_ori = sqrt(sum(debutOri .* debutOri) / length(debutOri))
% Même chose pour la prédiction
debutPred = prediction(1:F*3);
P_pred
                        = sqrt(sum(debutPred .* debutPred) / length(debutPred))
                    
                   
                 
             
            
Ces quelques lignes de scripts nous permettent d'établir qu'effectivement le son prédit est de très forte valeur efficace :
          
            
                
P_ori = 0.14354
P_pred = 3.2641
            
           
         
            
Plus exactement, la prédiction est 23 fois trop forte. Nous allons donc normaliser le son avec ce critère :
          
          
            prediction = prediction * P_ori/P_pred; % normalisation
            
           
         
        
            
Maintenant, vous devriez pouvoir écouter sereinement le résultat de votre prédiction.
         
      
        
        
        
            sound(prediction,F); % vous n'avez plus besoin de baisser le son !
         
        
       
        
        
        
            
                
                    Voilà, vous venez de prédire ce que nous pourrions entendre si une vache rentrait dans une église.