Skip to content

Commit

Permalink
Merge pull request #8128 from takagi/add-freq_shift
Browse files Browse the repository at this point in the history
Add `cupyx.signal.freq_shift`
  • Loading branch information
asi1024 committed Jan 23, 2024
2 parents f215dee + 1b413e2 commit 96ee0fa
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 1 deletion.
1 change: 1 addition & 0 deletions cupyx/signal/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
from cupyx.signal._convolution import convolve1d3o # NOQA
from cupyx.signal._radartools import pulse_compression, pulse_doppler, cfar_alpha # NOQA
from cupyx.signal._filtering import firfilter, firfilter2, firfilter_zi # NOQA
from cupyx.signal._filtering import freq_shift # NOQA
1 change: 1 addition & 0 deletions cupyx/signal/_filtering/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
from cupyx.signal._filtering._filtering import firfilter, firfilter2, firfilter_zi # NOQA
from cupyx.signal._filtering._filtering import freq_shift # NOQA
29 changes: 29 additions & 0 deletions cupyx/signal/_filtering/_filtering.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import math

import cupy
import cupyx.scipy.linalg
import cupyx.scipy.signal._signaltools
Expand Down Expand Up @@ -246,3 +248,30 @@ def firfilter2(
y = axis_slice(y, start=edge, stop=-edge, axis=axis)

return cupy.copy(y)


_freq_shift_kernel = cupy.ElementwiseKernel(
"float64 x, float64 c", "complex128 out",
"out = thrust::polar(x, c * i);",
"_freq_shift_kernel",
)


def freq_shift(x, freq, fs):
"""
Frequency shift signal by freq at fs sample rate
Parameters
----------
x : array_like, complex valued
The data to be shifted.
freq : float
Shift by this many (Hz)
fs : float
Sampling rate of the signal
domain : string
freq or time
"""
x = cupy.asarray(x)
c = -2 * math.pi * freq / fs
return _freq_shift_kernel(x, c)
3 changes: 2 additions & 1 deletion docs/source/reference/ext.rst
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ through the courtesy of Nvidia cuSignal team.

cupyx.signal.convolve1d3o
cupyx.signal.pulse_compression

cupyx.signal.freq_shift

Profiling utilities
-------------------

Expand Down
28 changes: 28 additions & 0 deletions tests/cupyx_tests/signal_tests/filtering_tests/test_filtering.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,31 @@ def test_firfilter2(dtype, num_samps, filter_len, padtype):
cpu_output = scipy.signal.filtfilt(cpu_filter, 1, cpu_sig, padtype=padtype)
gpu_output = cupyx.signal.firfilter2(gpu_filter, gpu_sig, padtype=padtype)
testing.assert_allclose(gpu_output, cpu_output, atol=1e-3, rtol=1e-3)


def freq_shift_cpu(x, freq, fs):
"""
Frequency shift signal by freq at fs sample rate
Parameters
----------
x : array_like, complex valued
The data to be shifted.
freq : float
Shift by this many (Hz)
fs : float
Sampling rate of the signal
domain : string
freq or time
"""
x = numpy.asarray(x)
return x * numpy.exp(-1j * 2 * numpy.pi * freq / fs * numpy.arange(x.size))


@pytest.mark.parametrize("dtype", [cupy.float64, cupy.complex128])
@pytest.mark.parametrize("num_samps", [2**8])
@pytest.mark.parametrize("freq", numpy.fft.fftfreq(10, 0.1))
@pytest.mark.parametrize("fs", [0.3])
def test_freq_shift(dtype, num_samps, freq, fs):
cpu_output = freq_shift_cpu(freq, fs, num_samps)
gpu_output = cupyx.signal.freq_shift(freq, fs, num_samps)
testing.assert_allclose(gpu_output, cpu_output)

0 comments on commit 96ee0fa

Please sign in to comment.