Dans presque tous les cas, votre meilleur choix n'est ni la convolution ni la FFT mais l'application directe du filtre IIR (en utilisant par exemple la fonction sosfilt ()). Ce sera beaucoup plus efficace en termes de consommation de CPU et de mémoire.
La différence numérique dépend du filtre spécifique. Le seul cas où une différence peut s'introduire est si les pôles sont très, très proches du cercle unitaire. Même là, quelques astuces peuvent vous aider. N'UTILISEZ PAS la représentation de la fonction de transfert et le filtre () mais utilisez des pôles et des zéros avec sosfilt (). Voici un exemple de différence.
n = 2^16; % filter length
fs = 44100; % sample rate
x = zeros(n,1); x(1) = 1;
f0 = 15; % cutoff frequency in Hz
% design with poles and zeroes
[z,p,k] = butter(5,f0*2/fs);
clf
plot(sosfilt(zp2sos(z,p,k),x));
% design with transfer function
[b,a] = butter(5,f0*2/fs);
hold on
plot(filter(b,a,x),'k');
Le filtre () se détériore à une coupure d'environ 15 Hz à 44,1 kHz. Pour sosfilt (), la coupure peut être bien inférieure à 1/100 Hz à 44,1 kHz sans aucun problème.
SI vous avez des problèmes de stabilité, la FFT n'aide pas non plus. Puisque votre filtre est un filtre IIR, la réponse impulsionnelle est infinie et devrait être tronquée en premier. À ces fréquences très basses, la réponse impulsionnelle devient si longue que la FFT devient également impraticable.
Par exemple, si vous voulez une coupure de 1/100 Hz @ 44,1 kHz et que vous voulez une plage dynamique dans la réponse impulsionnelle de 100 dB, vous avez besoin d'environ 25 millions d'échantillons !!! C'est presque 10 minutes à 44,1 kHz et beaucoup, beaucoup plus longtemps que votre signal d'origine