c语言写的fir低通滤波器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
根据fir滤波器的公式y(n)=∑h(m)x(n-m);(m: 0~(N-1)).利用MATLAB产生滤波器系数(h(n))并归一化,下面为一个LP滤波算法
void filter(void)
{
uint16 i,j;
fp32 sum;
int16 x1[2030];
fp32 h[19]={ -0.0027, -0.0025, 0.0050, 0.0157, -0.0000, -0.0471, -0.0482, 0.0838, 0.2953, 0.4013,
0.2953, 0.0838, -0.0482, -0.0471, -0.0000,0.0157, 0.0050, -0.0025, -0.0027};
for(i=0;i<2020;i++)
x1[i] = data0[i];
for(i=0;i<2020;i++)
{
sum=0.0;
for(j=0;j<19;j++)
{
if(i >= j)
sum+=h[j]*x1[i-j];
else
;
}
data0[i]=(int16)sum;
}
for(i=0;i<2000;i++)
{
data0[i] = data0[i+20];
}
}
考虑到前19个点为不完全累加和,故抛去前19个点。(应该是前后各18个点都是不完全累加和,都应该去掉,对于数据分段进入滤波器的情况,应该把前一段的后面数据放到下一段的前面,这段时间我在解调FSK时遇到了这个问题,通过滤波器的数据的分段处理。)
设输入数据x[N],输出数据y[N],滤波器系数h[n]
1.直接法(由y(m)=h(0)*x(m)+h(1)*x(m-1)+...+h(N-1)*x(m-n-1));
void fir(short x[], short h[], short y[])
{
int i,j;
long long sum;
for (j = 0; j < N; j++)
{
sum = 0;
for (i = 0; i < n; i++)
sum += x[j-i] * h[i];
y[j] = sum >> 15;
}
}
乘法器使用次数:N*n
2.逆推法:
void fir(short x[], short h[], short y[])
{
int i,j;
long sum;
for (j = 0; j < n; j++)
{
for (i = 0; i < N; i++)
{
sum = 0;
sum = h[j] * x[i]
y[i] += sum >> 15;
}
}
}
乘法器使用次数:N*n
3.倒序法:(输入输出可以是同一量)
void fir(short x[], short h[], short y[]) {
int i,j;
long long sum;
for (j = N; j > 0; j--)
{
sum = 0;
for (i = n; i > 0; i--)
sum += x[j-i] * h[i];
y[j] = sum >> 15;
}
}
#include
#include
#define true 1
#define false 0
#define n 8
#define bufsize 100 /* the buffer size is 100 */
/* global declarations */
int in_buffer[bufsize]; /* processing data buffers */
int out_buffer[bufsize];
/* functions */
static int processing(int *input, int *output);
static void dataio(void);
static long round(long a);
void main()
{
int *input = &in_buffer[0];
int *output = &out_buffer[0];
puts("the 1st experiment started\n");
/* loop forever */
while(true)
{
/*
* read input data using a probe-point connected to a host file.
* write output data to a graph connected through a probe-point.
*/
// read the input signal.
// if the input file is sine1.dat, the signal contains 300hz,400hz and 500hz.
// if the input file is sine2.dat, the signal contains 100hz,400hz and 500hz.
// the sampling frequency is 1200hz.
dataio();
/* remove the frequency compoment of 400hz and 500hz*/
processing(input, output);
// write the output signal.
// the output file is result.dat.
dataio();
}
}
/*
* ======== processing ========
*
* function: apply a low-pass fir filter to input signal and remove the frequency higher than 350hz.
*
* parameters: address of input and output buffers.
*
* return value: true.