我正在设计一套FIR滤波器,以实现一个低通滤波器。我也在尝试减少通过滤波器的信号延迟,因此我想知道我可以使用的最小抽头数是多少。频率和更好的阻带抑制等。但是,我感兴趣的是更基本的-如果我想实现一个截止频率为$ \ frac {f_s} {100} $的低通滤波器,那说明我需要至少要抽头100次才能衰减低频信号?还是我可以少动一下水龙头,如果可以的话,理论上有一些下限吗?

#1 楼

引用贝兰格经典的信号数字处理技术-理论和实践,重点不是您的截止频率所在,而是您需要多少衰减,想要保留多少信号波纹才能容忍,最重要的是,缩小从通带到阻带的过渡范围(过渡宽度)。

我假设您需要一个线性相位滤波器(尽管您指定了最小延迟,但一般来说,除非您完全了解所要解决的问题,否则我认为最小相位滤波器并不是一个好主意然后再处理您的信号)。在这种情况下,筛选顺序(抽头数)为

$$ N \ approx \ frac 23 \ log_ {10} \ left [\ frac1 {10 \ delta_1 \ delta_2} \ right] \,\ frac {f_s} {\ Delta f} $$



$$ \ begin {align}
f_s&\ text {采样率} \\
\ Delta f&\ text {过渡宽度,} \\
&\ text {即通带结束和阻带开始之间的差异} \\
\ delta_1&\ text {通带中的波纹,} \\
&\ text {即“您可以承受多少原始振幅变化”} \\
\ delta_2&\ text {阻带中的上限}。
\ end {align} $$

让我们插入一些数字!您指定的截止频率为$ \ frac {f_s} {100} $,所以我继续说您的过渡宽度将不超过其一半,因此$ \ Delta f = \ frac {f_s } {200} $。

来自SDR / RF技术的60 dB抑制通常就足够了–硬件,没有疯狂的成本,在阻止不必要的信号进入您的输入方面将更好,所以,让我们不要浪费CPU具有出色的过滤器,比您的硬件可以做的更好。因此,$ \ delta_2 = -60 \ text {dB} = 10 ^ {-3} $。

假设您可以使通带的幅度变化为0.1%(如果可以的话)如果数量更多,还可以考虑降低抑制要求的严格程度)。那就是$ \ delta_1 = 10 ^ {-4} $。

因此,将其插入:

$$ \ begin {align}
N_ \ text {Tommy's filter}&\ approx \ frac 23 \ log_ {10} \ left [\ frac1 {10 \ delta_1 \ delta_2} \ right] \,\ frac {f_s} {\ Delta f} \\
&= \ frac 23 \ log_ {10} \ left [\ frac1 {10 \ cdot 10 ^ {-4 } \ cdot10 ^ {-3}} \ right] \,\ frac {f_s} {\ frac {f_s} {200}} \\
&= \ frac 23 \ log_ {10} \ left [\ frac1 {10 \ cdot 10 ^ {-7}} \ right] \,200 \\
&= \ frac 23 \ log_ {10} \ left [\ frac1 {10 ^ {-6}} \ right] \ ,200 \\
&= \ frac 23 \ left(\ log_ {10} 10 ^ 6 \ right)\,200 \\
&= \ frac 23 \ cdot 6 \ cdot 200 \\
&= 800 \ text {。}
\ end {align} $$

因此,只要使用200个抽头,通频带就非常窄

请注意,这不一定是问题-首先,一个800抽头的过滤器很可怕,但坦率地说,只有乍一看:正如我在StackOverflow上的此答案中所测试的那样:如果您使用某人针对CPU优化的FIR实现,那么CPU的速度很快。例如,我将GNU Radio的FFT-FIR实现与上面的滤波器规范一起使用。我每秒获得1.41亿个样本的性能-可能对您来说可能不够。因此,这是我们针对问题的测试用例(花了我几秒钟的时间):

抽取:如果仅保留输入带宽的一小部分,则滤波器的输出将大大过采样。引入$ M $的抽取意味着您的滤波器不会给您所有输出样本,而是给每个$ M $个采样–通常会导致很多混叠,但是由于您要消除所有可能的混叠信号别名,您可以轻松地这样做。聪明的滤波器实现(多相抽取器)可以通过这种方式将计算量减少M。在您的情况下,您可以轻松地将$ M = 50 $进行抽取,然后,您的计算机将只需要为每个输入样本计算$ \ frac {1200} {50} = 24 $乘法/累加-容易得多。 GNU Radio中的过滤器通常确实具有该功能。这样一来,即使在FFT FIR中(这对多相抽取器的实现也不太好),我也可以将性能提高2倍。不能做更多的事情。根据我的经验,这与系统上的RAM带宽非常接近。对于
延迟:不要在意。确实如此,除非您需要。您是用典型的音频采样率执行此操作的吗?请记住,$ 96 \,\ frac {\ text {kS}} {\ text {s}} \ overset {\ text {ridiculously}} {\ ll} 141 \,\ frac {\ text {MS}} {\ text { s}} $上面提到的。因此,计算滤波器输出所花费的时间仅与MS / s实时信号流有关。对于具有离线数据的DSP:好吧,为与滤波器并行补偿的任何信号增加延迟。 (如果您的滤波器是线性相位,则其延迟将是滤波器长度的一半。)这可能与FIR滤波器的硬件实现有关。
硬件实现:因此,也许您的PC或嵌入式设备的CPU和OS确实不允许您满足延迟限制,因此您正在研究FPGA实现的FIR。您会注意到的第一件事是,对于硬件,存在不同的设计范式–“我抑制了所有东西,但输入速率的$ \ frac1 {100} $除外”过滤器需要较大的位宽来处理要处理的定点数在硬件中(与CPU上的浮点数相对)。因此,这就是为什么通常将那个滤波器分成多个,级联的,较小的抽取FIR滤波器的第一个原因。另一个原因是,您可以在每个级联“步骤”中以较低的速率运行乘法器(通常是“ DSP Slice”),因此可以使用一个乘法器对它们进行复用(DSP Slice的数量通常非常有限)多次点击。另一个原因是,特别是半带滤波器,即抑制一半输入频带并提供一半输入速率的低通滤波器,可以非常有效地在硬件中实现(因为它们的抽头一半为零,这在硬件中很难利用) CPU / SIMD实现)。


评论


$ \ begingroup $
1990年代中期至初,Lake DSP实时制作了256,000个抽头FIR滤波器。 1200个水龙头? ff! ;-)
$ \ endgroup $
– Peter K.♦
16年5月28日下午4:55

$ \ begingroup $
@PeterK。就是那种精神!对256kT FIR的深切敬意–他们所建立的数值精度必须与设计的绝对规模一样惊人。 90年代初期太年轻,无法自己享受技术乐趣,这一定是一个有趣的时期。曾与一位工程师进行过交谈,当时他们曾经使用过DFT IC。由于人们意识到计算平台实际上可以处理最终的数据流,但对于DSP ASIC的需求似乎很高,但是周围没有“多功能”加速器(不同于今天)。
$ \ endgroup $
– MarcusMüller
16年5月28日在7:19

$ \ begingroup $
@PeterK。,是的,但是他们的澳洲进口总是拉我们的腿。
$ \ endgroup $
–罗伯特·布里斯托-约翰逊
16年1月1日在4:03

$ \ begingroup $
@ robertbristow-johnson oy matey,这是什么内幕玩笑:D?
$ \ endgroup $
– MarcusMüller
16年1月1日在10:35

$ \ begingroup $
@MarcusMüller,尽管那时的ASIC似乎比现在有所增加(我认为这是因为当时所有从事ASIC规范/设计的人现在都使用FPGA),但还是有“多功能” DSP早在90年代初期。 LakeDSP东西被制成6 DSP56001。
$ \ endgroup $
–罗伯特·布里斯托-约翰逊
16年6月1日在17:27

#2 楼

为了快速而实际地进行估算,我喜欢弗雷德·哈里斯(Fred Harris)的经验法则:

$$ N_ {taps} = \ frac {Atten} {22 * B_T} $$

其中:

Atten是所需的dB衰减,

$ B_T $是归一化的过渡带$ B_T = \ frac {F_ {stop}-F_ {pass}} {F_s} $,

$ F_ {stop} $和$ F_ {pass} $是阻带和通带频率,单位为Hz和

$ F_s $是以Hz为单位的采样频率。

这与通带纹波为0.1 dB的线性相位滤波器的结果非常接近。我经常使用此经验法则来初步了解所需的抽头数量,然后在滤波器设计过程中通过迭代进行修改。

还应注意:此经验法则可深入了解真正驱动抽头数量的因素:阻带衰减和过渡带的陡度(以及通带波纹,但通常至少)对于我不得不为无线通信应用设计的滤波器,衰减要求将主要取决于纹波。因此,您在确定Fs / 100截止时的问题就缺少了需要多快的时间才能过渡到阻带。

示例:60 dB衰减,$ F_s $ = 100KHz,$ F_ {pass} $ = 1KHz,$ F_ {stop} $ = 3KHz

$ N_ {taps} = \ frac {60} {22 * 2/100} = 137 $抽头(四舍五入)

使用这些数字还可以证明通过抽取方法在减少处理量方面的重要性。 >

#3 楼

除了接受的答案,还有一些其他参考。我不会写可能涉及的公式。这些公式主要产生经验法则或近似值。您可以在实际设计中随意修改这些数字。欧元。 Conf。电路理论设计,M。Bellanger。这是很难获得的,但是是可行的。有趣的是,它还指定了公式来评估每个系数的位数,在有限算术实现中应考虑这些公式。法语中一个更易于访问的版本是:1982年,《综合评价》。

在有限脉冲响应滤波器设计中收集了其他公式,《数字信号处理手册》,1993年,T。Samamaki。

最近,您可以阅读有关最佳FIR数字滤波器的最小滤波器长度的准确估算,2000年,K。Ichige等人。
使用l0范数优化的具有最小过滤器阶数的过滤器,2014年提出了一种设计,其中阶数逐渐减小。

#4 楼

我认为确实没有确定的最低分接头数。通过凸优化生成FIR滤波器是很常见的,例如
$$
\ text {minimize} \ \ text {max} \ left(\ left | H(\ omega)\ right | \ right )\ text {适用于所有}} omega \ text {在禁带中}}左| H(\ omega)\右| \ leq \ delta \ text {对于所有}} \ omega \ text {在通带中}进行优化,因为异频采样行为可能会导致不良影响。配合的良好程度当然取决于抽头的数量。我猜您可以说,最小抽头是问题变得不可行时。因此,一种解决方案是解决可行性问题。