shanghai 发表于 2006-6-12 16:24

求:小波函数C程序

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

[ 本帖最后由 zhlong 于 2007-6-4 21:51 编辑 ]

qqvirile 发表于 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;
    double h0=0.5,h1=0.5;
    double g0=-0.5,g1=0.5;
    if(!(outF=fopen("result.txt","wt")))
{
   printf("\nCant 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=Data[(2*j)%n]*h1+Data[(2*j+1)%n]*h0;


            tmp=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,a={1,2},a1={3,-1},b={0,0,0,0},b1={0,0,0,0},c,d;
    double h0=1,h1=1;
    double g0=1,g1=-1;
    int i,j;


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

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

void main()
{    FILE *dat;
   int a;
   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("+++++++approximatepart++++++++\n");
   fprintf(outF,"++++++++++approximatepart+++++++++\n");
   for(i=0;i<half;i++)
   {
       printf("%d\n",a);
      fprintf(outF,"%d\n",a);
   }
   printf("+++++++++detailpart+++++++++++\n");
       fprintf(outF,"++++++++++detailpart+++++++++\n");
      for(i=half;i<n;i++)
   {
       printf("%d\n",a);
      fprintf(outF,"%d\n",a);
   }
   IDWT(a,n);
       fclose(outF);
      getch();
            }

graduate 发表于 2008-12-5 16:08

c:\\33.txt",
什么格式的 ??

graduate 发表于 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;
    double h0=0.5,h1=0.5;
    double g0=-0.5,g1=0.5;
    if(!(outF=fopen("result.txt","wt")))
{
printf("\nCant 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=Data[(2*j)%n]*h1+Data[(2*j+1)%n]*h0;
   tmp=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小波的重构算法 */
{
    inta={1,2},a1={3,-1},b={0,0,0,0},b1={0,0,0,0},c,d;
    double h0=1,h1=1;
    double g0=1,g1=-1;
    int i,j;


for(i=0;i<4;i+=2)
    {
b=a;
b1=a1;
}
    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=b[(j)%n]*h1+b[(j+1)%n]*h0;
d=b1[(j)%n]*g1+b1[(j+1)%n]*g0;
Data=c+d;
}
printf("++++++++++recombination+++++++++\n");
fprintf(outF,"++++++++++recombination+++++++++\n");
for(j=0;j<4;j++)
printf("%d\n",Data);
for(i=0;i<4;i++)
fprintf(outF,"%d\n",Data);
}
void main()
{   
FILE *dat;
int a;
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("+++++++approximatepart++++++++\n");
fprintf(outF,"++++++++++approximatepart+++++++++\n");
for(i=0;i<half;i++)
{
printf("%d\n",a);
fprintf(outF,"%d\n",a);
}
printf("+++++++++detailpart+++++++++++\n");
fprintf(outF,"++++++++++detailpart+++++++++\n");
for(i=half;i<n;i++)
{
printf("%d\n",a);
fprintf(outF,"%d\n",a);
}
IDWT(a,n);
fclose(outF);
getch();
}

和matlab结果不一致

qqvirile 发表于 2008-12-6 09:48

回复 地板 graduate 的帖子

不一样是这样的 因为 我在写反变换的程序中有规定的几个数
实质上我的程序是正确的 你要做点修改 在程序中有一段是在反变换程序中调用正变换的结果
我的33.txt中的数字是4 -2 1 3
我的程序之所以运行的重构结果是4 -2 1 3
是因为我在反变换中没有调用正变换的结果 而直接赋值为inta={1,2},a1={3,-1},
所以你要用这个程序 要做的只有一点:
将反变换中的程序中的a和a1换成正变换中的返回值!!!!
由于我编这个是为了熟悉算法的 所以我就没有继续改 你自己改改吧 这个程序是对的 仅仅是返回值那你要自己做

robeta80 发表于 2011-8-16 11:52

兄弟 我想请教一下小波去噪的 算法 问题,,可不可以交流下
QQ?

qicaimi55 发表于 2012-3-8 16:16

学习下,正在找小波的C程序
页: [1]
查看完整版本: 求:小波函数C程序