2010-12-16 311 views
1

J'ai un détecteur de tonalité de travail qui utilise une FFT pour déterminer si une tonalité (ou une paire de sons) d'une fréquence particulière est présente dans un flux audio (si suffisamment au-dessus du bruit de fond). Quelle méthode pourrais-je utiliser pour localiser plus précisément le temps de début et la durée de ce ton? Je cherche quelque chose de beaucoup plus précis que la durée de la trame FFT (environ 50 ms). La tonalité est supposée être beaucoup plus longue qu'une trame FFT.Mesure de début/durée de tonalité précise?

Répondre

0

Si la fréquence particulière est connue à l'avance, vous pouvez concevoir un filtre passe-bande centré autour de cette fréquence, puis utiliser un détecteur d'énergie sur la sortie. Vous devez tenir compte du retard de masse à travers le filtre, et probablement aussi des temps de montée et de descente de la réponse en régime permanent.

Si vous utilisez la sortie FFT pour détecter réellement la tonalité, et que vous avez suffisamment de mémoire pour conserver les échantillons récents, vous pouvez obtenir une estimation approximative du début de la FFT, remonter dans le temps quelques centaines millisecondes avant, et commencer à mélanger les échantillons par une sinusoïde à la fréquence détectée. Ensuite, exécutez les échantillons mixés à travers un filtre passe-bas. Votre système de détection de tonalité, votre table de mixage et vos résolutions de bande passante/bandes passantes LPF devront correspondre, et encore une fois, vous devrez tenir compte des caractéristiques du LPF.

+0

Le temps de montée (et de chute) du filtre LPF ne serait-il pas du même ordre de grandeur que la largeur de l'ouverture FFT. Où est le gain en résolution temporelle? – hotpaw2

+0

Si vous augmentez la bande passante du filtre, vous réduisez le temps de montée. Vous avez beaucoup plus de contrôle sur la bande passante du filtre que la FFT bloque, non? Et si vous implémentez le filtre sous une forme directe, vous n'avez pas la latence de la FFT. – mtrw

3

Semble comme la détection DTMF. La technique standard pour cela est le Goertzel algorithm. Vous avez besoin d'un détecteur Goertzel pour chaque fréquence d'intérêt, vous devez donc connaître les fréquences a priori.

+0

AFAIK, un filtre Goertzel standard n'est pas plus précis qu'un bac FFT pour toute détection de fréquence ou estimation de temps. Je cherche quelque chose de plus précis qu'un bac FFT. – hotpaw2

+0

@ hotpaw2: Cela dépend de ce que vous entendez par "précis". Vous devez échanger la résolution de fréquence contre la résolution de temps - vous ne pouvez pas avoir les deux. Quoi qu'il en soit, la sortie d'un filtre de Goertzel peut être rectifiée et lissée (filtre passe-bas) de sorte qu'elle devrait vous donner des mesures de temps d'attaque/offset raisonnables, contrairement à une FFT qui a une taille de fenêtre fixe. –