def test_coherence_linear_dependence(): """ Tests that the coherence between two linearly dependent time-series behaves as expected. From William Wei's book, according to eq. 14.5.34, if two time-series are linearly related through: y(t) = alpha*x(t+time_shift) then the coherence between them should be equal to: .. :math: C(\nu) = \frac{1}{1+\frac{fft_{noise}(\nu)}{fft_{x}(\nu) \cdot \alpha^2}} """ t = np.linspace(0,16*np.pi,2**14) x = np.sin(t) + np.sin(2*t) + np.sin(3*t) + 0.1 *np.random.rand(t.shape[-1]) N = x.shape[-1] alpha = 10 m = 3 noise = 0.1 * np.random.randn(t.shape[-1]) y = alpha*(np.roll(x,m)) + noise f_noise = np.fft.fft(noise)[0:N/2] f_x = np.fft.fft(x)[0:N/2] c_t = ( 1/( 1 + ( f_noise/( f_x*(alpha**2)) ) ) ) f,c = tsa.coherence(np.vstack([x,y])) c_t = np.abs(signaltools.resample(c_t,c.shape[-1])) np.testing.assert_array_almost_equal(c[0,1],c_t,2)
def test_coherence_multi_taper(): """Tests that the code runs and that the resulting matrix is symmetric """ t = np.linspace(0,16*np.pi,1024) x = np.sin(t) + np.sin(2*t) + np.sin(3*t) + np.random.rand(t.shape[-1]) y = x + np.random.rand(t.shape[-1]) method = {"this_method":'multi_taper_csd', "Fs":2*np.pi} f,c = tsa.coherence(np.vstack([x,y]),csd_method=method) np.testing.assert_array_almost_equal(c[0,1],c[1,0])
def test_coherence_mlab(): """Tests that the code runs and that the resulting matrix is symmetric """ t = np.linspace(0,16*np.pi,1024) x = np.sin(t) + np.sin(2*t) + np.sin(3*t) + np.random.rand(t.shape[-1]) y = x + np.random.rand(t.shape[-1]) method = {"this_method":'mlab', "NFFT":256, "Fs":2*np.pi} f,c = tsa.coherence(np.vstack([x,y]),csd_method=method) np.testing.assert_array_almost_equal(c[0,1],c[1,0]) f_theoretical = ut.get_freqs(method['Fs'],method['NFFT']) np.testing.assert_array_almost_equal(f,f_theoretical)