我需要编写一个程序来过滤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函数。问题是我不太清楚如何解释输出。
我要做的是逐个像素地过滤一些图像,帧。我这样做的方法是将图像存储在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。
我走错了路吗?
答案 0 :(得分:2)
关键是这个评论:
请记住,这些过滤器有延迟,因此您需要运行代码 对于M点,要比要过滤的数据点的数量长 为了通过滤波器获得整个信号。合理的 M的值是群延迟值的两倍。
如示例代码所示,任何IIR滤波器都会有延迟。发生这种情况是因为过滤器在信号通过后继续响应。这意味着您的循环需要Length of Signal
+ Length of M
才能完全处理信号。 NumSigPoints
是此值,基本上告诉过滤器要处理多长时间。
我认为它们的名义群延迟是指滤波器的最大群延迟值。群延迟基本上是通过滤波器的频率将被延迟多少,并且它是频率的函数(IIR滤波器具有非线性群延迟)。您可以计算滤波器的最大群延迟,或者您可以只观察它以便处理整个信号。如果您有Matlab,请尝试使用grpdelay功能。
如果这是一个连续的过程,您将需要在信号进入时以块的形式进行过滤。信号的最小尺寸将取决于窗口的大小(块大小),您可以选择你自己。您可能希望寻找实时过滤的实现,因为窗口本身(窗口类型,重叠等)至少是本科DSP类的几个讲座的主题。