_basic.py 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629
  1. from scipy._lib.uarray import generate_multimethod, Dispatchable
  2. import numpy as np
  3. def _x_replacer(args, kwargs, dispatchables):
  4. """
  5. uarray argument replacer to replace the transform input array (``x``)
  6. """
  7. if len(args) > 0:
  8. return (dispatchables[0],) + args[1:], kwargs
  9. kw = kwargs.copy()
  10. kw['x'] = dispatchables[0]
  11. return args, kw
  12. def _dispatch(func):
  13. """
  14. Function annotation that creates a uarray multimethod from the function
  15. """
  16. return generate_multimethod(func, _x_replacer, domain="numpy.scipy.fft")
  17. @_dispatch
  18. def fft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *,
  19. plan=None):
  20. """
  21. Compute the 1-D discrete Fourier Transform.
  22. This function computes the 1-D *n*-point discrete Fourier
  23. Transform (DFT) with the efficient Fast Fourier Transform (FFT)
  24. algorithm [1]_.
  25. Parameters
  26. ----------
  27. x : array_like
  28. Input array, can be complex.
  29. n : int, optional
  30. Length of the transformed axis of the output.
  31. If `n` is smaller than the length of the input, the input is cropped.
  32. If it is larger, the input is padded with zeros. If `n` is not given,
  33. the length of the input along the axis specified by `axis` is used.
  34. axis : int, optional
  35. Axis over which to compute the FFT. If not given, the last axis is
  36. used.
  37. norm : {"backward", "ortho", "forward"}, optional
  38. Normalization mode. Default is "backward", meaning no normalization on
  39. the forward transforms and scaling by ``1/n`` on the `ifft`.
  40. "forward" instead applies the ``1/n`` factor on the forward tranform.
  41. For ``norm="ortho"``, both directions are scaled by ``1/sqrt(n)``.
  42. .. versionadded:: 1.6.0
  43. ``norm={"forward", "backward"}`` options were added
  44. overwrite_x : bool, optional
  45. If True, the contents of `x` can be destroyed; the default is False.
  46. See the notes below for more details.
  47. workers : int, optional
  48. Maximum number of workers to use for parallel computation. If negative,
  49. the value wraps around from ``os.cpu_count()``. See below for more
  50. details.
  51. plan : object, optional
  52. This argument is reserved for passing in a precomputed plan provided
  53. by downstream FFT vendors. It is currently not used in SciPy.
  54. .. versionadded:: 1.5.0
  55. Returns
  56. -------
  57. out : complex ndarray
  58. The truncated or zero-padded input, transformed along the axis
  59. indicated by `axis`, or the last one if `axis` is not specified.
  60. Raises
  61. ------
  62. IndexError
  63. if `axes` is larger than the last axis of `x`.
  64. See Also
  65. --------
  66. ifft : The inverse of `fft`.
  67. fft2 : The 2-D FFT.
  68. fftn : The N-D FFT.
  69. rfftn : The N-D FFT of real input.
  70. fftfreq : Frequency bins for given FFT parameters.
  71. next_fast_len : Size to pad input to for most efficient transforms
  72. Notes
  73. -----
  74. FFT (Fast Fourier Transform) refers to a way the discrete Fourier Transform
  75. (DFT) can be calculated efficiently, by using symmetries in the calculated
  76. terms. The symmetry is highest when `n` is a power of 2, and the transform
  77. is therefore most efficient for these sizes. For poorly factorizable sizes,
  78. `scipy.fft` uses Bluestein's algorithm [2]_ and so is never worse than
  79. O(`n` log `n`). Further performance improvements may be seen by zero-padding
  80. the input using `next_fast_len`.
  81. If ``x`` is a 1d array, then the `fft` is equivalent to ::
  82. y[k] = np.sum(x * np.exp(-2j * np.pi * k * np.arange(n)/n))
  83. The frequency term ``f=k/n`` is found at ``y[k]``. At ``y[n/2]`` we reach
  84. the Nyquist frequency and wrap around to the negative-frequency terms. So,
  85. for an 8-point transform, the frequencies of the result are
  86. [0, 1, 2, 3, -4, -3, -2, -1]. To rearrange the fft output so that the
  87. zero-frequency component is centered, like [-4, -3, -2, -1, 0, 1, 2, 3],
  88. use `fftshift`.
  89. Transforms can be done in single, double, or extended precision (long
  90. double) floating point. Half precision inputs will be converted to single
  91. precision and non-floating-point inputs will be converted to double
  92. precision.
  93. If the data type of ``x`` is real, a "real FFT" algorithm is automatically
  94. used, which roughly halves the computation time. To increase efficiency
  95. a little further, use `rfft`, which does the same calculation, but only
  96. outputs half of the symmetrical spectrum. If the data are both real and
  97. symmetrical, the `dct` can again double the efficiency, by generating
  98. half of the spectrum from half of the signal.
  99. When ``overwrite_x=True`` is specified, the memory referenced by ``x`` may
  100. be used by the implementation in any way. This may include reusing the
  101. memory for the result, but this is in no way guaranteed. You should not
  102. rely on the contents of ``x`` after the transform as this may change in
  103. future without warning.
  104. The ``workers`` argument specifies the maximum number of parallel jobs to
  105. split the FFT computation into. This will execute independent 1-D
  106. FFTs within ``x``. So, ``x`` must be at least 2-D and the
  107. non-transformed axes must be large enough to split into chunks. If ``x`` is
  108. too small, fewer jobs may be used than requested.
  109. References
  110. ----------
  111. .. [1] Cooley, James W., and John W. Tukey, 1965, "An algorithm for the
  112. machine calculation of complex Fourier series," *Math. Comput.*
  113. 19: 297-301.
  114. .. [2] Bluestein, L., 1970, "A linear filtering approach to the
  115. computation of discrete Fourier transform". *IEEE Transactions on
  116. Audio and Electroacoustics.* 18 (4): 451-455.
  117. Examples
  118. --------
  119. >>> import scipy.fft
  120. >>> import numpy as np
  121. >>> scipy.fft.fft(np.exp(2j * np.pi * np.arange(8) / 8))
  122. array([-2.33486982e-16+1.14423775e-17j, 8.00000000e+00-1.25557246e-15j,
  123. 2.33486982e-16+2.33486982e-16j, 0.00000000e+00+1.22464680e-16j,
  124. -1.14423775e-17+2.33486982e-16j, 0.00000000e+00+5.20784380e-16j,
  125. 1.14423775e-17+1.14423775e-17j, 0.00000000e+00+1.22464680e-16j])
  126. In this example, real input has an FFT which is Hermitian, i.e., symmetric
  127. in the real part and anti-symmetric in the imaginary part:
  128. >>> from scipy.fft import fft, fftfreq, fftshift
  129. >>> import matplotlib.pyplot as plt
  130. >>> t = np.arange(256)
  131. >>> sp = fftshift(fft(np.sin(t)))
  132. >>> freq = fftshift(fftfreq(t.shape[-1]))
  133. >>> plt.plot(freq, sp.real, freq, sp.imag)
  134. [<matplotlib.lines.Line2D object at 0x...>, <matplotlib.lines.Line2D object at 0x...>]
  135. >>> plt.show()
  136. """
  137. return (Dispatchable(x, np.ndarray),)
  138. @_dispatch
  139. def ifft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *,
  140. plan=None):
  141. """
  142. Compute the 1-D inverse discrete Fourier Transform.
  143. This function computes the inverse of the 1-D *n*-point
  144. discrete Fourier transform computed by `fft`. In other words,
  145. ``ifft(fft(x)) == x`` to within numerical accuracy.
  146. The input should be ordered in the same way as is returned by `fft`,
  147. i.e.,
  148. * ``x[0]`` should contain the zero frequency term,
  149. * ``x[1:n//2]`` should contain the positive-frequency terms,
  150. * ``x[n//2 + 1:]`` should contain the negative-frequency terms, in
  151. increasing order starting from the most negative frequency.
  152. For an even number of input points, ``x[n//2]`` represents the sum of
  153. the values at the positive and negative Nyquist frequencies, as the two
  154. are aliased together. See `fft` for details.
  155. Parameters
  156. ----------
  157. x : array_like
  158. Input array, can be complex.
  159. n : int, optional
  160. Length of the transformed axis of the output.
  161. If `n` is smaller than the length of the input, the input is cropped.
  162. If it is larger, the input is padded with zeros. If `n` is not given,
  163. the length of the input along the axis specified by `axis` is used.
  164. See notes about padding issues.
  165. axis : int, optional
  166. Axis over which to compute the inverse DFT. If not given, the last
  167. axis is used.
  168. norm : {"backward", "ortho", "forward"}, optional
  169. Normalization mode (see `fft`). Default is "backward".
  170. overwrite_x : bool, optional
  171. If True, the contents of `x` can be destroyed; the default is False.
  172. See :func:`fft` for more details.
  173. workers : int, optional
  174. Maximum number of workers to use for parallel computation. If negative,
  175. the value wraps around from ``os.cpu_count()``.
  176. See :func:`~scipy.fft.fft` for more details.
  177. plan : object, optional
  178. This argument is reserved for passing in a precomputed plan provided
  179. by downstream FFT vendors. It is currently not used in SciPy.
  180. .. versionadded:: 1.5.0
  181. Returns
  182. -------
  183. out : complex ndarray
  184. The truncated or zero-padded input, transformed along the axis
  185. indicated by `axis`, or the last one if `axis` is not specified.
  186. Raises
  187. ------
  188. IndexError
  189. If `axes` is larger than the last axis of `x`.
  190. See Also
  191. --------
  192. fft : The 1-D (forward) FFT, of which `ifft` is the inverse.
  193. ifft2 : The 2-D inverse FFT.
  194. ifftn : The N-D inverse FFT.
  195. Notes
  196. -----
  197. If the input parameter `n` is larger than the size of the input, the input
  198. is padded by appending zeros at the end. Even though this is the common
  199. approach, it might lead to surprising results. If a different padding is
  200. desired, it must be performed before calling `ifft`.
  201. If ``x`` is a 1-D array, then the `ifft` is equivalent to ::
  202. y[k] = np.sum(x * np.exp(2j * np.pi * k * np.arange(n)/n)) / len(x)
  203. As with `fft`, `ifft` has support for all floating point types and is
  204. optimized for real input.
  205. Examples
  206. --------
  207. >>> import scipy.fft
  208. >>> import numpy as np
  209. >>> scipy.fft.ifft([0, 4, 0, 0])
  210. array([ 1.+0.j, 0.+1.j, -1.+0.j, 0.-1.j]) # may vary
  211. Create and plot a band-limited signal with random phases:
  212. >>> import matplotlib.pyplot as plt
  213. >>> rng = np.random.default_rng()
  214. >>> t = np.arange(400)
  215. >>> n = np.zeros((400,), dtype=complex)
  216. >>> n[40:60] = np.exp(1j*rng.uniform(0, 2*np.pi, (20,)))
  217. >>> s = scipy.fft.ifft(n)
  218. >>> plt.plot(t, s.real, 'b-', t, s.imag, 'r--')
  219. [<matplotlib.lines.Line2D object at ...>, <matplotlib.lines.Line2D object at ...>]
  220. >>> plt.legend(('real', 'imaginary'))
  221. <matplotlib.legend.Legend object at ...>
  222. >>> plt.show()
  223. """
  224. return (Dispatchable(x, np.ndarray),)
  225. @_dispatch
  226. def rfft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *,
  227. plan=None):
  228. """
  229. Compute the 1-D discrete Fourier Transform for real input.
  230. This function computes the 1-D *n*-point discrete Fourier
  231. Transform (DFT) of a real-valued array by means of an efficient algorithm
  232. called the Fast Fourier Transform (FFT).
  233. Parameters
  234. ----------
  235. x : array_like
  236. Input array
  237. n : int, optional
  238. Number of points along transformation axis in the input to use.
  239. If `n` is smaller than the length of the input, the input is cropped.
  240. If it is larger, the input is padded with zeros. If `n` is not given,
  241. the length of the input along the axis specified by `axis` is used.
  242. axis : int, optional
  243. Axis over which to compute the FFT. If not given, the last axis is
  244. used.
  245. norm : {"backward", "ortho", "forward"}, optional
  246. Normalization mode (see `fft`). Default is "backward".
  247. overwrite_x : bool, optional
  248. If True, the contents of `x` can be destroyed; the default is False.
  249. See :func:`fft` for more details.
  250. workers : int, optional
  251. Maximum number of workers to use for parallel computation. If negative,
  252. the value wraps around from ``os.cpu_count()``.
  253. See :func:`~scipy.fft.fft` for more details.
  254. plan : object, optional
  255. This argument is reserved for passing in a precomputed plan provided
  256. by downstream FFT vendors. It is currently not used in SciPy.
  257. .. versionadded:: 1.5.0
  258. Returns
  259. -------
  260. out : complex ndarray
  261. The truncated or zero-padded input, transformed along the axis
  262. indicated by `axis`, or the last one if `axis` is not specified.
  263. If `n` is even, the length of the transformed axis is ``(n/2)+1``.
  264. If `n` is odd, the length is ``(n+1)/2``.
  265. Raises
  266. ------
  267. IndexError
  268. If `axis` is larger than the last axis of `a`.
  269. See Also
  270. --------
  271. irfft : The inverse of `rfft`.
  272. fft : The 1-D FFT of general (complex) input.
  273. fftn : The N-D FFT.
  274. rfft2 : The 2-D FFT of real input.
  275. rfftn : The N-D FFT of real input.
  276. Notes
  277. -----
  278. When the DFT is computed for purely real input, the output is
  279. Hermitian-symmetric, i.e., the negative frequency terms are just the complex
  280. conjugates of the corresponding positive-frequency terms, and the
  281. negative-frequency terms are therefore redundant. This function does not
  282. compute the negative frequency terms, and the length of the transformed
  283. axis of the output is therefore ``n//2 + 1``.
  284. When ``X = rfft(x)`` and fs is the sampling frequency, ``X[0]`` contains
  285. the zero-frequency term 0*fs, which is real due to Hermitian symmetry.
  286. If `n` is even, ``A[-1]`` contains the term representing both positive
  287. and negative Nyquist frequency (+fs/2 and -fs/2), and must also be purely
  288. real. If `n` is odd, there is no term at fs/2; ``A[-1]`` contains
  289. the largest positive frequency (fs/2*(n-1)/n), and is complex in the
  290. general case.
  291. If the input `a` contains an imaginary part, it is silently discarded.
  292. Examples
  293. --------
  294. >>> import scipy.fft
  295. >>> scipy.fft.fft([0, 1, 0, 0])
  296. array([ 1.+0.j, 0.-1.j, -1.+0.j, 0.+1.j]) # may vary
  297. >>> scipy.fft.rfft([0, 1, 0, 0])
  298. array([ 1.+0.j, 0.-1.j, -1.+0.j]) # may vary
  299. Notice how the final element of the `fft` output is the complex conjugate
  300. of the second element, for real input. For `rfft`, this symmetry is
  301. exploited to compute only the non-negative frequency terms.
  302. """
  303. return (Dispatchable(x, np.ndarray),)
  304. @_dispatch
  305. def irfft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *,
  306. plan=None):
  307. """
  308. Computes the inverse of `rfft`.
  309. This function computes the inverse of the 1-D *n*-point
  310. discrete Fourier Transform of real input computed by `rfft`.
  311. In other words, ``irfft(rfft(x), len(x)) == x`` to within numerical
  312. accuracy. (See Notes below for why ``len(a)`` is necessary here.)
  313. The input is expected to be in the form returned by `rfft`, i.e., the
  314. real zero-frequency term followed by the complex positive frequency terms
  315. in order of increasing frequency. Since the discrete Fourier Transform of
  316. real input is Hermitian-symmetric, the negative frequency terms are taken
  317. to be the complex conjugates of the corresponding positive frequency terms.
  318. Parameters
  319. ----------
  320. x : array_like
  321. The input array.
  322. n : int, optional
  323. Length of the transformed axis of the output.
  324. For `n` output points, ``n//2+1`` input points are necessary. If the
  325. input is longer than this, it is cropped. If it is shorter than this,
  326. it is padded with zeros. If `n` is not given, it is taken to be
  327. ``2*(m-1)``, where ``m`` is the length of the input along the axis
  328. specified by `axis`.
  329. axis : int, optional
  330. Axis over which to compute the inverse FFT. If not given, the last
  331. axis is used.
  332. norm : {"backward", "ortho", "forward"}, optional
  333. Normalization mode (see `fft`). Default is "backward".
  334. overwrite_x : bool, optional
  335. If True, the contents of `x` can be destroyed; the default is False.
  336. See :func:`fft` for more details.
  337. workers : int, optional
  338. Maximum number of workers to use for parallel computation. If negative,
  339. the value wraps around from ``os.cpu_count()``.
  340. See :func:`~scipy.fft.fft` for more details.
  341. plan : object, optional
  342. This argument is reserved for passing in a precomputed plan provided
  343. by downstream FFT vendors. It is currently not used in SciPy.
  344. .. versionadded:: 1.5.0
  345. Returns
  346. -------
  347. out : ndarray
  348. The truncated or zero-padded input, transformed along the axis
  349. indicated by `axis`, or the last one if `axis` is not specified.
  350. The length of the transformed axis is `n`, or, if `n` is not given,
  351. ``2*(m-1)`` where ``m`` is the length of the transformed axis of the
  352. input. To get an odd number of output points, `n` must be specified.
  353. Raises
  354. ------
  355. IndexError
  356. If `axis` is larger than the last axis of `x`.
  357. See Also
  358. --------
  359. rfft : The 1-D FFT of real input, of which `irfft` is inverse.
  360. fft : The 1-D FFT.
  361. irfft2 : The inverse of the 2-D FFT of real input.
  362. irfftn : The inverse of the N-D FFT of real input.
  363. Notes
  364. -----
  365. Returns the real valued `n`-point inverse discrete Fourier transform
  366. of `x`, where `x` contains the non-negative frequency terms of a
  367. Hermitian-symmetric sequence. `n` is the length of the result, not the
  368. input.
  369. If you specify an `n` such that `a` must be zero-padded or truncated, the
  370. extra/removed values will be added/removed at high frequencies. One can
  371. thus resample a series to `m` points via Fourier interpolation by:
  372. ``a_resamp = irfft(rfft(a), m)``.
  373. The default value of `n` assumes an even output length. By the Hermitian
  374. symmetry, the last imaginary component must be 0 and so is ignored. To
  375. avoid losing information, the correct length of the real input *must* be
  376. given.
  377. Examples
  378. --------
  379. >>> import scipy.fft
  380. >>> scipy.fft.ifft([1, -1j, -1, 1j])
  381. array([0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j]) # may vary
  382. >>> scipy.fft.irfft([1, -1j, -1])
  383. array([0., 1., 0., 0.])
  384. Notice how the last term in the input to the ordinary `ifft` is the
  385. complex conjugate of the second term, and the output has zero imaginary
  386. part everywhere. When calling `irfft`, the negative frequencies are not
  387. specified, and the output array is purely real.
  388. """
  389. return (Dispatchable(x, np.ndarray),)
  390. @_dispatch
  391. def hfft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *,
  392. plan=None):
  393. """
  394. Compute the FFT of a signal that has Hermitian symmetry, i.e., a real
  395. spectrum.
  396. Parameters
  397. ----------
  398. x : array_like
  399. The input array.
  400. n : int, optional
  401. Length of the transformed axis of the output. For `n` output
  402. points, ``n//2 + 1`` input points are necessary. If the input is
  403. longer than this, it is cropped. If it is shorter than this, it is
  404. padded with zeros. If `n` is not given, it is taken to be ``2*(m-1)``,
  405. where ``m`` is the length of the input along the axis specified by
  406. `axis`.
  407. axis : int, optional
  408. Axis over which to compute the FFT. If not given, the last
  409. axis is used.
  410. norm : {"backward", "ortho", "forward"}, optional
  411. Normalization mode (see `fft`). Default is "backward".
  412. overwrite_x : bool, optional
  413. If True, the contents of `x` can be destroyed; the default is False.
  414. See `fft` for more details.
  415. workers : int, optional
  416. Maximum number of workers to use for parallel computation. If negative,
  417. the value wraps around from ``os.cpu_count()``.
  418. See :func:`~scipy.fft.fft` for more details.
  419. plan : object, optional
  420. This argument is reserved for passing in a precomputed plan provided
  421. by downstream FFT vendors. It is currently not used in SciPy.
  422. .. versionadded:: 1.5.0
  423. Returns
  424. -------
  425. out : ndarray
  426. The truncated or zero-padded input, transformed along the axis
  427. indicated by `axis`, or the last one if `axis` is not specified.
  428. The length of the transformed axis is `n`, or, if `n` is not given,
  429. ``2*m - 2``, where ``m`` is the length of the transformed axis of
  430. the input. To get an odd number of output points, `n` must be
  431. specified, for instance, as ``2*m - 1`` in the typical case,
  432. Raises
  433. ------
  434. IndexError
  435. If `axis` is larger than the last axis of `a`.
  436. See Also
  437. --------
  438. rfft : Compute the 1-D FFT for real input.
  439. ihfft : The inverse of `hfft`.
  440. hfftn : Compute the N-D FFT of a Hermitian signal.
  441. Notes
  442. -----
  443. `hfft`/`ihfft` are a pair analogous to `rfft`/`irfft`, but for the
  444. opposite case: here the signal has Hermitian symmetry in the time
  445. domain and is real in the frequency domain. So, here, it's `hfft`, for
  446. which you must supply the length of the result if it is to be odd.
  447. * even: ``ihfft(hfft(a, 2*len(a) - 2) == a``, within roundoff error,
  448. * odd: ``ihfft(hfft(a, 2*len(a) - 1) == a``, within roundoff error.
  449. Examples
  450. --------
  451. >>> from scipy.fft import fft, hfft
  452. >>> import numpy as np
  453. >>> a = 2 * np.pi * np.arange(10) / 10
  454. >>> signal = np.cos(a) + 3j * np.sin(3 * a)
  455. >>> fft(signal).round(10)
  456. array([ -0.+0.j, 5.+0.j, -0.+0.j, 15.-0.j, 0.+0.j, 0.+0.j,
  457. -0.+0.j, -15.-0.j, 0.+0.j, 5.+0.j])
  458. >>> hfft(signal[:6]).round(10) # Input first half of signal
  459. array([ 0., 5., 0., 15., -0., 0., 0., -15., -0., 5.])
  460. >>> hfft(signal, 10) # Input entire signal and truncate
  461. array([ 0., 5., 0., 15., -0., 0., 0., -15., -0., 5.])
  462. """
  463. return (Dispatchable(x, np.ndarray),)
  464. @_dispatch
  465. def ihfft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *,
  466. plan=None):
  467. """
  468. Compute the inverse FFT of a signal that has Hermitian symmetry.
  469. Parameters
  470. ----------
  471. x : array_like
  472. Input array.
  473. n : int, optional
  474. Length of the inverse FFT, the number of points along
  475. transformation axis in the input to use. If `n` is smaller than
  476. the length of the input, the input is cropped. If it is larger,
  477. the input is padded with zeros. If `n` is not given, the length of
  478. the input along the axis specified by `axis` is used.
  479. axis : int, optional
  480. Axis over which to compute the inverse FFT. If not given, the last
  481. axis is used.
  482. norm : {"backward", "ortho", "forward"}, optional
  483. Normalization mode (see `fft`). Default is "backward".
  484. overwrite_x : bool, optional
  485. If True, the contents of `x` can be destroyed; the default is False.
  486. See `fft` for more details.
  487. workers : int, optional
  488. Maximum number of workers to use for parallel computation. If negative,
  489. the value wraps around from ``os.cpu_count()``.
  490. See :func:`~scipy.fft.fft` for more details.
  491. plan : object, optional
  492. This argument is reserved for passing in a precomputed plan provided
  493. by downstream FFT vendors. It is currently not used in SciPy.
  494. .. versionadded:: 1.5.0
  495. Returns
  496. -------
  497. out : complex ndarray
  498. The truncated or zero-padded input, transformed along the axis
  499. indicated by `axis`, or the last one if `axis` is not specified.
  500. The length of the transformed axis is ``n//2 + 1``.
  501. See Also
  502. --------
  503. hfft, irfft
  504. Notes
  505. -----
  506. `hfft`/`ihfft` are a pair analogous to `rfft`/`irfft`, but for the
  507. opposite case: here, the signal has Hermitian symmetry in the time
  508. domain and is real in the frequency domain. So, here, it's `hfft`, for
  509. which you must supply the length of the result if it is to be odd:
  510. * even: ``ihfft(hfft(a, 2*len(a) - 2) == a``, within roundoff error,
  511. * odd: ``ihfft(hfft(a, 2*len(a) - 1) == a``, within roundoff error.
  512. Examples
  513. --------
  514. >>> from scipy.fft import ifft, ihfft
  515. >>> import numpy as np
  516. >>> spectrum = np.array([ 15, -4, 0, -1, 0, -4])
  517. >>> ifft(spectrum)
  518. array([1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j, 3.+0.j, 2.+0.j]) # may vary
  519. >>> ihfft(spectrum)
  520. array([ 1.-0.j, 2.-0.j, 3.-0.j, 4.-0.j]) # may vary
  521. """
  522. return (Dispatchable(x, np.ndarray),)
  523. @_dispatch
  524. def fftn(x, s=None, axes=None, norm=None, overwrite_x=False, workers=None, *,
  525. plan=None):
  526. """
  527. Compute the N-D discrete Fourier Transform.
  528. This function computes the N-D discrete Fourier Transform over
  529. any number of axes in an M-D array by means of the Fast Fourier
  530. Transform (FFT).
  531. Parameters
  532. ----------
  533. x : array_like
  534. Input array, can be complex.
  535. s : sequence of ints, optional
  536. Shape (length of each transformed axis) of the output
  537. (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.).
  538. This corresponds to ``n`` for ``fft(x, n)``.
  539. Along any axis, if the given shape is smaller than that of the input,
  540. the input is cropped. If it is larger, the input is padded with zeros.
  541. if `s` is not given, the shape of the input along the axes specified
  542. by `axes` is used.
  543. axes : sequence of ints, optional
  544. Axes over which to compute the FFT. If not given, the last ``len(s)``
  545. axes are used, or all axes if `s` is also not specified.
  546. norm : {"backward", "ortho", "forward"}, optional
  547. Normalization mode (see `fft`). Default is "backward".
  548. overwrite_x : bool, optional
  549. If True, the contents of `x` can be destroyed; the default is False.
  550. See :func:`fft` for more details.
  551. workers : int, optional
  552. Maximum number of workers to use for parallel computation. If negative,
  553. the value wraps around from ``os.cpu_count()``.
  554. See :func:`~scipy.fft.fft` for more details.
  555. plan : object, optional
  556. This argument is reserved for passing in a precomputed plan provided
  557. by downstream FFT vendors. It is currently not used in SciPy.
  558. .. versionadded:: 1.5.0
  559. Returns
  560. -------
  561. out : complex ndarray
  562. The truncated or zero-padded input, transformed along the axes
  563. indicated by `axes`, or by a combination of `s` and `x`,
  564. as explained in the parameters section above.
  565. Raises
  566. ------
  567. ValueError
  568. If `s` and `axes` have different length.
  569. IndexError
  570. If an element of `axes` is larger than the number of axes of `x`.
  571. See Also
  572. --------
  573. ifftn : The inverse of `fftn`, the inverse N-D FFT.
  574. fft : The 1-D FFT, with definitions and conventions used.
  575. rfftn : The N-D FFT of real input.
  576. fft2 : The 2-D FFT.
  577. fftshift : Shifts zero-frequency terms to centre of array.
  578. Notes
  579. -----
  580. The output, analogously to `fft`, contains the term for zero frequency in
  581. the low-order corner of all axes, the positive frequency terms in the
  582. first half of all axes, the term for the Nyquist frequency in the middle
  583. of all axes and the negative frequency terms in the second half of all
  584. axes, in order of decreasingly negative frequency.
  585. Examples
  586. --------
  587. >>> import scipy.fft
  588. >>> import numpy as np
  589. >>> x = np.mgrid[:3, :3, :3][0]
  590. >>> scipy.fft.fftn(x, axes=(1, 2))
  591. array([[[ 0.+0.j, 0.+0.j, 0.+0.j], # may vary
  592. [ 0.+0.j, 0.+0.j, 0.+0.j],
  593. [ 0.+0.j, 0.+0.j, 0.+0.j]],
  594. [[ 9.+0.j, 0.+0.j, 0.+0.j],
  595. [ 0.+0.j, 0.+0.j, 0.+0.j],
  596. [ 0.+0.j, 0.+0.j, 0.+0.j]],
  597. [[18.+0.j, 0.+0.j, 0.+0.j],
  598. [ 0.+0.j, 0.+0.j, 0.+0.j],
  599. [ 0.+0.j, 0.+0.j, 0.+0.j]]])
  600. >>> scipy.fft.fftn(x, (2, 2), axes=(0, 1))
  601. array([[[ 2.+0.j, 2.+0.j, 2.+0.j], # may vary
  602. [ 0.+0.j, 0.+0.j, 0.+0.j]],
  603. [[-2.+0.j, -2.+0.j, -2.+0.j],
  604. [ 0.+0.j, 0.+0.j, 0.+0.j]]])
  605. >>> import matplotlib.pyplot as plt
  606. >>> rng = np.random.default_rng()
  607. >>> [X, Y] = np.meshgrid(2 * np.pi * np.arange(200) / 12,
  608. ... 2 * np.pi * np.arange(200) / 34)
  609. >>> S = np.sin(X) + np.cos(Y) + rng.uniform(0, 1, X.shape)
  610. >>> FS = scipy.fft.fftn(S)
  611. >>> plt.imshow(np.log(np.abs(scipy.fft.fftshift(FS))**2))
  612. <matplotlib.image.AxesImage object at 0x...>
  613. >>> plt.show()
  614. """
  615. return (Dispatchable(x, np.ndarray),)
  616. @_dispatch
  617. def ifftn(x, s=None, axes=None, norm=None, overwrite_x=False, workers=None, *,
  618. plan=None):
  619. """
  620. Compute the N-D inverse discrete Fourier Transform.
  621. This function computes the inverse of the N-D discrete
  622. Fourier Transform over any number of axes in an M-D array by
  623. means of the Fast Fourier Transform (FFT). In other words,
  624. ``ifftn(fftn(x)) == x`` to within numerical accuracy.
  625. The input, analogously to `ifft`, should be ordered in the same way as is
  626. returned by `fftn`, i.e., it should have the term for zero frequency
  627. in all axes in the low-order corner, the positive frequency terms in the
  628. first half of all axes, the term for the Nyquist frequency in the middle
  629. of all axes and the negative frequency terms in the second half of all
  630. axes, in order of decreasingly negative frequency.
  631. Parameters
  632. ----------
  633. x : array_like
  634. Input array, can be complex.
  635. s : sequence of ints, optional
  636. Shape (length of each transformed axis) of the output
  637. (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.).
  638. This corresponds to ``n`` for ``ifft(x, n)``.
  639. Along any axis, if the given shape is smaller than that of the input,
  640. the input is cropped. If it is larger, the input is padded with zeros.
  641. if `s` is not given, the shape of the input along the axes specified
  642. by `axes` is used. See notes for issue on `ifft` zero padding.
  643. axes : sequence of ints, optional
  644. Axes over which to compute the IFFT. If not given, the last ``len(s)``
  645. axes are used, or all axes if `s` is also not specified.
  646. norm : {"backward", "ortho", "forward"}, optional
  647. Normalization mode (see `fft`). Default is "backward".
  648. overwrite_x : bool, optional
  649. If True, the contents of `x` can be destroyed; the default is False.
  650. See :func:`fft` for more details.
  651. workers : int, optional
  652. Maximum number of workers to use for parallel computation. If negative,
  653. the value wraps around from ``os.cpu_count()``.
  654. See :func:`~scipy.fft.fft` for more details.
  655. plan : object, optional
  656. This argument is reserved for passing in a precomputed plan provided
  657. by downstream FFT vendors. It is currently not used in SciPy.
  658. .. versionadded:: 1.5.0
  659. Returns
  660. -------
  661. out : complex ndarray
  662. The truncated or zero-padded input, transformed along the axes
  663. indicated by `axes`, or by a combination of `s` or `x`,
  664. as explained in the parameters section above.
  665. Raises
  666. ------
  667. ValueError
  668. If `s` and `axes` have different length.
  669. IndexError
  670. If an element of `axes` is larger than the number of axes of `x`.
  671. See Also
  672. --------
  673. fftn : The forward N-D FFT, of which `ifftn` is the inverse.
  674. ifft : The 1-D inverse FFT.
  675. ifft2 : The 2-D inverse FFT.
  676. ifftshift : Undoes `fftshift`, shifts zero-frequency terms to beginning
  677. of array.
  678. Notes
  679. -----
  680. Zero-padding, analogously with `ifft`, is performed by appending zeros to
  681. the input along the specified dimension. Although this is the common
  682. approach, it might lead to surprising results. If another form of zero
  683. padding is desired, it must be performed before `ifftn` is called.
  684. Examples
  685. --------
  686. >>> import scipy.fft
  687. >>> import numpy as np
  688. >>> x = np.eye(4)
  689. >>> scipy.fft.ifftn(scipy.fft.fftn(x, axes=(0,)), axes=(1,))
  690. array([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j], # may vary
  691. [0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],
  692. [0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
  693. [0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j]])
  694. Create and plot an image with band-limited frequency content:
  695. >>> import matplotlib.pyplot as plt
  696. >>> rng = np.random.default_rng()
  697. >>> n = np.zeros((200,200), dtype=complex)
  698. >>> n[60:80, 20:40] = np.exp(1j*rng.uniform(0, 2*np.pi, (20, 20)))
  699. >>> im = scipy.fft.ifftn(n).real
  700. >>> plt.imshow(im)
  701. <matplotlib.image.AxesImage object at 0x...>
  702. >>> plt.show()
  703. """
  704. return (Dispatchable(x, np.ndarray),)
  705. @_dispatch
  706. def fft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None, *,
  707. plan=None):
  708. """
  709. Compute the 2-D discrete Fourier Transform
  710. This function computes the N-D discrete Fourier Transform
  711. over any axes in an M-D array by means of the
  712. Fast Fourier Transform (FFT). By default, the transform is computed over
  713. the last two axes of the input array, i.e., a 2-dimensional FFT.
  714. Parameters
  715. ----------
  716. x : array_like
  717. Input array, can be complex
  718. s : sequence of ints, optional
  719. Shape (length of each transformed axis) of the output
  720. (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.).
  721. This corresponds to ``n`` for ``fft(x, n)``.
  722. Along each axis, if the given shape is smaller than that of the input,
  723. the input is cropped. If it is larger, the input is padded with zeros.
  724. if `s` is not given, the shape of the input along the axes specified
  725. by `axes` is used.
  726. axes : sequence of ints, optional
  727. Axes over which to compute the FFT. If not given, the last two axes are
  728. used.
  729. norm : {"backward", "ortho", "forward"}, optional
  730. Normalization mode (see `fft`). Default is "backward".
  731. overwrite_x : bool, optional
  732. If True, the contents of `x` can be destroyed; the default is False.
  733. See :func:`fft` for more details.
  734. workers : int, optional
  735. Maximum number of workers to use for parallel computation. If negative,
  736. the value wraps around from ``os.cpu_count()``.
  737. See :func:`~scipy.fft.fft` for more details.
  738. plan : object, optional
  739. This argument is reserved for passing in a precomputed plan provided
  740. by downstream FFT vendors. It is currently not used in SciPy.
  741. .. versionadded:: 1.5.0
  742. Returns
  743. -------
  744. out : complex ndarray
  745. The truncated or zero-padded input, transformed along the axes
  746. indicated by `axes`, or the last two axes if `axes` is not given.
  747. Raises
  748. ------
  749. ValueError
  750. If `s` and `axes` have different length, or `axes` not given and
  751. ``len(s) != 2``.
  752. IndexError
  753. If an element of `axes` is larger than the number of axes of `x`.
  754. See Also
  755. --------
  756. ifft2 : The inverse 2-D FFT.
  757. fft : The 1-D FFT.
  758. fftn : The N-D FFT.
  759. fftshift : Shifts zero-frequency terms to the center of the array.
  760. For 2-D input, swaps first and third quadrants, and second
  761. and fourth quadrants.
  762. Notes
  763. -----
  764. `fft2` is just `fftn` with a different default for `axes`.
  765. The output, analogously to `fft`, contains the term for zero frequency in
  766. the low-order corner of the transformed axes, the positive frequency terms
  767. in the first half of these axes, the term for the Nyquist frequency in the
  768. middle of the axes and the negative frequency terms in the second half of
  769. the axes, in order of decreasingly negative frequency.
  770. See `fftn` for details and a plotting example, and `fft` for
  771. definitions and conventions used.
  772. Examples
  773. --------
  774. >>> import scipy.fft
  775. >>> import numpy as np
  776. >>> x = np.mgrid[:5, :5][0]
  777. >>> scipy.fft.fft2(x)
  778. array([[ 50. +0.j , 0. +0.j , 0. +0.j , # may vary
  779. 0. +0.j , 0. +0.j ],
  780. [-12.5+17.20477401j, 0. +0.j , 0. +0.j ,
  781. 0. +0.j , 0. +0.j ],
  782. [-12.5 +4.0614962j , 0. +0.j , 0. +0.j ,
  783. 0. +0.j , 0. +0.j ],
  784. [-12.5 -4.0614962j , 0. +0.j , 0. +0.j ,
  785. 0. +0.j , 0. +0.j ],
  786. [-12.5-17.20477401j, 0. +0.j , 0. +0.j ,
  787. 0. +0.j , 0. +0.j ]])
  788. """
  789. return (Dispatchable(x, np.ndarray),)
  790. @_dispatch
  791. def ifft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None, *,
  792. plan=None):
  793. """
  794. Compute the 2-D inverse discrete Fourier Transform.
  795. This function computes the inverse of the 2-D discrete Fourier
  796. Transform over any number of axes in an M-D array by means of
  797. the Fast Fourier Transform (FFT). In other words, ``ifft2(fft2(x)) == x``
  798. to within numerical accuracy. By default, the inverse transform is
  799. computed over the last two axes of the input array.
  800. The input, analogously to `ifft`, should be ordered in the same way as is
  801. returned by `fft2`, i.e., it should have the term for zero frequency
  802. in the low-order corner of the two axes, the positive frequency terms in
  803. the first half of these axes, the term for the Nyquist frequency in the
  804. middle of the axes and the negative frequency terms in the second half of
  805. both axes, in order of decreasingly negative frequency.
  806. Parameters
  807. ----------
  808. x : array_like
  809. Input array, can be complex.
  810. s : sequence of ints, optional
  811. Shape (length of each axis) of the output (``s[0]`` refers to axis 0,
  812. ``s[1]`` to axis 1, etc.). This corresponds to `n` for ``ifft(x, n)``.
  813. Along each axis, if the given shape is smaller than that of the input,
  814. the input is cropped. If it is larger, the input is padded with zeros.
  815. if `s` is not given, the shape of the input along the axes specified
  816. by `axes` is used. See notes for issue on `ifft` zero padding.
  817. axes : sequence of ints, optional
  818. Axes over which to compute the FFT. If not given, the last two
  819. axes are used.
  820. norm : {"backward", "ortho", "forward"}, optional
  821. Normalization mode (see `fft`). Default is "backward".
  822. overwrite_x : bool, optional
  823. If True, the contents of `x` can be destroyed; the default is False.
  824. See :func:`fft` for more details.
  825. workers : int, optional
  826. Maximum number of workers to use for parallel computation. If negative,
  827. the value wraps around from ``os.cpu_count()``.
  828. See :func:`~scipy.fft.fft` for more details.
  829. plan : object, optional
  830. This argument is reserved for passing in a precomputed plan provided
  831. by downstream FFT vendors. It is currently not used in SciPy.
  832. .. versionadded:: 1.5.0
  833. Returns
  834. -------
  835. out : complex ndarray
  836. The truncated or zero-padded input, transformed along the axes
  837. indicated by `axes`, or the last two axes if `axes` is not given.
  838. Raises
  839. ------
  840. ValueError
  841. If `s` and `axes` have different length, or `axes` not given and
  842. ``len(s) != 2``.
  843. IndexError
  844. If an element of `axes` is larger than the number of axes of `x`.
  845. See Also
  846. --------
  847. fft2 : The forward 2-D FFT, of which `ifft2` is the inverse.
  848. ifftn : The inverse of the N-D FFT.
  849. fft : The 1-D FFT.
  850. ifft : The 1-D inverse FFT.
  851. Notes
  852. -----
  853. `ifft2` is just `ifftn` with a different default for `axes`.
  854. See `ifftn` for details and a plotting example, and `fft` for
  855. definition and conventions used.
  856. Zero-padding, analogously with `ifft`, is performed by appending zeros to
  857. the input along the specified dimension. Although this is the common
  858. approach, it might lead to surprising results. If another form of zero
  859. padding is desired, it must be performed before `ifft2` is called.
  860. Examples
  861. --------
  862. >>> import scipy.fft
  863. >>> import numpy as np
  864. >>> x = 4 * np.eye(4)
  865. >>> scipy.fft.ifft2(x)
  866. array([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j], # may vary
  867. [0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j],
  868. [0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
  869. [0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j]])
  870. """
  871. return (Dispatchable(x, np.ndarray),)
  872. @_dispatch
  873. def rfftn(x, s=None, axes=None, norm=None, overwrite_x=False, workers=None, *,
  874. plan=None):
  875. """
  876. Compute the N-D discrete Fourier Transform for real input.
  877. This function computes the N-D discrete Fourier Transform over
  878. any number of axes in an M-D real array by means of the Fast
  879. Fourier Transform (FFT). By default, all axes are transformed, with the
  880. real transform performed over the last axis, while the remaining
  881. transforms are complex.
  882. Parameters
  883. ----------
  884. x : array_like
  885. Input array, taken to be real.
  886. s : sequence of ints, optional
  887. Shape (length along each transformed axis) to use from the input.
  888. (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.).
  889. The final element of `s` corresponds to `n` for ``rfft(x, n)``, while
  890. for the remaining axes, it corresponds to `n` for ``fft(x, n)``.
  891. Along any axis, if the given shape is smaller than that of the input,
  892. the input is cropped. If it is larger, the input is padded with zeros.
  893. if `s` is not given, the shape of the input along the axes specified
  894. by `axes` is used.
  895. axes : sequence of ints, optional
  896. Axes over which to compute the FFT. If not given, the last ``len(s)``
  897. axes are used, or all axes if `s` is also not specified.
  898. norm : {"backward", "ortho", "forward"}, optional
  899. Normalization mode (see `fft`). Default is "backward".
  900. overwrite_x : bool, optional
  901. If True, the contents of `x` can be destroyed; the default is False.
  902. See :func:`fft` for more details.
  903. workers : int, optional
  904. Maximum number of workers to use for parallel computation. If negative,
  905. the value wraps around from ``os.cpu_count()``.
  906. See :func:`~scipy.fft.fft` for more details.
  907. plan : object, optional
  908. This argument is reserved for passing in a precomputed plan provided
  909. by downstream FFT vendors. It is currently not used in SciPy.
  910. .. versionadded:: 1.5.0
  911. Returns
  912. -------
  913. out : complex ndarray
  914. The truncated or zero-padded input, transformed along the axes
  915. indicated by `axes`, or by a combination of `s` and `x`,
  916. as explained in the parameters section above.
  917. The length of the last axis transformed will be ``s[-1]//2+1``,
  918. while the remaining transformed axes will have lengths according to
  919. `s`, or unchanged from the input.
  920. Raises
  921. ------
  922. ValueError
  923. If `s` and `axes` have different length.
  924. IndexError
  925. If an element of `axes` is larger than the number of axes of `x`.
  926. See Also
  927. --------
  928. irfftn : The inverse of `rfftn`, i.e., the inverse of the N-D FFT
  929. of real input.
  930. fft : The 1-D FFT, with definitions and conventions used.
  931. rfft : The 1-D FFT of real input.
  932. fftn : The N-D FFT.
  933. rfft2 : The 2-D FFT of real input.
  934. Notes
  935. -----
  936. The transform for real input is performed over the last transformation
  937. axis, as by `rfft`, then the transform over the remaining axes is
  938. performed as by `fftn`. The order of the output is as for `rfft` for the
  939. final transformation axis, and as for `fftn` for the remaining
  940. transformation axes.
  941. See `fft` for details, definitions and conventions used.
  942. Examples
  943. --------
  944. >>> import scipy.fft
  945. >>> import numpy as np
  946. >>> x = np.ones((2, 2, 2))
  947. >>> scipy.fft.rfftn(x)
  948. array([[[8.+0.j, 0.+0.j], # may vary
  949. [0.+0.j, 0.+0.j]],
  950. [[0.+0.j, 0.+0.j],
  951. [0.+0.j, 0.+0.j]]])
  952. >>> scipy.fft.rfftn(x, axes=(2, 0))
  953. array([[[4.+0.j, 0.+0.j], # may vary
  954. [4.+0.j, 0.+0.j]],
  955. [[0.+0.j, 0.+0.j],
  956. [0.+0.j, 0.+0.j]]])
  957. """
  958. return (Dispatchable(x, np.ndarray),)
  959. @_dispatch
  960. def rfft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None, *,
  961. plan=None):
  962. """
  963. Compute the 2-D FFT of a real array.
  964. Parameters
  965. ----------
  966. x : array
  967. Input array, taken to be real.
  968. s : sequence of ints, optional
  969. Shape of the FFT.
  970. axes : sequence of ints, optional
  971. Axes over which to compute the FFT.
  972. norm : {"backward", "ortho", "forward"}, optional
  973. Normalization mode (see `fft`). Default is "backward".
  974. overwrite_x : bool, optional
  975. If True, the contents of `x` can be destroyed; the default is False.
  976. See :func:`fft` for more details.
  977. workers : int, optional
  978. Maximum number of workers to use for parallel computation. If negative,
  979. the value wraps around from ``os.cpu_count()``.
  980. See :func:`~scipy.fft.fft` for more details.
  981. plan : object, optional
  982. This argument is reserved for passing in a precomputed plan provided
  983. by downstream FFT vendors. It is currently not used in SciPy.
  984. .. versionadded:: 1.5.0
  985. Returns
  986. -------
  987. out : ndarray
  988. The result of the real 2-D FFT.
  989. See Also
  990. --------
  991. irfft2 : The inverse of the 2-D FFT of real input.
  992. rfft : The 1-D FFT of real input.
  993. rfftn : Compute the N-D discrete Fourier Transform for real
  994. input.
  995. Notes
  996. -----
  997. This is really just `rfftn` with different default behavior.
  998. For more details see `rfftn`.
  999. """
  1000. return (Dispatchable(x, np.ndarray),)
  1001. @_dispatch
  1002. def irfftn(x, s=None, axes=None, norm=None, overwrite_x=False, workers=None, *,
  1003. plan=None):
  1004. """
  1005. Computes the inverse of `rfftn`
  1006. This function computes the inverse of the N-D discrete
  1007. Fourier Transform for real input over any number of axes in an
  1008. M-D array by means of the Fast Fourier Transform (FFT). In
  1009. other words, ``irfftn(rfftn(x), x.shape) == x`` to within numerical
  1010. accuracy. (The ``a.shape`` is necessary like ``len(a)`` is for `irfft`,
  1011. and for the same reason.)
  1012. The input should be ordered in the same way as is returned by `rfftn`,
  1013. i.e., as for `irfft` for the final transformation axis, and as for `ifftn`
  1014. along all the other axes.
  1015. Parameters
  1016. ----------
  1017. x : array_like
  1018. Input array.
  1019. s : sequence of ints, optional
  1020. Shape (length of each transformed axis) of the output
  1021. (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.). `s` is also the
  1022. number of input points used along this axis, except for the last axis,
  1023. where ``s[-1]//2+1`` points of the input are used.
  1024. Along any axis, if the shape indicated by `s` is smaller than that of
  1025. the input, the input is cropped. If it is larger, the input is padded
  1026. with zeros. If `s` is not given, the shape of the input along the axes
  1027. specified by axes is used. Except for the last axis which is taken to be
  1028. ``2*(m-1)``, where ``m`` is the length of the input along that axis.
  1029. axes : sequence of ints, optional
  1030. Axes over which to compute the inverse FFT. If not given, the last
  1031. `len(s)` axes are used, or all axes if `s` is also not specified.
  1032. norm : {"backward", "ortho", "forward"}, optional
  1033. Normalization mode (see `fft`). Default is "backward".
  1034. overwrite_x : bool, optional
  1035. If True, the contents of `x` can be destroyed; the default is False.
  1036. See :func:`fft` for more details.
  1037. workers : int, optional
  1038. Maximum number of workers to use for parallel computation. If negative,
  1039. the value wraps around from ``os.cpu_count()``.
  1040. See :func:`~scipy.fft.fft` for more details.
  1041. plan : object, optional
  1042. This argument is reserved for passing in a precomputed plan provided
  1043. by downstream FFT vendors. It is currently not used in SciPy.
  1044. .. versionadded:: 1.5.0
  1045. Returns
  1046. -------
  1047. out : ndarray
  1048. The truncated or zero-padded input, transformed along the axes
  1049. indicated by `axes`, or by a combination of `s` or `x`,
  1050. as explained in the parameters section above.
  1051. The length of each transformed axis is as given by the corresponding
  1052. element of `s`, or the length of the input in every axis except for the
  1053. last one if `s` is not given. In the final transformed axis the length
  1054. of the output when `s` is not given is ``2*(m-1)``, where ``m`` is the
  1055. length of the final transformed axis of the input. To get an odd
  1056. number of output points in the final axis, `s` must be specified.
  1057. Raises
  1058. ------
  1059. ValueError
  1060. If `s` and `axes` have different length.
  1061. IndexError
  1062. If an element of `axes` is larger than the number of axes of `x`.
  1063. See Also
  1064. --------
  1065. rfftn : The forward N-D FFT of real input,
  1066. of which `ifftn` is the inverse.
  1067. fft : The 1-D FFT, with definitions and conventions used.
  1068. irfft : The inverse of the 1-D FFT of real input.
  1069. irfft2 : The inverse of the 2-D FFT of real input.
  1070. Notes
  1071. -----
  1072. See `fft` for definitions and conventions used.
  1073. See `rfft` for definitions and conventions used for real input.
  1074. The default value of `s` assumes an even output length in the final
  1075. transformation axis. When performing the final complex to real
  1076. transformation, the Hermitian symmetry requires that the last imaginary
  1077. component along that axis must be 0 and so it is ignored. To avoid losing
  1078. information, the correct length of the real input *must* be given.
  1079. Examples
  1080. --------
  1081. >>> import scipy.fft
  1082. >>> import numpy as np
  1083. >>> x = np.zeros((3, 2, 2))
  1084. >>> x[0, 0, 0] = 3 * 2 * 2
  1085. >>> scipy.fft.irfftn(x)
  1086. array([[[1., 1.],
  1087. [1., 1.]],
  1088. [[1., 1.],
  1089. [1., 1.]],
  1090. [[1., 1.],
  1091. [1., 1.]]])
  1092. """
  1093. return (Dispatchable(x, np.ndarray),)
  1094. @_dispatch
  1095. def irfft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None, *,
  1096. plan=None):
  1097. """
  1098. Computes the inverse of `rfft2`
  1099. Parameters
  1100. ----------
  1101. x : array_like
  1102. The input array
  1103. s : sequence of ints, optional
  1104. Shape of the real output to the inverse FFT.
  1105. axes : sequence of ints, optional
  1106. The axes over which to compute the inverse fft.
  1107. Default is the last two axes.
  1108. norm : {"backward", "ortho", "forward"}, optional
  1109. Normalization mode (see `fft`). Default is "backward".
  1110. overwrite_x : bool, optional
  1111. If True, the contents of `x` can be destroyed; the default is False.
  1112. See :func:`fft` for more details.
  1113. workers : int, optional
  1114. Maximum number of workers to use for parallel computation. If negative,
  1115. the value wraps around from ``os.cpu_count()``.
  1116. See :func:`~scipy.fft.fft` for more details.
  1117. plan : object, optional
  1118. This argument is reserved for passing in a precomputed plan provided
  1119. by downstream FFT vendors. It is currently not used in SciPy.
  1120. .. versionadded:: 1.5.0
  1121. Returns
  1122. -------
  1123. out : ndarray
  1124. The result of the inverse real 2-D FFT.
  1125. See Also
  1126. --------
  1127. rfft2 : The 2-D FFT of real input.
  1128. irfft : The inverse of the 1-D FFT of real input.
  1129. irfftn : The inverse of the N-D FFT of real input.
  1130. Notes
  1131. -----
  1132. This is really `irfftn` with different defaults.
  1133. For more details see `irfftn`.
  1134. """
  1135. return (Dispatchable(x, np.ndarray),)
  1136. @_dispatch
  1137. def hfftn(x, s=None, axes=None, norm=None, overwrite_x=False, workers=None, *,
  1138. plan=None):
  1139. """
  1140. Compute the N-D FFT of Hermitian symmetric complex input, i.e., a
  1141. signal with a real spectrum.
  1142. This function computes the N-D discrete Fourier Transform for a
  1143. Hermitian symmetric complex input over any number of axes in an
  1144. M-D array by means of the Fast Fourier Transform (FFT). In other
  1145. words, ``ihfftn(hfftn(x, s)) == x`` to within numerical accuracy. (``s``
  1146. here is ``x.shape`` with ``s[-1] = x.shape[-1] * 2 - 1``, this is necessary
  1147. for the same reason ``x.shape`` would be necessary for `irfft`.)
  1148. Parameters
  1149. ----------
  1150. x : array_like
  1151. Input array.
  1152. s : sequence of ints, optional
  1153. Shape (length of each transformed axis) of the output
  1154. (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.). `s` is also the
  1155. number of input points used along this axis, except for the last axis,
  1156. where ``s[-1]//2+1`` points of the input are used.
  1157. Along any axis, if the shape indicated by `s` is smaller than that of
  1158. the input, the input is cropped. If it is larger, the input is padded
  1159. with zeros. If `s` is not given, the shape of the input along the axes
  1160. specified by axes is used. Except for the last axis which is taken to be
  1161. ``2*(m-1)`` where ``m`` is the length of the input along that axis.
  1162. axes : sequence of ints, optional
  1163. Axes over which to compute the inverse FFT. If not given, the last
  1164. `len(s)` axes are used, or all axes if `s` is also not specified.
  1165. norm : {"backward", "ortho", "forward"}, optional
  1166. Normalization mode (see `fft`). Default is "backward".
  1167. overwrite_x : bool, optional
  1168. If True, the contents of `x` can be destroyed; the default is False.
  1169. See :func:`fft` for more details.
  1170. workers : int, optional
  1171. Maximum number of workers to use for parallel computation. If negative,
  1172. the value wraps around from ``os.cpu_count()``.
  1173. See :func:`~scipy.fft.fft` for more details.
  1174. plan : object, optional
  1175. This argument is reserved for passing in a precomputed plan provided
  1176. by downstream FFT vendors. It is currently not used in SciPy.
  1177. .. versionadded:: 1.5.0
  1178. Returns
  1179. -------
  1180. out : ndarray
  1181. The truncated or zero-padded input, transformed along the axes
  1182. indicated by `axes`, or by a combination of `s` or `x`,
  1183. as explained in the parameters section above.
  1184. The length of each transformed axis is as given by the corresponding
  1185. element of `s`, or the length of the input in every axis except for the
  1186. last one if `s` is not given. In the final transformed axis the length
  1187. of the output when `s` is not given is ``2*(m-1)`` where ``m`` is the
  1188. length of the final transformed axis of the input. To get an odd
  1189. number of output points in the final axis, `s` must be specified.
  1190. Raises
  1191. ------
  1192. ValueError
  1193. If `s` and `axes` have different length.
  1194. IndexError
  1195. If an element of `axes` is larger than the number of axes of `x`.
  1196. See Also
  1197. --------
  1198. ihfftn : The inverse N-D FFT with real spectrum. Inverse of `hfftn`.
  1199. fft : The 1-D FFT, with definitions and conventions used.
  1200. rfft : Forward FFT of real input.
  1201. Notes
  1202. -----
  1203. For a 1-D signal ``x`` to have a real spectrum, it must satisfy
  1204. the Hermitian property::
  1205. x[i] == np.conj(x[-i]) for all i
  1206. This generalizes into higher dimensions by reflecting over each axis in
  1207. turn::
  1208. x[i, j, k, ...] == np.conj(x[-i, -j, -k, ...]) for all i, j, k, ...
  1209. This should not be confused with a Hermitian matrix, for which the
  1210. transpose is its own conjugate::
  1211. x[i, j] == np.conj(x[j, i]) for all i, j
  1212. The default value of `s` assumes an even output length in the final
  1213. transformation axis. When performing the final complex to real
  1214. transformation, the Hermitian symmetry requires that the last imaginary
  1215. component along that axis must be 0 and so it is ignored. To avoid losing
  1216. information, the correct length of the real input *must* be given.
  1217. Examples
  1218. --------
  1219. >>> import scipy.fft
  1220. >>> import numpy as np
  1221. >>> x = np.ones((3, 2, 2))
  1222. >>> scipy.fft.hfftn(x)
  1223. array([[[12., 0.],
  1224. [ 0., 0.]],
  1225. [[ 0., 0.],
  1226. [ 0., 0.]],
  1227. [[ 0., 0.],
  1228. [ 0., 0.]]])
  1229. """
  1230. return (Dispatchable(x, np.ndarray),)
  1231. @_dispatch
  1232. def hfft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None, *,
  1233. plan=None):
  1234. """
  1235. Compute the 2-D FFT of a Hermitian complex array.
  1236. Parameters
  1237. ----------
  1238. x : array
  1239. Input array, taken to be Hermitian complex.
  1240. s : sequence of ints, optional
  1241. Shape of the real output.
  1242. axes : sequence of ints, optional
  1243. Axes over which to compute the FFT.
  1244. norm : {"backward", "ortho", "forward"}, optional
  1245. Normalization mode (see `fft`). Default is "backward".
  1246. overwrite_x : bool, optional
  1247. If True, the contents of `x` can be destroyed; the default is False.
  1248. See `fft` for more details.
  1249. workers : int, optional
  1250. Maximum number of workers to use for parallel computation. If negative,
  1251. the value wraps around from ``os.cpu_count()``.
  1252. See :func:`~scipy.fft.fft` for more details.
  1253. plan : object, optional
  1254. This argument is reserved for passing in a precomputed plan provided
  1255. by downstream FFT vendors. It is currently not used in SciPy.
  1256. .. versionadded:: 1.5.0
  1257. Returns
  1258. -------
  1259. out : ndarray
  1260. The real result of the 2-D Hermitian complex real FFT.
  1261. See Also
  1262. --------
  1263. hfftn : Compute the N-D discrete Fourier Transform for Hermitian
  1264. complex input.
  1265. Notes
  1266. -----
  1267. This is really just `hfftn` with different default behavior.
  1268. For more details see `hfftn`.
  1269. """
  1270. return (Dispatchable(x, np.ndarray),)
  1271. @_dispatch
  1272. def ihfftn(x, s=None, axes=None, norm=None, overwrite_x=False, workers=None, *,
  1273. plan=None):
  1274. """
  1275. Compute the N-D inverse discrete Fourier Transform for a real
  1276. spectrum.
  1277. This function computes the N-D inverse discrete Fourier Transform
  1278. over any number of axes in an M-D real array by means of the Fast
  1279. Fourier Transform (FFT). By default, all axes are transformed, with the
  1280. real transform performed over the last axis, while the remaining transforms
  1281. are complex.
  1282. Parameters
  1283. ----------
  1284. x : array_like
  1285. Input array, taken to be real.
  1286. s : sequence of ints, optional
  1287. Shape (length along each transformed axis) to use from the input.
  1288. (``s[0]`` refers to axis 0, ``s[1]`` to axis 1, etc.).
  1289. Along any axis, if the given shape is smaller than that of the input,
  1290. the input is cropped. If it is larger, the input is padded with zeros.
  1291. if `s` is not given, the shape of the input along the axes specified
  1292. by `axes` is used.
  1293. axes : sequence of ints, optional
  1294. Axes over which to compute the FFT. If not given, the last ``len(s)``
  1295. axes are used, or all axes if `s` is also not specified.
  1296. norm : {"backward", "ortho", "forward"}, optional
  1297. Normalization mode (see `fft`). Default is "backward".
  1298. overwrite_x : bool, optional
  1299. If True, the contents of `x` can be destroyed; the default is False.
  1300. See :func:`fft` for more details.
  1301. workers : int, optional
  1302. Maximum number of workers to use for parallel computation. If negative,
  1303. the value wraps around from ``os.cpu_count()``.
  1304. See :func:`~scipy.fft.fft` for more details.
  1305. plan : object, optional
  1306. This argument is reserved for passing in a precomputed plan provided
  1307. by downstream FFT vendors. It is currently not used in SciPy.
  1308. .. versionadded:: 1.5.0
  1309. Returns
  1310. -------
  1311. out : complex ndarray
  1312. The truncated or zero-padded input, transformed along the axes
  1313. indicated by `axes`, or by a combination of `s` and `x`,
  1314. as explained in the parameters section above.
  1315. The length of the last axis transformed will be ``s[-1]//2+1``,
  1316. while the remaining transformed axes will have lengths according to
  1317. `s`, or unchanged from the input.
  1318. Raises
  1319. ------
  1320. ValueError
  1321. If `s` and `axes` have different length.
  1322. IndexError
  1323. If an element of `axes` is larger than the number of axes of `x`.
  1324. See Also
  1325. --------
  1326. hfftn : The forward N-D FFT of Hermitian input.
  1327. hfft : The 1-D FFT of Hermitian input.
  1328. fft : The 1-D FFT, with definitions and conventions used.
  1329. fftn : The N-D FFT.
  1330. hfft2 : The 2-D FFT of Hermitian input.
  1331. Notes
  1332. -----
  1333. The transform for real input is performed over the last transformation
  1334. axis, as by `ihfft`, then the transform over the remaining axes is
  1335. performed as by `ifftn`. The order of the output is the positive part of
  1336. the Hermitian output signal, in the same format as `rfft`.
  1337. Examples
  1338. --------
  1339. >>> import scipy.fft
  1340. >>> import numpy as np
  1341. >>> x = np.ones((2, 2, 2))
  1342. >>> scipy.fft.ihfftn(x)
  1343. array([[[1.+0.j, 0.+0.j], # may vary
  1344. [0.+0.j, 0.+0.j]],
  1345. [[0.+0.j, 0.+0.j],
  1346. [0.+0.j, 0.+0.j]]])
  1347. >>> scipy.fft.ihfftn(x, axes=(2, 0))
  1348. array([[[1.+0.j, 0.+0.j], # may vary
  1349. [1.+0.j, 0.+0.j]],
  1350. [[0.+0.j, 0.+0.j],
  1351. [0.+0.j, 0.+0.j]]])
  1352. """
  1353. return (Dispatchable(x, np.ndarray),)
  1354. @_dispatch
  1355. def ihfft2(x, s=None, axes=(-2, -1), norm=None, overwrite_x=False, workers=None, *,
  1356. plan=None):
  1357. """
  1358. Compute the 2-D inverse FFT of a real spectrum.
  1359. Parameters
  1360. ----------
  1361. x : array_like
  1362. The input array
  1363. s : sequence of ints, optional
  1364. Shape of the real input to the inverse FFT.
  1365. axes : sequence of ints, optional
  1366. The axes over which to compute the inverse fft.
  1367. Default is the last two axes.
  1368. norm : {"backward", "ortho", "forward"}, optional
  1369. Normalization mode (see `fft`). Default is "backward".
  1370. overwrite_x : bool, optional
  1371. If True, the contents of `x` can be destroyed; the default is False.
  1372. See :func:`fft` for more details.
  1373. workers : int, optional
  1374. Maximum number of workers to use for parallel computation. If negative,
  1375. the value wraps around from ``os.cpu_count()``.
  1376. See :func:`~scipy.fft.fft` for more details.
  1377. plan : object, optional
  1378. This argument is reserved for passing in a precomputed plan provided
  1379. by downstream FFT vendors. It is currently not used in SciPy.
  1380. .. versionadded:: 1.5.0
  1381. Returns
  1382. -------
  1383. out : ndarray
  1384. The result of the inverse real 2-D FFT.
  1385. See Also
  1386. --------
  1387. ihfftn : Compute the inverse of the N-D FFT of Hermitian input.
  1388. Notes
  1389. -----
  1390. This is really `ihfftn` with different defaults.
  1391. For more details see `ihfftn`.
  1392. """
  1393. return (Dispatchable(x, np.ndarray),)