声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2573|回复: 6

[小波] 求:小波函数C程序

[复制链接]
发表于 2006-6-12 16:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
求有关各种小波函数的C程序, 例如Morlet小波,草帽小波,Haar等小波函数,请大家多帮忙,谢谢!!!

[ 本帖最后由 zhlong 于 2007-6-4 21:51 编辑 ]
回复
分享到:

使用道具 举报

发表于 2008-12-3 14:08 | 显示全部楼层

回复 楼主 shanghai 的帖子

虽然帖子过期了 我还是回一下吧 这个程序是我前几天做的!在函数调用上有一点点问题。
自己改一下就能用了!!我的输入数据是从文件输入的!



#include "math.h"
#include "stdio.h"
#include "conio.h"
FILE  *outF;
int DB4DWT(int Data[],int n)      /*  Haar小波的分解算法 */
{
    int i,j;
    int half=n>>1;
    int tmp[4];
    double h0=0.5,h1=0.5;
    double g0=-0.5,g1=0.5;
    if(!(outF=fopen("result.txt","wt")))
{
     printf("\n  Cant open the out file\n");
     exit(0);
     }

    printf("\nthe filter of wavelet\n");
    fprintf(outF,"the filter of wavelet\n");

    if(n>=4)
    {
        for(j=0;j<half;j++)
        {
            tmp[j]=Data[(2*j)%n]*h1+Data[(2*j+1)%n]*h0;


            tmp[j+half]=Data[(2*j)%n]*g1+Data[(2*j+1)%n]*g0;


         }

        for(i=0;i<n;i++)
        {
            Data=tmp;

        }


    }

   

}

void IDWT(int Data[],int n)         /*  Haar小波的重构算法 */
{
    int t,shuju[4],a[2]={1,2},a1[2]={3,-1},b[4]={0,0,0,0},b1[4]={0,0,0,0},c[4],d[4];
    double h0=1,h1=1;
    double g0=1,g1=-1;
    int i,j;


     for(i=0;i<4;i+=2)
    {
    b[i+1]=a[i/2];
    b1[i+1]=a1[i/2]  ;

      }
    printf("++++++++++up sampling+++++++++++\n");
    fprintf(outF,"++++++++++up sampling+++++++++++\n");
    for(i=0;i<4;i++)
    {
     printf("%d %d\n",b,b1);
       fprintf(outF,"%d %d\n",b,b1);

     }
    n=4;
    for(j=0;j<4;j++)
    {
    c[j]=b[(j)%n]*h1+b[(j+1)%n]*h0;
    d[j]=b1[(j)%n]*g1+b1[(j+1)%n]*g0;
    Data[j]=c[j]+d[j];
}
      printf("++++++++++recombination+++++++++\n");
      fprintf(outF,"++++++++++recombination+++++++++\n");
      for(j=0;j<4;j++)
      printf("%d\n",Data[j]);
      for(i=0;i<4;i++)
      fprintf(outF,"%d\n",Data);
      }

void main()
{    FILE *dat;
     int a[4];
     int i,n=4;  int half=n>>1;
     if((dat=fopen("c:\\33.txt","rt"))==NULL){
      printf("open file error");
      getch();
      exit(1);}
      for(i=0;i<4;i++){
      fscanf(dat,"%d",&a);
      }
fclose(dat);
printf("data:");for(i=0;i<4;i++){
printf("  %d   ",a);
}
getchar();

         DB4DWT(a,n);
    printf("+++++++approximate  part++++++++\n");
   fprintf(outF,"++++++++++approximate  part+++++++++\n");
   for(i=0;i<half;i++)
   {
       printf("%d\n",a);
      fprintf(outF,"%d\n",a);
     }
     printf("+++++++++detail  part+++++++++++\n");
       fprintf(outF,"++++++++++detail  part+++++++++\n");
        for(i=half;i<n;i++)
   {
       printf("%d\n",a);
      fprintf(outF,"%d\n",a);
     }
     IDWT(a,n);
       fclose(outF);
        getch();
            }
发表于 2008-12-5 16:08 | 显示全部楼层
c:\\33.txt",
什么格式的 ??
发表于 2008-12-5 16:15 | 显示全部楼层

修改后的代码

#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <conio.h>
FILE  *outF;
int DB4DWT(int Data[],int n)      /*  Haar小波的分解算法 */
{
    int i,j;
    int half=n>>1;
    int tmp[4];
    double h0=0.5,h1=0.5;
    double g0=-0.5,g1=0.5;
    if(!(outF=fopen("result.txt","wt")))
{
  printf("\n  Cant open the out file\n");
  exit(0);
}

    printf("\nthe filter of wavelet\n");
    fprintf(outF,"the filter of wavelet\n");

    if(n>=4)
    {
        for(j=0;j<half;j++)
        {
            tmp[j]=Data[(2*j)%n]*h1+Data[(2*j+1)%n]*h0;
   tmp[j+half]=Data[(2*j)%n]*g1+Data[(2*j+1)%n]*g0;
  }
  
        for(i=0;i<n;i++)
        {
            Data=tmp;
   
        }
}

    return 0;
}
void IDWT(int Data[],int n)         /*  Haar小波的重构算法 */
{
    int  a[2]={1,2},a1[2]={3,-1},b[4]={0,0,0,0},b1[4]={0,0,0,0},c[4],d[4];
    double h0=1,h1=1;
    double g0=1,g1=-1;
    int i,j;


for(i=0;i<4;i+=2)
    {
  b[i+1]=a[i/2];
  b1[i+1]=a1[i/2]  ;
}
    printf("++++++++++up sampling+++++++++++\n");
    fprintf(outF,"++++++++++up sampling+++++++++++\n");
    for(i=0;i<4;i++)
    {
  printf("%d %d\n",b,b1);
  fprintf(outF,"%d %d\n",b,b1);
  
}
    n=4;
    for(j=0;j<4;j++)
    {
  c[j]=b[(j)%n]*h1+b[(j+1)%n]*h0;
  d[j]=b1[(j)%n]*g1+b1[(j+1)%n]*g0;
  Data[j]=c[j]+d[j];
}
printf("++++++++++recombination+++++++++\n");
fprintf(outF,"++++++++++recombination+++++++++\n");
for(j=0;j<4;j++)
  printf("%d\n",Data[j]);
for(i=0;i<4;i++)
  fprintf(outF,"%d\n",Data);
}
void main()
{   
FILE *dat;
int a[4];
int i,n=4;  int half=n>>1;
if((dat=fopen("c:\\33.txt","rt"))==NULL){
  printf("open file error");
  getch();
  exit(1);}
for(i=0;i<4;i++){
  fscanf(dat,"%d",&a);
}
fclose(dat);
printf("data:");
for(i=0;i<4;i++){
  printf("  %d   ",a);
}
getchar();

DB4DWT(a,n);
printf("+++++++approximate  part++++++++\n");
fprintf(outF,"++++++++++approximate  part+++++++++\n");
for(i=0;i<half;i++)
{
  printf("%d\n",a);
  fprintf(outF,"%d\n",a);
}
printf("+++++++++detail  part+++++++++++\n");
fprintf(outF,"++++++++++detail  part+++++++++\n");
for(i=half;i<n;i++)
{
  printf("%d\n",a);
  fprintf(outF,"%d\n",a);
}
IDWT(a,n);
fclose(outF);
getch();
}

和matlab结果不一致
haar.JPG
发表于 2008-12-6 09:48 | 显示全部楼层

回复 地板 graduate 的帖子

不一样是这样的 因为 我在写反变换的程序中有规定的几个数
实质上我的程序是正确的 你要做点修改 在程序中有一段是在反变换程序中调用正变换的结果
我的33.txt中的数字是4 -2 1 3
我的程序之所以运行的重构结果是4 -2 1 3
是因为我在反变换中没有调用正变换的结果 而直接赋值为int  a[2]={1,2},a1[2]={3,-1},
所以你要用这个程序 要做的只有一点:
将反变换中的程序中的a[2]和a1[2]换成正变换中的返回值!!!!
由于我编这个是为了熟悉算法的 所以我就没有继续改 你自己改改吧 这个程序是对的 仅仅是返回值那你要自己做
发表于 2011-8-16 11:52 | 显示全部楼层
兄弟 我想请教一下小波去噪的 算法 问题,,可不可以交流下
QQ?
发表于 2012-3-8 16:16 | 显示全部楼层
学习下,正在找小波的C程序
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-16 07:26 , Processed in 0.063092 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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