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.
Réponses:
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.
la source
Si vous êtes assez bon avec
JAVA
vous pouvez utiliser les JTRANSFORMS une bibliothèque java pourFFT
laquelle peut vous être utileet par votre besoin, cela ressemble à un
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 rate
disons que vous utilisez un taux d'échantillonnage de 8000 et que chaque échantillon l'est16bit
signed
little endian
, alors votre trame de 20 ms sera de 160 échantillonsRemarque: essayez de lire un
raw
fichier et non unmp3
fichier 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
absolute
valeur 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
la source