Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/numpy/fft/_pocketfft.py: 20%
164 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1"""
2Discrete Fourier Transforms
4Routines in this module:
6fft(a, n=None, axis=-1, norm="backward")
7ifft(a, n=None, axis=-1, norm="backward")
8rfft(a, n=None, axis=-1, norm="backward")
9irfft(a, n=None, axis=-1, norm="backward")
10hfft(a, n=None, axis=-1, norm="backward")
11ihfft(a, n=None, axis=-1, norm="backward")
12fftn(a, s=None, axes=None, norm="backward")
13ifftn(a, s=None, axes=None, norm="backward")
14rfftn(a, s=None, axes=None, norm="backward")
15irfftn(a, s=None, axes=None, norm="backward")
16fft2(a, s=None, axes=(-2,-1), norm="backward")
17ifft2(a, s=None, axes=(-2, -1), norm="backward")
18rfft2(a, s=None, axes=(-2,-1), norm="backward")
19irfft2(a, s=None, axes=(-2, -1), norm="backward")
21i = inverse transform
22r = transform of purely real data
23h = Hermite transform
24n = n-dimensional transform
252 = 2-dimensional transform
26(Note: 2D routines are just nD routines with different default
27behavior.)
29"""
30__all__ = ['fft', 'ifft', 'rfft', 'irfft', 'hfft', 'ihfft', 'rfftn',
31 'irfftn', 'rfft2', 'irfft2', 'fft2', 'ifft2', 'fftn', 'ifftn']
33import functools
35from numpy.core import asarray, zeros, swapaxes, conjugate, take, sqrt
36from . import _pocketfft_internal as pfi
37from numpy.core.multiarray import normalize_axis_index
38from numpy.core import overrides
41array_function_dispatch = functools.partial(
42 overrides.array_function_dispatch, module='numpy.fft')
45# `inv_norm` is a float by which the result of the transform needs to be
46# divided. This replaces the original, more intuitive 'fct` parameter to avoid
47# divisions by zero (or alternatively additional checks) in the case of
48# zero-length axes during its computation.
49def _raw_fft(a, n, axis, is_real, is_forward, inv_norm):
50 axis = normalize_axis_index(axis, a.ndim)
51 if n is None:
52 n = a.shape[axis]
54 fct = 1/inv_norm
56 if a.shape[axis] != n:
57 s = list(a.shape)
58 index = [slice(None)]*len(s)
59 if s[axis] > n:
60 index[axis] = slice(0, n)
61 a = a[tuple(index)]
62 else:
63 index[axis] = slice(0, s[axis])
64 s[axis] = n
65 z = zeros(s, a.dtype.char)
66 z[tuple(index)] = a
67 a = z
69 if axis == a.ndim-1:
70 r = pfi.execute(a, is_real, is_forward, fct)
71 else:
72 a = swapaxes(a, axis, -1)
73 r = pfi.execute(a, is_real, is_forward, fct)
74 r = swapaxes(r, axis, -1)
75 return r
78def _get_forward_norm(n, norm):
79 if n < 1:
80 raise ValueError(f"Invalid number of FFT data points ({n}) specified.")
82 if norm is None or norm == "backward":
83 return 1
84 elif norm == "ortho":
85 return sqrt(n)
86 elif norm == "forward":
87 return n
88 raise ValueError(f'Invalid norm value {norm}; should be "backward",'
89 '"ortho" or "forward".')
92def _get_backward_norm(n, norm):
93 if n < 1:
94 raise ValueError(f"Invalid number of FFT data points ({n}) specified.")
96 if norm is None or norm == "backward":
97 return n
98 elif norm == "ortho":
99 return sqrt(n)
100 elif norm == "forward":
101 return 1
102 raise ValueError(f'Invalid norm value {norm}; should be "backward", '
103 '"ortho" or "forward".')
106_SWAP_DIRECTION_MAP = {"backward": "forward", None: "forward",
107 "ortho": "ortho", "forward": "backward"}
110def _swap_direction(norm):
111 try:
112 return _SWAP_DIRECTION_MAP[norm]
113 except KeyError:
114 raise ValueError(f'Invalid norm value {norm}; should be "backward", '
115 '"ortho" or "forward".') from None
118def _fft_dispatcher(a, n=None, axis=None, norm=None):
119 return (a,)
122@array_function_dispatch(_fft_dispatcher)
123def fft(a, n=None, axis=-1, norm=None):
124 """
125 Compute the one-dimensional discrete Fourier Transform.
127 This function computes the one-dimensional *n*-point discrete Fourier
128 Transform (DFT) with the efficient Fast Fourier Transform (FFT)
129 algorithm [CT].
131 Parameters
132 ----------
133 a : array_like
134 Input array, can be complex.
135 n : int, optional
136 Length of the transformed axis of the output.
137 If `n` is smaller than the length of the input, the input is cropped.
138 If it is larger, the input is padded with zeros. If `n` is not given,
139 the length of the input along the axis specified by `axis` is used.
140 axis : int, optional
141 Axis over which to compute the FFT. If not given, the last axis is
142 used.
143 norm : {"backward", "ortho", "forward"}, optional
144 .. versionadded:: 1.10.0
146 Normalization mode (see `numpy.fft`). Default is "backward".
147 Indicates which direction of the forward/backward pair of transforms
148 is scaled and with what normalization factor.
150 .. versionadded:: 1.20.0
152 The "backward", "forward" values were added.
154 Returns
155 -------
156 out : complex ndarray
157 The truncated or zero-padded input, transformed along the axis
158 indicated by `axis`, or the last one if `axis` is not specified.
160 Raises
161 ------
162 IndexError
163 If `axis` is not a valid axis of `a`.
165 See Also
166 --------
167 numpy.fft : for definition of the DFT and conventions used.
168 ifft : The inverse of `fft`.
169 fft2 : The two-dimensional FFT.
170 fftn : The *n*-dimensional FFT.
171 rfftn : The *n*-dimensional FFT of real input.
172 fftfreq : Frequency bins for given FFT parameters.
174 Notes
175 -----
176 FFT (Fast Fourier Transform) refers to a way the discrete Fourier
177 Transform (DFT) can be calculated efficiently, by using symmetries in the
178 calculated terms. The symmetry is highest when `n` is a power of 2, and
179 the transform is therefore most efficient for these sizes.
181 The DFT is defined, with the conventions used in this implementation, in
182 the documentation for the `numpy.fft` module.
184 References
185 ----------
186 .. [CT] Cooley, James W., and John W. Tukey, 1965, "An algorithm for the
187 machine calculation of complex Fourier series," *Math. Comput.*
188 19: 297-301.
190 Examples
191 --------
192 >>> np.fft.fft(np.exp(2j * np.pi * np.arange(8) / 8))
193 array([-2.33486982e-16+1.14423775e-17j, 8.00000000e+00-1.25557246e-15j,
194 2.33486982e-16+2.33486982e-16j, 0.00000000e+00+1.22464680e-16j,
195 -1.14423775e-17+2.33486982e-16j, 0.00000000e+00+5.20784380e-16j,
196 1.14423775e-17+1.14423775e-17j, 0.00000000e+00+1.22464680e-16j])
198 In this example, real input has an FFT which is Hermitian, i.e., symmetric
199 in the real part and anti-symmetric in the imaginary part, as described in
200 the `numpy.fft` documentation:
202 >>> import matplotlib.pyplot as plt
203 >>> t = np.arange(256)
204 >>> sp = np.fft.fft(np.sin(t))
205 >>> freq = np.fft.fftfreq(t.shape[-1])
206 >>> plt.plot(freq, sp.real, freq, sp.imag)
207 [<matplotlib.lines.Line2D object at 0x...>, <matplotlib.lines.Line2D object at 0x...>]
208 >>> plt.show()
210 """
211 a = asarray(a)
212 if n is None:
213 n = a.shape[axis]
214 inv_norm = _get_forward_norm(n, norm)
215 output = _raw_fft(a, n, axis, False, True, inv_norm)
216 return output
219@array_function_dispatch(_fft_dispatcher)
220def ifft(a, n=None, axis=-1, norm=None):
221 """
222 Compute the one-dimensional inverse discrete Fourier Transform.
224 This function computes the inverse of the one-dimensional *n*-point
225 discrete Fourier transform computed by `fft`. In other words,
226 ``ifft(fft(a)) == a`` to within numerical accuracy.
227 For a general description of the algorithm and definitions,
228 see `numpy.fft`.
230 The input should be ordered in the same way as is returned by `fft`,
231 i.e.,
233 * ``a[0]`` should contain the zero frequency term,
234 * ``a[1:n//2]`` should contain the positive-frequency terms,
235 * ``a[n//2 + 1:]`` should contain the negative-frequency terms, in
236 increasing order starting from the most negative frequency.
238 For an even number of input points, ``A[n//2]`` represents the sum of
239 the values at the positive and negative Nyquist frequencies, as the two
240 are aliased together. See `numpy.fft` for details.
242 Parameters
243 ----------
244 a : array_like
245 Input array, can be complex.
246 n : int, optional
247 Length of the transformed axis of the output.
248 If `n` is smaller than the length of the input, the input is cropped.
249 If it is larger, the input is padded with zeros. If `n` is not given,
250 the length of the input along the axis specified by `axis` is used.
251 See notes about padding issues.
252 axis : int, optional
253 Axis over which to compute the inverse DFT. If not given, the last
254 axis is used.
255 norm : {"backward", "ortho", "forward"}, optional
256 .. versionadded:: 1.10.0
258 Normalization mode (see `numpy.fft`). Default is "backward".
259 Indicates which direction of the forward/backward pair of transforms
260 is scaled and with what normalization factor.
262 .. versionadded:: 1.20.0
264 The "backward", "forward" values were added.
266 Returns
267 -------
268 out : complex ndarray
269 The truncated or zero-padded input, transformed along the axis
270 indicated by `axis`, or the last one if `axis` is not specified.
272 Raises
273 ------
274 IndexError
275 If `axis` is not a valid axis of `a`.
277 See Also
278 --------
279 numpy.fft : An introduction, with definitions and general explanations.
280 fft : The one-dimensional (forward) FFT, of which `ifft` is the inverse
281 ifft2 : The two-dimensional inverse FFT.
282 ifftn : The n-dimensional inverse FFT.
284 Notes
285 -----
286 If the input parameter `n` is larger than the size of the input, the input
287 is padded by appending zeros at the end. Even though this is the common
288 approach, it might lead to surprising results. If a different padding is
289 desired, it must be performed before calling `ifft`.
291 Examples
292 --------
293 >>> np.fft.ifft([0, 4, 0, 0])
294 array([ 1.+0.j, 0.+1.j, -1.+0.j, 0.-1.j]) # may vary
296 Create and plot a band-limited signal with random phases:
298 >>> import matplotlib.pyplot as plt
299 >>> t = np.arange(400)
300 >>> n = np.zeros((400,), dtype=complex)
301 >>> n[40:60] = np.exp(1j*np.random.uniform(0, 2*np.pi, (20,)))
302 >>> s = np.fft.ifft(n)
303 >>> plt.plot(t, s.real, label='real')
304 [<matplotlib.lines.Line2D object at ...>]
305 >>> plt.plot(t, s.imag, '--', label='imaginary')
306 [<matplotlib.lines.Line2D object at ...>]
307 >>> plt.legend()
308 <matplotlib.legend.Legend object at ...>
309 >>> plt.show()
311 """
312 a = asarray(a)
313 if n is None:
314 n = a.shape[axis]
315 inv_norm = _get_backward_norm(n, norm)
316 output = _raw_fft(a, n, axis, False, False, inv_norm)
317 return output
320@array_function_dispatch(_fft_dispatcher)
321def rfft(a, n=None, axis=-1, norm=None):
322 """
323 Compute the one-dimensional discrete Fourier Transform for real input.
325 This function computes the one-dimensional *n*-point discrete Fourier
326 Transform (DFT) of a real-valued array by means of an efficient algorithm
327 called the Fast Fourier Transform (FFT).
329 Parameters
330 ----------
331 a : array_like
332 Input array
333 n : int, optional
334 Number of points along transformation axis in the input to use.
335 If `n` is smaller than the length of the input, the input is cropped.
336 If it is larger, the input is padded with zeros. If `n` is not given,
337 the length of the input along the axis specified by `axis` is used.
338 axis : int, optional
339 Axis over which to compute the FFT. If not given, the last axis is
340 used.
341 norm : {"backward", "ortho", "forward"}, optional
342 .. versionadded:: 1.10.0
344 Normalization mode (see `numpy.fft`). Default is "backward".
345 Indicates which direction of the forward/backward pair of transforms
346 is scaled and with what normalization factor.
348 .. versionadded:: 1.20.0
350 The "backward", "forward" values were added.
352 Returns
353 -------
354 out : complex ndarray
355 The truncated or zero-padded input, transformed along the axis
356 indicated by `axis`, or the last one if `axis` is not specified.
357 If `n` is even, the length of the transformed axis is ``(n/2)+1``.
358 If `n` is odd, the length is ``(n+1)/2``.
360 Raises
361 ------
362 IndexError
363 If `axis` is not a valid axis of `a`.
365 See Also
366 --------
367 numpy.fft : For definition of the DFT and conventions used.
368 irfft : The inverse of `rfft`.
369 fft : The one-dimensional FFT of general (complex) input.
370 fftn : The *n*-dimensional FFT.
371 rfftn : The *n*-dimensional FFT of real input.
373 Notes
374 -----
375 When the DFT is computed for purely real input, the output is
376 Hermitian-symmetric, i.e. the negative frequency terms are just the complex
377 conjugates of the corresponding positive-frequency terms, and the
378 negative-frequency terms are therefore redundant. This function does not
379 compute the negative frequency terms, and the length of the transformed
380 axis of the output is therefore ``n//2 + 1``.
382 When ``A = rfft(a)`` and fs is the sampling frequency, ``A[0]`` contains
383 the zero-frequency term 0*fs, which is real due to Hermitian symmetry.
385 If `n` is even, ``A[-1]`` contains the term representing both positive
386 and negative Nyquist frequency (+fs/2 and -fs/2), and must also be purely
387 real. If `n` is odd, there is no term at fs/2; ``A[-1]`` contains
388 the largest positive frequency (fs/2*(n-1)/n), and is complex in the
389 general case.
391 If the input `a` contains an imaginary part, it is silently discarded.
393 Examples
394 --------
395 >>> np.fft.fft([0, 1, 0, 0])
396 array([ 1.+0.j, 0.-1.j, -1.+0.j, 0.+1.j]) # may vary
397 >>> np.fft.rfft([0, 1, 0, 0])
398 array([ 1.+0.j, 0.-1.j, -1.+0.j]) # may vary
400 Notice how the final element of the `fft` output is the complex conjugate
401 of the second element, for real input. For `rfft`, this symmetry is
402 exploited to compute only the non-negative frequency terms.
404 """
405 a = asarray(a)
406 if n is None:
407 n = a.shape[axis]
408 inv_norm = _get_forward_norm(n, norm)
409 output = _raw_fft(a, n, axis, True, True, inv_norm)
410 return output
413@array_function_dispatch(_fft_dispatcher)
414def irfft(a, n=None, axis=-1, norm=None):
415 """
416 Computes the inverse of `rfft`.
418 This function computes the inverse of the one-dimensional *n*-point
419 discrete Fourier Transform of real input computed by `rfft`.
420 In other words, ``irfft(rfft(a), len(a)) == a`` to within numerical
421 accuracy. (See Notes below for why ``len(a)`` is necessary here.)
423 The input is expected to be in the form returned by `rfft`, i.e. the
424 real zero-frequency term followed by the complex positive frequency terms
425 in order of increasing frequency. Since the discrete Fourier Transform of
426 real input is Hermitian-symmetric, the negative frequency terms are taken
427 to be the complex conjugates of the corresponding positive frequency terms.
429 Parameters
430 ----------
431 a : array_like
432 The input array.
433 n : int, optional
434 Length of the transformed axis of the output.
435 For `n` output points, ``n//2+1`` input points are necessary. If the
436 input is longer than this, it is cropped. If it is shorter than this,
437 it is padded with zeros. If `n` is not given, it is taken to be
438 ``2*(m-1)`` where ``m`` is the length of the input along the axis
439 specified by `axis`.
440 axis : int, optional
441 Axis over which to compute the inverse FFT. If not given, the last
442 axis is used.
443 norm : {"backward", "ortho", "forward"}, optional
444 .. versionadded:: 1.10.0
446 Normalization mode (see `numpy.fft`). Default is "backward".
447 Indicates which direction of the forward/backward pair of transforms
448 is scaled and with what normalization factor.
450 .. versionadded:: 1.20.0
452 The "backward", "forward" values were added.
454 Returns
455 -------
456 out : ndarray
457 The truncated or zero-padded input, transformed along the axis
458 indicated by `axis`, or the last one if `axis` is not specified.
459 The length of the transformed axis is `n`, or, if `n` is not given,
460 ``2*(m-1)`` where ``m`` is the length of the transformed axis of the
461 input. To get an odd number of output points, `n` must be specified.
463 Raises
464 ------
465 IndexError
466 If `axis` is not a valid axis of `a`.
468 See Also
469 --------
470 numpy.fft : For definition of the DFT and conventions used.
471 rfft : The one-dimensional FFT of real input, of which `irfft` is inverse.
472 fft : The one-dimensional FFT.
473 irfft2 : The inverse of the two-dimensional FFT of real input.
474 irfftn : The inverse of the *n*-dimensional FFT of real input.
476 Notes
477 -----
478 Returns the real valued `n`-point inverse discrete Fourier transform
479 of `a`, where `a` contains the non-negative frequency terms of a
480 Hermitian-symmetric sequence. `n` is the length of the result, not the
481 input.
483 If you specify an `n` such that `a` must be zero-padded or truncated, the
484 extra/removed values will be added/removed at high frequencies. One can
485 thus resample a series to `m` points via Fourier interpolation by:
486 ``a_resamp = irfft(rfft(a), m)``.
488 The correct interpretation of the hermitian input depends on the length of
489 the original data, as given by `n`. This is because each input shape could
490 correspond to either an odd or even length signal. By default, `irfft`
491 assumes an even output length which puts the last entry at the Nyquist
492 frequency; aliasing with its symmetric counterpart. By Hermitian symmetry,
493 the value is thus treated as purely real. To avoid losing information, the
494 correct length of the real input **must** be given.
496 Examples
497 --------
498 >>> np.fft.ifft([1, -1j, -1, 1j])
499 array([0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j]) # may vary
500 >>> np.fft.irfft([1, -1j, -1])
501 array([0., 1., 0., 0.])
503 Notice how the last term in the input to the ordinary `ifft` is the
504 complex conjugate of the second term, and the output has zero imaginary
505 part everywhere. When calling `irfft`, the negative frequencies are not
506 specified, and the output array is purely real.
508 """
509 a = asarray(a)
510 if n is None:
511 n = (a.shape[axis] - 1) * 2
512 inv_norm = _get_backward_norm(n, norm)
513 output = _raw_fft(a, n, axis, True, False, inv_norm)
514 return output
517@array_function_dispatch(_fft_dispatcher)
518def hfft(a, n=None, axis=-1, norm=None):
519 """
520 Compute the FFT of a signal that has Hermitian symmetry, i.e., a real
521 spectrum.
523 Parameters
524 ----------
525 a : array_like
526 The input array.
527 n : int, optional
528 Length of the transformed axis of the output. For `n` output
529 points, ``n//2 + 1`` input points are necessary. If the input is
530 longer than this, it is cropped. If it is shorter than this, it is
531 padded with zeros. If `n` is not given, it is taken to be ``2*(m-1)``
532 where ``m`` is the length of the input along the axis specified by
533 `axis`.
534 axis : int, optional
535 Axis over which to compute the FFT. If not given, the last
536 axis is used.
537 norm : {"backward", "ortho", "forward"}, optional
538 .. versionadded:: 1.10.0
540 Normalization mode (see `numpy.fft`). Default is "backward".
541 Indicates which direction of the forward/backward pair of transforms
542 is scaled and with what normalization factor.
544 .. versionadded:: 1.20.0
546 The "backward", "forward" values were added.
548 Returns
549 -------
550 out : ndarray
551 The truncated or zero-padded input, transformed along the axis
552 indicated by `axis`, or the last one if `axis` is not specified.
553 The length of the transformed axis is `n`, or, if `n` is not given,
554 ``2*m - 2`` where ``m`` is the length of the transformed axis of
555 the input. To get an odd number of output points, `n` must be
556 specified, for instance as ``2*m - 1`` in the typical case,
558 Raises
559 ------
560 IndexError
561 If `axis` is not a valid axis of `a`.
563 See also
564 --------
565 rfft : Compute the one-dimensional FFT for real input.
566 ihfft : The inverse of `hfft`.
568 Notes
569 -----
570 `hfft`/`ihfft` are a pair analogous to `rfft`/`irfft`, but for the
571 opposite case: here the signal has Hermitian symmetry in the time
572 domain and is real in the frequency domain. So here it's `hfft` for
573 which you must supply the length of the result if it is to be odd.
575 * even: ``ihfft(hfft(a, 2*len(a) - 2)) == a``, within roundoff error,
576 * odd: ``ihfft(hfft(a, 2*len(a) - 1)) == a``, within roundoff error.
578 The correct interpretation of the hermitian input depends on the length of
579 the original data, as given by `n`. This is because each input shape could
580 correspond to either an odd or even length signal. By default, `hfft`
581 assumes an even output length which puts the last entry at the Nyquist
582 frequency; aliasing with its symmetric counterpart. By Hermitian symmetry,
583 the value is thus treated as purely real. To avoid losing information, the
584 shape of the full signal **must** be given.
586 Examples
587 --------
588 >>> signal = np.array([1, 2, 3, 4, 3, 2])
589 >>> np.fft.fft(signal)
590 array([15.+0.j, -4.+0.j, 0.+0.j, -1.-0.j, 0.+0.j, -4.+0.j]) # may vary
591 >>> np.fft.hfft(signal[:4]) # Input first half of signal
592 array([15., -4., 0., -1., 0., -4.])
593 >>> np.fft.hfft(signal, 6) # Input entire signal and truncate
594 array([15., -4., 0., -1., 0., -4.])
597 >>> signal = np.array([[1, 1.j], [-1.j, 2]])
598 >>> np.conj(signal.T) - signal # check Hermitian symmetry
599 array([[ 0.-0.j, -0.+0.j], # may vary
600 [ 0.+0.j, 0.-0.j]])
601 >>> freq_spectrum = np.fft.hfft(signal)
602 >>> freq_spectrum
603 array([[ 1., 1.],
604 [ 2., -2.]])
606 """
607 a = asarray(a)
608 if n is None:
609 n = (a.shape[axis] - 1) * 2
610 new_norm = _swap_direction(norm)
611 output = irfft(conjugate(a), n, axis, norm=new_norm)
612 return output
615@array_function_dispatch(_fft_dispatcher)
616def ihfft(a, n=None, axis=-1, norm=None):
617 """
618 Compute the inverse FFT of a signal that has Hermitian symmetry.
620 Parameters
621 ----------
622 a : array_like
623 Input array.
624 n : int, optional
625 Length of the inverse FFT, the number of points along
626 transformation axis in the input to use. If `n` is smaller than
627 the length of the input, the input is cropped. If it is larger,
628 the input is padded with zeros. If `n` is not given, the length of
629 the input along the axis specified by `axis` is used.
630 axis : int, optional
631 Axis over which to compute the inverse FFT. If not given, the last
632 axis is used.
633 norm : {"backward", "ortho", "forward"}, optional
634 .. versionadded:: 1.10.0
636 Normalization mode (see `numpy.fft`). Default is "backward".
637 Indicates which direction of the forward/backward pair of transforms
638 is scaled and with what normalization factor.
640 .. versionadded:: 1.20.0
642 The "backward", "forward" values were added.
644 Returns
645 -------
646 out : complex ndarray
647 The truncated or zero-padded input, transformed along the axis
648 indicated by `axis`, or the last one if `axis` is not specified.
649 The length of the transformed axis is ``n//2 + 1``.
651 See also
652 --------
653 hfft, irfft
655 Notes
656 -----
657 `hfft`/`ihfft` are a pair analogous to `rfft`/`irfft`, but for the
658 opposite case: here the signal has Hermitian symmetry in the time
659 domain and is real in the frequency domain. So here it's `hfft` for
660 which you must supply the length of the result if it is to be odd:
662 * even: ``ihfft(hfft(a, 2*len(a) - 2)) == a``, within roundoff error,
663 * odd: ``ihfft(hfft(a, 2*len(a) - 1)) == a``, within roundoff error.
665 Examples
666 --------
667 >>> spectrum = np.array([ 15, -4, 0, -1, 0, -4])
668 >>> np.fft.ifft(spectrum)
669 array([1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j, 3.+0.j, 2.+0.j]) # may vary
670 >>> np.fft.ihfft(spectrum)
671 array([ 1.-0.j, 2.-0.j, 3.-0.j, 4.-0.j]) # may vary
673 """
674 a = asarray(a)
675 if n is None:
676 n = a.shape[axis]
677 new_norm = _swap_direction(norm)
678 output = conjugate(rfft(a, n, axis, norm=new_norm))
679 return output
682def _cook_nd_args(a, s=None, axes=None, invreal=0):
683 if s is None:
684 shapeless = 1
685 if axes is None:
686 s = list(a.shape)
687 else:
688 s = take(a.shape, axes)
689 else:
690 shapeless = 0
691 s = list(s)
692 if axes is None:
693 axes = list(range(-len(s), 0))
694 if len(s) != len(axes):
695 raise ValueError("Shape and axes have different lengths.")
696 if invreal and shapeless:
697 s[-1] = (a.shape[axes[-1]] - 1) * 2
698 return s, axes
701def _raw_fftnd(a, s=None, axes=None, function=fft, norm=None):
702 a = asarray(a)
703 s, axes = _cook_nd_args(a, s, axes)
704 itl = list(range(len(axes)))
705 itl.reverse()
706 for ii in itl:
707 a = function(a, n=s[ii], axis=axes[ii], norm=norm)
708 return a
711def _fftn_dispatcher(a, s=None, axes=None, norm=None):
712 return (a,)
715@array_function_dispatch(_fftn_dispatcher)
716def fftn(a, s=None, axes=None, norm=None):
717 """
718 Compute the N-dimensional discrete Fourier Transform.
720 This function computes the *N*-dimensional discrete Fourier Transform over
721 any number of axes in an *M*-dimensional array by means of the Fast Fourier
722 Transform (FFT).
724 Parameters
725 ----------
726 a : array_like
727 Input array, can be complex.
728 s : sequence of ints, optional
729 Shape (length of each transformed axis) of the output
730 (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.).
731 This corresponds to ``n`` for ``fft(x, n)``.
732 Along any axis, if the given shape is smaller than that of the input,
733 the input is cropped. If it is larger, the input is padded with zeros.
734 if `s` is not given, the shape of the input along the axes specified
735 by `axes` is used.
736 axes : sequence of ints, optional
737 Axes over which to compute the FFT. If not given, the last ``len(s)``
738 axes are used, or all axes if `s` is also not specified.
739 Repeated indices in `axes` means that the transform over that axis is
740 performed multiple times.
741 norm : {"backward", "ortho", "forward"}, optional
742 .. versionadded:: 1.10.0
744 Normalization mode (see `numpy.fft`). Default is "backward".
745 Indicates which direction of the forward/backward pair of transforms
746 is scaled and with what normalization factor.
748 .. versionadded:: 1.20.0
750 The "backward", "forward" values were added.
752 Returns
753 -------
754 out : complex ndarray
755 The truncated or zero-padded input, transformed along the axes
756 indicated by `axes`, or by a combination of `s` and `a`,
757 as explained in the parameters section above.
759 Raises
760 ------
761 ValueError
762 If `s` and `axes` have different length.
763 IndexError
764 If an element of `axes` is larger than than the number of axes of `a`.
766 See Also
767 --------
768 numpy.fft : Overall view of discrete Fourier transforms, with definitions
769 and conventions used.
770 ifftn : The inverse of `fftn`, the inverse *n*-dimensional FFT.
771 fft : The one-dimensional FFT, with definitions and conventions used.
772 rfftn : The *n*-dimensional FFT of real input.
773 fft2 : The two-dimensional FFT.
774 fftshift : Shifts zero-frequency terms to centre of array
776 Notes
777 -----
778 The output, analogously to `fft`, contains the term for zero frequency in
779 the low-order corner of all axes, the positive frequency terms in the
780 first half of all axes, the term for the Nyquist frequency in the middle
781 of all axes and the negative frequency terms in the second half of all
782 axes, in order of decreasingly negative frequency.
784 See `numpy.fft` for details, definitions and conventions used.
786 Examples
787 --------
788 >>> a = np.mgrid[:3, :3, :3][0]
789 >>> np.fft.fftn(a, axes=(1, 2))
790 array([[[ 0.+0.j, 0.+0.j, 0.+0.j], # may vary
791 [ 0.+0.j, 0.+0.j, 0.+0.j],
792 [ 0.+0.j, 0.+0.j, 0.+0.j]],
793 [[ 9.+0.j, 0.+0.j, 0.+0.j],
794 [ 0.+0.j, 0.+0.j, 0.+0.j],
795 [ 0.+0.j, 0.+0.j, 0.+0.j]],
796 [[18.+0.j, 0.+0.j, 0.+0.j],
797 [ 0.+0.j, 0.+0.j, 0.+0.j],
798 [ 0.+0.j, 0.+0.j, 0.+0.j]]])
799 >>> np.fft.fftn(a, (2, 2), axes=(0, 1))
800 array([[[ 2.+0.j, 2.+0.j, 2.+0.j], # may vary
801 [ 0.+0.j, 0.+0.j, 0.+0.j]],
802 [[-2.+0.j, -2.+0.j, -2.+0.j],
803 [ 0.+0.j, 0.+0.j, 0.+0.j]]])
805 >>> import matplotlib.pyplot as plt
806 >>> [X, Y] = np.meshgrid(2 * np.pi * np.arange(200) / 12,
807 ... 2 * np.pi * np.arange(200) / 34)
808 >>> S = np.sin(X) + np.cos(Y) + np.random.uniform(0, 1, X.shape)
809 >>> FS = np.fft.fftn(S)
810 >>> plt.imshow(np.log(np.abs(np.fft.fftshift(FS))**2))
811 <matplotlib.image.AxesImage object at 0x...>
812 >>> plt.show()
814 """
815 return _raw_fftnd(a, s, axes, fft, norm)
818@array_function_dispatch(_fftn_dispatcher)
819def ifftn(a, s=None, axes=None, norm=None):
820 """
821 Compute the N-dimensional inverse discrete Fourier Transform.
823 This function computes the inverse of the N-dimensional discrete
824 Fourier Transform over any number of axes in an M-dimensional array by
825 means of the Fast Fourier Transform (FFT). In other words,
826 ``ifftn(fftn(a)) == a`` to within numerical accuracy.
827 For a description of the definitions and conventions used, see `numpy.fft`.
829 The input, analogously to `ifft`, should be ordered in the same way as is
830 returned by `fftn`, i.e. it should have the term for zero frequency
831 in all axes in the low-order corner, the positive frequency terms in the
832 first half of all axes, the term for the Nyquist frequency in the middle
833 of all axes and the negative frequency terms in the second half of all
834 axes, in order of decreasingly negative frequency.
836 Parameters
837 ----------
838 a : array_like
839 Input array, can be complex.
840 s : sequence of ints, optional
841 Shape (length of each transformed axis) of the output
842 (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.).
843 This corresponds to ``n`` for ``ifft(x, n)``.
844 Along any axis, if the given shape is smaller than that of the input,
845 the input is cropped. If it is larger, the input is padded with zeros.
846 if `s` is not given, the shape of the input along the axes specified
847 by `axes` is used. See notes for issue on `ifft` zero padding.
848 axes : sequence of ints, optional
849 Axes over which to compute the IFFT. If not given, the last ``len(s)``
850 axes are used, or all axes if `s` is also not specified.
851 Repeated indices in `axes` means that the inverse transform over that
852 axis is performed multiple times.
853 norm : {"backward", "ortho", "forward"}, optional
854 .. versionadded:: 1.10.0
856 Normalization mode (see `numpy.fft`). Default is "backward".
857 Indicates which direction of the forward/backward pair of transforms
858 is scaled and with what normalization factor.
860 .. versionadded:: 1.20.0
862 The "backward", "forward" values were added.
864 Returns
865 -------
866 out : complex ndarray
867 The truncated or zero-padded input, transformed along the axes
868 indicated by `axes`, or by a combination of `s` or `a`,
869 as explained in the parameters section above.
871 Raises
872 ------
873 ValueError
874 If `s` and `axes` have different length.
875 IndexError
876 If an element of `axes` is larger than than the number of axes of `a`.
878 See Also
879 --------
880 numpy.fft : Overall view of discrete Fourier transforms, with definitions
881 and conventions used.
882 fftn : The forward *n*-dimensional FFT, of which `ifftn` is the inverse.
883 ifft : The one-dimensional inverse FFT.
884 ifft2 : The two-dimensional inverse FFT.
885 ifftshift : Undoes `fftshift`, shifts zero-frequency terms to beginning
886 of array.
888 Notes
889 -----
890 See `numpy.fft` for definitions and conventions used.
892 Zero-padding, analogously with `ifft`, is performed by appending zeros to
893 the input along the specified dimension. Although this is the common
894 approach, it might lead to surprising results. If another form of zero
895 padding is desired, it must be performed before `ifftn` is called.
897 Examples
898 --------
899 >>> a = np.eye(4)
900 >>> np.fft.ifftn(np.fft.fftn(a, axes=(0,)), axes=(1,))
901 array([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j], # may vary
902 [0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],
903 [0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
904 [0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j]])
907 Create and plot an image with band-limited frequency content:
909 >>> import matplotlib.pyplot as plt
910 >>> n = np.zeros((200,200), dtype=complex)
911 >>> n[60:80, 20:40] = np.exp(1j*np.random.uniform(0, 2*np.pi, (20, 20)))
912 >>> im = np.fft.ifftn(n).real
913 >>> plt.imshow(im)
914 <matplotlib.image.AxesImage object at 0x...>
915 >>> plt.show()
917 """
918 return _raw_fftnd(a, s, axes, ifft, norm)
921@array_function_dispatch(_fftn_dispatcher)
922def fft2(a, s=None, axes=(-2, -1), norm=None):
923 """
924 Compute the 2-dimensional discrete Fourier Transform.
926 This function computes the *n*-dimensional discrete Fourier Transform
927 over any axes in an *M*-dimensional array by means of the
928 Fast Fourier Transform (FFT). By default, the transform is computed over
929 the last two axes of the input array, i.e., a 2-dimensional FFT.
931 Parameters
932 ----------
933 a : array_like
934 Input array, can be complex
935 s : sequence of ints, optional
936 Shape (length of each transformed axis) of the output
937 (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.).
938 This corresponds to ``n`` for ``fft(x, n)``.
939 Along each axis, if the given shape is smaller than that of the input,
940 the input is cropped. If it is larger, the input is padded with zeros.
941 if `s` is not given, the shape of the input along the axes specified
942 by `axes` is used.
943 axes : sequence of ints, optional
944 Axes over which to compute the FFT. If not given, the last two
945 axes are used. A repeated index in `axes` means the transform over
946 that axis is performed multiple times. A one-element sequence means
947 that a one-dimensional FFT is performed.
948 norm : {"backward", "ortho", "forward"}, optional
949 .. versionadded:: 1.10.0
951 Normalization mode (see `numpy.fft`). Default is "backward".
952 Indicates which direction of the forward/backward pair of transforms
953 is scaled and with what normalization factor.
955 .. versionadded:: 1.20.0
957 The "backward", "forward" values were added.
959 Returns
960 -------
961 out : complex ndarray
962 The truncated or zero-padded input, transformed along the axes
963 indicated by `axes`, or the last two axes if `axes` is not given.
965 Raises
966 ------
967 ValueError
968 If `s` and `axes` have different length, or `axes` not given and
969 ``len(s) != 2``.
970 IndexError
971 If an element of `axes` is larger than than the number of axes of `a`.
973 See Also
974 --------
975 numpy.fft : Overall view of discrete Fourier transforms, with definitions
976 and conventions used.
977 ifft2 : The inverse two-dimensional FFT.
978 fft : The one-dimensional FFT.
979 fftn : The *n*-dimensional FFT.
980 fftshift : Shifts zero-frequency terms to the center of the array.
981 For two-dimensional input, swaps first and third quadrants, and second
982 and fourth quadrants.
984 Notes
985 -----
986 `fft2` is just `fftn` with a different default for `axes`.
988 The output, analogously to `fft`, contains the term for zero frequency in
989 the low-order corner of the transformed axes, the positive frequency terms
990 in the first half of these axes, the term for the Nyquist frequency in the
991 middle of the axes and the negative frequency terms in the second half of
992 the axes, in order of decreasingly negative frequency.
994 See `fftn` for details and a plotting example, and `numpy.fft` for
995 definitions and conventions used.
998 Examples
999 --------
1000 >>> a = np.mgrid[:5, :5][0]
1001 >>> np.fft.fft2(a)
1002 array([[ 50. +0.j , 0. +0.j , 0. +0.j , # may vary
1003 0. +0.j , 0. +0.j ],
1004 [-12.5+17.20477401j, 0. +0.j , 0. +0.j ,
1005 0. +0.j , 0. +0.j ],
1006 [-12.5 +4.0614962j , 0. +0.j , 0. +0.j ,
1007 0. +0.j , 0. +0.j ],
1008 [-12.5 -4.0614962j , 0. +0.j , 0. +0.j ,
1009 0. +0.j , 0. +0.j ],
1010 [-12.5-17.20477401j, 0. +0.j , 0. +0.j ,
1011 0. +0.j , 0. +0.j ]])
1013 """
1014 return _raw_fftnd(a, s, axes, fft, norm)
1017@array_function_dispatch(_fftn_dispatcher)
1018def ifft2(a, s=None, axes=(-2, -1), norm=None):
1019 """
1020 Compute the 2-dimensional inverse discrete Fourier Transform.
1022 This function computes the inverse of the 2-dimensional discrete Fourier
1023 Transform over any number of axes in an M-dimensional array by means of
1024 the Fast Fourier Transform (FFT). In other words, ``ifft2(fft2(a)) == a``
1025 to within numerical accuracy. By default, the inverse transform is
1026 computed over the last two axes of the input array.
1028 The input, analogously to `ifft`, should be ordered in the same way as is
1029 returned by `fft2`, i.e. it should have the term for zero frequency
1030 in the low-order corner of the two axes, the positive frequency terms in
1031 the first half of these axes, the term for the Nyquist frequency in the
1032 middle of the axes and the negative frequency terms in the second half of
1033 both axes, in order of decreasingly negative frequency.
1035 Parameters
1036 ----------
1037 a : array_like
1038 Input array, can be complex.
1039 s : sequence of ints, optional
1040 Shape (length of each axis) of the output (``s[0]`` refers to axis 0,
1041 ``s[1]`` to axis 1, etc.). This corresponds to `n` for ``ifft(x, n)``.
1042 Along each axis, if the given shape is smaller than that of the input,
1043 the input is cropped. If it is larger, the input is padded with zeros.
1044 if `s` is not given, the shape of the input along the axes specified
1045 by `axes` is used. See notes for issue on `ifft` zero padding.
1046 axes : sequence of ints, optional
1047 Axes over which to compute the FFT. If not given, the last two
1048 axes are used. A repeated index in `axes` means the transform over
1049 that axis is performed multiple times. A one-element sequence means
1050 that a one-dimensional FFT is performed.
1051 norm : {"backward", "ortho", "forward"}, optional
1052 .. versionadded:: 1.10.0
1054 Normalization mode (see `numpy.fft`). Default is "backward".
1055 Indicates which direction of the forward/backward pair of transforms
1056 is scaled and with what normalization factor.
1058 .. versionadded:: 1.20.0
1060 The "backward", "forward" values were added.
1062 Returns
1063 -------
1064 out : complex ndarray
1065 The truncated or zero-padded input, transformed along the axes
1066 indicated by `axes`, or the last two axes if `axes` is not given.
1068 Raises
1069 ------
1070 ValueError
1071 If `s` and `axes` have different length, or `axes` not given and
1072 ``len(s) != 2``.
1073 IndexError
1074 If an element of `axes` is larger than than the number of axes of `a`.
1076 See Also
1077 --------
1078 numpy.fft : Overall view of discrete Fourier transforms, with definitions
1079 and conventions used.
1080 fft2 : The forward 2-dimensional FFT, of which `ifft2` is the inverse.
1081 ifftn : The inverse of the *n*-dimensional FFT.
1082 fft : The one-dimensional FFT.
1083 ifft : The one-dimensional inverse FFT.
1085 Notes
1086 -----
1087 `ifft2` is just `ifftn` with a different default for `axes`.
1089 See `ifftn` for details and a plotting example, and `numpy.fft` for
1090 definition and conventions used.
1092 Zero-padding, analogously with `ifft`, is performed by appending zeros to
1093 the input along the specified dimension. Although this is the common
1094 approach, it might lead to surprising results. If another form of zero
1095 padding is desired, it must be performed before `ifft2` is called.
1097 Examples
1098 --------
1099 >>> a = 4 * np.eye(4)
1100 >>> np.fft.ifft2(a)
1101 array([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j], # may vary
1102 [0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j],
1103 [0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
1104 [0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j]])
1106 """
1107 return _raw_fftnd(a, s, axes, ifft, norm)
1110@array_function_dispatch(_fftn_dispatcher)
1111def rfftn(a, s=None, axes=None, norm=None):
1112 """
1113 Compute the N-dimensional discrete Fourier Transform for real input.
1115 This function computes the N-dimensional discrete Fourier Transform over
1116 any number of axes in an M-dimensional real array by means of the Fast
1117 Fourier Transform (FFT). By default, all axes are transformed, with the
1118 real transform performed over the last axis, while the remaining
1119 transforms are complex.
1121 Parameters
1122 ----------
1123 a : array_like
1124 Input array, taken to be real.
1125 s : sequence of ints, optional
1126 Shape (length along each transformed axis) to use from the input.
1127 (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.).
1128 The final element of `s` corresponds to `n` for ``rfft(x, n)``, while
1129 for the remaining axes, it corresponds to `n` for ``fft(x, n)``.
1130 Along any axis, if the given shape is smaller than that of the input,
1131 the input is cropped. If it is larger, the input is padded with zeros.
1132 if `s` is not given, the shape of the input along the axes specified
1133 by `axes` is used.
1134 axes : sequence of ints, optional
1135 Axes over which to compute the FFT. If not given, the last ``len(s)``
1136 axes are used, or all axes if `s` is also not specified.
1137 norm : {"backward", "ortho", "forward"}, optional
1138 .. versionadded:: 1.10.0
1140 Normalization mode (see `numpy.fft`). Default is "backward".
1141 Indicates which direction of the forward/backward pair of transforms
1142 is scaled and with what normalization factor.
1144 .. versionadded:: 1.20.0
1146 The "backward", "forward" values were added.
1148 Returns
1149 -------
1150 out : complex ndarray
1151 The truncated or zero-padded input, transformed along the axes
1152 indicated by `axes`, or by a combination of `s` and `a`,
1153 as explained in the parameters section above.
1154 The length of the last axis transformed will be ``s[-1]//2+1``,
1155 while the remaining transformed axes will have lengths according to
1156 `s`, or unchanged from the input.
1158 Raises
1159 ------
1160 ValueError
1161 If `s` and `axes` have different length.
1162 IndexError
1163 If an element of `axes` is larger than than the number of axes of `a`.
1165 See Also
1166 --------
1167 irfftn : The inverse of `rfftn`, i.e. the inverse of the n-dimensional FFT
1168 of real input.
1169 fft : The one-dimensional FFT, with definitions and conventions used.
1170 rfft : The one-dimensional FFT of real input.
1171 fftn : The n-dimensional FFT.
1172 rfft2 : The two-dimensional FFT of real input.
1174 Notes
1175 -----
1176 The transform for real input is performed over the last transformation
1177 axis, as by `rfft`, then the transform over the remaining axes is
1178 performed as by `fftn`. The order of the output is as for `rfft` for the
1179 final transformation axis, and as for `fftn` for the remaining
1180 transformation axes.
1182 See `fft` for details, definitions and conventions used.
1184 Examples
1185 --------
1186 >>> a = np.ones((2, 2, 2))
1187 >>> np.fft.rfftn(a)
1188 array([[[8.+0.j, 0.+0.j], # may vary
1189 [0.+0.j, 0.+0.j]],
1190 [[0.+0.j, 0.+0.j],
1191 [0.+0.j, 0.+0.j]]])
1193 >>> np.fft.rfftn(a, axes=(2, 0))
1194 array([[[4.+0.j, 0.+0.j], # may vary
1195 [4.+0.j, 0.+0.j]],
1196 [[0.+0.j, 0.+0.j],
1197 [0.+0.j, 0.+0.j]]])
1199 """
1200 a = asarray(a)
1201 s, axes = _cook_nd_args(a, s, axes)
1202 a = rfft(a, s[-1], axes[-1], norm)
1203 for ii in range(len(axes)-1):
1204 a = fft(a, s[ii], axes[ii], norm)
1205 return a
1208@array_function_dispatch(_fftn_dispatcher)
1209def rfft2(a, s=None, axes=(-2, -1), norm=None):
1210 """
1211 Compute the 2-dimensional FFT of a real array.
1213 Parameters
1214 ----------
1215 a : array
1216 Input array, taken to be real.
1217 s : sequence of ints, optional
1218 Shape of the FFT.
1219 axes : sequence of ints, optional
1220 Axes over which to compute the FFT.
1221 norm : {"backward", "ortho", "forward"}, optional
1222 .. versionadded:: 1.10.0
1224 Normalization mode (see `numpy.fft`). Default is "backward".
1225 Indicates which direction of the forward/backward pair of transforms
1226 is scaled and with what normalization factor.
1228 .. versionadded:: 1.20.0
1230 The "backward", "forward" values were added.
1232 Returns
1233 -------
1234 out : ndarray
1235 The result of the real 2-D FFT.
1237 See Also
1238 --------
1239 rfftn : Compute the N-dimensional discrete Fourier Transform for real
1240 input.
1242 Notes
1243 -----
1244 This is really just `rfftn` with different default behavior.
1245 For more details see `rfftn`.
1247 Examples
1248 --------
1249 >>> a = np.mgrid[:5, :5][0]
1250 >>> np.fft.rfft2(a)
1251 array([[ 50. +0.j , 0. +0.j , 0. +0.j ],
1252 [-12.5+17.20477401j, 0. +0.j , 0. +0.j ],
1253 [-12.5 +4.0614962j , 0. +0.j , 0. +0.j ],
1254 [-12.5 -4.0614962j , 0. +0.j , 0. +0.j ],
1255 [-12.5-17.20477401j, 0. +0.j , 0. +0.j ]])
1256 """
1257 return rfftn(a, s, axes, norm)
1260@array_function_dispatch(_fftn_dispatcher)
1261def irfftn(a, s=None, axes=None, norm=None):
1262 """
1263 Computes the inverse of `rfftn`.
1265 This function computes the inverse of the N-dimensional discrete
1266 Fourier Transform for real input over any number of axes in an
1267 M-dimensional array by means of the Fast Fourier Transform (FFT). In
1268 other words, ``irfftn(rfftn(a), a.shape) == a`` to within numerical
1269 accuracy. (The ``a.shape`` is necessary like ``len(a)`` is for `irfft`,
1270 and for the same reason.)
1272 The input should be ordered in the same way as is returned by `rfftn`,
1273 i.e. as for `irfft` for the final transformation axis, and as for `ifftn`
1274 along all the other axes.
1276 Parameters
1277 ----------
1278 a : array_like
1279 Input array.
1280 s : sequence of ints, optional
1281 Shape (length of each transformed axis) of the output
1282 (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.). `s` is also the
1283 number of input points used along this axis, except for the last axis,
1284 where ``s[-1]//2+1`` points of the input are used.
1285 Along any axis, if the shape indicated by `s` is smaller than that of
1286 the input, the input is cropped. If it is larger, the input is padded
1287 with zeros. If `s` is not given, the shape of the input along the axes
1288 specified by axes is used. Except for the last axis which is taken to
1289 be ``2*(m-1)`` where ``m`` is the length of the input along that axis.
1290 axes : sequence of ints, optional
1291 Axes over which to compute the inverse FFT. If not given, the last
1292 `len(s)` axes are used, or all axes if `s` is also not specified.
1293 Repeated indices in `axes` means that the inverse transform over that
1294 axis is performed multiple times.
1295 norm : {"backward", "ortho", "forward"}, optional
1296 .. versionadded:: 1.10.0
1298 Normalization mode (see `numpy.fft`). Default is "backward".
1299 Indicates which direction of the forward/backward pair of transforms
1300 is scaled and with what normalization factor.
1302 .. versionadded:: 1.20.0
1304 The "backward", "forward" values were added.
1306 Returns
1307 -------
1308 out : ndarray
1309 The truncated or zero-padded input, transformed along the axes
1310 indicated by `axes`, or by a combination of `s` or `a`,
1311 as explained in the parameters section above.
1312 The length of each transformed axis is as given by the corresponding
1313 element of `s`, or the length of the input in every axis except for the
1314 last one if `s` is not given. In the final transformed axis the length
1315 of the output when `s` is not given is ``2*(m-1)`` where ``m`` is the
1316 length of the final transformed axis of the input. To get an odd
1317 number of output points in the final axis, `s` must be specified.
1319 Raises
1320 ------
1321 ValueError
1322 If `s` and `axes` have different length.
1323 IndexError
1324 If an element of `axes` is larger than than the number of axes of `a`.
1326 See Also
1327 --------
1328 rfftn : The forward n-dimensional FFT of real input,
1329 of which `ifftn` is the inverse.
1330 fft : The one-dimensional FFT, with definitions and conventions used.
1331 irfft : The inverse of the one-dimensional FFT of real input.
1332 irfft2 : The inverse of the two-dimensional FFT of real input.
1334 Notes
1335 -----
1336 See `fft` for definitions and conventions used.
1338 See `rfft` for definitions and conventions used for real input.
1340 The correct interpretation of the hermitian input depends on the shape of
1341 the original data, as given by `s`. This is because each input shape could
1342 correspond to either an odd or even length signal. By default, `irfftn`
1343 assumes an even output length which puts the last entry at the Nyquist
1344 frequency; aliasing with its symmetric counterpart. When performing the
1345 final complex to real transform, the last value is thus treated as purely
1346 real. To avoid losing information, the correct shape of the real input
1347 **must** be given.
1349 Examples
1350 --------
1351 >>> a = np.zeros((3, 2, 2))
1352 >>> a[0, 0, 0] = 3 * 2 * 2
1353 >>> np.fft.irfftn(a)
1354 array([[[1., 1.],
1355 [1., 1.]],
1356 [[1., 1.],
1357 [1., 1.]],
1358 [[1., 1.],
1359 [1., 1.]]])
1361 """
1362 a = asarray(a)
1363 s, axes = _cook_nd_args(a, s, axes, invreal=1)
1364 for ii in range(len(axes)-1):
1365 a = ifft(a, s[ii], axes[ii], norm)
1366 a = irfft(a, s[-1], axes[-1], norm)
1367 return a
1370@array_function_dispatch(_fftn_dispatcher)
1371def irfft2(a, s=None, axes=(-2, -1), norm=None):
1372 """
1373 Computes the inverse of `rfft2`.
1375 Parameters
1376 ----------
1377 a : array_like
1378 The input array
1379 s : sequence of ints, optional
1380 Shape of the real output to the inverse FFT.
1381 axes : sequence of ints, optional
1382 The axes over which to compute the inverse fft.
1383 Default is the last two axes.
1384 norm : {"backward", "ortho", "forward"}, optional
1385 .. versionadded:: 1.10.0
1387 Normalization mode (see `numpy.fft`). Default is "backward".
1388 Indicates which direction of the forward/backward pair of transforms
1389 is scaled and with what normalization factor.
1391 .. versionadded:: 1.20.0
1393 The "backward", "forward" values were added.
1395 Returns
1396 -------
1397 out : ndarray
1398 The result of the inverse real 2-D FFT.
1400 See Also
1401 --------
1402 rfft2 : The forward two-dimensional FFT of real input,
1403 of which `irfft2` is the inverse.
1404 rfft : The one-dimensional FFT for real input.
1405 irfft : The inverse of the one-dimensional FFT of real input.
1406 irfftn : Compute the inverse of the N-dimensional FFT of real input.
1408 Notes
1409 -----
1410 This is really `irfftn` with different defaults.
1411 For more details see `irfftn`.
1413 Examples
1414 --------
1415 >>> a = np.mgrid[:5, :5][0]
1416 >>> A = np.fft.rfft2(a)
1417 >>> np.fft.irfft2(A, s=a.shape)
1418 array([[0., 0., 0., 0., 0.],
1419 [1., 1., 1., 1., 1.],
1420 [2., 2., 2., 2., 2.],
1421 [3., 3., 3., 3., 3.],
1422 [4., 4., 4., 4., 4.]])
1423 """
1424 return irfftn(a, s, axes, norm)