scipy 1.16.2__cp312-cp312-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1530) hide show
  1. scipy/__config__.py +161 -0
  2. scipy/__init__.py +150 -0
  3. scipy/_cyutility.cp312-win_arm64.lib +0 -0
  4. scipy/_cyutility.cp312-win_arm64.pyd +0 -0
  5. scipy/_distributor_init.py +18 -0
  6. scipy/_lib/__init__.py +14 -0
  7. scipy/_lib/_array_api.py +931 -0
  8. scipy/_lib/_array_api_compat_vendor.py +9 -0
  9. scipy/_lib/_array_api_no_0d.py +103 -0
  10. scipy/_lib/_bunch.py +229 -0
  11. scipy/_lib/_ccallback.py +251 -0
  12. scipy/_lib/_ccallback_c.cp312-win_arm64.lib +0 -0
  13. scipy/_lib/_ccallback_c.cp312-win_arm64.pyd +0 -0
  14. scipy/_lib/_disjoint_set.py +254 -0
  15. scipy/_lib/_docscrape.py +761 -0
  16. scipy/_lib/_elementwise_iterative_method.py +346 -0
  17. scipy/_lib/_fpumode.cp312-win_arm64.lib +0 -0
  18. scipy/_lib/_fpumode.cp312-win_arm64.pyd +0 -0
  19. scipy/_lib/_gcutils.py +105 -0
  20. scipy/_lib/_pep440.py +487 -0
  21. scipy/_lib/_sparse.py +41 -0
  22. scipy/_lib/_test_ccallback.cp312-win_arm64.lib +0 -0
  23. scipy/_lib/_test_ccallback.cp312-win_arm64.pyd +0 -0
  24. scipy/_lib/_test_deprecation_call.cp312-win_arm64.lib +0 -0
  25. scipy/_lib/_test_deprecation_call.cp312-win_arm64.pyd +0 -0
  26. scipy/_lib/_test_deprecation_def.cp312-win_arm64.lib +0 -0
  27. scipy/_lib/_test_deprecation_def.cp312-win_arm64.pyd +0 -0
  28. scipy/_lib/_testutils.py +373 -0
  29. scipy/_lib/_threadsafety.py +58 -0
  30. scipy/_lib/_tmpdirs.py +86 -0
  31. scipy/_lib/_uarray/LICENSE +29 -0
  32. scipy/_lib/_uarray/__init__.py +116 -0
  33. scipy/_lib/_uarray/_backend.py +707 -0
  34. scipy/_lib/_uarray/_uarray.cp312-win_arm64.lib +0 -0
  35. scipy/_lib/_uarray/_uarray.cp312-win_arm64.pyd +0 -0
  36. scipy/_lib/_util.py +1283 -0
  37. scipy/_lib/array_api_compat/__init__.py +22 -0
  38. scipy/_lib/array_api_compat/_internal.py +59 -0
  39. scipy/_lib/array_api_compat/common/__init__.py +1 -0
  40. scipy/_lib/array_api_compat/common/_aliases.py +727 -0
  41. scipy/_lib/array_api_compat/common/_fft.py +213 -0
  42. scipy/_lib/array_api_compat/common/_helpers.py +1058 -0
  43. scipy/_lib/array_api_compat/common/_linalg.py +232 -0
  44. scipy/_lib/array_api_compat/common/_typing.py +192 -0
  45. scipy/_lib/array_api_compat/cupy/__init__.py +13 -0
  46. scipy/_lib/array_api_compat/cupy/_aliases.py +156 -0
  47. scipy/_lib/array_api_compat/cupy/_info.py +336 -0
  48. scipy/_lib/array_api_compat/cupy/_typing.py +31 -0
  49. scipy/_lib/array_api_compat/cupy/fft.py +36 -0
  50. scipy/_lib/array_api_compat/cupy/linalg.py +49 -0
  51. scipy/_lib/array_api_compat/dask/__init__.py +0 -0
  52. scipy/_lib/array_api_compat/dask/array/__init__.py +12 -0
  53. scipy/_lib/array_api_compat/dask/array/_aliases.py +376 -0
  54. scipy/_lib/array_api_compat/dask/array/_info.py +416 -0
  55. scipy/_lib/array_api_compat/dask/array/fft.py +21 -0
  56. scipy/_lib/array_api_compat/dask/array/linalg.py +72 -0
  57. scipy/_lib/array_api_compat/numpy/__init__.py +28 -0
  58. scipy/_lib/array_api_compat/numpy/_aliases.py +190 -0
  59. scipy/_lib/array_api_compat/numpy/_info.py +366 -0
  60. scipy/_lib/array_api_compat/numpy/_typing.py +30 -0
  61. scipy/_lib/array_api_compat/numpy/fft.py +35 -0
  62. scipy/_lib/array_api_compat/numpy/linalg.py +143 -0
  63. scipy/_lib/array_api_compat/torch/__init__.py +22 -0
  64. scipy/_lib/array_api_compat/torch/_aliases.py +855 -0
  65. scipy/_lib/array_api_compat/torch/_info.py +369 -0
  66. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  67. scipy/_lib/array_api_compat/torch/fft.py +85 -0
  68. scipy/_lib/array_api_compat/torch/linalg.py +121 -0
  69. scipy/_lib/array_api_extra/__init__.py +38 -0
  70. scipy/_lib/array_api_extra/_delegation.py +171 -0
  71. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  72. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  73. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  74. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  75. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  76. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  77. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  78. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  79. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  80. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  81. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  82. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  83. scipy/_lib/array_api_extra/testing.py +359 -0
  84. scipy/_lib/cobyqa/__init__.py +20 -0
  85. scipy/_lib/cobyqa/framework.py +1240 -0
  86. scipy/_lib/cobyqa/main.py +1506 -0
  87. scipy/_lib/cobyqa/models.py +1529 -0
  88. scipy/_lib/cobyqa/problem.py +1296 -0
  89. scipy/_lib/cobyqa/settings.py +132 -0
  90. scipy/_lib/cobyqa/subsolvers/__init__.py +14 -0
  91. scipy/_lib/cobyqa/subsolvers/geometry.py +387 -0
  92. scipy/_lib/cobyqa/subsolvers/optim.py +1203 -0
  93. scipy/_lib/cobyqa/utils/__init__.py +18 -0
  94. scipy/_lib/cobyqa/utils/exceptions.py +22 -0
  95. scipy/_lib/cobyqa/utils/math.py +77 -0
  96. scipy/_lib/cobyqa/utils/versions.py +67 -0
  97. scipy/_lib/decorator.py +399 -0
  98. scipy/_lib/deprecation.py +274 -0
  99. scipy/_lib/doccer.py +366 -0
  100. scipy/_lib/messagestream.cp312-win_arm64.lib +0 -0
  101. scipy/_lib/messagestream.cp312-win_arm64.pyd +0 -0
  102. scipy/_lib/pyprima/__init__.py +212 -0
  103. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  104. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  105. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  106. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  107. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  108. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  109. scipy/_lib/pyprima/cobyla/update.py +289 -0
  110. scipy/_lib/pyprima/common/__init__.py +0 -0
  111. scipy/_lib/pyprima/common/_bounds.py +34 -0
  112. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  113. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  114. scipy/_lib/pyprima/common/_project.py +173 -0
  115. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  116. scipy/_lib/pyprima/common/consts.py +47 -0
  117. scipy/_lib/pyprima/common/evaluate.py +99 -0
  118. scipy/_lib/pyprima/common/history.py +38 -0
  119. scipy/_lib/pyprima/common/infos.py +30 -0
  120. scipy/_lib/pyprima/common/linalg.py +435 -0
  121. scipy/_lib/pyprima/common/message.py +290 -0
  122. scipy/_lib/pyprima/common/powalg.py +131 -0
  123. scipy/_lib/pyprima/common/preproc.py +277 -0
  124. scipy/_lib/pyprima/common/present.py +5 -0
  125. scipy/_lib/pyprima/common/ratio.py +54 -0
  126. scipy/_lib/pyprima/common/redrho.py +47 -0
  127. scipy/_lib/pyprima/common/selectx.py +296 -0
  128. scipy/_lib/tests/__init__.py +0 -0
  129. scipy/_lib/tests/test__gcutils.py +110 -0
  130. scipy/_lib/tests/test__pep440.py +67 -0
  131. scipy/_lib/tests/test__testutils.py +32 -0
  132. scipy/_lib/tests/test__threadsafety.py +51 -0
  133. scipy/_lib/tests/test__util.py +641 -0
  134. scipy/_lib/tests/test_array_api.py +322 -0
  135. scipy/_lib/tests/test_bunch.py +169 -0
  136. scipy/_lib/tests/test_ccallback.py +196 -0
  137. scipy/_lib/tests/test_config.py +45 -0
  138. scipy/_lib/tests/test_deprecation.py +10 -0
  139. scipy/_lib/tests/test_doccer.py +143 -0
  140. scipy/_lib/tests/test_import_cycles.py +18 -0
  141. scipy/_lib/tests/test_public_api.py +482 -0
  142. scipy/_lib/tests/test_scipy_version.py +28 -0
  143. scipy/_lib/tests/test_tmpdirs.py +48 -0
  144. scipy/_lib/tests/test_warnings.py +137 -0
  145. scipy/_lib/uarray.py +31 -0
  146. scipy/cluster/__init__.py +31 -0
  147. scipy/cluster/_hierarchy.cp312-win_arm64.lib +0 -0
  148. scipy/cluster/_hierarchy.cp312-win_arm64.pyd +0 -0
  149. scipy/cluster/_optimal_leaf_ordering.cp312-win_arm64.lib +0 -0
  150. scipy/cluster/_optimal_leaf_ordering.cp312-win_arm64.pyd +0 -0
  151. scipy/cluster/_vq.cp312-win_arm64.lib +0 -0
  152. scipy/cluster/_vq.cp312-win_arm64.pyd +0 -0
  153. scipy/cluster/hierarchy.py +4348 -0
  154. scipy/cluster/tests/__init__.py +0 -0
  155. scipy/cluster/tests/hierarchy_test_data.py +145 -0
  156. scipy/cluster/tests/test_disjoint_set.py +202 -0
  157. scipy/cluster/tests/test_hierarchy.py +1238 -0
  158. scipy/cluster/tests/test_vq.py +434 -0
  159. scipy/cluster/vq.py +832 -0
  160. scipy/conftest.py +683 -0
  161. scipy/constants/__init__.py +358 -0
  162. scipy/constants/_codata.py +2266 -0
  163. scipy/constants/_constants.py +369 -0
  164. scipy/constants/codata.py +21 -0
  165. scipy/constants/constants.py +53 -0
  166. scipy/constants/tests/__init__.py +0 -0
  167. scipy/constants/tests/test_codata.py +78 -0
  168. scipy/constants/tests/test_constants.py +83 -0
  169. scipy/datasets/__init__.py +90 -0
  170. scipy/datasets/_download_all.py +71 -0
  171. scipy/datasets/_fetchers.py +225 -0
  172. scipy/datasets/_registry.py +26 -0
  173. scipy/datasets/_utils.py +81 -0
  174. scipy/datasets/tests/__init__.py +0 -0
  175. scipy/datasets/tests/test_data.py +128 -0
  176. scipy/differentiate/__init__.py +27 -0
  177. scipy/differentiate/_differentiate.py +1129 -0
  178. scipy/differentiate/tests/__init__.py +0 -0
  179. scipy/differentiate/tests/test_differentiate.py +694 -0
  180. scipy/fft/__init__.py +114 -0
  181. scipy/fft/_backend.py +196 -0
  182. scipy/fft/_basic.py +1650 -0
  183. scipy/fft/_basic_backend.py +197 -0
  184. scipy/fft/_debug_backends.py +22 -0
  185. scipy/fft/_fftlog.py +223 -0
  186. scipy/fft/_fftlog_backend.py +200 -0
  187. scipy/fft/_helper.py +348 -0
  188. scipy/fft/_pocketfft/LICENSE.md +25 -0
  189. scipy/fft/_pocketfft/__init__.py +9 -0
  190. scipy/fft/_pocketfft/basic.py +251 -0
  191. scipy/fft/_pocketfft/helper.py +249 -0
  192. scipy/fft/_pocketfft/pypocketfft.cp312-win_arm64.lib +0 -0
  193. scipy/fft/_pocketfft/pypocketfft.cp312-win_arm64.pyd +0 -0
  194. scipy/fft/_pocketfft/realtransforms.py +109 -0
  195. scipy/fft/_pocketfft/tests/__init__.py +0 -0
  196. scipy/fft/_pocketfft/tests/test_basic.py +1011 -0
  197. scipy/fft/_pocketfft/tests/test_real_transforms.py +505 -0
  198. scipy/fft/_realtransforms.py +706 -0
  199. scipy/fft/_realtransforms_backend.py +63 -0
  200. scipy/fft/tests/__init__.py +0 -0
  201. scipy/fft/tests/mock_backend.py +96 -0
  202. scipy/fft/tests/test_backend.py +98 -0
  203. scipy/fft/tests/test_basic.py +504 -0
  204. scipy/fft/tests/test_fftlog.py +215 -0
  205. scipy/fft/tests/test_helper.py +558 -0
  206. scipy/fft/tests/test_multithreading.py +84 -0
  207. scipy/fft/tests/test_real_transforms.py +247 -0
  208. scipy/fftpack/__init__.py +103 -0
  209. scipy/fftpack/_basic.py +428 -0
  210. scipy/fftpack/_helper.py +115 -0
  211. scipy/fftpack/_pseudo_diffs.py +554 -0
  212. scipy/fftpack/_realtransforms.py +598 -0
  213. scipy/fftpack/basic.py +20 -0
  214. scipy/fftpack/convolve.cp312-win_arm64.lib +0 -0
  215. scipy/fftpack/convolve.cp312-win_arm64.pyd +0 -0
  216. scipy/fftpack/helper.py +19 -0
  217. scipy/fftpack/pseudo_diffs.py +22 -0
  218. scipy/fftpack/realtransforms.py +19 -0
  219. scipy/fftpack/tests/__init__.py +0 -0
  220. scipy/fftpack/tests/fftw_double_ref.npz +0 -0
  221. scipy/fftpack/tests/fftw_longdouble_ref.npz +0 -0
  222. scipy/fftpack/tests/fftw_single_ref.npz +0 -0
  223. scipy/fftpack/tests/test.npz +0 -0
  224. scipy/fftpack/tests/test_basic.py +877 -0
  225. scipy/fftpack/tests/test_helper.py +54 -0
  226. scipy/fftpack/tests/test_import.py +33 -0
  227. scipy/fftpack/tests/test_pseudo_diffs.py +388 -0
  228. scipy/fftpack/tests/test_real_transforms.py +836 -0
  229. scipy/integrate/__init__.py +122 -0
  230. scipy/integrate/_bvp.py +1160 -0
  231. scipy/integrate/_cubature.py +729 -0
  232. scipy/integrate/_dop.cp312-win_arm64.lib +0 -0
  233. scipy/integrate/_dop.cp312-win_arm64.pyd +0 -0
  234. scipy/integrate/_ivp/__init__.py +8 -0
  235. scipy/integrate/_ivp/base.py +290 -0
  236. scipy/integrate/_ivp/bdf.py +478 -0
  237. scipy/integrate/_ivp/common.py +451 -0
  238. scipy/integrate/_ivp/dop853_coefficients.py +193 -0
  239. scipy/integrate/_ivp/ivp.py +755 -0
  240. scipy/integrate/_ivp/lsoda.py +224 -0
  241. scipy/integrate/_ivp/radau.py +572 -0
  242. scipy/integrate/_ivp/rk.py +601 -0
  243. scipy/integrate/_ivp/tests/__init__.py +0 -0
  244. scipy/integrate/_ivp/tests/test_ivp.py +1287 -0
  245. scipy/integrate/_ivp/tests/test_rk.py +37 -0
  246. scipy/integrate/_lebedev.py +5450 -0
  247. scipy/integrate/_lsoda.cp312-win_arm64.lib +0 -0
  248. scipy/integrate/_lsoda.cp312-win_arm64.pyd +0 -0
  249. scipy/integrate/_ode.py +1395 -0
  250. scipy/integrate/_odepack.cp312-win_arm64.lib +0 -0
  251. scipy/integrate/_odepack.cp312-win_arm64.pyd +0 -0
  252. scipy/integrate/_odepack_py.py +273 -0
  253. scipy/integrate/_quad_vec.py +674 -0
  254. scipy/integrate/_quadpack.cp312-win_arm64.lib +0 -0
  255. scipy/integrate/_quadpack.cp312-win_arm64.pyd +0 -0
  256. scipy/integrate/_quadpack_py.py +1283 -0
  257. scipy/integrate/_quadrature.py +1336 -0
  258. scipy/integrate/_rules/__init__.py +12 -0
  259. scipy/integrate/_rules/_base.py +518 -0
  260. scipy/integrate/_rules/_gauss_kronrod.py +202 -0
  261. scipy/integrate/_rules/_gauss_legendre.py +62 -0
  262. scipy/integrate/_rules/_genz_malik.py +210 -0
  263. scipy/integrate/_tanhsinh.py +1385 -0
  264. scipy/integrate/_test_multivariate.cp312-win_arm64.lib +0 -0
  265. scipy/integrate/_test_multivariate.cp312-win_arm64.pyd +0 -0
  266. scipy/integrate/_test_odeint_banded.cp312-win_arm64.lib +0 -0
  267. scipy/integrate/_test_odeint_banded.cp312-win_arm64.pyd +0 -0
  268. scipy/integrate/_vode.cp312-win_arm64.lib +0 -0
  269. scipy/integrate/_vode.cp312-win_arm64.pyd +0 -0
  270. scipy/integrate/dop.py +15 -0
  271. scipy/integrate/lsoda.py +15 -0
  272. scipy/integrate/odepack.py +17 -0
  273. scipy/integrate/quadpack.py +23 -0
  274. scipy/integrate/tests/__init__.py +0 -0
  275. scipy/integrate/tests/test__quad_vec.py +211 -0
  276. scipy/integrate/tests/test_banded_ode_solvers.py +305 -0
  277. scipy/integrate/tests/test_bvp.py +714 -0
  278. scipy/integrate/tests/test_cubature.py +1375 -0
  279. scipy/integrate/tests/test_integrate.py +840 -0
  280. scipy/integrate/tests/test_odeint_jac.py +74 -0
  281. scipy/integrate/tests/test_quadpack.py +680 -0
  282. scipy/integrate/tests/test_quadrature.py +730 -0
  283. scipy/integrate/tests/test_tanhsinh.py +1171 -0
  284. scipy/integrate/vode.py +15 -0
  285. scipy/interpolate/__init__.py +228 -0
  286. scipy/interpolate/_bary_rational.py +715 -0
  287. scipy/interpolate/_bsplines.py +2469 -0
  288. scipy/interpolate/_cubic.py +973 -0
  289. scipy/interpolate/_dfitpack.cp312-win_arm64.lib +0 -0
  290. scipy/interpolate/_dfitpack.cp312-win_arm64.pyd +0 -0
  291. scipy/interpolate/_dierckx.cp312-win_arm64.lib +0 -0
  292. scipy/interpolate/_dierckx.cp312-win_arm64.pyd +0 -0
  293. scipy/interpolate/_fitpack.cp312-win_arm64.lib +0 -0
  294. scipy/interpolate/_fitpack.cp312-win_arm64.pyd +0 -0
  295. scipy/interpolate/_fitpack2.py +2397 -0
  296. scipy/interpolate/_fitpack_impl.py +811 -0
  297. scipy/interpolate/_fitpack_py.py +898 -0
  298. scipy/interpolate/_fitpack_repro.py +996 -0
  299. scipy/interpolate/_interpnd.cp312-win_arm64.lib +0 -0
  300. scipy/interpolate/_interpnd.cp312-win_arm64.pyd +0 -0
  301. scipy/interpolate/_interpolate.py +2266 -0
  302. scipy/interpolate/_ndbspline.py +415 -0
  303. scipy/interpolate/_ndgriddata.py +329 -0
  304. scipy/interpolate/_pade.py +67 -0
  305. scipy/interpolate/_polyint.py +1025 -0
  306. scipy/interpolate/_ppoly.cp312-win_arm64.lib +0 -0
  307. scipy/interpolate/_ppoly.cp312-win_arm64.pyd +0 -0
  308. scipy/interpolate/_rbf.py +290 -0
  309. scipy/interpolate/_rbfinterp.py +550 -0
  310. scipy/interpolate/_rbfinterp_pythran.cp312-win_arm64.lib +0 -0
  311. scipy/interpolate/_rbfinterp_pythran.cp312-win_arm64.pyd +0 -0
  312. scipy/interpolate/_rgi.py +764 -0
  313. scipy/interpolate/_rgi_cython.cp312-win_arm64.lib +0 -0
  314. scipy/interpolate/_rgi_cython.cp312-win_arm64.pyd +0 -0
  315. scipy/interpolate/dfitpack.py +24 -0
  316. scipy/interpolate/fitpack.py +31 -0
  317. scipy/interpolate/fitpack2.py +29 -0
  318. scipy/interpolate/interpnd.py +24 -0
  319. scipy/interpolate/interpolate.py +30 -0
  320. scipy/interpolate/ndgriddata.py +23 -0
  321. scipy/interpolate/polyint.py +24 -0
  322. scipy/interpolate/rbf.py +18 -0
  323. scipy/interpolate/tests/__init__.py +0 -0
  324. scipy/interpolate/tests/data/bug-1310.npz +0 -0
  325. scipy/interpolate/tests/data/estimate_gradients_hang.npy +0 -0
  326. scipy/interpolate/tests/data/gcvspl.npz +0 -0
  327. scipy/interpolate/tests/test_bary_rational.py +368 -0
  328. scipy/interpolate/tests/test_bsplines.py +3754 -0
  329. scipy/interpolate/tests/test_fitpack.py +519 -0
  330. scipy/interpolate/tests/test_fitpack2.py +1431 -0
  331. scipy/interpolate/tests/test_gil.py +64 -0
  332. scipy/interpolate/tests/test_interpnd.py +452 -0
  333. scipy/interpolate/tests/test_interpolate.py +2630 -0
  334. scipy/interpolate/tests/test_ndgriddata.py +308 -0
  335. scipy/interpolate/tests/test_pade.py +107 -0
  336. scipy/interpolate/tests/test_polyint.py +972 -0
  337. scipy/interpolate/tests/test_rbf.py +246 -0
  338. scipy/interpolate/tests/test_rbfinterp.py +534 -0
  339. scipy/interpolate/tests/test_rgi.py +1151 -0
  340. scipy/io/__init__.py +116 -0
  341. scipy/io/_fast_matrix_market/__init__.py +600 -0
  342. scipy/io/_fast_matrix_market/_fmm_core.cp312-win_arm64.lib +0 -0
  343. scipy/io/_fast_matrix_market/_fmm_core.cp312-win_arm64.pyd +0 -0
  344. scipy/io/_fortran.py +354 -0
  345. scipy/io/_harwell_boeing/__init__.py +7 -0
  346. scipy/io/_harwell_boeing/_fortran_format_parser.py +316 -0
  347. scipy/io/_harwell_boeing/hb.py +571 -0
  348. scipy/io/_harwell_boeing/tests/__init__.py +0 -0
  349. scipy/io/_harwell_boeing/tests/test_fortran_format.py +74 -0
  350. scipy/io/_harwell_boeing/tests/test_hb.py +70 -0
  351. scipy/io/_idl.py +917 -0
  352. scipy/io/_mmio.py +968 -0
  353. scipy/io/_netcdf.py +1104 -0
  354. scipy/io/_test_fortran.cp312-win_arm64.lib +0 -0
  355. scipy/io/_test_fortran.cp312-win_arm64.pyd +0 -0
  356. scipy/io/arff/__init__.py +28 -0
  357. scipy/io/arff/_arffread.py +873 -0
  358. scipy/io/arff/arffread.py +19 -0
  359. scipy/io/arff/tests/__init__.py +0 -0
  360. scipy/io/arff/tests/data/iris.arff +225 -0
  361. scipy/io/arff/tests/data/missing.arff +8 -0
  362. scipy/io/arff/tests/data/nodata.arff +11 -0
  363. scipy/io/arff/tests/data/quoted_nominal.arff +13 -0
  364. scipy/io/arff/tests/data/quoted_nominal_spaces.arff +13 -0
  365. scipy/io/arff/tests/data/test1.arff +10 -0
  366. scipy/io/arff/tests/data/test10.arff +8 -0
  367. scipy/io/arff/tests/data/test11.arff +11 -0
  368. scipy/io/arff/tests/data/test2.arff +15 -0
  369. scipy/io/arff/tests/data/test3.arff +6 -0
  370. scipy/io/arff/tests/data/test4.arff +11 -0
  371. scipy/io/arff/tests/data/test5.arff +26 -0
  372. scipy/io/arff/tests/data/test6.arff +12 -0
  373. scipy/io/arff/tests/data/test7.arff +15 -0
  374. scipy/io/arff/tests/data/test8.arff +12 -0
  375. scipy/io/arff/tests/data/test9.arff +14 -0
  376. scipy/io/arff/tests/test_arffread.py +421 -0
  377. scipy/io/harwell_boeing.py +17 -0
  378. scipy/io/idl.py +17 -0
  379. scipy/io/matlab/__init__.py +66 -0
  380. scipy/io/matlab/_byteordercodes.py +75 -0
  381. scipy/io/matlab/_mio.py +375 -0
  382. scipy/io/matlab/_mio4.py +632 -0
  383. scipy/io/matlab/_mio5.py +901 -0
  384. scipy/io/matlab/_mio5_params.py +281 -0
  385. scipy/io/matlab/_mio5_utils.cp312-win_arm64.lib +0 -0
  386. scipy/io/matlab/_mio5_utils.cp312-win_arm64.pyd +0 -0
  387. scipy/io/matlab/_mio_utils.cp312-win_arm64.lib +0 -0
  388. scipy/io/matlab/_mio_utils.cp312-win_arm64.pyd +0 -0
  389. scipy/io/matlab/_miobase.py +435 -0
  390. scipy/io/matlab/_streams.cp312-win_arm64.lib +0 -0
  391. scipy/io/matlab/_streams.cp312-win_arm64.pyd +0 -0
  392. scipy/io/matlab/byteordercodes.py +17 -0
  393. scipy/io/matlab/mio.py +16 -0
  394. scipy/io/matlab/mio4.py +17 -0
  395. scipy/io/matlab/mio5.py +19 -0
  396. scipy/io/matlab/mio5_params.py +18 -0
  397. scipy/io/matlab/mio5_utils.py +17 -0
  398. scipy/io/matlab/mio_utils.py +17 -0
  399. scipy/io/matlab/miobase.py +16 -0
  400. scipy/io/matlab/streams.py +16 -0
  401. scipy/io/matlab/tests/__init__.py +0 -0
  402. scipy/io/matlab/tests/data/bad_miuint32.mat +0 -0
  403. scipy/io/matlab/tests/data/bad_miutf8_array_name.mat +0 -0
  404. scipy/io/matlab/tests/data/big_endian.mat +0 -0
  405. scipy/io/matlab/tests/data/broken_utf8.mat +0 -0
  406. scipy/io/matlab/tests/data/corrupted_zlib_checksum.mat +0 -0
  407. scipy/io/matlab/tests/data/corrupted_zlib_data.mat +0 -0
  408. scipy/io/matlab/tests/data/debigged_m4.mat +0 -0
  409. scipy/io/matlab/tests/data/japanese_utf8.txt +5 -0
  410. scipy/io/matlab/tests/data/little_endian.mat +0 -0
  411. scipy/io/matlab/tests/data/logical_sparse.mat +0 -0
  412. scipy/io/matlab/tests/data/malformed1.mat +0 -0
  413. scipy/io/matlab/tests/data/miuint32_for_miint32.mat +0 -0
  414. scipy/io/matlab/tests/data/miutf8_array_name.mat +0 -0
  415. scipy/io/matlab/tests/data/nasty_duplicate_fieldnames.mat +0 -0
  416. scipy/io/matlab/tests/data/one_by_zero_char.mat +0 -0
  417. scipy/io/matlab/tests/data/parabola.mat +0 -0
  418. scipy/io/matlab/tests/data/single_empty_string.mat +0 -0
  419. scipy/io/matlab/tests/data/some_functions.mat +0 -0
  420. scipy/io/matlab/tests/data/sqr.mat +0 -0
  421. scipy/io/matlab/tests/data/test3dmatrix_6.1_SOL2.mat +0 -0
  422. scipy/io/matlab/tests/data/test3dmatrix_6.5.1_GLNX86.mat +0 -0
  423. scipy/io/matlab/tests/data/test3dmatrix_7.1_GLNX86.mat +0 -0
  424. scipy/io/matlab/tests/data/test3dmatrix_7.4_GLNX86.mat +0 -0
  425. scipy/io/matlab/tests/data/test_empty_struct.mat +0 -0
  426. scipy/io/matlab/tests/data/test_mat4_le_floats.mat +0 -0
  427. scipy/io/matlab/tests/data/test_skip_variable.mat +0 -0
  428. scipy/io/matlab/tests/data/testbool_8_WIN64.mat +0 -0
  429. scipy/io/matlab/tests/data/testcell_6.1_SOL2.mat +0 -0
  430. scipy/io/matlab/tests/data/testcell_6.5.1_GLNX86.mat +0 -0
  431. scipy/io/matlab/tests/data/testcell_7.1_GLNX86.mat +0 -0
  432. scipy/io/matlab/tests/data/testcell_7.4_GLNX86.mat +0 -0
  433. scipy/io/matlab/tests/data/testcellnest_6.1_SOL2.mat +0 -0
  434. scipy/io/matlab/tests/data/testcellnest_6.5.1_GLNX86.mat +0 -0
  435. scipy/io/matlab/tests/data/testcellnest_7.1_GLNX86.mat +0 -0
  436. scipy/io/matlab/tests/data/testcellnest_7.4_GLNX86.mat +0 -0
  437. scipy/io/matlab/tests/data/testcomplex_4.2c_SOL2.mat +0 -0
  438. scipy/io/matlab/tests/data/testcomplex_6.1_SOL2.mat +0 -0
  439. scipy/io/matlab/tests/data/testcomplex_6.5.1_GLNX86.mat +0 -0
  440. scipy/io/matlab/tests/data/testcomplex_7.1_GLNX86.mat +0 -0
  441. scipy/io/matlab/tests/data/testcomplex_7.4_GLNX86.mat +0 -0
  442. scipy/io/matlab/tests/data/testdouble_4.2c_SOL2.mat +0 -0
  443. scipy/io/matlab/tests/data/testdouble_6.1_SOL2.mat +0 -0
  444. scipy/io/matlab/tests/data/testdouble_6.5.1_GLNX86.mat +0 -0
  445. scipy/io/matlab/tests/data/testdouble_7.1_GLNX86.mat +0 -0
  446. scipy/io/matlab/tests/data/testdouble_7.4_GLNX86.mat +0 -0
  447. scipy/io/matlab/tests/data/testemptycell_5.3_SOL2.mat +0 -0
  448. scipy/io/matlab/tests/data/testemptycell_6.5.1_GLNX86.mat +0 -0
  449. scipy/io/matlab/tests/data/testemptycell_7.1_GLNX86.mat +0 -0
  450. scipy/io/matlab/tests/data/testemptycell_7.4_GLNX86.mat +0 -0
  451. scipy/io/matlab/tests/data/testfunc_7.4_GLNX86.mat +0 -0
  452. scipy/io/matlab/tests/data/testhdf5_7.4_GLNX86.mat +0 -0
  453. scipy/io/matlab/tests/data/testmatrix_4.2c_SOL2.mat +0 -0
  454. scipy/io/matlab/tests/data/testmatrix_6.1_SOL2.mat +0 -0
  455. scipy/io/matlab/tests/data/testmatrix_6.5.1_GLNX86.mat +0 -0
  456. scipy/io/matlab/tests/data/testmatrix_7.1_GLNX86.mat +0 -0
  457. scipy/io/matlab/tests/data/testmatrix_7.4_GLNX86.mat +0 -0
  458. scipy/io/matlab/tests/data/testminus_4.2c_SOL2.mat +0 -0
  459. scipy/io/matlab/tests/data/testminus_6.1_SOL2.mat +0 -0
  460. scipy/io/matlab/tests/data/testminus_6.5.1_GLNX86.mat +0 -0
  461. scipy/io/matlab/tests/data/testminus_7.1_GLNX86.mat +0 -0
  462. scipy/io/matlab/tests/data/testminus_7.4_GLNX86.mat +0 -0
  463. scipy/io/matlab/tests/data/testmulti_4.2c_SOL2.mat +0 -0
  464. scipy/io/matlab/tests/data/testmulti_7.1_GLNX86.mat +0 -0
  465. scipy/io/matlab/tests/data/testmulti_7.4_GLNX86.mat +0 -0
  466. scipy/io/matlab/tests/data/testobject_6.1_SOL2.mat +0 -0
  467. scipy/io/matlab/tests/data/testobject_6.5.1_GLNX86.mat +0 -0
  468. scipy/io/matlab/tests/data/testobject_7.1_GLNX86.mat +0 -0
  469. scipy/io/matlab/tests/data/testobject_7.4_GLNX86.mat +0 -0
  470. scipy/io/matlab/tests/data/testonechar_4.2c_SOL2.mat +0 -0
  471. scipy/io/matlab/tests/data/testonechar_6.1_SOL2.mat +0 -0
  472. scipy/io/matlab/tests/data/testonechar_6.5.1_GLNX86.mat +0 -0
  473. scipy/io/matlab/tests/data/testonechar_7.1_GLNX86.mat +0 -0
  474. scipy/io/matlab/tests/data/testonechar_7.4_GLNX86.mat +0 -0
  475. scipy/io/matlab/tests/data/testscalarcell_7.4_GLNX86.mat +0 -0
  476. scipy/io/matlab/tests/data/testsimplecell.mat +0 -0
  477. scipy/io/matlab/tests/data/testsparse_4.2c_SOL2.mat +0 -0
  478. scipy/io/matlab/tests/data/testsparse_6.1_SOL2.mat +0 -0
  479. scipy/io/matlab/tests/data/testsparse_6.5.1_GLNX86.mat +0 -0
  480. scipy/io/matlab/tests/data/testsparse_7.1_GLNX86.mat +0 -0
  481. scipy/io/matlab/tests/data/testsparse_7.4_GLNX86.mat +0 -0
  482. scipy/io/matlab/tests/data/testsparsecomplex_4.2c_SOL2.mat +0 -0
  483. scipy/io/matlab/tests/data/testsparsecomplex_6.1_SOL2.mat +0 -0
  484. scipy/io/matlab/tests/data/testsparsecomplex_6.5.1_GLNX86.mat +0 -0
  485. scipy/io/matlab/tests/data/testsparsecomplex_7.1_GLNX86.mat +0 -0
  486. scipy/io/matlab/tests/data/testsparsecomplex_7.4_GLNX86.mat +0 -0
  487. scipy/io/matlab/tests/data/testsparsefloat_7.4_GLNX86.mat +0 -0
  488. scipy/io/matlab/tests/data/teststring_4.2c_SOL2.mat +0 -0
  489. scipy/io/matlab/tests/data/teststring_6.1_SOL2.mat +0 -0
  490. scipy/io/matlab/tests/data/teststring_6.5.1_GLNX86.mat +0 -0
  491. scipy/io/matlab/tests/data/teststring_7.1_GLNX86.mat +0 -0
  492. scipy/io/matlab/tests/data/teststring_7.4_GLNX86.mat +0 -0
  493. scipy/io/matlab/tests/data/teststringarray_4.2c_SOL2.mat +0 -0
  494. scipy/io/matlab/tests/data/teststringarray_6.1_SOL2.mat +0 -0
  495. scipy/io/matlab/tests/data/teststringarray_6.5.1_GLNX86.mat +0 -0
  496. scipy/io/matlab/tests/data/teststringarray_7.1_GLNX86.mat +0 -0
  497. scipy/io/matlab/tests/data/teststringarray_7.4_GLNX86.mat +0 -0
  498. scipy/io/matlab/tests/data/teststruct_6.1_SOL2.mat +0 -0
  499. scipy/io/matlab/tests/data/teststruct_6.5.1_GLNX86.mat +0 -0
  500. scipy/io/matlab/tests/data/teststruct_7.1_GLNX86.mat +0 -0
  501. scipy/io/matlab/tests/data/teststruct_7.4_GLNX86.mat +0 -0
  502. scipy/io/matlab/tests/data/teststructarr_6.1_SOL2.mat +0 -0
  503. scipy/io/matlab/tests/data/teststructarr_6.5.1_GLNX86.mat +0 -0
  504. scipy/io/matlab/tests/data/teststructarr_7.1_GLNX86.mat +0 -0
  505. scipy/io/matlab/tests/data/teststructarr_7.4_GLNX86.mat +0 -0
  506. scipy/io/matlab/tests/data/teststructnest_6.1_SOL2.mat +0 -0
  507. scipy/io/matlab/tests/data/teststructnest_6.5.1_GLNX86.mat +0 -0
  508. scipy/io/matlab/tests/data/teststructnest_7.1_GLNX86.mat +0 -0
  509. scipy/io/matlab/tests/data/teststructnest_7.4_GLNX86.mat +0 -0
  510. scipy/io/matlab/tests/data/testunicode_7.1_GLNX86.mat +0 -0
  511. scipy/io/matlab/tests/data/testunicode_7.4_GLNX86.mat +0 -0
  512. scipy/io/matlab/tests/data/testvec_4_GLNX86.mat +0 -0
  513. scipy/io/matlab/tests/test_byteordercodes.py +29 -0
  514. scipy/io/matlab/tests/test_mio.py +1399 -0
  515. scipy/io/matlab/tests/test_mio5_utils.py +179 -0
  516. scipy/io/matlab/tests/test_mio_funcs.py +51 -0
  517. scipy/io/matlab/tests/test_mio_utils.py +45 -0
  518. scipy/io/matlab/tests/test_miobase.py +32 -0
  519. scipy/io/matlab/tests/test_pathological.py +33 -0
  520. scipy/io/matlab/tests/test_streams.py +241 -0
  521. scipy/io/mmio.py +17 -0
  522. scipy/io/netcdf.py +17 -0
  523. scipy/io/tests/__init__.py +0 -0
  524. scipy/io/tests/data/Transparent Busy.ani +0 -0
  525. scipy/io/tests/data/array_float32_1d.sav +0 -0
  526. scipy/io/tests/data/array_float32_2d.sav +0 -0
  527. scipy/io/tests/data/array_float32_3d.sav +0 -0
  528. scipy/io/tests/data/array_float32_4d.sav +0 -0
  529. scipy/io/tests/data/array_float32_5d.sav +0 -0
  530. scipy/io/tests/data/array_float32_6d.sav +0 -0
  531. scipy/io/tests/data/array_float32_7d.sav +0 -0
  532. scipy/io/tests/data/array_float32_8d.sav +0 -0
  533. scipy/io/tests/data/array_float32_pointer_1d.sav +0 -0
  534. scipy/io/tests/data/array_float32_pointer_2d.sav +0 -0
  535. scipy/io/tests/data/array_float32_pointer_3d.sav +0 -0
  536. scipy/io/tests/data/array_float32_pointer_4d.sav +0 -0
  537. scipy/io/tests/data/array_float32_pointer_5d.sav +0 -0
  538. scipy/io/tests/data/array_float32_pointer_6d.sav +0 -0
  539. scipy/io/tests/data/array_float32_pointer_7d.sav +0 -0
  540. scipy/io/tests/data/array_float32_pointer_8d.sav +0 -0
  541. scipy/io/tests/data/example_1.nc +0 -0
  542. scipy/io/tests/data/example_2.nc +0 -0
  543. scipy/io/tests/data/example_3_maskedvals.nc +0 -0
  544. scipy/io/tests/data/fortran-3x3d-2i.dat +0 -0
  545. scipy/io/tests/data/fortran-mixed.dat +0 -0
  546. scipy/io/tests/data/fortran-sf8-11x1x10.dat +0 -0
  547. scipy/io/tests/data/fortran-sf8-15x10x22.dat +0 -0
  548. scipy/io/tests/data/fortran-sf8-1x1x1.dat +0 -0
  549. scipy/io/tests/data/fortran-sf8-1x1x5.dat +0 -0
  550. scipy/io/tests/data/fortran-sf8-1x1x7.dat +0 -0
  551. scipy/io/tests/data/fortran-sf8-1x3x5.dat +0 -0
  552. scipy/io/tests/data/fortran-si4-11x1x10.dat +0 -0
  553. scipy/io/tests/data/fortran-si4-15x10x22.dat +0 -0
  554. scipy/io/tests/data/fortran-si4-1x1x1.dat +0 -0
  555. scipy/io/tests/data/fortran-si4-1x1x5.dat +0 -0
  556. scipy/io/tests/data/fortran-si4-1x1x7.dat +0 -0
  557. scipy/io/tests/data/fortran-si4-1x3x5.dat +0 -0
  558. scipy/io/tests/data/invalid_pointer.sav +0 -0
  559. scipy/io/tests/data/null_pointer.sav +0 -0
  560. scipy/io/tests/data/scalar_byte.sav +0 -0
  561. scipy/io/tests/data/scalar_byte_descr.sav +0 -0
  562. scipy/io/tests/data/scalar_complex32.sav +0 -0
  563. scipy/io/tests/data/scalar_complex64.sav +0 -0
  564. scipy/io/tests/data/scalar_float32.sav +0 -0
  565. scipy/io/tests/data/scalar_float64.sav +0 -0
  566. scipy/io/tests/data/scalar_heap_pointer.sav +0 -0
  567. scipy/io/tests/data/scalar_int16.sav +0 -0
  568. scipy/io/tests/data/scalar_int32.sav +0 -0
  569. scipy/io/tests/data/scalar_int64.sav +0 -0
  570. scipy/io/tests/data/scalar_string.sav +0 -0
  571. scipy/io/tests/data/scalar_uint16.sav +0 -0
  572. scipy/io/tests/data/scalar_uint32.sav +0 -0
  573. scipy/io/tests/data/scalar_uint64.sav +0 -0
  574. scipy/io/tests/data/struct_arrays.sav +0 -0
  575. scipy/io/tests/data/struct_arrays_byte_idl80.sav +0 -0
  576. scipy/io/tests/data/struct_arrays_replicated.sav +0 -0
  577. scipy/io/tests/data/struct_arrays_replicated_3d.sav +0 -0
  578. scipy/io/tests/data/struct_inherit.sav +0 -0
  579. scipy/io/tests/data/struct_pointer_arrays.sav +0 -0
  580. scipy/io/tests/data/struct_pointer_arrays_replicated.sav +0 -0
  581. scipy/io/tests/data/struct_pointer_arrays_replicated_3d.sav +0 -0
  582. scipy/io/tests/data/struct_pointers.sav +0 -0
  583. scipy/io/tests/data/struct_pointers_replicated.sav +0 -0
  584. scipy/io/tests/data/struct_pointers_replicated_3d.sav +0 -0
  585. scipy/io/tests/data/struct_scalars.sav +0 -0
  586. scipy/io/tests/data/struct_scalars_replicated.sav +0 -0
  587. scipy/io/tests/data/struct_scalars_replicated_3d.sav +0 -0
  588. scipy/io/tests/data/test-1234Hz-le-1ch-10S-20bit-extra.wav +0 -0
  589. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-be.wav +0 -0
  590. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-le.wav +0 -0
  591. scipy/io/tests/data/test-44100Hz-be-1ch-4bytes.wav +0 -0
  592. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof-no-data.wav +0 -0
  593. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof.wav +0 -0
  594. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-incomplete-chunk.wav +0 -0
  595. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-rf64.wav +0 -0
  596. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes.wav +0 -0
  597. scipy/io/tests/data/test-48000Hz-2ch-64bit-float-le-wavex.wav +0 -0
  598. scipy/io/tests/data/test-8000Hz-be-3ch-5S-24bit.wav +0 -0
  599. scipy/io/tests/data/test-8000Hz-le-1ch-1byte-ulaw.wav +0 -0
  600. scipy/io/tests/data/test-8000Hz-le-2ch-1byteu.wav +0 -0
  601. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-inconsistent.wav +0 -0
  602. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-rf64.wav +0 -0
  603. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit.wav +0 -0
  604. scipy/io/tests/data/test-8000Hz-le-3ch-5S-36bit.wav +0 -0
  605. scipy/io/tests/data/test-8000Hz-le-3ch-5S-45bit.wav +0 -0
  606. scipy/io/tests/data/test-8000Hz-le-3ch-5S-53bit.wav +0 -0
  607. scipy/io/tests/data/test-8000Hz-le-3ch-5S-64bit.wav +0 -0
  608. scipy/io/tests/data/test-8000Hz-le-4ch-9S-12bit.wav +0 -0
  609. scipy/io/tests/data/test-8000Hz-le-5ch-9S-5bit.wav +0 -0
  610. scipy/io/tests/data/various_compressed.sav +0 -0
  611. scipy/io/tests/test_fortran.py +264 -0
  612. scipy/io/tests/test_idl.py +483 -0
  613. scipy/io/tests/test_mmio.py +831 -0
  614. scipy/io/tests/test_netcdf.py +550 -0
  615. scipy/io/tests/test_paths.py +93 -0
  616. scipy/io/tests/test_wavfile.py +501 -0
  617. scipy/io/wavfile.py +938 -0
  618. scipy/linalg/__init__.pxd +1 -0
  619. scipy/linalg/__init__.py +236 -0
  620. scipy/linalg/_basic.py +2146 -0
  621. scipy/linalg/_blas_subroutines.h +164 -0
  622. scipy/linalg/_cythonized_array_utils.cp312-win_arm64.lib +0 -0
  623. scipy/linalg/_cythonized_array_utils.cp312-win_arm64.pyd +0 -0
  624. scipy/linalg/_cythonized_array_utils.pxd +40 -0
  625. scipy/linalg/_cythonized_array_utils.pyi +16 -0
  626. scipy/linalg/_decomp.py +1645 -0
  627. scipy/linalg/_decomp_cholesky.py +413 -0
  628. scipy/linalg/_decomp_cossin.py +236 -0
  629. scipy/linalg/_decomp_interpolative.cp312-win_arm64.lib +0 -0
  630. scipy/linalg/_decomp_interpolative.cp312-win_arm64.pyd +0 -0
  631. scipy/linalg/_decomp_ldl.py +356 -0
  632. scipy/linalg/_decomp_lu.py +401 -0
  633. scipy/linalg/_decomp_lu_cython.cp312-win_arm64.lib +0 -0
  634. scipy/linalg/_decomp_lu_cython.cp312-win_arm64.pyd +0 -0
  635. scipy/linalg/_decomp_lu_cython.pyi +6 -0
  636. scipy/linalg/_decomp_polar.py +113 -0
  637. scipy/linalg/_decomp_qr.py +494 -0
  638. scipy/linalg/_decomp_qz.py +452 -0
  639. scipy/linalg/_decomp_schur.py +336 -0
  640. scipy/linalg/_decomp_svd.py +545 -0
  641. scipy/linalg/_decomp_update.cp312-win_arm64.lib +0 -0
  642. scipy/linalg/_decomp_update.cp312-win_arm64.pyd +0 -0
  643. scipy/linalg/_expm_frechet.py +417 -0
  644. scipy/linalg/_fblas.cp312-win_arm64.lib +0 -0
  645. scipy/linalg/_fblas.cp312-win_arm64.pyd +0 -0
  646. scipy/linalg/_flapack.cp312-win_arm64.lib +0 -0
  647. scipy/linalg/_flapack.cp312-win_arm64.pyd +0 -0
  648. scipy/linalg/_lapack_subroutines.h +1521 -0
  649. scipy/linalg/_linalg_pythran.cp312-win_arm64.lib +0 -0
  650. scipy/linalg/_linalg_pythran.cp312-win_arm64.pyd +0 -0
  651. scipy/linalg/_matfuncs.py +1050 -0
  652. scipy/linalg/_matfuncs_expm.cp312-win_arm64.lib +0 -0
  653. scipy/linalg/_matfuncs_expm.cp312-win_arm64.pyd +0 -0
  654. scipy/linalg/_matfuncs_expm.pyi +6 -0
  655. scipy/linalg/_matfuncs_inv_ssq.py +886 -0
  656. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_arm64.lib +0 -0
  657. scipy/linalg/_matfuncs_schur_sqrtm.cp312-win_arm64.pyd +0 -0
  658. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  659. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_arm64.lib +0 -0
  660. scipy/linalg/_matfuncs_sqrtm_triu.cp312-win_arm64.pyd +0 -0
  661. scipy/linalg/_misc.py +191 -0
  662. scipy/linalg/_procrustes.py +113 -0
  663. scipy/linalg/_sketches.py +189 -0
  664. scipy/linalg/_solve_toeplitz.cp312-win_arm64.lib +0 -0
  665. scipy/linalg/_solve_toeplitz.cp312-win_arm64.pyd +0 -0
  666. scipy/linalg/_solvers.py +862 -0
  667. scipy/linalg/_special_matrices.py +1322 -0
  668. scipy/linalg/_testutils.py +65 -0
  669. scipy/linalg/basic.py +23 -0
  670. scipy/linalg/blas.py +495 -0
  671. scipy/linalg/cython_blas.cp312-win_arm64.lib +0 -0
  672. scipy/linalg/cython_blas.cp312-win_arm64.pyd +0 -0
  673. scipy/linalg/cython_blas.pxd +169 -0
  674. scipy/linalg/cython_blas.pyx +1432 -0
  675. scipy/linalg/cython_lapack.cp312-win_arm64.lib +0 -0
  676. scipy/linalg/cython_lapack.cp312-win_arm64.pyd +0 -0
  677. scipy/linalg/cython_lapack.pxd +1528 -0
  678. scipy/linalg/cython_lapack.pyx +12045 -0
  679. scipy/linalg/decomp.py +23 -0
  680. scipy/linalg/decomp_cholesky.py +21 -0
  681. scipy/linalg/decomp_lu.py +21 -0
  682. scipy/linalg/decomp_qr.py +20 -0
  683. scipy/linalg/decomp_schur.py +21 -0
  684. scipy/linalg/decomp_svd.py +21 -0
  685. scipy/linalg/interpolative.py +989 -0
  686. scipy/linalg/lapack.py +1081 -0
  687. scipy/linalg/matfuncs.py +23 -0
  688. scipy/linalg/misc.py +21 -0
  689. scipy/linalg/special_matrices.py +22 -0
  690. scipy/linalg/tests/__init__.py +0 -0
  691. scipy/linalg/tests/_cython_examples/extending.pyx +23 -0
  692. scipy/linalg/tests/_cython_examples/meson.build +34 -0
  693. scipy/linalg/tests/data/carex_15_data.npz +0 -0
  694. scipy/linalg/tests/data/carex_18_data.npz +0 -0
  695. scipy/linalg/tests/data/carex_19_data.npz +0 -0
  696. scipy/linalg/tests/data/carex_20_data.npz +0 -0
  697. scipy/linalg/tests/data/carex_6_data.npz +0 -0
  698. scipy/linalg/tests/data/gendare_20170120_data.npz +0 -0
  699. scipy/linalg/tests/test_basic.py +2074 -0
  700. scipy/linalg/tests/test_batch.py +588 -0
  701. scipy/linalg/tests/test_blas.py +1127 -0
  702. scipy/linalg/tests/test_cython_blas.py +118 -0
  703. scipy/linalg/tests/test_cython_lapack.py +22 -0
  704. scipy/linalg/tests/test_cythonized_array_utils.py +130 -0
  705. scipy/linalg/tests/test_decomp.py +3189 -0
  706. scipy/linalg/tests/test_decomp_cholesky.py +268 -0
  707. scipy/linalg/tests/test_decomp_cossin.py +314 -0
  708. scipy/linalg/tests/test_decomp_ldl.py +137 -0
  709. scipy/linalg/tests/test_decomp_lu.py +308 -0
  710. scipy/linalg/tests/test_decomp_polar.py +110 -0
  711. scipy/linalg/tests/test_decomp_update.py +1701 -0
  712. scipy/linalg/tests/test_extending.py +46 -0
  713. scipy/linalg/tests/test_fblas.py +607 -0
  714. scipy/linalg/tests/test_interpolative.py +232 -0
  715. scipy/linalg/tests/test_lapack.py +3620 -0
  716. scipy/linalg/tests/test_matfuncs.py +1125 -0
  717. scipy/linalg/tests/test_matmul_toeplitz.py +136 -0
  718. scipy/linalg/tests/test_procrustes.py +214 -0
  719. scipy/linalg/tests/test_sketches.py +118 -0
  720. scipy/linalg/tests/test_solve_toeplitz.py +150 -0
  721. scipy/linalg/tests/test_solvers.py +844 -0
  722. scipy/linalg/tests/test_special_matrices.py +636 -0
  723. scipy/misc/__init__.py +6 -0
  724. scipy/misc/common.py +6 -0
  725. scipy/misc/doccer.py +6 -0
  726. scipy/ndimage/__init__.py +174 -0
  727. scipy/ndimage/_ctest.cp312-win_arm64.lib +0 -0
  728. scipy/ndimage/_ctest.cp312-win_arm64.pyd +0 -0
  729. scipy/ndimage/_cytest.cp312-win_arm64.lib +0 -0
  730. scipy/ndimage/_cytest.cp312-win_arm64.pyd +0 -0
  731. scipy/ndimage/_delegators.py +303 -0
  732. scipy/ndimage/_filters.py +2422 -0
  733. scipy/ndimage/_fourier.py +306 -0
  734. scipy/ndimage/_interpolation.py +1033 -0
  735. scipy/ndimage/_measurements.py +1689 -0
  736. scipy/ndimage/_morphology.py +2634 -0
  737. scipy/ndimage/_nd_image.cp312-win_arm64.lib +0 -0
  738. scipy/ndimage/_nd_image.cp312-win_arm64.pyd +0 -0
  739. scipy/ndimage/_ndimage_api.py +16 -0
  740. scipy/ndimage/_ni_docstrings.py +214 -0
  741. scipy/ndimage/_ni_label.cp312-win_arm64.lib +0 -0
  742. scipy/ndimage/_ni_label.cp312-win_arm64.pyd +0 -0
  743. scipy/ndimage/_ni_support.py +139 -0
  744. scipy/ndimage/_rank_filter_1d.cp312-win_arm64.lib +0 -0
  745. scipy/ndimage/_rank_filter_1d.cp312-win_arm64.pyd +0 -0
  746. scipy/ndimage/_support_alternative_backends.py +84 -0
  747. scipy/ndimage/filters.py +27 -0
  748. scipy/ndimage/fourier.py +21 -0
  749. scipy/ndimage/interpolation.py +22 -0
  750. scipy/ndimage/measurements.py +24 -0
  751. scipy/ndimage/morphology.py +27 -0
  752. scipy/ndimage/tests/__init__.py +12 -0
  753. scipy/ndimage/tests/data/label_inputs.txt +21 -0
  754. scipy/ndimage/tests/data/label_results.txt +294 -0
  755. scipy/ndimage/tests/data/label_strels.txt +42 -0
  756. scipy/ndimage/tests/dots.png +0 -0
  757. scipy/ndimage/tests/test_c_api.py +102 -0
  758. scipy/ndimage/tests/test_datatypes.py +67 -0
  759. scipy/ndimage/tests/test_filters.py +3083 -0
  760. scipy/ndimage/tests/test_fourier.py +187 -0
  761. scipy/ndimage/tests/test_interpolation.py +1491 -0
  762. scipy/ndimage/tests/test_measurements.py +1592 -0
  763. scipy/ndimage/tests/test_morphology.py +2950 -0
  764. scipy/ndimage/tests/test_ni_support.py +78 -0
  765. scipy/ndimage/tests/test_splines.py +70 -0
  766. scipy/odr/__init__.py +131 -0
  767. scipy/odr/__odrpack.cp312-win_arm64.lib +0 -0
  768. scipy/odr/__odrpack.cp312-win_arm64.pyd +0 -0
  769. scipy/odr/_add_newdocs.py +34 -0
  770. scipy/odr/_models.py +315 -0
  771. scipy/odr/_odrpack.py +1154 -0
  772. scipy/odr/models.py +20 -0
  773. scipy/odr/odrpack.py +21 -0
  774. scipy/odr/tests/__init__.py +0 -0
  775. scipy/odr/tests/test_odr.py +607 -0
  776. scipy/optimize/__init__.pxd +1 -0
  777. scipy/optimize/__init__.py +460 -0
  778. scipy/optimize/_basinhopping.py +741 -0
  779. scipy/optimize/_bglu_dense.cp312-win_arm64.lib +0 -0
  780. scipy/optimize/_bglu_dense.cp312-win_arm64.pyd +0 -0
  781. scipy/optimize/_bracket.py +706 -0
  782. scipy/optimize/_chandrupatla.py +551 -0
  783. scipy/optimize/_cobyla_py.py +297 -0
  784. scipy/optimize/_cobyqa_py.py +72 -0
  785. scipy/optimize/_constraints.py +598 -0
  786. scipy/optimize/_dcsrch.py +728 -0
  787. scipy/optimize/_differentiable_functions.py +835 -0
  788. scipy/optimize/_differentialevolution.py +1970 -0
  789. scipy/optimize/_direct.cp312-win_arm64.lib +0 -0
  790. scipy/optimize/_direct.cp312-win_arm64.pyd +0 -0
  791. scipy/optimize/_direct_py.py +280 -0
  792. scipy/optimize/_dual_annealing.py +732 -0
  793. scipy/optimize/_elementwise.py +798 -0
  794. scipy/optimize/_group_columns.cp312-win_arm64.lib +0 -0
  795. scipy/optimize/_group_columns.cp312-win_arm64.pyd +0 -0
  796. scipy/optimize/_hessian_update_strategy.py +479 -0
  797. scipy/optimize/_highspy/__init__.py +0 -0
  798. scipy/optimize/_highspy/_core.cp312-win_arm64.lib +0 -0
  799. scipy/optimize/_highspy/_core.cp312-win_arm64.pyd +0 -0
  800. scipy/optimize/_highspy/_highs_options.cp312-win_arm64.lib +0 -0
  801. scipy/optimize/_highspy/_highs_options.cp312-win_arm64.pyd +0 -0
  802. scipy/optimize/_highspy/_highs_wrapper.py +338 -0
  803. scipy/optimize/_isotonic.py +157 -0
  804. scipy/optimize/_lbfgsb.cp312-win_arm64.lib +0 -0
  805. scipy/optimize/_lbfgsb.cp312-win_arm64.pyd +0 -0
  806. scipy/optimize/_lbfgsb_py.py +634 -0
  807. scipy/optimize/_linesearch.py +896 -0
  808. scipy/optimize/_linprog.py +733 -0
  809. scipy/optimize/_linprog_doc.py +1434 -0
  810. scipy/optimize/_linprog_highs.py +422 -0
  811. scipy/optimize/_linprog_ip.py +1141 -0
  812. scipy/optimize/_linprog_rs.py +572 -0
  813. scipy/optimize/_linprog_simplex.py +663 -0
  814. scipy/optimize/_linprog_util.py +1521 -0
  815. scipy/optimize/_lsap.cp312-win_arm64.lib +0 -0
  816. scipy/optimize/_lsap.cp312-win_arm64.pyd +0 -0
  817. scipy/optimize/_lsq/__init__.py +5 -0
  818. scipy/optimize/_lsq/bvls.py +183 -0
  819. scipy/optimize/_lsq/common.py +731 -0
  820. scipy/optimize/_lsq/dogbox.py +345 -0
  821. scipy/optimize/_lsq/givens_elimination.cp312-win_arm64.lib +0 -0
  822. scipy/optimize/_lsq/givens_elimination.cp312-win_arm64.pyd +0 -0
  823. scipy/optimize/_lsq/least_squares.py +1044 -0
  824. scipy/optimize/_lsq/lsq_linear.py +361 -0
  825. scipy/optimize/_lsq/trf.py +587 -0
  826. scipy/optimize/_lsq/trf_linear.py +249 -0
  827. scipy/optimize/_milp.py +394 -0
  828. scipy/optimize/_minimize.py +1199 -0
  829. scipy/optimize/_minpack.cp312-win_arm64.lib +0 -0
  830. scipy/optimize/_minpack.cp312-win_arm64.pyd +0 -0
  831. scipy/optimize/_minpack_py.py +1178 -0
  832. scipy/optimize/_moduleTNC.cp312-win_arm64.lib +0 -0
  833. scipy/optimize/_moduleTNC.cp312-win_arm64.pyd +0 -0
  834. scipy/optimize/_nnls.py +96 -0
  835. scipy/optimize/_nonlin.py +1634 -0
  836. scipy/optimize/_numdiff.py +963 -0
  837. scipy/optimize/_optimize.py +4169 -0
  838. scipy/optimize/_pava_pybind.cp312-win_arm64.lib +0 -0
  839. scipy/optimize/_pava_pybind.cp312-win_arm64.pyd +0 -0
  840. scipy/optimize/_qap.py +760 -0
  841. scipy/optimize/_remove_redundancy.py +522 -0
  842. scipy/optimize/_root.py +732 -0
  843. scipy/optimize/_root_scalar.py +538 -0
  844. scipy/optimize/_shgo.py +1606 -0
  845. scipy/optimize/_shgo_lib/__init__.py +0 -0
  846. scipy/optimize/_shgo_lib/_complex.py +1225 -0
  847. scipy/optimize/_shgo_lib/_vertex.py +460 -0
  848. scipy/optimize/_slsqp_py.py +603 -0
  849. scipy/optimize/_slsqplib.cp312-win_arm64.lib +0 -0
  850. scipy/optimize/_slsqplib.cp312-win_arm64.pyd +0 -0
  851. scipy/optimize/_spectral.py +260 -0
  852. scipy/optimize/_tnc.py +438 -0
  853. scipy/optimize/_trlib/__init__.py +12 -0
  854. scipy/optimize/_trlib/_trlib.cp312-win_arm64.lib +0 -0
  855. scipy/optimize/_trlib/_trlib.cp312-win_arm64.pyd +0 -0
  856. scipy/optimize/_trustregion.py +318 -0
  857. scipy/optimize/_trustregion_constr/__init__.py +6 -0
  858. scipy/optimize/_trustregion_constr/canonical_constraint.py +390 -0
  859. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +231 -0
  860. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +584 -0
  861. scipy/optimize/_trustregion_constr/projections.py +411 -0
  862. scipy/optimize/_trustregion_constr/qp_subproblem.py +637 -0
  863. scipy/optimize/_trustregion_constr/report.py +49 -0
  864. scipy/optimize/_trustregion_constr/tests/__init__.py +0 -0
  865. scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py +296 -0
  866. scipy/optimize/_trustregion_constr/tests/test_nested_minimize.py +39 -0
  867. scipy/optimize/_trustregion_constr/tests/test_projections.py +214 -0
  868. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +645 -0
  869. scipy/optimize/_trustregion_constr/tests/test_report.py +34 -0
  870. scipy/optimize/_trustregion_constr/tr_interior_point.py +361 -0
  871. scipy/optimize/_trustregion_dogleg.py +122 -0
  872. scipy/optimize/_trustregion_exact.py +437 -0
  873. scipy/optimize/_trustregion_krylov.py +65 -0
  874. scipy/optimize/_trustregion_ncg.py +126 -0
  875. scipy/optimize/_tstutils.py +972 -0
  876. scipy/optimize/_zeros.cp312-win_arm64.lib +0 -0
  877. scipy/optimize/_zeros.cp312-win_arm64.pyd +0 -0
  878. scipy/optimize/_zeros_py.py +1475 -0
  879. scipy/optimize/cobyla.py +19 -0
  880. scipy/optimize/cython_optimize/__init__.py +133 -0
  881. scipy/optimize/cython_optimize/_zeros.cp312-win_arm64.lib +0 -0
  882. scipy/optimize/cython_optimize/_zeros.cp312-win_arm64.pyd +0 -0
  883. scipy/optimize/cython_optimize/_zeros.pxd +33 -0
  884. scipy/optimize/cython_optimize/c_zeros.pxd +26 -0
  885. scipy/optimize/cython_optimize.pxd +11 -0
  886. scipy/optimize/elementwise.py +38 -0
  887. scipy/optimize/lbfgsb.py +23 -0
  888. scipy/optimize/linesearch.py +18 -0
  889. scipy/optimize/minpack.py +27 -0
  890. scipy/optimize/minpack2.py +17 -0
  891. scipy/optimize/moduleTNC.py +19 -0
  892. scipy/optimize/nonlin.py +29 -0
  893. scipy/optimize/optimize.py +40 -0
  894. scipy/optimize/slsqp.py +22 -0
  895. scipy/optimize/tests/__init__.py +0 -0
  896. scipy/optimize/tests/_cython_examples/extending.pyx +43 -0
  897. scipy/optimize/tests/_cython_examples/meson.build +32 -0
  898. scipy/optimize/tests/test__basinhopping.py +535 -0
  899. scipy/optimize/tests/test__differential_evolution.py +1703 -0
  900. scipy/optimize/tests/test__dual_annealing.py +416 -0
  901. scipy/optimize/tests/test__linprog_clean_inputs.py +312 -0
  902. scipy/optimize/tests/test__numdiff.py +885 -0
  903. scipy/optimize/tests/test__remove_redundancy.py +228 -0
  904. scipy/optimize/tests/test__root.py +124 -0
  905. scipy/optimize/tests/test__shgo.py +1164 -0
  906. scipy/optimize/tests/test__spectral.py +226 -0
  907. scipy/optimize/tests/test_bracket.py +896 -0
  908. scipy/optimize/tests/test_chandrupatla.py +982 -0
  909. scipy/optimize/tests/test_cobyla.py +195 -0
  910. scipy/optimize/tests/test_cobyqa.py +252 -0
  911. scipy/optimize/tests/test_constraint_conversion.py +286 -0
  912. scipy/optimize/tests/test_constraints.py +255 -0
  913. scipy/optimize/tests/test_cython_optimize.py +92 -0
  914. scipy/optimize/tests/test_differentiable_functions.py +1025 -0
  915. scipy/optimize/tests/test_direct.py +321 -0
  916. scipy/optimize/tests/test_extending.py +28 -0
  917. scipy/optimize/tests/test_hessian_update_strategy.py +300 -0
  918. scipy/optimize/tests/test_isotonic_regression.py +167 -0
  919. scipy/optimize/tests/test_lbfgsb_hessinv.py +65 -0
  920. scipy/optimize/tests/test_lbfgsb_setulb.py +122 -0
  921. scipy/optimize/tests/test_least_squares.py +986 -0
  922. scipy/optimize/tests/test_linear_assignment.py +116 -0
  923. scipy/optimize/tests/test_linesearch.py +328 -0
  924. scipy/optimize/tests/test_linprog.py +2577 -0
  925. scipy/optimize/tests/test_lsq_common.py +297 -0
  926. scipy/optimize/tests/test_lsq_linear.py +287 -0
  927. scipy/optimize/tests/test_milp.py +459 -0
  928. scipy/optimize/tests/test_minimize_constrained.py +845 -0
  929. scipy/optimize/tests/test_minpack.py +1194 -0
  930. scipy/optimize/tests/test_nnls.py +469 -0
  931. scipy/optimize/tests/test_nonlin.py +572 -0
  932. scipy/optimize/tests/test_optimize.py +3344 -0
  933. scipy/optimize/tests/test_quadratic_assignment.py +455 -0
  934. scipy/optimize/tests/test_regression.py +40 -0
  935. scipy/optimize/tests/test_slsqp.py +645 -0
  936. scipy/optimize/tests/test_tnc.py +345 -0
  937. scipy/optimize/tests/test_trustregion.py +110 -0
  938. scipy/optimize/tests/test_trustregion_exact.py +351 -0
  939. scipy/optimize/tests/test_trustregion_krylov.py +170 -0
  940. scipy/optimize/tests/test_zeros.py +998 -0
  941. scipy/optimize/tnc.py +22 -0
  942. scipy/optimize/zeros.py +26 -0
  943. scipy/signal/__init__.py +316 -0
  944. scipy/signal/_arraytools.py +264 -0
  945. scipy/signal/_czt.py +575 -0
  946. scipy/signal/_delegators.py +568 -0
  947. scipy/signal/_filter_design.py +5893 -0
  948. scipy/signal/_fir_filter_design.py +1458 -0
  949. scipy/signal/_lti_conversion.py +534 -0
  950. scipy/signal/_ltisys.py +3546 -0
  951. scipy/signal/_max_len_seq.py +139 -0
  952. scipy/signal/_max_len_seq_inner.cp312-win_arm64.lib +0 -0
  953. scipy/signal/_max_len_seq_inner.cp312-win_arm64.pyd +0 -0
  954. scipy/signal/_peak_finding.py +1310 -0
  955. scipy/signal/_peak_finding_utils.cp312-win_arm64.lib +0 -0
  956. scipy/signal/_peak_finding_utils.cp312-win_arm64.pyd +0 -0
  957. scipy/signal/_polyutils.py +172 -0
  958. scipy/signal/_savitzky_golay.py +357 -0
  959. scipy/signal/_short_time_fft.py +2228 -0
  960. scipy/signal/_signal_api.py +30 -0
  961. scipy/signal/_signaltools.py +5309 -0
  962. scipy/signal/_sigtools.cp312-win_arm64.lib +0 -0
  963. scipy/signal/_sigtools.cp312-win_arm64.pyd +0 -0
  964. scipy/signal/_sosfilt.cp312-win_arm64.lib +0 -0
  965. scipy/signal/_sosfilt.cp312-win_arm64.pyd +0 -0
  966. scipy/signal/_spectral_py.py +2471 -0
  967. scipy/signal/_spline.cp312-win_arm64.lib +0 -0
  968. scipy/signal/_spline.cp312-win_arm64.pyd +0 -0
  969. scipy/signal/_spline.pyi +34 -0
  970. scipy/signal/_spline_filters.py +848 -0
  971. scipy/signal/_support_alternative_backends.py +73 -0
  972. scipy/signal/_upfirdn.py +219 -0
  973. scipy/signal/_upfirdn_apply.cp312-win_arm64.lib +0 -0
  974. scipy/signal/_upfirdn_apply.cp312-win_arm64.pyd +0 -0
  975. scipy/signal/_waveforms.py +687 -0
  976. scipy/signal/_wavelets.py +29 -0
  977. scipy/signal/bsplines.py +21 -0
  978. scipy/signal/filter_design.py +28 -0
  979. scipy/signal/fir_filter_design.py +21 -0
  980. scipy/signal/lti_conversion.py +20 -0
  981. scipy/signal/ltisys.py +25 -0
  982. scipy/signal/signaltools.py +27 -0
  983. scipy/signal/spectral.py +21 -0
  984. scipy/signal/spline.py +18 -0
  985. scipy/signal/tests/__init__.py +0 -0
  986. scipy/signal/tests/_scipy_spectral_test_shim.py +311 -0
  987. scipy/signal/tests/mpsig.py +122 -0
  988. scipy/signal/tests/test_array_tools.py +111 -0
  989. scipy/signal/tests/test_bsplines.py +365 -0
  990. scipy/signal/tests/test_cont2discrete.py +424 -0
  991. scipy/signal/tests/test_czt.py +221 -0
  992. scipy/signal/tests/test_dltisys.py +599 -0
  993. scipy/signal/tests/test_filter_design.py +4744 -0
  994. scipy/signal/tests/test_fir_filter_design.py +851 -0
  995. scipy/signal/tests/test_ltisys.py +1225 -0
  996. scipy/signal/tests/test_max_len_seq.py +71 -0
  997. scipy/signal/tests/test_peak_finding.py +915 -0
  998. scipy/signal/tests/test_result_type.py +51 -0
  999. scipy/signal/tests/test_savitzky_golay.py +363 -0
  1000. scipy/signal/tests/test_short_time_fft.py +1107 -0
  1001. scipy/signal/tests/test_signaltools.py +4735 -0
  1002. scipy/signal/tests/test_spectral.py +2141 -0
  1003. scipy/signal/tests/test_splines.py +427 -0
  1004. scipy/signal/tests/test_upfirdn.py +322 -0
  1005. scipy/signal/tests/test_waveforms.py +400 -0
  1006. scipy/signal/tests/test_wavelets.py +59 -0
  1007. scipy/signal/tests/test_windows.py +987 -0
  1008. scipy/signal/waveforms.py +20 -0
  1009. scipy/signal/wavelets.py +17 -0
  1010. scipy/signal/windows/__init__.py +52 -0
  1011. scipy/signal/windows/_windows.py +2513 -0
  1012. scipy/signal/windows/windows.py +23 -0
  1013. scipy/sparse/__init__.py +350 -0
  1014. scipy/sparse/_base.py +1613 -0
  1015. scipy/sparse/_bsr.py +880 -0
  1016. scipy/sparse/_compressed.py +1328 -0
  1017. scipy/sparse/_construct.py +1454 -0
  1018. scipy/sparse/_coo.py +1581 -0
  1019. scipy/sparse/_csc.py +367 -0
  1020. scipy/sparse/_csparsetools.cp312-win_arm64.lib +0 -0
  1021. scipy/sparse/_csparsetools.cp312-win_arm64.pyd +0 -0
  1022. scipy/sparse/_csr.py +558 -0
  1023. scipy/sparse/_data.py +569 -0
  1024. scipy/sparse/_dia.py +677 -0
  1025. scipy/sparse/_dok.py +669 -0
  1026. scipy/sparse/_extract.py +178 -0
  1027. scipy/sparse/_index.py +444 -0
  1028. scipy/sparse/_lil.py +632 -0
  1029. scipy/sparse/_matrix.py +169 -0
  1030. scipy/sparse/_matrix_io.py +167 -0
  1031. scipy/sparse/_sparsetools.cp312-win_arm64.lib +0 -0
  1032. scipy/sparse/_sparsetools.cp312-win_arm64.pyd +0 -0
  1033. scipy/sparse/_spfuncs.py +76 -0
  1034. scipy/sparse/_sputils.py +632 -0
  1035. scipy/sparse/base.py +24 -0
  1036. scipy/sparse/bsr.py +22 -0
  1037. scipy/sparse/compressed.py +20 -0
  1038. scipy/sparse/construct.py +38 -0
  1039. scipy/sparse/coo.py +23 -0
  1040. scipy/sparse/csc.py +22 -0
  1041. scipy/sparse/csgraph/__init__.py +210 -0
  1042. scipy/sparse/csgraph/_flow.cp312-win_arm64.lib +0 -0
  1043. scipy/sparse/csgraph/_flow.cp312-win_arm64.pyd +0 -0
  1044. scipy/sparse/csgraph/_laplacian.py +563 -0
  1045. scipy/sparse/csgraph/_matching.cp312-win_arm64.lib +0 -0
  1046. scipy/sparse/csgraph/_matching.cp312-win_arm64.pyd +0 -0
  1047. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_arm64.lib +0 -0
  1048. scipy/sparse/csgraph/_min_spanning_tree.cp312-win_arm64.pyd +0 -0
  1049. scipy/sparse/csgraph/_reordering.cp312-win_arm64.lib +0 -0
  1050. scipy/sparse/csgraph/_reordering.cp312-win_arm64.pyd +0 -0
  1051. scipy/sparse/csgraph/_shortest_path.cp312-win_arm64.lib +0 -0
  1052. scipy/sparse/csgraph/_shortest_path.cp312-win_arm64.pyd +0 -0
  1053. scipy/sparse/csgraph/_tools.cp312-win_arm64.lib +0 -0
  1054. scipy/sparse/csgraph/_tools.cp312-win_arm64.pyd +0 -0
  1055. scipy/sparse/csgraph/_traversal.cp312-win_arm64.lib +0 -0
  1056. scipy/sparse/csgraph/_traversal.cp312-win_arm64.pyd +0 -0
  1057. scipy/sparse/csgraph/_validation.py +66 -0
  1058. scipy/sparse/csgraph/tests/__init__.py +0 -0
  1059. scipy/sparse/csgraph/tests/test_connected_components.py +119 -0
  1060. scipy/sparse/csgraph/tests/test_conversions.py +61 -0
  1061. scipy/sparse/csgraph/tests/test_flow.py +209 -0
  1062. scipy/sparse/csgraph/tests/test_graph_laplacian.py +368 -0
  1063. scipy/sparse/csgraph/tests/test_matching.py +307 -0
  1064. scipy/sparse/csgraph/tests/test_pydata_sparse.py +197 -0
  1065. scipy/sparse/csgraph/tests/test_reordering.py +70 -0
  1066. scipy/sparse/csgraph/tests/test_shortest_path.py +540 -0
  1067. scipy/sparse/csgraph/tests/test_spanning_tree.py +66 -0
  1068. scipy/sparse/csgraph/tests/test_traversal.py +148 -0
  1069. scipy/sparse/csr.py +22 -0
  1070. scipy/sparse/data.py +18 -0
  1071. scipy/sparse/dia.py +22 -0
  1072. scipy/sparse/dok.py +22 -0
  1073. scipy/sparse/extract.py +23 -0
  1074. scipy/sparse/lil.py +22 -0
  1075. scipy/sparse/linalg/__init__.py +148 -0
  1076. scipy/sparse/linalg/_dsolve/__init__.py +71 -0
  1077. scipy/sparse/linalg/_dsolve/_add_newdocs.py +147 -0
  1078. scipy/sparse/linalg/_dsolve/_superlu.cp312-win_arm64.lib +0 -0
  1079. scipy/sparse/linalg/_dsolve/_superlu.cp312-win_arm64.pyd +0 -0
  1080. scipy/sparse/linalg/_dsolve/linsolve.py +882 -0
  1081. scipy/sparse/linalg/_dsolve/tests/__init__.py +0 -0
  1082. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +928 -0
  1083. scipy/sparse/linalg/_eigen/__init__.py +22 -0
  1084. scipy/sparse/linalg/_eigen/_svds.py +540 -0
  1085. scipy/sparse/linalg/_eigen/_svds_doc.py +382 -0
  1086. scipy/sparse/linalg/_eigen/arpack/COPYING +45 -0
  1087. scipy/sparse/linalg/_eigen/arpack/__init__.py +20 -0
  1088. scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-win_arm64.lib +0 -0
  1089. scipy/sparse/linalg/_eigen/arpack/_arpack.cp312-win_arm64.pyd +0 -0
  1090. scipy/sparse/linalg/_eigen/arpack/arpack.py +1706 -0
  1091. scipy/sparse/linalg/_eigen/arpack/tests/__init__.py +0 -0
  1092. scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py +717 -0
  1093. scipy/sparse/linalg/_eigen/lobpcg/__init__.py +16 -0
  1094. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +1110 -0
  1095. scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py +0 -0
  1096. scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py +725 -0
  1097. scipy/sparse/linalg/_eigen/tests/__init__.py +0 -0
  1098. scipy/sparse/linalg/_eigen/tests/test_svds.py +886 -0
  1099. scipy/sparse/linalg/_expm_multiply.py +816 -0
  1100. scipy/sparse/linalg/_interface.py +920 -0
  1101. scipy/sparse/linalg/_isolve/__init__.py +20 -0
  1102. scipy/sparse/linalg/_isolve/_gcrotmk.py +503 -0
  1103. scipy/sparse/linalg/_isolve/iterative.py +1051 -0
  1104. scipy/sparse/linalg/_isolve/lgmres.py +230 -0
  1105. scipy/sparse/linalg/_isolve/lsmr.py +486 -0
  1106. scipy/sparse/linalg/_isolve/lsqr.py +589 -0
  1107. scipy/sparse/linalg/_isolve/minres.py +372 -0
  1108. scipy/sparse/linalg/_isolve/tests/__init__.py +0 -0
  1109. scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py +183 -0
  1110. scipy/sparse/linalg/_isolve/tests/test_iterative.py +809 -0
  1111. scipy/sparse/linalg/_isolve/tests/test_lgmres.py +225 -0
  1112. scipy/sparse/linalg/_isolve/tests/test_lsmr.py +185 -0
  1113. scipy/sparse/linalg/_isolve/tests/test_lsqr.py +120 -0
  1114. scipy/sparse/linalg/_isolve/tests/test_minres.py +97 -0
  1115. scipy/sparse/linalg/_isolve/tests/test_utils.py +9 -0
  1116. scipy/sparse/linalg/_isolve/tfqmr.py +179 -0
  1117. scipy/sparse/linalg/_isolve/utils.py +121 -0
  1118. scipy/sparse/linalg/_matfuncs.py +940 -0
  1119. scipy/sparse/linalg/_norm.py +195 -0
  1120. scipy/sparse/linalg/_onenormest.py +467 -0
  1121. scipy/sparse/linalg/_propack/_cpropack.cp312-win_arm64.lib +0 -0
  1122. scipy/sparse/linalg/_propack/_cpropack.cp312-win_arm64.pyd +0 -0
  1123. scipy/sparse/linalg/_propack/_dpropack.cp312-win_arm64.lib +0 -0
  1124. scipy/sparse/linalg/_propack/_dpropack.cp312-win_arm64.pyd +0 -0
  1125. scipy/sparse/linalg/_propack/_spropack.cp312-win_arm64.lib +0 -0
  1126. scipy/sparse/linalg/_propack/_spropack.cp312-win_arm64.pyd +0 -0
  1127. scipy/sparse/linalg/_propack/_zpropack.cp312-win_arm64.lib +0 -0
  1128. scipy/sparse/linalg/_propack/_zpropack.cp312-win_arm64.pyd +0 -0
  1129. scipy/sparse/linalg/_special_sparse_arrays.py +949 -0
  1130. scipy/sparse/linalg/_svdp.py +309 -0
  1131. scipy/sparse/linalg/dsolve.py +22 -0
  1132. scipy/sparse/linalg/eigen.py +21 -0
  1133. scipy/sparse/linalg/interface.py +20 -0
  1134. scipy/sparse/linalg/isolve.py +22 -0
  1135. scipy/sparse/linalg/matfuncs.py +18 -0
  1136. scipy/sparse/linalg/tests/__init__.py +0 -0
  1137. scipy/sparse/linalg/tests/propack_test_data.npz +0 -0
  1138. scipy/sparse/linalg/tests/test_expm_multiply.py +367 -0
  1139. scipy/sparse/linalg/tests/test_interface.py +561 -0
  1140. scipy/sparse/linalg/tests/test_matfuncs.py +592 -0
  1141. scipy/sparse/linalg/tests/test_norm.py +154 -0
  1142. scipy/sparse/linalg/tests/test_onenormest.py +252 -0
  1143. scipy/sparse/linalg/tests/test_propack.py +165 -0
  1144. scipy/sparse/linalg/tests/test_pydata_sparse.py +272 -0
  1145. scipy/sparse/linalg/tests/test_special_sparse_arrays.py +337 -0
  1146. scipy/sparse/sparsetools.py +17 -0
  1147. scipy/sparse/spfuncs.py +17 -0
  1148. scipy/sparse/sputils.py +17 -0
  1149. scipy/sparse/tests/__init__.py +0 -0
  1150. scipy/sparse/tests/data/csc_py2.npz +0 -0
  1151. scipy/sparse/tests/data/csc_py3.npz +0 -0
  1152. scipy/sparse/tests/test_arithmetic1d.py +341 -0
  1153. scipy/sparse/tests/test_array_api.py +561 -0
  1154. scipy/sparse/tests/test_base.py +5870 -0
  1155. scipy/sparse/tests/test_common1d.py +447 -0
  1156. scipy/sparse/tests/test_construct.py +872 -0
  1157. scipy/sparse/tests/test_coo.py +1119 -0
  1158. scipy/sparse/tests/test_csc.py +98 -0
  1159. scipy/sparse/tests/test_csr.py +214 -0
  1160. scipy/sparse/tests/test_dok.py +209 -0
  1161. scipy/sparse/tests/test_extract.py +51 -0
  1162. scipy/sparse/tests/test_indexing1d.py +603 -0
  1163. scipy/sparse/tests/test_matrix_io.py +109 -0
  1164. scipy/sparse/tests/test_minmax1d.py +128 -0
  1165. scipy/sparse/tests/test_sparsetools.py +344 -0
  1166. scipy/sparse/tests/test_spfuncs.py +97 -0
  1167. scipy/sparse/tests/test_sputils.py +424 -0
  1168. scipy/spatial/__init__.py +129 -0
  1169. scipy/spatial/_ckdtree.cp312-win_arm64.lib +0 -0
  1170. scipy/spatial/_ckdtree.cp312-win_arm64.pyd +0 -0
  1171. scipy/spatial/_distance_pybind.cp312-win_arm64.lib +0 -0
  1172. scipy/spatial/_distance_pybind.cp312-win_arm64.pyd +0 -0
  1173. scipy/spatial/_distance_wrap.cp312-win_arm64.lib +0 -0
  1174. scipy/spatial/_distance_wrap.cp312-win_arm64.pyd +0 -0
  1175. scipy/spatial/_geometric_slerp.py +238 -0
  1176. scipy/spatial/_hausdorff.cp312-win_arm64.lib +0 -0
  1177. scipy/spatial/_hausdorff.cp312-win_arm64.pyd +0 -0
  1178. scipy/spatial/_kdtree.py +920 -0
  1179. scipy/spatial/_plotutils.py +274 -0
  1180. scipy/spatial/_procrustes.py +132 -0
  1181. scipy/spatial/_qhull.cp312-win_arm64.lib +0 -0
  1182. scipy/spatial/_qhull.cp312-win_arm64.pyd +0 -0
  1183. scipy/spatial/_qhull.pyi +213 -0
  1184. scipy/spatial/_spherical_voronoi.py +341 -0
  1185. scipy/spatial/_voronoi.cp312-win_arm64.lib +0 -0
  1186. scipy/spatial/_voronoi.cp312-win_arm64.pyd +0 -0
  1187. scipy/spatial/_voronoi.pyi +4 -0
  1188. scipy/spatial/ckdtree.py +18 -0
  1189. scipy/spatial/distance.py +3147 -0
  1190. scipy/spatial/distance.pyi +210 -0
  1191. scipy/spatial/kdtree.py +25 -0
  1192. scipy/spatial/qhull.py +25 -0
  1193. scipy/spatial/qhull_src/COPYING_QHULL.txt +39 -0
  1194. scipy/spatial/tests/__init__.py +0 -0
  1195. scipy/spatial/tests/data/cdist-X1.txt +10 -0
  1196. scipy/spatial/tests/data/cdist-X2.txt +20 -0
  1197. scipy/spatial/tests/data/degenerate_pointset.npz +0 -0
  1198. scipy/spatial/tests/data/iris.txt +150 -0
  1199. scipy/spatial/tests/data/pdist-boolean-inp.txt +20 -0
  1200. scipy/spatial/tests/data/pdist-chebyshev-ml-iris.txt +1 -0
  1201. scipy/spatial/tests/data/pdist-chebyshev-ml.txt +1 -0
  1202. scipy/spatial/tests/data/pdist-cityblock-ml-iris.txt +1 -0
  1203. scipy/spatial/tests/data/pdist-cityblock-ml.txt +1 -0
  1204. scipy/spatial/tests/data/pdist-correlation-ml-iris.txt +1 -0
  1205. scipy/spatial/tests/data/pdist-correlation-ml.txt +1 -0
  1206. scipy/spatial/tests/data/pdist-cosine-ml-iris.txt +1 -0
  1207. scipy/spatial/tests/data/pdist-cosine-ml.txt +1 -0
  1208. scipy/spatial/tests/data/pdist-double-inp.txt +20 -0
  1209. scipy/spatial/tests/data/pdist-euclidean-ml-iris.txt +1 -0
  1210. scipy/spatial/tests/data/pdist-euclidean-ml.txt +1 -0
  1211. scipy/spatial/tests/data/pdist-hamming-ml.txt +1 -0
  1212. scipy/spatial/tests/data/pdist-jaccard-ml.txt +1 -0
  1213. scipy/spatial/tests/data/pdist-jensenshannon-ml-iris.txt +1 -0
  1214. scipy/spatial/tests/data/pdist-jensenshannon-ml.txt +1 -0
  1215. scipy/spatial/tests/data/pdist-minkowski-3.2-ml-iris.txt +1 -0
  1216. scipy/spatial/tests/data/pdist-minkowski-3.2-ml.txt +1 -0
  1217. scipy/spatial/tests/data/pdist-minkowski-5.8-ml-iris.txt +1 -0
  1218. scipy/spatial/tests/data/pdist-seuclidean-ml-iris.txt +1 -0
  1219. scipy/spatial/tests/data/pdist-seuclidean-ml.txt +1 -0
  1220. scipy/spatial/tests/data/pdist-spearman-ml.txt +1 -0
  1221. scipy/spatial/tests/data/random-bool-data.txt +100 -0
  1222. scipy/spatial/tests/data/random-double-data.txt +100 -0
  1223. scipy/spatial/tests/data/random-int-data.txt +100 -0
  1224. scipy/spatial/tests/data/random-uint-data.txt +100 -0
  1225. scipy/spatial/tests/data/selfdual-4d-polytope.txt +27 -0
  1226. scipy/spatial/tests/test__plotutils.py +91 -0
  1227. scipy/spatial/tests/test__procrustes.py +116 -0
  1228. scipy/spatial/tests/test_distance.py +2389 -0
  1229. scipy/spatial/tests/test_hausdorff.py +199 -0
  1230. scipy/spatial/tests/test_kdtree.py +1536 -0
  1231. scipy/spatial/tests/test_qhull.py +1313 -0
  1232. scipy/spatial/tests/test_slerp.py +417 -0
  1233. scipy/spatial/tests/test_spherical_voronoi.py +358 -0
  1234. scipy/spatial/transform/__init__.py +31 -0
  1235. scipy/spatial/transform/_rigid_transform.cp312-win_arm64.lib +0 -0
  1236. scipy/spatial/transform/_rigid_transform.cp312-win_arm64.pyd +0 -0
  1237. scipy/spatial/transform/_rotation.cp312-win_arm64.lib +0 -0
  1238. scipy/spatial/transform/_rotation.cp312-win_arm64.pyd +0 -0
  1239. scipy/spatial/transform/_rotation_groups.py +140 -0
  1240. scipy/spatial/transform/_rotation_spline.py +460 -0
  1241. scipy/spatial/transform/rotation.py +21 -0
  1242. scipy/spatial/transform/tests/__init__.py +0 -0
  1243. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  1244. scipy/spatial/transform/tests/test_rotation.py +2569 -0
  1245. scipy/spatial/transform/tests/test_rotation_groups.py +169 -0
  1246. scipy/spatial/transform/tests/test_rotation_spline.py +183 -0
  1247. scipy/special/__init__.pxd +1 -0
  1248. scipy/special/__init__.py +841 -0
  1249. scipy/special/_add_newdocs.py +9961 -0
  1250. scipy/special/_basic.py +3576 -0
  1251. scipy/special/_comb.cp312-win_arm64.lib +0 -0
  1252. scipy/special/_comb.cp312-win_arm64.pyd +0 -0
  1253. scipy/special/_ellip_harm.py +214 -0
  1254. scipy/special/_ellip_harm_2.cp312-win_arm64.lib +0 -0
  1255. scipy/special/_ellip_harm_2.cp312-win_arm64.pyd +0 -0
  1256. scipy/special/_gufuncs.cp312-win_arm64.lib +0 -0
  1257. scipy/special/_gufuncs.cp312-win_arm64.pyd +0 -0
  1258. scipy/special/_input_validation.py +17 -0
  1259. scipy/special/_lambertw.py +149 -0
  1260. scipy/special/_logsumexp.py +426 -0
  1261. scipy/special/_mptestutils.py +453 -0
  1262. scipy/special/_multiufuncs.py +610 -0
  1263. scipy/special/_orthogonal.py +2592 -0
  1264. scipy/special/_orthogonal.pyi +330 -0
  1265. scipy/special/_precompute/__init__.py +0 -0
  1266. scipy/special/_precompute/cosine_cdf.py +17 -0
  1267. scipy/special/_precompute/expn_asy.py +54 -0
  1268. scipy/special/_precompute/gammainc_asy.py +116 -0
  1269. scipy/special/_precompute/gammainc_data.py +124 -0
  1270. scipy/special/_precompute/hyp2f1_data.py +484 -0
  1271. scipy/special/_precompute/lambertw.py +68 -0
  1272. scipy/special/_precompute/loggamma.py +43 -0
  1273. scipy/special/_precompute/struve_convergence.py +131 -0
  1274. scipy/special/_precompute/utils.py +38 -0
  1275. scipy/special/_precompute/wright_bessel.py +342 -0
  1276. scipy/special/_precompute/wright_bessel_data.py +152 -0
  1277. scipy/special/_precompute/wrightomega.py +41 -0
  1278. scipy/special/_precompute/zetac.py +27 -0
  1279. scipy/special/_sf_error.py +15 -0
  1280. scipy/special/_specfun.cp312-win_arm64.lib +0 -0
  1281. scipy/special/_specfun.cp312-win_arm64.pyd +0 -0
  1282. scipy/special/_special_ufuncs.cp312-win_arm64.lib +0 -0
  1283. scipy/special/_special_ufuncs.cp312-win_arm64.pyd +0 -0
  1284. scipy/special/_spfun_stats.py +106 -0
  1285. scipy/special/_spherical_bessel.py +397 -0
  1286. scipy/special/_support_alternative_backends.py +295 -0
  1287. scipy/special/_test_internal.cp312-win_arm64.lib +0 -0
  1288. scipy/special/_test_internal.cp312-win_arm64.pyd +0 -0
  1289. scipy/special/_test_internal.pyi +9 -0
  1290. scipy/special/_testutils.py +321 -0
  1291. scipy/special/_ufuncs.cp312-win_arm64.lib +0 -0
  1292. scipy/special/_ufuncs.cp312-win_arm64.pyd +0 -0
  1293. scipy/special/_ufuncs.pyi +522 -0
  1294. scipy/special/_ufuncs.pyx +13173 -0
  1295. scipy/special/_ufuncs_cxx.cp312-win_arm64.lib +0 -0
  1296. scipy/special/_ufuncs_cxx.cp312-win_arm64.pyd +0 -0
  1297. scipy/special/_ufuncs_cxx.pxd +142 -0
  1298. scipy/special/_ufuncs_cxx.pyx +427 -0
  1299. scipy/special/_ufuncs_cxx_defs.h +147 -0
  1300. scipy/special/_ufuncs_defs.h +57 -0
  1301. scipy/special/add_newdocs.py +15 -0
  1302. scipy/special/basic.py +87 -0
  1303. scipy/special/cython_special.cp312-win_arm64.lib +0 -0
  1304. scipy/special/cython_special.cp312-win_arm64.pyd +0 -0
  1305. scipy/special/cython_special.pxd +259 -0
  1306. scipy/special/cython_special.pyi +3 -0
  1307. scipy/special/orthogonal.py +45 -0
  1308. scipy/special/sf_error.py +20 -0
  1309. scipy/special/specfun.py +24 -0
  1310. scipy/special/spfun_stats.py +17 -0
  1311. scipy/special/tests/__init__.py +0 -0
  1312. scipy/special/tests/_cython_examples/extending.pyx +12 -0
  1313. scipy/special/tests/_cython_examples/meson.build +34 -0
  1314. scipy/special/tests/data/__init__.py +0 -0
  1315. scipy/special/tests/data/boost.npz +0 -0
  1316. scipy/special/tests/data/gsl.npz +0 -0
  1317. scipy/special/tests/data/local.npz +0 -0
  1318. scipy/special/tests/test_basic.py +4815 -0
  1319. scipy/special/tests/test_bdtr.py +112 -0
  1320. scipy/special/tests/test_boost_ufuncs.py +64 -0
  1321. scipy/special/tests/test_boxcox.py +125 -0
  1322. scipy/special/tests/test_cdflib.py +712 -0
  1323. scipy/special/tests/test_cdft_asymptotic.py +49 -0
  1324. scipy/special/tests/test_cephes_intp_cast.py +29 -0
  1325. scipy/special/tests/test_cosine_distr.py +83 -0
  1326. scipy/special/tests/test_cython_special.py +363 -0
  1327. scipy/special/tests/test_data.py +719 -0
  1328. scipy/special/tests/test_dd.py +42 -0
  1329. scipy/special/tests/test_digamma.py +45 -0
  1330. scipy/special/tests/test_ellip_harm.py +278 -0
  1331. scipy/special/tests/test_erfinv.py +89 -0
  1332. scipy/special/tests/test_exponential_integrals.py +118 -0
  1333. scipy/special/tests/test_extending.py +28 -0
  1334. scipy/special/tests/test_faddeeva.py +85 -0
  1335. scipy/special/tests/test_gamma.py +12 -0
  1336. scipy/special/tests/test_gammainc.py +152 -0
  1337. scipy/special/tests/test_hyp2f1.py +2566 -0
  1338. scipy/special/tests/test_hypergeometric.py +234 -0
  1339. scipy/special/tests/test_iv_ratio.py +249 -0
  1340. scipy/special/tests/test_kolmogorov.py +491 -0
  1341. scipy/special/tests/test_lambertw.py +109 -0
  1342. scipy/special/tests/test_legendre.py +1518 -0
  1343. scipy/special/tests/test_log1mexp.py +85 -0
  1344. scipy/special/tests/test_loggamma.py +70 -0
  1345. scipy/special/tests/test_logit.py +162 -0
  1346. scipy/special/tests/test_logsumexp.py +469 -0
  1347. scipy/special/tests/test_mpmath.py +2293 -0
  1348. scipy/special/tests/test_nan_inputs.py +65 -0
  1349. scipy/special/tests/test_ndtr.py +77 -0
  1350. scipy/special/tests/test_ndtri_exp.py +94 -0
  1351. scipy/special/tests/test_orthogonal.py +821 -0
  1352. scipy/special/tests/test_orthogonal_eval.py +275 -0
  1353. scipy/special/tests/test_owens_t.py +53 -0
  1354. scipy/special/tests/test_pcf.py +24 -0
  1355. scipy/special/tests/test_pdtr.py +48 -0
  1356. scipy/special/tests/test_powm1.py +65 -0
  1357. scipy/special/tests/test_precompute_expn_asy.py +24 -0
  1358. scipy/special/tests/test_precompute_gammainc.py +108 -0
  1359. scipy/special/tests/test_precompute_utils.py +36 -0
  1360. scipy/special/tests/test_round.py +18 -0
  1361. scipy/special/tests/test_sf_error.py +146 -0
  1362. scipy/special/tests/test_sici.py +36 -0
  1363. scipy/special/tests/test_specfun.py +48 -0
  1364. scipy/special/tests/test_spence.py +32 -0
  1365. scipy/special/tests/test_spfun_stats.py +61 -0
  1366. scipy/special/tests/test_sph_harm.py +85 -0
  1367. scipy/special/tests/test_spherical_bessel.py +400 -0
  1368. scipy/special/tests/test_support_alternative_backends.py +248 -0
  1369. scipy/special/tests/test_trig.py +72 -0
  1370. scipy/special/tests/test_ufunc_signatures.py +46 -0
  1371. scipy/special/tests/test_wright_bessel.py +205 -0
  1372. scipy/special/tests/test_wrightomega.py +117 -0
  1373. scipy/special/tests/test_zeta.py +301 -0
  1374. scipy/stats/__init__.py +670 -0
  1375. scipy/stats/_ansari_swilk_statistics.cp312-win_arm64.lib +0 -0
  1376. scipy/stats/_ansari_swilk_statistics.cp312-win_arm64.pyd +0 -0
  1377. scipy/stats/_axis_nan_policy.py +692 -0
  1378. scipy/stats/_biasedurn.cp312-win_arm64.lib +0 -0
  1379. scipy/stats/_biasedurn.cp312-win_arm64.pyd +0 -0
  1380. scipy/stats/_biasedurn.pxd +27 -0
  1381. scipy/stats/_binned_statistic.py +795 -0
  1382. scipy/stats/_binomtest.py +375 -0
  1383. scipy/stats/_bws_test.py +177 -0
  1384. scipy/stats/_censored_data.py +459 -0
  1385. scipy/stats/_common.py +5 -0
  1386. scipy/stats/_constants.py +42 -0
  1387. scipy/stats/_continued_fraction.py +387 -0
  1388. scipy/stats/_continuous_distns.py +12486 -0
  1389. scipy/stats/_correlation.py +210 -0
  1390. scipy/stats/_covariance.py +636 -0
  1391. scipy/stats/_crosstab.py +204 -0
  1392. scipy/stats/_discrete_distns.py +2098 -0
  1393. scipy/stats/_distn_infrastructure.py +4201 -0
  1394. scipy/stats/_distr_params.py +299 -0
  1395. scipy/stats/_distribution_infrastructure.py +5750 -0
  1396. scipy/stats/_entropy.py +428 -0
  1397. scipy/stats/_finite_differences.py +145 -0
  1398. scipy/stats/_fit.py +1351 -0
  1399. scipy/stats/_hypotests.py +2060 -0
  1400. scipy/stats/_kde.py +732 -0
  1401. scipy/stats/_ksstats.py +600 -0
  1402. scipy/stats/_levy_stable/__init__.py +1231 -0
  1403. scipy/stats/_levy_stable/levyst.cp312-win_arm64.lib +0 -0
  1404. scipy/stats/_levy_stable/levyst.cp312-win_arm64.pyd +0 -0
  1405. scipy/stats/_mannwhitneyu.py +492 -0
  1406. scipy/stats/_mgc.py +550 -0
  1407. scipy/stats/_morestats.py +4626 -0
  1408. scipy/stats/_mstats_basic.py +3658 -0
  1409. scipy/stats/_mstats_extras.py +521 -0
  1410. scipy/stats/_multicomp.py +449 -0
  1411. scipy/stats/_multivariate.py +7281 -0
  1412. scipy/stats/_new_distributions.py +452 -0
  1413. scipy/stats/_odds_ratio.py +466 -0
  1414. scipy/stats/_page_trend_test.py +486 -0
  1415. scipy/stats/_probability_distribution.py +1964 -0
  1416. scipy/stats/_qmc.py +2956 -0
  1417. scipy/stats/_qmc_cy.cp312-win_arm64.lib +0 -0
  1418. scipy/stats/_qmc_cy.cp312-win_arm64.pyd +0 -0
  1419. scipy/stats/_qmc_cy.pyi +54 -0
  1420. scipy/stats/_qmvnt.py +454 -0
  1421. scipy/stats/_qmvnt_cy.cp312-win_arm64.lib +0 -0
  1422. scipy/stats/_qmvnt_cy.cp312-win_arm64.pyd +0 -0
  1423. scipy/stats/_quantile.py +335 -0
  1424. scipy/stats/_rcont/__init__.py +4 -0
  1425. scipy/stats/_rcont/rcont.cp312-win_arm64.lib +0 -0
  1426. scipy/stats/_rcont/rcont.cp312-win_arm64.pyd +0 -0
  1427. scipy/stats/_relative_risk.py +263 -0
  1428. scipy/stats/_resampling.py +2352 -0
  1429. scipy/stats/_result_classes.py +40 -0
  1430. scipy/stats/_sampling.py +1314 -0
  1431. scipy/stats/_sensitivity_analysis.py +713 -0
  1432. scipy/stats/_sobol.cp312-win_arm64.lib +0 -0
  1433. scipy/stats/_sobol.cp312-win_arm64.pyd +0 -0
  1434. scipy/stats/_sobol.pyi +54 -0
  1435. scipy/stats/_sobol_direction_numbers.npz +0 -0
  1436. scipy/stats/_stats.cp312-win_arm64.lib +0 -0
  1437. scipy/stats/_stats.cp312-win_arm64.pyd +0 -0
  1438. scipy/stats/_stats.pxd +10 -0
  1439. scipy/stats/_stats_mstats_common.py +322 -0
  1440. scipy/stats/_stats_py.py +11089 -0
  1441. scipy/stats/_stats_pythran.cp312-win_arm64.lib +0 -0
  1442. scipy/stats/_stats_pythran.cp312-win_arm64.pyd +0 -0
  1443. scipy/stats/_survival.py +683 -0
  1444. scipy/stats/_tukeylambda_stats.py +199 -0
  1445. scipy/stats/_unuran/__init__.py +0 -0
  1446. scipy/stats/_unuran/unuran_wrapper.cp312-win_arm64.lib +0 -0
  1447. scipy/stats/_unuran/unuran_wrapper.cp312-win_arm64.pyd +0 -0
  1448. scipy/stats/_unuran/unuran_wrapper.pyi +179 -0
  1449. scipy/stats/_variation.py +126 -0
  1450. scipy/stats/_warnings_errors.py +38 -0
  1451. scipy/stats/_wilcoxon.py +265 -0
  1452. scipy/stats/biasedurn.py +16 -0
  1453. scipy/stats/contingency.py +521 -0
  1454. scipy/stats/distributions.py +24 -0
  1455. scipy/stats/kde.py +18 -0
  1456. scipy/stats/morestats.py +27 -0
  1457. scipy/stats/mstats.py +140 -0
  1458. scipy/stats/mstats_basic.py +42 -0
  1459. scipy/stats/mstats_extras.py +25 -0
  1460. scipy/stats/mvn.py +17 -0
  1461. scipy/stats/qmc.py +236 -0
  1462. scipy/stats/sampling.py +73 -0
  1463. scipy/stats/stats.py +41 -0
  1464. scipy/stats/tests/__init__.py +0 -0
  1465. scipy/stats/tests/common_tests.py +356 -0
  1466. scipy/stats/tests/data/_mvt.py +171 -0
  1467. scipy/stats/tests/data/fisher_exact_results_from_r.py +607 -0
  1468. scipy/stats/tests/data/jf_skew_t_gamlss_pdf_data.npy +0 -0
  1469. scipy/stats/tests/data/levy_stable/stable-Z1-cdf-sample-data.npy +0 -0
  1470. scipy/stats/tests/data/levy_stable/stable-Z1-pdf-sample-data.npy +0 -0
  1471. scipy/stats/tests/data/levy_stable/stable-loc-scale-sample-data.npy +0 -0
  1472. scipy/stats/tests/data/nist_anova/AtmWtAg.dat +108 -0
  1473. scipy/stats/tests/data/nist_anova/SiRstv.dat +85 -0
  1474. scipy/stats/tests/data/nist_anova/SmLs01.dat +249 -0
  1475. scipy/stats/tests/data/nist_anova/SmLs02.dat +1869 -0
  1476. scipy/stats/tests/data/nist_anova/SmLs03.dat +18069 -0
  1477. scipy/stats/tests/data/nist_anova/SmLs04.dat +249 -0
  1478. scipy/stats/tests/data/nist_anova/SmLs05.dat +1869 -0
  1479. scipy/stats/tests/data/nist_anova/SmLs06.dat +18069 -0
  1480. scipy/stats/tests/data/nist_anova/SmLs07.dat +249 -0
  1481. scipy/stats/tests/data/nist_anova/SmLs08.dat +1869 -0
  1482. scipy/stats/tests/data/nist_anova/SmLs09.dat +18069 -0
  1483. scipy/stats/tests/data/nist_linregress/Norris.dat +97 -0
  1484. scipy/stats/tests/data/rel_breitwigner_pdf_sample_data_ROOT.npy +0 -0
  1485. scipy/stats/tests/data/studentized_range_mpmath_ref.json +1499 -0
  1486. scipy/stats/tests/test_axis_nan_policy.py +1388 -0
  1487. scipy/stats/tests/test_binned_statistic.py +568 -0
  1488. scipy/stats/tests/test_censored_data.py +152 -0
  1489. scipy/stats/tests/test_contingency.py +294 -0
  1490. scipy/stats/tests/test_continued_fraction.py +173 -0
  1491. scipy/stats/tests/test_continuous.py +2198 -0
  1492. scipy/stats/tests/test_continuous_basic.py +1053 -0
  1493. scipy/stats/tests/test_continuous_fit_censored.py +683 -0
  1494. scipy/stats/tests/test_correlation.py +80 -0
  1495. scipy/stats/tests/test_crosstab.py +115 -0
  1496. scipy/stats/tests/test_discrete_basic.py +580 -0
  1497. scipy/stats/tests/test_discrete_distns.py +700 -0
  1498. scipy/stats/tests/test_distributions.py +10413 -0
  1499. scipy/stats/tests/test_entropy.py +322 -0
  1500. scipy/stats/tests/test_fast_gen_inversion.py +435 -0
  1501. scipy/stats/tests/test_fit.py +1090 -0
  1502. scipy/stats/tests/test_hypotests.py +1991 -0
  1503. scipy/stats/tests/test_kdeoth.py +676 -0
  1504. scipy/stats/tests/test_marray.py +289 -0
  1505. scipy/stats/tests/test_mgc.py +217 -0
  1506. scipy/stats/tests/test_morestats.py +3259 -0
  1507. scipy/stats/tests/test_mstats_basic.py +2071 -0
  1508. scipy/stats/tests/test_mstats_extras.py +172 -0
  1509. scipy/stats/tests/test_multicomp.py +405 -0
  1510. scipy/stats/tests/test_multivariate.py +4381 -0
  1511. scipy/stats/tests/test_odds_ratio.py +148 -0
  1512. scipy/stats/tests/test_qmc.py +1492 -0
  1513. scipy/stats/tests/test_quantile.py +199 -0
  1514. scipy/stats/tests/test_rank.py +345 -0
  1515. scipy/stats/tests/test_relative_risk.py +95 -0
  1516. scipy/stats/tests/test_resampling.py +2000 -0
  1517. scipy/stats/tests/test_sampling.py +1450 -0
  1518. scipy/stats/tests/test_sensitivity_analysis.py +310 -0
  1519. scipy/stats/tests/test_stats.py +9707 -0
  1520. scipy/stats/tests/test_survival.py +466 -0
  1521. scipy/stats/tests/test_tukeylambda_stats.py +85 -0
  1522. scipy/stats/tests/test_variation.py +216 -0
  1523. scipy/version.py +12 -0
  1524. scipy-1.16.2.dist-info/DELVEWHEEL +2 -0
  1525. scipy-1.16.2.dist-info/LICENSE.txt +912 -0
  1526. scipy-1.16.2.dist-info/METADATA +1061 -0
  1527. scipy-1.16.2.dist-info/RECORD +1530 -0
  1528. scipy-1.16.2.dist-info/WHEEL +4 -0
  1529. scipy.libs/msvcp140-5f1c5dd31916990d94181e07bc3afb32.dll +0 -0
  1530. scipy.libs/scipy_openblas-f3ac85b1f412f7e86514c923dc4058d1.dll +0 -0
@@ -0,0 +1,2513 @@
1
+ """The suite of window functions."""
2
+
3
+ import math
4
+ import operator
5
+ import warnings
6
+ from scipy._lib import doccer
7
+
8
+ from scipy import linalg, special, fft as sp_fft
9
+ from scipy._lib.array_api_compat import numpy as np_compat
10
+ from scipy._lib._array_api import array_namespace, xp_device
11
+ from scipy._lib import array_api_extra as xpx
12
+
13
+ __all__ = ['boxcar', 'triang', 'parzen', 'bohman', 'blackman', 'nuttall',
14
+ 'blackmanharris', 'flattop', 'bartlett', 'barthann',
15
+ 'hamming', 'kaiser', 'kaiser_bessel_derived', 'gaussian',
16
+ 'general_cosine', 'general_gaussian', 'general_hamming',
17
+ 'chebwin', 'cosine', 'hann', 'exponential', 'tukey', 'taylor',
18
+ 'dpss', 'get_window', 'lanczos']
19
+
20
+
21
+ def _len_guards(M):
22
+ """Handle small or incorrect window lengths"""
23
+ if int(M) != M or M < 0:
24
+ raise ValueError('Window length M must be a non-negative integer')
25
+ return M <= 1
26
+
27
+
28
+ def _extend(M, sym):
29
+ """Extend window by 1 sample if needed for DFT-even symmetry"""
30
+ if not sym:
31
+ return M + 1, True
32
+ else:
33
+ return M, False
34
+
35
+
36
+ def _truncate(w, needed):
37
+ """Truncate window by 1 sample if needed for DFT-even symmetry"""
38
+ if needed:
39
+ return w[:-1]
40
+ else:
41
+ return w
42
+
43
+
44
+ def _namespace(xp):
45
+ """A shim for the `device` arg of `np.asarray(x, device=device)` and acos/arccos.
46
+
47
+ Will be able to replace with `np_compat if xp is None else xp` when we drop
48
+ support for numpy 1.x and cupy 13.x
49
+ """
50
+ return np_compat if xp is None else array_namespace(xp.empty(0))
51
+
52
+
53
+ def _general_cosine_impl(M, a, xp, device, sym=True):
54
+ if _len_guards(M):
55
+ return xp.ones(M, dtype=xp.float64, device=device)
56
+ M, needs_trunc = _extend(M, sym)
57
+
58
+ fac = xp.linspace(-xp.pi, xp.pi, M, dtype=xp.float64, device=device)
59
+ w = xp.zeros(M, dtype=xp.float64, device=device)
60
+ for k in range(a.shape[0]):
61
+ w += a[k] * xp.cos(k * fac)
62
+
63
+ return _truncate(w, needs_trunc)
64
+
65
+
66
+ def general_cosine(M, a, sym=True):
67
+ r"""
68
+ Generic weighted sum of cosine terms window
69
+
70
+ Parameters
71
+ ----------
72
+ M : int
73
+ Number of points in the output window
74
+ a : array_like
75
+ Sequence of weighting coefficients. This uses the convention of being
76
+ centered on the origin, so these will typically all be positive
77
+ numbers, not alternating sign.
78
+ sym : bool, optional
79
+ When True (default), generates a symmetric window, for use in filter
80
+ design.
81
+ When False, generates a periodic window, for use in spectral analysis.
82
+
83
+ Returns
84
+ -------
85
+ w : ndarray
86
+ The array of window values.
87
+
88
+ References
89
+ ----------
90
+ .. [1] A. Nuttall, "Some windows with very good sidelobe behavior," IEEE
91
+ Transactions on Acoustics, Speech, and Signal Processing, vol. 29,
92
+ no. 1, pp. 84-91, Feb 1981. :doi:`10.1109/TASSP.1981.1163506`.
93
+ .. [2] Heinzel G. et al., "Spectrum and spectral density estimation by the
94
+ Discrete Fourier transform (DFT), including a comprehensive list of
95
+ window functions and some new flat-top windows", February 15, 2002
96
+ https://holometer.fnal.gov/GH_FFT.pdf
97
+
98
+ Examples
99
+ --------
100
+ Heinzel describes a flat-top window named "HFT90D" with formula: [2]_
101
+
102
+ .. math:: w_j = 1 - 1.942604 \cos(z) + 1.340318 \cos(2z)
103
+ - 0.440811 \cos(3z) + 0.043097 \cos(4z)
104
+
105
+ where
106
+
107
+ .. math:: z = \frac{2 \pi j}{N}, j = 0...N - 1
108
+
109
+ Since this uses the convention of starting at the origin, to reproduce the
110
+ window, we need to convert every other coefficient to a positive number:
111
+
112
+ >>> HFT90D = [1, 1.942604, 1.340318, 0.440811, 0.043097]
113
+
114
+ The paper states that the highest sidelobe is at -90.2 dB. Reproduce
115
+ Figure 42 by plotting the window and its frequency response, and confirm
116
+ the sidelobe level in red:
117
+
118
+ >>> import numpy as np
119
+ >>> from scipy.signal.windows import general_cosine
120
+ >>> from scipy.fft import fft, fftshift
121
+ >>> import matplotlib.pyplot as plt
122
+
123
+ >>> window = general_cosine(1000, HFT90D, sym=False)
124
+ >>> plt.plot(window)
125
+ >>> plt.title("HFT90D window")
126
+ >>> plt.ylabel("Amplitude")
127
+ >>> plt.xlabel("Sample")
128
+
129
+ >>> plt.figure()
130
+ >>> A = fft(window, 10000) / (len(window)/2.0)
131
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
132
+ >>> response = np.abs(fftshift(A / abs(A).max()))
133
+ >>> response = 20 * np.log10(np.maximum(response, 1e-10))
134
+ >>> plt.plot(freq, response)
135
+ >>> plt.axis([-50/1000, 50/1000, -140, 0])
136
+ >>> plt.title("Frequency response of the HFT90D window")
137
+ >>> plt.ylabel("Normalized magnitude [dB]")
138
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
139
+ >>> plt.axhline(-90.2, color='red')
140
+ >>> plt.show()
141
+ """
142
+ xp = array_namespace(a)
143
+ a = xp.asarray(a)
144
+ device = xp_device(a)
145
+ return _general_cosine_impl(M, a, xp, device, sym=sym)
146
+
147
+
148
+ def boxcar(M, sym=True, *, xp=None, device=None):
149
+ """Return a boxcar or rectangular window.
150
+
151
+ Also known as a rectangular window or Dirichlet window, this is equivalent
152
+ to no window at all.
153
+
154
+ Parameters
155
+ ----------
156
+ M : int
157
+ Number of points in the output window. If zero, an empty array
158
+ is returned. An exception is thrown when it is negative.
159
+ sym : bool, optional
160
+ Whether the window is symmetric. (Has no effect for boxcar.)
161
+ %(xp_device_snippet)s
162
+
163
+ Returns
164
+ -------
165
+ w : ndarray
166
+ The window, with the maximum value normalized to 1.
167
+
168
+ Examples
169
+ --------
170
+ Plot the window and its frequency response:
171
+
172
+ >>> import numpy as np
173
+ >>> from scipy import signal
174
+ >>> from scipy.fft import fft, fftshift
175
+ >>> import matplotlib.pyplot as plt
176
+
177
+ >>> window = signal.windows.boxcar(51)
178
+ >>> plt.plot(window)
179
+ >>> plt.title("Boxcar window")
180
+ >>> plt.ylabel("Amplitude")
181
+ >>> plt.xlabel("Sample")
182
+
183
+ >>> plt.figure()
184
+ >>> A = fft(window, 2048) / (len(window)/2.0)
185
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
186
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
187
+ >>> plt.plot(freq, response)
188
+ >>> plt.axis([-0.5, 0.5, -120, 0])
189
+ >>> plt.title("Frequency response of the boxcar window")
190
+ >>> plt.ylabel("Normalized magnitude [dB]")
191
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
192
+
193
+ """
194
+ xp = _namespace(xp)
195
+
196
+ if _len_guards(M):
197
+ return xp.ones(M, dtype=xp.float64, device=device)
198
+ M, needs_trunc = _extend(M, sym)
199
+
200
+ w = xp.ones(M, dtype=xp.float64, device=device)
201
+
202
+ return _truncate(w, needs_trunc)
203
+
204
+
205
+ def triang(M, sym=True, *, xp=None, device=None):
206
+ """Return a triangular window.
207
+
208
+ Parameters
209
+ ----------
210
+ M : int
211
+ Number of points in the output window. If zero, an empty array
212
+ is returned. An exception is thrown when it is negative.
213
+ sym : bool, optional
214
+ When True (default), generates a symmetric window, for use in filter
215
+ design.
216
+ When False, generates a periodic window, for use in spectral analysis.
217
+ %(xp_device_snippet)s
218
+
219
+ Returns
220
+ -------
221
+ w : ndarray
222
+ The window, with the maximum value normalized to 1 (though the value 1
223
+ does not appear if `M` is even and `sym` is True).
224
+
225
+ See Also
226
+ --------
227
+ bartlett : A triangular window that touches zero
228
+
229
+ Examples
230
+ --------
231
+ Plot the window and its frequency response:
232
+
233
+ >>> import numpy as np
234
+ >>> from scipy import signal
235
+ >>> from scipy.fft import fft, fftshift
236
+ >>> import matplotlib.pyplot as plt
237
+
238
+ >>> window = signal.windows.triang(51)
239
+ >>> plt.plot(window)
240
+ >>> plt.title("Triangular window")
241
+ >>> plt.ylabel("Amplitude")
242
+ >>> plt.xlabel("Sample")
243
+
244
+ >>> plt.figure()
245
+ >>> A = fft(window, 2048) / (len(window)/2.0)
246
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
247
+ >>> response = np.abs(fftshift(A / abs(A).max()))
248
+ >>> response = 20 * np.log10(np.maximum(response, 1e-10))
249
+ >>> plt.plot(freq, response)
250
+ >>> plt.axis([-0.5, 0.5, -120, 0])
251
+ >>> plt.title("Frequency response of the triangular window")
252
+ >>> plt.ylabel("Normalized magnitude [dB]")
253
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
254
+
255
+ """
256
+ xp = _namespace(xp)
257
+
258
+ if _len_guards(M):
259
+ return xp.ones(M, dtype=xp.float64, device=device)
260
+ M, needs_trunc = _extend(M, sym)
261
+
262
+ n = xp.arange(1, (M + 1) // 2 + 1, dtype=xp.float64, device=device)
263
+ if M % 2 == 0:
264
+ w = (2 * n - 1.0) / M
265
+ w = xp.concat([w, xp.flip(w)])
266
+ else:
267
+ w = 2 * n / (M + 1.0)
268
+ w = xp.concat([w, xp.flip(w[:-1])])
269
+
270
+ return _truncate(w, needs_trunc)
271
+
272
+
273
+ def parzen(M, sym=True, *, xp=None, device=None):
274
+ """Return a Parzen window.
275
+
276
+ Parameters
277
+ ----------
278
+ M : int
279
+ Number of points in the output window. If zero, an empty array
280
+ is returned. An exception is thrown when it is negative.
281
+ sym : bool, optional
282
+ When True (default), generates a symmetric window, for use in filter
283
+ design.
284
+ When False, generates a periodic window, for use in spectral analysis.
285
+ %(xp_device_snippet)s
286
+
287
+ Returns
288
+ -------
289
+ w : ndarray
290
+ The window, with the maximum value normalized to 1 (though the value 1
291
+ does not appear if `M` is even and `sym` is True).
292
+
293
+ References
294
+ ----------
295
+ .. [1] E. Parzen, "Mathematical Considerations in the Estimation of
296
+ Spectra", Technometrics, Vol. 3, No. 2 (May, 1961), pp. 167-190
297
+
298
+ Examples
299
+ --------
300
+ Plot the window and its frequency response:
301
+
302
+ >>> import numpy as np
303
+ >>> from scipy import signal
304
+ >>> from scipy.fft import fft, fftshift
305
+ >>> import matplotlib.pyplot as plt
306
+
307
+ >>> window = signal.windows.parzen(51)
308
+ >>> plt.plot(window)
309
+ >>> plt.title("Parzen window")
310
+ >>> plt.ylabel("Amplitude")
311
+ >>> plt.xlabel("Sample")
312
+
313
+ >>> plt.figure()
314
+ >>> A = fft(window, 2048) / (len(window)/2.0)
315
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
316
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
317
+ >>> plt.plot(freq, response)
318
+ >>> plt.axis([-0.5, 0.5, -120, 0])
319
+ >>> plt.title("Frequency response of the Parzen window")
320
+ >>> plt.ylabel("Normalized magnitude [dB]")
321
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
322
+
323
+ """
324
+ xp = _namespace(xp)
325
+
326
+ if _len_guards(M):
327
+ return xp.ones(M, dtype=xp.float64, device=device)
328
+ M, needs_trunc = _extend(M, sym)
329
+
330
+ n = xp.arange(-(M - 1) / 2.0, (M - 1) / 2.0 + 0.5, 1.0,
331
+ dtype=xp.float64, device=device)
332
+ w = xp.where(abs(n) <= (M - 1) / 4.0,
333
+ (1 - 6 * (abs(n) / (M / 2.0)) ** 2.0 +
334
+ 6 * (abs(n) / (M / 2.0)) ** 3.0),
335
+ 2 * (1 - abs(n) / (M / 2.0)) ** 3.0)
336
+ return _truncate(w, needs_trunc)
337
+
338
+
339
+ def bohman(M, sym=True, *, xp=None, device=None):
340
+ """Return a Bohman window.
341
+
342
+ Parameters
343
+ ----------
344
+ M : int
345
+ Number of points in the output window. If zero, an empty array
346
+ is returned. An exception is thrown when it is negative.
347
+ sym : bool, optional
348
+ When True (default), generates a symmetric window, for use in filter
349
+ design.
350
+ When False, generates a periodic window, for use in spectral analysis.
351
+ %(xp_device_snippet)s
352
+
353
+ Returns
354
+ -------
355
+ w : ndarray
356
+ The window, with the maximum value normalized to 1 (though the value 1
357
+ does not appear if `M` is even and `sym` is True).
358
+
359
+ Examples
360
+ --------
361
+ Plot the window and its frequency response:
362
+
363
+ >>> import numpy as np
364
+ >>> from scipy import signal
365
+ >>> from scipy.fft import fft, fftshift
366
+ >>> import matplotlib.pyplot as plt
367
+
368
+ >>> window = signal.windows.bohman(51)
369
+ >>> plt.plot(window)
370
+ >>> plt.title("Bohman window")
371
+ >>> plt.ylabel("Amplitude")
372
+ >>> plt.xlabel("Sample")
373
+
374
+ >>> plt.figure()
375
+ >>> A = fft(window, 2047) / (len(window)/2.0)
376
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
377
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
378
+ >>> plt.plot(freq, response)
379
+ >>> plt.axis([-0.5, 0.5, -120, 0])
380
+ >>> plt.title("Frequency response of the Bohman window")
381
+ >>> plt.ylabel("Normalized magnitude [dB]")
382
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
383
+
384
+ """
385
+ xp = _namespace(xp)
386
+
387
+ if _len_guards(M):
388
+ return xp.ones(M, dtype=xp.float64, device=device)
389
+ M, needs_trunc = _extend(M, sym)
390
+
391
+ fac = abs(xp.linspace(-1, 1, M, dtype=xp.float64, device=device)[1:-1])
392
+ w = (1 - fac) * xp.cos(xp.pi * fac) + 1.0 / xp.pi * xp.sin(xp.pi * fac)
393
+ one = xp.zeros(1, dtype=xp.float64, device=device)
394
+ w = xp.concat([one, w, one])
395
+
396
+ return _truncate(w, needs_trunc)
397
+
398
+
399
+ def blackman(M, sym=True, *, xp=None, device=None):
400
+ r"""
401
+ Return a Blackman window.
402
+
403
+ The Blackman window is a taper formed by using the first three terms of
404
+ a summation of cosines. It was designed to have close to the minimal
405
+ leakage possible. It is close to optimal, only slightly worse than a
406
+ Kaiser window.
407
+
408
+ Parameters
409
+ ----------
410
+ M : int
411
+ Number of points in the output window. If zero, an empty array
412
+ is returned. An exception is thrown when it is negative.
413
+ sym : bool, optional
414
+ When True (default), generates a symmetric window, for use in filter
415
+ design.
416
+ When False, generates a periodic window, for use in spectral analysis.
417
+ %(xp_device_snippet)s
418
+
419
+ Returns
420
+ -------
421
+ w : ndarray
422
+ The window, with the maximum value normalized to 1 (though the value 1
423
+ does not appear if `M` is even and `sym` is True).
424
+
425
+ Notes
426
+ -----
427
+ The Blackman window is defined as
428
+
429
+ .. math:: w(n) = 0.42 - 0.5 \cos(2\pi n/M) + 0.08 \cos(4\pi n/M)
430
+
431
+ The "exact Blackman" window was designed to null out the third and fourth
432
+ sidelobes, but has discontinuities at the boundaries, resulting in a
433
+ 6 dB/oct fall-off. This window is an approximation of the "exact" window,
434
+ which does not null the sidelobes as well, but is smooth at the edges,
435
+ improving the fall-off rate to 18 dB/oct. [3]_
436
+
437
+ Most references to the Blackman window come from the signal processing
438
+ literature, where it is used as one of many windowing functions for
439
+ smoothing values. It is also known as an apodization (which means
440
+ "removing the foot", i.e. smoothing discontinuities at the beginning
441
+ and end of the sampled signal) or tapering function. It is known as a
442
+ "near optimal" tapering function, almost as good (by some measures)
443
+ as the Kaiser window.
444
+
445
+ References
446
+ ----------
447
+ .. [1] Blackman, R.B. and Tukey, J.W., (1958) The measurement of power
448
+ spectra, Dover Publications, New York.
449
+ .. [2] Oppenheim, A.V., and R.W. Schafer. Discrete-Time Signal Processing.
450
+ Upper Saddle River, NJ: Prentice-Hall, 1999, pp. 468-471.
451
+ .. [3] Harris, Fredric J. (Jan 1978). "On the use of Windows for Harmonic
452
+ Analysis with the Discrete Fourier Transform". Proceedings of the
453
+ IEEE 66 (1): 51-83. :doi:`10.1109/PROC.1978.10837`.
454
+
455
+ Examples
456
+ --------
457
+ Plot the window and its frequency response:
458
+
459
+ >>> import numpy as np
460
+ >>> from scipy import signal
461
+ >>> from scipy.fft import fft, fftshift
462
+ >>> import matplotlib.pyplot as plt
463
+
464
+ >>> window = signal.windows.blackman(51)
465
+ >>> plt.plot(window)
466
+ >>> plt.title("Blackman window")
467
+ >>> plt.ylabel("Amplitude")
468
+ >>> plt.xlabel("Sample")
469
+
470
+ >>> plt.figure()
471
+ >>> A = fft(window, 2048) / (len(window)/2.0)
472
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
473
+ >>> response = np.abs(fftshift(A / abs(A).max()))
474
+ >>> response = 20 * np.log10(np.maximum(response, 1e-10))
475
+ >>> plt.plot(freq, response)
476
+ >>> plt.axis([-0.5, 0.5, -120, 0])
477
+ >>> plt.title("Frequency response of the Blackman window")
478
+ >>> plt.ylabel("Normalized magnitude [dB]")
479
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
480
+
481
+ """
482
+ # Docstring adapted from NumPy's blackman function
483
+ xp = _namespace(xp)
484
+ a = xp.asarray([0.42, 0.50, 0.08], dtype=xp.float64, device=device)
485
+ device = xp_device(a)
486
+ return _general_cosine_impl(M, a, xp, device, sym=sym)
487
+
488
+
489
+ def nuttall(M, sym=True, *, xp=None, device=None):
490
+ """Return a minimum 4-term Blackman-Harris window according to Nuttall.
491
+
492
+ This variation is called "Nuttall4c" by Heinzel. [2]_
493
+
494
+ Parameters
495
+ ----------
496
+ M : int
497
+ Number of points in the output window. If zero, an empty array
498
+ is returned. An exception is thrown when it is negative.
499
+ sym : bool, optional
500
+ When True (default), generates a symmetric window, for use in filter
501
+ design.
502
+ When False, generates a periodic window, for use in spectral analysis.
503
+ %(xp_device_snippet)s
504
+
505
+ Returns
506
+ -------
507
+ w : ndarray
508
+ The window, with the maximum value normalized to 1 (though the value 1
509
+ does not appear if `M` is even and `sym` is True).
510
+
511
+ References
512
+ ----------
513
+ .. [1] A. Nuttall, "Some windows with very good sidelobe behavior," IEEE
514
+ Transactions on Acoustics, Speech, and Signal Processing, vol. 29,
515
+ no. 1, pp. 84-91, Feb 1981. :doi:`10.1109/TASSP.1981.1163506`.
516
+ .. [2] Heinzel G. et al., "Spectrum and spectral density estimation by the
517
+ Discrete Fourier transform (DFT), including a comprehensive list of
518
+ window functions and some new flat-top windows", February 15, 2002
519
+ https://holometer.fnal.gov/GH_FFT.pdf
520
+
521
+ Examples
522
+ --------
523
+ Plot the window and its frequency response:
524
+
525
+ >>> import numpy as np
526
+ >>> from scipy import signal
527
+ >>> from scipy.fft import fft, fftshift
528
+ >>> import matplotlib.pyplot as plt
529
+
530
+ >>> window = signal.windows.nuttall(51)
531
+ >>> plt.plot(window)
532
+ >>> plt.title("Nuttall window")
533
+ >>> plt.ylabel("Amplitude")
534
+ >>> plt.xlabel("Sample")
535
+
536
+ >>> plt.figure()
537
+ >>> A = fft(window, 2048) / (len(window)/2.0)
538
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
539
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
540
+ >>> plt.plot(freq, response)
541
+ >>> plt.axis([-0.5, 0.5, -120, 0])
542
+ >>> plt.title("Frequency response of the Nuttall window")
543
+ >>> plt.ylabel("Normalized magnitude [dB]")
544
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
545
+
546
+ """
547
+ xp = _namespace(xp)
548
+ a = xp.asarray(
549
+ [0.3635819, 0.4891775, 0.1365995, 0.0106411], dtype=xp.float64, device=device
550
+ )
551
+ device = xp_device(a)
552
+ return _general_cosine_impl(M, a, xp, device, sym=sym)
553
+
554
+
555
+ def blackmanharris(M, sym=True, *, xp=None, device=None):
556
+ """Return a minimum 4-term Blackman-Harris window.
557
+
558
+ Parameters
559
+ ----------
560
+ M : int
561
+ Number of points in the output window. If zero, an empty array
562
+ is returned. An exception is thrown when it is negative.
563
+ sym : bool, optional
564
+ When True (default), generates a symmetric window, for use in filter
565
+ design.
566
+ When False, generates a periodic window, for use in spectral analysis.
567
+ %(xp_device_snippet)s
568
+
569
+ Returns
570
+ -------
571
+ w : ndarray
572
+ The window, with the maximum value normalized to 1 (though the value 1
573
+ does not appear if `M` is even and `sym` is True).
574
+
575
+ Examples
576
+ --------
577
+ Plot the window and its frequency response:
578
+
579
+ >>> import numpy as np
580
+ >>> from scipy import signal
581
+ >>> from scipy.fft import fft, fftshift
582
+ >>> import matplotlib.pyplot as plt
583
+
584
+ >>> window = signal.windows.blackmanharris(51)
585
+ >>> plt.plot(window)
586
+ >>> plt.title("Blackman-Harris window")
587
+ >>> plt.ylabel("Amplitude")
588
+ >>> plt.xlabel("Sample")
589
+
590
+ >>> plt.figure()
591
+ >>> A = fft(window, 2048) / (len(window)/2.0)
592
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
593
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
594
+ >>> plt.plot(freq, response)
595
+ >>> plt.axis([-0.5, 0.5, -120, 0])
596
+ >>> plt.title("Frequency response of the Blackman-Harris window")
597
+ >>> plt.ylabel("Normalized magnitude [dB]")
598
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
599
+
600
+ """
601
+ xp = _namespace(xp)
602
+ a = xp.asarray(
603
+ [0.35875, 0.48829, 0.14128, 0.01168], dtype=xp.float64, device=device
604
+ )
605
+ device = xp_device(a)
606
+ return _general_cosine_impl(M, a, xp, device, sym=sym)
607
+
608
+
609
+ def flattop(M, sym=True, *, xp=None, device=None):
610
+ """Return a flat top window.
611
+
612
+ Parameters
613
+ ----------
614
+ M : int
615
+ Number of points in the output window. If zero, an empty array
616
+ is returned. An exception is thrown when it is negative.
617
+ sym : bool, optional
618
+ When True (default), generates a symmetric window, for use in filter
619
+ design.
620
+ When False, generates a periodic window, for use in spectral analysis.
621
+ %(xp_device_snippet)s
622
+
623
+ Returns
624
+ -------
625
+ w : ndarray
626
+ The window, with the maximum value normalized to 1 (though the value 1
627
+ does not appear if `M` is even and `sym` is True).
628
+
629
+ Notes
630
+ -----
631
+ Flat top windows are used for taking accurate measurements of signal
632
+ amplitude in the frequency domain, with minimal scalloping error from the
633
+ center of a frequency bin to its edges, compared to others. This is a
634
+ 5th-order cosine window, with the 5 terms optimized to make the main lobe
635
+ maximally flat. [1]_
636
+
637
+ References
638
+ ----------
639
+ .. [1] D'Antona, Gabriele, and A. Ferrero, "Digital Signal Processing for
640
+ Measurement Systems", Springer Media, 2006, p. 70
641
+ :doi:`10.1007/0-387-28666-7`.
642
+
643
+ Examples
644
+ --------
645
+ Plot the window and its frequency response:
646
+
647
+ >>> import numpy as np
648
+ >>> from scipy import signal
649
+ >>> from scipy.fft import fft, fftshift
650
+ >>> import matplotlib.pyplot as plt
651
+
652
+ >>> window = signal.windows.flattop(51)
653
+ >>> plt.plot(window)
654
+ >>> plt.title("Flat top window")
655
+ >>> plt.ylabel("Amplitude")
656
+ >>> plt.xlabel("Sample")
657
+
658
+ >>> plt.figure()
659
+ >>> A = fft(window, 2048) / (len(window)/2.0)
660
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
661
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
662
+ >>> plt.plot(freq, response)
663
+ >>> plt.axis([-0.5, 0.5, -120, 0])
664
+ >>> plt.title("Frequency response of the flat top window")
665
+ >>> plt.ylabel("Normalized magnitude [dB]")
666
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
667
+
668
+ """
669
+ xp = _namespace(xp)
670
+ a = xp.asarray(
671
+ [0.21557895, 0.41663158, 0.277263158, 0.083578947, 0.006947368],
672
+ dtype=xp.float64, device=device
673
+ )
674
+ device = xp_device(a)
675
+ return _general_cosine_impl(M, a, xp, device, sym=sym)
676
+
677
+
678
+ def bartlett(M, sym=True, *, xp=None, device=None):
679
+ r"""
680
+ Return a Bartlett window.
681
+
682
+ The Bartlett window is very similar to a triangular window, except
683
+ that the end points are at zero. It is often used in signal
684
+ processing for tapering a signal, without generating too much
685
+ ripple in the frequency domain.
686
+
687
+ Parameters
688
+ ----------
689
+ M : int
690
+ Number of points in the output window. If zero, an empty array
691
+ is returned. An exception is thrown when it is negative.
692
+ sym : bool, optional
693
+ When True (default), generates a symmetric window, for use in filter
694
+ design.
695
+ When False, generates a periodic window, for use in spectral analysis.
696
+ %(xp_device_snippet)s
697
+
698
+ Returns
699
+ -------
700
+ w : ndarray
701
+ The triangular window, with the first and last samples equal to zero
702
+ and the maximum value normalized to 1 (though the value 1 does not
703
+ appear if `M` is even and `sym` is True).
704
+
705
+ See Also
706
+ --------
707
+ triang : A triangular window that does not touch zero at the ends
708
+
709
+ Notes
710
+ -----
711
+ The Bartlett window is defined as
712
+
713
+ .. math:: w(n) = \frac{2}{M-1} \left(
714
+ \frac{M-1}{2} - \left|n - \frac{M-1}{2}\right|
715
+ \right)
716
+
717
+ Most references to the Bartlett window come from the signal
718
+ processing literature, where it is used as one of many windowing
719
+ functions for smoothing values. Note that convolution with this
720
+ window produces linear interpolation. It is also known as an
721
+ apodization (which means"removing the foot", i.e. smoothing
722
+ discontinuities at the beginning and end of the sampled signal) or
723
+ tapering function. The Fourier transform of the Bartlett is the product
724
+ of two sinc functions.
725
+ Note the excellent discussion in Kanasewich. [2]_
726
+
727
+ References
728
+ ----------
729
+ .. [1] M.S. Bartlett, "Periodogram Analysis and Continuous Spectra",
730
+ Biometrika 37, 1-16, 1950.
731
+ .. [2] E.R. Kanasewich, "Time Sequence Analysis in Geophysics",
732
+ The University of Alberta Press, 1975, pp. 109-110.
733
+ .. [3] A.V. Oppenheim and R.W. Schafer, "Discrete-Time Signal
734
+ Processing", Prentice-Hall, 1999, pp. 468-471.
735
+ .. [4] Wikipedia, "Window function",
736
+ https://en.wikipedia.org/wiki/Window_function
737
+ .. [5] W.H. Press, B.P. Flannery, S.A. Teukolsky, and W.T. Vetterling,
738
+ "Numerical Recipes", Cambridge University Press, 1986, page 429.
739
+
740
+ Examples
741
+ --------
742
+ Plot the window and its frequency response:
743
+
744
+ >>> import numpy as np
745
+ >>> from scipy import signal
746
+ >>> from scipy.fft import fft, fftshift
747
+ >>> import matplotlib.pyplot as plt
748
+
749
+ >>> window = signal.windows.bartlett(51)
750
+ >>> plt.plot(window)
751
+ >>> plt.title("Bartlett window")
752
+ >>> plt.ylabel("Amplitude")
753
+ >>> plt.xlabel("Sample")
754
+
755
+ >>> plt.figure()
756
+ >>> A = fft(window, 2048) / (len(window)/2.0)
757
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
758
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
759
+ >>> plt.plot(freq, response)
760
+ >>> plt.axis([-0.5, 0.5, -120, 0])
761
+ >>> plt.title("Frequency response of the Bartlett window")
762
+ >>> plt.ylabel("Normalized magnitude [dB]")
763
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
764
+
765
+ """
766
+ # Docstring adapted from NumPy's bartlett function
767
+ xp = _namespace(xp)
768
+
769
+ if _len_guards(M):
770
+ return xp.ones(M, dtype=xp.float64, device=device)
771
+ M, needs_trunc = _extend(M, sym)
772
+
773
+ n = xp.arange(0, M, dtype=xp.float64, device=device)
774
+
775
+ # cf https://github.com/data-apis/array-api-strict/issues/77
776
+ w = xp.where(n <= (M - 1) / 2.0,
777
+ 2.0 * n / (M - 1), 2.0 - 2.0 * n / (M - 1))
778
+
779
+ return _truncate(w, needs_trunc)
780
+
781
+
782
+ def hann(M, sym=True, *, xp=None, device=None):
783
+ r"""
784
+ Return a Hann window.
785
+
786
+ The Hann window is a taper formed by using a raised cosine or sine-squared
787
+ with ends that touch zero.
788
+
789
+ Parameters
790
+ ----------
791
+ M : int
792
+ Number of points in the output window. If zero, an empty array
793
+ is returned. An exception is thrown when it is negative.
794
+ sym : bool, optional
795
+ When True (default), generates a symmetric window, for use in filter
796
+ design.
797
+ When False, generates a periodic window, for use in spectral analysis.
798
+ %(xp_device_snippet)s
799
+
800
+ Returns
801
+ -------
802
+ w : ndarray
803
+ The window, with the maximum value normalized to 1 (though the value 1
804
+ does not appear if `M` is even and `sym` is True).
805
+
806
+ Notes
807
+ -----
808
+ The Hann window is defined as
809
+
810
+ .. math:: w(n) = 0.5 - 0.5 \cos\left(\frac{2\pi{n}}{M-1}\right)
811
+ \qquad 0 \leq n \leq M-1
812
+
813
+ The window was named for Julius von Hann, an Austrian meteorologist. It is
814
+ also known as the Cosine Bell. It is sometimes erroneously referred to as
815
+ the "Hanning" window, from the use of "hann" as a verb in the original
816
+ paper and confusion with the very similar Hamming window.
817
+
818
+ Most references to the Hann window come from the signal processing
819
+ literature, where it is used as one of many windowing functions for
820
+ smoothing values. It is also known as an apodization (which means
821
+ "removing the foot", i.e. smoothing discontinuities at the beginning
822
+ and end of the sampled signal) or tapering function.
823
+
824
+ References
825
+ ----------
826
+ .. [1] Blackman, R.B. and Tukey, J.W., (1958) The measurement of power
827
+ spectra, Dover Publications, New York.
828
+ .. [2] E.R. Kanasewich, "Time Sequence Analysis in Geophysics",
829
+ The University of Alberta Press, 1975, pp. 106-108.
830
+ .. [3] Wikipedia, "Window function",
831
+ https://en.wikipedia.org/wiki/Window_function
832
+ .. [4] W.H. Press, B.P. Flannery, S.A. Teukolsky, and W.T. Vetterling,
833
+ "Numerical Recipes", Cambridge University Press, 1986, page 425.
834
+
835
+ Examples
836
+ --------
837
+ Plot the window and its frequency response:
838
+
839
+ >>> import numpy as np
840
+ >>> from scipy import signal
841
+ >>> from scipy.fft import fft, fftshift
842
+ >>> import matplotlib.pyplot as plt
843
+
844
+ >>> window = signal.windows.hann(51)
845
+ >>> plt.plot(window)
846
+ >>> plt.title("Hann window")
847
+ >>> plt.ylabel("Amplitude")
848
+ >>> plt.xlabel("Sample")
849
+
850
+ >>> plt.figure()
851
+ >>> A = fft(window, 2048) / (len(window)/2.0)
852
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
853
+ >>> response = np.abs(fftshift(A / abs(A).max()))
854
+ >>> response = 20 * np.log10(np.maximum(response, 1e-10))
855
+ >>> plt.plot(freq, response)
856
+ >>> plt.axis([-0.5, 0.5, -120, 0])
857
+ >>> plt.title("Frequency response of the Hann window")
858
+ >>> plt.ylabel("Normalized magnitude [dB]")
859
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
860
+
861
+ """
862
+ # Docstring adapted from NumPy's hanning function
863
+ return general_hamming(M, 0.5, sym, xp=xp, device=device)
864
+
865
+
866
+ def tukey(M, alpha=0.5, sym=True, *, xp=None, device=None):
867
+ r"""Return a Tukey window, also known as a tapered cosine window.
868
+
869
+ Parameters
870
+ ----------
871
+ M : int
872
+ Number of points in the output window. If zero, an empty array
873
+ is returned. An exception is thrown when it is negative.
874
+ alpha : float, optional
875
+ Shape parameter of the Tukey window, representing the fraction of the
876
+ window inside the cosine tapered region.
877
+ If zero, the Tukey window is equivalent to a rectangular window.
878
+ If one, the Tukey window is equivalent to a Hann window.
879
+ sym : bool, optional
880
+ When True (default), generates a symmetric window, for use in filter
881
+ design.
882
+ When False, generates a periodic window, for use in spectral analysis.
883
+ %(xp_device_snippet)s
884
+
885
+ Returns
886
+ -------
887
+ w : ndarray
888
+ The window, with the maximum value normalized to 1 (though the value 1
889
+ does not appear if `M` is even and `sym` is True).
890
+
891
+ References
892
+ ----------
893
+ .. [1] Harris, Fredric J. (Jan 1978). "On the use of Windows for Harmonic
894
+ Analysis with the Discrete Fourier Transform". Proceedings of the
895
+ IEEE 66 (1): 51-83. :doi:`10.1109/PROC.1978.10837`
896
+ .. [2] Wikipedia, "Window function",
897
+ https://en.wikipedia.org/wiki/Window_function#Tukey_window
898
+
899
+ Examples
900
+ --------
901
+ Plot the window and its frequency response:
902
+
903
+ >>> import numpy as np
904
+ >>> from scipy import signal
905
+ >>> from scipy.fft import fft, fftshift
906
+ >>> import matplotlib.pyplot as plt
907
+
908
+ >>> window = signal.windows.tukey(51)
909
+ >>> plt.plot(window)
910
+ >>> plt.title("Tukey window")
911
+ >>> plt.ylabel("Amplitude")
912
+ >>> plt.xlabel("Sample")
913
+ >>> plt.ylim([0, 1.1])
914
+
915
+ >>> plt.figure()
916
+ >>> A = fft(window, 2048) / (len(window)/2.0)
917
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
918
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
919
+ >>> plt.plot(freq, response)
920
+ >>> plt.axis([-0.5, 0.5, -120, 0])
921
+ >>> plt.title("Frequency response of the Tukey window")
922
+ >>> plt.ylabel("Normalized magnitude [dB]")
923
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
924
+
925
+ """
926
+ xp = _namespace(xp)
927
+
928
+ if _len_guards(M):
929
+ return xp.ones(M, dtype=xp.float64, device=device)
930
+
931
+ if alpha <= 0:
932
+ return xp.ones(M, dtype=xp.float64, device=device)
933
+ elif alpha >= 1.0:
934
+ return hann(M, sym=sym, xp=xp, device=device)
935
+
936
+ M, needs_trunc = _extend(M, sym)
937
+
938
+ n = xp.arange(0, M, dtype=xp.float64, device=device)
939
+ width = int(math.floor(alpha*(M-1)/2.0))
940
+ n1 = n[0:width+1]
941
+ n2 = n[width+1:M-width-1]
942
+ n3 = n[M-width-1:]
943
+
944
+ w1 = 0.5 * (1 + xp.cos(xp.pi * (-1 + 2.0*n1/alpha/(M-1))))
945
+ w2 = xp.ones(n2.shape, device=device)
946
+ w3 = 0.5 * (1 + xp.cos(xp.pi * (-2.0/alpha + 1 + 2.0*n3/alpha/(M-1))))
947
+
948
+ w = xp.concat((w1, w2, w3))
949
+
950
+ return _truncate(w, needs_trunc)
951
+
952
+
953
+ def barthann(M, sym=True, *, xp=None, device=None):
954
+ """Return a modified Bartlett-Hann window.
955
+
956
+ Parameters
957
+ ----------
958
+ M : int
959
+ Number of points in the output window. If zero, an empty array
960
+ is returned. An exception is thrown when it is negative.
961
+ sym : bool, optional
962
+ When True (default), generates a symmetric window, for use in filter
963
+ design.
964
+ When False, generates a periodic window, for use in spectral analysis.
965
+ %(xp_device_snippet)s
966
+
967
+ Returns
968
+ -------
969
+ w : ndarray
970
+ The window, with the maximum value normalized to 1 (though the value 1
971
+ does not appear if `M` is even and `sym` is True).
972
+
973
+ Examples
974
+ --------
975
+ Plot the window and its frequency response:
976
+
977
+ >>> import numpy as np
978
+ >>> from scipy import signal
979
+ >>> from scipy.fft import fft, fftshift
980
+ >>> import matplotlib.pyplot as plt
981
+
982
+ >>> window = signal.windows.barthann(51)
983
+ >>> plt.plot(window)
984
+ >>> plt.title("Bartlett-Hann window")
985
+ >>> plt.ylabel("Amplitude")
986
+ >>> plt.xlabel("Sample")
987
+
988
+ >>> plt.figure()
989
+ >>> A = fft(window, 2048) / (len(window)/2.0)
990
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
991
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
992
+ >>> plt.plot(freq, response)
993
+ >>> plt.axis([-0.5, 0.5, -120, 0])
994
+ >>> plt.title("Frequency response of the Bartlett-Hann window")
995
+ >>> plt.ylabel("Normalized magnitude [dB]")
996
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
997
+
998
+ """
999
+ xp = _namespace(xp)
1000
+
1001
+ if _len_guards(M):
1002
+ return xp.ones(M, dtype=xp.float64, device=device)
1003
+ M, needs_trunc = _extend(M, sym)
1004
+
1005
+ n = xp.arange(0, M, dtype=xp.float64, device=device)
1006
+ fac = abs(n / (M - 1.0) - 0.5)
1007
+ w = 0.62 - 0.48 * fac + 0.38 * xp.cos(2 * xp.pi * fac)
1008
+
1009
+ return _truncate(w, needs_trunc)
1010
+
1011
+
1012
+ def general_hamming(M, alpha, sym=True, *, xp=None, device=None):
1013
+ r"""Return a generalized Hamming window.
1014
+
1015
+ The generalized Hamming window is constructed by multiplying a rectangular
1016
+ window by one period of a cosine function [1]_.
1017
+
1018
+ Parameters
1019
+ ----------
1020
+ M : int
1021
+ Number of points in the output window. If zero, an empty array
1022
+ is returned. An exception is thrown when it is negative.
1023
+ alpha : float
1024
+ The window coefficient, :math:`\alpha`
1025
+ sym : bool, optional
1026
+ When True (default), generates a symmetric window, for use in filter
1027
+ design.
1028
+ When False, generates a periodic window, for use in spectral analysis.
1029
+ %(xp_device_snippet)s
1030
+
1031
+ Returns
1032
+ -------
1033
+ w : ndarray
1034
+ The window, with the maximum value normalized to 1 (though the value 1
1035
+ does not appear if `M` is even and `sym` is True).
1036
+
1037
+ See Also
1038
+ --------
1039
+ hamming, hann
1040
+
1041
+ Notes
1042
+ -----
1043
+ The generalized Hamming window is defined as
1044
+
1045
+ .. math:: w(n) = \alpha - \left(1 - \alpha\right)
1046
+ \cos\left(\frac{2\pi{n}}{M-1}\right) \qquad 0 \leq n \leq M-1
1047
+
1048
+ Both the common Hamming window and Hann window are special cases of the
1049
+ generalized Hamming window with :math:`\alpha` = 0.54 and :math:`\alpha` =
1050
+ 0.5, respectively [2]_.
1051
+
1052
+ References
1053
+ ----------
1054
+ .. [1] DSPRelated, "Generalized Hamming Window Family",
1055
+ https://www.dsprelated.com/freebooks/sasp/Generalized_Hamming_Window_Family.html
1056
+ .. [2] Wikipedia, "Window function",
1057
+ https://en.wikipedia.org/wiki/Window_function
1058
+ .. [3] Riccardo Piantanida ESA, "Sentinel-1 Level 1 Detailed Algorithm
1059
+ Definition",
1060
+ https://sentinel.esa.int/documents/247904/1877131/Sentinel-1-Level-1-Detailed-Algorithm-Definition
1061
+ .. [4] Matthieu Bourbigot ESA, "Sentinel-1 Product Definition",
1062
+ https://sentinel.esa.int/documents/247904/1877131/Sentinel-1-Product-Definition
1063
+
1064
+ Examples
1065
+ --------
1066
+ The Sentinel-1A/B Instrument Processing Facility uses generalized Hamming
1067
+ windows in the processing of spaceborne Synthetic Aperture Radar (SAR)
1068
+ data [3]_. The facility uses various values for the :math:`\alpha`
1069
+ parameter based on operating mode of the SAR instrument. Some common
1070
+ :math:`\alpha` values include 0.75, 0.7 and 0.52 [4]_. As an example, we
1071
+ plot these different windows.
1072
+
1073
+ >>> import numpy as np
1074
+ >>> from scipy.signal.windows import general_hamming
1075
+ >>> from scipy.fft import fft, fftshift
1076
+ >>> import matplotlib.pyplot as plt
1077
+
1078
+ >>> fig1, spatial_plot = plt.subplots()
1079
+ >>> spatial_plot.set_title("Generalized Hamming Windows")
1080
+ >>> spatial_plot.set_ylabel("Amplitude")
1081
+ >>> spatial_plot.set_xlabel("Sample")
1082
+
1083
+ >>> fig2, freq_plot = plt.subplots()
1084
+ >>> freq_plot.set_title("Frequency Responses")
1085
+ >>> freq_plot.set_ylabel("Normalized magnitude [dB]")
1086
+ >>> freq_plot.set_xlabel("Normalized frequency [cycles per sample]")
1087
+
1088
+ >>> for alpha in [0.75, 0.7, 0.52]:
1089
+ ... window = general_hamming(41, alpha)
1090
+ ... spatial_plot.plot(window, label="{:.2f}".format(alpha))
1091
+ ... A = fft(window, 2048) / (len(window)/2.0)
1092
+ ... freq = np.linspace(-0.5, 0.5, len(A))
1093
+ ... response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
1094
+ ... freq_plot.plot(freq, response, label="{:.2f}".format(alpha))
1095
+ >>> freq_plot.legend(loc="upper right")
1096
+ >>> spatial_plot.legend(loc="upper right")
1097
+
1098
+ """
1099
+ xp = _namespace(xp)
1100
+ a = xp.asarray([alpha, 1. - alpha], dtype=xp.float64, device=device)
1101
+ device = xp_device(a)
1102
+ return _general_cosine_impl(M, a, xp, device, sym=sym)
1103
+
1104
+
1105
+ def hamming(M, sym=True, *, xp=None, device=None):
1106
+ r"""Return a Hamming window.
1107
+
1108
+ The Hamming window is a taper formed by using a raised cosine with
1109
+ non-zero endpoints, optimized to minimize the nearest side lobe.
1110
+
1111
+ Parameters
1112
+ ----------
1113
+ M : int
1114
+ Number of points in the output window. If zero, an empty array
1115
+ is returned. An exception is thrown when it is negative.
1116
+ sym : bool, optional
1117
+ When True (default), generates a symmetric window, for use in filter
1118
+ design.
1119
+ When False, generates a periodic window, for use in spectral analysis.
1120
+ %(xp_device_snippet)s
1121
+
1122
+ Returns
1123
+ -------
1124
+ w : ndarray
1125
+ The window, with the maximum value normalized to 1 (though the value 1
1126
+ does not appear if `M` is even and `sym` is True).
1127
+
1128
+ Notes
1129
+ -----
1130
+ The Hamming window is defined as
1131
+
1132
+ .. math:: w(n) = 0.54 - 0.46 \cos\left(\frac{2\pi{n}}{M-1}\right)
1133
+ \qquad 0 \leq n \leq M-1
1134
+
1135
+ The Hamming was named for R. W. Hamming, an associate of J. W. Tukey and
1136
+ is described in Blackman and Tukey. It was recommended for smoothing the
1137
+ truncated autocovariance function in the time domain.
1138
+ Most references to the Hamming window come from the signal processing
1139
+ literature, where it is used as one of many windowing functions for
1140
+ smoothing values. It is also known as an apodization (which means
1141
+ "removing the foot", i.e. smoothing discontinuities at the beginning
1142
+ and end of the sampled signal) or tapering function.
1143
+
1144
+ References
1145
+ ----------
1146
+ .. [1] Blackman, R.B. and Tukey, J.W., (1958) The measurement of power
1147
+ spectra, Dover Publications, New York.
1148
+ .. [2] E.R. Kanasewich, "Time Sequence Analysis in Geophysics", The
1149
+ University of Alberta Press, 1975, pp. 109-110.
1150
+ .. [3] Wikipedia, "Window function",
1151
+ https://en.wikipedia.org/wiki/Window_function
1152
+ .. [4] W.H. Press, B.P. Flannery, S.A. Teukolsky, and W.T. Vetterling,
1153
+ "Numerical Recipes", Cambridge University Press, 1986, page 425.
1154
+
1155
+ Examples
1156
+ --------
1157
+ Plot the window and its frequency response:
1158
+
1159
+ >>> import numpy as np
1160
+ >>> from scipy import signal
1161
+ >>> from scipy.fft import fft, fftshift
1162
+ >>> import matplotlib.pyplot as plt
1163
+
1164
+ >>> window = signal.windows.hamming(51)
1165
+ >>> plt.plot(window)
1166
+ >>> plt.title("Hamming window")
1167
+ >>> plt.ylabel("Amplitude")
1168
+ >>> plt.xlabel("Sample")
1169
+
1170
+ >>> plt.figure()
1171
+ >>> A = fft(window, 2048) / (len(window)/2.0)
1172
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
1173
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
1174
+ >>> plt.plot(freq, response)
1175
+ >>> plt.axis([-0.5, 0.5, -120, 0])
1176
+ >>> plt.title("Frequency response of the Hamming window")
1177
+ >>> plt.ylabel("Normalized magnitude [dB]")
1178
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
1179
+
1180
+ """
1181
+ # Docstring adapted from NumPy's hamming function
1182
+ return general_hamming(M, 0.54, sym, xp=xp, device=device)
1183
+
1184
+
1185
+ def kaiser(M, beta, sym=True, *, xp=None, device=None):
1186
+ r"""Return a Kaiser window.
1187
+
1188
+ The Kaiser window is a taper formed by using a Bessel function.
1189
+
1190
+ Parameters
1191
+ ----------
1192
+ M : int
1193
+ Number of points in the output window. If zero, an empty array
1194
+ is returned. An exception is thrown when it is negative.
1195
+ beta : float
1196
+ Shape parameter, determines trade-off between main-lobe width and
1197
+ side lobe level. As beta gets large, the window narrows.
1198
+ sym : bool, optional
1199
+ When True (default), generates a symmetric window, for use in filter
1200
+ design.
1201
+ When False, generates a periodic window, for use in spectral analysis.
1202
+ %(xp_device_snippet)s
1203
+
1204
+ Returns
1205
+ -------
1206
+ w : ndarray
1207
+ The window, with the maximum value normalized to 1 (though the value 1
1208
+ does not appear if `M` is even and `sym` is True).
1209
+
1210
+ Notes
1211
+ -----
1212
+ The Kaiser window is defined as
1213
+
1214
+ .. math:: w(n) = I_0\left( \beta \sqrt{1-\frac{4n^2}{(M-1)^2}}
1215
+ \right)/I_0(\beta)
1216
+
1217
+ with
1218
+
1219
+ .. math:: \quad -\frac{M-1}{2} \leq n \leq \frac{M-1}{2},
1220
+
1221
+ where :math:`I_0` is the modified zeroth-order Bessel function.
1222
+
1223
+ The Kaiser was named for Jim Kaiser, who discovered a simple approximation
1224
+ to the DPSS window based on Bessel functions.
1225
+ The Kaiser window is a very good approximation to the discrete prolate
1226
+ spheroidal sequence, or Slepian window, which is the transform which
1227
+ maximizes the energy in the main lobe of the window relative to total
1228
+ energy.
1229
+
1230
+ The Kaiser can approximate other windows by varying the beta parameter.
1231
+ (Some literature uses alpha = beta/pi.) [4]_
1232
+
1233
+ ==== =======================
1234
+ beta Window shape
1235
+ ==== =======================
1236
+ 0 Rectangular
1237
+ 5 Similar to a Hamming
1238
+ 6 Similar to a Hann
1239
+ 8.6 Similar to a Blackman
1240
+ ==== =======================
1241
+
1242
+ A beta value of 14 is probably a good starting point. Note that as beta
1243
+ gets large, the window narrows, and so the number of samples needs to be
1244
+ large enough to sample the increasingly narrow spike, otherwise NaNs will
1245
+ be returned.
1246
+
1247
+ Most references to the Kaiser window come from the signal processing
1248
+ literature, where it is used as one of many windowing functions for
1249
+ smoothing values. It is also known as an apodization (which means
1250
+ "removing the foot", i.e. smoothing discontinuities at the beginning
1251
+ and end of the sampled signal) or tapering function.
1252
+
1253
+ References
1254
+ ----------
1255
+ .. [1] J. F. Kaiser, "Digital Filters" - Ch 7 in "Systems analysis by
1256
+ digital computer", Editors: F.F. Kuo and J.F. Kaiser, p 218-285.
1257
+ John Wiley and Sons, New York, (1966).
1258
+ .. [2] E.R. Kanasewich, "Time Sequence Analysis in Geophysics", The
1259
+ University of Alberta Press, 1975, pp. 177-178.
1260
+ .. [3] Wikipedia, "Window function",
1261
+ https://en.wikipedia.org/wiki/Window_function
1262
+ .. [4] F. J. Harris, "On the use of windows for harmonic analysis with the
1263
+ discrete Fourier transform," Proceedings of the IEEE, vol. 66,
1264
+ no. 1, pp. 51-83, Jan. 1978. :doi:`10.1109/PROC.1978.10837`.
1265
+
1266
+ Examples
1267
+ --------
1268
+ Plot the window and its frequency response:
1269
+
1270
+ >>> import numpy as np
1271
+ >>> from scipy import signal
1272
+ >>> from scipy.fft import fft, fftshift
1273
+ >>> import matplotlib.pyplot as plt
1274
+
1275
+ >>> window = signal.windows.kaiser(51, beta=14)
1276
+ >>> plt.plot(window)
1277
+ >>> plt.title(r"Kaiser window ($\beta$=14)")
1278
+ >>> plt.ylabel("Amplitude")
1279
+ >>> plt.xlabel("Sample")
1280
+
1281
+ >>> plt.figure()
1282
+ >>> A = fft(window, 2048) / (len(window)/2.0)
1283
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
1284
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
1285
+ >>> plt.plot(freq, response)
1286
+ >>> plt.axis([-0.5, 0.5, -120, 0])
1287
+ >>> plt.title(r"Frequency response of the Kaiser window ($\beta$=14)")
1288
+ >>> plt.ylabel("Normalized magnitude [dB]")
1289
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
1290
+
1291
+ """
1292
+ xp = _namespace(xp)
1293
+
1294
+ # Docstring adapted from NumPy's kaiser function
1295
+ if _len_guards(M):
1296
+ return xp.ones(M, dtype=xp.float64, device=device)
1297
+ M, needs_trunc = _extend(M, sym)
1298
+
1299
+ n = xp.arange(0, M, dtype=xp.float64, device=device)
1300
+ alpha = (M - 1) / 2.0
1301
+ w = (special.i0(beta * xp.sqrt(1 - ((n - alpha) / alpha) ** 2.0)) /
1302
+ special.i0(xp.asarray(beta, dtype=xp.float64)))
1303
+
1304
+ return _truncate(w, needs_trunc)
1305
+
1306
+
1307
+ def kaiser_bessel_derived(M, beta, *, sym=True, xp=None, device=None):
1308
+ """Return a Kaiser-Bessel derived window.
1309
+
1310
+ Parameters
1311
+ ----------
1312
+ M : int
1313
+ Number of points in the output window. If zero, an empty array
1314
+ is returned. An exception is thrown when it is negative.
1315
+ Note that this window is only defined for an even
1316
+ number of points.
1317
+ beta : float
1318
+ Kaiser window shape parameter.
1319
+ sym : bool, optional
1320
+ This parameter only exists to comply with the interface offered by
1321
+ the other window functions and to be callable by `get_window`.
1322
+ When True (default), generates a symmetric window, for use in filter
1323
+ design.
1324
+ %(xp_device_snippet)s
1325
+
1326
+ Returns
1327
+ -------
1328
+ w : ndarray
1329
+ The window, normalized to fulfil the Princen-Bradley condition.
1330
+
1331
+ See Also
1332
+ --------
1333
+ kaiser
1334
+
1335
+ Notes
1336
+ -----
1337
+ It is designed to be suitable for use with the modified discrete cosine
1338
+ transform (MDCT) and is mainly used in audio signal processing and
1339
+ audio coding.
1340
+
1341
+ .. versionadded:: 1.9.0
1342
+
1343
+ References
1344
+ ----------
1345
+ .. [1] Bosi, Marina, and Richard E. Goldberg. Introduction to Digital
1346
+ Audio Coding and Standards. Dordrecht: Kluwer, 2003.
1347
+ .. [2] Wikipedia, "Kaiser window",
1348
+ https://en.wikipedia.org/wiki/Kaiser_window
1349
+
1350
+ Examples
1351
+ --------
1352
+ Plot the Kaiser-Bessel derived window based on the wikipedia
1353
+ reference [2]_:
1354
+
1355
+ >>> import numpy as np
1356
+ >>> from scipy import signal
1357
+ >>> import matplotlib.pyplot as plt
1358
+ >>> fig, ax = plt.subplots()
1359
+ >>> N = 50
1360
+ >>> for alpha in [0.64, 2.55, 7.64, 31.83]:
1361
+ ... ax.plot(signal.windows.kaiser_bessel_derived(2*N, np.pi*alpha),
1362
+ ... label=f"{alpha=}")
1363
+ >>> ax.grid(True)
1364
+ >>> ax.set_title("Kaiser-Bessel derived window")
1365
+ >>> ax.set_ylabel("Amplitude")
1366
+ >>> ax.set_xlabel("Sample")
1367
+ >>> ax.set_xticks([0, N, 2*N-1])
1368
+ >>> ax.set_xticklabels(["0", "N", "2N+1"]) # doctest: +SKIP
1369
+ >>> ax.set_yticks([0.0, 0.2, 0.4, 0.6, 0.707, 0.8, 1.0])
1370
+ >>> fig.legend(loc="center")
1371
+ >>> fig.tight_layout()
1372
+ >>> fig.show()
1373
+ """
1374
+ xp = _namespace(xp)
1375
+
1376
+ if not sym:
1377
+ raise ValueError(
1378
+ "Kaiser-Bessel Derived windows are only defined for symmetric "
1379
+ "shapes"
1380
+ )
1381
+ elif M < 1:
1382
+ return xp.asarray([])
1383
+ elif M % 2:
1384
+ raise ValueError(
1385
+ "Kaiser-Bessel Derived windows are only defined for even number "
1386
+ "of points"
1387
+ )
1388
+
1389
+ kaiser_window = kaiser(M // 2 + 1, beta, xp=xp, device=device)
1390
+ csum = xp.cumulative_sum(kaiser_window)
1391
+ half_window = xp.sqrt(csum[:-1] / csum[-1])
1392
+ w = xp.concat((half_window, xp.flip(half_window)), axis=0)
1393
+ return xp.asarray(w, device=device)
1394
+
1395
+
1396
+ def gaussian(M, std, sym=True, *, xp=None, device=None):
1397
+ r"""Return a Gaussian window.
1398
+
1399
+ Parameters
1400
+ ----------
1401
+ M : int
1402
+ Number of points in the output window. If zero, an empty array
1403
+ is returned. An exception is thrown when it is negative.
1404
+ std : float
1405
+ The standard deviation, sigma.
1406
+ sym : bool, optional
1407
+ When True (default), generates a symmetric window, for use in filter
1408
+ design.
1409
+ When False, generates a periodic window, for use in spectral analysis.
1410
+ %(xp_device_snippet)s
1411
+
1412
+ Returns
1413
+ -------
1414
+ w : ndarray
1415
+ The window, with the maximum value normalized to 1 (though the value 1
1416
+ does not appear if `M` is even and `sym` is True).
1417
+
1418
+ Notes
1419
+ -----
1420
+ The Gaussian window is defined as
1421
+
1422
+ .. math:: w(n) = e^{ -\frac{1}{2}\left(\frac{n}{\sigma}\right)^2 }
1423
+
1424
+ Examples
1425
+ --------
1426
+ Plot the window and its frequency response:
1427
+
1428
+ >>> import numpy as np
1429
+ >>> from scipy import signal
1430
+ >>> from scipy.fft import fft, fftshift
1431
+ >>> import matplotlib.pyplot as plt
1432
+
1433
+ >>> window = signal.windows.gaussian(51, std=7)
1434
+ >>> plt.plot(window)
1435
+ >>> plt.title(r"Gaussian window ($\sigma$=7)")
1436
+ >>> plt.ylabel("Amplitude")
1437
+ >>> plt.xlabel("Sample")
1438
+
1439
+ >>> plt.figure()
1440
+ >>> A = fft(window, 2048) / (len(window)/2.0)
1441
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
1442
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
1443
+ >>> plt.plot(freq, response)
1444
+ >>> plt.axis([-0.5, 0.5, -120, 0])
1445
+ >>> plt.title(r"Frequency response of the Gaussian window ($\sigma$=7)")
1446
+ >>> plt.ylabel("Normalized magnitude [dB]")
1447
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
1448
+
1449
+ """
1450
+ xp = _namespace(xp)
1451
+
1452
+ if _len_guards(M):
1453
+ return xp.ones(M, dtype=xp.float64, device=device)
1454
+ M, needs_trunc = _extend(M, sym)
1455
+
1456
+ n = xp.arange(0, M, dtype=xp.float64, device=device) - (M - 1.0) / 2.0
1457
+ sig2 = 2 * std * std
1458
+ w = xp.exp(-n ** 2 / sig2)
1459
+
1460
+ return _truncate(w, needs_trunc)
1461
+
1462
+
1463
+ def general_gaussian(M, p, sig, sym=True, *, xp=None, device=None):
1464
+ r"""Return a window with a generalized Gaussian shape.
1465
+
1466
+ Parameters
1467
+ ----------
1468
+ M : int
1469
+ Number of points in the output window. If zero, an empty array
1470
+ is returned. An exception is thrown when it is negative.
1471
+ p : float
1472
+ Shape parameter. p = 1 is identical to `gaussian`, p = 0.5 is
1473
+ the same shape as the Laplace distribution.
1474
+ sig : float
1475
+ The standard deviation, sigma.
1476
+ sym : bool, optional
1477
+ When True (default), generates a symmetric window, for use in filter
1478
+ design.
1479
+ When False, generates a periodic window, for use in spectral analysis.
1480
+ %(xp_device_snippet)s
1481
+
1482
+ Returns
1483
+ -------
1484
+ w : ndarray
1485
+ The window, with the maximum value normalized to 1 (though the value 1
1486
+ does not appear if `M` is even and `sym` is True).
1487
+
1488
+ Notes
1489
+ -----
1490
+ The generalized Gaussian window is defined as
1491
+
1492
+ .. math:: w(n) = e^{ -\frac{1}{2}\left|\frac{n}{\sigma}\right|^{2p} }
1493
+
1494
+ the half-power point is at
1495
+
1496
+ .. math:: (2 \log(2))^{1/(2 p)} \sigma
1497
+
1498
+ Examples
1499
+ --------
1500
+ Plot the window and its frequency response:
1501
+
1502
+ >>> import numpy as np
1503
+ >>> from scipy import signal
1504
+ >>> from scipy.fft import fft, fftshift
1505
+ >>> import matplotlib.pyplot as plt
1506
+
1507
+ >>> window = signal.windows.general_gaussian(51, p=1.5, sig=7)
1508
+ >>> plt.plot(window)
1509
+ >>> plt.title(r"Generalized Gaussian window (p=1.5, $\sigma$=7)")
1510
+ >>> plt.ylabel("Amplitude")
1511
+ >>> plt.xlabel("Sample")
1512
+
1513
+ >>> plt.figure()
1514
+ >>> A = fft(window, 2048) / (len(window)/2.0)
1515
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
1516
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
1517
+ >>> plt.plot(freq, response)
1518
+ >>> plt.axis([-0.5, 0.5, -120, 0])
1519
+ >>> plt.title(r"Freq. resp. of the gen. Gaussian "
1520
+ ... r"window (p=1.5, $\sigma$=7)")
1521
+ >>> plt.ylabel("Normalized magnitude [dB]")
1522
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
1523
+
1524
+ """
1525
+ xp = _namespace(xp)
1526
+
1527
+ if _len_guards(M):
1528
+ return xp.ones(M, dtype=xp.float64, device=device)
1529
+ M, needs_trunc = _extend(M, sym)
1530
+
1531
+ n = xp.arange(0, M, dtype=xp.float64, device=device) - (M - 1.0) / 2.0
1532
+ w = xp.exp(-0.5 * abs(n / sig) ** (2 * p))
1533
+
1534
+ return _truncate(w, needs_trunc)
1535
+
1536
+
1537
+ # `chebwin` contributed by Kumar Appaiah.
1538
+ def chebwin(M, at, sym=True, *, xp=None, device=None):
1539
+ r"""Return a Dolph-Chebyshev window.
1540
+
1541
+ Parameters
1542
+ ----------
1543
+ M : int
1544
+ Number of points in the output window. If zero, an empty array
1545
+ is returned. An exception is thrown when it is negative.
1546
+ at : float
1547
+ Attenuation (in dB).
1548
+ sym : bool, optional
1549
+ When True (default), generates a symmetric window, for use in filter
1550
+ design.
1551
+ When False, generates a periodic window, for use in spectral analysis.
1552
+ %(xp_device_snippet)s
1553
+
1554
+ Returns
1555
+ -------
1556
+ w : ndarray
1557
+ The window, with the maximum value always normalized to 1
1558
+
1559
+ Notes
1560
+ -----
1561
+ This window optimizes for the narrowest main lobe width for a given order
1562
+ `M` and sidelobe equiripple attenuation `at`, using Chebyshev
1563
+ polynomials. It was originally developed by Dolph to optimize the
1564
+ directionality of radio antenna arrays.
1565
+
1566
+ Unlike most windows, the Dolph-Chebyshev is defined in terms of its
1567
+ frequency response:
1568
+
1569
+ .. math:: W(k) = \frac
1570
+ {\cos\{M \cos^{-1}[\beta \cos(\frac{\pi k}{M})]\}}
1571
+ {\cosh[M \cosh^{-1}(\beta)]}
1572
+
1573
+ where
1574
+
1575
+ .. math:: \beta = \cosh \left [\frac{1}{M}
1576
+ \cosh^{-1}(10^\frac{A}{20}) \right ]
1577
+
1578
+ and 0 <= abs(k) <= M-1. A is the attenuation in decibels (`at`).
1579
+
1580
+ The time domain window is then generated using the IFFT, so
1581
+ power-of-two `M` are the fastest to generate, and prime number `M` are
1582
+ the slowest.
1583
+
1584
+ The equiripple condition in the frequency domain creates impulses in the
1585
+ time domain, which appear at the ends of the window.
1586
+
1587
+ References
1588
+ ----------
1589
+ .. [1] C. Dolph, "A current distribution for broadside arrays which
1590
+ optimizes the relationship between beam width and side-lobe level",
1591
+ Proceedings of the IEEE, Vol. 34, Issue 6
1592
+ .. [2] Peter Lynch, "The Dolph-Chebyshev Window: A Simple Optimal Filter",
1593
+ American Meteorological Society (April 1997)
1594
+ http://mathsci.ucd.ie/~plynch/Publications/Dolph.pdf
1595
+ .. [3] F. J. Harris, "On the use of windows for harmonic analysis with the
1596
+ discrete Fourier transforms", Proceedings of the IEEE, Vol. 66,
1597
+ No. 1, January 1978
1598
+
1599
+ Examples
1600
+ --------
1601
+ Plot the window and its frequency response:
1602
+
1603
+ >>> import numpy as np
1604
+ >>> from scipy import signal
1605
+ >>> from scipy.fft import fft, fftshift
1606
+ >>> import matplotlib.pyplot as plt
1607
+
1608
+ >>> window = signal.windows.chebwin(51, at=100)
1609
+ >>> plt.plot(window)
1610
+ >>> plt.title("Dolph-Chebyshev window (100 dB)")
1611
+ >>> plt.ylabel("Amplitude")
1612
+ >>> plt.xlabel("Sample")
1613
+
1614
+ >>> plt.figure()
1615
+ >>> A = fft(window, 2048) / (len(window)/2.0)
1616
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
1617
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
1618
+ >>> plt.plot(freq, response)
1619
+ >>> plt.axis([-0.5, 0.5, -120, 0])
1620
+ >>> plt.title("Frequency response of the Dolph-Chebyshev window (100 dB)")
1621
+ >>> plt.ylabel("Normalized magnitude [dB]")
1622
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
1623
+
1624
+ """
1625
+ xp = _namespace(xp)
1626
+
1627
+ if abs(at) < 45:
1628
+ warnings.warn("This window is not suitable for spectral analysis "
1629
+ "for attenuation values lower than about 45dB because "
1630
+ "the equivalent noise bandwidth of a Chebyshev window "
1631
+ "does not grow monotonically with increasing sidelobe "
1632
+ "attenuation when the attenuation is smaller than "
1633
+ "about 45 dB.",
1634
+ stacklevel=2)
1635
+ if _len_guards(M):
1636
+ return xp.ones(M, dtype=xp.float64, device=device)
1637
+ M, needs_trunc = _extend(M, sym)
1638
+
1639
+ # compute the parameter beta
1640
+ order = M - 1.0
1641
+ _val = xp.asarray(10 ** (abs(at) / 20.), dtype=xp.float64, device=device)
1642
+ beta = xp.cosh(1.0 / order * xp.acosh(_val))
1643
+ k = xp.arange(M, dtype=xp.float64, device=device)
1644
+ x = beta * xp.cos(xp.pi * k / M)
1645
+ # Find the window's DFT coefficients
1646
+ # Use analytic definition of Chebyshev polynomial instead of expansion
1647
+ # from scipy.special. Using the expansion in scipy.special leads to errors.
1648
+ p = xp.zeros_like(x)
1649
+ p[x > 1] = xp.cosh(order * xp.acosh(x[x > 1]))
1650
+ p[x < -1] = (2 * (M % 2) - 1) * xp.cosh(order * xp.acosh(-x[x < -1]))
1651
+ p[abs(x) <= 1] = xp.cos(order * xp.acos(x[abs(x) <= 1]))
1652
+
1653
+ # Appropriate IDFT and filling up
1654
+ # depending on even/odd M
1655
+ if M % 2:
1656
+ w = xp.real(sp_fft.fft(p))
1657
+ n = (M + 1) // 2
1658
+ w = w[:n]
1659
+ w = xp.concat((xp.flip(w[1:n]), w))
1660
+ else:
1661
+ p = p * xp.exp(1j * xp.pi / M * xp.arange(M, dtype=xp.float64, device=device))
1662
+ w = xp.real(sp_fft.fft(p))
1663
+ n = M // 2 + 1
1664
+ w = xp.concat((xp.flip(w[1:n]), w[1:n]))
1665
+ w = w / xp.max(w)
1666
+
1667
+ return _truncate(w, needs_trunc)
1668
+
1669
+
1670
+ def cosine(M, sym=True, *, xp=None, device=None):
1671
+ """Return a window with a simple cosine shape.
1672
+
1673
+ Parameters
1674
+ ----------
1675
+ M : int
1676
+ Number of points in the output window. If zero, an empty array
1677
+ is returned. An exception is thrown when it is negative.
1678
+ sym : bool, optional
1679
+ When True (default), generates a symmetric window, for use in filter
1680
+ design.
1681
+ When False, generates a periodic window, for use in spectral analysis.
1682
+ %(xp_device_snippet)s
1683
+
1684
+ Returns
1685
+ -------
1686
+ w : ndarray
1687
+ The window, with the maximum value normalized to 1 (though the value 1
1688
+ does not appear if `M` is even and `sym` is True).
1689
+
1690
+ Notes
1691
+ -----
1692
+
1693
+ .. versionadded:: 0.13.0
1694
+
1695
+ Examples
1696
+ --------
1697
+ Plot the window and its frequency response:
1698
+
1699
+ >>> import numpy as np
1700
+ >>> from scipy import signal
1701
+ >>> from scipy.fft import fft, fftshift
1702
+ >>> import matplotlib.pyplot as plt
1703
+
1704
+ >>> window = signal.windows.cosine(51)
1705
+ >>> plt.plot(window)
1706
+ >>> plt.title("Cosine window")
1707
+ >>> plt.ylabel("Amplitude")
1708
+ >>> plt.xlabel("Sample")
1709
+
1710
+ >>> plt.figure()
1711
+ >>> A = fft(window, 2047) / (len(window)/2.0)
1712
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
1713
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
1714
+ >>> plt.plot(freq, response)
1715
+ >>> plt.axis([-0.5, 0.5, -120, 0])
1716
+ >>> plt.title("Frequency response of the cosine window")
1717
+ >>> plt.ylabel("Normalized magnitude [dB]")
1718
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
1719
+ >>> plt.show()
1720
+
1721
+ """
1722
+ xp = _namespace(xp)
1723
+
1724
+ if _len_guards(M):
1725
+ return xp.ones(M, dtype=xp.float64, device=device)
1726
+ M, needs_trunc = _extend(M, sym)
1727
+
1728
+ w = xp.sin(xp.pi / M * (xp.arange(M, dtype=xp.float64, device=device) + .5))
1729
+
1730
+ return _truncate(w, needs_trunc)
1731
+
1732
+
1733
+ def exponential(M, center=None, tau=1., sym=True, *, xp=None, device=None):
1734
+ r"""Return an exponential (or Poisson) window.
1735
+
1736
+ Parameters
1737
+ ----------
1738
+ M : int
1739
+ Number of points in the output window. If zero, an empty array
1740
+ is returned. An exception is thrown when it is negative.
1741
+ center : float, optional
1742
+ Parameter defining the center location of the window function.
1743
+ The default value if not given is ``center = (M-1) / 2``. This
1744
+ parameter must take its default value for symmetric windows.
1745
+ tau : float, optional
1746
+ Parameter defining the decay. For ``center = 0`` use
1747
+ ``tau = -(M-1) / ln(x)`` if ``x`` is the fraction of the window
1748
+ remaining at the end.
1749
+ sym : bool, optional
1750
+ When True (default), generates a symmetric window, for use in filter
1751
+ design.
1752
+ When False, generates a periodic window, for use in spectral analysis.
1753
+ %(xp_device_snippet)s
1754
+
1755
+ Returns
1756
+ -------
1757
+ w : ndarray
1758
+ The window, with the maximum value normalized to 1 (though the value 1
1759
+ does not appear if `M` is even and `sym` is True).
1760
+
1761
+ Notes
1762
+ -----
1763
+ The Exponential window is defined as
1764
+
1765
+ .. math:: w(n) = e^{-|n-center| / \tau}
1766
+
1767
+ References
1768
+ ----------
1769
+ .. [1] S. Gade and H. Herlufsen, "Windows to FFT analysis (Part I)",
1770
+ Technical Review 3, Bruel & Kjaer, 1987.
1771
+
1772
+ Examples
1773
+ --------
1774
+ Plot the symmetric window and its frequency response:
1775
+
1776
+ >>> import numpy as np
1777
+ >>> from scipy import signal
1778
+ >>> from scipy.fft import fft, fftshift
1779
+ >>> import matplotlib.pyplot as plt
1780
+
1781
+ >>> M = 51
1782
+ >>> tau = 3.0
1783
+ >>> window = signal.windows.exponential(M, tau=tau)
1784
+ >>> plt.plot(window)
1785
+ >>> plt.title("Exponential Window (tau=3.0)")
1786
+ >>> plt.ylabel("Amplitude")
1787
+ >>> plt.xlabel("Sample")
1788
+
1789
+ >>> plt.figure()
1790
+ >>> A = fft(window, 2048) / (len(window)/2.0)
1791
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
1792
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
1793
+ >>> plt.plot(freq, response)
1794
+ >>> plt.axis([-0.5, 0.5, -35, 0])
1795
+ >>> plt.title("Frequency response of the Exponential window (tau=3.0)")
1796
+ >>> plt.ylabel("Normalized magnitude [dB]")
1797
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
1798
+
1799
+ This function can also generate non-symmetric windows:
1800
+
1801
+ >>> tau2 = -(M-1) / np.log(0.01)
1802
+ >>> window2 = signal.windows.exponential(M, 0, tau2, False)
1803
+ >>> plt.figure()
1804
+ >>> plt.plot(window2)
1805
+ >>> plt.ylabel("Amplitude")
1806
+ >>> plt.xlabel("Sample")
1807
+ """
1808
+ xp = _namespace(xp)
1809
+
1810
+ if sym and center is not None:
1811
+ raise ValueError("If sym==True, center must be None.")
1812
+ if _len_guards(M):
1813
+ return xp.ones(M, dtype=xp.float64, device=device)
1814
+ M, needs_trunc = _extend(M, sym)
1815
+
1816
+ if center is None:
1817
+ center = (M-1) / 2
1818
+
1819
+ n = xp.arange(0, M, dtype=xp.float64, device=device)
1820
+ w = xp.exp(-abs(n-center) / tau)
1821
+
1822
+ return _truncate(w, needs_trunc)
1823
+
1824
+
1825
+ def taylor(M, nbar=4, sll=30, norm=True, sym=True, *, xp=None, device=None):
1826
+ """
1827
+ Return a Taylor window.
1828
+
1829
+ The Taylor window taper function approximates the Dolph-Chebyshev window's
1830
+ constant sidelobe level for a parameterized number of near-in sidelobes,
1831
+ but then allows a taper beyond [2]_.
1832
+
1833
+ The SAR (synthetic aperture radar) community commonly uses Taylor
1834
+ weighting for image formation processing because it provides strong,
1835
+ selectable sidelobe suppression with minimum broadening of the
1836
+ mainlobe [1]_.
1837
+
1838
+ Parameters
1839
+ ----------
1840
+ M : int
1841
+ Number of points in the output window. If zero, an empty array
1842
+ is returned. An exception is thrown when it is negative.
1843
+ nbar : int, optional
1844
+ Number of nearly constant level sidelobes adjacent to the mainlobe.
1845
+ sll : float, optional
1846
+ Desired suppression of sidelobe level in decibels (dB) relative to the
1847
+ DC gain of the mainlobe. This should be a positive number.
1848
+ norm : bool, optional
1849
+ When True (default), divides the window by the largest (middle) value
1850
+ for odd-length windows or the value that would occur between the two
1851
+ repeated middle values for even-length windows such that all values
1852
+ are less than or equal to 1. When False the DC gain will remain at 1
1853
+ (0 dB) and the sidelobes will be `sll` dB down.
1854
+ sym : bool, optional
1855
+ When True (default), generates a symmetric window, for use in filter
1856
+ design.
1857
+ When False, generates a periodic window, for use in spectral analysis.
1858
+ %(xp_device_snippet)s
1859
+
1860
+ Returns
1861
+ -------
1862
+ out : array
1863
+ The window. When `norm` is True (default), the maximum value is
1864
+ normalized to 1 (though the value 1 does not appear if `M` is
1865
+ even and `sym` is True).
1866
+
1867
+ See Also
1868
+ --------
1869
+ chebwin, kaiser, bartlett, blackman, hamming, hann
1870
+
1871
+ References
1872
+ ----------
1873
+ .. [1] W. Carrara, R. Goodman, and R. Majewski, "Spotlight Synthetic
1874
+ Aperture Radar: Signal Processing Algorithms" Pages 512-513,
1875
+ July 1995.
1876
+ .. [2] Armin Doerry, "Catalog of Window Taper Functions for
1877
+ Sidelobe Control", 2017.
1878
+ https://www.researchgate.net/profile/Armin_Doerry/publication/316281181_Catalog_of_Window_Taper_Functions_for_Sidelobe_Control/links/58f92cb2a6fdccb121c9d54d/Catalog-of-Window-Taper-Functions-for-Sidelobe-Control.pdf
1879
+
1880
+ Examples
1881
+ --------
1882
+ Plot the window and its frequency response:
1883
+
1884
+ >>> import numpy as np
1885
+ >>> from scipy import signal
1886
+ >>> from scipy.fft import fft, fftshift
1887
+ >>> import matplotlib.pyplot as plt
1888
+
1889
+ >>> window = signal.windows.taylor(51, nbar=20, sll=100, norm=False)
1890
+ >>> plt.plot(window)
1891
+ >>> plt.title("Taylor window (100 dB)")
1892
+ >>> plt.ylabel("Amplitude")
1893
+ >>> plt.xlabel("Sample")
1894
+
1895
+ >>> plt.figure()
1896
+ >>> A = fft(window, 2048) / (len(window)/2.0)
1897
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
1898
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
1899
+ >>> plt.plot(freq, response)
1900
+ >>> plt.axis([-0.5, 0.5, -120, 0])
1901
+ >>> plt.title("Frequency response of the Taylor window (100 dB)")
1902
+ >>> plt.ylabel("Normalized magnitude [dB]")
1903
+ >>> plt.xlabel("Normalized frequency [cycles per sample]")
1904
+
1905
+ """ # noqa: E501
1906
+ xp = _namespace(xp)
1907
+
1908
+ if _len_guards(M):
1909
+ return xp.ones(M, dtype=xp.float64, device=device)
1910
+ M, needs_trunc = _extend(M, sym)
1911
+
1912
+ # Original text uses a negative sidelobe level parameter and then negates
1913
+ # it in the calculation of B. To keep consistent with other methods we
1914
+ # assume the sidelobe level parameter to be positive.
1915
+ B = xp.asarray(10**(sll / 20), device=device)
1916
+ A = xp.acosh(B) / xp.pi
1917
+ s2 = nbar**2 / (A**2 + (nbar - 0.5)**2)
1918
+ ma = xp.arange(1, nbar, dtype=xp.float64, device=device)
1919
+
1920
+ Fm = xp.empty(nbar - 1, dtype=xp.float64, device=device)
1921
+ signs = xp.empty_like(ma)
1922
+ signs[::2] = 1
1923
+ signs[1::2] = -1
1924
+ m2 = ma*ma
1925
+ for mi, m in enumerate(ma):
1926
+ numer = signs[mi] * xp.prod(1 - m2[mi]/s2/(A**2 + (ma - 0.5)**2))
1927
+ denom = 2 * xp.prod(1 - m2[mi]/m2[:mi]) * xp.prod(1 - m2[mi]/m2[mi+1:])
1928
+ Fm[mi] = numer / denom
1929
+
1930
+ def W(n):
1931
+ return 1 + 2*xp.matmul(Fm, xp.cos(
1932
+ 2*xp.pi*ma[:, xp.newaxis]*(n-M/2.+0.5)/M))
1933
+
1934
+ w = W(xp.arange(M, dtype=xp.float64, device=device))
1935
+
1936
+ # normalize (Note that this is not described in the original text [1])
1937
+ if norm:
1938
+ scale = 1.0 / W((M - 1) / 2)
1939
+ w *= scale
1940
+
1941
+ return _truncate(w, needs_trunc)
1942
+
1943
+
1944
+ def dpss(M, NW, Kmax=None, sym=True, norm=None, return_ratios=False,
1945
+ *, xp=None, device=None):
1946
+ """
1947
+ Compute the Discrete Prolate Spheroidal Sequences (DPSS).
1948
+
1949
+ DPSS (or Slepian sequences) are often used in multitaper power spectral
1950
+ density estimation (see [1]_). The first window in the sequence can be
1951
+ used to maximize the energy concentration in the main lobe, and is also
1952
+ called the Slepian window.
1953
+
1954
+ Parameters
1955
+ ----------
1956
+ M : int
1957
+ Window length.
1958
+ NW : float
1959
+ Standardized half bandwidth corresponding to ``2*NW = BW/f0 = BW*M*dt``
1960
+ where ``dt`` is taken as 1.
1961
+ Kmax : int | None, optional
1962
+ Number of DPSS windows to return (orders ``0`` through ``Kmax-1``).
1963
+ If None (default), return only a single window of shape ``(M,)``
1964
+ instead of an array of windows of shape ``(Kmax, M)``.
1965
+ sym : bool, optional
1966
+ When True (default), generates a symmetric window, for use in filter
1967
+ design.
1968
+ When False, generates a periodic window, for use in spectral analysis.
1969
+ norm : {2, 'approximate', 'subsample'} | None, optional
1970
+ If 'approximate' or 'subsample', then the windows are normalized by the
1971
+ maximum, and a correction scale-factor for even-length windows
1972
+ is applied either using ``M**2/(M**2+NW)`` ("approximate") or
1973
+ a FFT-based subsample shift ("subsample"), see Notes for details.
1974
+ If None, then "approximate" is used when ``Kmax=None`` and 2 otherwise
1975
+ (which uses the l2 norm).
1976
+ return_ratios : bool, optional
1977
+ If True, also return the concentration ratios in addition to the
1978
+ windows.
1979
+ %(xp_device_snippet)s
1980
+
1981
+ Returns
1982
+ -------
1983
+ v : ndarray, shape (Kmax, M) or (M,)
1984
+ The DPSS windows. Will be 1D if `Kmax` is None.
1985
+ r : ndarray, shape (Kmax,) or float, optional
1986
+ The concentration ratios for the windows. Only returned if
1987
+ `return_ratios` evaluates to True. Will be 0D if `Kmax` is None.
1988
+
1989
+ Notes
1990
+ -----
1991
+ This computation uses the tridiagonal eigenvector formulation given
1992
+ in [2]_.
1993
+
1994
+ The default normalization for ``Kmax=None``, i.e. window-generation mode,
1995
+ simply using the l-infinity norm would create a window with two unity
1996
+ values, which creates slight normalization differences between even and odd
1997
+ orders. The approximate correction of ``M**2/float(M**2+NW)`` for even
1998
+ sample numbers is used to counteract this effect (see Examples below).
1999
+
2000
+ For very long signals (e.g., 1e6 elements), it can be useful to compute
2001
+ windows orders of magnitude shorter and use interpolation (e.g.,
2002
+ `scipy.interpolate.interp1d`) to obtain tapers of length `M`,
2003
+ but this in general will not preserve orthogonality between the tapers.
2004
+
2005
+ .. versionadded:: 1.1
2006
+
2007
+ References
2008
+ ----------
2009
+ .. [1] Percival DB, Walden WT. Spectral Analysis for Physical Applications:
2010
+ Multitaper and Conventional Univariate Techniques.
2011
+ Cambridge University Press; 1993.
2012
+ .. [2] Slepian, D. Prolate spheroidal wave functions, Fourier analysis, and
2013
+ uncertainty V: The discrete case. Bell System Technical Journal,
2014
+ Volume 57 (1978), 1371430.
2015
+ .. [3] Kaiser, JF, Schafer RW. On the Use of the I0-Sinh Window for
2016
+ Spectrum Analysis. IEEE Transactions on Acoustics, Speech and
2017
+ Signal Processing. ASSP-28 (1): 105-107; 1980.
2018
+
2019
+ Examples
2020
+ --------
2021
+ We can compare the window to `kaiser`, which was invented as an alternative
2022
+ that was easier to calculate [3]_ (example adapted from
2023
+ `here <https://ccrma.stanford.edu/~jos/sasp/Kaiser_DPSS_Windows_Compared.html>`_):
2024
+
2025
+ >>> import numpy as np
2026
+ >>> import matplotlib.pyplot as plt
2027
+ >>> from scipy.signal import windows, freqz
2028
+ >>> M = 51
2029
+ >>> fig, axes = plt.subplots(3, 2, figsize=(5, 7))
2030
+ >>> for ai, alpha in enumerate((1, 3, 5)):
2031
+ ... win_dpss = windows.dpss(M, alpha)
2032
+ ... beta = alpha*np.pi
2033
+ ... win_kaiser = windows.kaiser(M, beta)
2034
+ ... for win, c in ((win_dpss, 'k'), (win_kaiser, 'r')):
2035
+ ... win /= win.sum()
2036
+ ... axes[ai, 0].plot(win, color=c, lw=1.)
2037
+ ... axes[ai, 0].set(xlim=[0, M-1], title=rf'$\\alpha$ = {alpha}',
2038
+ ... ylabel='Amplitude')
2039
+ ... w, h = freqz(win)
2040
+ ... axes[ai, 1].plot(w, 20 * np.log10(np.abs(h)), color=c, lw=1.)
2041
+ ... axes[ai, 1].set(xlim=[0, np.pi],
2042
+ ... title=rf'$\\beta$ = {beta:0.2f}',
2043
+ ... ylabel='Magnitude (dB)')
2044
+ >>> for ax in axes.ravel():
2045
+ ... ax.grid(True)
2046
+ >>> axes[2, 1].legend(['DPSS', 'Kaiser'])
2047
+ >>> fig.tight_layout()
2048
+ >>> plt.show()
2049
+
2050
+ And here are examples of the first four windows, along with their
2051
+ concentration ratios:
2052
+
2053
+ >>> M = 512
2054
+ >>> NW = 2.5
2055
+ >>> win, eigvals = windows.dpss(M, NW, 4, return_ratios=True)
2056
+ >>> fig, ax = plt.subplots(1)
2057
+ >>> ax.plot(win.T, linewidth=1.)
2058
+ >>> ax.set(xlim=[0, M-1], ylim=[-0.1, 0.1], xlabel='Samples',
2059
+ ... title=f'DPSS, {M:d}, {NW:0.1f}')
2060
+ >>> ax.legend([f'win[{ii}] ({ratio:0.4f})'
2061
+ ... for ii, ratio in enumerate(eigvals)])
2062
+ >>> fig.tight_layout()
2063
+ >>> plt.show()
2064
+
2065
+ Using a standard :math:`l_{\\infty}` norm would produce two unity values
2066
+ for even `M`, but only one unity value for odd `M`. This produces uneven
2067
+ window power that can be counteracted by the approximate correction
2068
+ ``M**2/float(M**2+NW)``, which can be selected by using
2069
+ ``norm='approximate'`` (which is the same as ``norm=None`` when
2070
+ ``Kmax=None``, as is the case here). Alternatively, the slower
2071
+ ``norm='subsample'`` can be used, which uses subsample shifting in the
2072
+ frequency domain (FFT) to compute the correction:
2073
+
2074
+ >>> Ms = np.arange(1, 41)
2075
+ >>> factors = (50, 20, 10, 5, 2.0001)
2076
+ >>> energy = np.empty((3, len(Ms), len(factors)))
2077
+ >>> for mi, M in enumerate(Ms):
2078
+ ... for fi, factor in enumerate(factors):
2079
+ ... NW = M / float(factor)
2080
+ ... # Corrected using empirical approximation (default)
2081
+ ... win = windows.dpss(M, NW)
2082
+ ... energy[0, mi, fi] = np.sum(win ** 2) / np.sqrt(M)
2083
+ ... # Corrected using subsample shifting
2084
+ ... win = windows.dpss(M, NW, norm='subsample')
2085
+ ... energy[1, mi, fi] = np.sum(win ** 2) / np.sqrt(M)
2086
+ ... # Uncorrected (using l-infinity norm)
2087
+ ... win /= win.max()
2088
+ ... energy[2, mi, fi] = np.sum(win ** 2) / np.sqrt(M)
2089
+ >>> fig, ax = plt.subplots(1)
2090
+ >>> hs = ax.plot(Ms, energy[2], '-o', markersize=4,
2091
+ ... markeredgecolor='none')
2092
+ >>> leg = [hs[-1]]
2093
+ >>> for hi, hh in enumerate(hs):
2094
+ ... h1 = ax.plot(Ms, energy[0, :, hi], '-o', markersize=4,
2095
+ ... color=hh.get_color(), markeredgecolor='none',
2096
+ ... alpha=0.66)
2097
+ ... h2 = ax.plot(Ms, energy[1, :, hi], '-o', markersize=4,
2098
+ ... color=hh.get_color(), markeredgecolor='none',
2099
+ ... alpha=0.33)
2100
+ ... if hi == len(hs) - 1:
2101
+ ... leg.insert(0, h1[0])
2102
+ ... leg.insert(0, h2[0])
2103
+ >>> ax.set(xlabel='M (samples)', ylabel=r'Power / $\\sqrt{M}$')
2104
+ >>> ax.legend(leg, ['Uncorrected', r'Corrected: $\\frac{M^2}{M^2+NW}$',
2105
+ ... 'Corrected (subsample)'])
2106
+ >>> fig.tight_layout()
2107
+
2108
+ """
2109
+ xp = _namespace(xp)
2110
+
2111
+ if norm is None:
2112
+ norm = 'approximate' if Kmax is None else 2
2113
+ known_norms = (2, 'approximate', 'subsample')
2114
+ if norm not in known_norms:
2115
+ raise ValueError(f'norm must be one of {known_norms}, got {norm}')
2116
+ if Kmax is None:
2117
+ singleton = True
2118
+ Kmax = 1
2119
+ else:
2120
+ singleton = False
2121
+ if _len_guards(M):
2122
+ if not return_ratios:
2123
+ return xp.ones(M, dtype=xp.float64)
2124
+ elif singleton:
2125
+ return xp.ones(M, dtype=xp.float64), 1.
2126
+ else:
2127
+ return xp.ones(M, dtype=xp.float64), xp.ones(1, dtype=xp.float64)
2128
+ Kmax = operator.index(Kmax)
2129
+ if not 0 < Kmax <= M:
2130
+ raise ValueError('Kmax must be greater than 0 and less than M')
2131
+ if NW >= M/2.:
2132
+ raise ValueError('NW must be less than M/2.')
2133
+ if NW <= 0:
2134
+ raise ValueError('NW must be positive')
2135
+ M, needs_trunc = _extend(M, sym)
2136
+ W = float(NW) / M
2137
+ nidx = xp.arange(M, dtype=xp.float64, device=device)
2138
+
2139
+ # Here we want to set up an optimization problem to find a sequence
2140
+ # whose energy is maximally concentrated within band [-W,W].
2141
+ # Thus, the measure lambda(T,W) is the ratio between the energy within
2142
+ # that band, and the total energy. This leads to the eigen-system
2143
+ # (A - (l1)I)v = 0, where the eigenvector corresponding to the largest
2144
+ # eigenvalue is the sequence with maximally concentrated energy. The
2145
+ # collection of eigenvectors of this system are called Slepian
2146
+ # sequences, or discrete prolate spheroidal sequences (DPSS). Only the
2147
+ # first K, K = 2NW/dt orders of DPSS will exhibit good spectral
2148
+ # concentration
2149
+ # [see https://en.wikipedia.org/wiki/Spectral_concentration_problem]
2150
+
2151
+ # Here we set up an alternative symmetric tri-diagonal eigenvalue
2152
+ # problem such that
2153
+ # (B - (l2)I)v = 0, and v are our DPSS (but eigenvalues l2 != l1)
2154
+ # the main diagonal = ([M-1-2*t]/2)**2 cos(2PIW), t=[0,1,2,...,M-1]
2155
+ # and the first off-diagonal = t(M-t)/2, t=[1,2,...,M-1]
2156
+ # [see Percival and Walden, 1993]
2157
+ d = ((M - 1 - 2 * nidx) / 2.) ** 2 * xp.cos(xp.asarray(2 * xp.pi * W))
2158
+ e = nidx[1:] * (M - nidx[1:]) / 2.
2159
+
2160
+ # only calculate the highest Kmax eigenvalues
2161
+ w, windows = linalg.eigh_tridiagonal(
2162
+ d, e, select='i', select_range=(M - Kmax, M - 1))
2163
+ w = w[::-1]
2164
+ windows = windows[:, ::-1].T
2165
+
2166
+ # By convention (Percival and Walden, 1993 pg 379)
2167
+ # * symmetric tapers (k=0,2,4,...) should have a positive average.
2168
+ fix_even = (windows[::2, ...].sum(axis=1) < 0)
2169
+ for i, f in enumerate(fix_even):
2170
+ if f:
2171
+ windows[2 * i] *= -1
2172
+ # * antisymmetric tapers should begin with a positive lobe
2173
+ # (this depends on the definition of "lobe", here we'll take the first
2174
+ # point above the numerical noise, which should be good enough for
2175
+ # sufficiently smooth functions, and more robust than relying on an
2176
+ # algorithm that uses max(abs(w)), which is susceptible to numerical
2177
+ # noise problems)
2178
+ thresh = max(1e-7, 1. / M)
2179
+ for i, w in enumerate(windows[1::2, ...]):
2180
+ if w[w * w > thresh][0] < 0:
2181
+ windows[2 * i + 1] *= -1
2182
+
2183
+ # Now find the eigenvalues of the original spectral concentration problem
2184
+ # Use the autocorr sequence technique from Percival and Walden, 1993 pg 390
2185
+ if return_ratios:
2186
+ dpss_rxx = _fftautocorr(xp.asarray(windows))
2187
+ r = 4 * W * xpx.sinc(xp.asarray(2 * W * nidx), xp=xp)
2188
+ r[0] = 2 * W
2189
+ ratios = xp.matmul(dpss_rxx, r)
2190
+ if singleton:
2191
+ ratios = ratios[0]
2192
+ ratios = xp.asarray(ratios, device=device)
2193
+ # Deal with sym and Kmax=None
2194
+ if norm != 2:
2195
+ windows /= windows.max()
2196
+ if M % 2 == 0:
2197
+ if norm == 'approximate':
2198
+ correction = M**2 / float(M**2 + NW)
2199
+ else:
2200
+ s = sp_fft.rfft(windows[0])
2201
+ shift = -(1 - 1./M) * xp.arange(1, M//2 + 1, dtype=xp.float64)
2202
+ s[1:] *= 2 * xp.exp(-1j * xp.pi * shift)
2203
+ correction = M / s.real.sum()
2204
+ windows *= correction
2205
+ # else we're already l2 normed, so do nothing
2206
+ if needs_trunc:
2207
+ windows = windows[:, :-1]
2208
+ if singleton:
2209
+ windows = windows[0]
2210
+ windows = xp.asarray(windows, device=device)
2211
+ return (windows, ratios) if return_ratios else windows
2212
+
2213
+
2214
+ def lanczos(M, *, sym=True, xp=None, device=None):
2215
+ r"""Return a Lanczos window also known as a sinc window.
2216
+
2217
+ Parameters
2218
+ ----------
2219
+ M : int
2220
+ Number of points in the output window. If zero, an empty array
2221
+ is returned. An exception is thrown when it is negative.
2222
+ sym : bool, optional
2223
+ When True (default), generates a symmetric window, for use in filter
2224
+ design.
2225
+ When False, generates a periodic window, for use in spectral analysis.
2226
+ %(xp_device_snippet)s
2227
+
2228
+ Returns
2229
+ -------
2230
+ w : ndarray
2231
+ The window, with the maximum value normalized to 1 (though the value 1
2232
+ does not appear if `M` is even and `sym` is True).
2233
+
2234
+ Notes
2235
+ -----
2236
+ The Lanczos window is defined as
2237
+
2238
+ .. math:: w(n) = sinc \left( \frac{2n}{M - 1} - 1 \right)
2239
+
2240
+ where
2241
+
2242
+ .. math:: sinc(x) = \frac{\sin(\pi x)}{\pi x}
2243
+
2244
+ The Lanczos window has reduced Gibbs oscillations and is widely used for
2245
+ filtering climate timeseries with good properties in the physical and
2246
+ spectral domains.
2247
+
2248
+ .. versionadded:: 1.10
2249
+
2250
+ References
2251
+ ----------
2252
+ .. [1] Lanczos, C., and Teichmann, T. (1957). Applied analysis.
2253
+ Physics Today, 10, 44.
2254
+ .. [2] Duchon C. E. (1979) Lanczos Filtering in One and Two Dimensions.
2255
+ Journal of Applied Meteorology, Vol 18, pp 1016-1022.
2256
+ .. [3] Thomson, R. E. and Emery, W. J. (2014) Data Analysis Methods in
2257
+ Physical Oceanography (Third Edition), Elsevier, pp 593-637.
2258
+ .. [4] Wikipedia, "Window function",
2259
+ http://en.wikipedia.org/wiki/Window_function
2260
+
2261
+ Examples
2262
+ --------
2263
+ Plot the window
2264
+
2265
+ >>> import numpy as np
2266
+ >>> from scipy.signal.windows import lanczos
2267
+ >>> from scipy.fft import fft, fftshift
2268
+ >>> import matplotlib.pyplot as plt
2269
+ >>> fig, ax = plt.subplots(1)
2270
+ >>> window = lanczos(51)
2271
+ >>> ax.plot(window)
2272
+ >>> ax.set_title("Lanczos window")
2273
+ >>> ax.set_ylabel("Amplitude")
2274
+ >>> ax.set_xlabel("Sample")
2275
+ >>> fig.tight_layout()
2276
+ >>> plt.show()
2277
+
2278
+ and its frequency response:
2279
+
2280
+ >>> fig, ax = plt.subplots(1)
2281
+ >>> A = fft(window, 2048) / (len(window)/2.0)
2282
+ >>> freq = np.linspace(-0.5, 0.5, len(A))
2283
+ >>> response = 20 * np.log10(np.abs(fftshift(A / abs(A).max())))
2284
+ >>> ax.plot(freq, response)
2285
+ >>> ax.set_xlim(-0.5, 0.5)
2286
+ >>> ax.set_ylim(-120, 0)
2287
+ >>> ax.set_title("Frequency response of the lanczos window")
2288
+ >>> ax.set_ylabel("Normalized magnitude [dB]")
2289
+ >>> ax.set_xlabel("Normalized frequency [cycles per sample]")
2290
+ >>> fig.tight_layout()
2291
+ >>> plt.show()
2292
+ """
2293
+ xp = _namespace(xp)
2294
+
2295
+ if _len_guards(M):
2296
+ return xp.ones(M, dtype=xp.float64, device=device)
2297
+ M, needs_trunc = _extend(M, sym)
2298
+
2299
+ # To make sure that the window is symmetric, we concatenate the right hand
2300
+ # half of the window and the flipped one which is the left hand half of
2301
+ # the window.
2302
+ def _calc_right_side_lanczos(n, m):
2303
+ return xpx.sinc(2. * xp.arange(n, m, dtype=xp.float64) / (m - 1) - 1.0, xp=xp)
2304
+
2305
+ if M % 2 == 0:
2306
+ wh = _calc_right_side_lanczos(M/2, M)
2307
+ w = xp.concat([xp.flip(wh), wh])
2308
+ else:
2309
+ wh = _calc_right_side_lanczos((M+1)/2, M)
2310
+ w = xp.concat([xp.flip(wh), xp.ones(1), wh])
2311
+
2312
+ return _truncate(w, needs_trunc)
2313
+
2314
+
2315
+ def _fftautocorr(x):
2316
+ """Compute the autocorrelation of a real array and crop the result."""
2317
+ N = x.shape[-1]
2318
+ use_N = sp_fft.next_fast_len(2*N-1)
2319
+ x_fft = sp_fft.rfft(x, use_N, axis=-1)
2320
+ cxy = sp_fft.irfft(x_fft * x_fft.conj(), n=use_N)[:, :N]
2321
+ # Or equivalently (but in most cases slower):
2322
+ # cxy = xp.asarray([xp.convolve(xx, yy[::-1], mode='full')
2323
+ # for xx, yy in zip(x, x)])[:, N-1:2*N-1]
2324
+ return cxy
2325
+
2326
+
2327
+ _win_equiv_raw = {
2328
+ ('barthann', 'brthan', 'bth'): (barthann, False),
2329
+ ('bartlett', 'bart', 'brt'): (bartlett, False),
2330
+ ('blackman', 'black', 'blk'): (blackman, False),
2331
+ ('blackmanharris', 'blackharr', 'bkh'): (blackmanharris, False),
2332
+ ('bohman', 'bman', 'bmn'): (bohman, False),
2333
+ ('boxcar', 'box', 'ones',
2334
+ 'rect', 'rectangular'): (boxcar, False),
2335
+ ('chebwin', 'cheb'): (chebwin, True),
2336
+ ('cosine', 'halfcosine'): (cosine, False),
2337
+ ('dpss',): (dpss, True),
2338
+ ('exponential', 'poisson'): (exponential, False),
2339
+ ('flattop', 'flat', 'flt'): (flattop, False),
2340
+ ('gaussian', 'gauss', 'gss'): (gaussian, True),
2341
+ ('general cosine', 'general_cosine'): (general_cosine, True),
2342
+ ('general gaussian', 'general_gaussian',
2343
+ 'general gauss', 'general_gauss', 'ggs'): (general_gaussian, True),
2344
+ ('general hamming', 'general_hamming'): (general_hamming, True),
2345
+ ('hamming', 'hamm', 'ham'): (hamming, False),
2346
+ ('hann', 'han'): (hann, False),
2347
+ ('kaiser', 'ksr'): (kaiser, True),
2348
+ ('kaiser bessel derived', 'kbd'): (kaiser_bessel_derived, True),
2349
+ ('lanczos', 'sinc'): (lanczos, False),
2350
+ ('nuttall', 'nutl', 'nut'): (nuttall, False),
2351
+ ('parzen', 'parz', 'par'): (parzen, False),
2352
+ ('taylor', 'taylorwin'): (taylor, False),
2353
+ ('triangle', 'triang', 'tri'): (triang, False),
2354
+ ('tukey', 'tuk'): (tukey, False),
2355
+ }
2356
+
2357
+ # Fill dict with all valid window name strings
2358
+ _win_equiv = {}
2359
+ for k, v in _win_equiv_raw.items():
2360
+ for key in k:
2361
+ _win_equiv[key] = v[0]
2362
+
2363
+ # Keep track of which windows need additional parameters
2364
+ _needs_param = set()
2365
+ for k, v in _win_equiv_raw.items():
2366
+ if v[1]:
2367
+ _needs_param.update(k)
2368
+
2369
+
2370
+ def get_window(window, Nx, fftbins=True, *, xp=None, device=None):
2371
+ """
2372
+ Return a window of a given length and type.
2373
+
2374
+ Parameters
2375
+ ----------
2376
+ window : string, float, or tuple
2377
+ The type of window to create. See below for more details.
2378
+ Nx : int
2379
+ The number of samples in the window.
2380
+ fftbins : bool, optional
2381
+ If True (default), create a "periodic" window, ready to use with
2382
+ `ifftshift` and be multiplied by the result of an FFT (see also
2383
+ :func:`~scipy.fft.fftfreq`).
2384
+ If False, create a "symmetric" window, for use in filter design.
2385
+ %(xp_device_snippet)s
2386
+
2387
+ Returns
2388
+ -------
2389
+ get_window : ndarray
2390
+ Returns a window of length `Nx` and type `window`
2391
+
2392
+ Notes
2393
+ -----
2394
+ Window types:
2395
+
2396
+ - `~scipy.signal.windows.boxcar`
2397
+ - `~scipy.signal.windows.triang`
2398
+ - `~scipy.signal.windows.blackman`
2399
+ - `~scipy.signal.windows.hamming`
2400
+ - `~scipy.signal.windows.hann`
2401
+ - `~scipy.signal.windows.bartlett`
2402
+ - `~scipy.signal.windows.flattop`
2403
+ - `~scipy.signal.windows.parzen`
2404
+ - `~scipy.signal.windows.bohman`
2405
+ - `~scipy.signal.windows.blackmanharris`
2406
+ - `~scipy.signal.windows.nuttall`
2407
+ - `~scipy.signal.windows.barthann`
2408
+ - `~scipy.signal.windows.cosine`
2409
+ - `~scipy.signal.windows.exponential`
2410
+ - `~scipy.signal.windows.tukey`
2411
+ - `~scipy.signal.windows.taylor`
2412
+ - `~scipy.signal.windows.lanczos`
2413
+ - `~scipy.signal.windows.kaiser` (needs beta)
2414
+ - `~scipy.signal.windows.kaiser_bessel_derived` (needs beta)
2415
+ - `~scipy.signal.windows.gaussian` (needs standard deviation)
2416
+ - `~scipy.signal.windows.general_cosine` (needs weighting coefficients)
2417
+ - `~scipy.signal.windows.general_gaussian` (needs power, width)
2418
+ - `~scipy.signal.windows.general_hamming` (needs window coefficient)
2419
+ - `~scipy.signal.windows.dpss` (needs normalized half-bandwidth)
2420
+ - `~scipy.signal.windows.chebwin` (needs attenuation)
2421
+
2422
+
2423
+ If the window requires no parameters, then `window` can be a string.
2424
+
2425
+ If the window requires parameters, then `window` must be a tuple
2426
+ with the first argument the string name of the window, and the next
2427
+ arguments the needed parameters.
2428
+
2429
+ If `window` is a floating point number, it is interpreted as the beta
2430
+ parameter of the `~scipy.signal.windows.kaiser` window.
2431
+
2432
+ Each of the window types listed above is also the name of
2433
+ a function that can be called directly to create a window of
2434
+ that type.
2435
+
2436
+ Examples
2437
+ --------
2438
+ >>> from scipy import signal
2439
+ >>> signal.get_window('triang', 7)
2440
+ array([ 0.125, 0.375, 0.625, 0.875, 0.875, 0.625, 0.375])
2441
+ >>> signal.get_window(('kaiser', 4.0), 9)
2442
+ array([ 0.08848053, 0.29425961, 0.56437221, 0.82160913, 0.97885093,
2443
+ 0.97885093, 0.82160913, 0.56437221, 0.29425961])
2444
+ >>> signal.get_window(('exponential', None, 1.), 9)
2445
+ array([ 0.011109 , 0.03019738, 0.082085 , 0.22313016, 0.60653066,
2446
+ 0.60653066, 0.22313016, 0.082085 , 0.03019738])
2447
+ >>> signal.get_window(4.0, 9)
2448
+ array([ 0.08848053, 0.29425961, 0.56437221, 0.82160913, 0.97885093,
2449
+ 0.97885093, 0.82160913, 0.56437221, 0.29425961])
2450
+
2451
+ """
2452
+ sym = not fftbins
2453
+ try:
2454
+ beta = float(window)
2455
+ except (TypeError, ValueError) as e:
2456
+ args = ()
2457
+ if isinstance(window, tuple):
2458
+ winstr = window[0]
2459
+ if len(window) > 1:
2460
+ args = window[1:]
2461
+ elif isinstance(window, str):
2462
+ if window in _needs_param:
2463
+ raise ValueError("The '" + window + "' window needs one or "
2464
+ "more parameters -- pass a tuple.") from e
2465
+ else:
2466
+ winstr = window
2467
+ else:
2468
+ raise ValueError(
2469
+ f"{str(type(window))} as window type is not supported.") from e
2470
+
2471
+ if winstr == 'general_cosine' and (xp is not None or device is not None):
2472
+ raise ValueError(
2473
+ 'general_cosine window does not accept xp and device kwargs '
2474
+ )
2475
+
2476
+ try:
2477
+ winfunc = _win_equiv[winstr]
2478
+ except KeyError as e:
2479
+ raise ValueError("Unknown window type.") from e
2480
+
2481
+ if winfunc is dpss:
2482
+ params = (Nx,) + args + (None,)
2483
+ else:
2484
+ params = (Nx,) + args
2485
+ else:
2486
+ winfunc = kaiser
2487
+ params = (Nx, beta)
2488
+
2489
+ if winfunc == general_cosine:
2490
+ return winfunc(*params, sym=sym)
2491
+ else:
2492
+ return winfunc(*params, sym=sym, xp=xp, device=device)
2493
+
2494
+
2495
+ ########## complete the docstrings, on import
2496
+ _xp_device_snippet = {'xp_device_snippet':
2497
+ """\
2498
+ xp : array_namespace, optional
2499
+ Optional array namespace.
2500
+ Should be compatible with the array API standard, or supported by array-api-compat.
2501
+ Default: ``numpy``
2502
+ device: any
2503
+ optional device specification for output. Should match one of the
2504
+ supported device specification in ``xp``.
2505
+ """
2506
+ }
2507
+
2508
+
2509
+ _names = [x for x in __all__ if x != 'general_cosine']
2510
+ for name in _names:
2511
+ window = vars()[name]
2512
+ window.__doc__ = doccer.docformat(window.__doc__, _xp_device_snippet)
2513
+