J'essaie de trouver comment (si possible) extraire les composantes de fréquence d'un échantillon audio arbitraire (généralement de la musique) d'une manière similaire à la FFT, mais dans mes recherches sur l'algorithme FFT, j'apprends qu'il en souffre restrictions sévères à cet effet.
La FFT présente 3 problèmes:
Parce que la résolution bin FFT est équivalente à la taille de votre fenêtre, pour obtenir une précision assez raisonnable (disons 1 Hz), vous avez besoin d'une fenêtre déraisonnablement longue (disons 1 seconde). Cela signifie que vous ne pouvez pas détecter rapidement les transitoires ou les fréquences nouvellement introduites. Cela signifie également que le problème ne peut pas être résolu avec un processeur plus rapide et un taux d'échantillonnage plus élevé - la restriction est intrinsèquement liée au temps.
Les humains perçoivent la fréquence de façon logarithmique, mais les bacs FFT sont espacés linéairement. Par exemple, une différence de 20 Hz à l'extrémité inférieure de notre audition est énorme , alors qu'une différence de 20 Hz à l'extrémité supérieure est imperceptible. Donc, pour obtenir la précision dont nous avons besoin à basses fréquences, nous devons calculer beaucoup plus que ce dont nous avons besoin à hautes fréquences.
Certains de ces problèmes peuvent être résolus par interpolation entre les bacs FFT. Cela peut fonctionner pour beaucoup d'audio musical, car les fréquences sont souvent espacées assez loin et donc pas plus d'une fréquence ne fuit dans une paire de casiers. Mais ce ne sera pas toujours le cas, en particulier pour les sons inharmoniques comme les instruments à percussion. L'interpolation n'est donc qu'une conjecture.
D'après ce que je comprends de l'algorithme DFT / FFT, les sorties (amplitudes bin) sont effectivement la corrélation du sinus / cosinus à la fréquence de chaque bin. Il me semble que si l'algorithme pouvait être repensé de façon à ce que les fréquences de bac soient espacées de manière non linéaire (c'est-à-dire que nous corrélons un ensemble différent de sinus / cosinus), alors nous pourrions atteindre une résolution pyschoacoustiquement égale à toutes les fréquences. Est-ce possible, ou est-ce un rêve chimérique basé sur ma compréhension incomplète des mathématiques impliquées?
Je suppose que je pourrais également résoudre le problème avec la force brute, en corrélant les sinus / cosinus à chaque fréquence qui m'intéresse. Je ne suis pas trop informé sur les mathématiques ici. Est-ce possible? Quelle sorte d'efficacité? Cela résoudrait-il mon problème?
Existe-t-il une manière différente d'obtenir une décomposition de fréquence plus précise et en temps réel d'un signal? L'efficacité du processeur est une préoccupation, mais pas la préoccupation majeure - je suis en partie intéressé à savoir si cela peut théoriquement être fait du tout. Cependant, quelque chose qui est réalisable en temps réel sur une machine de bureau moderne serait idéal.