# 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