Source code for pycbc.fft.func_api

# Copyright (C) 2012  Josh Willis, Andrew Miller
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

#
# =============================================================================
#
#                                   Preamble
#
# =============================================================================
#
"""
This package provides a front-end to various fast Fourier transform
implementations within PyCBC.
"""

from pycbc.types import TimeSeries as _TimeSeries
from pycbc.types import FrequencySeries as _FrequencySeries
from .core import _check_fft_args, _check_fwd_args, _check_inv_args
from .backend_support import get_backend

[docs]def fft(invec, outvec): """ Fourier transform from invec to outvec. Perform a fourier transform. The type of transform is determined by the dtype of invec and outvec. Parameters ---------- invec : TimeSeries or FrequencySeries The input vector. outvec : TimeSeries or FrequencySeries The output. """ prec, itype, otype = _check_fft_args(invec, outvec) _check_fwd_args(invec, itype, outvec, otype, 1, None) # The following line is where all the work is done: backend = get_backend() backend.fft(invec, outvec, prec, itype, otype) # For a forward FFT, the length of the *input* vector is the length # we should divide by, whether C2C or R2HC transform if isinstance(invec, _TimeSeries): outvec._epoch = invec._epoch outvec._delta_f = 1.0/(invec._delta_t * len(invec)) outvec *= invec._delta_t elif isinstance(invec, _FrequencySeries): outvec._epoch = invec._epoch outvec._delta_t = 1.0/(invec._delta_f * len(invec)) outvec *= invec._delta_f
[docs]def ifft(invec, outvec): """ Inverse fourier transform from invec to outvec. Perform an inverse fourier transform. The type of transform is determined by the dtype of invec and outvec. Parameters ---------- invec : TimeSeries or FrequencySeries The input vector. outvec : TimeSeries or FrequencySeries The output. """ prec, itype, otype = _check_fft_args(invec, outvec) _check_inv_args(invec, itype, outvec, otype, 1, None) # The following line is where all the work is done: backend = get_backend() backend.ifft(invec, outvec, prec, itype, otype) # For an inverse FFT, the length of the *output* vector is the length # we should divide by, whether C2C or HC2R transform if isinstance(invec, _TimeSeries): outvec._epoch = invec._epoch outvec._delta_f = 1.0/(invec._delta_t * len(outvec)) outvec *= invec._delta_t elif isinstance(invec,_FrequencySeries): outvec._epoch = invec._epoch outvec._delta_t = 1.0/(invec._delta_f * len(outvec)) outvec *= invec._delta_f