您的当前位置:首页c语言写的fir低通滤波器

c语言写的fir低通滤波器

2024-04-30 来源:乌哈旅游


创作编号:GB8878185555334563BT9125XW 创作者: 凤呜大王*

根据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; } }

创作编号:GB8878185555334563BT9125XW 创作者: 凤呜大王*

#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.

创作编号:GB8878185555334563BT9125XW 创作者: 凤呜大王*

*

* return value: true. */

static int processing(int *input, int *output) {

int i,size = bufsize; short xx0,x,y;

// short z[n]={0,0,0,0,0,0,0,0,0}; short z[n]={0,0,0,0,0,0,0,0};

//short w[2*n+1]={22,356,155,990,466,220,777,216,777,26,466,9,155,0,22}; //short w[2*n+1]={6,457,56,1024,224,418,523,382,784,99,784,43,523}; // short

w[2*n+1]={330*2,3299*2,1982*2,6867*2,4955*2,1594*2,6607*2,1065*2,4955*2,109*2,1982*2,17*2,330*2};

//short w[2*n+1]={661,6598,3964,13733,9910,3187,13214,2131,9910,217,3964,34,661}; // short

w[2*n+1]={58,5628,526,8192,2105,5883,4913,3829,7369,1543,7369,504,4913,102,2105,14,526,1,58}; //short

w[2*n+1]={28,4432,280,8192,1259,4883,3356,3975,5873,1509,7048,644,5873,142,3356,30,1259,3,280,0,28};

// short w[2*n+1]={26,651,182,1024,545,421,909,247,909,51,545,11,182,1,26}; //short

w[2*n+1]={831,20846,5815,32768,17445,13486,29075,7888,29075,1647,17445,349,5815,21,831};

//short

w[2*n+1]={208,5211,1454,8192,4361,3371,7269,1972,7269,412,4361,87,1454,5,208}; short

w[2*n+1]={101,4356,810,8192,2835,3403,5670,2517,7088,605,5670,193,2835,21,810}; // short

w[2*n+1]={101,4356,810,8192,2835,3403,5670,2517,7088,605,5670,193,2835,21,810,2,101}; // short

w[2*n+1]={50,3814,454,8192,1815,3504,4235*,3084,6353,831,6353,349,4235,50,1815,8,454,0,50};

long y0,z0;//22222222222222 while(size--){ xx0=*input++; x=xx0*6;

z0=(long)x<<15; y0=0;

for(i=0;iz0-=(long)w[2*i+1]*(long)z[i];

y0+=(long)w[2*i+2]*(long)z[i]; }

y0+=(long)w[0]*(z0>>15); y0=round(y0); for(i=n-1;i>0;i--) z[i]=z[i-1]; z0=round(z0);

z[0]=(short)(z0>>15);

y=(short)(y0>>15); *output++ =y; }

/* additional processing load */ return(true); } /*

* ======== dataio ======== *

* function: read input signal and write processed output signal. *

* parameters: none. *

* return value: none. */

static void dataio() {

/* do data i/o */ return; }

static long round(long a) {

long x3;

x3=a&(0xffff0000); return x3; }

创作编号:GB8878185555334563BT9125XW 创作者: 凤呜大王*

因篇幅问题不能全部显示,请点此查看更多更全内容