DSP - IIR滤波器的群延迟

时间:2013-12-15 18:49:52

标签: filter signal-processing

我需要编写一个程序来过滤0.8-3 Hz的信号。即使我有一个工作的FIR滤波器,这个需要太长时间,我决定改用IIR滤波器。我在Matlab中使用fdatool设计了一个,我有NUM和DEN。时间的改善会非常好(FIR是125个水龙头,这个顺序是12个)。 下一步是转到C实现,我找到了这个不错的网站http://iowahills.com/Example%20Code/IIRNthOrderImplementation.txt

问题是在他们的代码中有一个我不理解的参数,那就是NumSigPts。

void RunIIRPoly( double *Signal, double *FilteredSignal, int NumSigPts)
{
 int j, k, N;
 double y, Reg[100];

 for(j=0; j<100; j++)Reg[j] = 0.0; // Init the delay registers.

 for(j=0; j<NumSigPts; j++)
 {
  // Shift the delay register values.
  for(k=N; k>0; k--)Reg[k] = Reg[k-1];

  // The denominator
  Reg[0] = Signal[j];
  for(k=1; k<=N; k++)Reg[0] -= DenomCoeff[k] * Reg[k];

  // The numerator
  y = 0;
  for(k=0; k<=N; k++)y += NumCoeff[k] * Reg[k];
  FilteredSignal[j] = y;
 }

}

在说明中他们说

  

此特定滤波器的标称群延迟为4,因此我们设置   NumSigPts至少1000 + 2 * 4

如何找到过滤器的群组延迟。它与过滤器的订单有什么关系吗? 连续提供信号I滤波器,所以我的确切问题是信号的最小尺寸是什么才能开始滤波?

稍后编辑:

所以今天我对这款IIR滤镜进行了一些尝试,但仍未取得一些好成绩。 我接受了Nate的建议并尝试了Matlab的grpdelay函数。问题是我不太清楚如何解释输出。 grpdelay

我要做的是逐个像素地过滤一些图像,帧。我这样做的方法是将图像存储在all_frames的图像数组中。为了访问每个像素,我调用all_frames [frame_number] [pixel_number]。

我在上面提到的网站后提出的代码是:

void ApplyIIR ( float **all_frames, float *num, float *den, int frame_number,  float *filter_Xs, int w, int h)
{   
        float Reg[FILTER_ORDER];

    for (int i=0; i< (width*height) ; i++) {  //go pixel by pixel

        for(int j=0; j<FILTER_ORDER; j++) //init regs
                Reg[j] = 0.0;
        float final_X=0;

            for(int l=0; l< FILTER_ORDER+ DELAY ; l++) {  // not sure how to set DELAY

                    for(int k=FILTER_ORDER-1; k>0;k--)
                        Reg[k] = Reg[k-1];

                    Reg[0] = all_frames[frame_number][i]; //get pixels one by one
                    for(int k=1; k<FILTER_ORDER;k++)
                        Reg[0] -= den[k]* Reg[k];


                    for(int k=0;k<FILTER_ORDER;k++)
                        final_X += num[k] * Reg[k];

                    if(frame_number == 0)             //go through all the frames
                        frame_number = FILTER_ORDER - 1;
                    else
                        frame_number--;

                }
                    filter_Xs[i] = final_X;         
    }

}

FILTER_ORDER设置为13,因为num和den的值为0-12。

我走错了路吗?

1 个答案:

答案 0 :(得分:2)

关键是这个评论:

  

请记住,这些过滤器有延迟,因此您需要运行代码   对于M点,要比要过滤的数据点的数量长   为了通过滤波器获得整个信号。合理的   M的值是群延迟值的两倍。

如示例代码所示,任何IIR滤波器都会有延迟。发生这种情况是因为过滤器在信号通过后继续响应。这意味着您的循环需要Length of Signal + Length of M才能完全处理信号。 NumSigPoints是此值,基本上告诉过滤器要处理多长时间。

认为它们的名义群延迟是指滤波器的最大群延迟值。群延迟基本上是通过滤波器的频率将被延迟多少,并且它是频率的函数(IIR滤波器具有非线性群延迟)。您可以计算滤波器的最大群延迟,或者您可以只观察它以便处理整个信号。如果您有Matlab,请尝试使用grpdelay功能。

如果这是一个连续的过程,您将需要在信号进入时以块的形式进行过滤。信号的最小尺寸将取决于窗口的大小(块大小),您可以选择你自己。您可能希望寻找实时过滤的实现,因为窗口本身(窗口类型,重叠等)至少是本科DSP类的几个讲座的主题。

相关问题