0
我想在python中實現GCC-PHAT。Python中的GCC-PHAT交叉關聯
似乎使用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結果:
以下是正常互相關的結果:
因爲GCC-PHAT應該爲寬帶信號提供更好的互相關性能,所以我知道我的代碼有問題。任何幫助非常感謝!
http://scicomp.stackexchange.com/可能會有更多的人與相關的專業知識。如果您將其重新發布,請刪除此問題。 – 2014-09-02 20:42:53
爲什麼你的測試代碼使用'a'和'b'(兩個完全隨機的信號)作爲'xcorr_freq'的輸入並且使用's1'和's2'(可能是其他信號)作爲'np.correlate'的輸入通過在兩種實現中使用相同的輸入來比較蘋果和蘋果? – SleuthEye 2014-09-02 23:40:49