Une autre façon de décomposer un signal en un spectre

Bonjour à tous, ici, je veux parler de l'algorithme d'analyse du signal audio qui vous permet d'analyser le signal en ondes individuelles, bien sûr, il ne donne pas une précision de 100%, mais néanmoins le résultat est assez bon à mon avis.

image

Le travail sur n'importe quelle musique est mieux vu:


Et des liens vers d'autres exemples de différents genres. Metaldeth-Tornado des âmes:


Hors de contact:


Donc, pour la décomposition, vous devez effectuer les étapes suivantes:

- À partir du signal d'origine, vous devez obtenir 8 signaux intermédiaires;
- À partir de ces signaux intermédiaires et du signal d'origine, vous devez obtenir 8 signaux - couches, qui peuvent être démontées en ondes séparées;
- Pour calculer combien d'ondes dans chaque couche et quelle est leur amplitude.

Maintenant, plus sur chaque étape: pour obtenir un signal intermédiaire, vous devez prendre la dérivée du signal d'origine. Il s'agit essentiellement d'un dérivé d'une fonction discrète. Pour le trouver à chaque instant du signal d'origine, vous devez définir 1 paramètre: la période pour laquelle cette dérivée est localisée. La valeur dérivée est le coefficient de pente dans un intervalle donné, par exemple, peut être trouvé par la méthode des moindres carrés.

Il est nécessaire de calculer 8 signaux intermédiaires avec 8 périodes différentes. Ensemble de périodes le plus simple: 4, 8, 16, 32, 64, 128, 256, 512. Lorsqu'une période est spécifiée, pour chaque échantillon de signal, la dérivée est calculée à l'aide de la formule des moindres carrés. C'est comme une moyenne mobile, mais ici ce n'est pas une moyenne mobile mais un dérivé mobile de l'intervalle actuel.

Ainsi, 8 signaux dérivés et 1 source sont obtenus. Désormais, chacun des 8 signaux dérivés doit être intégré. Dans ce cas, cela signifie que chaque échantillon suivant est égal à la somme de tous les échantillons précédents. Après cela, 8 couches intermédiaires sont obtenues.

L'étape suivante consiste à obtenir des couches qui peuvent être démontées en vagues distinctes. Alors maintenant, vous devez obtenir 8 couches. Les couches sont calculées comme ceci:

couche 0 = signal de sortie 0 intermédiaire
couche1 = intermédiaire1-intermédiaire0
couche2 = intermédiaire2-intermédiaire1
couche3 = intermédiaire3-intermédiaire2
couche4 = intermédiaire 4-intermédiaire3
couche5 = intermédiaire5-intermédiaire4
couche6 = intermédiaire6-intermédiaire5
couche7 = intermédiaire 7-intermédiaire6
couche8 = intermédiaire7

La dernière couche n'est pas une différence, mais simplement égale au dernier signal intermédiaire.

Vous pouvez essayer différemment, à savoir calculer les signaux intermédiaires suivants à partir des signaux intermédiaires précédents. Mais dans le programme actuel, 1 option est utilisée.

Maintenant, pour analyser les couches en vagues distinctes, il vous suffit de calculer les zones où les valeurs augmentent et où elles diminuent. En fait, la durée des sections est leur longueur d'onde. Sections du signal où les valeurs du signal sont constantes, il vous suffit de sauter. Pour trouver l'amplitude du signal dans le spectre dans un certain intervalle, vous devez ajouter toutes les amplitudes d'onde multipliées par leur longueur.

image

Le code qui calcule le signal intermédiaire ressemble à ceci:

ici la taille d'onde est le nombre d'échantillons
signal [] - tableau avec le signal d'origine
SY = 0, SX = 0, SXX = 0, SXY = 0, Ky = 0 - variables de type float
Step2 = STEP / 2 où STEP est la période (4,8,16,32,64,128,256,512)

for(int i=Step2;i<wavesize-Step2;i++){ SY=0,SX=0,SXX=0,SXY=0,Ky=0; for(int j=i-Step2,fromZ=0;j<i+Step2;j++,fromZ++){ SX+=fromZ; SY+=signal[j]; SXX+=fromZ*fromZ; SXY+=fromZ*signal[j]; } Ky=float((STEP)*SXY-SX*SY)/float((STEP)*SXX-SX*SX); OutSignal[i]=OutSignal[i-1]+Ky; } 

Pour soustraire un signal d'un autre, il suffit de soustraire chaque échantillon de chacun.
Par exemple, pour la couche 0:

 for(int i=0;i<wavesize-1;i++) layer0[i]=OutSignal0[i]-Signal[i]; 

Si vous additionnez toutes les couches et prenez la dernière avec le signe opposé, vous obtenez le signal d'origine, multipliant ainsi n'importe quelle couche, il est possible de faire un filtre de fréquence. La question suivante est de savoir comment calculer les amplitudes d'harmoniques spécifiques. Le fait est que dans un intervalle constant, par exemple = 4000 échantillons, il peut y avoir beaucoup d'ondes courtes et relativement peu d'ondes longues.

Vous pouvez bien sûr trouver les amplitudes moyennes pour chaque couche et les ajouter. Mais cette méthode n'est pas très bonne car il y a très peu d'ondes longues, et leur amplitude est généralement très grande, et une forte non-uniformité d'amplitude est obtenue vers les basses fréquences.

Dans un programme qui affiche de la musique couleur par des liens, l'amplitude de chaque harmonique est calculée comme: l'amplitude de l'onde * sa longueur. Néanmoins, des inégalités apparaissent, mais pas aussi fortes que dans le cas de la moyenne.

En général, je ne pense pas qu’une personne perçoive le son comme une décomposition en un spectre, mais plutôt le son est constitué d’images sonores, qui sont constituées d’ondes de longueurs différentes. En conséquence, le volume d'un son est plutôt le volume moyen de toutes les ondes dont le son est composé. Mais il n'est pas encore clair quels paramètres composent l'image sonore, peut-être la fréquence moyenne, l'écart-type ou autre chose.

Source: https://habr.com/ru/post/fr410357/


All Articles