互相关函数的计算

整理不易,有条件的点个关注、点个赞呗!感恩各位大哥!

互相关函数的定义

描述两个不同的信号在不同时期上的相关性的函数,主要应用:

  • 混有周期成分数据(信号)的频率(周期)提取,例如两列数据在其中一列数据滞后三期时相关性最高,则该类数据的周期为3。

互相关函数的计算

公式:
C 1 , 2 ( t ) ≈ ∫ 0 t c v 1 ( τ ) v 2 ( t + τ ) d τ (1) C_{1,2}(t)\approx\int_{0}^{t_{c}}v_{1}(\tau)v_{2}(t+\tau)d\tau\tag{1} C1,2(t)0tcv1(τ)v2(t+τ)dτ(1)
实际计算举例,本实验中主要针对采用傅里叶变换的循环互相关,因此后续以循环互相关为例进行讲解!
循环互相关的思想如下:
在这里插入图片描述
注意到在计算时要用到超出原始数据索引范围的数据,其数据补充方式并不是“补零”而是“周期延拓”。
循环互相关实际则通过傅里叶变换进行计算,将上述两列数据分别变换到频率域,从而得到频率域同等长度的两列数据 [ 10. + 0. j − 2.5 + 3.4409548 j − 2.5 + 0.81229924 j ] , [ 10. + 0. j − 2.5 + 3.4409548 j − 2.5 + 0.81229924 j ] [10. +0.j -2.5+3.4409548j -2.5+0.81229924j],[10. +0.j -2.5+3.4409548j -2.5+0.81229924j] [10.+0.j2.5+3.4409548j2.5+0.81229924j][10.+0.j2.5+3.4409548j2.5+0.81229924j],则输出互相关矩阵为第一个元素为:
( 10 ∗ 10 + 0 j ∗ 0 j ) + ( 10 ∗ 0 j − 0 j ∗ 10 ) = ( 100 + 0 j ) (10*10+0j*0j)+(10*0j-0j*10)=(100+0j) (1010+0j0j)+(100j0j10)=(100+0j),同理第二个元素为 ( − 2.5 ∗ − 2.5 + 3.4409548 j ∗ 3.4409548 j ) + ( − 2.5 ∗ 3.4409548 j + 2.5 ∗ 3.4409548 j ) (-2.5*-2.5+3.4409548j *3.4409548j )+(-2.5*3.4409548j+2.5*3.4409548j) 2.52.5+3.4409548j3.4409548j+2.53.4409548j+2.53.4409548j)

存在具体项目参数时

计算方式一:

            for c in range(len(irover)):
                # ================= Non center Station Index =================
                Atr=st[irover[c]]
                # ================= Location =================
                # ================= Do FFT at non center =================
                freq_rover, time_rover, Sxx_rover_ = sg.spectrogram(Atr.data  ,
                                                                    nperseg=wd, # 窗口大小,对应fftlen
                                                                    noverlap=0, # noverlap对应overlaprate,但是noverlap是具体值,overlaprate是重叠率
                                                                    nfft=nft, # 实际就是窗口大小,表示是否对数据进行填充。
                                                                    fs=Fs, # 频率,暂时不清楚频率在计算中的作用
                                                                    scaling='spectrum', # 输出设置为功率谱
                                                                    mode='complex')
                
                # ======== Find Data in range output frequency ===========
                Sxx_rover_=Sxx_rover_[idx]
                
                # ================= Measure AutoCorrelation Ratio ================
                rat_autocorr=np.zeros((len(Sxx_pusat_[:,0]),len(Sxx_pusat_[0,:])), dtype=np.complex)
                for nwd in range(len(Sxx_pusat_[0,:])):
                    Abs_Sxx_pusat=(abs(Sxx_pusat_[:,nwd]))
                    Smooth_Abs_Sxx_pusat=sg.convolve(Abs_Sxx_pusat,smooth,mode='same')
                    
                    Abs_Sxx_rover=(abs(Sxx_rover_[:,nwd]))
                    Smooth_Abs_Sxx_rover=sg.convolve(Abs_Sxx_rover,smooth,mode='same')
                    
                    rat_autocorr[:,nwd]=((Sxx_pusat_[:,nwd]*np.conj(Sxx_rover_[:,nwd]))/
                                (Smooth_Abs_Sxx_pusat*Smooth_Abs_Sxx_rover))
                    
                time_autocorr=np.mean(rat_autocorr,axis=1)
                autocorr[:,c]=time_autocorr   

计算方式二:

for(long i=0;i<d.nsta;i++){
            if(((k*d.steplen)>=d.startend[i*2])&&((k*d.steplen+d.fftlen)<d.startend[i*2+1]))
            {
                ifCC[i] = 1;
            }
            else
            {
                ifCC[i] = 0;   
            }
            
            if (ifCC[i]){
                for(long j=0;j<d.fftlen;j++){
                    in[i][j] = d.data[j+k*d.steplen+d.npts*i];
                }
                fftwf_execute(p[i]);
                if(d.ifspecwhitenning){
                    for (long j=0;j<d.nf;j++){
                        absv = sqrtf(out[i][j*d.fstride][0]*out[i][j*d.fstride][0]+out[i][j*d.fstride][1]*out[i][j*d.fstride][1]);
                        absv = max(absv,1e-8f);
                        if(absv!=0){
                            datar[j+d.nf*i] = out[i][j*d.fstride][0]/absv;
                            datai[j+d.nf*i] = out[i][j*d.fstride][1]/absv;
                        }
                    }
                }
                else{
                    for(long j=0;j<d.nf;j++){
                        datar[j+d.nf*i] = out[i][j*d.fstride][0];
                        datai[j+d.nf*i] = out[i][j*d.fstride][1];
                    }
                }
            }
        }
#ifdef useOMP
#pragma omp parallel
#pragma omp for
#endif
        for(long i=0;i<npairs; i++){
            if(ifCC[d.Pairs[i*2]]&ifCC[d.Pairs[i*2+1]]){
                for(long j=0;j<d.nf;j++){
                    d.ncfsr[j+i*d.nf] += datar[j+d.Pairs[i*2]*d.nf]*datar[j+d.Pairs[i*2+1]*d.nf] + datai[j+d.Pairs[i*2]*d.nf]*datai[j+d.Pairs[i*2+1]*d.nf];
                    d.ncfsi[j+i*d.nf] += datar[j+d.Pairs[i*2]*d.nf]*datai[j+d.Pairs[i*2+1]*d.nf] - datai[j+d.Pairs[i*2]*d.nf]*datar[j+d.Pairs[i*2+1]*d.nf];
                }
                CCnumbers[i] = CCnumbers[i] + 1;
            }
        }
    }

相同之处:均采用傅里叶变换求解
不同之处:方法二窗口的指定是在傅里叶变换函数包的外面,且其将数据集切分为每步再传入傅里叶变换函数。方法一在傅里叶变换中指定数据窗口大小和每次移动步长,暂时不知道这两种方式是否具有差异。

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值