C语言实现数字滤波器

// 定义PI 参数

#define PI 3.1415926

// 包含文件

#include "stdio.h"
#include "math.h"
#include "stdlib.h"

#include "fft_sub.c"

// 主函数开始
void main()
{

// 定义函数、数组、变量

  void fft();
  float *xr,*xi;
  float *H;
  int i,np,nfft,k;
  float t,dt,df,f,z,fc1,fc2;
  FILE *fpar,*fp1,*fp2,*fp3,*fp4,*fp5;
  char fil1[80],fil2[80],fil3[80],fil4[80],fil5[80];

// 打开参数文件
  fpar=fopen("filter.par","r");
  fscanf(fpar,"%s",fil1);
  fscanf(fpar,"%s",fil2);
  fscanf(fpar,"%s",fil3);
  fscanf(fpar,"%s",fil4);
  fscanf(fpar,"%s",fil5);

  fscanf(fpar,"%d",&np);
  printf("np=%d\n",np);
  fscanf(fpar,"%f",&dt);
  printf("dt=%8.3f ms\n",dt);

// 注意时间毫秒与秒的转换
  dt=(float)(dt/1000.0);
  fscanf(fpar,"%f%f",&fc1,&fc2);
  printf("fc1=%5.1f  fc2=%5.1f\n",fc1,fc2);
  fclose(fpar);

  // (1)calculate fft point,输入数据点数可能不一定是2**k
  k=(int)(log(np)/log(2));
  if(np>pow(2,k))k=k+1;
  nfft=(int)pow(2,k);
  df=(float)(1.0/(nfft*dt));
  printf("nfft=%d  k=%d\n",nfft,k);
  printf("dt=%8.4f  df=%8.4f\n",dt,df);
  // allocate memory
  xr=(float *)calloc(nfft,sizeof(float));
  xi=(float *)calloc(nfft,sizeof(float));
  H=(float *)calloc(nfft,sizeof(float));

  // (2)产生滤波器,generate a filter
  fp1=fopen(fil1,"w");
  for(i=0;i<=nfft/2;i++)
 { f=i*df;
   if(f<=fc2 && f>=fc1)H[i]=1.0;
   else H[i]=0.0;
   fprintf(fp1,"%4d \t %10.4f \t %12.4f\n",i,f,H[i]);
 }

  // 注意滤波器的对称性
  for(i=nfft/2+1;i<nfft;i++)
 { f=i*df;
   H[i]=H[nfft-i];
   fprintf(fp1,"%4d \t %10.4f \t %12.4f\n",i,f,H[i]);
 }
  fclose(fp1);
  printf("The Filter is ok!\n");

  fp2=fopen(fil2,"r");
// 输入数据
  for(i=0;i<np;i++)
 { fscanf(fp2,"%f%f",&t,&z);
   xr[i]=z;
 }
  fclose(fp2);
  printf("The Data is ok!\n");

//(3) fill zero,如果不满足2**k,要补零
  if(np<nfft)
 {for(i=np;i<nfft;i++)
  xr[i]=0;
 }
  for(i=0;i<nfft;i++)
  xi[i]=0.0;
  //(4) calculate fft
  fft(xr,xi,k,1);

  // (5)output amplitude spectrum of the orignal signal
  fp3=fopen(fil3,"w");
  for(i=0;i<nfft;i++)
 { f=i*df;
   fprintf(fp3,"%4d \t %10.4f \t %12.4f\n",i,f,sqrt(xr[i]*xr[i]+xi[i]*xi[i])*dt);
 }
  fclose(fp3);

  // (6)filter the X(f),output Y(f)
  fp4=fopen(fil4,"w");
  for(i=0;i<nfft;i++)
 { xr[i]=xr[i]*H[i];
   xi[i]=xi[i]*H[i];
   f=i*df;
   fprintf(fp4,"%4d \t %10.4f \t %12.4f\n",i,f,sqrt(xr[i]*xr[i]+xi[i]*xi[i])*dt);
 }
  fclose(fp4);

  printf("The |y(f)| is ok!\n");

// (7)do IFFT, get y(t)
  fft(xr,xi,k,-1);

  fp5=fopen(fil5,"w");
  for(i=0;i<=np;i++)
 { t=i*dt;
   fprintf(fp5,"%10.4f \t %12.4f\n",t,xr[i]);
 }
  fclose(fp5);
  printf("The y(t) is ok!\n");

  printf("The Program is finished!\n");
  free(xr);free(xi);free(H);
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值