Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/scipy/fft/_pocketfft/basic.py: 29%
156 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-12 06:31 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-12 06:31 +0000
1"""
2Discrete Fourier Transforms - basic.py
3"""
4import numpy as np
5import functools
6from . import pypocketfft as pfft
7from .helper import (_asfarray, _init_nd_shape_and_axes, _datacopied,
8 _fix_shape, _fix_shape_1d, _normalization,
9 _workers)
11def c2c(forward, x, n=None, axis=-1, norm=None, overwrite_x=False,
12 workers=None, *, plan=None):
13 """ Return discrete Fourier transform of real or complex sequence. """
14 if plan is not None:
15 raise NotImplementedError('Passing a precomputed plan is not yet '
16 'supported by scipy.fft functions')
17 tmp = _asfarray(x)
18 overwrite_x = overwrite_x or _datacopied(tmp, x)
19 norm = _normalization(norm, forward)
20 workers = _workers(workers)
22 if n is not None:
23 tmp, copied = _fix_shape_1d(tmp, n, axis)
24 overwrite_x = overwrite_x or copied
25 elif tmp.shape[axis] < 1:
26 raise ValueError("invalid number of data points ({0}) specified"
27 .format(tmp.shape[axis]))
29 out = (tmp if overwrite_x and tmp.dtype.kind == 'c' else None)
31 return pfft.c2c(tmp, (axis,), forward, norm, out, workers)
34fft = functools.partial(c2c, True)
35fft.__name__ = 'fft'
36ifft = functools.partial(c2c, False)
37ifft.__name__ = 'ifft'
40def r2c(forward, x, n=None, axis=-1, norm=None, overwrite_x=False,
41 workers=None, *, plan=None):
42 """
43 Discrete Fourier transform of a real sequence.
44 """
45 if plan is not None:
46 raise NotImplementedError('Passing a precomputed plan is not yet '
47 'supported by scipy.fft functions')
48 tmp = _asfarray(x)
49 norm = _normalization(norm, forward)
50 workers = _workers(workers)
52 if not np.isrealobj(tmp):
53 raise TypeError("x must be a real sequence")
55 if n is not None:
56 tmp, _ = _fix_shape_1d(tmp, n, axis)
57 elif tmp.shape[axis] < 1:
58 raise ValueError("invalid number of data points ({0}) specified"
59 .format(tmp.shape[axis]))
61 # Note: overwrite_x is not utilised
62 return pfft.r2c(tmp, (axis,), forward, norm, None, workers)
65rfft = functools.partial(r2c, True)
66rfft.__name__ = 'rfft'
67ihfft = functools.partial(r2c, False)
68ihfft.__name__ = 'ihfft'
71def c2r(forward, x, n=None, axis=-1, norm=None, overwrite_x=False,
72 workers=None, *, plan=None):
73 """
74 Return inverse discrete Fourier transform of real sequence x.
75 """
76 if plan is not None:
77 raise NotImplementedError('Passing a precomputed plan is not yet '
78 'supported by scipy.fft functions')
79 tmp = _asfarray(x)
80 norm = _normalization(norm, forward)
81 workers = _workers(workers)
83 # TODO: Optimize for hermitian and real?
84 if np.isrealobj(tmp):
85 tmp = tmp + 0.j
87 # Last axis utilizes hermitian symmetry
88 if n is None:
89 n = (tmp.shape[axis] - 1) * 2
90 if n < 1:
91 raise ValueError("Invalid number of data points ({0}) specified"
92 .format(n))
93 else:
94 tmp, _ = _fix_shape_1d(tmp, (n//2) + 1, axis)
96 # Note: overwrite_x is not utilized
97 return pfft.c2r(tmp, (axis,), n, forward, norm, None, workers)
100hfft = functools.partial(c2r, True)
101hfft.__name__ = 'hfft'
102irfft = functools.partial(c2r, False)
103irfft.__name__ = 'irfft'
106def fft2(x, s=None, axes=(-2,-1), norm=None, overwrite_x=False, workers=None,
107 *, plan=None):
108 """
109 2-D discrete Fourier transform.
110 """
111 if plan is not None:
112 raise NotImplementedError('Passing a precomputed plan is not yet '
113 'supported by scipy.fft functions')
114 return fftn(x, s, axes, norm, overwrite_x, workers)
117def ifft2(x, s=None, axes=(-2,-1), norm=None, overwrite_x=False, workers=None,
118 *, plan=None):
119 """
120 2-D discrete inverse Fourier transform of real or complex sequence.
121 """
122 if plan is not None:
123 raise NotImplementedError('Passing a precomputed plan is not yet '
124 'supported by scipy.fft functions')
125 return ifftn(x, s, axes, norm, overwrite_x, workers)
128def rfft2(x, s=None, axes=(-2,-1), norm=None, overwrite_x=False, workers=None,
129 *, plan=None):
130 """
131 2-D discrete Fourier transform of a real sequence
132 """
133 if plan is not None:
134 raise NotImplementedError('Passing a precomputed plan is not yet '
135 'supported by scipy.fft functions')
136 return rfftn(x, s, axes, norm, overwrite_x, workers)
139def irfft2(x, s=None, axes=(-2,-1), norm=None, overwrite_x=False, workers=None,
140 *, plan=None):
141 """
142 2-D discrete inverse Fourier transform of a real sequence
143 """
144 if plan is not None:
145 raise NotImplementedError('Passing a precomputed plan is not yet '
146 'supported by scipy.fft functions')
147 return irfftn(x, s, axes, norm, overwrite_x, workers)
150def hfft2(x, s=None, axes=(-2,-1), norm=None, overwrite_x=False, workers=None,
151 *, plan=None):
152 """
153 2-D discrete Fourier transform of a Hermitian sequence
154 """
155 if plan is not None:
156 raise NotImplementedError('Passing a precomputed plan is not yet '
157 'supported by scipy.fft functions')
158 return hfftn(x, s, axes, norm, overwrite_x, workers)
161def ihfft2(x, s=None, axes=(-2,-1), norm=None, overwrite_x=False, workers=None,
162 *, plan=None):
163 """
164 2-D discrete inverse Fourier transform of a Hermitian sequence
165 """
166 if plan is not None:
167 raise NotImplementedError('Passing a precomputed plan is not yet '
168 'supported by scipy.fft functions')
169 return ihfftn(x, s, axes, norm, overwrite_x, workers)
172def c2cn(forward, x, s=None, axes=None, norm=None, overwrite_x=False,
173 workers=None, *, plan=None):
174 """
175 Return multidimensional discrete Fourier transform.
176 """
177 if plan is not None:
178 raise NotImplementedError('Passing a precomputed plan is not yet '
179 'supported by scipy.fft functions')
180 tmp = _asfarray(x)
182 shape, axes = _init_nd_shape_and_axes(tmp, s, axes)
183 overwrite_x = overwrite_x or _datacopied(tmp, x)
184 workers = _workers(workers)
186 if len(axes) == 0:
187 return x
189 tmp, copied = _fix_shape(tmp, shape, axes)
190 overwrite_x = overwrite_x or copied
192 norm = _normalization(norm, forward)
193 out = (tmp if overwrite_x and tmp.dtype.kind == 'c' else None)
195 return pfft.c2c(tmp, axes, forward, norm, out, workers)
198fftn = functools.partial(c2cn, True)
199fftn.__name__ = 'fftn'
200ifftn = functools.partial(c2cn, False)
201ifftn.__name__ = 'ifftn'
203def r2cn(forward, x, s=None, axes=None, norm=None, overwrite_x=False,
204 workers=None, *, plan=None):
205 """Return multidimensional discrete Fourier transform of real input"""
206 if plan is not None:
207 raise NotImplementedError('Passing a precomputed plan is not yet '
208 'supported by scipy.fft functions')
209 tmp = _asfarray(x)
211 if not np.isrealobj(tmp):
212 raise TypeError("x must be a real sequence")
214 shape, axes = _init_nd_shape_and_axes(tmp, s, axes)
215 tmp, _ = _fix_shape(tmp, shape, axes)
216 norm = _normalization(norm, forward)
217 workers = _workers(workers)
219 if len(axes) == 0:
220 raise ValueError("at least 1 axis must be transformed")
222 # Note: overwrite_x is not utilized
223 return pfft.r2c(tmp, axes, forward, norm, None, workers)
226rfftn = functools.partial(r2cn, True)
227rfftn.__name__ = 'rfftn'
228ihfftn = functools.partial(r2cn, False)
229ihfftn.__name__ = 'ihfftn'
232def c2rn(forward, x, s=None, axes=None, norm=None, overwrite_x=False,
233 workers=None, *, plan=None):
234 """Multidimensional inverse discrete fourier transform with real output"""
235 if plan is not None:
236 raise NotImplementedError('Passing a precomputed plan is not yet '
237 'supported by scipy.fft functions')
238 tmp = _asfarray(x)
240 # TODO: Optimize for hermitian and real?
241 if np.isrealobj(tmp):
242 tmp = tmp + 0.j
244 noshape = s is None
245 shape, axes = _init_nd_shape_and_axes(tmp, s, axes)
247 if len(axes) == 0:
248 raise ValueError("at least 1 axis must be transformed")
250 if noshape:
251 shape[-1] = (x.shape[axes[-1]] - 1) * 2
253 norm = _normalization(norm, forward)
254 workers = _workers(workers)
256 # Last axis utilizes hermitian symmetry
257 lastsize = shape[-1]
258 shape[-1] = (shape[-1] // 2) + 1
260 tmp, _ = _fix_shape(tmp, shape, axes)
262 # Note: overwrite_x is not utilized
263 return pfft.c2r(tmp, axes, lastsize, forward, norm, None, workers)
266hfftn = functools.partial(c2rn, True)
267hfftn.__name__ = 'hfftn'
268irfftn = functools.partial(c2rn, False)
269irfftn.__name__ = 'irfftn'
272def r2r_fftpack(forward, x, n=None, axis=-1, norm=None, overwrite_x=False):
273 """FFT of a real sequence, returning fftpack half complex format"""
274 tmp = _asfarray(x)
275 overwrite_x = overwrite_x or _datacopied(tmp, x)
276 norm = _normalization(norm, forward)
277 workers = _workers(None)
279 if tmp.dtype.kind == 'c':
280 raise TypeError('x must be a real sequence')
282 if n is not None:
283 tmp, copied = _fix_shape_1d(tmp, n, axis)
284 overwrite_x = overwrite_x or copied
285 elif tmp.shape[axis] < 1:
286 raise ValueError("invalid number of data points ({0}) specified"
287 .format(tmp.shape[axis]))
289 out = (tmp if overwrite_x else None)
291 return pfft.r2r_fftpack(tmp, (axis,), forward, forward, norm, out, workers)
294rfft_fftpack = functools.partial(r2r_fftpack, True)
295rfft_fftpack.__name__ = 'rfft_fftpack'
296irfft_fftpack = functools.partial(r2r_fftpack, False)
297irfft_fftpack.__name__ = 'irfft_fftpack'