2010-09-15 12 views
1

Ceci est une continuation de cette question here.Reconnaissance des notes dans le son enregistré - Partie 2 - Python

Ce code je pour obtenir les échantillons:

spf = wave.open(speech,'r') 
sound_info = spf.readframes(-1) 
sound_info = fromstring(sound_info, 'Int16') 

La longueur de sound_info est 194560, qui est 4,4 fois le taux d'échantillonnage de 44100. La longueur du fichier son est 2,2 secondes, donc sound_info n'est pas deux fois la longueur qu'il devrait être?

Aussi, je ne peux trouver que l'information suffisante sur pourquoi FFT sont utilisés afin de produire le spectre de fréquence. Je souhaite diviser un son et analyser le spectre de fréquence de plusieurs fractions de seconde, plutôt que le fichier son entier.


Aide serait très appréciée. :)


Voici le graphique de base sound_info

plot(sound_info) 

Voici le graphique FFT

freq = [abs(x.real) for x in fft(sound_info)] 
plot(freq) 

+1

'n'est pas sound_info deux fois la longueur qu'il devrait être?': Stéréo? – bobince

+0

merci pour ce bobince, mais alors comment interpréter sound_info? Parce que les données sont séquentielles – RadiantHex

Répondre

1

Si votre fichier wav a deux canaux, alors la longueur de sound_info sera 2 * fréquence d'échantillonnage * durée (secondes). Les données de canal alternent, donc si vous avez inséré toutes les valeurs dans un tableau à une dimension, data, les valeurs associées à un canal seront data[::2] et l'autre data[1::2].


Grosso modo, les fonctions lisses peuvent être représentés comme des sommes d'ondes sinus et cosinus (avec différentes amplitudes et fréquences).

La FFT (Fast Fourier Transform) relie la fonction aux coefficients (amplitudes) de ces ondes sinus et cosinus. C'est-à-dire qu'il existe une correspondance bi-univoque entre la fonction d'une part et la séquence de coefficients d'autre part.

Si un échantillon sonore consiste principalement en une note, sa FFT aura un coefficient très grand (en valeur absolue), et les autres seront très petits. Ce coefficient correspond à une onde sinusoïdale particulière, avec une fréquence particulière. C'est la fréquence de la note.

+0

@unutbu Merci pour votre réponse génial! :) Savez-vous pourquoi sound_info est séquenciel? – RadiantHex

+1

+1: Les sons musicaux ont des harmoniques. Beaucoup d'entre eux: ils sont des multiples entiers de la fréquence fondamentale. En outre, les instruments réels comprennent beaucoup de bruit ainsi que des signaux décalés dans le temps (c'est-à-dire des décalages Doppler) qui rendent la reconnaissance du défi fondamental. –

+0

@ S.Lott merci pour cela. N'y a-t-il pas moyen d'obtenir une liste de fréquences pour chaque échantillon? Ou chaque échantillon est-il limité à une seule valeur de fréquence? : | – RadiantHex

0

Ne pas réinventer la roue :)

Découvrez http://librosa.github.io, en particulier la partie de la courte durée de Fourier (TFCT) ou dans votre cas, plutôt quelque chose comme une constante-Q-Transformer (CQT) .

Mais d'abord les choses d'abord: Supposons que nous ayons un signal stéréo (2 canaux) provenant d'un fichier audio. Pour l'instant, nous jetons des informations spatiales qui sont encodées dans les deux canaux du fichier audio en créant un canal moyen (additionnez les deux canaux et divisez par 2). Nous avons maintenant un signal mono (1 canal). Comme nous avons un signal numérique, chaque instant est appelé un échantillon.

Maintenant commence la partie amusante, nous coupons le signal en petits morceaux (appelés cadres) en prenant des échantillons consécutifs (512 ou multiples de 2 sont des valeurs standard). En prenant la transformée de Fourier discrète (DFT) sur chacune de ces trames, nous obtenons une représentation temps-fréquence appelée spectrogramme. Tous les autres concepts (chevauchement, etc.) peuvent être lus dans tous les livres DSP ou dans les ressources comme ce cours de laboratoire: https://www.audiolabs-erlangen.de/content/05-fau/professor/00-mueller/02-teaching/2016s_apl/LabCourse_STFT.pdf

Notez que l'axe de fréquence du DFT est linéairement espacés. Dans le système musical occidental, une octave est divisée en 12 demi-tons dont les fréquences centrales sont espacées de manière logarithmique. Découvrez le script ci-dessus sur une stratégie de binning comment recevoir un axe de fréquence logarithmiquement espacé de la STFT linéaire. Cependant, cette approche est très basique et il y a beaucoup d'autres et probablement meilleures approches.

Revenons maintenant à votre problème de reconnaissance de note. Premièrement: C'est très difficile. :) Comme mentionné ci-dessus, un vrai son joué par un instrument contient des harmoniques. En outre, si vous êtes intéressé par notes transcrivant jouées par des groupes complets, vous obtenez des interférences par les autres musiciens etc.

Parler au sujet des méthodes que vous pouvez essayer: Lot de personnes utilisent aujourd'hui la matrice non négative fatorization (NMF ou LDPCA similaire) ou des réseaux de neurones pour aborder cette tâche. Par exemple, NMF est inclus dans scikit-learn. Pour commencer, je recommanderais NMF. Utilisez uniquement des sons mono-timbraux, c'est-à-dire un seul instrument à la fois. Initialisez les modèles avec des structures harmoniques simples qui se désintègrent et voyez ce qui se passe.

+0

Voici quelques exemples de librosa: http://nbviewer.jupyter.org/github/librosa/librosa/blob/master/examples/LibROSA%20demo.ipynb –