24小时热门版块排行榜    

CyRhmU.jpeg
南方科技大学公共卫生及应急管理学院2026级博士研究生招生报考通知(长期有效)
查看: 319  |  回复: 2
当前主题已经存档。

winner00

铁杆木虫 (著名写手)

[交流] 【求助】求助C++算法 互相关 FFT变换【已完结】

求助C++算法 互相关   FFT变换
求两个信号的互相关函数数据,并且如果是两个数据之间存在时间漂移 得到漂移量。   对两个信号量的 FFT 变换
请高手指点一二
谢谢
有程序最好啦
谢谢你大虾


yufeng8121@sina.com.cn

[ Last edited by 波不动 on 2009-11-26 at 13:02 ]
回复此楼
上天可以赐食于鸟,但决不会置食于鸟巢;只有自己亲自去寻找,才会得到那最美味的“佳肴”!
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

波不动

木虫 (正式写手)

Wave No Move

★ ★ ★ ★ ★ ★ ★ ★ ★
余泽成(金币+1,VIP+0):谢谢应助! 11-25 23:32
winner00(金币+8,VIP+0):非常感谢你的回复 11-26 12:59
这我经常用的两个C++语言的代码,一个是最简单的互相关函数,一个是FFT的函数。有问题的话,请跟帖回复。
CODE:
//相关计算(计算x[n]与h[m]的互相关,结果为y[n])
void cor(double *x,int n,double *h,int m,double *y)
{
        int i,j;
        for(i=0;i         {
                y[i]=0.0;
                for(j=0;j                 {
                        if(i<=j)
                                y[i]+=x[j]*h[j-i];
                }
        }
}

CODE:
//                    一维快速傅里叶变换程序(kfft)                       
// n=采样点数;K=蝶形维数;l=0正变换,1反变换;il=0输出为频谱,1输出振幅谱和相位谱
void kfft(float pr[],float pi[],int n,int k,float fr[],float fi[],int l,int il)
  { int it,m,is,i,j,nv,l0;
    float p,q,s,vr,vi,poddr,poddi;
    for (it=0; it<=n-1; it++)
      { m=it; is=0;
        for (i=0; i<=k-1; i++)
          { j=m/2; is=2*is+(m-2*j); m=j;}
        fr[it]=pr[is]; fi[it]=pi[is];
      }
    pr[0]=1.0; pi[0]=0.0;
    p=6.283185306/(1.0*n);
    pr[1]=cos(p); pi[1]=-sin(p);
    if (l!=0) pi[1]=-pi[1];
    for (i=2; i<=n-1; i++)
      { p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1];
        s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
        pr[i]=p-q; pi[i]=s-p-q;
      }
    for (it=0; it<=n-2; it=it+2)
      { vr=fr[it]; vi=fi[it];
        fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1];
        fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1];
      }
    m=n/2; nv=2;
    for (l0=k-2; l0>=0; l0--)
      { m=m/2; nv=2*nv;
        for (it=0; it<=(m-1)*nv; it=it+nv)
          for (j=0; j<=(nv/2)-1; j++)
            { p=pr[m*j]*fr[it+j+nv/2];
              q=pi[m*j]*fi[it+j+nv/2];
              s=pr[m*j]+pi[m*j];
              s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
              poddr=p-q; poddi=s-p-q;
              fr[it+j+nv/2]=fr[it+j]-poddr;
              fi[it+j+nv/2]=fi[it+j]-poddi;
              fr[it+j]=fr[it+j]+poddr;
              fi[it+j]=fi[it+j]+poddi;
            }
      }
    if (l!=0)
      for (i=0; i<=n-1; i++)
        { fr[i]=fr[i]/(1.0*n);
          fi[i]=fi[i]/(1.0*n);
        }
    if (il!=0)
      for (i=0; i<=n-1; i++)
        { pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
          if (fabs(fr[i])<0.000001*fabs(fi[i]))
            { if ((fi[i]*fr[i])>0) pi[i]=90.0;
              else pi[i]=-90.0;
            }
          else
            pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;
        }
    return;
  }

[ Last edited by 波不动 on 2009-11-25 at 22:47 ]
端好自己的碗,吃好自己的饭。
2楼2009-11-25 22:46:23
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

波不动

木虫 (正式写手)

Wave No Move

★ ★ ★
余泽成(金币+1,VIP+0):辛苦了! 11-25 23:32
winner00(金币+2,VIP+0):感谢啦 11-26 13:00
如果两个相同信号存在时移,输出时移量的问题,其实就是相当于求得的相关结果的极大值对应的时间值,就是回波信号的延迟时间。
只要将程序改一下就可以实现了!你可以自己试一下,判断得到的相关结果y的极大值的时间然后输出来!!

[ Last edited by 波不动 on 2009-11-25 at 22:57 ]
端好自己的碗,吃好自己的饭。
3楼2009-11-25 22:54:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 winner00 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见