找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5884|回复: 8
收起左侧

DSP C语言的IIR滤波器程序源码

  [复制链接]
ID:209315 发表于 2018-8-8 16:32 | 显示全部楼层 |阅读模式
分享个DSP C语言的IIR滤波器

单片机源程序如下:
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include "fdacoefs.h"

  4. //*********************************************
  5. //fs=1000000,fpass=10000,fstop=50000(-80db)
  6. //butterworth iir-df1
  7. //*********************************************
  8. #define fs 1000000
  9. #define f1 4000//测试正弦频率1
  10. #define f2 50000//测试正弦频率2
  11. #define f_rec 5000//测试方波频率

  12. #define Impulse 1
  13. #define Sine    2
  14. #define Rect    3

  15. #define pi 3.1415926

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


  18. float IIR_out[DAT_NUM];


  19. float input_step[STG_NUM+1][3];// n; n-1; n-2

  20. void iir_filter_init(float *ptr,int num)
  21. {
  22.     int i;       
  23.         for(i=0;i<num;i++)
  24.         {
  25.                 *ptr++=0;
  26.         }
  27.        
  28. }

  29. float iir_filter(float in)
  30. {
  31.       
  32.       int i;
  33.           float temp;
  34.      
  35.       input_step[0][0] = in;
  36.       for(i=0;i<STG_NUM;i++)
  37.       {
  38.                 
  39.           temp =NUM[i*2][0]*(input_step[i][0]*NUM[i*2+1][0]+input_step[i][1]*NUM[i*2+1][1]+input_step[i][2]*NUM[i*2+1][2])-
  40.                                             input_step[i+1][1]*DEN[i*2+1][1]-input_step[i+1][2]*DEN[i*2+1][2];
  41.                                             
  42.           temp *= DEN[i*2+1][0];
  43.          
  44.           input_step[i][2]=input_step[i][1];             
  45.                 input_step[i][1]=input_step[i][0];                           
  46.           input_step[i+1][0]=temp;
  47.          
  48.       
  49.       }
  50.                                          
  51.       return  temp*NUM[MWSPT_NSEC-1][0];   
  52.    
  53. }

  54. float x;
  55. int main()
  56. {
  57.        
  58.         int i,Test_type;

  59.         printf("请选择测试类型:1、冲击测试 2、正弦测试 3、方波测试\n");
  60.         scanf("%d",&Test_type);
  61.                
  62.         while(1){
  63.                 iir_filter_init(input_step[0],sizeof(input_step)/sizeof(input_step[0][0]));
  64.                        
  65.                 switch(Test_type)
  66.                 {
  67.                         case Rect://方波输入
  68.                                 for(i=0;i<DAT_NUM;i++)
  69.                                 {                               
  70.                                         if(((2*f_rec*i/fs)%2)==0)
  71.                                                 x=5000;
  72.                                         else
  73.                                                 x=-5000;                                                               
  74.                                         IIR_out[i]=iir_filter(x);                                                                                                                                       
  75.                                 }               
  76.                         break;
  77.                        
  78.                         case Impulse://冲激输入
  79.                                 IIR_out[0]=iir_filter(5000);
  80.                                 for(i=1;i<DAT_NUM;i++)                                                               
  81.                                         IIR_out[i]=iir_filter(0);                                                                                                                                                       
  82.                         break;
  83.                        
  84.                         case Sine://正弦输入                       
  85.                                 for(i=0;i<DAT_NUM;i++)
  86.                                 {
  87.                                         //***************************************************************
  88.                                         x=500*(cos(2*pi*f1*i/fs)+cos(2*pi*f2*i/fs)); //正弦测试                                                                                       
  89.                                         IIR_out[i]=iir_filter(x);                                                                                                                                       
  90.                                 }                       
  91.                         break;       
  92.                 }
  93.         //请在printf前设置断点,以便停止运行 查看输出结果        否则,看不到输出
  94.         printf("请选择测试类型:1、冲击测试 2、正弦测试 3、方波测试\n");
  95.         scanf("%d",&Test_type);       
  96.                                
  97.         }
  98.        
  99.         while(1);

  100. }
复制代码

所有资料51hei提供下载:
IIR.7z (23.26 KB, 下载次数: 78)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:95821 发表于 2018-8-10 11:55 | 显示全部楼层
學習了,正是在找的
回复

使用道具 举报

ID:209315 发表于 2018-8-10 16:14 | 显示全部楼层
alai318 发表于 2018-8-10 11:55
學習了,正是在找的

努力加油
回复

使用道具 举报

ID:95821 发表于 2018-8-12 12:36 | 显示全部楼层
剛學了FFT基2算法,FFT還沒學透,學好再來學濾波方面的
回复

使用道具 举报

ID:209315 发表于 2018-8-14 14:05 | 显示全部楼层
alai318 发表于 2018-8-12 12:36
剛學了FFT基2算法,FFT還沒學透,學好再來學濾波方面的

老哥厉害了
回复

使用道具 举报

ID:216962 发表于 2018-8-14 14:16 | 显示全部楼层
谢谢分享,论坛有您更精彩!
回复

使用道具 举报

ID:424128 发表于 2018-11-10 18:29 | 显示全部楼层
老哥,这个程序适合用于DSP C54x做IIR滤波器的实物吗,就是IIR数字滤波器的MATLAB仿真及DSP实现这种毕业设计题,能做出实物不?
回复

使用道具 举报

ID:392405 发表于 2019-7-27 10:49 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:276779 发表于 2019-10-22 17:59 | 显示全部楼层
看一下正需要呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表