将滤波实现为乘法或卷积在数值上更稳定吗?


12

我正在编写一个程序,以使用五阶Butterworth滤波器离线过滤20,000个采样信号。我可以访问FFT实现。似乎有两种选择可以实现过滤:

  • 在时域中将信号与脉冲响应进行卷积,或者
  • 在频域中将信号与脉冲响应相乘,然后对结果进行逆变换

这些方法在理论FT情况下将是相同的。但是,我认为使用DFT在现实生活中做这件事是不同的。其中一种方法在数值上更稳定吗?还有其他应注意的问题吗?计算数量并不重要。


对于大多数信号长度,FFT方法将更快地进行计算。时域卷积只有较短的长度才更快。
endlith 2011年

Answers:


5

使用卷积,您不会遇到任何稳定性问题,因为没有递归过滤,因此您不会累积任何错误。换句话说,系统全为零,没有极点。我曾经听说过,但未经我自己证实,基于FFT的卷积比时域卷积具有更低的误差,仅因为它具有O(n log n)个算术运算而不是O(n ^ 2)。

据我所知,通常,巴特沃思过滤器被实现为递归(IIR)过滤器,因此这是一个不同的主题。IIR滤波器具有极点和零点,因此实际上可能存在稳定性问题。同样,对于IIR滤波器,不是基于FFT的方法,但是从好的方面来说,IIR滤波器的阶数往往很低。

至于IIR滤波器的稳定性问题,它们往往在高阶时会出现问题-我将抛出一个数字,说大约是6阶正推动它。取而代之的是,它们通常被实现为级联双二阶(二阶滤波器部分)。对于您的5阶滤波器,将其写为z域传递函数(它将是5阶有理函数),然后将其分解为5个极点和5个零点。收集复共轭,您将拥有两个二阶和一个一阶滤波器。通常,随着磁极接近单位圆,稳定性问题趋于加剧。

IIR滤波器中也可能存在噪声和极限周期的问题,因此存在具有不同数值属性的不同滤波器拓扑(即直接形式I,直接形式II),但我不会考虑这一点-只需使用double-精度,几乎可以肯定是足够了。


这仅适用于FIR滤波器是什么意思?我以为无论如何都必须对IIR滤波器进行采样。通常会在时域中实现IIR滤波器来避免这种情况吗?
安德烈亚斯(Andreas)

1
据我所知,IIR滤波器始终在时域中实现。IIR滤波器(例如,这里是二阶滤波器或“二阶”)由诸如的差分方程定义y(n) = b0 * x(n) + b1 * x(n-1) + b2 * x(n-2) - a1 * y(n-1) - a2 * y(n-2)。请注意,这是先前输入样本(x值)和先前输出样本(y值)的组合。FIR滤波器仅取决于过去的输入,因此可以接受高效的频域实现。IIR滤波器不是,但是无论如何还是非常有效的,因为IIR滤波器往往要低很多。
schnarf 2011年

1
IIR滤波器趋向于低阶的原因是,与FIR滤波器相比,极点(先前输出样本的反馈)使滤波器变得陡峭,系数很小。当我说低得多时,典型的IIR滤波器可能是二阶的(5个系数),而用于同一任务的典型FIR滤波器可能具有数千个系数。
schnarf 2011年

4

在几乎所有情况下,您的最佳选择既不是卷积也不是FFT,而只是直接应用IIR滤波器(例如使用sosfilt()函数)。就CPU和内存消耗而言,这将大大提高效率。

是否产生数值差异取决于特定的滤波器。如果极点非常非常靠近单位圆,则可能会出现一些差异。即使有一些技巧也可以提供帮助。请勿使用传递函数表示形式和filter(),而应将极点和零与sosfilt()一起使用。这是区别的一个例子。

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()在44.1kHz处约15Hz的截止频率时变坏。对于sosfilt(),截止频率可以远低于1/100 Hz @ 44.1kHz,没有任何问题。

如果您遇到稳定性问题,FFT也无济于事。由于您的滤波器是IIR滤波器,因此脉冲响应是无限的,因此必须先将其截断。在这些非常低的频率下,脉冲响应变得很长,以至于FFT也变得不切实际。

例如,如果您想要在44.1 kHz处的1/100 Hz截止频率,并且想要100 dB的脉冲响应中的动态范围,则大约需要2500万个采样!在44.1 kHz的频率下将近10分钟,比原始信号长很多倍


这并不能真正回答有关数值问题的问题,但我不知道存在的问题filter-谢谢!我的高通截止频率为0.5 Hz @ 250 Hz。出现问题的原因是什么filter?我自己编写实现。
安德里亚斯(Andreas)

2

您为什么认为情况会有所不同?理论概念应转化为实际应用,唯一的区别是浮点问题,这是我们无法避免的。您可以使用MATLAB中的一个简单示例轻松进行验证:

x=randn(5,1);
y=randn(5,1);
X=fft(x,length(x)+length(y)-1);
Y=fft(y,length(x)+length(y)-1);

z1=conv(x,y);z2=ifft(X.*Y);
z1-z2

ans =

   1.0e-15 *

   -0.4441
   -0.6661
         0
   -0.2220
    0.8882
   -0.2220
         0
   -0.4441
    0.8882

如您所见,误差大约是机器精度的。应该没有任何理由不使用FFT方法。正如Endolith所提到的,使用FFT方法进行滤波/卷积/互相关等操作更为普遍,除了非常小的样本(如本例中所示)外,它的速度要快得多。并不是说时域处理永远不会完成……它全都归结为应用程序,需求和约束。


1
我认为最初的问题是钻探基于FFT的滤波固有的浮点问题,而不是在时域直接实现滤波器。例如,如果滤波器的确很长,或者FFT的实现不正确,那么这可能是定点信号处理的真正问题。对于双精度浮点数中长度为5的序列,您绝对不会看到任何影响。
杰森·R

@JasonR如果在上面的示例中将序列的长度扩展为1e6,则错误仍然具有机器精度。您提到的错误主要是由于不良的滤波器设计或不良的FFT实施造成的。如果这些都很好,我不明白为什么时域的卷积应该给出与频域不同的答案。
Lorem Ipsum

1
它不应根据您在哪个域中进行计算而给出不同的答案。我的唯一要点是两种方法之间的实际数学运算差异很大,因此,取决于您可用的每种实现,您有可能可以看到明显的差异。对于双精度,假设您具有良好的实现,除非在极端情况下,否则我不会期望有任何区别。
杰森·R
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.