Je suis ingénieur chimiste, pas EE, donc c'est un peu difficile.
J'essaie de comprendre comment prendre des données d'amplitude vs temps et les transformer en fréquence vs temps. Mon premier réflexe est de découper mes données en morceaux, d'effectuer la FFT sur chaque morceau, puis de tracer cela. Malheureusement, comme la durée de chaque tranche approche de zéro, il n'y a plus suffisamment d'informations pour obtenir des informations de fréquence précises (les basses fréquences nécessitent plus qu'une très petite tranche de temps). Alors ... comment je fais ça? Je suis sûr que c'est une sorte de problème célèbre que quelqu'un a déjà résolu.
Voici le type de transformation que je recherche, illustré par une onde sonore (note de piano G). Comme vous pouvez le voir, ce graphique comporte trois axes, le troisième étant représenté par la couleur.
La résolution temps vs fréquence est un problème bien connu, et il existe en effet des approches pour le surmonter. Pour les signaux audio, certaines des techniques couramment utilisées comprennent: les méthodes paramétriques; résolution adaptative (analyser avec différentes configurations temps / fréquence et corriger les résultats ensemble - Wen X. et M. Sandler, "Spectrogramme composite utilisant plusieurs transformées de Fourier"); ondelettes / décompositions sur des bases trop complètes; et utilisation des informations de phase pour extraire l'emplacement précis des pics de fréquence (IFgram).
Cependant, il semble que le graphique que vous avez montré n'utilise pas certaines de ces techniques; donc je soupçonne que ce n'est pas ce que vous cherchez. Il semble y avoir des "bavures" sur l'axe horizontal (par exemple à t = 1,2 s) et c'est un signe certain que l'analyse a été effectuée avec un chevauchement élevé entre les morceaux.
En effet, la durée des blocs et le nombre de trames d'analyse par seconde n'ont pas à être liés les uns aux autres si vous autorisez les trames à se chevaucher. Donc, si vous souhaitez utiliser un cadre d'analyse de 40 ms, votre grille ne doit pas nécessairement être:
trame 1: t = 0..t = 40ms; image 2: t = 40ms..t = 80ms
Cela pourrait très bien être:
trame 1: t = 0..t = 40ms; image 2: t = 10 ms..t = 50 ms
Ce chevauchement peut donner l'illusion d'une résolution temporelle plus élevée sans trop réduire la taille de la fenêtre FFT. Notez que cela ne peut aider qu'à localiser avec précision un événement sur l'axe du temps - cela n'aidera pas à résoudre deux événements proches dans le temps ... Tout comme l'augmentation de la taille de la FFT pourrait aider à identifier l'emplacement d'un pic de fréquence, mais pas avec le résolution de deux pics de fréquence adjacents.
Comment iriez-vous dans l'autre sens (passer du spectrogramme au signal audio)
Pete
4
Oui, beaucoup de gens ont travaillé sur l'analyse temps-fréquence.
L'approche de "découper mes données en morceaux, effectuer la FFT sur chaque morceau" est une bonne idée. L'application d'une "fonction fenêtre" sur chaque bloc, juste avant d'effectuer la FFT, permet d'éviter de nombreux artefacts. Permettre aux morceaux de se chevaucher aide également. Après ces ajustements, vous vous retrouvez avec la transformation de Gabor , qui semble être la transformation de Fourier à court terme la plus populaire (STFT).
Comme vous l'avez déjà souligné, et comme le souligne l'article de Wikipedia, toutes les techniques de transformée de Fourier à court terme ont un compromis:
lorsque vous coupez la série temporelle en morceaux très courts, vous obtenez des informations temporelles très précises quant au moment précis où une tonalité commence et s'arrête, mais les informations de fréquence sont très floues.
Lorsque vous coupez la série chronologique en morceaux très longs, vous obtenez des informations de fréquence très précises sur la fréquence exacte d'une tonalité, mais l'heure exacte à laquelle elle démarre et s'arrête est floue.
C'est un problème célèbre, mais hélas, non seulement il n'a pas été résolu, il a été prouvé que l'incertitude entre les deux est inévitable - la limite de Gabor, la limite de Heisenberg-Gabor, le principe d'incertitude , etc.
Si j'étais vous, je commencerais par l'une des nombreuses bibliothèques prêtes à l'emploi pour calculer la transformation de Gabor et expérimenter la découpe des séries temporelles en différentes longueurs. Il y a de fortes chances que vous ayez de la chance et vous vous retrouverez avec une certaine longueur qui donne une localisation temporelle adéquate et une discrimination de fréquence adéquate .
La transformation de Gabor est uniquement avec des fenêtres gaussiennes. Si vous utilisez une autre fenêtre, ce n'est qu'un STFT. (Et les vraies fenêtres gaussiennes n'existent pas en numérique car elles diminuent à l'infini.)
endolith
@endolith: Vous avez raison. La transformation de Gabor utilise une "fonction de fenêtre gaussienne" qui est tronquée à une longueur finie - elle est assez proche, mais pas mathématiquement identique à, une gaussienne idéale.
David Cary
Je pense que la transformation de Gabor est une transformation continue, utilisant une intégrale, donc elle peut avoir une gaussienne non tronquée comme fenêtre?
endolith
@endolith: Oui, en principe, une personne pourrait utiliser un gaussien non tronqué comme fenêtre. Dans la pratique, puisque pratiquement toute l'énergie du gaussien se trouve à quelques sigma de la bosse centrale, l'utilisation d'une fenêtre tronquée ne fait pratiquement toujours aucune différence perceptible dans le graphique de sortie. Étant donné que le logiciel qui produit des tracés en cascade du spectrogramme applique à plusieurs reprises la fenêtre gaussienne et effectue ensuite une FFT pour chaque colonne du graphique, "ne pas tronquer" rendrait ce logiciel insupportablement lent.
Oui, beaucoup de gens ont travaillé sur l'analyse temps-fréquence.
L'approche de "découper mes données en morceaux, effectuer la FFT sur chaque morceau" est une bonne idée. L'application d'une "fonction fenêtre" sur chaque bloc, juste avant d'effectuer la FFT, permet d'éviter de nombreux artefacts. Permettre aux morceaux de se chevaucher aide également. Après ces ajustements, vous vous retrouvez avec la transformation de Gabor , qui semble être la transformation de Fourier à court terme la plus populaire (STFT).
Comme vous l'avez déjà souligné, et comme le souligne l'article de Wikipedia, toutes les techniques de transformée de Fourier à court terme ont un compromis:
C'est un problème célèbre, mais hélas, non seulement il n'a pas été résolu, il a été prouvé que l'incertitude entre les deux est inévitable - la limite de Gabor, la limite de Heisenberg-Gabor, le principe d'incertitude , etc.
Si j'étais vous, je commencerais par l'une des nombreuses bibliothèques prêtes à l'emploi pour calculer la transformation de Gabor et expérimenter la découpe des séries temporelles en différentes longueurs. Il y a de fortes chances que vous ayez de la chance et vous vous retrouverez avec une certaine longueur qui donne une localisation temporelle adéquate et une discrimination de fréquence adéquate .
Si cela ne fonctionne pas pour cette application, alors je passer à d' autres approches de représentation temps-fréquence et l' analyse temps-fréquence -, transformées en ondelettes transforme chirplets , transformée de Fourier fractionnaire (FRFT), etc.
EDIT: Du code source pour générer des spectrogrammes / tracés en cascade à partir de données audio:
L'image vers le spectrogramme va dans le sens inverse des utilitaires ci-dessus.
la source