2012-08-23 4 views
2

Je peux utiliser fft pour obtenir les fréquences, les phases et la magnitude d'un fichier audio d'une seconde chargé d'une personne en disant "ahhhh" et le recréer. Ce que j'essaie de faire maintenant est de trouver où chacune de ces fréquences commence et où elles se terminent dans le fichier audio 1 seconde et placez les données dans un tableaufft et ondelettes

Exemple: 100hz commence à 0,23 secondes à 0,34 secondes , 104.34hz commence à .35seconds et se termine à .37seconds.

Est-ce que cela peut être fait ou dois-je déplacer mon programme entier pour utiliser des ondelettes? Y a-t-il aussi des exemples d'ondelettes en octave qui montrent comment faire ce que j'essaie d'accomplir?

J'utilise Ubuntu Linux 12.04 et Octave 3.2.4 de

du repo de Merci Rick

+0

Pour la voix humaine, aucune FFT ou ondelettes ne peuvent convenir. Regardez plutôt des algorithmes de détection/d'estimation de hauteur, qui sont différents de la mesure de fréquence spectrale de crête. – hotpaw2

Répondre

5

FFT comme un algorithme pour estimer une transformée de Fourier discrète (DFT), fournit la teneur en fréquence de votre signal audio (amplitude et phase comme vous le mentionnez). Cela vous donnera un ensemble de valeurs de magnitude/phase par corbeille de fréquence discrète, que vous pouvez mapper à une valeur de fréquence continue (basée sur l'index bin ou la fréquence discrète, le nombre de points FFT et la fréquence d'échantillonnage de votre signal). DFT (par FFT) est une transformation globale, c'est-à-dire que vous perdrez la notion de temps puisque vous vous déplacez dans le domaine fréquentiel. Ce dont vous avez besoin est la Transformée de Fourier à Court Terme (STFT), c'est-à-dire. FFT sur un court laps de temps (fenêtres) du signal. Cela vous donnera en sortie une représentation temps-fréquence dans laquelle vous pouvez spécifier le contenu fréquentiel par fenêtre d'analyse, et donc par instances de courte durée.

esquisse Approche: Définir la longueur de la fenêtre temporelle et décalages de fenêtre (sur la base de la résolution temporelle souhaitée ou des instances de temps de façon linéaire dans l'échantillon), exécuter STFT, puis un procédé d'estimation de crête cueillette ou maxima locaux de l'amplitude de Fourier chaque fenêtre. Cela vous donnera des emplacements de fréquences dominantes que vous pouvez suivre à travers le temps (apparitions, etc.)

Dans MATLAB, vérifiez spectrogram pour une implémentation de STFT pour vous aider à démarrer.

+0

FFT ne "estime" pas la DFT, elle le calcule exactement. Si une implémentation FFT et DFT donne des résultats différents, cela est uniquement dû à la précision de la machine (arrondi à un nombre de fois différent, dans différents 'endroits' dans la procédure). Une machine avec une infite précision calculera exactement la même solution via un algorithme FFT ou DFT. – user1207217

+0

@ user1207217 vous avez raison. Je soulignais simplement que FFT est un algorithme qui implémente une transformation (DFT). Différentes FFT vont "calculer" la transformation DFT avec une précision et des compromis différents entre l'efficacité et la précision. La précision numérique (calcul ou approximation exacte) dépend i) de l'erreur de précision finie, de l'arithmétique en virgule flottante et de l'arrondi, comme vous le signalez correctement, ii) de l'algorithme FFT spécifique (par exemple "exact" ou "approximatif" ou "full"), iii) la bibliothèque/implémentation et la manière dont elle gère l'accumulation d'erreurs, c'est-à-dire la mise à l'échelle des itérations, etc. – gevang