FIR滤波器设计C语言程序
FIR滤波器设计C语言程序
FIR滤波器设计C语言程序FIR滤波器设计C语言程序1. 引言2. FIR滤波器原理FIR滤波器的输入输出关系可以表示为以下方程:y[n] = h[0]x[n] + h[1]x[n-1] + + h[M]x[n-M]其中,y[n]为输出信号,x[n]为输入信号,h为FIR滤波器的系数向量,M为滤波器的阶数。
3. 窗函数法设计FIR滤波器窗函数法是一种简单有效的FIR滤波器设计方法,其思想是通过加窗和傅里叶变换来确定滤波器系数。
步骤如下:1. 确定滤波器的阶数M,一般通过信号频率响应要求来确定。
2. 选择一个窗函数(如矩形窗、汉宁窗等)。
3. 根据窗函数的性质和滤波器的阶数,计算出滤波器的理想频率响应h_ideal。
4. 使用傅里叶变换将理想频率响应转换为时间域的滤波器系数h。
5. 对h进行归一化处理,得到最终的滤波器系数。
4. C语言程序实现下面给出一个简单的C语言程序,实现了FIR滤波器的设计过程。
cinclude <stdio.h>include <math.h>define N 1000 // 输入信号长度define M 50 // 滤波器阶数void fir_filter(float x, float h, float y) {int i, j;for (i = 0; i < N; i++) {y[i] = 0;for (j = 0; j < M; j++) {if (i >= j) {y[i] += h[j] x[i j];}}}}int mn() {float x[N]; // 输入信号float h[M]; // 滤波器系数float y[N]; // 输出信号int i;// 输入信号和滤波器系数for (i = 0; i < N; i++) {x[i] = sin(2 M_PI 1000 i / N) + sin(2 M_PI 2000 i / N); // 两个正弦信号叠加}for (i = 0; i < M; i++) {h[i] = 1.0 / M; // 简单的均值滤波器}// 调用FIR滤波函数fir_filter(x, h, y);// 输出滤波后的信号for (i = 0; i < N; i++) { printf(\。
DSP的FIR设计(低通滤波)C语言编写
一、设计目的低通滤波器设计。
本设计中使用的信号为信息信号: signal=sin(2*pi*sl*n*T)高频噪声1:noise1=0.7*sin(2*pi*ns1*n*T) 高频噪声2:noise2=0.4*sin(2*pi*ns2*n*T) 混合信号: x=(signal+noise1+noise2)其中sl=500Hz ,ns1=3000Hz ,ns2=8000Hz ,T=1/20000。
混合信号波形为滤波器输入信号波形,信息信号波形为输出信号波形,滤波器的效果为滤除两个高频噪声。
二、FIR 滤波器基本理论(1)FIR 滤波器的特点数字滤波器的功能,就是把输入序列通过一定的运算变换成输出序列。
它的实现方法有很多,其中比较常用到的是无限长脉冲响应滤波器 IIR 和有限长脉冲响应滤波器FIR 两种。
在计算量相等的情况下,IIR 数字滤波器比FIR 滤波器的幅频特性优越,频率选择性也好。
但是,它有着致命的缺点,其相位特性不好控制。
它的相位特性)argH( )f(ωωj e =是使频率产生严重的非线性的原因。
但是在图像处理、数据传输等波形传递系统中都越来越多的要求信道具有线性的相位特性。
在这方面 FIR 滤波器具有它独特的优点,设FIR 滤波器单位脉冲响应h(n)长度为N ,其系统函数H(z)为∑-=-=10)()(N n n z n h z HH(z)是1-z 的(N-1)次多项式,它在z 平面上有(N-1)个零点,原点z=0是(N-1)阶重极点。
因此,H(z)永远稳定,它可以在幅度特性随意设计的同时,保证精确、严格的线性相位。
(2)FIR 滤波器的基本结构数字滤波是将输入的信号序列,按规定的算法进行处理,从而得到所期望的输出序列,FIR 滤波器的差分方程为:∑-=-=1)()(N k k k n x a n y对上式进行Z 变换得到FIR 滤波器的传递函数为:()()()∑-=-==10N i kk z b z X z Y z H由上式可以看出,H(z)是1-z 的N-1次多项式,它在z 平面内有N-1个零点,同时在原点处有N-1个重极点。
c语言描述fir
FIR滤波器c语言源程序设计#include <stdio.h>#ifdef WIN32#include <conio.h>#endif#define SAMPLE double /* define the type used for data samples */void clear(int ntaps, SAMPLE z[]){int ii;for (ii = 0; ii < ntaps; ii++) {z[ii] = 0;}}SAMPLE fir_basic(SAMPLE input, int ntaps, const SAMPLE h[], SAMPLE z[]) {int ii;SAMPLE accum;/* store input at the beginning of the delay line */z[0] = input;/* calc FIR */accum = 0;for (ii = 0; ii < ntaps; ii++) {accum += h[ii] * z[ii];}/* shift delay line */for (ii = ntaps - 2; ii >= 0; ii--) {z[ii + 1] = z[ii];}return accum;}SAMPLE fir_circular(SAMPLE input, int ntaps, const SAMPLE h[], SAMPLEz[],int *p_state){int ii, state;SAMPLE accum;state = *p_state; /* copy the filter's state to a local*//* store input at the beginning of the delay line */z[state] = input;if (++state >= ntaps) { /* incr state and check for wrap */state = 0;}/* calc FIR and shift data */accum = 0;for (ii = ntaps - 1; ii >= 0; ii--) {accum += h[ii] * z[state];if (++state >= ntaps) { /* incr state and check for wrap */state = 0;}}*p_state = state; /* return new state to caller */return accum;}SAMPLE fir_shuffle(SAMPLE input, int ntaps, const SAMPLE h[], SAMPLE z[]) {int ii;SAMPLE accum;/* store input at the beginning of the delay line */z[0] = input;/* calc FIR and shift data */accum = h[ntaps - 1] * z[ntaps - 1];for (ii = ntaps - 2; ii >= 0; ii--) {accum += h[ii] * z[ii];z[ii + 1] = z[ii];}return accum;}SAMPLE fir_split(SAMPLE input, int ntaps, const SAMPLE h[], SAMPLE z[],int *p_state)int ii, end_ntaps, state = *p_state;SAMPLE accum;SAMPLE const *p_h;SAMPLE *p_z;/* setup the filter */accum = 0;p_h = h;/* calculate the end part */p_z = z + state;*p_z = input;end_ntaps = ntaps - state;for (ii = 0; ii < end_ntaps; ii++) {accum += *p_h++ * *p_z++;}/* calculate the beginning part */p_z = z;for (ii = 0; ii < state; ii++) {accum += *p_h++ * *p_z++;}/* decrement the state, wrapping if below zero */if (--state < 0) {state += ntaps;}*p_state = state; /* return new state to caller */return accum;}SAMPLE fir_double_z(SAMPLE input, int ntaps, const SAMPLE h[], SAMPLE z[],int *p_state){SAMPLE accum;int ii, state = *p_state;SAMPLE const *p_h, *p_z;/* store input at the beginning of the delay line as well as ntaps more */z[state] = z[state + ntaps] = input;/* calculate the filter */p_h = h;p_z = z + state;accum = 0;for (ii = 0; ii < ntaps; ii++) {accum += *p_h++ * *p_z++;}/* decrement state, wrapping if below zero */if (--state < 0) {state += ntaps;}*p_state = state; /* return new state to caller */return accum;}SAMPLE fir_double_h(SAMPLE input, int ntaps, const SAMPLE h[], SAMPLE z[],int *p_state){SAMPLE accum;int ii, state = *p_state;SAMPLE const *p_h, *p_z;/* store input at the beginning of the delay line */z[state] = input;/* calculate the filter */p_h = h + ntaps - state;p_z = z;accum = 0;for (ii = 0; ii < ntaps; ii++) {accum += *p_h++ * *p_z++;}/* decrement state, wrapping if below zero */if (--state < 0) {state += ntaps;}*p_state = state; /* return new state to caller */return accum;int main(void){#define NTAPS 6static const SAMPLE h[NTAPS] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; static SAMPLE h2[2 * NTAPS];static SAMPLE z[2 * NTAPS];#define IMP_SIZE (3 * NTAPS)static SAMPLE imp[IMP_SIZE];SAMPLE output;int ii, state;/* make impulse input signal */clear(IMP_SIZE, imp);imp[5] = 1.0;/* create a SAMPLEd h */for (ii = 0; ii < NTAPS; ii++) {h2[ii] = h2[ii + NTAPS] = h[ii];}/* test FIR algorithms */printf("Testing fir_basic:\n ");clear(NTAPS, z);for (ii = 0; ii < IMP_SIZE; ii++) {output = fir_basic(imp[ii], NTAPS, h, z);printf("%3.1lf ", (double) output);}printf("\n\n");printf("Testing fir_shuffle:\n ");clear(NTAPS, z);state = 0;for (ii = 0; ii < IMP_SIZE; ii++) {output = fir_shuffle(imp[ii], NTAPS, h, z);printf("%3.1lf ", (double) output);}printf("\n\n");printf("Testing fir_circular:\n ");clear(NTAPS, z);state = 0;for (ii = 0; ii < IMP_SIZE; ii++) {output = fir_circular(imp[ii], NTAPS, h, z, &state); printf("%3.1lf ", (double) output);}printf("\n\n");printf("Testing fir_split:\n ");clear(NTAPS, z);state = 0;for (ii = 0; ii < IMP_SIZE; ii++) {output = fir_split(imp[ii], NTAPS, h, z, &state);printf("%3.1lf ", (double) output);}printf("\n\n");printf("Testing fir_double_z:\n ");clear(2 * NTAPS, z);state = 0;for (ii = 0; ii < IMP_SIZE; ii++) {output = fir_double_z(imp[ii], NTAPS, h, z, &state); printf("%3.1lf ", (double) output);}printf("\n\n");printf("Testing fir_double_h:\n ");clear(NTAPS, z);state = 0;for (ii = 0; ii < IMP_SIZE; ii++) {output = fir_double_h(imp[ii], NTAPS, h2, z, &state); printf("%3.1lf ", (double) output);}#ifdef WIN32printf("\n\nHit any key to continue.");getch();#endifreturn 0;}。
c语言写的fir低通滤波器
根据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*n2.逆推法: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*n3.倒序法:(输入输出可以是同一量)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<stdio.h>#include<math.h>#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.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};// shortw[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};// shortw[2*n+1]={58,5628,526,8192,2105,5883,4913,3829,7369,1543,7369,504,4913,102,2105,14,526,1,5 8};//shortw[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};//shortw[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}; // shortw[2*n+1]={101,4356,810,8192,2835,3403,5670,2517,7088,605,5670,193,2835,21,810,2,101};// shortw[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;//22222222222222while(size--){xx0=*input++;x=xx0*6;z0=(long)x<<15;y0=0;for(i=0;i<n;i++){z0-=(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;}。
FIR C程序
int i, j;
float p;
copy current input block to work buffer
workbuf[N-1] = x[0], workbuf[N] = x[1],
关键是你要先按要求设计一个FIR滤波器,比如低通、高通、带通或者带阻,然后通带频率、阻带频率多少?通带、阻带波纹多少,可以用matlab生成,或者从网上找其他的工具也可以。
建议你看看奥本海姆的离散时间信号处理(discrete-time signal processing).
1. 确定滤波器的要求: 低通、高通、带通还是带阻等,以及具体通带、阻带频率,通带、阻带增益。
比如FIR的系数是h(0),h(1),h(2),...h(N), 对输入信号x(n)通过滤波器的输出为y(n),则
y(n) = h(0)x(n) + h(1)x(n-1) + h(2)x(n-2) +...+h(N)x(n-N),默认因果系统初始条件x(-1),x(-2),...,x(-N)为0. 就是简单的乘累加,如果FIR滤波器的长度很长,可以用FFT来进行快速运算。
k=0
定点、精度、能力消耗可能需要考虑。
#define N 10 number of FIR coefficients.
#define BLKSIZE 20 block size of samples filtered each time.
workbuf[N+1] = x[2], ..., workbuf[M-1] = x[BLKSIZE-1];
for (i=0; iBLKSIZE; i++)
{
workbuf[i+N-1] = x[i];
fir函数c语言实现
fir函数c语言实现FIR滤波器是一种广泛应用于数字信号处理领域的滤波器,它能够实现无限冲击响应(InfiniteImpulseResponse,简称FIR)滤波。
在许多实际应用中,FIR 滤波器被用来对信号进行平滑处理,去除噪声等。
下面将介绍如何使用C语言实现FIR滤波器。
一、FIR滤波器原理FIR滤波器是一种线性时不变系统,它通过一组滤波器系数将输入信号进行加权叠加,从而实现对信号的滤波处理。
FIR滤波器的输出信号与输入信号的关系可以用冲激响应表示,其冲激响应具有有限长度。
二、C语言实现FIR滤波器以下是一个简单的FIR滤波器的C语言实现,它采用递归方法实现滤波器的计算:```c#include<stdio.h>//FIR滤波器参数定义#defineFIR_LEN6//滤波器长度#defineTARGET_SNR10//目标信噪比#defineALPHA0.001//噪声系数//FIR滤波器系数定义floatfir_coeff[]={/*...*/};//滤波器系数数组//FIR滤波器函数实现floatfir_filter(floatinput){floatoutput=0;//滤波器输出floatx=input;//输入信号当前值floaty=x;//输入信号之前值floatz=x;//滤波器输出之前值inti;for(i=0;i<FIR_LEN;i++){y=y*ALPHA+fir_coeff[i]*z;//更新输入信号和滤波器输出output+=y;//更新滤波器输出z=x;//更新滤波器输出之前值}returnoutput/FIR_LEN;//归一化滤波器输出值}```这个代码实现了简单的FIR滤波器,其输入是一个浮点数类型的信号。
滤波器的长度和参数需要根据具体的应用场景进行调整。
此外,还需要准备一个FIR滤波器系数数组,并将其定义在代码中。
三、使用示例下面是一个使用示例,展示了如何使用上述代码对一组信号进行FIR滤波处理:```c#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){//生成一组随机信号作为输入数据floatsignals[]={/*...*/};//输入信号数组,包含多个样本数据intsignal_len=sizeof(signals)/sizeof(float);//信号长度srand(time(NULL));//设置随机数种子intidx=rand()%signal_len;//随机选择一个样本作为输入信号的起始点floatoutput[signal_len];//输出数组,用于存储滤波处理后的结果inti;for(i=idx;i<idx+signal_len;i++){//对每个样本进行滤波处理output[i-idx]=fir_filter(signals[i]);//使用fir_filter函数进行滤波处理,并将结果存储在output数组中}printf("Filteredsignals:\n");//输出滤波处理后的结果for(i=0;i<signal_len;i++){//输出每个样本的滤波处理结果printf("%f\n",output[i]);}return0;}```这个示例代码生成了一组随机信号作为输入数据,并使用上述实现的FIR滤波器对每个样本进行滤波处理。
FIR低通滤波器C语言实现
FIR低通滤波器C语言实现下面是一个基于C语言的FIR低通滤波器的实现示例,通过使用FIR 算法对输入信号进行滤波来实现低通滤波的效果。
```c#include <stdio.h>#include <stdlib.h>#define N 1000 // 输入信号长度#define M 51 // FIR滤波器阶数float fir_filter(float x);void generate_input(float input[]);void generate_coefficients(float coefficients[]);int maifloat input[N];float output[N];float coefficients[M];//生成输入信号generate_input(input);//生成滤波器系数generate_coefficients(coefficients);//FIR滤波for (int n = 0; n < N; n++)output[n] = fir_filter(input[n]);}//打印滤波结果for (int n = 0; n < N; n++)printf("%f\n", output[n]);}return 0;//FIR滤波函数float fir_filter(float x)float y = 0;static float shift_register[M] = {0}; // 移位寄存器,用于存储输入序列的历史数据static float coefficients[M] = {0}; // FIR滤波器系数//数据移位for (int i = M - 1; i >= 1; i--)shift_register[i] = shift_register[i - 1];}//输入数据存入移位寄存器shift_register[0] = x;//FIR滤波for (int i = 0; i < M; i++)y += coefficients[i] * shift_register[i];}return y;//生成随机输入信号(仅作示例用)void generate_input(float input[])for (int n = 0; n < N; n++)input[n] = (float)rand( / (float)(RAND_MAX/2) - 1; // 生成范围为[-1, 1)的随机数}//生成低通滤波器系数(仅作示例用)void generate_coefficients(float coefficients[])float cutoff_freq = 0.1; // 截止频率(归一化)for (int i = 0; i < M; i++)if (i == M/2)coefficients[i] = 2 * cutoff_freq; // 滤波器的全通增益} elsecoefficients[i] = sin(2 * M_PI * cutoff_freq * (float)(i - M/2)) / (float)(i - M/2); // 低通滤波系数}}```以上代码实现了一个简单的FIR低通滤波器,主要包含了`fir_filter`函数用于滤波操作,`generate_input`函数用于生成输入信号,`generate_coefficients`函数用于生成滤波器系数。
DSP的FIR设计低通滤波C语言编写
DSP的FIR设计低通滤波C语言编写FIR(有限脉冲响应)滤波器是一种常用的数字滤波器,用于数字信号处理中的滤波操作。
FIR滤波器的设计通常包括两个主要步骤:滤波器的规格化和滤波器系数的计算。
滤波器的规格化是指确定滤波器的采样频率,截止频率以及陷波增益等参数。
在设计低通FIR滤波器时,我们需要确定滤波器的截止频率。
假设我们希望设计一个截止频率为Fs/4的低通FIR滤波器,其中Fs是采样频率。
根据滤波器设计的基本原理,我们可以得到滤波器的频率响应公式为:H(k) = (2 * Fs/4 * sin(2 * pi * Fs/4 * k))/(pi * k)其中,k是从0到N-1的整数序列,N是滤波器的长度。
经过频域设计,我们可以通过计算滤波器的频率响应公式来获得滤波器的系数。
接下来,我们将使用C语言编写一个低通FIR滤波器的代码示例。
在这个示例中,我们将实现一个截止频率为Fs/4的低通FIR滤波器,采样频率为Fs。
代码如下:```c#include <stdio.h>#include <stdlib.h>#include <math.h>//定义滤波器的长度#define N 51//定义采样频率//定义滤波器的截止频率#define Fc (Fs/4)//计算滤波器的系数void calculateCoefficients(float* coefficients)float sum = 0;for (int k = 0; k < N; k++)if (k == N/2)coefficients[k] = 2 * Fc/Fs;} elsecoefficients[k] = (sin(2.0 * M_PI * Fc * (k - N/2) / Fs)) / (M_PI * (k - N/2));}sum += coefficients[k];}//归一化滤波器的系数for (int k = 0; k < N; k++)coefficients[k] /= sum;}//应用滤波器void applyFilter(float* input, float* output, float* coefficients, int length)for (int n = 0; n < length; n++)output[n] = 0;for (int k = 0; k < N; k++)if (n - k >= 0)output[n] += input[n - k] * coefficients[k];}}}int mai//定义输入信号和输出信号的长度int length = 100;//为输入信号和输出信号分配内存空间float* input = (float*)malloc(length*sizeof(float));float* output = (float*)malloc(length*sizeof(float));//为滤波器的系数分配内存空间float* coefficients = (float*)malloc(N*sizeof(float));//生成输入信号for (int n = 0; n < length; n++)input[n] = sin(2.0 * M_PI * 1000 * n / Fs);}//计算滤波器的系数calculateCoefficients(coefficients);//应用滤波器applyFilter(input, output, coefficients, length); //打印输出信号for (int n = 0; n < length; n++)printf("%f\n", output[n]);}//释放内存空间free(input);free(output);free(coefficients);return 0;```在上面的代码示例中,我们首先定义了滤波器的长度、采样频率以及截止频率。
fir 原理和c语言代码
fir 原理和c语言代码FIR原理和C语言代码引言:FIR(Finite Impulse Response)是一种数字滤波器,它通过对输入信号进行加权求和来实现滤波效果。
本文将首先介绍FIR滤波器的原理,然后给出使用C语言实现FIR滤波器的代码示例。
一、FIR滤波器原理FIR滤波器的原理是基于有限脉冲响应的概念。
它的输入信号通过与一系列加权系数相乘后求和来得到输出信号。
这些加权系数称为滤波器的冲击响应,通常由用户根据滤波器的需求进行设定。
FIR滤波器的输出可以表示为以下形式:y[n] = b[0]*x[n] + b[1]*x[n-1] + ... + b[M]*x[n-M]其中,y[n]为输出信号的当前采样值,x[n]为输入信号的当前采样值,b[i]为滤波器的冲击响应系数,M为滤波器的阶数。
FIR滤波器的原理比较简单,通过改变冲击响应的系数,可以实现不同的滤波效果。
常见的FIR滤波器包括低通滤波器、高通滤波器、带通滤波器等。
二、C语言实现FIR滤波器的代码示例下面是一个使用C语言实现FIR滤波器的简单示例代码:```c#include <stdio.h>#define N 10 // 输入信号的长度#define M 5 // 滤波器的阶数float input[N] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}; // 输入信号float output[N]; // 输出信号float b[M] = {0.2, 0.3, 0.4, 0.5, 0.6}; // 滤波器的冲击响应系数void fir_filter(float *input, float *output){int i, j;for (i = 0; i < N; i++){output[i] = 0.0;for (j = 0; j <= M; j++){if (i - j >= 0){output[i] += b[j] * input[i - j];}}}}int main(){fir_filter(input, output);printf("输出信号:");for (int i = 0; i < N; i++){printf("%f ", output[i]);}printf("\n");return 0;}```上述代码中,首先定义了输入信号的长度N和滤波器的阶数M。
fir带通滤波器c语言
fir带通滤波器c语言一、引言在数字信号处理领域,滤波器是一种重要的技术。
其中,FIR(Finite Impulse Response,有限脉冲响应)带通滤波器在许多应用场景中具有广泛的应用。
本文将介绍FIR带通滤波器的原理,以及如何使用C语言实现这一滤波器。
二、FIR带通滤波器的原理1.数字滤波器的基本概念数字滤波器是一种对数字信号进行处理的算法,它通过在时域或频域对信号进行运算,实现对信号的滤波、降噪等处理。
2.FIR滤波器的特点FIR滤波器是一种线性、时不变、因果的数字滤波器。
它具有以下优点:① 稳定性:FIR滤波器的输出信号不会产生自激振荡;② 频率响应:FIR滤波器的频率响应具有平滑、稳定的特点;③ 阶数与性能:FIR滤波器的阶数越高,滤波性能越好,但同时计算复杂度也越高。
3.带通滤波器的应用场景带通滤波器主要用于信号处理系统中,例如:音频处理、图像处理、通信系统等。
它可以有效地滤除噪声、降低干扰,提高信号的质量和可靠性。
三、C语言实现FIR带通滤波器的方法1.确定滤波器参数首先,根据应用场景和性能要求,确定FIR滤波器的阶数、通带衰减和阻带衰减等参数。
2.编写滤波器系数表根据所确定的滤波器参数,利用公式计算滤波器系数,并将其存储为系数表。
3.编写滤波器输入输出函数利用系数表,编写C语言代码实现FIR滤波器的输入输出功能。
通常采用卷积的形式进行计算。
四、实例演示1.编写C代码以下是一个简单的FIR带通滤波器实例,采用C语言实现:```c#include <stdio.h>// 系数表,N为滤波器阶数const float coef[][N] = {/* 系数值*/};float fir_bandpass(float x[], int n) {float y = 0;for (int i = 0; i < n; i++) {y += coef[i][0] * x[i];}return y;}int main() {float x[] = {/* 输入信号*/};int n = sizeof(x) / sizeof(x[0]);float y = fir_bandpass(x, n);printf("滤波后信号:%.2f", y);return 0;}```2.编译运行结果分析将上述代码编译运行,观察输出信号,分析滤波效果。
DSP的FIR设计C语言编写
DSP的FIR设计C语言编写FIR(Finite Impulse Response)滤波器是数字信号处理中常用的一种滤波器类型。
它具有有限的冲激响应,只对有限长度的输入信号做出响应。
低通滤波器是一种能够通过滤除高频分量而保留低频分量的滤波器。
FIR低通滤波器的设计可以通过数字滤波器设计方法来实现,其中一种常用的方法是窗函数法。
以下是一个用C语言编写的FIR低通滤波器设计实例:```c#include <stdio.h>#include <stdlib.h>#include <math.h>//FIR低通滤波器设计函数void fir_lowpass_filter_design(float *filter, int order, float cutoff_freq, float sampling_freq)int i;float omega_c = 2 * M_PI * cutoff_freq / sampling_freq;//计算滤波器系数for (i = 0; i <= order; i++)if (i == (order / 2))filter[i] = omega_c / M_PI;filter[i] = sin(omega_c * (i - (order / 2))) / (M_PI * (i - (order / 2)));}int mainint order = 51; // 滤波器阶数float cutoff_freq = 1000.0; // 截止频率float sampling_freq = 8000.0; // 采样频率float *filter = malloc((order + 1) * sizeof(float)); // 分配滤波器系数数组内存//调用FIR低通滤波器设计函数fir_lowpass_filter_design(filter, order, cutoff_freq, sampling_freq);//打印滤波器系数printf("Filter Coefficients:\n");for (int i = 0; i <= order; i++)printf("h[%d] = %f\n", i, filter[i]);}free(filter); // 释放滤波器系数数组内存return 0;上述代码中的`fir_lowpass_filter_design`函数用于计算滤波器系数,其参数`filter`是一个指向滤波器系数数组的指针,`order`是滤波器阶数,`cutoff_freq`是截止频率,`sampling_freq`是采样频率。
基于MATLAB与CCS的FIR滤波器的C语言实现
基于MATLAB与CCS的FIR滤波器的C语言实现在开始之前,我们需要了解FIR滤波器的工作原理。
FIR滤波器是通过使用一组固定的权重系数来完成滤波操作的。
这些权重系数称为滤波器的冲击响应或脉冲响应。
当输入信号通过FIR滤波器时,每个输入样本都会与滤波器的系数进行加权,并求和得到输出样本。
因此,滤波器的输出是输入信号和滤波器冲击响应的加权和。
首先,我们需要在MATLAB中设计一个FIR滤波器。
MATLAB提供了一些用于设计FIR滤波器的函数,如fir1和fir2、我们可以使用这些函数来生成滤波器的系数,并将其导出为C语言代码。
假设我们要设计一个低通FIR滤波器,满足以下条件:-采样率为Fs=8000Hz-截止频率为Fc=1000Hz-通带最大衰减为0.5dB-阻带最小衰减为50dB在MATLAB中,我们可以使用fir1函数来设计滤波器,具体代码如下:```MATLABFs=8000;%采样率Fc=1000;%截止频率N=50;%滤波器阶数%计算归一化的截止频率Wn=Fc/(Fs/2);% 使用fir1函数设计滤波器h = fir1(N, Wn, 'low', kaiser(N + 1, 5.65));%导出滤波器系数为C语言代码codegen -config:lib FIRFilter -args {coder.Constant(h)} -report```上述代码中,我们通过fir1函数设计了一个50阶的低通滤波器,该滤波器的截止频率为1000Hz,并且使用了kaiser窗函数进行窗口设计。
然后,我们使用MATLAB的代码生成工具将滤波器系数导出为C语言代码。
导出的C语言代码可以被CCS进行编译和运行。
将导出的C语言代码复制到CCS的工程目录中,并添加相应的文件引用。
然后,我们可以在CCS中编写FIR滤波器的C语言实现代码。
下面是一个简单的C语言实现示例:```C#define FILTER_LENGTH 51 // 滤波器的阶数//定义滤波器系数数组float h[FILTER_LENGTH] =//填充滤波器系数};//定义滤波器的状态变量数组float delayLine[FILTER_LENGTH] = {0};//定义FIR滤波器函数float firFilter(float x)float y = 0;//将输入样本加入延迟线中for (int i = FILTER_LENGTH - 1; i > 0; --i)delayLine[i] = delayLine[i - 1];}delayLine[0] = x;//计算加权和for (int i = 0; i < FILTER_LENGTH; ++i)y += h[i] * delayLine[i];}return y;int maifloat inputSignal = ; // 输入信号float outputSignal = firFilter(inputSignal); // 使用滤波器处理输入信号//处理输出信号```在上述代码中,我们首先定义了滤波器的系数数组h和状态变量数组delayLine。
c语言完成fir滤波器
实现FIR 滤波器的C 语言代码涉及到定义滤波器的系数和设计滤波的算法。
FIR 滤波器是一种数字滤波器,其输出是输入信号与一组权重系数的卷积。
以下是一个简单的 C 语言实现FIR 滤波器的示例:#include <stdio.h>#define N 5 // 滤波器的阶数// FIR 滤波器的系数const double h[N] = {0.1, 0.2, 0.3, 0.2, 0.1};// FIR 滤波器的状态double x[N];// 函数:FIR 滤波器处理double fir_filter(double input) {int i;double output = 0;// 将输入数据放入滤波器状态数组for (i = N - 1; i > 0; i--) {x[i] = x[i - 1];}x[0] = input;// 计算输出for (i = 0; i < N; i++) {output += h[i] * x[i];}return output;}int main() {// 输入信号double input_signal[] = {1.0, 2.0, 3.0, 4.0, 5.0, 4.0, 3.0, 2.0, 1.0};// 处理输入信号for (int i = 0; i < sizeof(input_signal) / sizeof(double); i++) {double output = fir_filter(input_signal[i]);printf("Input: %.1f, Output: %.3f\n", input_signal[i], output);}return 0;}在这个示例中,fir_filter 函数实现了对输入信号的FIR 滤波操作。
x 数组用于存储FIR 滤波器的状态,h 数组是FIR 滤波器的系数。
fir带通滤波器c语言
fir带通滤波器c语言摘要:一、前言二、fir 带通滤波器的原理1.数字滤波器的概念2.有限脉冲响应(FIR) 滤波器的特点3.带通滤波器的原理三、C 语言实现FIR 带通滤波器1.滤波器系数的计算2.滤波器函数的编写3.测试与验证四、总结正文:一、前言随着数字信号处理技术的发展,越来越多的领域开始使用数字滤波器来处理信号。
有限脉冲响应(FIR) 滤波器由于其线性相位、频率选择性等优点,在实际应用中被广泛使用。
其中,fir 带通滤波器在保留信号有用频率成分的同时,对其他频率成分进行衰减,具有很好的滤波效果。
本文将介绍如何用C 语言实现fir 带通滤波器。
二、fir 带通滤波器的原理1.数字滤波器的概念数字滤波器是一种用数字方法实现的滤波器,它可以对数字信号进行处理。
数字滤波器有很多种,有限脉冲响应(FIR) 滤波器是其中一种。
2.有限脉冲响应(FIR) 滤波器的特点FIR 滤波器具有以下特点:(1) 线性相位:在一定条件下,FIR 滤波器的输出信号的相位与输入信号的相位相同。
(2) 频率选择性:FIR 滤波器可以有选择地衰减或增强不同频率的信号成分。
(3) 稳定性:当系统参数确定时,FIR 滤波器的输出信号与输入信号的幅度和相位关系是稳定的。
3.带通滤波器的原理带通滤波器是一种只允许一定频率范围内的信号通过,而阻止其他频率信号通过的滤波器。
在实际应用中,带通滤波器可以用于信号处理、通信系统、音频处理等领域。
三、C 语言实现FIR 带通滤波器1.滤波器系数的计算要实现FIR 带通滤波器,首先需要计算滤波器的系数。
根据巴特沃斯带通滤波器的设计方法,可以得到滤波器的系数。
2.滤波器函数的编写接下来,需要编写一个C 语言函数来实现FIR 带通滤波器。
函数输入为输入信号的采样值,输出为滤波后的信号采样值。
在函数内部,可以使用之前计算得到的滤波器系数进行信号处理。
3.测试与验证为了验证所实现的FIR 带通滤波器的性能,可以采用信号发生器生成一定频率范围内的信号,对其进行滤波处理,然后将滤波后的信号与原始信号进行比较,验证滤波器的性能。
fir滤波器公式c语言
fir滤波器公式c语言FIR滤波器是一种常用的数字滤波器,它通过对输入信号的加权求和来实现信号的滤波处理。
在这篇文章中,我们将介绍FIR滤波器的公式以及如何用C语言来实现它。
FIR滤波器的全称是有限脉冲响应滤波器(Finite Impulse Response Filter),它的特点是其响应仅在有限的时间范围内存在。
FIR滤波器的输入信号经过一系列的加权系数和延迟单元的处理,最终得到滤波后的输出信号。
FIR滤波器的公式可以表示为:y(n) = h(0) * x(n) + h(1) * x(n-1) + h(2) * x(n-2) + ... + h(N-1) * x(n-(N-1))其中,y(n)表示滤波器的输出信号,x(n)表示滤波器的输入信号,h(i)表示滤波器的第i个加权系数,N表示滤波器的阶数。
在C语言中,我们可以使用数组来表示滤波器的加权系数,使用循环来实现滤波器的延迟处理。
下面是一个简单的示例代码:```c#define N 10 // 滤波器的阶数float h[N] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.4, 0.3, 0.2, 0.1, 0.05}; // 滤波器的加权系数float x[N] = {0}; // 输入信号的延迟单元float y = 0; // 滤波器的输出信号void firFilter(float input) {// 将输入信号插入延迟单元for (int i = N-1; i >= 1; i--) {x[i] = x[i-1];}x[0] = input;// 计算滤波器的输出信号y = 0;for (int i = 0; i < N; i++) {y += h[i] * x[i];}}int main() {// 输入信号float input = 0.5;// 执行滤波处理firFilter(input);// 输出滤波器的输出信号printf("滤波器的输出信号为:%f\n", y);return 0;}```在上面的示例代码中,我们定义了一个长度为N的加权系数数组h,一个长度为N的延迟单元数组x,以及一个输出信号变量y。
fir滤波器设计,c语言,
C语言编写FIR滤波器;代码如下:#include <stdio.h>#include <math.h>#include<stdlib.h>/**********************************宏定义**************************************/#define PI 3.1415926535#define Size_Datas 512/*******************************数据类型构造***********************************/int i=0;j=0; nNow=0;// h参数使用matlab计算获得;用fopen;接着fprintf;最后fclose等命令保存为dat文件;不要直接用save命令..float h={#include "b_fir.dat"};const int ORDER = sizeofh/sizeofh0;//输入数据形式与滤波器参数形式相同float Xin = {#include "inputwave0_fir.dat"};float sum=0;float outputSize_Datas;wSize_Datas;int n1;void mainvoid{for i=0; i<Size_Datas; i++ // FIR运算{forj=0;j<ORDER;j++{ifi>=jsum+=hj*Xini-j; // 时域卷积else;}outputi = sum ;}// 考虑到前33个点为不完全累加和;故抛去前33个点..应该是前后各32个点//都是不完全累加和;//都应该去掉;对于数据分段进入滤波器的情况;应该把前一段的后面数据放到//下一段的前面fori=0;i<Size_Datas-ORDER;i++{outputi=outputi+ORDER;}}。
(完整word版)c语言写的fir低通滤波器
根据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*n2.逆推法: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*n3.倒序法:(输入输出可以是同一量)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<stdio.h>#include<math.h>#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.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};// shortw[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};// shortw[2*n+1]={58,5628,526,8192,2105,5883,4913,3829,7369,1543,7369,504,4913,102,2105,14,526,1,5 8};//shortw[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};//shortw[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}; // shortw[2*n+1]={101,4356,810,8192,2835,3403,5670,2517,7088,605,5670,193,2835,21,810,2,101};// shortw[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;//22222222222222while(size--){xx0=*input++;x=xx0*6;z0=(long)x<<15;y0=0;for(i=0;i<n;i++){z0-=(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;}。
fir带通滤波器c语言
fir带通滤波器c语言
【原创版】
目录
1.介绍 fir 带通滤波器
2.介绍 c 语言编程
3.讲解如何使用 c 语言实现 fir 带通滤波器
4.结论
正文
一、介绍 fir 带通滤波器
fir 带通滤波器是一种数字滤波器,可以用来过滤信号,使其在一定频率范围内通过,而在其他频率范围内阻止。
这种滤波器在信号处理、通信等领域有着广泛的应用。
二、介绍 c 语言编程
c 语言是一种通用的、过程式的计算机程序设计语言,广泛应用于底层开发和系统编程。
它具有良好的性能和灵活性,是许多其他编程语言的基础。
三、讲解如何使用 c 语言实现 fir 带通滤波器
要使用 c 语言实现 fir 带通滤波器,需要先了解其基本原理。
fir 带通滤波器的核心是滤波器系数,根据这些系数可以编写出滤波器的程序。
具体步骤如下:
1.定义滤波器长度和滤波器系数
2.初始化一个长度与滤波器长度相同的数组,用于存储滤波后的信号
3.遍历输入信号,将每个元素与对应滤波器系数相乘,然后将结果累加到滤波后的信号数组中
4.输出滤波后的信号
四、结论
通过以上步骤,我们可以使用 c 语言实现 fir 带通滤波器,从而在实际应用中对信号进行处理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
case 7:
{ w=kaiser(i,n,beta);//凯塞窗
break;
}
}
return(w);
}
static double kaiser(i,n,beta)//因凯塞窗的表达式复杂,调用贝塞尔窗表达式
int i,n;
double beta;
fs:采样频率*/
void firwin(n,band,fln,fhn,wn,h)
int n,band,wn;
double fln,fhn,h[];
{
int i,n2,mid;
double s,pi,wc1,wc2,beta,delay,fs;
double window();//窗函数的计算
}
case 2:
{ k=(n-2)/10;
if(i<=k)
w=0.5*(1.0-cos(i*pi/(k+1)));//图基窗
break;
}
case 3:
{ w=1.0-fabs(1.0-2*i/(n-1.0));//三角窗
break;
}
int i,n,type;
double beta;
{
int k;
double pi,w;
double kaiser();
pi=4.0*atan(1.0);//pi=PI;
w=1.0;
switch(type)
{
case 1:
{ w=1.0;//矩形窗
break;
h[n-i]=h[i];
}
if(mid==1) h[n/2]=(wc1+pi-wc2)/pi;
break;
}
}
}
/*返回窗函数的表达式
n:窗口长度
type:选择窗函数的类型
beta:生成凯塞窗的系数*/
static double window(type,n,i,beta)
#include"math.h"
#include"stdio.h"
/*n:滤波器的阶数,n是奇数时可用来设计各种滤波器
band:滤波器类型1、2、3、4分别对应低通,高通,带通,带阻
fln:通带下边界频率
fhn:通带上边界频率
wn:窗函数的类型1-7分别对应
h:长度为n+1,存放滤波器的系数
h[i]=h[i]*window(wn,n+1,i,beta);
h[n-i]=h[i]; } if(mid==1) h[n/2]=1.0-wc1/pi;//对
break;
}
case 3:
{ for(i=0;i<n2;i++)
{ s=i-delay;
case 4:
{ w=0.5*(1.0-cos(2*i*pi/(n-1)));//汉宁窗
break;
}
case 5:
{ w=0.54-0.46*cos(2*i*pi/(n-1));//海明窗
break;
}
case 6:
{ w=0.42-0.5*cos(2*i*pi/(n-1))+0.08*cos(4*i*pi/(n-1));//布莱克曼窗
d2=d*d;
sum=sum+d2;
if(d2<sum*(1.0e-8)) break;
}
return(sum);
}
h[n-i]=h[i];
}
if(mid==1) h[n/2]=wc1/pi;//n为偶数时,修正中间值系数
break;
}
case 2:
{ for(i=0;i<=n2;i++)
{ s=i-delay;
h[i]=(sin(pi*s)-sin(wc1*s/fs))/(pi*s);//高通-//对
{
double a,w,a2,b1,b2,beta1;
double bessel0();
b1=bessel0(beta);
a=2.0*i/(double)(n-1)-1.0;
a2=a*a;
beta1=beta*sqrt(1.0-a2);
b2=bessel0(beta1);
break;
}
case 4:
{ for(i=0;i<=n2;i++)
{ s=i-delay;
h[i]=(sin(wc1*s/fs)+sin(pi*s)-sin(wc2*s/fs))/(pi*s);//带阻-//对
h[i]=h[i]*window(wn,n+1,i,beta);
if((n%2)==0)/*如果阶数n是偶数*/
{ n2=n/2+1;/**/
mid=1;//
}
else
{ n2=n/2;//n是奇数,则窗口长度为偶数
mid=0;//
}
delay=n/2.0;
wc1=2.0*pi*fln;//
if(band>=3) /*先判断用户输入的数据,如果band参数大于3*/
beta=0.0;
if(wn==7)//只有凯塞窗需要输入系数beta
{ printf("input beta parameter of Kaiser window(2<beta<10)\n");
scanf("%1f",&beta);
}
pi=4.0*atan(1.0);//pi=PI;
{ wc2=2.0*pi*fhn; }
switch(band)
{
case 1:
{ for(i=0;i<=n2;i++)
{ s=i-delay;//
h[i]=(sin(wc1*s/fs)/(pi*s))*window(wn,n+1,i,beta);//低通,窗口长度=阶数+1,故为n+1
h[i]=(sin(wc2*s/fs)-sin(wc1*s/fs))/(pi*s);//带通-//对
h[i]=h[i]*window(wn,n+1,i,beta);
h[n-i]=h[i];
}
if(mid==1) h[n/2]=(wc2-wc1)/pi;//对
w=b2/b1;
return(w);
}
static double bessel0(x)
double x;
{
int i;
double d,y,d2,sum;
y=x/2.0;
d=1.0;
sum=1.0;
for(i=1;i<=25;i++)
{ d=d*y/i;