找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9926|回复: 0
打印 上一主题 下一主题
收起左侧

小波包3层分解C语言源程序

[复制链接]
跳转到指定楼层
楼主
ID:271983 发表于 2018-1-5 15:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此程序是用于信号处理分析,突出奇异值的前段处理,对信号进行小波包分解,用C语言实现的,这个程序相比MATLAB程序,没有进行边缘的处理,直接根据卷积原理进行编写而成的,如有对信号边缘处理的要求,可以自行改进。程序在DEV C++软件中运行成功,能够进行,程序中有注释部分,欢迎大家改进提高。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #define LENGTH 4096//信号长度
  6. #define DB_LENGTH 8  //Daubechies小波基紧支集长度
  7. /******************************************************************
  8. * 一维卷积函数
  9. *
  10. * 说明: 循环卷积,卷积结果的长度与输入信号的长度相同
  11. *
  12. * 输入参数: data[],输入信号; core[],卷积核; cov[],卷积结果;
  13. *            n,输入信号长度; m,卷积核长度.
  14. *
  15. * 李承宇, lichengyu2345@126.com
  16. *
  17. *  2010-08-18  
  18. ******************************************************************/
  19. /*void Covlution(double data[], double core[], double cov[], int n, int m)
  20. {
  21.     int i = 0;
  22.     int j = 0;
  23.     int k = 0;

  24.     //将cov[]清零
  25.     for(i = 0; i < n; i++)
  26.     {
  27.         cov[i] = 0;
  28.     }

  29.     //前m/2+1行
  30.     i = 0;
  31.     for(j = 0; j < m/2; j++, i++)
  32.     {
  33.         for(k = m/2-j; k < m; k++ )
  34.         {
  35.             cov[i] += data[k-(m/2-j)] * core[k];//k针对core[k]
  36.         }

  37.         for(k = n-m/2+j; k < n; k++ )
  38.         {
  39.             cov[i] += data[k] * core[k-(n-m/2+j)];//k针对data[k]
  40.         }
  41.     }

  42.     //中间的n-m行
  43.     for( i = m/2; i <= (n-m)+m/2; i++)
  44.     {
  45.         for( j = 0; j < m; j++)
  46.         {
  47.             cov[i] += data[i-m/2+j] * core[j];
  48.         }
  49.     }

  50.     //最后m/2-1行
  51.     i = (n - m) + m/2 + 1;
  52.     for(j = 1; j < m/2; j++, i++)
  53.     {
  54.         for(k = 0; k < j; k++)
  55.         {
  56.             cov[i] += data[k] * core[m-j-k];//k针对data[k]
  57.         }

  58.         for(k = 0; k < m-j; k++)
  59.         {
  60.             cov[i] += core[k] * data[n-(m-j)+k];//k针对core[k]
  61.         }
  62.     }

  63. }
  64. */
  65. //定义一个线性卷积
  66. void Covlution(double data[], double core[], double cov[], int n, int m)
  67. {
  68.          int i = 0;
  69.     int j = 0;
  70.     int t = 0;

  71.     //将cov[]清零
  72.     for(j = 0; j < n+m-1; j++)
  73.     {
  74.         cov[j] = 0;
  75.     }

  76.          for(j=0;j<m+n-1;j++)
  77.          {
  78.                  if(j<=m-1)       //前面m行
  79.                  {
  80.                         for(i=0,t=j;t>=0;i++,t--)
  81.                          cov[j]+=data[i]*core[t];
  82.                  
  83.                  }
  84.                  else if(j<=n-1)    //中间n-m行
  85.                  {
  86.                          for(i=j-m+1,t=m-1;t>=0;i++,t--)
  87.                          cov[j]+=data[i]*core[t];
  88.                  }
  89.                  else     //后面m行
  90.                           {
  91.                                   for(i=j-m+1,t=m-1;i<n;i++,t--)
  92.                                  cov[j]+=data[i]*core[t];        
  93.                           }
  94.          }        

  95. }


  96. /******************************************************************
  97. * 一维小波变换函数
  98. *
  99. * 说明: 一维小波变换,只变换一次
  100. *
  101. * 输入参数: input[],输入信号; output[],小波变换结果,包括尺度系数和
  102. * 小波系数两部分; temp[],存放中间结果;h[],Daubechies小波基低通滤波器系数;
  103. * g[],Daubechies小波基高通滤波器系数;n,输入信号长度; m,Daubechies小波基紧支集长度.
  104. *
  105. * 李承宇, lichengyu2345@126.com
  106. *
  107. *  2010-08-19  
  108. ******************************************************************/
  109. void DWT1D_1(double input[], double output0[], double output1[],double temp[], double h[],
  110.            double g[], int n, int m)
  111. {
  112. //  double temp[LENGTH] = {0};//?????????????
  113.      
  114.     int i = 0;
  115. /*
  116.     //尺度系数和小波系数放在一起
  117.     Covlution(input, h, temp, n, m);

  118.     for(i = 0; i < n; i += 2)
  119.     {
  120.         output[i] = te mp[i];
  121.     }

  122.     Covlution(input, g, temp, n, m);

  123.     for(i = 1; i < n; i += 2)
  124.     {
  125.         output[i] = temp[i];
  126.     }
  127. */
  128.    //尺度系数和小波系数分开
  129.    Covlution(input, h, temp, n, m);

  130.     for(i = 0; i < n+m-1; i += 2)
  131.     {
  132.         output0[i/2] = temp[i];//尺度系数,进行了2抽值 ,即尺度空间,低频概貌部分
  133.     }

  134. Covlution(input, g, temp, n, m);

  135.     for(i = 1; i < n+m-1; i +=2)
  136.     {
  137.     //   output[i] = temp[i];
  138.            output1[(i-1)/2] = temp[i];//小波系数,已经进行了2抽取,即高频细节部分
  139.     }



  140. }

  141. void DWT1D_2(double input[], double AA2[], double DA2[],double AD2[],double DD2[],double temp0[],double temp1[],double temp[], double h[],
  142.            double g[], int n, int m)
  143. {
  144.                 DWT1D_1(input, temp0, temp1,temp, h, g, n, m);
  145.                 int a1=(m+n)/2;
  146.                 DWT1D_1(temp0, AA2, DA2,temp, h, g, a1, m);
  147.                 int d1=(n+m-4)/2;
  148.                 DWT1D_1(temp1, AD2, DD2,temp, h, g, d1, m);
  149.                
  150. }

  151. void DWT1D_3(double input[], double AAA3[], double DAA3[],double ADA3[],double DDA3[],double AAD3[], double DAD3[],double ADD3[],double DDD3[],
  152.                          double temp0[],double temp1[],double temp2[],double temp3[],double temp00[], double temp11[], double temp[], double h[], double g[], int n, int m)
  153. {
  154.                 DWT1D_2(input, temp0, temp1,temp2, temp3,temp00, temp11,temp, h, g, n, m);
  155.                 int aa2=(m+n)/4;
  156.                 DWT1D_1(temp0, AAA3, DAA3,temp, h, g, aa2, m);
  157.                 int da2=(n+3*m-8)/4;
  158.                 DWT1D_1(temp1, ADA3, DDA3,temp, h, g, da2, m);
  159.                 int ad2=(n+3*m-4)/4;
  160.                 DWT1D_1(temp2, AAD3, DAD3,temp, h, g, ad2, m);
  161.                 int dd2=(n+3*m-12)/4;
  162.                 DWT1D_1(temp3, ADD3, DDD3,temp, h, g, dd2, m);
  163.                
  164.                
  165. }


  166. void main()
  167. {

  168.     double data[LENGTH];//输入信号
  169.     double temp0[(LENGTH+DB_LENGTH)/4]; //先定义了一个中间结果
  170.     double temp1[(LENGTH+DB_LENGTH*3-8)/4];                        
  171.     double temp2[(LENGTH+DB_LENGTH*3-4)/4];                     
  172.     double temp3[(LENGTH+DB_LENGTH*3-12)/4];                       
  173.     double temp00[(LENGTH+DB_LENGTH)/2];                          
  174.     double temp11[(LENGTH+DB_LENGTH-4)/2];                                                     
  175.     double temp[LENGTH+DB_LENGTH-1];
  176.    
  177.     double AAA3[(LENGTH+DB_LENGTH*5)/8];//一维小波变换后的结果
  178.     double DAA3[(LENGTH+DB_LENGTH*5-16)/8];
  179.    
  180.         double ADA3[(LENGTH+DB_LENGTH*7-8)/8];   
  181.     double DDA3[(LENGTH+DB_LENGTH*7-24)/8];
  182.    
  183.     double AAD3[(LENGTH+DB_LENGTH*7-4)/8];
  184.         double DAD3[(LENGTH+DB_LENGTH*7-20)/8];
  185.          
  186.         double ADD3[(LENGTH+DB_LENGTH*7-12)/8];
  187.     double DDD3[(LENGTH+DB_LENGTH*7-28)/8];
  188.    
  189.           int aaa3=(LENGTH+DB_LENGTH*5)/8;//一维小波变换后的结果数组的长度
  190.     int daa3=(LENGTH+DB_LENGTH*5-16)/8;
  191.    
  192.         int ada3=(LENGTH+DB_LENGTH*7-8)/8;   
  193.     int dda3=(LENGTH+DB_LENGTH*7-24)/8;
  194.    
  195.     int aad3=(LENGTH+DB_LENGTH*7-4)/8;
  196.         int dad3=(LENGTH+DB_LENGTH*7-20)/8;
  197.          
  198.         int add3=(LENGTH+DB_LENGTH*7-12)/8;
  199.     int ddd3=(LENGTH+DB_LENGTH*7-28)/8;
  200.    
  201.     int n = 0;//输入信号长度
  202.     int m = 8;//Daubechies正交小波基长度
  203.     int i = 0;
  204.     char s[32];//从txt文件中读取一行数据
  205. /*//DB3
  206.     static double h[] = {.332670552950, .806891509311, .459877502118, -.135011020010,
  207.                     -.085441273882, .035226291882};
  208.     static double g[] = {.035226291882, .085441273882, -.135011020010, -.459877502118,
  209.                     .806891509311, -.332670552950};
  210. */
  211. //DB4

  212. static double h[] = {0.2303778133088964,   0.7148465705529154,         0.6308807679398587,-0.0279837694168599, -0.1870348117190931,     0.0308413818355607, 0.0328830116668852, -0.0105974017850690};//h[],Daubechies小波基低通滤波器系数;
  213. static double g[] = {-0.0105974017850690, -0.0328830116668852, 0.0308413818355607, 0.1870348117190931,-0.0279837694168599, -0.6308807679398587, 0.7148465705529154, -0.2303778133088964 };//g[],Daubechies小波基高通滤波器系数
  214.     //读取输入信号
  215.     FILE *fp;
  216.         FILE *fp0,*fp1,*fp2,*fp3,*fp4,*fp5,*fp6,*fp7;
  217.     fp=fopen("heb1.txt","r");
  218.     if(fp==NULL) //如果读取失败
  219.     {
  220.         printf("错误!找不到要读取的文件hea1.txt/n");
  221.         exit(1);//中止程序
  222.     }

  223.     while( fgets(s, 32, fp) != NULL )//读取长度n要设置得长一点,要保证读到回车符,这样指针才会定位到下一行?回车符返回的是零值?是,非数字字符经过atoi变换都应该返回零值
  224.     {
  225.     //  fscanf(fp,"%d", &data[count]);//一定要有"&"啊!!!最后读了个回车符!适应能力不如atoi啊
  226.         data[n] = atof(s);
  227.         n++;
  228.     }

  229.     //一维小波变换
  230.     //DWT1D(data, data_output, temp, h, g, n, m);
  231.     DWT1D_3(data, AAA3, DAA3,ADA3,DDA3,AAD3, DAD3,ADD3,DDD3,
  232.                          temp0, temp1, temp2, temp3, temp00, temp11, temp, h, g, n, m);

  233.     //一维小波变换后的结果写入txt文件
  234.     fp0=fopen("data_output_db4_aaa3.txt","w");
  235.     fp1=fopen("data_output_db4_daa3.txt","w");
  236.          fp2=fopen("data_output_db4_ada3.txt","w");
  237.     fp3=fopen("data_output_db4_dda3.txt","w");
  238.     fp4=fopen("data_output_db4_aad3.txt","w");
  239.     fp5=fopen("data_output_db4_dad3.txt","w");
  240.          fp6=fopen("data_output_db4_add3.txt","w");
  241.     fp7=fopen("data_output_db4_ddd3.txt","w");
  242.     //打印一维小波变换后的结果
  243.     for(i = 0; i <aaa3; i++)
  244.     {        //if(i==0)
  245.                 printf("%s\n","AAA3");
  246.         printf("%f\n", AAA3[i]);
  247.         fprintf(fp0,"%f\n", AAA3[i]);
  248. //                }
  249. //        else
  250. //        {
  251. //        printf("%f\n", AAA3[i]);
  252. //        fprintf(fp0,"%f\n", AAA3[i]);
  253. //        }
  254.   
  255.     }

  256.          for(i = 0; i <daa3; i++)
  257.     {//if(i==0)
  258.                 printf("%s\n","DAA3");
  259.         printf("%f\n", DAA3[i]);
  260.         fprintf(fp1,"%f\n", DAA3[i]);
  261. //                }
  262. //                else
  263. //                {
  264. //        printf("%f\n", DAA3[i]);
  265. //        fprintf(fp1,"%f\n", DAA3[i]);
  266. //                }
  267.   
  268.     }
  269.    
  270.         for(i = 0; i <ada3; i++)
  271.     {//if(i==0)
  272.                     printf("%s\n","ADA3");
  273.         printf("%f\n", ADA3[i]);
  274.         fprintf(fp2,"%f\n", ADA3[i]);
  275. //            }
  276. //                else
  277. //                {
  278. //        printf("%f\n", ADA3[i]);
  279. //        fprintf(fp2,"%f\n", ADA3[i]);
  280. //                }
  281.   
  282.     }
  283.    
  284.     for(i = 0; i <dda3; i++)
  285.     {        //if(i==0)
  286.                 printf("%s\n","DDA3");
  287.         printf("%f\n", DDA3[i]);
  288.         fprintf(fp3,"%f\n", DDA3[i]);
  289. //                }
  290. //                else
  291. //                {
  292. //        printf("%f\n", DDA3[i]);
  293. //        fprintf(fp3,"%f\n", DDA3[i]);
  294. //                }
  295.   
  296.     }
  297.    
  298.     for(i = 0; i <aad3; i++)
  299.     {        //if(i==0)
  300.                 printf("%s\n","AAD3");
  301.         printf("%f\n", AAD3[i]);
  302.         fprintf(fp4,"%f\n", AAD3[i]);        
  303. //                }
  304. //                else
  305. //                {
  306. //        printf("%f\n", AAD3[i]);
  307. //        fprintf(fp4,"%f\n", AAD3[i]);
  308. //                }
  309.   
  310.     }
  311.         
  312.         for(i = 0; i <dad3; i++)
  313.     {        //if(i==0)
  314.                 printf("%s\n","DAD3");
  315.         printf("%f\n", DAD3[i]);
  316.         fprintf(fp5,"%f\n", DAD3[i]);
  317. //                }
  318. //                else
  319. //                {        
  320. //        printf("%f\n", DAD3[i]);
  321. //        fprintf(fp5,"%f\n", DAD3[i]);
  322. //                }
  323.   
  324.     }
  325.    
  326.     for(i = 0; i <add3; i++)
  327.     {        //if(i==0)
  328.             printf("%s\n","ADD3");
  329.         printf("%f\n", ADD3[i]);
  330.         fprintf(fp6,"%f\n", ADD3[i]);
  331. //            }
  332. //            else
  333. //            {
  334. //        printf("%f\n", ADD3[i]);
  335. //        fprintf(fp6,"%f\n", ADD3[i]);
  336. //            }
  337. //               
  338.   
  339.     }
  340.    
  341.     for(i = 0; i <ddd3; i++)
  342.     {        //if(i==0)
  343.                 printf("%s\n","DDD3");
  344.         printf("%f\n", DDD3[i]);
  345.         fprintf(fp7,"%f\n", DDD3[i]);
  346. //                }
  347. //                else
  348. //                {
  349. //        printf("%f\n", DDD3[i]);
  350. //        fprintf(fp7,"%f\n", DDD3[i]);
  351. //                }
  352.   
  353.     }
  354.    
  355.     //关闭文件
  356.     fclose(fp);
  357.     fclose(fp0);
  358.     fclose(fp1);
  359.     fclose(fp2);
  360.     fclose(fp3);
  361.     fclose(fp4);
  362.     fclose(fp5);
  363.     fclose(fp6);
  364.     fclose(fp7);
  365. }


  366. /* run this program using the console pauser or add your own getch, system("pause") or input loop */

  367. /* 尝试不对
  368.    double A1[(LENGTH+DB_LENGTH)/2];
  369.         double D1[(LENGTH+DB_LENGTH)/2];
  370.         int a1=(LENGTH+DB_LENGTH)/2;
  371.         int d1=(LENGTH+DB_LENGTH)/2;
  372.         double AA2[(LENGTH+DB_LENGTH)/4];
  373.         double DA2[(LENGTH+DB_LENGTH)/4];
  374.         int a2=(LENGTH+DB_LENGTH)/4;
  375.         int d2=(LENGTH+DB_LENGTH)/4;
  376.         double AAA3[(LENGTH+DB_LENGTH)/8];
  377.         double DAA3[(LENGTH+DB_LENGTH)/8];
  378.         int a3=(LENGTH+DB_LENGTH)/8;
  379.         int d3=(LENGTH+DB_LENGTH)/8;
  380.         double AAAA4[(LENGTH+DB_LENGTH)/16];
  381.         double DAAA4[(LENGTH+DB_LENGTH)/16];

  382.     Covlution(input, h, temp, n, m);

  383.     for(i = 0; i < n+m-2; i += 2)
  384.     {
  385.         A1[i/2] = temp[i];//一层分解的低频部分,进行了2抽值 ,即尺度空间,低频概貌部分
  386.     }
  387.      Covlution(input, g, temp, n, m);

  388.     for(i =0 ; i < n+m-2; i +=2)
  389.     {
  390.            D1[i/2] = temp[i];//一层分解的高频部分,已经进行了2抽取,即高频细节部分
  391.     }
  392.    

  393.       
  394.     Covlution(A1, h, temp, a1, m);
  395.     for(i = 0; i < a1+m-2; i += 2)
  396.     {
  397.         AA2[i/2] = temp[i];//一层分解的低频部分,进行了2抽值 ,即尺度空间,低频概貌部分
  398.     }
  399.    
  400.     Covlution(A1, g, temp, a1, m);
  401.     for(i = 0; i < a1+m-2; i += 2)
  402.     {
  403.         DA2[i/2] = temp[i];//一层分解的低频部分,进行了2抽值 ,即尺度空间,低频概貌部分
  404.     }
  405.    
  406.    
  407.    
  408.      Covlution(AA2, h, temp, a2, m);
  409.     for(i = 0; i < a2+m-2; i += 2)
  410.     {
  411.         AAA3[i/2] = temp[i];//一层分解的低频部分,进行了2抽值 ,即尺度空间,低频概貌部分
  412.     }
  413.    
  414.     Covlution(AA2, g, temp, a2, m);
  415.     for(i = 0; i < a2+m-2; i += 2)
  416.     {
  417.         DAA3[i/2] = temp[i];//一层分解的低频部分,进行了2抽值 ,即尺度空间,低频概貌部分
  418.     }
  419.    
  420.    
  421.    
  422.    
  423.    
  424.      Covlution(AAA3, h, temp, a3, m);
  425.     for(i = 0; i < a3+m-2; i += 2)
  426.     {
  427.         AAAA4[i/2] = temp[i];//一层分解的低频部分,进行了2抽值 ,即尺度空间,低频概貌部分
  428.     }
  429.    
  430.     Covlution(AAA3, g, temp, a3, m);
  431.     for(i = 0; i < a3+m-2; i += 2)
  432.     {
  433.         DAAA4[i/2] = temp[i];//一层分解的低频部分,进行了2抽值 ,即尺度空间,低频概貌部分
  434.     }
  435.    
  436.      for(i = 0; i <4116; i++)
  437.     {
  438.             if(i<=259)
  439.       output[i] = AAAA4[i];
  440.       else if(i<=519)
  441.       output[i] = DAAA4[i-260];
  442.       else if(i<=1035)
  443.       output[i] = DAA3[i-520];
  444.       else if(i<=2064)
  445.      output[i] = DA2[i-1036];
  446.      else
  447.      output[i] = DA2[i-2065];
  448.    
  449.     }

  450. */        


复制代码


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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