| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670 |
- from scipy._lib.uarray import generate_multimethod, Dispatchable
- from scipy._lib._array_api import xp_capabilities
- import numpy as np
- def _x_replacer(args, kwargs, dispatchables):
- """
- uarray argument replacer to replace the transform input array (``x``)
- """
- if len(args) > 0:
- return (dispatchables[0],) + args[1:], kwargs
- kw = kwargs.copy()
- kw['x'] = dispatchables[0]
- return args, kw
- def _dispatch(func):
- """
- Function annotation that creates a uarray multimethod from the function
- """
- return generate_multimethod(func, _x_replacer, domain="numpy.scipy.fft")
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def fft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the 1-D discrete Fourier Transform.
- This function computes the 1-D *n*-point discrete Fourier
- Transform (DFT) with the efficient Fast Fourier Transform (FFT)
- algorithm [1]_.
- Parameters
- ----------
- x : array_like
- Input array, can be complex.
- n : int, optional
- Length of the transformed axis of the output.
- If `n` is smaller than the length of the input, the input is cropped.
- If it is larger, the input is padded with zeros. If `n` is not given,
- the length of the input along the axis specified by `axis` is used.
- axis : int, optional
- Axis over which to compute the FFT. If not given, the last axis is
- used.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode. Default is "backward", meaning no normalization on
- the forward transforms and scaling by ``1/n`` on the `ifft`.
- "forward" instead applies the ``1/n`` factor on the forward transform.
- For ``norm="ortho"``, both directions are scaled by ``1/sqrt(n)``.
- .. versionadded:: 1.6.0
- ``norm={"forward", "backward"}`` options were added
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See the notes below for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``. See below for more
- details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : complex ndarray
- The truncated or zero-padded input, transformed along the axis
- indicated by `axis`, or the last one if `axis` is not specified.
- Raises
- ------
- IndexError
- if `axes` is larger than the last axis of `x`.
- See Also
- --------
- ifft : The inverse of `fft`.
- fft2 : The 2-D FFT.
- fftn : The N-D FFT.
- rfftn : The N-D FFT of real input.
- fftfreq : Frequency bins for given FFT parameters.
- next_fast_len : Size to pad input to for most efficient transforms
- Notes
- -----
- FFT (Fast Fourier Transform) refers to a way the discrete Fourier Transform
- (DFT) can be calculated efficiently, by using symmetries in the calculated
- terms. The symmetry is highest when `n` is a power of 2, and the transform
- is therefore most efficient for these sizes. For poorly factorizable sizes,
- `scipy.fft` uses Bluestein's algorithm [2]_ and so is never worse than
- O(`n` log `n`). Further performance improvements may be seen by zero-padding
- the input using `next_fast_len`.
- If ``x`` is a 1d array, then the `fft` is equivalent to ::
- y[k] = np.sum(x * np.exp(-2j * np.pi * k * np.arange(n)/n))
- The frequency term ``f=k/n`` is found at ``y[k]``. At ``y[n/2]`` we reach
- the Nyquist frequency and wrap around to the negative-frequency terms. So,
- for an 8-point transform, the frequencies of the result are
- [0, 1, 2, 3, -4, -3, -2, -1]. To rearrange the fft output so that the
- zero-frequency component is centered, like [-4, -3, -2, -1, 0, 1, 2, 3],
- use `fftshift`.
- Transforms can be done in single, double, or extended precision (long
- double) floating point. Half precision inputs will be converted to single
- precision and non-floating-point inputs will be converted to double
- precision.
- If the data type of ``x`` is real, a "real FFT" algorithm is automatically
- used, which roughly halves the computation time. To increase efficiency
- a little further, use `rfft`, which does the same calculation, but only
- outputs half of the symmetrical spectrum. If the data are both real and
- symmetrical, the `dct` can again double the efficiency, by generating
- half of the spectrum from half of the signal.
- When ``overwrite_x=True`` is specified, the memory referenced by ``x`` may
- be used by the implementation in any way. This may include reusing the
- memory for the result, but this is in no way guaranteed. You should not
- rely on the contents of ``x`` after the transform as this may change in
- future without warning.
- The ``workers`` argument specifies the maximum number of parallel jobs to
- split the FFT computation into. This will execute independent 1-D
- FFTs within ``x``. So, ``x`` must be at least 2-D and the
- non-transformed axes must be large enough to split into chunks. If ``x`` is
- too small, fewer jobs may be used than requested.
- References
- ----------
- .. [1] Cooley, James W., and John W. Tukey, 1965, "An algorithm for the
- machine calculation of complex Fourier series," *Math. Comput.*
- 19: 297-301.
- .. [2] Bluestein, L., 1970, "A linear filtering approach to the
- computation of discrete Fourier transform". *IEEE Transactions on
- Audio and Electroacoustics.* 18 (4): 451-455.
- Examples
- --------
- >>> import scipy.fft
- >>> import numpy as np
- >>> scipy.fft.fft(np.exp(2j * np.pi * np.arange(8) / 8))
- array([-2.33486982e-16+1.14423775e-17j, 8.00000000e+00-1.25557246e-15j,
- 2.33486982e-16+2.33486982e-16j, 0.00000000e+00+1.22464680e-16j,
- -1.14423775e-17+2.33486982e-16j, 0.00000000e+00+5.20784380e-16j,
- 1.14423775e-17+1.14423775e-17j, 0.00000000e+00+1.22464680e-16j])
- In this example, real input has an FFT which is Hermitian, i.e., symmetric
- in the real part and anti-symmetric in the imaginary part:
- >>> from scipy.fft import fft, fftfreq, fftshift
- >>> import matplotlib.pyplot as plt
- >>> t = np.arange(256)
- >>> sp = fftshift(fft(np.sin(t)))
- >>> freq = fftshift(fftfreq(t.shape[-1]))
- >>> plt.plot(freq, sp.real, freq, sp.imag)
- [<matplotlib.lines.Line2D object at 0x...>,
- <matplotlib.lines.Line2D object at 0x...>]
- >>> plt.show()
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def ifft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the 1-D inverse discrete Fourier Transform.
- This function computes the inverse of the 1-D *n*-point
- discrete Fourier transform computed by `fft`. In other words,
- ``ifft(fft(x)) == x`` to within numerical accuracy.
- The input should be ordered in the same way as is returned by `fft`,
- i.e.,
- * ``x[0]`` should contain the zero frequency term,
- * ``x[1:n//2]`` should contain the positive-frequency terms,
- * ``x[n//2 + 1:]`` should contain the negative-frequency terms, in
- increasing order starting from the most negative frequency.
- For an even number of input points, ``x[n//2]`` represents the sum of
- the values at the positive and negative Nyquist frequencies, as the two
- are aliased together. See `fft` for details.
- Parameters
- ----------
- x : array_like
- Input array, can be complex.
- n : int, optional
- Length of the transformed axis of the output.
- If `n` is smaller than the length of the input, the input is cropped.
- If it is larger, the input is padded with zeros. If `n` is not given,
- the length of the input along the axis specified by `axis` is used.
- See notes about padding issues.
- axis : int, optional
- Axis over which to compute the inverse DFT. If not given, the last
- axis is used.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See :func:`fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : complex ndarray
- The truncated or zero-padded input, transformed along the axis
- indicated by `axis`, or the last one if `axis` is not specified.
- Raises
- ------
- IndexError
- If `axes` is larger than the last axis of `x`.
- See Also
- --------
- fft : The 1-D (forward) FFT, of which `ifft` is the inverse.
- ifft2 : The 2-D inverse FFT.
- ifftn : The N-D inverse FFT.
- Notes
- -----
- If the input parameter `n` is larger than the size of the input, the input
- is padded by appending zeros at the end. Even though this is the common
- approach, it might lead to surprising results. If a different padding is
- desired, it must be performed before calling `ifft`.
- If ``x`` is a 1-D array, then the `ifft` is equivalent to ::
- y[k] = np.sum(x * np.exp(2j * np.pi * k * np.arange(n)/n)) / len(x)
- As with `fft`, `ifft` has support for all floating point types and is
- optimized for real input.
- Examples
- --------
- >>> import scipy.fft
- >>> import numpy as np
- >>> scipy.fft.ifft([0, 4, 0, 0])
- array([ 1.+0.j, 0.+1.j, -1.+0.j, 0.-1.j]) # may vary
- Create and plot a band-limited signal with random phases:
- >>> import matplotlib.pyplot as plt
- >>> rng = np.random.default_rng()
- >>> t = np.arange(400)
- >>> n = np.zeros((400,), dtype=complex)
- >>> n[40:60] = np.exp(1j*rng.uniform(0, 2*np.pi, (20,)))
- >>> s = scipy.fft.ifft(n)
- >>> plt.plot(t, s.real, 'b-', t, s.imag, 'r--')
- [<matplotlib.lines.Line2D object at ...>, <matplotlib.lines.Line2D object at ...>]
- >>> plt.legend(('real', 'imaginary'))
- <matplotlib.legend.Legend object at ...>
- >>> plt.show()
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def rfft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the 1-D discrete Fourier Transform for real input.
- This function computes the 1-D *n*-point discrete Fourier
- Transform (DFT) of a real-valued array by means of an efficient algorithm
- called the Fast Fourier Transform (FFT).
- Parameters
- ----------
- x : array_like
- Input array
- n : int, optional
- Number of points along transformation axis in the input to use.
- If `n` is smaller than the length of the input, the input is cropped.
- If it is larger, the input is padded with zeros. If `n` is not given,
- the length of the input along the axis specified by `axis` is used.
- axis : int, optional
- Axis over which to compute the FFT. If not given, the last axis is
- used.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See :func:`fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : complex ndarray
- The truncated or zero-padded input, transformed along the axis
- indicated by `axis`, or the last one if `axis` is not specified.
- If `n` is even, the length of the transformed axis is ``(n/2)+1``.
- If `n` is odd, the length is ``(n+1)/2``.
- Raises
- ------
- IndexError
- If `axis` is larger than the last axis of `a`.
- See Also
- --------
- irfft : The inverse of `rfft`.
- fft : The 1-D FFT of general (complex) input.
- fftn : The N-D FFT.
- rfft2 : The 2-D FFT of real input.
- rfftn : The N-D FFT of real input.
- Notes
- -----
- When the DFT is computed for purely real input, the output is
- Hermitian-symmetric, i.e., the negative frequency terms are just the complex
- conjugates of the corresponding positive-frequency terms, and the
- negative-frequency terms are therefore redundant. This function does not
- compute the negative frequency terms, and the length of the transformed
- axis of the output is therefore ``n//2 + 1``.
- When ``X = rfft(x)`` and fs is the sampling frequency, ``X[0]`` contains
- the zero-frequency term 0*fs, which is real due to Hermitian symmetry.
- If `n` is even, ``A[-1]`` contains the term representing both positive
- and negative Nyquist frequency (+fs/2 and -fs/2), and must also be purely
- real. If `n` is odd, there is no term at fs/2; ``A[-1]`` contains
- the largest positive frequency (fs/2*(n-1)/n), and is complex in the
- general case.
- If the input `a` contains an imaginary part, it is silently discarded.
- Examples
- --------
- >>> import scipy.fft
- >>> scipy.fft.fft([0, 1, 0, 0])
- array([ 1.+0.j, 0.-1.j, -1.+0.j, 0.+1.j]) # may vary
- >>> scipy.fft.rfft([0, 1, 0, 0])
- array([ 1.+0.j, 0.-1.j, -1.+0.j]) # may vary
- Notice how the final element of the `fft` output is the complex conjugate
- of the second element, for real input. For `rfft`, this symmetry is
- exploited to compute only the non-negative frequency terms.
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def irfft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Computes the inverse of `rfft`.
- This function computes the inverse of the 1-D *n*-point
- discrete Fourier Transform of real input computed by `rfft`.
- In other words, ``irfft(rfft(x), len(x)) == x`` to within numerical
- accuracy. (See Notes below for why ``len(a)`` is necessary here.)
- The input is expected to be in the form returned by `rfft`, i.e., the
- real zero-frequency term followed by the complex positive frequency terms
- in order of increasing frequency. Since the discrete Fourier Transform of
- real input is Hermitian-symmetric, the negative frequency terms are taken
- to be the complex conjugates of the corresponding positive frequency terms.
- Parameters
- ----------
- x : array_like
- The input array.
- n : int, optional
- Length of the transformed axis of the output.
- For `n` output points, ``n//2+1`` input points are necessary. If the
- input is longer than this, it is cropped. If it is shorter than this,
- it is padded with zeros. If `n` is not given, it is taken to be
- ``2*(m-1)``, where ``m`` is the length of the input along the axis
- specified by `axis`.
- axis : int, optional
- Axis over which to compute the inverse FFT. If not given, the last
- axis is used.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See :func:`fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : ndarray
- The truncated or zero-padded input, transformed along the axis
- indicated by `axis`, or the last one if `axis` is not specified.
- The length of the transformed axis is `n`, or, if `n` is not given,
- ``2*(m-1)`` where ``m`` is the length of the transformed axis of the
- input. To get an odd number of output points, `n` must be specified.
- Raises
- ------
- IndexError
- If `axis` is larger than the last axis of `x`.
- See Also
- --------
- rfft : The 1-D FFT of real input, of which `irfft` is inverse.
- fft : The 1-D FFT.
- irfft2 : The inverse of the 2-D FFT of real input.
- irfftn : The inverse of the N-D FFT of real input.
- Notes
- -----
- Returns the real valued `n`-point inverse discrete Fourier transform
- of `x`, where `x` contains the non-negative frequency terms of a
- Hermitian-symmetric sequence. `n` is the length of the result, not the
- input.
- If you specify an `n` such that `a` must be zero-padded or truncated, the
- extra/removed values will be added/removed at high frequencies. One can
- thus resample a series to `m` points via Fourier interpolation by:
- ``a_resamp = irfft(rfft(a), m)``.
- The default value of `n` assumes an even output length. By the Hermitian
- symmetry, the last imaginary component must be 0 and so is ignored. To
- avoid losing information, the correct length of the real input *must* be
- given.
- Examples
- --------
- >>> import scipy.fft
- >>> scipy.fft.ifft([1, -1j, -1, 1j])
- array([0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j]) # may vary
- >>> scipy.fft.irfft([1, -1j, -1])
- array([0., 1., 0., 0.])
- Notice how the last term in the input to the ordinary `ifft` is the
- complex conjugate of the second term, and the output has zero imaginary
- part everywhere. When calling `irfft`, the negative frequencies are not
- specified, and the output array is purely real.
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def hfft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the FFT of a signal that has Hermitian symmetry, i.e., a real
- spectrum.
- Parameters
- ----------
- x : array_like
- The input array.
- n : int, optional
- Length of the transformed axis of the output. For `n` output
- points, ``n//2 + 1`` input points are necessary. If the input is
- longer than this, it is cropped. If it is shorter than this, it is
- padded with zeros. If `n` is not given, it is taken to be ``2*(m-1)``,
- where ``m`` is the length of the input along the axis specified by
- `axis`.
- axis : int, optional
- Axis over which to compute the FFT. If not given, the last
- axis is used.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See `fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : ndarray
- The truncated or zero-padded input, transformed along the axis
- indicated by `axis`, or the last one if `axis` is not specified.
- The length of the transformed axis is `n`, or, if `n` is not given,
- ``2*m - 2``, where ``m`` is the length of the transformed axis of
- the input. To get an odd number of output points, `n` must be
- specified, for instance, as ``2*m - 1`` in the typical case,
- Raises
- ------
- IndexError
- If `axis` is larger than the last axis of `a`.
- See Also
- --------
- rfft : Compute the 1-D FFT for real input.
- ihfft : The inverse of `hfft`.
- hfftn : Compute the N-D FFT of a Hermitian signal.
- Notes
- -----
- `hfft`/`ihfft` are a pair analogous to `rfft`/`irfft`, but for the
- opposite case: here the signal has Hermitian symmetry in the time
- domain and is real in the frequency domain. So, here, it's `hfft`, for
- which you must supply the length of the result if it is to be odd.
- * even: ``ihfft(hfft(a, 2*len(a) - 2) == a``, within roundoff error,
- * odd: ``ihfft(hfft(a, 2*len(a) - 1) == a``, within roundoff error.
- Examples
- --------
- >>> from scipy.fft import fft, hfft
- >>> import numpy as np
- >>> a = 2 * np.pi * np.arange(10) / 10
- >>> signal = np.cos(a) + 3j * np.sin(3 * a)
- >>> fft(signal).round(10)
- array([ -0.+0.j, 5.+0.j, -0.+0.j, 15.-0.j, 0.+0.j, 0.+0.j,
- -0.+0.j, -15.-0.j, 0.+0.j, 5.+0.j])
- >>> hfft(signal[:6]).round(10) # Input first half of signal
- array([ 0., 5., 0., 15., -0., 0., 0., -15., -0., 5.])
- >>> hfft(signal, 10) # Input entire signal and truncate
- array([ 0., 5., 0., 15., -0., 0., 0., -15., -0., 5.])
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def ihfft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the inverse FFT of a signal that has Hermitian symmetry.
- Parameters
- ----------
- x : array_like
- Input array.
- n : int, optional
- Length of the inverse FFT, the number of points along
- transformation axis in the input to use. If `n` is smaller than
- the length of the input, the input is cropped. If it is larger,
- the input is padded with zeros. If `n` is not given, the length of
- the input along the axis specified by `axis` is used.
- axis : int, optional
- Axis over which to compute the inverse FFT. If not given, the last
- axis is used.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See `fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : complex ndarray
- The truncated or zero-padded input, transformed along the axis
- indicated by `axis`, or the last one if `axis` is not specified.
- The length of the transformed axis is ``n//2 + 1``.
- See Also
- --------
- hfft, irfft
- Notes
- -----
- `hfft`/`ihfft` are a pair analogous to `rfft`/`irfft`, but for the
- opposite case: here, the signal has Hermitian symmetry in the time
- domain and is real in the frequency domain. So, here, it's `hfft`, for
- which you must supply the length of the result if it is to be odd:
- * even: ``ihfft(hfft(a, 2*len(a) - 2) == a``, within roundoff error,
- * odd: ``ihfft(hfft(a, 2*len(a) - 1) == a``, within roundoff error.
- Examples
- --------
- >>> from scipy.fft import ifft, ihfft
- >>> import numpy as np
- >>> spectrum = np.array([ 15, -4, 0, -1, 0, -4])
- >>> ifft(spectrum)
- array([1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j, 3.+0.j, 2.+0.j]) # may vary
- >>> ihfft(spectrum)
- array([ 1.-0.j, 2.-0.j, 3.-0.j, 4.-0.j]) # may vary
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def fftn(x, s=None, axes=None, norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the N-D discrete Fourier Transform.
- This function computes the N-D discrete Fourier Transform over
- any number of axes in an M-D array by means of the Fast Fourier
- Transform (FFT).
- Parameters
- ----------
- x : array_like
- Input array, can be complex.
- s : sequence of ints, optional
- Shape (length of each transformed axis) of the output
- (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.).
- This corresponds to ``n`` for ``fft(x, n)``.
- Along any axis, if the given shape is smaller than that of the input,
- the input is cropped. If it is larger, the input is padded with zeros.
- if `s` is not given, the shape of the input along the axes specified
- by `axes` is used.
- axes : sequence of ints, optional
- Axes over which to compute the FFT. If not given, the last ``len(s)``
- axes are used, or all axes if `s` is also not specified.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See :func:`fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : complex ndarray
- The truncated or zero-padded input, transformed along the axes
- indicated by `axes`, or by a combination of `s` and `x`,
- as explained in the parameters section above.
- Raises
- ------
- ValueError
- If `s` and `axes` have different length.
- IndexError
- If an element of `axes` is larger than the number of axes of `x`.
- See Also
- --------
- ifftn : The inverse of `fftn`, the inverse N-D FFT.
- fft : The 1-D FFT, with definitions and conventions used.
- rfftn : The N-D FFT of real input.
- fft2 : The 2-D FFT.
- fftshift : Shifts zero-frequency terms to centre of array.
- Notes
- -----
- The output, analogously to `fft`, contains the term for zero frequency in
- the low-order corner of all axes, the positive frequency terms in the
- first half of all axes, the term for the Nyquist frequency in the middle
- of all axes and the negative frequency terms in the second half of all
- axes, in order of decreasingly negative frequency.
- Examples
- --------
- >>> import scipy.fft
- >>> import numpy as np
- >>> x = np.mgrid[:3, :3, :3][0]
- >>> scipy.fft.fftn(x, axes=(1, 2))
- array([[[ 0.+0.j, 0.+0.j, 0.+0.j], # may vary
- [ 0.+0.j, 0.+0.j, 0.+0.j],
- [ 0.+0.j, 0.+0.j, 0.+0.j]],
- [[ 9.+0.j, 0.+0.j, 0.+0.j],
- [ 0.+0.j, 0.+0.j, 0.+0.j],
- [ 0.+0.j, 0.+0.j, 0.+0.j]],
- [[18.+0.j, 0.+0.j, 0.+0.j],
- [ 0.+0.j, 0.+0.j, 0.+0.j],
- [ 0.+0.j, 0.+0.j, 0.+0.j]]])
- >>> scipy.fft.fftn(x, (2, 2), axes=(0, 1))
- array([[[ 2.+0.j, 2.+0.j, 2.+0.j], # may vary
- [ 0.+0.j, 0.+0.j, 0.+0.j]],
- [[-2.+0.j, -2.+0.j, -2.+0.j],
- [ 0.+0.j, 0.+0.j, 0.+0.j]]])
- >>> import matplotlib.pyplot as plt
- >>> rng = np.random.default_rng()
- >>> [X, Y] = np.meshgrid(2 * np.pi * np.arange(200) / 12,
- ... 2 * np.pi * np.arange(200) / 34)
- >>> S = np.sin(X) + np.cos(Y) + rng.uniform(0, 1, X.shape)
- >>> FS = scipy.fft.fftn(S)
- >>> plt.imshow(np.log(np.abs(scipy.fft.fftshift(FS))**2))
- <matplotlib.image.AxesImage object at 0x...>
- >>> plt.show()
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def ifftn(x, s=None, axes=None, norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the N-D inverse discrete Fourier Transform.
- This function computes the inverse of the N-D discrete
- Fourier Transform over any number of axes in an M-D array by
- means of the Fast Fourier Transform (FFT). In other words,
- ``ifftn(fftn(x)) == x`` to within numerical accuracy.
- The input, analogously to `ifft`, should be ordered in the same way as is
- returned by `fftn`, i.e., it should have the term for zero frequency
- in all axes in the low-order corner, the positive frequency terms in the
- first half of all axes, the term for the Nyquist frequency in the middle
- of all axes and the negative frequency terms in the second half of all
- axes, in order of decreasingly negative frequency.
- Parameters
- ----------
- x : array_like
- Input array, can be complex.
- s : sequence of ints, optional
- Shape (length of each transformed axis) of the output
- (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.).
- This corresponds to ``n`` for ``ifft(x, n)``.
- Along any axis, if the given shape is smaller than that of the input,
- the input is cropped. If it is larger, the input is padded with zeros.
- if `s` is not given, the shape of the input along the axes specified
- by `axes` is used. See notes for issue on `ifft` zero padding.
- axes : sequence of ints, optional
- Axes over which to compute the IFFT. If not given, the last ``len(s)``
- axes are used, or all axes if `s` is also not specified.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See :func:`fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : complex ndarray
- The truncated or zero-padded input, transformed along the axes
- indicated by `axes`, or by a combination of `s` or `x`,
- as explained in the parameters section above.
- Raises
- ------
- ValueError
- If `s` and `axes` have different length.
- IndexError
- If an element of `axes` is larger than the number of axes of `x`.
- See Also
- --------
- fftn : The forward N-D FFT, of which `ifftn` is the inverse.
- ifft : The 1-D inverse FFT.
- ifft2 : The 2-D inverse FFT.
- ifftshift : Undoes `fftshift`, shifts zero-frequency terms to beginning
- of array.
- Notes
- -----
- Zero-padding, analogously with `ifft`, is performed by appending zeros to
- the input along the specified dimension. Although this is the common
- approach, it might lead to surprising results. If another form of zero
- padding is desired, it must be performed before `ifftn` is called.
- Examples
- --------
- >>> import scipy.fft
- >>> import numpy as np
- >>> x = np.eye(4)
- >>> scipy.fft.ifftn(scipy.fft.fftn(x, axes=(0,)), axes=(1,))
- array([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j], # may vary
- [0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],
- [0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
- [0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j]])
- Create and plot an image with band-limited frequency content:
- >>> import matplotlib.pyplot as plt
- >>> rng = np.random.default_rng()
- >>> n = np.zeros((200,200), dtype=complex)
- >>> n[60:80, 20:40] = np.exp(1j*rng.uniform(0, 2*np.pi, (20, 20)))
- >>> im = scipy.fft.ifftn(n).real
- >>> plt.imshow(im)
- <matplotlib.image.AxesImage object at 0x...>
- >>> plt.show()
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def fft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the 2-D discrete Fourier Transform
- This function computes the N-D discrete Fourier Transform
- over any axes in an M-D array by means of the
- Fast Fourier Transform (FFT). By default, the transform is computed over
- the last two axes of the input array, i.e., a 2-dimensional FFT.
- Parameters
- ----------
- x : array_like
- Input array, can be complex
- s : sequence of ints, optional
- Shape (length of each transformed axis) of the output
- (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.).
- This corresponds to ``n`` for ``fft(x, n)``.
- Along each axis, if the given shape is smaller than that of the input,
- the input is cropped. If it is larger, the input is padded with zeros.
- if `s` is not given, the shape of the input along the axes specified
- by `axes` is used.
- axes : sequence of ints, optional
- Axes over which to compute the FFT. If not given, the last two axes are
- used.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See :func:`fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : complex ndarray
- The truncated or zero-padded input, transformed along the axes
- indicated by `axes`, or the last two axes if `axes` is not given.
- Raises
- ------
- ValueError
- If `s` and `axes` have different length, or `axes` not given and
- ``len(s) != 2``.
- IndexError
- If an element of `axes` is larger than the number of axes of `x`.
- See Also
- --------
- ifft2 : The inverse 2-D FFT.
- fft : The 1-D FFT.
- fftn : The N-D FFT.
- fftshift : Shifts zero-frequency terms to the center of the array.
- For 2-D input, swaps first and third quadrants, and second
- and fourth quadrants.
- Notes
- -----
- `fft2` is just `fftn` with a different default for `axes`.
- The output, analogously to `fft`, contains the term for zero frequency in
- the low-order corner of the transformed axes, the positive frequency terms
- in the first half of these axes, the term for the Nyquist frequency in the
- middle of the axes and the negative frequency terms in the second half of
- the axes, in order of decreasingly negative frequency.
- See `fftn` for details and a plotting example, and `fft` for
- definitions and conventions used.
- Examples
- --------
- >>> import scipy.fft
- >>> import numpy as np
- >>> x = np.mgrid[:5, :5][0]
- >>> scipy.fft.fft2(x)
- array([[ 50. +0.j , 0. +0.j , 0. +0.j , # may vary
- 0. +0.j , 0. +0.j ],
- [-12.5+17.20477401j, 0. +0.j , 0. +0.j ,
- 0. +0.j , 0. +0.j ],
- [-12.5 +4.0614962j , 0. +0.j , 0. +0.j ,
- 0. +0.j , 0. +0.j ],
- [-12.5 -4.0614962j , 0. +0.j , 0. +0.j ,
- 0. +0.j , 0. +0.j ],
- [-12.5-17.20477401j, 0. +0.j , 0. +0.j ,
- 0. +0.j , 0. +0.j ]])
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def ifft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the 2-D inverse discrete Fourier Transform.
- This function computes the inverse of the 2-D discrete Fourier
- Transform over any number of axes in an M-D array by means of
- the Fast Fourier Transform (FFT). In other words, ``ifft2(fft2(x)) == x``
- to within numerical accuracy. By default, the inverse transform is
- computed over the last two axes of the input array.
- The input, analogously to `ifft`, should be ordered in the same way as is
- returned by `fft2`, i.e., it should have the term for zero frequency
- in the low-order corner of the two axes, the positive frequency terms in
- the first half of these axes, the term for the Nyquist frequency in the
- middle of the axes and the negative frequency terms in the second half of
- both axes, in order of decreasingly negative frequency.
- Parameters
- ----------
- x : array_like
- Input array, can be complex.
- s : sequence of ints, optional
- Shape (length of each axis) of the output (``s[0]`` refers to axis 0,
- ``s[1]`` to axis 1, etc.). This corresponds to `n` for ``ifft(x, n)``.
- Along each axis, if the given shape is smaller than that of the input,
- the input is cropped. If it is larger, the input is padded with zeros.
- if `s` is not given, the shape of the input along the axes specified
- by `axes` is used. See notes for issue on `ifft` zero padding.
- axes : sequence of ints, optional
- Axes over which to compute the FFT. If not given, the last two
- axes are used.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See :func:`fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : complex ndarray
- The truncated or zero-padded input, transformed along the axes
- indicated by `axes`, or the last two axes if `axes` is not given.
- Raises
- ------
- ValueError
- If `s` and `axes` have different length, or `axes` not given and
- ``len(s) != 2``.
- IndexError
- If an element of `axes` is larger than the number of axes of `x`.
- See Also
- --------
- fft2 : The forward 2-D FFT, of which `ifft2` is the inverse.
- ifftn : The inverse of the N-D FFT.
- fft : The 1-D FFT.
- ifft : The 1-D inverse FFT.
- Notes
- -----
- `ifft2` is just `ifftn` with a different default for `axes`.
- See `ifftn` for details and a plotting example, and `fft` for
- definition and conventions used.
- Zero-padding, analogously with `ifft`, is performed by appending zeros to
- the input along the specified dimension. Although this is the common
- approach, it might lead to surprising results. If another form of zero
- padding is desired, it must be performed before `ifft2` is called.
- Examples
- --------
- >>> import scipy.fft
- >>> import numpy as np
- >>> x = 4 * np.eye(4)
- >>> scipy.fft.ifft2(x)
- array([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j], # may vary
- [0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j],
- [0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
- [0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j]])
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def rfftn(x, s=None, axes=None, norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the N-D discrete Fourier Transform for real input.
- This function computes the N-D discrete Fourier Transform over
- any number of axes in an M-D real array by means of the Fast
- Fourier Transform (FFT). By default, all axes are transformed, with the
- real transform performed over the last axis, while the remaining
- transforms are complex.
- Parameters
- ----------
- x : array_like
- Input array, taken to be real.
- s : sequence of ints, optional
- Shape (length along each transformed axis) to use from the input.
- (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.).
- The final element of `s` corresponds to `n` for ``rfft(x, n)``, while
- for the remaining axes, it corresponds to `n` for ``fft(x, n)``.
- Along any axis, if the given shape is smaller than that of the input,
- the input is cropped. If it is larger, the input is padded with zeros.
- if `s` is not given, the shape of the input along the axes specified
- by `axes` is used.
- axes : sequence of ints, optional
- Axes over which to compute the FFT. If not given, the last ``len(s)``
- axes are used, or all axes if `s` is also not specified.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See :func:`fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : complex ndarray
- The truncated or zero-padded input, transformed along the axes
- indicated by `axes`, or by a combination of `s` and `x`,
- as explained in the parameters section above.
- The length of the last axis transformed will be ``s[-1]//2+1``,
- while the remaining transformed axes will have lengths according to
- `s`, or unchanged from the input.
- Raises
- ------
- ValueError
- If `s` and `axes` have different length.
- IndexError
- If an element of `axes` is larger than the number of axes of `x`.
- See Also
- --------
- irfftn : The inverse of `rfftn`, i.e., the inverse of the N-D FFT
- of real input.
- fft : The 1-D FFT, with definitions and conventions used.
- rfft : The 1-D FFT of real input.
- fftn : The N-D FFT.
- rfft2 : The 2-D FFT of real input.
- Notes
- -----
- The transform for real input is performed over the last transformation
- axis, as by `rfft`, then the transform over the remaining axes is
- performed as by `fftn`. The order of the output is as for `rfft` for the
- final transformation axis, and as for `fftn` for the remaining
- transformation axes.
- See `fft` for details, definitions and conventions used.
- Examples
- --------
- >>> import scipy.fft
- >>> import numpy as np
- >>> x = np.ones((2, 2, 2))
- >>> scipy.fft.rfftn(x)
- array([[[8.+0.j, 0.+0.j], # may vary
- [0.+0.j, 0.+0.j]],
- [[0.+0.j, 0.+0.j],
- [0.+0.j, 0.+0.j]]])
- >>> scipy.fft.rfftn(x, axes=(2, 0))
- array([[[4.+0.j, 0.+0.j], # may vary
- [4.+0.j, 0.+0.j]],
- [[0.+0.j, 0.+0.j],
- [0.+0.j, 0.+0.j]]])
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def rfft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the 2-D FFT of a real array.
- Parameters
- ----------
- x : array
- Input array, taken to be real.
- s : sequence of ints, optional
- Shape of the FFT.
- axes : sequence of ints, optional
- Axes over which to compute the FFT.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See :func:`fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : ndarray
- The result of the real 2-D FFT.
- See Also
- --------
- irfft2 : The inverse of the 2-D FFT of real input.
- rfft : The 1-D FFT of real input.
- rfftn : Compute the N-D discrete Fourier Transform for real
- input.
- Notes
- -----
- This is really just `rfftn` with different default behavior.
- For more details see `rfftn`.
- Examples
- --------
- >>> import scipy.fft
- >>> import numpy as np
- >>> x = np.broadcast_to([1, 0, -1, 0], (4, 4))
- >>> scipy.fft.rfft2(x)
- array([[0.+0.j, 8.+0.j, 0.+0.j],
- [0.+0.j, 0.+0.j, 0.+0.j],
- [0.+0.j, 0.+0.j, 0.+0.j],
- [0.+0.j, 0.+0.j, 0.+0.j]])
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def irfftn(x, s=None, axes=None, norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Computes the inverse of `rfftn`
- This function computes the inverse of the N-D discrete
- Fourier Transform for real input over any number of axes in an
- M-D array by means of the Fast Fourier Transform (FFT). In
- other words, ``irfftn(rfftn(x), x.shape) == x`` to within numerical
- accuracy. (The ``a.shape`` is necessary like ``len(a)`` is for `irfft`,
- and for the same reason.)
- The input should be ordered in the same way as is returned by `rfftn`,
- i.e., as for `irfft` for the final transformation axis, and as for `ifftn`
- along all the other axes.
- Parameters
- ----------
- x : array_like
- Input array.
- s : sequence of ints, optional
- Shape (length of each transformed axis) of the output
- (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.). `s` is also the
- number of input points used along this axis, except for the last axis,
- where ``s[-1]//2+1`` points of the input are used.
- Along any axis, if the shape indicated by `s` is smaller than that of
- the input, the input is cropped. If it is larger, the input is padded
- with zeros. If `s` is not given, the shape of the input along the axes
- specified by axes is used. Except for the last axis which is taken to be
- ``2*(m-1)``, where ``m`` is the length of the input along that axis.
- axes : sequence of ints, optional
- Axes over which to compute the inverse FFT. If not given, the last
- `len(s)` axes are used, or all axes if `s` is also not specified.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See :func:`fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : ndarray
- The truncated or zero-padded input, transformed along the axes
- indicated by `axes`, or by a combination of `s` or `x`,
- as explained in the parameters section above.
- The length of each transformed axis is as given by the corresponding
- element of `s`, or the length of the input in every axis except for the
- last one if `s` is not given. In the final transformed axis the length
- of the output when `s` is not given is ``2*(m-1)``, where ``m`` is the
- length of the final transformed axis of the input. To get an odd
- number of output points in the final axis, `s` must be specified.
- Raises
- ------
- ValueError
- If `s` and `axes` have different length.
- IndexError
- If an element of `axes` is larger than the number of axes of `x`.
- See Also
- --------
- rfftn : The forward N-D FFT of real input,
- of which `ifftn` is the inverse.
- fft : The 1-D FFT, with definitions and conventions used.
- irfft : The inverse of the 1-D FFT of real input.
- irfft2 : The inverse of the 2-D FFT of real input.
- Notes
- -----
- See `fft` for definitions and conventions used.
- See `rfft` for definitions and conventions used for real input.
- The default value of `s` assumes an even output length in the final
- transformation axis. When performing the final complex to real
- transformation, the Hermitian symmetry requires that the last imaginary
- component along that axis must be 0 and so it is ignored. To avoid losing
- information, the correct length of the real input *must* be given.
- Examples
- --------
- >>> import scipy.fft
- >>> import numpy as np
- >>> x = np.zeros((3, 2, 2))
- >>> x[0, 0, 0] = 3 * 2 * 2
- >>> scipy.fft.irfftn(x)
- array([[[1., 1.],
- [1., 1.]],
- [[1., 1.],
- [1., 1.]],
- [[1., 1.],
- [1., 1.]]])
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def irfft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Computes the inverse of `rfft2`
- Parameters
- ----------
- x : array_like
- The input array
- s : sequence of ints, optional
- Shape of the real output to the inverse FFT.
- axes : sequence of ints, optional
- The axes over which to compute the inverse fft.
- Default is the last two axes.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See :func:`fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : ndarray
- The result of the inverse real 2-D FFT.
- See Also
- --------
- rfft2 : The 2-D FFT of real input.
- irfft : The inverse of the 1-D FFT of real input.
- irfftn : The inverse of the N-D FFT of real input.
- Notes
- -----
- This is really `irfftn` with different defaults.
- For more details see `irfftn`.
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def hfftn(x, s=None, axes=None, norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the N-D FFT of Hermitian symmetric complex input, i.e., a
- signal with a real spectrum.
- This function computes the N-D discrete Fourier Transform for a
- Hermitian symmetric complex input over any number of axes in an
- M-D array by means of the Fast Fourier Transform (FFT). In other
- words, ``ihfftn(hfftn(x, s)) == x`` to within numerical accuracy. (``s``
- here is ``x.shape`` with ``s[-1] = x.shape[-1] * 2 - 1``, this is necessary
- for the same reason ``x.shape`` would be necessary for `irfft`.)
- Parameters
- ----------
- x : array_like
- Input array.
- s : sequence of ints, optional
- Shape (length of each transformed axis) of the output
- (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.). `s` is also the
- number of input points used along this axis, except for the last axis,
- where ``s[-1]//2+1`` points of the input are used.
- Along any axis, if the shape indicated by `s` is smaller than that of
- the input, the input is cropped. If it is larger, the input is padded
- with zeros. If `s` is not given, the shape of the input along the axes
- specified by axes is used. Except for the last axis which is taken to be
- ``2*(m-1)`` where ``m`` is the length of the input along that axis.
- axes : sequence of ints, optional
- Axes over which to compute the inverse FFT. If not given, the last
- `len(s)` axes are used, or all axes if `s` is also not specified.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See :func:`fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : ndarray
- The truncated or zero-padded input, transformed along the axes
- indicated by `axes`, or by a combination of `s` or `x`,
- as explained in the parameters section above.
- The length of each transformed axis is as given by the corresponding
- element of `s`, or the length of the input in every axis except for the
- last one if `s` is not given. In the final transformed axis the length
- of the output when `s` is not given is ``2*(m-1)`` where ``m`` is the
- length of the final transformed axis of the input. To get an odd
- number of output points in the final axis, `s` must be specified.
- Raises
- ------
- ValueError
- If `s` and `axes` have different length.
- IndexError
- If an element of `axes` is larger than the number of axes of `x`.
- See Also
- --------
- ihfftn : The inverse N-D FFT with real spectrum. Inverse of `hfftn`.
- fft : The 1-D FFT, with definitions and conventions used.
- rfft : Forward FFT of real input.
- Notes
- -----
- For a 1-D signal ``x`` to have a real spectrum, it must satisfy
- the Hermitian property::
- x[i] == np.conj(x[-i]) for all i
- This generalizes into higher dimensions by reflecting over each axis in
- turn::
- x[i, j, k, ...] == np.conj(x[-i, -j, -k, ...]) for all i, j, k, ...
- This should not be confused with a Hermitian matrix, for which the
- transpose is its own conjugate::
- x[i, j] == np.conj(x[j, i]) for all i, j
- The default value of `s` assumes an even output length in the final
- transformation axis. When performing the final complex to real
- transformation, the Hermitian symmetry requires that the last imaginary
- component along that axis must be 0 and so it is ignored. To avoid losing
- information, the correct length of the real input *must* be given.
- Examples
- --------
- >>> import scipy.fft
- >>> import numpy as np
- >>> x = np.ones((3, 2, 2))
- >>> scipy.fft.hfftn(x)
- array([[[12., 0.],
- [ 0., 0.]],
- [[ 0., 0.],
- [ 0., 0.]],
- [[ 0., 0.],
- [ 0., 0.]]])
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def hfft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the 2-D FFT of a Hermitian complex array.
- Parameters
- ----------
- x : array
- Input array, taken to be Hermitian complex.
- s : sequence of ints, optional
- Shape of the real output.
- axes : sequence of ints, optional
- Axes over which to compute the FFT.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See `fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : ndarray
- The real result of the 2-D Hermitian complex real FFT.
- See Also
- --------
- hfftn : Compute the N-D discrete Fourier Transform for Hermitian
- complex input.
- Notes
- -----
- This is really just `hfftn` with different default behavior.
- For more details see `hfftn`.
- Examples
- --------
- >>> import scipy.fft
- >>> import numpy as np
- >>> x = np.array([[1+0j, 2+0j], [2+0j, 1+0j]]) # Hermitian-symmetric input
- >>> scipy.fft.hfft2(x, s=(2, 2))
- array([[ 6., 0.],
- [ 0., -2.]])
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def ihfftn(x, s=None, axes=None, norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the N-D inverse discrete Fourier Transform for a real
- spectrum.
- This function computes the N-D inverse discrete Fourier Transform
- over any number of axes in an M-D real array by means of the Fast
- Fourier Transform (FFT). By default, all axes are transformed, with the
- real transform performed over the last axis, while the remaining transforms
- are complex.
- Parameters
- ----------
- x : array_like
- Input array, taken to be real.
- s : sequence of ints, optional
- Shape (length along each transformed axis) to use from the input.
- (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.).
- Along any axis, if the given shape is smaller than that of the input,
- the input is cropped. If it is larger, the input is padded with zeros.
- if `s` is not given, the shape of the input along the axes specified
- by `axes` is used.
- axes : sequence of ints, optional
- Axes over which to compute the FFT. If not given, the last ``len(s)``
- axes are used, or all axes if `s` is also not specified.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See :func:`fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : complex ndarray
- The truncated or zero-padded input, transformed along the axes
- indicated by `axes`, or by a combination of `s` and `x`,
- as explained in the parameters section above.
- The length of the last axis transformed will be ``s[-1]//2+1``,
- while the remaining transformed axes will have lengths according to
- `s`, or unchanged from the input.
- Raises
- ------
- ValueError
- If `s` and `axes` have different length.
- IndexError
- If an element of `axes` is larger than the number of axes of `x`.
- See Also
- --------
- hfftn : The forward N-D FFT of Hermitian input.
- hfft : The 1-D FFT of Hermitian input.
- fft : The 1-D FFT, with definitions and conventions used.
- fftn : The N-D FFT.
- hfft2 : The 2-D FFT of Hermitian input.
- Notes
- -----
- The transform for real input is performed over the last transformation
- axis, as by `ihfft`, then the transform over the remaining axes is
- performed as by `ifftn`. The order of the output is the positive part of
- the Hermitian output signal, in the same format as `rfft`.
- Examples
- --------
- >>> import scipy.fft
- >>> import numpy as np
- >>> x = np.ones((2, 2, 2))
- >>> scipy.fft.ihfftn(x)
- array([[[1.+0.j, 0.+0.j], # may vary
- [0.+0.j, 0.+0.j]],
- [[0.+0.j, 0.+0.j],
- [0.+0.j, 0.+0.j]]])
- >>> scipy.fft.ihfftn(x, axes=(2, 0))
- array([[[1.+0.j, 0.+0.j], # may vary
- [1.+0.j, 0.+0.j]],
- [[0.+0.j, 0.+0.j],
- [0.+0.j, 0.+0.j]]])
- """
- return (Dispatchable(x, np.ndarray),)
- @xp_capabilities(allow_dask_compute=True)
- @_dispatch
- def ihfft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None, *,
- plan=None):
- """
- Compute the 2-D inverse FFT of a real spectrum.
- Parameters
- ----------
- x : array_like
- The input array
- s : sequence of ints, optional
- Shape of the real input to the inverse FFT.
- axes : sequence of ints, optional
- The axes over which to compute the inverse fft.
- Default is the last two axes.
- norm : {"backward", "ortho", "forward"}, optional
- Normalization mode (see `fft`). Default is "backward".
- overwrite_x : bool, optional
- If True, the contents of `x` can be destroyed; the default is False.
- See :func:`fft` for more details.
- workers : int, optional
- Maximum number of workers to use for parallel computation. If negative,
- the value wraps around from ``os.cpu_count()``.
- See :func:`~scipy.fft.fft` for more details.
- plan : object, optional
- This argument is reserved for passing in a precomputed plan provided
- by downstream FFT vendors. It is currently not used in SciPy.
- .. versionadded:: 1.5.0
- Returns
- -------
- out : ndarray
- The result of the inverse real 2-D FFT.
- See Also
- --------
- ihfftn : Compute the inverse of the N-D FFT of Hermitian input.
- Notes
- -----
- This is really `ihfftn` with different defaults.
- For more details see `ihfftn`.
- """
- return (Dispatchable(x, np.ndarray),)
|