2017-02-22 20 views
0

MATLAB에서 GCC-PHAT를 사용하여 두 개의 음향 신호 사이의 시간 지연 추정을 계산하려고합니다. 그러나 fft/ifft를 사용하여 GCC-PHAT를 코딩하는 것은 여전히 ​​어려우며 시간 지연 예측은 항상 0입니다. 나는 인터넷 검색을하고 있지만 아직 성공하지 못했다. 내 코드는 다음과 같이 두 개의 정현파가있는 간단한 예제로 시연됩니다.MATLAB의 GCC-PHAT (아직 도전 중)

Fs = 8000; 
dt = 1/Fs; 
f1 = 100; 
tdelay = 0.002; 
t3 = (0:dt:(1)-dt)'; 
x = cos(2*pi*f1*t3); 
y = cos(2*pi*f1*(t3-tdelay)); 

n=2*length(x)-1; 
N=2^nextpow2(n); 

xfft = fft(x,N); 
yfft = fft(y,N); 

df=Fs/N; 
sampleIndex = -N/2:N/2-1; 
f=sampleIndex*df; 

R=xfft.*conj(yfft); 
c=R./abs(R); 
ic=fftshift(ifft(c)); 
figure; plot(f,ic) 
[~,ind]=max(abs(ic)); 
lagDiff=f(ind);      
timeDiff=lagDiff/Fs; 

은 내가 GCC-PHAT가 R에 의해 코딩 될 수 있음을 이해하고,이 게시물 https://dsp.stackexchange.com/questions/31956/gcc-phat-generalized-cross-correlation-matlab

에 명시된대로 어떤 경우에 실패하는 경우 그러나, R 코드가 강력하지 않습니다 작동합니다. 예를 들어, 위의 링크 코드에서 f=100Hztdelay=0.01 또는 f=50Hztdelay=0.01의 결과가 잘못되었습니다.

Matlab에서 GCC-PHAT를 성공적으로 해결했거나 라이선스가있는 기능인 gccphat()을 알고있는 사람이라면 누구든지이 문제에 대해 더 자세히 설명 할 수 있습니까? 이 겉으로보기에는 쉬운 문제에 대해 많은 게시물이 우려했지만 아직 아직 해결되지 않았습니다.

답변

0

Matlab의 새로운 Phased Array Toolbox를 사용하면 신호에 GCCPHAT 기능을 사용할 수 있습니다.

timeDelay = gccphat([Y1(span),Y2(span),Y3(span),Y4(span),Y5(span),Y6(span),Y7(span)],Y0(span),FS); 

timeDelay 변수는 샘플링 빈도 FS에 대해 7 개의 값을가집니다.

0

귀하의 코드와 Matlab의 gccphat()는 위상 추출에서 다릅니다. 크기에 따라 나누기 위해 일반 접근법을 구현하는 동안 각도의 지수를 계산합니다. 따라서 다음과 같이 0으로 나누기와 관련된 수치 문제를 피하십시오.

c = R./abs (R);