Calculer une powerspectrum avec une fenêtre coulissante de la FFT:
Prendre 1024 échantillons:
double[] signal = stream.Take(1024);
Nourrir à un algorithme de FFT:
double[] real = new double[signal.Length];
double[] imag = new double[signal.Length);
FFT(signal, out real, out imag);
Vous obtiendrez une partie réelle et une partie imaginaire. Ne jetez PAS la partie imaginaire. Faire de même pour la partie réelle, comme l'imaginaire. S'il est vrai que la partie imaginaire est pi / 2 de phase avec le réel, elle contient encore 50% de l'information de spectre.
EDIT:
Calcul de la puissance, par opposition à l'amplitude de sorte que vous avez un nombre élevé quand il est fort et proche de zéro quand il est calme:
for (i=0; i < real.Length; i++) real[i] = real[i] * real[i];
De même pour la partie imaginaire.
for (i=0; i < imag.Length; i++) imag[i] = imag[i] * imag[i];
Maintenant, vous avez un spectre de puissance pour la dernière 1024 échantillons. Où la première partie du spectre, on trouve les basses fréquences et la dernière partie du spectre est la haute
les fréquences.
Si vous voulez trouver le BPM de la musique populaire, vous devriez probablement se concentrer sur la basse. Vous pouvez vous procurer la basse intensité par la somme de la partie inférieure du spectre de puissance. Les nombres qui dépend de la fréquence d'échantillonnage:
double bassIntensity = 0;
for (i=8; i < 96; i++) bassIntensity += real[i];
Maintenant faites la même chose de nouveau, mais à déplacer la fenêtre de 256 échantillons avant de calculer un nouveau spectre. Maintenant, vous avez le calcul de la bassIntensity pour tous les 256 échantillons.
C'est une bonne entrée pour votre analyse de BPM. Quand la basse est calme, vous n'avez pas de battre et quand il est la voix, vous avez un battement.
Bonne chance!