切换到宽版
  • 3500阅读
  • 7回复

希尔伯特变换c程序例子 [复制链接]

上一主题 下一主题
离线baobiao007
 
发帖
29
财富
1
威望
0
交易币
0
只看楼主 倒序阅读 使用道具 0楼 发表于: 2011-02-13 | 石油求职招聘就上: 阿果石油英才网
— 本帖被 阿果 从 石油地质 移动到本区(2011-09-29) —
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include"FFT1.h"
const int L=4;//信号长度
//x初始序列,也存变换结果序列
void HT(float x[],int num)
{
    float *xi,*x1r, *x1i, *sgn;
    int i,k;
    k=log(num)/log(2);
                     xi=(float *)calloc(num,sizeof(float));
    x1r=(float *)calloc(num,sizeof(float));
    x1i=(float *)calloc(num,sizeof(float));
    sgn=(float *)calloc(num,sizeof(float));
    //apply FFT to x[]
    fft(x,xi,k,1);
                     //construct sgn[]
    for( i=1; i<num/2; i++)
        sgn=1.0;
    for(i=num/2+1; i<num; i++)
        sgn=-1.0;
    //X(k)sgn(k)
    for(i=0; i<num; i++)
    {
        x1r=x*sgn;
        x1i=xi*sgn;
    }
    //apply IFFT to x1
    fft(x1r,x1i,k,-1);
    for(i=0; i<num; i++)
          x= x1i;
                      free(x1r);
    free(x1i);
    free(sgn);
    free(xi);
}
void main()
{
    float x[L]={1,2,3,4};
    float xx[L];
    int i;
    for(i=0; i<L; i++)
            xx=x;
    HT(x,L);
    printf("Hilbert变换得到的解析信号为:\n");
    for(i=0; i<L; i++)
             printf("%f+i(%f)\n",xx,x);
}
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
离线pk_dislone
发帖
72
财富
129
威望
0
交易币
0
只看该作者 1楼 发表于: 2011-02-14 | 石油求职招聘就上: 阿果石油英才网
挺好的 比较简单 适合学习
离线tophic
发帖
40
财富
11
威望
5
交易币
0
只看该作者 2楼 发表于: 2011-02-14 | 石油求职招聘就上: 阿果石油英才网
好资料
谢谢
离线上海市长
发帖
504
财富
115
威望
8
交易币
0
只看该作者 3楼 发表于: 2011-02-14 | 石油求职招聘就上: 阿果石油英才网
不写程序好多年了!
离线aguoguo
发帖
180
财富
0
威望
0
交易币
0
只看该作者 4楼 发表于: 2011-02-14 | 石油求职招聘就上: 阿果石油英才网
学习了。
离线glr2008
发帖
170
财富
191
威望
2
交易币
0
只看该作者 5楼 发表于: 2011-02-14 | 石油求职招聘就上: 阿果石油英才网
回 楼主(baobiao007) 的帖子
#include"FFT1.h"
fft()
这两个程序呢?
离线baobiao007
发帖
29
财富
1
威望
0
交易币
0
只看该作者 6楼 发表于: 2011-02-14 | 石油求职招聘就上: 阿果石油英才网
回 5楼(glr2008) 的帖子
"FFT1.h" 就是快速傅里叶变换的函数:

//sr-存初始序列,也存结果的实部;inv=1,正变换,-1,反变换;
//反变换后sr存实序列
void fft(float sr[],float sx[],int m0,int inv)
{
int i,j,lm,li,k,lmx,np,lix,mm2;
double t1,t2,c,s,cv,st,ct;
double PI=3.1415926;
if(m0<0)
  return;
lmx=1;
for(i=1;i<=m0;++i)
        lmx+=lmx;   //form 2**m0
    cv=2.0*PI/(double)lmx;
ct=cos(cv); st=-inv*sin(cv);
np=lmx;mm2=m0-2;
/* fft butterfly numeration */
for(i=1;i<=mm2;++i)
{
  lix=lmx;lmx/=2;
  c=ct;s=st;
  for(li=0;li<np;li+=lix)
  {
   j=li;k=j+lmx;
   t1=sr[j]-sr[k];t2=sx[j]-sx[k];
   sr[j]+=sr[k];sx[j]+=sx[k];sr[k]=t1;sx[k]=t2;
   ++j;++k;
   t1=sr[j]-sr[k];t2=sx[j]-sx[k];
   sr[j]+=sr[k];sx[j]+=sx[k];
   sr[k]=c*t1-s*t2;sx[k]=s*t1+c*t2;
  }
  for(lm=2;lm<lmx;++lm)
  {
   cv=c;c=ct*c-st*s;s=st*cv+ct*s;
   for(li=0;li<np;li+=lix)
   {
    j=li+lm;k=lmx+j;
    t1=sr[j]-sr[k];t2=sx[j]-sx[k];
    sr[j]+=sr[k];sx[j]+=sx[k];
    sr[k]=c*t1-s*t2;sx[k]=s*t1+c*t2;
   }
  }
  cv=ct;ct=2.0*ct*ct-1.0;st=2.0*st*cv;
}
/* 4 points DFT */
if(m0>=2)
for(li=0;li<np;li+=4)
{
  j=li;k=j+2;
  t1=sr[j]-sr[k];t2=sx[j]-sx[k];
  sr[j]+=sr[k];
  sx[j]+=sx[k];
  sr[k]=t1;sx[k]=t2;
  ++j;++k;
  t1=sr[j]-sr[k];t2=sx[j]-sx[k];
  sr[j]+=sr[k];sx[j]+=sx[k];
  sr[k]=inv*t2;sx[k]=-inv*t1;
}
/* 2 points DFT */
for(li=0;li<np;li+=2)
{
  j=li;k=j+1;
  t1=sr[j]-sr[k];t2=sx[j]-sx[k];
  sr[j]+=sr[k];sx[j]+=sx[k];
  sr[k]=t1;sx[k]=t2;
}
/* sort according to bit reversal */
lmx=np/2;j=0;
for(i=1;i<np-1;++i)
{
  k=lmx;
  while(k<=j)
  {
   j-=k;k/=2;
  }
  j+=k;
  if(i<j)
  {
   t1=sr[j];sr[j]=sr;sr=t1;
   t1=sx[j];sx[j]=sx;sx=t1;
  }
}
/*  if Inverse FFT, multiply 1.0/np  */
if(inv!=-1)
  return;
t1=1.0/np;
for(i=0;i<np;++i)
{
  sr*=t1;sx*=t1;
}
}
离线longxiao
发帖
982
财富
2401
威望
8
交易币
0
只看该作者 7楼 发表于: 2011-02-14 | 石油求职招聘就上: 阿果石油英才网
学习了,谢谢楼主分享
人一定要靠自己,因为在黑暗中,连自己的影子都会离开你!

网站事务咨询:QQ:1392013 | 26189883
阿果石油网为免费个人网站,为石油人提供免费的在线即时技术交流场所,拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论和行为!
如有言论或会员共享的资料涉及到您的权益,请立即通知网站管理员,本站将在第一时间给予配合处理,谢谢!