精华内容
下载资源
问答
  • 广义互相关算法
    2021-04-18 06:29:32

    clear all

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%获得语音文件%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    [x,fs,nbits]=wavread('bluesky3.wav');     %%%%%%打开wav文件

    %fs=8000

    %nbits=16

    x=x/max(abs(x));                     %%%%%幅度归一化

    N=length(x);                         %%%%%设x的采样长度为wav_length

    tt=[0:N-1]/fs;                       %%%%%采样时间序列tt

    wlen=200;                                  %%%%%%%帧长200,帧移80

    inc=80;

    fn=fix((N-wlen)/inc)+1;       %%%%%%%求出一共分了多少帧

    frametime=frame2time(fn,wlen,inc,fs);     %%%%%%%%计算每帧对应的时间

    x1=x';                               %%%%%构造延时800个采样点,即0.1S的信号

    x2=[zeros(1,800),x1];

    x2=x2(1,[1:end-800]); %%%%为保持x2与x1有相同的采样长度,将x2的最后800个采样点删去

    figure(1)

    subplot(211)

    plot(tt,x1);

    subplot(212)

    plot(tt,x2);

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%滤波%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %x1=filter([1 -.99],1,x1);                 %%%%%%%对两个输入函数进行滤波

    %x2=filter([1 -.99],1,x2);

    %figure(2)

    %subplot(211)

    %plot(tt,x1);

    %subplot(212)

    %plot(tt,x2);

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%分帧加窗%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %x1=enframe(x1,hamming(wlen),inc);            %%%%%%%给输入信号分帧和加窗,帧长200,帧移80(即帧长为25ms,帧移为10ms)符合语音信号在10~30ms内短时平稳的特性

    %x2=enframe(x2,hamming(wlen),inc);

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%端点检测%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    IS1=0.1;                                    %%%%%%%观察输入的波形图形,估计前导无话段时长IS

    IS2=0.2;

    NIS1=fix((IS1*fs-wlen)/inc+1);

    NIS2=fix((IS2*fs-wlen)/inc+1);

    [voiceseg1,vsl1,SF1,NF1]=vad_ezm1(x1,wlen,inc,NIS1);   %%%%%%%%vad_ezml为工具箱带的函数,用于计算端点检测 voiceseg表示区间(特别的!表示的是时间区间),vsl表示有几段

    [voiceseg2,vsl2,SF2,NF2]=vad_ezm1(x2,wlen,inc,NIS2);

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%广义互相关计算时延%%%%%%%%%%%%%%%%%%%%%%%%

    X1=fft(x1,2*N-1);

    X1J=conj(X1);

    X2=fft(x2,2*N-1);

    X2J=conj(X2);

    X12=X1.*X2J;

    R12=fftshift(abs(ifft(X12)));

    figure(2)

    T=(0:N-1)/fs;

    plot([0:2*N-2],R12)

    c=max(abs(R12));

    a=find(abs(R12)==c) %找出最大点

    R=fix(length(R12)/2);

    m=(a-(R+2))/fs %换算出信号的延迟时间

    更多相关内容
  • 广义加权相关时延估计(GCC):主要是提高了信噪比。相关函数和功率谱密度函数是一对傅里叶变换对
  • 在声音测距的原理中,我们可以利用麦克风对采集的声音信号利用互相关算法测出音源与麦克风距离的差值,而大致求出音源的方位。这也是第十五届智能车竞赛声音信标组定位的基础,因为我参加的是这个组别,所以当时在这...

    在声音测距的原理中,我们可以利用麦克风对采集的声音信号利用互相关算法测出音源与麦克风距离的差值,而大致求出音源的方位。这也是第十五届智能车竞赛声音信标组定位的基础,因为我参加的是这个组别,所以当时在这方面找了很多相关的资料。

    互相关的原理基本上懂,但是用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; //Mic1和Mic2的时延差
    uint Max_Array_Num=0; //互相关运算得到的最大值对应的数组下标 
    
    //定义浮点型复数的实部和虚部部分,因为FFT过程中既有实数也有复数
    typedef struct
    {
        float real;  /**< \brief Real part */
        float imag;  /**< \brief Imaginary part */
    } cfloat32;
    
    //以下这些参与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的逆变换)之后得到的时域信号
    
    //两个复数相乘
    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语言算法,代码的备注我已经尽可能的加在相应代码之后了,有什么不对的地方欢迎大家指出,我们共同进步!

    展开全文
  • 广义互相关算法用FFT加速的C语言实现

    千次阅读 多人点赞 2020-08-29 18:46:40
    广义互相关算法如何用C语言实现? 在声音测距的原理中,我们可以利用麦克风对采集的声音信号利用互相关算法测出音源与麦克风距离的差值,而大致求出音源的方位。这也是第十五届智能车竞赛声音信标组寻灯的基础,因为...

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

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

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

    #define uint unsigned int
    
    //采样点数和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过程中既有实数也有复数
    typedef struct
    {
        float real;               /**< \brief Real part */
        float imag;               /**< \brief Imaginary part */
    } cfloat32;
    
    //以下这些参与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的逆变换)之后得到的时域信号
    
    //两个复数相乘
    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语言算法,代码的备注我已经尽可能的加在相应代码之后了,有什么不对的地方欢迎大家指出,我们共同进步!

    更多脑补知识,欢迎各位老板们关注公众号“脑补空间”~
    在这里插入图片描述

    展开全文
  • Matlab广义互相关程序

    2020-09-01 15:14:42
    Matlab广义互相关程序
  • 杨韬 余文辉 曹申 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可以大大减少运算时间,加快系统的响应速度;使用广义互相关可以有效抑制噪声、混响的干扰,提高互相关计算的准确度。

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

    展开全文
  • 为了克服这问题,通过广义互相关算法(GCC)可提高这部分时差测量的准确性。广义互相关法将回波信号在频域进行加权处理,提高了信号频谱特性,抑制了噪声对测量的影响。实验结果表明,广义互相关算法在白噪声以及...
  • 读取音频,采用分帧处理,最后使用广义互相关算法求时延
  • 使用matlab 实现广义互相关算法,得到时延求解
  • 【声源定位】基于matlab实现广义互相关的声源定位.zip
  • 宋老师,我把一个声音信号作了延迟之后加上噪声,用PHAT加权和基本互相关都能得到正确的时延值,但我对这两个信号进行小波分解和重构近似信号之后,用基本互相关可以得到时延,但PHAT加权后就不能得到正确的时延了,...
  • 广义互相关的程序

    2012-05-22 15:37:01
    基于TDOA定位的程序,利用广义互相关法获取时延估计
  • 通过对被动目标深度测量...为了满足作为被动目标深度测量关键环节的时延估计的高精度要求,研究了快速广义互相关时延估计算法,并通过了仿真试验。试验结果证明了该算法具有良好的实时性,能够得到较高的深度测量精度。
  • 基于广义互相关的声源定位算法,matlab语言实现。
  • #资源达人分享计划#
  • 针对这一问题,结合相关峰精确插值算法(FICP),提出了一种基于二次相关改进的广义互相关时延估计算法。该算法通过二次相关,有效地降低噪声的干扰,再利用FICP,提高相关函数的分辨率。仿真实验表明,无论在低...
  • 该文以研究微弱瞬态电磁辐射信号的探测手段为目的,提出广义互相关与混沌序列预测相集成的检测算法。基于双天线测试和互相关信息估计方法,将低信噪比条件下非周期微弱放电信号的检测问题转化为周期性时延参数的估计...
  • 基于广义互相关时延估计算法声源定位 很好很强大
  • 广义互相关的仿真,数据源为录音音频数据。
  • 广义互相关函数GCC时延估计算法的Matlab实现
  • 广义互相关计算TDOA

    万次阅读 多人点赞 2020-06-05 23:46:14
    你可以使用广义互相关( Generialized Cross-Correlation )来估计一个信号达到两个传感器的时间延迟。比如应用麦克风阵列来确定声源方位的应用背景。问题可以用以下模型来描述: r1(t)=s(t)+n1(t)r_1 \left( t \...
  • 一种流形学习算法(很好用),hJfFYpH参数本科毕设要求参见标准测试模型,基于互功率谱的时延估计,包括广义互相关函数GCC时延估计,VxqzoSg条件数学方法是部分子空间法,利用matlab GUI实现的串口编程例子。
  • STM32的傅里叶算法

    2018-09-03 15:54:22
    用STM32系列芯片做傅里叶变换的算法和程序,希望对大家有帮助
  • 完整代码已上传我的资源:[【声源定位】基于matlab广义互相关声源定位【含Matlab源码 548期】](https://download.csdn.net/download/TIQCmatlab/31339120) 点击上面蓝色字体,直接付费下载,即可。 **获取代码方式2...
  • 电子信息工程学院,长春 130022) 摘 要:针对麦克风阵列广义互相关声源定位方法中,麦克风接收到的人声信号掺杂混响以及噪声,导致算法求解过程中准确性不高的缺点,通过MATLAB分窗滤波的方法,在算法中对实时接收...
  • 看了国内外的文献,一致首推“广义相关(Generalized Cross Correlation--GCC)算法”。 查文献,在matlab中使用模拟正弦波仿真测试了一下广义相关算法,没有达到预期效果,百思不得其解。浏览了一下网络上关于GCC...
  • 广义互相关的公式,这一文都搜集全了

    千次阅读 多人点赞 2020-06-06 01:19:29
    在网络上有一篇关于 基于广义互相关估计时间延时 的PDF文件,是由Bhargava提交一篇综述报告,将用于估计时间延迟的广义互相关算法进行了总结。   ■ 互相关估计时延 在空间上相距一定距离LLL的两个声音传感器...
  • 1、整数版本 #include "corr.h" int * corr(int a [] ,int b[], int la, int lb) { int *result; result = (int *)malloc ((la+lb-1)*sizeof(int)); int i,j; for (i = 0;... j++){

空空如也

空空如也

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

广义互相关算法

友情链接: hanji.rar