La première étape consiste à vérifier que votre taux d'échantillonnage de départ et votre taux d'échantillonnage cible sont des nombres rationnels . Comme ce sont des entiers, ce sont automatiquement des nombres rationnels. Si l'un d'eux n'était pas un nombre rationnel, il serait toujours possible de modifier la fréquence d'échantillonnage, mais c'est un processus très différent et plus difficile.
L'étape suivante consiste à factoriser les deux taux d'échantillonnage. Le taux d'échantillonnage de départ, dans ce cas, est de 44100, ce qui donne . Le taux d'échantillonnage cible, 16000, correspond à . Ainsi, pour passer du taux d'échantillonnage de départ au taux cible, nous devons décimer de et interpoler de .22∗ 32∗ 52∗ 722sept∗ 5332∗ 7225∗ 5
Les étapes précédentes doivent être effectuées quelle que soit la manière dont vous souhaitez rééchantillonner les données. Voyons maintenant comment le faire avec les FFT. L'astuce pour rééchantillonner avec des FFT est de choisir des longueurs FFT qui font que tout fonctionne bien. Cela signifie choisir une longueur FFT qui est un multiple du taux de décimation (441, dans ce cas). Pour les besoins de l'exemple, prenons une longueur FFT de 441, bien que nous aurions pu choisir 882, ou 1323, ou tout autre multiple positif de 441.
Pour comprendre comment cela fonctionne, il est utile de le visualiser. Vous commencez avec un signal audio qui ressemble, dans le domaine fréquentiel, à quelque chose comme la figure ci-dessous.
Lorsque vous avez terminé votre traitement, vous voulez réduire la fréquence d'échantillonnage à 16 kHz, mais vous voulez aussi peu de distorsion que possible. En d'autres termes, vous voulez simplement garder tout de l'image ci-dessus de -8 kHz à +8 kHz et supprimer tout le reste. Cela se traduit dans l'image ci-dessous.
Veuillez noter que les taux d'échantillonnage ne sont pas à l'échelle, ils sont juste là pour illustrer les concepts.
La beauté de choisir une longueur FFT qui est un multiple du facteur de décimation est que vous pouvez rééchantillonner simplement en supprimant des parties du résultat FFT, puis en inversant FFT ce qui reste. Dans le cas de notre exemple, vous FFT 441 échantillons de données, ce qui vous donne 441 échantillons complexes dans le domaine fréquentiel. Nous voulons décimer de 441 et interpoler de 160 ( ), nous gardons donc les 160 échantillons qui représentent les fréquences de -8 kHz à +8 kHz. Nous inversons ensuite FFT ces échantillons et hop! Vous disposez de 160 échantillons de domaine temporel échantillonnés à 16 kHz.25∗ 5
Comme vous vous en doutez, il y a quelques problèmes potentiels. Je vais passer en revue chacun d'eux et expliquer comment vous pouvez les surmonter.
Que faites-vous si vos données ne sont pas un joli multiple du facteur de décimation? Vous pouvez facilement surmonter cela en remplissant la fin de vos données avec suffisamment de zéros pour en faire un multiple du facteur de décimation. Les données sont remplies AVANT d'être transférées par FFT.
Même si la méthode que j'ai expliquée est très simple, elle n'est pas non plus idéale car elle peut introduire des sonneries et d'autres artefacts désagréables dans le domaine temporel. Vous pouvez éviter cela en filtrant les données du domaine fréquentiel avant de supprimer les données haute fréquence. Vous faites cela en FFT'ant votre filtre de longueur , en remplissant vos données (avant FFT'ing) avec au moinsll - 1zéros (veuillez noter que le nombre d'échantillons de données et le nombre d'échantillons de remplissage doivent DEUX être un multiple positif du facteur de décimation - vous pouvez augmenter la longueur de remplissage pour respecter cette contrainte), FFT'ing les données rembourrées, multipliant le domaine de fréquence données et filtre, puis aliasing les résultats haute fréquence (> 8 kHz) vers le bas dans les résultats basse fréquence (<8 kHz) avant de supprimer les résultats haute fréquence. Malheureusement, comme le filtrage dans le domaine fréquentiel est un grand sujet à part entière, je ne pourrai pas entrer plus en détail dans cette réponse. Je dirai cependant que si vous filtrez et traitez les données en plusieurs morceaux, vous devrez implémenter Overlap-and-Add ou Overlap-and-Save pour rendre le filtrage continu.
J'espère que ça aide.
EDIT: La différence entre le nombre initial d'échantillons de domaine fréquentiel et le nombre cible d'échantillons de domaine fréquentiel doit être égale afin que vous puissiez supprimer le même nombre d'échantillons du côté positif des résultats que du côté négatif des résultats. Dans le cas de notre exemple, le nombre d'échantillons de départ était le taux de décimation, ou 441, et le nombre cible d'échantillons était le taux d'interpolation, ou 160. La différence est de 279, ce qui n'est pas pair. La solution consiste à doubler la longueur de la FFT à 882, ce qui fait que le nombre cible d'échantillons double également à 320. Maintenant, la différence est égale et vous pouvez supprimer sans problème les échantillons de domaine de fréquence appropriés.