Comment analyser correctement l'entrée / le spectre audio


9

Je suis assez novice en Java et en traitement du signal, mais on m'a confié un projet portant sur le traitement audio. Mon sujet qui m'est donné est un jeu qui a une composante d'analyse d'une chanson (n'importe quelle chanson donnée) et génère des données en fonction de la fréquence en cours de lecture (temps réel). c'est-à-dire: pendant la lecture du morceau, il émet la fréquence actuelle (chaque seconde, il émet la fréquence actuelle).

On m'a dit sur stackoverflow d'utiliser la FFT. ils disent "fais juste une FFT" mais ça ne veut rien dire pour moi? COMMENT faites-vous une FFT? J'ai lu des tutoriels et je comprends essentiellement ce que c'est, mais je n'ai aucune idée de la façon de l'implémenter comme dans:

  • quel est le type de données du fichier audio le plus approprié pour un tel traitement?
  • quelle est exactement l'entrée de la FFT
  • comment interpréter les résultats

Quelqu'un peut-il suggérer une marche à suivre / tutoriel simple sur la façon de traiter un signal audio? De plus, si quelqu'un connaît une bonne implémentation de FFT pour Java, j'apprécierais les suggestions.


2
Cette question semble être hors sujet car elle concerne les tableaux Java de base, les types de données et la lecture de fichiers.
hotpaw2

1
Ils ont dit que je dois demander ici car cela concerne le traitement du signal
user3241507

Seule la dernière partie de votre question semble concerner le DSP. Essayez de supprimer les 2 ou 3 premières parties pour être sur le sujet ici.
hotpaw2

Réponses:


8

Voyons voir. Je n'ai aucune idée des classes Java ni du type de support qu'il a pour le traitement du signal, mais je vais vous donner quelques directives. Les détails particuliers de la mise en œuvre dans la langue, vous devez comprendre.

Pour effectuer tout type de traitement sur un fichier audio, vous avez besoin des données "brutes", c'est-à-dire un fichier audio contenant des échantillons audio non compressés. Par exemple, le format WAV, qui comporte normalement des échantillons en complément à 2 bits signé 16 bits.

Si vous allez utiliser un ordinateur et effectuer un traitement hors ligne, il peut être judicieux de convertir cette valeur en double (ce qui, dans la plupart des processeurs, signifie aujourd'hui un nombre à virgule flottante 64 bits).

Par conséquent, vous aurez un flux continu de nombres doubles provenant du fichier. Ensuite, vous devez définir un moyen de gérer les données continues. Un moyen standard et très largement utilisé consiste à utiliser un tampon circulaire (même s'il est hors ligne, je suppose que vous voulez que votre code soit efficace, et charger le fichier entier en mémoire sous forme de tableau n'est pas la meilleure solution). Soit cela, soit juste un tampon normal, est votre choix. La longueur du tampon doit être une puissance de 2 (Do à l'efficacité de l'algorithme Cooley-Tukey radix-2).

Vous devez maintenant effectuer la FFT réelle. Il s'agit simplement d'une multiplication du tampon (qui est mathématiquement un vecteur) par la matrice FFT. Comment cette opération est réellement effectuée en Java, aucune idée. En C, ce serait juste de passer le pointeur au tableau et la longueur à une routine FFT qui, soit retourne un pointeur à la mémoire allouée de manière dinamique, soit laisse le résultat dans un tableau que vous lui passez.

enfin, vous arrivez à un tableau de M nombres complexes (en supposant que la longueur du tableau / tampon / vecteur avec le signal est M). Et puis vous faites ce que vous voulez avec.

Par exemple, vous pourriez prendre la magnitude de chacun des nombres complexes et trouver le maximum pour détecter où la fréquence fondamentale pourrait être (très approximative cependant).

Extras: Des techniques plus avancées à traiter incluent un pré fenêtrage pour éviter les fuites, un remplissage nul pour obtenir plus de résolution sur le spectre fenêtré, etc.

J'espère que cela aide.


5

Si vous êtes assez bon avec JAVAvous pouvez utiliser les JTRANSFORMS une bibliothèque java pour FFTlaquelle peut vous être utile

et par votre besoin, cela ressemble à un

entrez la description de l'image ici

Visualisation de la musique à l'aide de l'API Java Sound

Visualisation de la musique à l'aide de la FFT dans Ruby en 7 étapes

vous pouvez suivre ces étapes simples selon vos besoins:

* Habituez-vous à une terminologie audio

1.Lisez la trame de lecture (disons un 20-30 ms), votre taille de trame dépend de votre sampling ratedisons que vous utilisez un taux d'échantillonnage de 8000 et que chaque échantillon l'est 16bit signed little endian, alors votre trame de 20 ms sera de 160 échantillons

Remarque: essayez de lire un rawfichier et non un mp3fichier compressé .

Prendre le cadre des données brutes et effectuer une FFT

3. effectuer correctement Windowing

4.votre résultat FFT de sortie aura deux composants réels et complexes essayez d'en prendre un tracé de magnitude qui est juste la absolutevaleur du composant complexe, votre pic vous donne ladominant frequency

5. jetez un œil à des didacticiels simples comme ci-dessous

Bon tutoriel sur FFT

Guide de l'ingénieur sur la FFT

Tutoriel FFT

Vue d'ensemble de la FFT

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.