En casi todos los casos, su mejor opción no es convolución ni FFT, sino simplemente aplicar el filtro IIR directamente (usando, por ejemplo, la función sosfilt ()). Esto será mucho más eficiente en términos de consumo de CPU y memoria.
Si hace una diferencia numérica depende del filtro específico. El único caso en el que puede surgir alguna diferencia es si los polos están muy, muy cerca del círculo unitario. Incluso hay algunos trucos que pueden ayudar. NO USE la representación de la función de transferencia y filter (), pero use polos y ceros con sosfilt (). Aquí hay un ejemplo de la diferencia.
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');
filter () falla en un corte de aproximadamente 15Hz a 44.1kHz. Para sosfilt (), el límite puede estar muy por debajo de 1/100 de Hz a 44,1 kHz sin ningún problema.
SI tiene problemas de estabilidad, la FFT tampoco ayuda mucho. Como su filtro es un filtro IIR, la respuesta al impulso es infinita y primero debería truncarse. A estas frecuencias muy bajas, la respuesta al impulso se prolonga tanto que la FFT tampoco resulta práctica.
Por ejemplo, si desea un límite de 1/100 Hz a 44,1 kHz y desea un rango dinámico en la respuesta al impulso de 100 dB, ¡necesita aproximadamente 25 millones de muestras! Eso es casi 10 minutos a 44.1 kHz y muchas, muchas veces más que su señal original