2014-09-02 299 views
0

我想在python中實現GCC-PHAT。Python中的GCC-PHAT交叉關聯

的方法類似於以下兩個鏈接: link1link2

似乎使用FFT GCC-PHAT和正常的互相關之間的唯一差別是由幅度分割。

這是我的代碼:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.fftpack import rfft, irfft, fftfreq, fft, ifft 

def xcorr_freq(s1,s2): 
    pad1 = np.zeros(len(s1)) 
    pad2 = np.zeros(len(s2)) 
    s1 = np.hstack([s1,pad1]) 
    s2 = np.hstack([pad2,s2]) 
    f_s1 = fft(s1) 
    f_s2 = fft(s2) 
    f_s2c = np.conj(f_s2) 
    f_s = f_s1 * f_s2c 
    denom = abs(f_s) 
    denom[denom < 1e-6] = 1e-6 
    f_s = f_s/denom # This line is the only difference between GCC-PHAT and normal cross correlation 
    return np.abs(ifft(f_s))[1:] 

我已通過註釋fs = fs/denom函數產生相同的結果作爲寬帶信號正常互相關檢查。

下面是一個示例測試代碼表示上述GCC-PHAT代碼執行比正常互相關更糟:

LENG = 500 
a = np.array(np.random.rand(LENG)) 
b = np.array(np.random.rand(LENG)) 
plt.plot(xcorr_freq(a,b)) 
plt.figure() 
plt.plot(np.correlate(s1,s2,'full')) 

這裏是GCC-PHAT結果:

enter image description here

以下是正常互相關的結果:

enter image description here

因爲GCC-PHAT應該爲寬帶信號提供更好的互相關性能,所以我知道我的代碼有問題。任何幫助非常感謝!

+0

http://scicomp.stackexchange.com/可能會有更多的人與相關的專業知識。如果您將其重新發布,請刪除此問題。 – 2014-09-02 20:42:53

+0

爲什麼你的測試代碼使用'a'和'b'(兩個完全隨機的信號)作爲'xcorr_freq'的輸入並且使用's1'和's2'(可能是其他信號)作爲'np.correlate'的輸入通過在兩種實現中使用相同的輸入來比較蘋果和蘋果? – SleuthEye 2014-09-02 23:40:49

回答

0

不會只給GCC-PHAT提供噪音。給它一個信號+噪音。檢查GCC-PHAT和未加權相關性如何隨着信噪比的變化而進行比較。