Question

Essayer de comprendre une routine fft (transformation de Fourier rapide) que j'utilise (voler) (recycler)

L'entrée est un tableau de 512 points de données qui constituent un exemple de forme d'onde. Les données de test sont générées dans ce tableau. fft transforme ce tableau en domaine fréquentiel. Essayer de comprendre la relation entre la fréquence, la période, la fréquence d’échantillonnage et la position dans le tableau fft. Je vais illustrer par des exemples:

========================================

La fréquence d'échantillonnage est de 1000 échantillons / s. Générez un ensemble d’échantillons à 10Hz.

Le tableau d'entrée a des valeurs de crête à arr (28), arr (128), arr (228) ... période = 100 points d'échantillon

la valeur de crête dans le tableau fft est à l'indice 6 (à l'exception d'une valeur énorme à 0)

========================================

Le taux d'échantillonnage est de 8 000 échantillons / s Générer un ensemble d’échantillons à 440Hz

Les valeurs de pointe du tableau d'entrée incluent arr (7), arr (25), arr (43), arr (61) ... période = 18 points d'échantillon

la valeur de crête dans le tableau fft est à l'indice 29 (à l'exception d'une valeur énorme à 0)

========================================

Comment associer l'indice du pic du tableau fft à la fréquence?

Était-ce utile?

La solution

Si vous ignorez la partie imaginaire, la distribution de fréquence est linéaire entre les segments:

Fréquence @ i = (taux d'échantillonnage / 2) * (i / Nbins).

Donc, pour votre premier exemple, en supposant que vous disposiez de 256 cases, la case la plus grande correspond à une fréquence de 1000/2 * 6/256 = 11,7 Hz. Étant donné que votre entrée était de 10Hz, je suppose que la case 5 (9.7Hz) avait également un gros composant. Pour obtenir une meilleure précision, vous devez prélever plus d'échantillons, pour obtenir des bacs plus petits.

Votre deuxième exemple donne 8000/2 * 29/256 = 453Hz. Encore une fois, fermez, mais vous avez besoin de plus de bacs. Votre résolution ici n’est que de 4000/256 = 15.6Hz.

Autres conseils

Il serait utile de fournir votre échantillon de données.

Je suppose que vous avez ce que l’on appelle des artefacts d’échantillonnage. Le signal fort en courant continu (fréquence 0) suggère que tel est le cas.

Vous devez toujours vous assurer que la valeur moyenne dans vos données d'entrée est égale à zéro - recherchez la moyenne et soustrayez-la de chaque point d'échantillonnage avant d'appeler le fft, il est donc recommandé.

Dans le même ordre d'idées, vous devez faire attention à l'artefact de la fenêtre d'échantillonnage. Il est important que le premier et le dernier point de données soient proches de zéro car sinon, le "pas à pas" de l’extérieur à l’intérieur de la fenêtre d’échantillonnage a pour effet d’injecter beaucoup d’énergie à différentes fréquences.

L’essentiel est que faire une analyse fft demande plus de soin que de simplement recycler une routine fft trouvée quelque part.

Voici les 100 premiers points d'échantillonnage d'un signal de 10 Hz, comme décrit dans la question, masqués pour éviter les artefacts d'échantillonnage

> sinx[1:100]
  [1]  0.000000e+00  6.279052e-02  1.253332e-01  1.873813e-01  2.486899e-01  3.090170e-01  3.681246e-01  4.257793e-01  4.817537e-01  5.358268e-01
 [11]  5.877853e-01  6.374240e-01  6.845471e-01  7.289686e-01  7.705132e-01  8.090170e-01  8.443279e-01  8.763067e-01  9.048271e-01  9.297765e-01
 [21]  9.510565e-01  9.685832e-01  9.822873e-01  9.921147e-01  9.980267e-01  1.000000e+00  9.980267e-01  9.921147e-01  9.822873e-01  9.685832e-01
 [31]  9.510565e-01  9.297765e-01  9.048271e-01  8.763067e-01  8.443279e-01  8.090170e-01  7.705132e-01  7.289686e-01  6.845471e-01  6.374240e-01
 [41]  5.877853e-01  5.358268e-01  4.817537e-01  4.257793e-01  3.681246e-01  3.090170e-01  2.486899e-01  1.873813e-01  1.253332e-01  6.279052e-02
 [51] -2.542075e-15 -6.279052e-02 -1.253332e-01 -1.873813e-01 -2.486899e-01 -3.090170e-01 -3.681246e-01 -4.257793e-01 -4.817537e-01 -5.358268e-01
 [61] -5.877853e-01 -6.374240e-01 -6.845471e-01 -7.289686e-01 -7.705132e-01 -8.090170e-01 -8.443279e-01 -8.763067e-01 -9.048271e-01 -9.297765e-01
 [71] -9.510565e-01 -9.685832e-01 -9.822873e-01 -9.921147e-01 -9.980267e-01 -1.000000e+00 -9.980267e-01 -9.921147e-01 -9.822873e-01 -9.685832e-01
 [81] -9.510565e-01 -9.297765e-01 -9.048271e-01 -8.763067e-01 -8.443279e-01 -8.090170e-01 -7.705132e-01 -7.289686e-01 -6.845471e-01 -6.374240e-01
 [91] -5.877853e-01 -5.358268e-01 -4.817537e-01 -4.257793e-01 -3.681246e-01 -3.090170e-01 -2.486899e-01 -1.873813e-01 -1.253332e-01 -6.279052e-02

Et voici les valeurs absolues résultantes du domaine de fréquence fft

 [1] 7.160038e-13 1.008741e-01 2.080408e-01 3.291725e-01 4.753899e-01 6.653660e-01 9.352601e-01 1.368212e+00 2.211653e+00 4.691243e+00 5.001674e+02
[12] 5.293086e+00 2.742218e+00 1.891330e+00 1.462830e+00 1.203175e+00 1.028079e+00 9.014559e-01 8.052577e-01 7.294489e-01

Je suis aussi un peu rouillé en mathématiques et en traitement du signal, mais avec les informations supplémentaires, je peux essayer.

Si vous souhaitez connaître l'énergie du signal par bac, vous devez connaître la magnitude de la sortie complexe. Il ne suffit donc pas de regarder le résultat réel. Même lorsque l'entrée n'est que de vrais nombres. Pour chaque bac, la valeur de sortie est sqrt (real ^ 2 + imag ^ 2), tout comme Pythagore: -)

Les

cases 0 à 449 sont des fréquences positives de 0 Hz à 500 Hz. les cases 500 à 1000 sont des fréquences négatives et doivent être identiques aux positives pour un signal réel. Si vous traitez un tampon toutes les secondes, les fréquences et les indices de tableau s'alignent bien. Donc, le pic à l'index 6 correspond à 6Hz, donc c'est un peu étrange. Cela tient peut-être au fait que vous ne regardez que les données de sortie réelles et que les données réelles et imaginaires se combinent pour donner un pic attendu à l’indice 10. Les fréquences doivent correspondre linéairement aux bacs.

Les pics à 0 indiquent un décalage CC.

Cela fait quelque temps que je n'ai pas fait la FFT mais voici ce dont je me souviens

La FFT prend généralement des nombres complexes en entrée et en sortie. Donc, je ne suis pas vraiment sûr de savoir comment la partie réelle et imaginaire de l'entrée et de la sortie est mappée aux tableaux.

Je ne comprends pas vraiment ce que vous faites. Dans le premier exemple, vous dites que vous traitez des tampons d'échantillonnage à 10Hz pour une fréquence d'échantillonnage de 1000 Hz? Donc, vous devriez avoir 10 tampons par seconde avec 100 échantillons chacun. Je ne comprends pas comment votre tableau d'entrée peut contenir au moins 228 échantillons.

Généralement, la première moitié de la mémoire tampon de sortie est constituée de plages de fréquences allant de 0 fréquence (= décalage en continu) à 1/2 fréquence d'échantillonnage. et la seconde moitié sont des fréquences négatives. si votre entrée est constituée uniquement de données réelles avec 0 pour le signal imaginaire, les fréquences positives et négatives sont identiques. La relation entre le signal réel / imaginaire sur la sortie contient les informations de phase de votre signal d’entrée.

La fréquence pour bin i est i * (taux d'échantillonnage / n), où n est le nombre d'échantillons dans la fenêtre de saisie de la FFT.

Si vous gérez l'audio, étant donné que la hauteur tonale est proportionnelle au journal de fréquence, la résolution de hauteur des cases augmente avec la fréquence. Il est donc difficile de résoudre les signaux basse fréquence avec précision. Pour ce faire, vous devez utiliser des fenêtres FFT plus grandes, ce qui réduit la résolution temporelle. Il existe un compromis entre la fréquence et la résolution temporelle pour un taux d'échantillonnage donné.

Vous mentionnez une corbeille avec une valeur élevée à 0 - c’est la corbeille dont la fréquence est 0, c’est-à-dire la composante CC. Si cela est important, vos valeurs sont probablement positives. Le bac n / 2 (dans votre cas, 256) correspond à la fréquence de Nyquist, soit la moitié de la fréquence d'échantillonnage, soit la fréquence la plus élevée pouvant être résolue dans le signal échantillonné à cette fréquence.

Si le signal est réel, les groupes n / 2 + 1 à n-1 contiendront les conjugués complexes des groupes n / 2-1 à 1, respectivement. La valeur DC n’apparaît qu’une fois.

Les échantillons sont, comme d’autres l'ont déjà dit, équidistants dans le domaine fréquentiel (non logarithmique).

Par exemple, vous devriez obtenir ceci:

texte de remplacement http://home.comcast.net/~kootsoop/images /SINE1.jpg

Pour l'autre exemple, vous devriez obtenir

texte alt http://home.comcast.net/~kootsoop/images /SINE2.jpg

Vos réponses semblent donc correctes en ce qui concerne l'emplacement du pic.

Ce que je ne comprends pas, c’est le gros composant DC. Etes-vous sûr de générer une onde sinusoïdale comme entrée? Est-ce que l'entrée devient négative? Pour une onde sinusoïdale, le courant continu doit être proche de zéro, à condition que vous ayez suffisamment de cycles.

Une autre solution consiste à créer un l'algorithme de Goertzel pour chaque fréquence centrale que vous recherchez. .

Une fois que vous avez une implémentation de l’algorithme qui fonctionne, vous pouvez la configurer de telle sorte qu’il faut des paramètres pour définir sa fréquence centrale. Avec cela, vous pouvez facilement exécuter 88 d'entre eux ou tout ce dont vous avez besoin dans une collection et rechercher la valeur maximale.

L’algorithme de Goertzel est fondamentalement une FFT à casier unique. En utilisant cette méthode, vous pouvez placer vos bacs de manière logarithmique comme des notes de musique disparaissent naturellement.

Quelques pseudo-codes de Wikipedia:

s_prev = 0
s_prev2 = 0
coeff = 2*cos(2*PI*normalized_frequency);
for each sample, x[n],
  s = x[n] + coeff*s_prev - s_prev2;
  s_prev2 = s_prev;
  s_prev = s;
end
power = s_prev2*s_prev2 + s_prev*s_prev - coeff*s_prev2*s_prev;

Les deux variables représentant les deux échantillons précédents sont conservées pour la prochaine itération. Ceci peut ensuite être utilisé dans une application de streaming. Je pense que le calcul de la puissance devrait également être dans la boucle. (Cependant, il n’est pas décrit en tant que tel dans l’article de Wiki.)

Dans le cas de la détection de tonalité, il y aurait 88 coeficients différents, 88 paires d'échantillons précédents, ce qui donnerait 88 échantillons de sortie de puissance indiquant le niveau relatif dans cette case de fréquence.

WaveyDavey dit qu'il capte le son d'un micro via le matériel audio de son ordinateur, MAIS ses résultats ne sont pas centrés. Cela ressemble à un problème avec le matériel. Il devrait être centré.

Lorsque la salle est silencieuse, le flux de valeurs provenant de l’API de son doit être très proche de l’amplitude 0, avec de légères variations de + - pour le bruit ambiant. Si un son vibratoire est présent dans la pièce (p. Ex. Un piano, une flûte, une voix), le flux de données doit montrer une onde fondamentalement sinusoïdale positive et négative, avec des moyennes proches de zéro. Si ce n'est pas le cas, il y a du funk dans le système!

-Rick

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top