1628|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

分享DSP C语言的IIR滤波器程序源码 [复制链接]

#include
#include
#include "fdacoefs.h"


//*********************************************
//fs=1000000,fpass=10000,fstop=50000(-80db)
//butterworth iir-df1
//*********************************************
#define fs 1000000
#define f1 4000//测试正弦频率1
#define f2 50000//测试正弦频率2
#define f_rec 5000//测试方波频率


#define Impulse 1
#define Sine    2
#define Rect    3


#define pi 3.1415926


#define STG_NUM (MWSPT_NSEC-1)/2
#define DAT_NUM 800




float IIR_out[DAT_NUM];
float input_step[STG_NUM+1][3];// n; n-1; n-2
void iir_filter_init(float *ptr,int num)
{
    int i;        
        for(i=0;i
        {
                *ptr++=0;
        }
        
}


float iir_filter(float in)
{
      
      int i;
          float temp;
     
      input_step[0][0] = in;
      for(i=0;i
      {
               
          temp =NUM[i*2][0]*(input_step[0]*NUM[i*2+1][0]+input_step[1]*NUM[i*2+1][1]+input_step[2]*NUM[i*2+1][2])-
                                            input_step[i+1][1]*DEN[i*2+1][1]-input_step[i+1][2]*DEN[i*2+1][2];
                                            
          temp *= DEN[i*2+1][0];
         
          input_step[2]=input_step[1];            
                input_step[1]=input_step[0];                           
          input_step[i+1][0]=temp;
               
      }
                                         
   return  temp*NUM[MWSPT_NSEC-1][0];   
   
}
float x;
int main()
{
        
        int i,Test_type;


        printf("请选择测试类型:1、冲击测试 2、正弦测试 3、方波测试\n");
        scanf("%d",&Test_type);
               
        while(1){
                iir_filter_init(input_step[0],sizeof(input_step)/sizeof(input_step[0][0]));
                        
                switch(Test_type)
                {
                        case Rect://方波输入
                                for(i=0;i
                                {                                
                                        if(((2*f_rec*i/fs)%2)==0)
                                                x=5000;
                                        else
                                                x=-5000;                                                               
                                        IIR_out=iir_filter(x);                                                                                                                                       
                                }               
                        break;
                        
                        case Impulse://冲激输入
                                IIR_out[0]=iir_filter(5000);
                                for(i=1;i
                                        IIR_out=iir_filter(0);                                                                                                                                                        
                        break;
                        
                        case Sine://正弦输入                        
                                for(i=0;i
                                {
                                        //***************************************************************
                                        x=500*(cos(2*pi*f1*i/fs)+cos(2*pi*f2*i/fs)); //正弦测试                                                                                       
                                        IIR_out=iir_filter(x);                                                                                                                                 
                                }                        
                        break;        
                }
        //请在printf前设置断点,以便停止运行 查看输出结果        否则,看不到输出
        printf("请选择测试类型:1、冲击测试 2、正弦测试 3、方波测试\n");
        scanf("%d",&Test_type);        
                                
        }      
        while(1);
}

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表