Exemple #1
0
    def test_cross_phase_2d(self, dask):
        Ny, Nx = (32, 16)
        x = np.linspace(0, 1, num=Nx, endpoint=False)
        y = np.ones(Ny)
        f = 6
        phase_offset = np.pi / 2
        signal1 = np.cos(2 * np.pi * f * x)  # frequency = 1/(2*pi)
        signal2 = np.cos(2 * np.pi * f * x - phase_offset)
        da1 = xr.DataArray(
            data=signal1 * y[:, np.newaxis],
            name="a",
            dims=["y", "x"],
            coords={
                "y": y,
                "x": x
            },
        )
        da2 = xr.DataArray(
            data=signal2 * y[:, np.newaxis],
            name="b",
            dims=["y", "x"],
            coords={
                "y": y,
                "x": x
            },
        )
        with pytest.raises(ValueError):
            xrft.cross_phase(da1, da2, dim=["y", "x"])

        if dask:
            da1 = da1.chunk({"x": 16})
            da2 = da2.chunk({"x": 16})
        cp = xrft.cross_phase(da1, da2, dim=["x"])
        actual_phase_offset = cp.sel(freq_x=f).values
        npt.assert_almost_equal(actual_phase_offset, phase_offset)
Exemple #2
0
 def test_cross_phase_true_phase_2d(self, dask):
     """With true_phase = True, a lag on the coordinates should be recovered in cross_phase"""
     dx = 0.1
     dy = 0.14
     x = np.arange(-10, 10, dx)
     y = np.arange(-18, 18, dy)
     x = xr.DataArray(x, dims="x", coords={"x": x})
     y = xr.DataArray(y, dims="y", coords={"y": y})
     fx = np.random.choice(np.fft.fftfreq(len(x), dx))
     fy = np.random.choice(np.fft.fftfreq(len(y), dy))
     da1 = np.cos(2 * np.pi * fx * x + 2 * np.pi * fy * y)
     lagx = np.random.rand() * x.max().data
     lagy = np.random.rand() * y.max().data
     da2 = da1.assign_coords(x=da1["x"] + lagx, y=da1["y"] + lagy)
     if dask:
         da1 = da1.chunk()
         da2 = da2.chunk()
     cp = xrft.cross_phase(da1, da2, true_phase=True)
     offset = cp[
         {
             "freq_x": (np.abs(cp["freq_x"] - fx)).argmin(),
             "freq_y": (np.abs(cp["freq_y"] - fy)).argmin(),
         }
     ].data
     phase_offset = 2 * np.pi * (fx * lagx + fy * lagy)
     phase_offset = np.arctan2(
         np.sin(phase_offset), np.cos(phase_offset)
     )  # Offset in [-pi, pi]
     npt.assert_almost_equal(np.float(offset), phase_offset)
Exemple #3
0
    def test_cross_phase_2d(self, dask):
        Ny, Nx = (32, 16)
        x = np.linspace(0, 1, num=Nx, endpoint=False)
        y = np.ones(Ny)
        f = 6
        phase_offset = np.pi/2
        signal1 = np.cos(2*np.pi*f*x)  # frequency = 1/(2*pi)
        signal2 = np.cos(2*np.pi*f*x - phase_offset)
        da1 = xr.DataArray(data=signal1*y[:,np.newaxis], name='a',
                          dims=['y','x'], coords={'y':y, 'x':x})
        da2 = xr.DataArray(data=signal2*y[:,np.newaxis], name='b',
                          dims=['y','x'], coords={'y':y, 'x':x})
        with pytest.raises(ValueError):
            xrft.cross_phase(da1, da2, dim=['y','x'])

        if dask:
            da1 = da1.chunk({'x': 16})
            da2 = da2.chunk({'x': 16})
        cp = xrft.cross_phase(da1, da2, dim=['x'])
        actual_phase_offset = cp.sel(freq_x=f).values
        npt.assert_almost_equal(actual_phase_offset, phase_offset)
Exemple #4
0
    def test_cross_phase_1d(self, dask):
        N = 32
        x = np.linspace(0, 1, num=N, endpoint=False)
        f = 6
        phase_offset = np.pi / 2
        signal1 = np.cos(2 * np.pi * f * x)  # frequency = 1/(2*pi)
        signal2 = np.cos(2 * np.pi * f * x - phase_offset)
        da1 = xr.DataArray(data=signal1, name="a", dims=["x"], coords={"x": x})
        da2 = xr.DataArray(data=signal2, name="b", dims=["x"], coords={"x": x})

        if dask:
            da1 = da1.chunk({"x": 32})
            da2 = da2.chunk({"x": 32})
        cp = xrft.cross_phase(da1, da2, dim=["x"])

        actual_phase_offset = cp.sel(freq_x=f).values
        npt.assert_almost_equal(actual_phase_offset, phase_offset)
        assert cp.name == "a_b_phase"

        xrt.assert_equal(xrft.cross_phase(da1, da2), cp)

        with pytest.raises(ValueError):
            xrft.cross_phase(da1, da2.isel(x=0).drop("x"))

        with pytest.raises(ValueError):
            xrft.cross_phase(da1, da2.rename({"x": "y"}))
Exemple #5
0
    def test_cross_phase_1d(self, dask):
        N = 32
        x = np.linspace(0, 1, num=N, endpoint=False)
        f = 6
        phase_offset = np.pi/2
        signal1 = np.cos(2*np.pi*f*x)  # frequency = 1/(2*pi)
        signal2 = np.cos(2*np.pi*f*x - phase_offset)
        da1 = xr.DataArray(data=signal1, name='a', dims=['x'], coords={'x': x})
        da2 = xr.DataArray(data=signal2, name='b', dims=['x'], coords={'x': x})

        if dask:
            da1 = da1.chunk({'x': 32})
            da2 = da2.chunk({'x': 32})
        cp = xrft.cross_phase(da1, da2, dim=['x'])

        actual_phase_offset = cp.sel(freq_x=f).values
        npt.assert_almost_equal(actual_phase_offset, phase_offset)
        assert cp.name == 'a_b_phase'

        xrt.assert_equal(xrft.cross_phase(da1, da2), cp)

        with pytest.raises(ValueError):
            xrft.cross_phase(da1, da2.isel(x=0).drop('x'))

        with pytest.raises(ValueError):
            xrft.cross_phase(da1, da2.rename({'x':'y'}))
Exemple #6
0
 def test_cross_phase_2d(self, dask):
     dx = 0.1
     dy = 0.14
     x = np.arange(-10, 10, dx)
     y = np.arange(-18, 18, dy)
     x = xr.DataArray(x, dims="x", coords={"x": x})
     y = xr.DataArray(y, dims="y", coords={"y": y})
     fx = np.random.choice(np.fft.fftfreq(len(x), dx))
     fy = np.random.choice(np.fft.fftfreq(len(y), dy))
     phase_offset = 2 * (np.random.rand() - 0.5) * np.pi
     da1 = np.cos(2 * np.pi * fx * x + 2 * np.pi * fy * y)
     da2 = np.cos(2 * np.pi * fx * x + 2 * np.pi * fy * y - phase_offset)
     if dask:
         da1 = da1.chunk()
         da2 = da2.chunk()
     cp = xrft.cross_phase(da1, da2)
     offset = cp[{
         "freq_x": (np.abs(cp["freq_x"] - fx)).argmin(),
         "freq_y": (np.abs(cp["freq_y"] - fy)).argmin(),
     }].data
     npt.assert_almost_equal(offset, phase_offset)