Filter 如何在C语言中实现FIR滤波器以一次处理一个样本
以下代码是一个实时FIR滤波器的实现代码,取自DSP教科书。但是,我希望一次处理一个样本,生成相应的输出,然后实时处理下一个样本。我应该将每个新样本附加到输入数组中,还是有其他方法Filter 如何在C语言中实现FIR滤波器以一次处理一个样本,filter,signal-processing,avr,Filter,Signal Processing,Avr,以下代码是一个实时FIR滤波器的实现代码,取自DSP教科书。但是,我希望一次处理一个样本,生成相应的输出,然后实时处理下一个样本。我应该将每个新样本附加到输入数组中,还是有其他方法 /*==================================================== Dig_FIR_Filt_RT() - filters input array using FIR coefs (uses real-time code)
/*====================================================
Dig_FIR_Filt_RT() - filters input array using FIR
coefs (uses real-time code)
Prototype: void Dig_FIR_Filt_RT(int *X,int *Y,
double *M,double *C,int numb_coefs,int N);
Return: error value.
Arguments: X - ptr to input array
Y - ptr to output array
M - ptr to memory array
C - ptr to coefs array
numb_coefs - number of coefficients
N - number of values in array
====================================================*/
void Dig_FIR_Filt_RT(int *X,int *Y,double *M,double *C
,int numb_coefs,int N)
{ int *x,*y, /* ptrs to in/out arrays */
i,j; /* loop counters */
double *c,*m1,*m2, /* ptrs to coef/memory array */
o; /* output value */
/* Make copies of input and output pointers */
x = X;
y = Y;
/* Start loop for number of data values */
for(i = 0; i < N ;i++)
{ /* Make copy of pointers and start loop */
M[numb_coefs-1] = *x++;
c = C;
m1 = m2 = M;
o = *m1++ * *c++;
/* Use convolution method for computation */
for(j = 1; j < numb_coefs ;j++)
{ *m2++ = *m1;
o += *m1++ * *c++;
}
/* Multiply by gain, convert to int and store */
o *= *c;
*y++ = (int)ceil(o-0.5);
}
}
/*====================================================
Dig_FIR_Filt_RT()-使用FIR对输入阵列进行滤波
coefs(使用实时代码)
原型:void Dig_FIR_Filt_RT(int*X,int*Y,
双*M,双*C,int numb_coefs,int N);
返回:错误值。
参数:X-ptr到输入数组
Y-ptr到输出阵列
M-ptr到内存阵列
C-ptr到coefs阵列
numb_coefs-系数的数量
N-数组中的值数
====================================================*/
无效数字滤波(int*X,int*Y,double*M,double*C
,int numb_coefs,int N)
{int*x,*y,/*ptr到输入/输出阵列*/
i、 j;/*循环计数器*/
双*c、*m1、*m2、/*PTR到coef/内存阵列*/
o、 /*产值*/
/*复制输入和输出指针*/
x=x;
y=y;
/*数据值数量的开始循环*/
对于(i=0;i
通常,让算法独立于缓冲区大小(=每次读取的新样本数)是一种很好的做法。您的算法应该注意保留它可能需要的过去的样本,并且能够处理任意数量的输入样本。在FIR滤波器的情况下,这意味着对于顺序为N
的滤波器,必须先累积N
样本,然后才能输出第一个滤波样本。如果您在编写过滤器时考虑到了这一点,那么您可以使用单个输入样本或大小为1的缓冲区调用它。在伪代码中:
m
新样本last new sample
以指向筛选的最新样本如果您知道一次只需要一个样本,可以使缓冲区循环。这不仅易于实现,而且比使用每个新样本上移缓冲区更有效。感谢Itamar的回复。我在高层次上也这么认为,但技术实现是有问题的。我卷积每个样本并返回结果,以便通过pwm输出,但结果只是噪声。@MalcolmMcLean我应该如何修改代码以实现这一点?在输出中产生噪声可能有很多原因。您需要调试代码和硬件(输入、微控制器、输出)。理想情况下,为输入提供已知信号(零、直流、正弦波等),并在PWM之前记录输出,确保其有意义。使用示波器查看输出电压。这是一个起点。如果您提供更多关于您尝试过的内容和失败的内容的信息/代码,将更容易帮助您。正如我在对我的答案的评论中所写,噪音可能是许多事情的结果。但首先,使用
k
作为索引,而不初始化它。这是您需要修复的第一个bug。除了,请参阅我的其他评论。我今天将尝试此操作。如果之前的方法@ItamarKatz不成功,您能看看更新的代码吗?