2014-05-17 2 views
0

J'essaye de rééchantillonner un signal 1-D en utilisant une méthode FFT (fondamentalement, celle de scipy.signal). Cependant, le code prend une éternité à s'exécuter, même si mon signal d'entrée est une puissance de deux longueurs. Après avoir examiné le profilage, j'ai trouvé la racine du problème. Fondamentalement, cette méthode prend une FFT, puis supprime une partie du spectre de Fourier, puis prend un IFFT pour le ramener dans le domaine temporel à un taux d'échantillonnage plus faible.IFFT prenant des ordres de grandeur plus que FFT

Le problème est que le IFFT prend loin plus à courir que la FFT:

ncalls tottime percall cumtime percall filename:lineno(function) 1 6263.996 6263.996 6263.996 6263.996 basic.py:272(ifft) 1 1.076 1.076 1.076 1.076 basic.py:169(fft)

Je suppose que cela a quelque chose à voir avec le nombre de points de fourier restant après la coupure . Cela dit, il s'agit d'un ralentissement incroyable, donc je veux m'assurer que:

A. Ce comportement est semi-raisonnable et n'est certainement pas un bug. B. Que pourrais-je faire pour éviter ce problème et encore sous-échantillonner efficacement.

En ce moment, je peux mettre mon signal d'entrée à une puissance de deux pour que la FFT fonctionne très rapidement, mais je ne sais pas comment faire le même genre de chose pour l'opération inverse. Je n'ai même pas réalisé que c'était un problème pour les IFFT: P

+0

Quel est le nombre de points dans l'IFFT? Si c'est, par exemple, un nombre premier, cela prendra beaucoup de temps. FFT et IFFT utilisent le même algorithme. –

+1

Oui, je pense que c'est le problème. Ma longueur d'origine est 13648384, ce qui a plusieurs facteurs mais le premier couple est [1, 2, 4, 8, 16, 19, 23, 32]. D'autre part, j'échantillonne de 22050Hz à 1200Hz, donc la nouvelle longueur serait 742769 avec seulement trois facteurs: [1, 151, 4919]. Donc je suppose que le problème est que la deuxième longueur a très peu de facteurs, mais je ne suis pas sûr de savoir comment résoudre cela sans gâcher la conversion du taux d'échantillonnage ... – choldgraf

+1

Il y a des algos FFT qui sont beaucoup mieux que celui peut expédier (licence). Donc, vous pouvez essayer FFTW pour lequel les wrappers python existent. – seberg

Répondre

1

Si la longueur de votre IFFT est différente de celle de la FFT, et que la longueur de l'IFFT n'est pas composée de seulement de très petits facteurs premiers (2, 3, etc.), alors l'efficacité peut chuter de manière significative.

Ainsi, cette méthode de rééchantillonnage n'est efficace que si les deux fréquences d'échantillonnage sont différentes par des rapports avec de petits facteurs premiers, tels que 2, 3 et 7 (indice).

Questions connexes