c语言写的fir低通滤波器

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.

相关文档
最新文档