精华内容
下载资源
问答
  • 广义互相关算法如何用C语言实现? 在声音测距的原理中,我们可以利用麦克风对采集的声音信号利用互相关算法测出音源与麦克风距离的差值,而大致求出音源的方位。这也是第十五届智能车竞赛声音信标组寻灯的基础,因为...

    广义互相关算法用FFT加速的C语言实现

    在声音测距的原理中,我们可以利用麦克风对采集的声音信号利用互相关算法测出音源与麦克风距离的差值,而大致求出音源的方位。这也是第十五届智能车竞赛声音信标组定位的基础,因为我参加的是这个组别,所以当时在这方面找了很多相关的资料互相关的原理基本上懂,但是用C语言实现起来感觉和书本上的知识结合不了,但是真的运气好,试了很多很多次,终于写出来了,可能是乐于分享的人运气都不会太差吧,O(∩_∩)O哈哈~

    小说明:我的这个代码不是完整的工程,只是把核心的互相关算法及一些相关的代码分享出来了,是基于单片机的,具体的实践还要靠大家自己来结合,这个对于大家应该就是小意思了吧,哈哈。在其中我是用了FFT加速,因为采集的数据比较多,不用FFT加速的话会花费大量的CPU的处理时间,至于FFT算法,网上有很多,我这里就不写了。

    //采样点数和FFT运算的点数最好都为2的N次方,且FFT_Pointer =2*Sampling_Num 
    #define Sampling_Num 2048
    #define FFT_Pointer 4096
    
    int Mic12_Delay;
    int Mic34_Delay;
    uint Max_Array_Num=0;            //互相关运算得到的最大值对应的数组下标 
    //以下这些参与FFT运算的数组占用的内存相当大(6*4*2*4096=192K),为了减小内存的话可以相互覆盖掉,我这里是为了让大家明白各个数组的作用
    cfloat32 Mic1_fftIn[FFT_Pointer];//麦克风Mic1参与FFT的时域输入数组
    cfloat32 Mic2_fftIn[FFT_Pointer];//麦克风Mic2参与FFT的时域输入数组
    cfloat32 Mic1_fftOut[FFT_Pointer];//Mic1经过FFT之后得到的频域输出数组
    cfloat32 Mic2_fftOut[FFT_Pointer];//Mic2经过FFT之后得到的频域输出数组
    cfloat32 Mic1_ifftMul[FFT_Pointer];//FFT运算之后两个信号频域的乘积
    cfloat32 Mic_ifftOut[FFT_Pointer];//最终经IFFT运算(FFT的逆变换)之后得到的时域信号
    //定义浮点型复数的实部和虚部部分,因为FFT过程中既有实数也有复数
    typedef struct
    {
        float real;               /**< \brief Real part */
        float imag;               /**< \brief Imaginary part */
    } cfloat32;
    //两个复数相乘
    cfloat32 mul(cfloat32 a, cfloat32 b)
    {
    	cfloat32 c;
        c.real = a.real*b.real - a.imag*b.imag;
        c.imag = a.real*b.imag + a.imag*b.real;
        return c;
    }
    
    //复数求出幅值
    float Absolute_Value(cfloat32 a)
    {
       	float i,j;
       	float value;
       	i=a.real*a.real;
       	j=a.imag*a.imag;
       	value=i+j;
       	return value;
    }
    /*********************************************************
     ********************* 核心函数 **************************
     * 函数功能:1.Mic1和Mic2采集麦克风数据
     *          2.利用FFT通过互相关算法求出时延差
     ********************************************************/
    void Mic12_ADC_Data_Handle(void)
    {
    	uint i;
    	uint array[3];
    	float MIC_ifftOut[FFT_Pointer];   //互相关运算的结果的模,因为结果可能为复数,参与运算要化为实数
    	float Mic_max=0.0;
    	for(i=0;i<Sampling_Num;i++)
    	{
    		Mic1_fftIn[i].real               =ADC_Read(ADC1);  //读取麦克风1的AD值存到数组中,数组顺序由小(0)到大(Sampling_Num-1)
    		Mic2_fftIn[Sampling_Num-i-1].real=ADC_Read(ADC2);  //读取麦克风2的AD值存到数组中,数组顺序由大(Sampling_Num-1)到小(0)
    		Mic1_fftIn[i+Sampling_Num].real  =0;    //补零,参与FFT的数组长度为2倍采样AD值的数组长度,即采样2048个点,但是参与FFT的有4096个点
    		Mic1_fftIn[i].imag               =0;    //虚部全部为0
    		Mic1_fftIn[i+Sampling_Num].imag  =0;    //虚部全部为0
    		Mic2_fftIn[i+Sampling_Num].real  =0;    //补零,参与FFT的数组长度为2倍采样AD值的数组长度
    		Mic2_fftIn[Sampling_Num-i-1].imag=0;    //虚部全部为0
    		Mic2_fftIn[i+Sampling_Num].imag  =0;    //虚部全部为0
    		
            //将采集到的声音信号通过波形图实时显示
    /*		array[0]=(uint)Mic1_fftIn[i].real;
    		array[1]=(uint)Mic2_fftIn[Sampling_Num-i-1].real+4096;
    		array[2]=4096;
    		virtual_Osc_send_array(array,3);*/
    	}
    	FFT(Mic1_fftOut, Mic1_fftIn, FFT_Pointer);     //Mic1的FFT正变换
    	FFT(Mic2_fftOut, Mic2_fftIn, FFT_Pointer);     //Mic2的FFT正变换
    	for(i=0;i<FFT_Pointer;i++)
    	{
    		Mic1_ifftMul[i]=mul(Mic1_fftOut[i],Mic2_fftOut[i]);      //两个信号频域的乘积
    	}
    	IFFT(Mic_ifftOut, Mic1_ifftMul, FFT_Pointer);  //FFT的逆变换
    	for(i=0;i<FFT_Pointer;i++)
    	{
    		MIC_ifftOut[i]=Absolute_Value(Mic_ifftOut[i]);           //取模值,因为经过IFFT之后得到的可能为复数,不好比较大小,所以通过取模值化为实数
    	}
    	for(i=0;i<FFT_Pointer;i++)
    	{
    		if(MIC_ifftOut[i]>Mic_max)
    		{
    			Mic_max=MIC_ifftOut[i];            //找出幅值最大的点,此即为相关性最好的点
    			Max_Array_Num=i;                   //相关性最好的点对应的数组下标
    		}
    	}
    	//Max_Array_Num为基准线,通过比较Sampling_Num-1在Max_Array_Num的上下方得出音源距离Mic1与Mic2距离的差值
    	Mic12_Delay=Max_Array_Num-Sampling_Num+1;  //得到时延的下标差
    
    	//山外虚拟示波器画图,发送函数在我的另一篇博客串口发送中有介绍
    /*	array[0]=Max_Array_Num;
    	array[1]=Sampling_Num-1;
    	virtual_Osc_send_array(array,2);*/
    }
    

    好了,以上就是利用互相关算法求时延差的C语言算法,代码的备注我已经尽可能的加在相应代码之后了,如果大家还有不懂的欢迎下方留言或者私信给我,尽量我懂的地方让大家也能懂!或者有什么不对的地方欢迎大家指出,我们共同进步!
    在这里插入图片描述

    展开全文
  • 广义加权相关时延估计(GCC):主要是提高了信噪比。相关函数和功率谱密度函数是一对傅里叶变换对
  • 杨韬 余文辉 曹申 2020-09-30 Wednesday   00摘要 针对2020年第十五届全国大学生智能车竞赛信标组关于声音信...为了增加系统的抗干扰性,我们使用了广义互相关算法,有效抑制了噪声和混响的干扰。 关键词:级联F.

    杨韬 余文辉 曹申
    2020-09-30 Wednesday
     

    00摘要

      对2020年第十五届全国大学生智能车竞赛信标组关于声音信标的识别,需要采集声音信号和FM信号,通过声音信号和FM信号互相关进行距离检测和通过两组声音信号互相关进行信标方位判断。

      实际中,是在频域中对两组信号做乘法求最大值,而将时域信号变换为频域信号需要经过FFT变换,本系统引入一种新的级联FFT变换,大大提高了计算速度和效率。为了增加系统的抗干扰性,我们使用了广义互相关算法,有效抑制了噪声和混响的干扰。

      关键词:级联FFT;广义互相关;计算速度;

    01引言

      速傅里叶变换(FFT)本身便是利用了离散傅里叶变换(DFT)中的对称性和周期性,大大缩短了傅里叶变换的时长,这使得FFT成为基本的信号处理算法。

      在2020年第十五届全国智能车竞赛中,信标组的比赛模式发生了很大的变化,从原始的识别一定频率的光信号变为周期性的250~2000Hz的Chirp声音信号和对应的FM调频信号。信标发出的信号的变化导致了信号识别和处理模式的变化,由原来识别光信号使用摄像头,变为接收声音信号的麦克风模块及接收FM信号的FM解调模块,经过不断尝试和选择,麦克风我们使用了9814带自动增益的麦克风模块,FM解调模块使用了RDA5807解调芯片,两者在实际使用中都取得了非常好的效果。

      在信号处理中,一定距离的麦克风接受到的信号进行互相关可以获得声源方位,紧挨着的FM模块和麦克风接受到的信号进行互相关可以得到车身与信标的距离。时域互相关运算计算量是十分庞大,实际上可以看做是两组离散信号的时域卷积运算,因此一般我们会把这种卷积运算转换到频域中,将时域卷积等效为频域相乘,这样会大大简化我们的计算。将时域信号变换到频域一般使用快速傅里叶变换(FFT),但在实际使用中这种速度仍然无法满足高速定位的需求。我们选用了TC264DA芯片的核心板,与普通TC264D芯片不同,TC264DA拥有512K的EMEM内存空间和内置了硬件FFT计算资源,硬件FFT比软件FFT在速度上有质的提升。但其存在的缺点为硬件FFT只能计算整形数据,会造成一定程度的精度丢失,并且硬件FFT最多只能计算1024个点的,这种精度不能满足本次比赛中信标的识别。在本次比赛中至少要使用2048点的FFT,才能在高速下准确定位。为了解决此问题,我们引入了一种新的级联FFT变换,既使用1024点的硬件FFT又能弥补序列长度不够的缺陷,并在此基础上融合入广义互相关,提升互相关的抗干扰性。

    02级联FFT算法

      联FFT算法的基本思想是把长序列进行分段,类似于把一维数组变为二维数组,然后对行和列分别进行FFT变换,用一定的计算方法将多个短序列的FFT合成原长序列的FFT结果。

      直接把一段C=M×N点序列信号x(n+mN),n=0,1,2,…,N-1;m=0,1,2,…,M-1;当做一维序列进行FFT变换,运算结果可以表示为:

      把一段C=M×N点序列信号x(n+mN),n=0,1,2,…,N-1;m=0,1,2,…,M-1;当做二维独立序列进行FFT变换,也就是先进行行方向N点的FFT运算,再进行列方向M点的FFT运算,两者序列编号不相关,运算结果可以表示为:


      当把这段序列看做一维序列排列为二维序列时,序列编号将会发生变化,对应的FFT运算公式也会发生变化,运算结果表示为:


      化简后得:

      可以看出(1-4)和(1-2)只相差e(-j2πnp/N),也就是只要使e(-j2πnp/N)=1即可使两者相等,但实际上,e(-j2πnp/N)不可能一直等于1。

    03交叉项补偿

      据分析,独立的二维序列行和列进行级联FFT运算和一维序列排列成二维序列再进行行和列的级联FFT运算,两者相差一个补偿因子e(-j2πnp/N),在实际中,我们只需在中途乘上补偿因子即可使两者等效。

      由FFT运算的线性性质可以得到,矩阵化后的数据进行FFT运算时,行和列运算顺序不同不会影响最终的结果。将两维的运算顺序调换后,也就是先进行列方向的FFT变换,再进行行方向的FFT运算,运算结果可以表示为:

      进行了列变换后,就需要加入补偿因子,运算过程如下:


      化简后得:

      综上,级联FFT具体过程为:首先将一维序列排列为二维序列M行N列,首先对每行进行FFT变换,对每个元素乘以补偿因子e(-j2πnp/N),然后对每列进行FFT变换,最后按列取出即为原一维序列FFT变换后的结果。

    04.MATLAB仿真

      本次竞赛中,我们使用了2048点的声音信号做互相关,并在频域相乘之后进行频域补零,补为4096个点,然后使用级联IFFT变换取最大值,即得到互相关最终结果。

      我们采样了一组FM解调信号进行了一系列仿真实验,通过该信号和该信号的延时信号模拟FM和麦克风的互相关运算。首先是使用普通的FFT进行互相关实验,原始FM信号和延迟的FM信号波形图如图D-1所示,两者的普通的FFT变换波形如图D-2所示,互相关结果如图D-3所示,使用MATLAB求互相关结果最大值,最大值点为第201点,设置的延迟为100点,因为在频域中进行了补零操作,所以互相关结果精度是原始点数的两倍,实验结果正确。

    ▲ 普通FFT下FM信号波形和100点延迟的FM信号波形

    ▲ 普通FFT下FM信号波形和100点延迟的FM信号波形

    ▲ 普通FFT下的两信号FFT变换

    ▲ 普通FFT下的两信号FFT变换

    ▲ 普通FFT下两信号互相关结果

    ▲ 普通FFT下两信号互相关结果

      同理,我们使用级联FFT,首先把2048点放置为两行1024点,先对列进行两点FFT变换,再对所有点数乘以补偿因子,接着对每行进行1024点的FFT变换,最后按列取出即可。然后进行互相关运算,接着把2048点的结果补零为4096。然后把4096点按列排列为4行1024点,进行级联IFFT运算,级联IFFT可以看做级联FFT的逆运算。运算步骤类似这里不进行展开了。MATLAB仿真结果如下,FM信号和FM延时信号如图D-4所示,两者级联FFT变换如图D-5所示,最终互相关结果如图D-6所示,使用MATLAB求最大值点,对应为第201点
    ▲ 级联FFT下FM信号和100点延时的FM信号波形

    ▲ 级联FFT下FM信号和100点延时的FM信号波形

    ▲ 级联FFT下两信号级联FFT变换后的波形

    ▲ 级联FFT下两信号级联FFT变换后的波形

    ▲ 级联FFT下两信号互相关结果

    ▲ 级联FFT下两信号互相关结果

      从上面结果可以看出,级联FFT运算结果和普通FFT运算结果完全一致,两者是等效的,然而把级联FFT运用到带有硬件FFT的MCU中就可以节省大量的运算时间,把软件运算转化为硬件计算,大大提高了运算速度和运算效率.

    05广义互相关

      实际使用麦克风时,很容易受到轮子噪声,空气中的噪声,以及墙面反射等的影响,这会使接受到的信号产生失真,无论是线性失真还是非线性失真都会给我们的互相关结果带来巨大影响。

      类似于前面所说的基本互相关方法,广义互相关算法估计得到的时延同样对应于两个麦克风接受到的信号之间的相关函取得最大值的位置。

      上面式子中, τ 12 \tau _{12} τ12是两个信号之间的延时, G x 1 x 2 ( ω ) G_{x1x2} \left( \omega \right) Gx1x2(ω) x 1 ( n ) x_1 \left( n \right) x1(n) x 2 ( n ) x_2 \left( n \right) x2(n)的互功率谱。 X 1 ( ω ) X_1 \left( \omega \right) X1(ω) x 1 ( n ) x_1 \left( n \right) x1(n)的傅里叶变换, X 2 ( ω ) X_2 \left( \omega \right) X2(ω) x 2 ( n ) x_2 \left( n \right) x2(n)的傅里叶变换。

      减弱或消除实际环境中噪声、混响的影响,可以在互功率谱频域中使用加权函数给予一定加权,再经过IFFT变换后得到广义互相关结果,广义互相关函数表达式为:

    ψ 12 ( ω ) \psi _{12} \left( \omega \right) ψ12(ω)为频域加权函数,加权函数不同,实际效果也会有差异,实际应用中,可以针对噪声和混响情况选取不同的加权函数,使相关函数峰值尖锐化,从而使得估计值更加准确。加权函数的选取主要有互功率谱相位(PHAT),ROTH处理器和平滑相干变换(SCOT)。

    ▲ 各种加权函数特性分析表格

    ▲ 各种加权函数特性分析表格

    上表中, φ x i x i ( ω ) \varphi _{x_i x_i } \left( \omega \right) φxixi(ω) φ x j x j ( ω ) \varphi _{x_j x_j } \left( \omega \right) φxjxj(ω)分别表示麦克风信号 x i ( n ) x_i \left( n \right) xi(n) x j ( n ) x_j \left( n \right) xj(n) 的自功率谱, φ x i x j ( ω ) \varphi _{x_i x_j } \left( \omega \right) φxixj(ω)表示 x i ( n ) x_i \left( n \right) xi(n) x j ( n ) x_j \left( n \right) xj(n) 的互功率谱, ∣ γ i j ( ω ) ∣ 2 \left| {\gamma _{ij} \left( \omega \right)} \right|^2 γij(ω)2定义为如下形式[2]:

      广义互相关原理图如图C-7所示。

    ▲ 广义互相关原理图

    ▲ 广义互相关原理图

      由于时间原因,本次备赛中我们只尝试了GCC-PHAT和GCC-ML,其中只有GCC-PHAT试用成功了,GCC-ML还需要进一步研究。使用MATLAB对GCC-PHAT的效果进行仿真验证,FM信号和FM延时100点的信号如图C-8所示,两者级联FFT结果如图C-8所示,在频域相乘时,按照GCC-PHAT的方法要除以互功率谱的模,然后进行级联IFFT,结果如图C-9所示,最后取最大值点,MATLAB比较后最大值点为201。这和前面结果相同,也是符合理论结果的。

    ▲ 级联FFT下FM信号的100点延时的FM信号波形

    ▲ 级联FFT下FM信号的100点延时的FM信号波形

    ▲ 级联FFT下两信号级联FFT变换波形

    ▲ 级联FFT下两信号级联FFT变换波形

    ▲ 级联FFT下两信号广义互相关后的结果

    ▲ 级联FFT下两信号广义互相关后的结果

      对比图D-6和图D-10,从级联IFFT输出的波形可以看出,相比于普通的互相关,广义互相关的结果最大值以外的波形更加小和平缓,没有很大的尖峰,效果更好,说明广义互相关的确可以减小信号失真的影响。

    06.结论

      序列进行级联FFT变换得到的结果和普通FFT变换得到的结果是完全一致的,仿真结果也说明使用级联FFT代替FFT是没有影响的,级联FFT可以用于互相关运算。广义互相关可以减小系统噪声、混响等的影响,通过MATLAB仿真,比较普通互相关和广义互相关的结果,从图像上可以看出广义互相关的效果确实更好。

      因此,在竞赛中,结合TC264DA芯片的硬件FFT运算资源,级联FFT可以大大减少运算时间,加快系统的响应速度;使用广义互相关可以有效抑制噪声、混响的干扰,提高互相关计算的准确度。

      我们始终相信,信号处理好,开环也能跑

    展开全文
  • 基于广义互相关的声源定位算法,matlab语言实现。
  • 为了克服这问题,通过广义互相关算法(GCC)可提高这部分时差测量的准确性。广义互相关法将回波信号在频域进行加权处理,提高了信号频谱特性,抑制了噪声对测量的影响。实验结果表明,广义互相关算法在白噪声以及...
  • 使用matlab 实现广义互相关算法,得到时延求解
  • 读取音频,采用分帧处理,最后使用广义互相关算法求时延
  • 基于广义互相关时延估计算法声源定位 很好很强大
  • 这个num文件怎么搞呀 <p><img alt="" height="421" src="https://img-ask.csdnimg.cn/upload/1623589652665.png" width="708" /></p>
  • 通过对被动目标深度测量...为了满足作为被动目标深度测量关键环节的时延估计的高精度要求,研究了快速广义互相关时延估计算法,并通过了仿真试验。试验结果证明了该算法具有良好的实时性,能够得到较高的深度测量精度。
  • 针对这一问题,结合相关峰精确插值算法(FICP),提出了一种基于二次相关改进的广义互相关时延估计算法。该算法通过二次相关,有效地降低噪声的干扰,再利用FICP,提高相关函数的分辨率。仿真实验表明,无论在低...
  • 该文以研究微弱瞬态电磁辐射信号的探测手段为目的,提出广义互相关与混沌序列预测相集成的检测算法。基于双天线测试和互相关信息估计方法,将低信噪比条件下非周期微弱放电信号的检测问题转化为周期性时延参数的估计...
  • Matlab广义互相关程序

    2020-09-01 15:14:42
    Matlab广义互相关程序
  • 电子信息工程学院,长春 130022) 摘 要:针对麦克风阵列广义互相关声源定位方法中,麦克风接收到的人声信号掺杂混响以及噪声,导致算法求解过程中准确性不高的缺点,通过MATLAB分窗滤波的方法,在算法中对实时接收的...

    长春理工大学学报(自然科学版) Journal of Changchun University of Science and Technology(Natural Science Edition) Vol.39 No.6 Dec.2016 第39卷第6期 2016年12月 收稿日期:2016-09-23 作者简介:王森(1991-),男,硕士研究生,E-mail:wangsen321@126.com 通讯作者:宫玉琳(1983-),男,博士,讲师,E-mail:garrygong1983@126.com MATLAB加窗滤波在广义互相关时延估计中的应用 王森,宫玉琳,王春阳,李明秋,李建建 (长春理工大学 电子信息工程学院,长春 130022) 摘 要:针对麦克风阵列广义互相关声源定位方法中,麦克风接收到的人声信号掺杂混响以及噪声,导致算法求解过程中准确性不高的缺点,通过MATLAB分窗滤波的方法,在算法中对实时接收的声音信号进行预处理,针对人声频率进行改进,提升低信噪比状况下估计时延的准确性,完成人声声源定位的目的,并通过仿真实验验证了该方法的有效性。关键词:声源定位;分窗滤波;广义互相关中图分类号: TN912.3 文献标识码:A 文章编号:1672-9870(2016)06-0048-05 ApplicationofMATLABWindowingand FilteringinGeneralizedCross-correlationTimeDelayEstimation WANG Sen,GONG Yulin,WANG Chunyang,LI Mingqiu,LI Jianjian (SchoolofElectronicsandInformationEngineering,ChangchunUniversityofScienceandTechnology,Changchun130022) Abstract:Aiming at the shortcomings of the microphone array signal de-noising and the reverberation of the human voice signal received by the microphone in the generalized cross-correlation sound source localization method,this paper uses MATLAB to divide the windowing and filtering method,And the accuracy of estimating the time delay under the condition of low SNR is improved and to complete the task of estimating the localization of the human voice source. Simulation experiments havs been carried out to verify the effectiveness of the proposed method. Key words:sound source localization;windowing and filtering;generalized cross correlation 麦克风阵列对语音定位的方法,常常应用在智能机器人、通信、火警救援等众多领域[1]

    展开全文
  • 基于广义互相关的声源定位算法,matlab语言实现。
  • #资源达人分享计划#
  • 广义互相关计算时延

    2018-06-11 21:44:35
    这是个matlab广义互相关计算时延的m文件,直接调用,十分方便,赶快下载啊,让我赚点积分,哈哈。
  • 广义互相关的程序

    2012-05-22 15:37:01
    基于TDOA定位的程序,利用广义互相关法获取时延估计
  • 看了国内外的文献,一致首推“广义相关(Generalized Cross Correlation–GCC)算法”。 查文献,在matlab中使用模拟正弦波仿真测试了一下广义相关算法,没有达到预期效果,百思不得其解。浏览了一下网络上关于GCC的...

    一、获取代码方式

    获取代码方式1:
    完整代码已上传我的资源:【声源定位】基于matlab广义互相关声源定位【含Matlab源码 548期】

    获取代码方式2:
    通过紫极神光博客主页开通CSDN会员,凭支付凭证,私信博主,可获得此代码。

    获取代码方式3:
    通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

    备注:开通CSDN会员,仅只能免费获得1份代码(有效期为开通日起,三天内有效);
    订阅紫极神光博客付费专栏,可免费获得2份代码(有效期为订阅日起,三天内有效);

    二、广义互相关声源定位简介

    基于麦克风阵列的声源定位技术的研究在国内受到了越来越多的关注,麦克风阵列的声源目标定位技术可以定义为利用麦克风阵列采集声源目标,经过一系列对声音信号的分析操作与处理来确定声源的位置.与雷达探测技术以及其他探测技术相比,该技术有很多特点,比如因其采用被动式工作原理,所以探测隐蔽,不容易被发现.目前,基于麦克风阵列的定位技术逐渐变成研究的主流,涉及视频会议系统、汽车鸣笛定位、人机交互等.

    经过多年发展,基于麦克风阵列的声源定位技术已有较多的理论和方法,定位方法大体可以分三类:基于到达时延估计方法、基于最大输出功率的可控波束形成方法、高分辨率谱估计方法.基于时延估计法主要根据声源信号到达两个不同位置麦克风的时间差计算出声源位置相对一组麦克风所在的双曲面,通过多个双曲面交集来确定声源位置;基于最大输出功率的可控波束形成方法主要利用波束形成技术,不断调整阵列信号的接收方向,同时对整个接收空间进行扫描,接收能量最大的方向即为声源方向;高分辨率谱估计方法主要是利用各个阵元信号之间的相关矩阵,通过计算相关矩阵的空间谱获得声源的方向角.其中,基于时延估计的定位算法简单、定位精度高,是目前声源定位信号处理中常用的方法.

    1 基本模型
    声波在传播的过程中会发生衰减,而衰减因子与传播的距离成正比,因此声波从声源到达不同阵元时幅度相差不大,而因延迟产生的相位差则较大.根据声源与麦克风阵列之间的距离r=2D/λ,可以将阵列模型分为近场和远场模型.通常定义声源与阵列之间的距离为远近场临界值,其中λ为声波波长,D为阵列孔径.当麦克风阵列与声源之间的距离r<2D/λ时,阵列处于近场模型,麦克风阵列接收的声波是球面波.反之,当r>2D/λ时,阵列处于远场模型,声源到各阵元的距离差相比于声源到麦克风阵列的距离可以忽略不计,阵元间接收信号仅存在相位延迟且可将声波看作平面波.

    假设线阵麦克风阵列的所有阵元接收到的信号只包含直达信号与加性噪声,并且每个麦克风之间的噪声相互独立,如图1所示.其中,S表示声源,M1,M2,M3,⋯,MN表示N个麦克风,根据空间采样定理,每相邻两个麦克风之间的间距在选择上必须满足d≤λ(min)/2
    在这里插入图片描述
    图1 信号模型
    声源信号s(t)呈辐射状态传播,且信号的能量与麦克风和声源间的距离成反比,则第i(i=1,2,3,…,N)个麦克风Mi所接收到的信号xi(t)为:
    在这里插入图片描述
    其中,αi表示声源信号s(t)的传播衰减因子,τi表示声源S到达第i个麦克风的时延,ni(t)表示第i个麦克风接收的加性噪声.

    2 互相关算法
    基于时延估计的声源定位算法主要分为两个步骤:第一步,估计声源信号到达各个麦克风之间的时间差;第二步,利用上一步所得到的时间差和声源与麦克风阵列之间的几何关系来估计声源位置.在声源定位系统中,时延估计技术至关重要,时延估计的精度直接影响定位的精度.常用的时延估计算法是互相关法.

    互相关函数是描述随机信号x (t),y (t)在任意两个不同时刻s,t的取值间的相关程度,其定义为:
    在这里插入图片描述
    对于连续函数,有定义:
    在这里插入图片描述
    对于离散数据,有定义:
    在这里插入图片描述
    从以上定义式中可以看到,互相关函数和卷积运算类似,也是两个序列滑动相乘.区别在于互相关的两个序列都不翻转,直接滑动相乘,求和;卷积的其中一个序列需要先翻转,然后滑动相乘,求和.所以,f(t)和g (t)做相关等于f*(t)和g (t)做卷积.

    根据维纳-辛钦定理,互相关函数与其互功率谱密度互为傅里叶变换对,则x1(t)和x2(t)的互相关函数又可以表示为:
    在这里插入图片描述
    其中,X1(ω)和X2(ω)分别为x1(t)和x2(t)的傅里叶变换,Gx1x2(ω)则称为麦克风信号x1(t)和x2(t)间的互功率谱,X2*(ω)为X2(ω)取复共轭.Rx1x2(τ)对应最大峰值处的横坐标即为所要求的时延估计值.

    2.1 广义互相关算法
    在麦克风信号处理实际模型中,由于存在混响和噪声的影响导致Rx1x2(τ)的峰值不明显,降低了时延估计的精度.因此,广义互相关法利用频域加权函数对信号滤波来突出响应信号部分的频谱成分,抑制噪声部分的频谱,再进行傅里叶反变换IFFT反变到时域,锐化Rx1x2(τ)在时延处的峰值,从而提高时延估计性能.因此得到广义互相关函数Rx1x2(τ),即:
    在这里插入图片描述
    其主要原理如图2所示.

    图中(·)*表示取复共轭.与基本互相关相比,广义互相关算法增加了加权运算.
    在这里插入图片描述
    图2 广义互相关时延估计算法流程图
    由于有限窗长和低信噪比的影响,选择合适的加权函数是一个难点,传统的广义互相关算法有基本互相关(CC),ROTH,SCOT,PHAT等几种加权方式.其中,SCOT和SCOT加权因子分别如式(7)和式(8)所示:
    在这里插入图片描述

    三、部分源代码

    clear all;
    close all;
    clc
    load s.mat;
    s1=s1_10db(:)';             %变为行向量
    s2=s2_10db(:)';             %变为行向量
    wnd=512;
    inc=256;
    
    [delay]=GCC_Method('standard',s1,s2,wnd,inc);
    subplot(411)
    plot(delay-wnd,'*')
    ylim([0,12])
    title('标准GCC')
    xlabel('帧数')
    ylabel('延时/点')
    
    [delay]=GCC_Method('phat',s1,s2,wnd,inc);
    subplot(412)
    plot(delay-wnd,'*')
    ylim([0,12])
    title('Phat-GCC')
    xlabel('帧数')
    ylabel('延时/点')
    
    [delay]=GCC_Method('scot',s1,s2,wnd,inc);
    subplot(413)
    plot(delay-wnd,'*')
    ylim([0,12])
    title('Scot-GCC')
    xlabel('帧数')
    ylabel('延时/点')
    
    [delay]=GCC_Method('ml',s1,s2,wnd,inc);
     subplot(414)
    plot(delay-wnd,'*')
    ylim([0,12])
    unction frameout=enframe(x,win,inc)
    
    nx=length(x(:));            % 取数据长度
    nwin=length(win);           % 取窗长
    if (nwin == 1)              % 判断窗长是否为1,若为1,即表示没有设窗函数
       len = win;               % 是,帧长=win
    else
       len = nwin;              % 否,帧长=窗长
    end
    if (nargin < 3)             % 如果只有两个参数,设帧inc=帧长
       inc = len;
    end
    nf = fix((nx-len+inc)/inc); % 计算帧数
    frameout=zeros(nf,len);            % 初始化
    indf= inc*(0:(nf-1)).';     % 设置每帧在x中的位移量位置
    inds = (1:len);             % 每帧数据对应1:len
    frameout(:) = x(indf(:,ones(1,len))+inds(ones(nf,1),:));   % 对数据分帧
    

    四、运行结果

    在这里插入图片描述

    五、matlab版本及参考文献

    1 matlab版本
    2014a

    2 参考文献
    [1]韩纪庆,张磊,郑铁然.语音信号处理(第3版)[M].清华大学出版社,2019.
    [2]柳若边.深度学习:语音识别技术实践[M].清华大学出版社,2019.
    [3]李保伟,张兴敢.基于广义互相关改进的麦克风阵列声源定位方法[J].南京大学学报(自然科学). 2020,56(06)

    展开全文
  • 在网络上有一篇关于 基于广义互相关估计时间延时 的PDF文件,是由Bhargava提交一篇综述报告,将用于估计时间延迟的广义互相关算法进行了总结。   ■ 互相关估计时延 在空间上相距一定距离LLL的两个声音传感器...
  • 基于信息最小化的独立性测度对各分离信号间的非线性相关度度量没有归一化的问题, 提出一种基于广义相关系数的盲信号分离(BSS) 算法. 首先选取后非线性混叠模型(PNL) 分析基于广义相关系数的独立性测度; 然后采用...
  • 广义互相关求信号时延 JAVA实现

    千次阅读 2014-06-06 21:08:52
    最近在做一个声音测量距离的系统,平台为Android,要用广义互相关来求信号的时延。 里面用到了FFT,FFT是参考这位仁兄的: http://blog.csdn.net/syrchina/article/details/6670517 如何通过FFT求信号...
  • 广义互相关计算TDOA

    千次阅读 多人点赞 2020-06-05 23:46:14
    你可以使用广义互相关( Generialized Cross-Correlation )来估计一个信号达到两个传感器的时间延迟。比如应用麦克风阵列来确定声源方位的应用背景。问题可以用以下模型来描述: r1(t)=s(t)+n1(t)r_1 \left( t \...
  • matlab时延估计算法互相关函数

    热门讨论 2013-04-11 16:30:58
    基于matlab的时延估计算法互相关函数仿真源代码
  • 互相关的时延估计算法

    热门讨论 2010-06-26 19:13:35
    互相关算两信号时延,C-C算法,matlab
  • 看了国内外的文献,一致首推“广义相关(Generalized Cross Correlation--GCC)算法”。 查文献,在matlab中使用模拟正弦波仿真测试了一下广义相关算法,没有达到预期效果,百思不得其解。浏览了一下网络上关于GCC...
  • 基于互相关算法的声源定位分析,张明瀚,石为人,时延估计是阵列信号处理中的一项关键技术。针对室内视频监控系统对声源定位技术的需求,本文对广义互相关算法中基本互相关、互功
  • 针对传统信息配准方法计算量较大且未利用图像空间信息的缺点,提出了一种结合SURF描述符和广义近邻图的图像配准算法。该算法用SURF从图像中提取尺度空间特征点并获得特征点描述子,然后用广义近邻图来估计Rényi熵...
  • 通过对常用的预处理算法对音频信号进行预处理,用其在空气中自解调出来的声参量阵信号进行广义互相关算法,并对其进行MATLAB仿真分析,比较几种调制算法测得时间差的精度。经过仿真对比分析知全载波单边带调制算法...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,702
精华内容 1,480
关键字:

广义互相关算法