2 votes

Filtre FFT vs lfilter en python

J'ai quelques problèmes lorsque j'applique un filtre passe-bande à un signal en Python. J'ai essayé les choses suivantes :

  • Faire la fenêtre de la boîte "à la main", c'est-à-dire faire la FFT sur le signal, appliquer le filtre à l'aide d'une boîte. filtre avec une fenêtre en boîte, puis faire l'IFFT pour revenir au domaine temporel. temporel.
  • Utiliser le module scipy.signal où j'utilise firwin2 pour construire le filtre et ensuite lfilter pour le filtrage. filtre et ensuite lfilter pour faire le filtrage.

De plus, j'ai effectué le même filtrage dans le programme audio Cool Edit et j'ai comparé les résultats des deux tests ci-dessus.

Comme on peut le voir (je suis un nouvel utilisateur et je ne peux donc pas poster ma figue en png), les résultats de la FFT et de scipy.signal sont très différents. Lorsque l'on compare avec le résultat de Cool edit, la FFT est proche, mais pas identique. Le code est le suivant :

# imports 
from pylab import *
import os
import scipy.signal as signal

# load data 
tr=loadtxt('tr6516.txt',skiprows=1)

sr = 500            # [samples/s]
nf = sr/2.0         # Nyquist frequence
W = 512            # Window widht for filtering
N=float(8192)       # Fourier settings
Ns = len(tr[:,0])   # Total number of samples

# Create inpulse responce from the filter
fv=12.25
w    =0.5
r    =0.5*w
Hz=[0, fv-w-r, fv-w, fv+w, fv+w+r, nf]
ff=[0, 0,      1,    1,    0,      0]
b = signal.firwin2(W,Hz,ff,nfreqs=N+1,nyq=nf)
SigFilter = signal.lfilter(b, 1, tr[:,1])

# Fourier transform
X1 = fft(tr[:,1],n=int(N))
X1 = fftshift(X1)
F1 = arange(-N/2.0,N/2.0)/N*sr

# Filter data
ff=[0,1,1,0]
fv=12.25
w    =0.5
r    =0.5*w
Hz=[fv-w-r,fv-w,fv+w,fv+w+r]
k1=interp(-F1,Hz,ff)+interp(F1,Hz,ff)
X1_f=X1*k1
X1_f=ifftshift(X1_f)
x1_f=ifft(X1_f,n=int(N))

Quelqu'un peut-il m'expliquer pourquoi cette différence ? Le filtrage dans Cool edit a été fait en utilisant les mêmes paramètres que dans scipy.signal (hanning window, window width 512). Ou est-ce que je me suis complètement trompé ?

Je vous prie d'agréer, Madame, Monsieur, l'expression de mes salutations distinguées, Anders

Code ci-dessus :

enter image description here

Par rapport à Cool Edit :

enter image description here

enter image description here

0voto

Anthony Blake Points 3424

Les petites différences peuvent s'expliquer par le fait que les bibliothèques utilisent des algorithmes différents qui accumulent les erreurs de manière légèrement différente.

Par exemple, si vous calculez la TFD à l'aide d'une FFT radix-2, d'une FFT split-radix et d'une TFD ordinaire, les résultats seront tous légèrement différents. En fait, la TFD ordinaire a une moins bonne précision que toutes les implémentations décentes d'une FFT car elle utilise beaucoup plus d'opérations en virgule flottante et accumule donc plus d'erreurs.

Cela pourrait-il expliquer les résultats proches (mais pas identiques) que vous obtenez ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X