相位差、广义互相关、相关系数求声音信号的延时值

最近查了很多文献,也尝试了很多方法,可是还是没有找到一个绝好的方法求同一声源下相隔一定距离的两麦克风测得声音序列的延时值。
目前公认最好的求延时值的方法是广义互相关法代码如下

ay=xlsread('C:\Users\solid\Desktop\最新测试\o1.xlsx','B2:B4002');
ax=xlsread('C:\Users\solid\Desktop\最新测试\o1.xlsx','D2:D4002');
afs=8000;%采样频率
N=max(size(ay));%采样数
[R1,a1]=xcorr(ax,ay);%原始数据用互相关法求延时
[Rmax1,Rloc1]=max(R1);
t1=abs((Rloc1-N)/afs)

局限在互相关法有时会出现延时值不准的情况。而且大多数情况下声源为混频信号时延时值相较于更加准确。
因此尝试采用对两麦克风采集到的信号使用快速傅里叶变换,变换后最大幅值所对应频率可以更好的还原原信号,对此频率下两信号的相角做差,再换算为一周期内的延时信号。采用此方法算得延时值相对更加准确一些(尤其是对单频1KHz情况)因为1khz单频信号在频域下两信号最大幅值所对应的频率数值相同,但是混频时理论上是相同,可实际上总是不一样,因此混频下无法找到同一个最大幅值对应的频率。故此方法搁浅。代码就不放了有有兴趣的同学咱们私聊(q:530956317)然后想着试试对混频信号进行滤波试试,目前只用了一种滤波器butterworth滤波器。
相位差、广义互相关、相关系数求声音信号的延时值_第1张图片最后,我又尝试了通过平移序列的方法找到相关系数最大的点,想着能够通过相关系数对延时值进行修正,结果时单频信号延时值越准却,平移序列后最大相关点出的相关系数值就越大。可是混频信号的数值飘忽不定又让我想到了放弃这种方法


N=4000;%采样数
fs=8000;%采样频率
x0=xlsread('C:\Users\solid\Desktop\最新测试\a3.xlsx','A2:A4002');
x1=xlsread('C:\Users\solid\Desktop\最新测试\a3.xlsx','B2:B4002');
x2=xlsread('C:\Users\solid\Desktop\最新测试\a3.xlsx','D2:D4002');
A=[];
A(1)=abs(corr(x1, x2, 'type' , 'kendall'));
A(2)=abs(corr(x1(2:end), x2(1:end-1), 'type' , 'kendall'));
if A(1)=A(i-1)
            i=i+1;
        else
            break
        end
    end
else
        for i=2:1:10
            B(1)=abs(corr(x1, x2, 'type' , 'kendall'));
            B=[B,abs(corr(x2(i:end), x1(1:end-i+1), 'type' , 'kendall'))];
        if  B(i)>=B(i-1)
            i=i+1;
        else
            break
        end
    end
end
t2=(i-2)*(1/fs);
C=[];
for j=15: -1 :2
    C=[C,corr(x2(j:end), x1(1:end-j+1), 'type' , 'kendall')];
end
for j=1: 1 :15
    C=[C,corr(x1(j:end), x2(1:end-j+1), 'type' , 'kendall')];
end
D=-14: 1 :14;
stem(D,C)
title('平移后两信号相关系数');
[序列0+为x1向后移,x2向前移。序列0-为x2向后移,x1向前移

[序列0+为x1向后移,x2向前移。序列0-为x2向后移,x1向前移相位差、广义互相关、相关系数求声音信号的延时值_第2张图片相位差、广义互相关、相关系数求声音信号的延时值_第3张图片
可以看出相关系数还是呈现一定的周期变化的。
还是要继续努力寻找更好的求延时的方法。
哎,不得不吐槽一下声音信号的微弱性,很容易就测得不准确了。
在下研一小白一枚,有什么不准确的地方欢迎批评指正。欢迎交流分享。
谢谢大家

你可能感兴趣的:(相位差、广义互相关、相关系数求声音信号的延时值)