scipy 1.16.2__cp314-cp314-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.
- scipy/__config__.py +161 -0
- scipy/__init__.py +150 -0
- scipy/_cyutility.cp314-win_arm64.lib +0 -0
- scipy/_cyutility.cp314-win_arm64.pyd +0 -0
- scipy/_distributor_init.py +18 -0
- scipy/_lib/__init__.py +14 -0
- scipy/_lib/_array_api.py +931 -0
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_array_api_no_0d.py +103 -0
- scipy/_lib/_bunch.py +229 -0
- scipy/_lib/_ccallback.py +251 -0
- scipy/_lib/_ccallback_c.cp314-win_arm64.lib +0 -0
- scipy/_lib/_ccallback_c.cp314-win_arm64.pyd +0 -0
- scipy/_lib/_disjoint_set.py +254 -0
- scipy/_lib/_docscrape.py +761 -0
- scipy/_lib/_elementwise_iterative_method.py +346 -0
- scipy/_lib/_fpumode.cp314-win_arm64.lib +0 -0
- scipy/_lib/_fpumode.cp314-win_arm64.pyd +0 -0
- scipy/_lib/_gcutils.py +105 -0
- scipy/_lib/_pep440.py +487 -0
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_ccallback.cp314-win_arm64.lib +0 -0
- scipy/_lib/_test_ccallback.cp314-win_arm64.pyd +0 -0
- scipy/_lib/_test_deprecation_call.cp314-win_arm64.lib +0 -0
- scipy/_lib/_test_deprecation_call.cp314-win_arm64.pyd +0 -0
- scipy/_lib/_test_deprecation_def.cp314-win_arm64.lib +0 -0
- scipy/_lib/_test_deprecation_def.cp314-win_arm64.pyd +0 -0
- scipy/_lib/_testutils.py +373 -0
- scipy/_lib/_threadsafety.py +58 -0
- scipy/_lib/_tmpdirs.py +86 -0
- scipy/_lib/_uarray/LICENSE +29 -0
- scipy/_lib/_uarray/__init__.py +116 -0
- scipy/_lib/_uarray/_backend.py +707 -0
- scipy/_lib/_uarray/_uarray.cp314-win_arm64.lib +0 -0
- scipy/_lib/_uarray/_uarray.cp314-win_arm64.pyd +0 -0
- scipy/_lib/_util.py +1283 -0
- scipy/_lib/array_api_compat/__init__.py +22 -0
- scipy/_lib/array_api_compat/_internal.py +59 -0
- scipy/_lib/array_api_compat/common/__init__.py +1 -0
- scipy/_lib/array_api_compat/common/_aliases.py +727 -0
- scipy/_lib/array_api_compat/common/_fft.py +213 -0
- scipy/_lib/array_api_compat/common/_helpers.py +1058 -0
- scipy/_lib/array_api_compat/common/_linalg.py +232 -0
- scipy/_lib/array_api_compat/common/_typing.py +192 -0
- scipy/_lib/array_api_compat/cupy/__init__.py +13 -0
- scipy/_lib/array_api_compat/cupy/_aliases.py +156 -0
- scipy/_lib/array_api_compat/cupy/_info.py +336 -0
- scipy/_lib/array_api_compat/cupy/_typing.py +31 -0
- scipy/_lib/array_api_compat/cupy/fft.py +36 -0
- scipy/_lib/array_api_compat/cupy/linalg.py +49 -0
- scipy/_lib/array_api_compat/dask/__init__.py +0 -0
- scipy/_lib/array_api_compat/dask/array/__init__.py +12 -0
- scipy/_lib/array_api_compat/dask/array/_aliases.py +376 -0
- scipy/_lib/array_api_compat/dask/array/_info.py +416 -0
- scipy/_lib/array_api_compat/dask/array/fft.py +21 -0
- scipy/_lib/array_api_compat/dask/array/linalg.py +72 -0
- scipy/_lib/array_api_compat/numpy/__init__.py +28 -0
- scipy/_lib/array_api_compat/numpy/_aliases.py +190 -0
- scipy/_lib/array_api_compat/numpy/_info.py +366 -0
- scipy/_lib/array_api_compat/numpy/_typing.py +30 -0
- scipy/_lib/array_api_compat/numpy/fft.py +35 -0
- scipy/_lib/array_api_compat/numpy/linalg.py +143 -0
- scipy/_lib/array_api_compat/torch/__init__.py +22 -0
- scipy/_lib/array_api_compat/torch/_aliases.py +855 -0
- scipy/_lib/array_api_compat/torch/_info.py +369 -0
- scipy/_lib/array_api_compat/torch/_typing.py +3 -0
- scipy/_lib/array_api_compat/torch/fft.py +85 -0
- scipy/_lib/array_api_compat/torch/linalg.py +121 -0
- scipy/_lib/array_api_extra/__init__.py +38 -0
- scipy/_lib/array_api_extra/_delegation.py +171 -0
- scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_at.py +463 -0
- scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
- scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
- scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
- scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
- scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
- scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
- scipy/_lib/array_api_extra/testing.py +359 -0
- scipy/_lib/cobyqa/__init__.py +20 -0
- scipy/_lib/cobyqa/framework.py +1240 -0
- scipy/_lib/cobyqa/main.py +1506 -0
- scipy/_lib/cobyqa/models.py +1529 -0
- scipy/_lib/cobyqa/problem.py +1296 -0
- scipy/_lib/cobyqa/settings.py +132 -0
- scipy/_lib/cobyqa/subsolvers/__init__.py +14 -0
- scipy/_lib/cobyqa/subsolvers/geometry.py +387 -0
- scipy/_lib/cobyqa/subsolvers/optim.py +1203 -0
- scipy/_lib/cobyqa/utils/__init__.py +18 -0
- scipy/_lib/cobyqa/utils/exceptions.py +22 -0
- scipy/_lib/cobyqa/utils/math.py +77 -0
- scipy/_lib/cobyqa/utils/versions.py +67 -0
- scipy/_lib/decorator.py +399 -0
- scipy/_lib/deprecation.py +274 -0
- scipy/_lib/doccer.py +366 -0
- scipy/_lib/messagestream.cp314-win_arm64.lib +0 -0
- scipy/_lib/messagestream.cp314-win_arm64.pyd +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/__init__.py +0 -0
- scipy/_lib/tests/test__gcutils.py +110 -0
- scipy/_lib/tests/test__pep440.py +67 -0
- scipy/_lib/tests/test__testutils.py +32 -0
- scipy/_lib/tests/test__threadsafety.py +51 -0
- scipy/_lib/tests/test__util.py +641 -0
- scipy/_lib/tests/test_array_api.py +322 -0
- scipy/_lib/tests/test_bunch.py +169 -0
- scipy/_lib/tests/test_ccallback.py +196 -0
- scipy/_lib/tests/test_config.py +45 -0
- scipy/_lib/tests/test_deprecation.py +10 -0
- scipy/_lib/tests/test_doccer.py +143 -0
- scipy/_lib/tests/test_import_cycles.py +18 -0
- scipy/_lib/tests/test_public_api.py +482 -0
- scipy/_lib/tests/test_scipy_version.py +28 -0
- scipy/_lib/tests/test_tmpdirs.py +48 -0
- scipy/_lib/tests/test_warnings.py +137 -0
- scipy/_lib/uarray.py +31 -0
- scipy/cluster/__init__.py +31 -0
- scipy/cluster/_hierarchy.cp314-win_arm64.lib +0 -0
- scipy/cluster/_hierarchy.cp314-win_arm64.pyd +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp314-win_arm64.lib +0 -0
- scipy/cluster/_optimal_leaf_ordering.cp314-win_arm64.pyd +0 -0
- scipy/cluster/_vq.cp314-win_arm64.lib +0 -0
- scipy/cluster/_vq.cp314-win_arm64.pyd +0 -0
- scipy/cluster/hierarchy.py +4348 -0
- scipy/cluster/tests/__init__.py +0 -0
- scipy/cluster/tests/hierarchy_test_data.py +145 -0
- scipy/cluster/tests/test_disjoint_set.py +202 -0
- scipy/cluster/tests/test_hierarchy.py +1238 -0
- scipy/cluster/tests/test_vq.py +434 -0
- scipy/cluster/vq.py +832 -0
- scipy/conftest.py +683 -0
- scipy/constants/__init__.py +358 -0
- scipy/constants/_codata.py +2266 -0
- scipy/constants/_constants.py +369 -0
- scipy/constants/codata.py +21 -0
- scipy/constants/constants.py +53 -0
- scipy/constants/tests/__init__.py +0 -0
- scipy/constants/tests/test_codata.py +78 -0
- scipy/constants/tests/test_constants.py +83 -0
- scipy/datasets/__init__.py +90 -0
- scipy/datasets/_download_all.py +71 -0
- scipy/datasets/_fetchers.py +225 -0
- scipy/datasets/_registry.py +26 -0
- scipy/datasets/_utils.py +81 -0
- scipy/datasets/tests/__init__.py +0 -0
- scipy/datasets/tests/test_data.py +128 -0
- scipy/differentiate/__init__.py +27 -0
- scipy/differentiate/_differentiate.py +1129 -0
- scipy/differentiate/tests/__init__.py +0 -0
- scipy/differentiate/tests/test_differentiate.py +694 -0
- scipy/fft/__init__.py +114 -0
- scipy/fft/_backend.py +196 -0
- scipy/fft/_basic.py +1650 -0
- scipy/fft/_basic_backend.py +197 -0
- scipy/fft/_debug_backends.py +22 -0
- scipy/fft/_fftlog.py +223 -0
- scipy/fft/_fftlog_backend.py +200 -0
- scipy/fft/_helper.py +348 -0
- scipy/fft/_pocketfft/LICENSE.md +25 -0
- scipy/fft/_pocketfft/__init__.py +9 -0
- scipy/fft/_pocketfft/basic.py +251 -0
- scipy/fft/_pocketfft/helper.py +249 -0
- scipy/fft/_pocketfft/pypocketfft.cp314-win_arm64.lib +0 -0
- scipy/fft/_pocketfft/pypocketfft.cp314-win_arm64.pyd +0 -0
- scipy/fft/_pocketfft/realtransforms.py +109 -0
- scipy/fft/_pocketfft/tests/__init__.py +0 -0
- scipy/fft/_pocketfft/tests/test_basic.py +1011 -0
- scipy/fft/_pocketfft/tests/test_real_transforms.py +505 -0
- scipy/fft/_realtransforms.py +706 -0
- scipy/fft/_realtransforms_backend.py +63 -0
- scipy/fft/tests/__init__.py +0 -0
- scipy/fft/tests/mock_backend.py +96 -0
- scipy/fft/tests/test_backend.py +98 -0
- scipy/fft/tests/test_basic.py +504 -0
- scipy/fft/tests/test_fftlog.py +215 -0
- scipy/fft/tests/test_helper.py +558 -0
- scipy/fft/tests/test_multithreading.py +84 -0
- scipy/fft/tests/test_real_transforms.py +247 -0
- scipy/fftpack/__init__.py +103 -0
- scipy/fftpack/_basic.py +428 -0
- scipy/fftpack/_helper.py +115 -0
- scipy/fftpack/_pseudo_diffs.py +554 -0
- scipy/fftpack/_realtransforms.py +598 -0
- scipy/fftpack/basic.py +20 -0
- scipy/fftpack/convolve.cp314-win_arm64.lib +0 -0
- scipy/fftpack/convolve.cp314-win_arm64.pyd +0 -0
- scipy/fftpack/helper.py +19 -0
- scipy/fftpack/pseudo_diffs.py +22 -0
- scipy/fftpack/realtransforms.py +19 -0
- scipy/fftpack/tests/__init__.py +0 -0
- scipy/fftpack/tests/fftw_double_ref.npz +0 -0
- scipy/fftpack/tests/fftw_longdouble_ref.npz +0 -0
- scipy/fftpack/tests/fftw_single_ref.npz +0 -0
- scipy/fftpack/tests/test.npz +0 -0
- scipy/fftpack/tests/test_basic.py +877 -0
- scipy/fftpack/tests/test_helper.py +54 -0
- scipy/fftpack/tests/test_import.py +33 -0
- scipy/fftpack/tests/test_pseudo_diffs.py +388 -0
- scipy/fftpack/tests/test_real_transforms.py +836 -0
- scipy/integrate/__init__.py +122 -0
- scipy/integrate/_bvp.py +1160 -0
- scipy/integrate/_cubature.py +729 -0
- scipy/integrate/_dop.cp314-win_arm64.lib +0 -0
- scipy/integrate/_dop.cp314-win_arm64.pyd +0 -0
- scipy/integrate/_ivp/__init__.py +8 -0
- scipy/integrate/_ivp/base.py +290 -0
- scipy/integrate/_ivp/bdf.py +478 -0
- scipy/integrate/_ivp/common.py +451 -0
- scipy/integrate/_ivp/dop853_coefficients.py +193 -0
- scipy/integrate/_ivp/ivp.py +755 -0
- scipy/integrate/_ivp/lsoda.py +224 -0
- scipy/integrate/_ivp/radau.py +572 -0
- scipy/integrate/_ivp/rk.py +601 -0
- scipy/integrate/_ivp/tests/__init__.py +0 -0
- scipy/integrate/_ivp/tests/test_ivp.py +1287 -0
- scipy/integrate/_ivp/tests/test_rk.py +37 -0
- scipy/integrate/_lebedev.py +5450 -0
- scipy/integrate/_lsoda.cp314-win_arm64.lib +0 -0
- scipy/integrate/_lsoda.cp314-win_arm64.pyd +0 -0
- scipy/integrate/_ode.py +1395 -0
- scipy/integrate/_odepack.cp314-win_arm64.lib +0 -0
- scipy/integrate/_odepack.cp314-win_arm64.pyd +0 -0
- scipy/integrate/_odepack_py.py +273 -0
- scipy/integrate/_quad_vec.py +674 -0
- scipy/integrate/_quadpack.cp314-win_arm64.lib +0 -0
- scipy/integrate/_quadpack.cp314-win_arm64.pyd +0 -0
- scipy/integrate/_quadpack_py.py +1283 -0
- scipy/integrate/_quadrature.py +1336 -0
- scipy/integrate/_rules/__init__.py +12 -0
- scipy/integrate/_rules/_base.py +518 -0
- scipy/integrate/_rules/_gauss_kronrod.py +202 -0
- scipy/integrate/_rules/_gauss_legendre.py +62 -0
- scipy/integrate/_rules/_genz_malik.py +210 -0
- scipy/integrate/_tanhsinh.py +1385 -0
- scipy/integrate/_test_multivariate.cp314-win_arm64.lib +0 -0
- scipy/integrate/_test_multivariate.cp314-win_arm64.pyd +0 -0
- scipy/integrate/_test_odeint_banded.cp314-win_arm64.lib +0 -0
- scipy/integrate/_test_odeint_banded.cp314-win_arm64.pyd +0 -0
- scipy/integrate/_vode.cp314-win_arm64.lib +0 -0
- scipy/integrate/_vode.cp314-win_arm64.pyd +0 -0
- scipy/integrate/dop.py +15 -0
- scipy/integrate/lsoda.py +15 -0
- scipy/integrate/odepack.py +17 -0
- scipy/integrate/quadpack.py +23 -0
- scipy/integrate/tests/__init__.py +0 -0
- scipy/integrate/tests/test__quad_vec.py +211 -0
- scipy/integrate/tests/test_banded_ode_solvers.py +305 -0
- scipy/integrate/tests/test_bvp.py +714 -0
- scipy/integrate/tests/test_cubature.py +1375 -0
- scipy/integrate/tests/test_integrate.py +840 -0
- scipy/integrate/tests/test_odeint_jac.py +74 -0
- scipy/integrate/tests/test_quadpack.py +680 -0
- scipy/integrate/tests/test_quadrature.py +730 -0
- scipy/integrate/tests/test_tanhsinh.py +1171 -0
- scipy/integrate/vode.py +15 -0
- scipy/interpolate/__init__.py +228 -0
- scipy/interpolate/_bary_rational.py +715 -0
- scipy/interpolate/_bsplines.py +2469 -0
- scipy/interpolate/_cubic.py +973 -0
- scipy/interpolate/_dfitpack.cp314-win_arm64.lib +0 -0
- scipy/interpolate/_dfitpack.cp314-win_arm64.pyd +0 -0
- scipy/interpolate/_dierckx.cp314-win_arm64.lib +0 -0
- scipy/interpolate/_dierckx.cp314-win_arm64.pyd +0 -0
- scipy/interpolate/_fitpack.cp314-win_arm64.lib +0 -0
- scipy/interpolate/_fitpack.cp314-win_arm64.pyd +0 -0
- scipy/interpolate/_fitpack2.py +2397 -0
- scipy/interpolate/_fitpack_impl.py +811 -0
- scipy/interpolate/_fitpack_py.py +898 -0
- scipy/interpolate/_fitpack_repro.py +996 -0
- scipy/interpolate/_interpnd.cp314-win_arm64.lib +0 -0
- scipy/interpolate/_interpnd.cp314-win_arm64.pyd +0 -0
- scipy/interpolate/_interpolate.py +2266 -0
- scipy/interpolate/_ndbspline.py +415 -0
- scipy/interpolate/_ndgriddata.py +329 -0
- scipy/interpolate/_pade.py +67 -0
- scipy/interpolate/_polyint.py +1025 -0
- scipy/interpolate/_ppoly.cp314-win_arm64.lib +0 -0
- scipy/interpolate/_ppoly.cp314-win_arm64.pyd +0 -0
- scipy/interpolate/_rbf.py +290 -0
- scipy/interpolate/_rbfinterp.py +550 -0
- scipy/interpolate/_rbfinterp_pythran.cp314-win_arm64.lib +0 -0
- scipy/interpolate/_rbfinterp_pythran.cp314-win_arm64.pyd +0 -0
- scipy/interpolate/_rgi.py +764 -0
- scipy/interpolate/_rgi_cython.cp314-win_arm64.lib +0 -0
- scipy/interpolate/_rgi_cython.cp314-win_arm64.pyd +0 -0
- scipy/interpolate/dfitpack.py +24 -0
- scipy/interpolate/fitpack.py +31 -0
- scipy/interpolate/fitpack2.py +29 -0
- scipy/interpolate/interpnd.py +24 -0
- scipy/interpolate/interpolate.py +30 -0
- scipy/interpolate/ndgriddata.py +23 -0
- scipy/interpolate/polyint.py +24 -0
- scipy/interpolate/rbf.py +18 -0
- scipy/interpolate/tests/__init__.py +0 -0
- scipy/interpolate/tests/data/bug-1310.npz +0 -0
- scipy/interpolate/tests/data/estimate_gradients_hang.npy +0 -0
- scipy/interpolate/tests/data/gcvspl.npz +0 -0
- scipy/interpolate/tests/test_bary_rational.py +368 -0
- scipy/interpolate/tests/test_bsplines.py +3754 -0
- scipy/interpolate/tests/test_fitpack.py +519 -0
- scipy/interpolate/tests/test_fitpack2.py +1431 -0
- scipy/interpolate/tests/test_gil.py +64 -0
- scipy/interpolate/tests/test_interpnd.py +452 -0
- scipy/interpolate/tests/test_interpolate.py +2630 -0
- scipy/interpolate/tests/test_ndgriddata.py +308 -0
- scipy/interpolate/tests/test_pade.py +107 -0
- scipy/interpolate/tests/test_polyint.py +972 -0
- scipy/interpolate/tests/test_rbf.py +246 -0
- scipy/interpolate/tests/test_rbfinterp.py +534 -0
- scipy/interpolate/tests/test_rgi.py +1151 -0
- scipy/io/__init__.py +116 -0
- scipy/io/_fast_matrix_market/__init__.py +600 -0
- scipy/io/_fast_matrix_market/_fmm_core.cp314-win_arm64.lib +0 -0
- scipy/io/_fast_matrix_market/_fmm_core.cp314-win_arm64.pyd +0 -0
- scipy/io/_fortran.py +354 -0
- scipy/io/_harwell_boeing/__init__.py +7 -0
- scipy/io/_harwell_boeing/_fortran_format_parser.py +316 -0
- scipy/io/_harwell_boeing/hb.py +571 -0
- scipy/io/_harwell_boeing/tests/__init__.py +0 -0
- scipy/io/_harwell_boeing/tests/test_fortran_format.py +74 -0
- scipy/io/_harwell_boeing/tests/test_hb.py +70 -0
- scipy/io/_idl.py +917 -0
- scipy/io/_mmio.py +968 -0
- scipy/io/_netcdf.py +1104 -0
- scipy/io/_test_fortran.cp314-win_arm64.lib +0 -0
- scipy/io/_test_fortran.cp314-win_arm64.pyd +0 -0
- scipy/io/arff/__init__.py +28 -0
- scipy/io/arff/_arffread.py +873 -0
- scipy/io/arff/arffread.py +19 -0
- scipy/io/arff/tests/__init__.py +0 -0
- scipy/io/arff/tests/data/iris.arff +225 -0
- scipy/io/arff/tests/data/missing.arff +8 -0
- scipy/io/arff/tests/data/nodata.arff +11 -0
- scipy/io/arff/tests/data/quoted_nominal.arff +13 -0
- scipy/io/arff/tests/data/quoted_nominal_spaces.arff +13 -0
- scipy/io/arff/tests/data/test1.arff +10 -0
- scipy/io/arff/tests/data/test10.arff +8 -0
- scipy/io/arff/tests/data/test11.arff +11 -0
- scipy/io/arff/tests/data/test2.arff +15 -0
- scipy/io/arff/tests/data/test3.arff +6 -0
- scipy/io/arff/tests/data/test4.arff +11 -0
- scipy/io/arff/tests/data/test5.arff +26 -0
- scipy/io/arff/tests/data/test6.arff +12 -0
- scipy/io/arff/tests/data/test7.arff +15 -0
- scipy/io/arff/tests/data/test8.arff +12 -0
- scipy/io/arff/tests/data/test9.arff +14 -0
- scipy/io/arff/tests/test_arffread.py +421 -0
- scipy/io/harwell_boeing.py +17 -0
- scipy/io/idl.py +17 -0
- scipy/io/matlab/__init__.py +66 -0
- scipy/io/matlab/_byteordercodes.py +75 -0
- scipy/io/matlab/_mio.py +375 -0
- scipy/io/matlab/_mio4.py +632 -0
- scipy/io/matlab/_mio5.py +901 -0
- scipy/io/matlab/_mio5_params.py +281 -0
- scipy/io/matlab/_mio5_utils.cp314-win_arm64.lib +0 -0
- scipy/io/matlab/_mio5_utils.cp314-win_arm64.pyd +0 -0
- scipy/io/matlab/_mio_utils.cp314-win_arm64.lib +0 -0
- scipy/io/matlab/_mio_utils.cp314-win_arm64.pyd +0 -0
- scipy/io/matlab/_miobase.py +435 -0
- scipy/io/matlab/_streams.cp314-win_arm64.lib +0 -0
- scipy/io/matlab/_streams.cp314-win_arm64.pyd +0 -0
- scipy/io/matlab/byteordercodes.py +17 -0
- scipy/io/matlab/mio.py +16 -0
- scipy/io/matlab/mio4.py +17 -0
- scipy/io/matlab/mio5.py +19 -0
- scipy/io/matlab/mio5_params.py +18 -0
- scipy/io/matlab/mio5_utils.py +17 -0
- scipy/io/matlab/mio_utils.py +17 -0
- scipy/io/matlab/miobase.py +16 -0
- scipy/io/matlab/streams.py +16 -0
- scipy/io/matlab/tests/__init__.py +0 -0
- scipy/io/matlab/tests/data/bad_miuint32.mat +0 -0
- scipy/io/matlab/tests/data/bad_miutf8_array_name.mat +0 -0
- scipy/io/matlab/tests/data/big_endian.mat +0 -0
- scipy/io/matlab/tests/data/broken_utf8.mat +0 -0
- scipy/io/matlab/tests/data/corrupted_zlib_checksum.mat +0 -0
- scipy/io/matlab/tests/data/corrupted_zlib_data.mat +0 -0
- scipy/io/matlab/tests/data/debigged_m4.mat +0 -0
- scipy/io/matlab/tests/data/japanese_utf8.txt +5 -0
- scipy/io/matlab/tests/data/little_endian.mat +0 -0
- scipy/io/matlab/tests/data/logical_sparse.mat +0 -0
- scipy/io/matlab/tests/data/malformed1.mat +0 -0
- scipy/io/matlab/tests/data/miuint32_for_miint32.mat +0 -0
- scipy/io/matlab/tests/data/miutf8_array_name.mat +0 -0
- scipy/io/matlab/tests/data/nasty_duplicate_fieldnames.mat +0 -0
- scipy/io/matlab/tests/data/one_by_zero_char.mat +0 -0
- scipy/io/matlab/tests/data/parabola.mat +0 -0
- scipy/io/matlab/tests/data/single_empty_string.mat +0 -0
- scipy/io/matlab/tests/data/some_functions.mat +0 -0
- scipy/io/matlab/tests/data/sqr.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/test_empty_struct.mat +0 -0
- scipy/io/matlab/tests/data/test_mat4_le_floats.mat +0 -0
- scipy/io/matlab/tests/data/test_skip_variable.mat +0 -0
- scipy/io/matlab/tests/data/testbool_8_WIN64.mat +0 -0
- scipy/io/matlab/tests/data/testcell_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcell_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcell_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcell_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_5.3_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testfunc_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testhdf5_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testminus_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testminus_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testminus_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testminus_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testminus_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmulti_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testmulti_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmulti_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testobject_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testobject_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testobject_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testobject_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testscalarcell_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsimplecell.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsefloat_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststring_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststring_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststring_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststring_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststring_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testunicode_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testunicode_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testvec_4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/test_byteordercodes.py +29 -0
- scipy/io/matlab/tests/test_mio.py +1399 -0
- scipy/io/matlab/tests/test_mio5_utils.py +179 -0
- scipy/io/matlab/tests/test_mio_funcs.py +51 -0
- scipy/io/matlab/tests/test_mio_utils.py +45 -0
- scipy/io/matlab/tests/test_miobase.py +32 -0
- scipy/io/matlab/tests/test_pathological.py +33 -0
- scipy/io/matlab/tests/test_streams.py +241 -0
- scipy/io/mmio.py +17 -0
- scipy/io/netcdf.py +17 -0
- scipy/io/tests/__init__.py +0 -0
- scipy/io/tests/data/Transparent Busy.ani +0 -0
- scipy/io/tests/data/array_float32_1d.sav +0 -0
- scipy/io/tests/data/array_float32_2d.sav +0 -0
- scipy/io/tests/data/array_float32_3d.sav +0 -0
- scipy/io/tests/data/array_float32_4d.sav +0 -0
- scipy/io/tests/data/array_float32_5d.sav +0 -0
- scipy/io/tests/data/array_float32_6d.sav +0 -0
- scipy/io/tests/data/array_float32_7d.sav +0 -0
- scipy/io/tests/data/array_float32_8d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_1d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_2d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_3d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_4d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_5d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_6d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_7d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_8d.sav +0 -0
- scipy/io/tests/data/example_1.nc +0 -0
- scipy/io/tests/data/example_2.nc +0 -0
- scipy/io/tests/data/example_3_maskedvals.nc +0 -0
- scipy/io/tests/data/fortran-3x3d-2i.dat +0 -0
- scipy/io/tests/data/fortran-mixed.dat +0 -0
- scipy/io/tests/data/fortran-sf8-11x1x10.dat +0 -0
- scipy/io/tests/data/fortran-sf8-15x10x22.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x1x1.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x1x5.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x1x7.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x3x5.dat +0 -0
- scipy/io/tests/data/fortran-si4-11x1x10.dat +0 -0
- scipy/io/tests/data/fortran-si4-15x10x22.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x1x1.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x1x5.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x1x7.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x3x5.dat +0 -0
- scipy/io/tests/data/invalid_pointer.sav +0 -0
- scipy/io/tests/data/null_pointer.sav +0 -0
- scipy/io/tests/data/scalar_byte.sav +0 -0
- scipy/io/tests/data/scalar_byte_descr.sav +0 -0
- scipy/io/tests/data/scalar_complex32.sav +0 -0
- scipy/io/tests/data/scalar_complex64.sav +0 -0
- scipy/io/tests/data/scalar_float32.sav +0 -0
- scipy/io/tests/data/scalar_float64.sav +0 -0
- scipy/io/tests/data/scalar_heap_pointer.sav +0 -0
- scipy/io/tests/data/scalar_int16.sav +0 -0
- scipy/io/tests/data/scalar_int32.sav +0 -0
- scipy/io/tests/data/scalar_int64.sav +0 -0
- scipy/io/tests/data/scalar_string.sav +0 -0
- scipy/io/tests/data/scalar_uint16.sav +0 -0
- scipy/io/tests/data/scalar_uint32.sav +0 -0
- scipy/io/tests/data/scalar_uint64.sav +0 -0
- scipy/io/tests/data/struct_arrays.sav +0 -0
- scipy/io/tests/data/struct_arrays_byte_idl80.sav +0 -0
- scipy/io/tests/data/struct_arrays_replicated.sav +0 -0
- scipy/io/tests/data/struct_arrays_replicated_3d.sav +0 -0
- scipy/io/tests/data/struct_inherit.sav +0 -0
- scipy/io/tests/data/struct_pointer_arrays.sav +0 -0
- scipy/io/tests/data/struct_pointer_arrays_replicated.sav +0 -0
- scipy/io/tests/data/struct_pointer_arrays_replicated_3d.sav +0 -0
- scipy/io/tests/data/struct_pointers.sav +0 -0
- scipy/io/tests/data/struct_pointers_replicated.sav +0 -0
- scipy/io/tests/data/struct_pointers_replicated_3d.sav +0 -0
- scipy/io/tests/data/struct_scalars.sav +0 -0
- scipy/io/tests/data/struct_scalars_replicated.sav +0 -0
- scipy/io/tests/data/struct_scalars_replicated_3d.sav +0 -0
- scipy/io/tests/data/test-1234Hz-le-1ch-10S-20bit-extra.wav +0 -0
- scipy/io/tests/data/test-44100Hz-2ch-32bit-float-be.wav +0 -0
- scipy/io/tests/data/test-44100Hz-2ch-32bit-float-le.wav +0 -0
- scipy/io/tests/data/test-44100Hz-be-1ch-4bytes.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof-no-data.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-incomplete-chunk.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-rf64.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes.wav +0 -0
- scipy/io/tests/data/test-48000Hz-2ch-64bit-float-le-wavex.wav +0 -0
- scipy/io/tests/data/test-8000Hz-be-3ch-5S-24bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-1ch-1byte-ulaw.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-2ch-1byteu.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-inconsistent.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-rf64.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-36bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-45bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-53bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-64bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-4ch-9S-12bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-5ch-9S-5bit.wav +0 -0
- scipy/io/tests/data/various_compressed.sav +0 -0
- scipy/io/tests/test_fortran.py +264 -0
- scipy/io/tests/test_idl.py +483 -0
- scipy/io/tests/test_mmio.py +831 -0
- scipy/io/tests/test_netcdf.py +550 -0
- scipy/io/tests/test_paths.py +93 -0
- scipy/io/tests/test_wavfile.py +501 -0
- scipy/io/wavfile.py +938 -0
- scipy/linalg/__init__.pxd +1 -0
- scipy/linalg/__init__.py +236 -0
- scipy/linalg/_basic.py +2146 -0
- scipy/linalg/_blas_subroutines.h +164 -0
- scipy/linalg/_cythonized_array_utils.cp314-win_arm64.lib +0 -0
- scipy/linalg/_cythonized_array_utils.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_cythonized_array_utils.pxd +40 -0
- scipy/linalg/_cythonized_array_utils.pyi +16 -0
- scipy/linalg/_decomp.py +1645 -0
- scipy/linalg/_decomp_cholesky.py +413 -0
- scipy/linalg/_decomp_cossin.py +236 -0
- scipy/linalg/_decomp_interpolative.cp314-win_arm64.lib +0 -0
- scipy/linalg/_decomp_interpolative.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_decomp_ldl.py +356 -0
- scipy/linalg/_decomp_lu.py +401 -0
- scipy/linalg/_decomp_lu_cython.cp314-win_arm64.lib +0 -0
- scipy/linalg/_decomp_lu_cython.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_decomp_lu_cython.pyi +6 -0
- scipy/linalg/_decomp_polar.py +113 -0
- scipy/linalg/_decomp_qr.py +494 -0
- scipy/linalg/_decomp_qz.py +452 -0
- scipy/linalg/_decomp_schur.py +336 -0
- scipy/linalg/_decomp_svd.py +545 -0
- scipy/linalg/_decomp_update.cp314-win_arm64.lib +0 -0
- scipy/linalg/_decomp_update.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_expm_frechet.py +417 -0
- scipy/linalg/_fblas.cp314-win_arm64.lib +0 -0
- scipy/linalg/_fblas.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_flapack.cp314-win_arm64.lib +0 -0
- scipy/linalg/_flapack.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_lapack_subroutines.h +1521 -0
- scipy/linalg/_linalg_pythran.cp314-win_arm64.lib +0 -0
- scipy/linalg/_linalg_pythran.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_matfuncs.py +1050 -0
- scipy/linalg/_matfuncs_expm.cp314-win_arm64.lib +0 -0
- scipy/linalg/_matfuncs_expm.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_matfuncs_expm.pyi +6 -0
- scipy/linalg/_matfuncs_inv_ssq.py +886 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp314-win_arm64.lib +0 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +107 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cp314-win_arm64.lib +0 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_misc.py +191 -0
- scipy/linalg/_procrustes.py +113 -0
- scipy/linalg/_sketches.py +189 -0
- scipy/linalg/_solve_toeplitz.cp314-win_arm64.lib +0 -0
- scipy/linalg/_solve_toeplitz.cp314-win_arm64.pyd +0 -0
- scipy/linalg/_solvers.py +862 -0
- scipy/linalg/_special_matrices.py +1322 -0
- scipy/linalg/_testutils.py +65 -0
- scipy/linalg/basic.py +23 -0
- scipy/linalg/blas.py +495 -0
- scipy/linalg/cython_blas.cp314-win_arm64.lib +0 -0
- scipy/linalg/cython_blas.cp314-win_arm64.pyd +0 -0
- scipy/linalg/cython_blas.pxd +169 -0
- scipy/linalg/cython_blas.pyx +1432 -0
- scipy/linalg/cython_lapack.cp314-win_arm64.lib +0 -0
- scipy/linalg/cython_lapack.cp314-win_arm64.pyd +0 -0
- scipy/linalg/cython_lapack.pxd +1528 -0
- scipy/linalg/cython_lapack.pyx +12045 -0
- scipy/linalg/decomp.py +23 -0
- scipy/linalg/decomp_cholesky.py +21 -0
- scipy/linalg/decomp_lu.py +21 -0
- scipy/linalg/decomp_qr.py +20 -0
- scipy/linalg/decomp_schur.py +21 -0
- scipy/linalg/decomp_svd.py +21 -0
- scipy/linalg/interpolative.py +989 -0
- scipy/linalg/lapack.py +1081 -0
- scipy/linalg/matfuncs.py +23 -0
- scipy/linalg/misc.py +21 -0
- scipy/linalg/special_matrices.py +22 -0
- scipy/linalg/tests/__init__.py +0 -0
- scipy/linalg/tests/_cython_examples/extending.pyx +23 -0
- scipy/linalg/tests/_cython_examples/meson.build +34 -0
- scipy/linalg/tests/data/carex_15_data.npz +0 -0
- scipy/linalg/tests/data/carex_18_data.npz +0 -0
- scipy/linalg/tests/data/carex_19_data.npz +0 -0
- scipy/linalg/tests/data/carex_20_data.npz +0 -0
- scipy/linalg/tests/data/carex_6_data.npz +0 -0
- scipy/linalg/tests/data/gendare_20170120_data.npz +0 -0
- scipy/linalg/tests/test_basic.py +2074 -0
- scipy/linalg/tests/test_batch.py +588 -0
- scipy/linalg/tests/test_blas.py +1127 -0
- scipy/linalg/tests/test_cython_blas.py +118 -0
- scipy/linalg/tests/test_cython_lapack.py +22 -0
- scipy/linalg/tests/test_cythonized_array_utils.py +130 -0
- scipy/linalg/tests/test_decomp.py +3189 -0
- scipy/linalg/tests/test_decomp_cholesky.py +268 -0
- scipy/linalg/tests/test_decomp_cossin.py +314 -0
- scipy/linalg/tests/test_decomp_ldl.py +137 -0
- scipy/linalg/tests/test_decomp_lu.py +308 -0
- scipy/linalg/tests/test_decomp_polar.py +110 -0
- scipy/linalg/tests/test_decomp_update.py +1701 -0
- scipy/linalg/tests/test_extending.py +46 -0
- scipy/linalg/tests/test_fblas.py +607 -0
- scipy/linalg/tests/test_interpolative.py +232 -0
- scipy/linalg/tests/test_lapack.py +3620 -0
- scipy/linalg/tests/test_matfuncs.py +1125 -0
- scipy/linalg/tests/test_matmul_toeplitz.py +136 -0
- scipy/linalg/tests/test_procrustes.py +214 -0
- scipy/linalg/tests/test_sketches.py +118 -0
- scipy/linalg/tests/test_solve_toeplitz.py +150 -0
- scipy/linalg/tests/test_solvers.py +844 -0
- scipy/linalg/tests/test_special_matrices.py +636 -0
- scipy/misc/__init__.py +6 -0
- scipy/misc/common.py +6 -0
- scipy/misc/doccer.py +6 -0
- scipy/ndimage/__init__.py +174 -0
- scipy/ndimage/_ctest.cp314-win_arm64.lib +0 -0
- scipy/ndimage/_ctest.cp314-win_arm64.pyd +0 -0
- scipy/ndimage/_cytest.cp314-win_arm64.lib +0 -0
- scipy/ndimage/_cytest.cp314-win_arm64.pyd +0 -0
- scipy/ndimage/_delegators.py +303 -0
- scipy/ndimage/_filters.py +2422 -0
- scipy/ndimage/_fourier.py +306 -0
- scipy/ndimage/_interpolation.py +1033 -0
- scipy/ndimage/_measurements.py +1689 -0
- scipy/ndimage/_morphology.py +2634 -0
- scipy/ndimage/_nd_image.cp314-win_arm64.lib +0 -0
- scipy/ndimage/_nd_image.cp314-win_arm64.pyd +0 -0
- scipy/ndimage/_ndimage_api.py +16 -0
- scipy/ndimage/_ni_docstrings.py +214 -0
- scipy/ndimage/_ni_label.cp314-win_arm64.lib +0 -0
- scipy/ndimage/_ni_label.cp314-win_arm64.pyd +0 -0
- scipy/ndimage/_ni_support.py +139 -0
- scipy/ndimage/_rank_filter_1d.cp314-win_arm64.lib +0 -0
- scipy/ndimage/_rank_filter_1d.cp314-win_arm64.pyd +0 -0
- scipy/ndimage/_support_alternative_backends.py +84 -0
- scipy/ndimage/filters.py +27 -0
- scipy/ndimage/fourier.py +21 -0
- scipy/ndimage/interpolation.py +22 -0
- scipy/ndimage/measurements.py +24 -0
- scipy/ndimage/morphology.py +27 -0
- scipy/ndimage/tests/__init__.py +12 -0
- scipy/ndimage/tests/data/label_inputs.txt +21 -0
- scipy/ndimage/tests/data/label_results.txt +294 -0
- scipy/ndimage/tests/data/label_strels.txt +42 -0
- scipy/ndimage/tests/dots.png +0 -0
- scipy/ndimage/tests/test_c_api.py +102 -0
- scipy/ndimage/tests/test_datatypes.py +67 -0
- scipy/ndimage/tests/test_filters.py +3083 -0
- scipy/ndimage/tests/test_fourier.py +187 -0
- scipy/ndimage/tests/test_interpolation.py +1491 -0
- scipy/ndimage/tests/test_measurements.py +1592 -0
- scipy/ndimage/tests/test_morphology.py +2950 -0
- scipy/ndimage/tests/test_ni_support.py +78 -0
- scipy/ndimage/tests/test_splines.py +70 -0
- scipy/odr/__init__.py +131 -0
- scipy/odr/__odrpack.cp314-win_arm64.lib +0 -0
- scipy/odr/__odrpack.cp314-win_arm64.pyd +0 -0
- scipy/odr/_add_newdocs.py +34 -0
- scipy/odr/_models.py +315 -0
- scipy/odr/_odrpack.py +1154 -0
- scipy/odr/models.py +20 -0
- scipy/odr/odrpack.py +21 -0
- scipy/odr/tests/__init__.py +0 -0
- scipy/odr/tests/test_odr.py +607 -0
- scipy/optimize/__init__.pxd +1 -0
- scipy/optimize/__init__.py +460 -0
- scipy/optimize/_basinhopping.py +741 -0
- scipy/optimize/_bglu_dense.cp314-win_arm64.lib +0 -0
- scipy/optimize/_bglu_dense.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_bracket.py +706 -0
- scipy/optimize/_chandrupatla.py +551 -0
- scipy/optimize/_cobyla_py.py +297 -0
- scipy/optimize/_cobyqa_py.py +72 -0
- scipy/optimize/_constraints.py +598 -0
- scipy/optimize/_dcsrch.py +728 -0
- scipy/optimize/_differentiable_functions.py +835 -0
- scipy/optimize/_differentialevolution.py +1970 -0
- scipy/optimize/_direct.cp314-win_arm64.lib +0 -0
- scipy/optimize/_direct.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_direct_py.py +280 -0
- scipy/optimize/_dual_annealing.py +732 -0
- scipy/optimize/_elementwise.py +798 -0
- scipy/optimize/_group_columns.cp314-win_arm64.lib +0 -0
- scipy/optimize/_group_columns.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_hessian_update_strategy.py +479 -0
- scipy/optimize/_highspy/__init__.py +0 -0
- scipy/optimize/_highspy/_core.cp314-win_arm64.lib +0 -0
- scipy/optimize/_highspy/_core.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_highspy/_highs_options.cp314-win_arm64.lib +0 -0
- scipy/optimize/_highspy/_highs_options.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_highspy/_highs_wrapper.py +338 -0
- scipy/optimize/_isotonic.py +157 -0
- scipy/optimize/_lbfgsb.cp314-win_arm64.lib +0 -0
- scipy/optimize/_lbfgsb.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_lbfgsb_py.py +634 -0
- scipy/optimize/_linesearch.py +896 -0
- scipy/optimize/_linprog.py +733 -0
- scipy/optimize/_linprog_doc.py +1434 -0
- scipy/optimize/_linprog_highs.py +422 -0
- scipy/optimize/_linprog_ip.py +1141 -0
- scipy/optimize/_linprog_rs.py +572 -0
- scipy/optimize/_linprog_simplex.py +663 -0
- scipy/optimize/_linprog_util.py +1521 -0
- scipy/optimize/_lsap.cp314-win_arm64.lib +0 -0
- scipy/optimize/_lsap.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_lsq/__init__.py +5 -0
- scipy/optimize/_lsq/bvls.py +183 -0
- scipy/optimize/_lsq/common.py +731 -0
- scipy/optimize/_lsq/dogbox.py +345 -0
- scipy/optimize/_lsq/givens_elimination.cp314-win_arm64.lib +0 -0
- scipy/optimize/_lsq/givens_elimination.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_lsq/least_squares.py +1044 -0
- scipy/optimize/_lsq/lsq_linear.py +361 -0
- scipy/optimize/_lsq/trf.py +587 -0
- scipy/optimize/_lsq/trf_linear.py +249 -0
- scipy/optimize/_milp.py +394 -0
- scipy/optimize/_minimize.py +1199 -0
- scipy/optimize/_minpack.cp314-win_arm64.lib +0 -0
- scipy/optimize/_minpack.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_minpack_py.py +1178 -0
- scipy/optimize/_moduleTNC.cp314-win_arm64.lib +0 -0
- scipy/optimize/_moduleTNC.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_nnls.py +96 -0
- scipy/optimize/_nonlin.py +1634 -0
- scipy/optimize/_numdiff.py +963 -0
- scipy/optimize/_optimize.py +4169 -0
- scipy/optimize/_pava_pybind.cp314-win_arm64.lib +0 -0
- scipy/optimize/_pava_pybind.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_qap.py +760 -0
- scipy/optimize/_remove_redundancy.py +522 -0
- scipy/optimize/_root.py +732 -0
- scipy/optimize/_root_scalar.py +538 -0
- scipy/optimize/_shgo.py +1606 -0
- scipy/optimize/_shgo_lib/__init__.py +0 -0
- scipy/optimize/_shgo_lib/_complex.py +1225 -0
- scipy/optimize/_shgo_lib/_vertex.py +460 -0
- scipy/optimize/_slsqp_py.py +603 -0
- scipy/optimize/_slsqplib.cp314-win_arm64.lib +0 -0
- scipy/optimize/_slsqplib.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_spectral.py +260 -0
- scipy/optimize/_tnc.py +438 -0
- scipy/optimize/_trlib/__init__.py +12 -0
- scipy/optimize/_trlib/_trlib.cp314-win_arm64.lib +0 -0
- scipy/optimize/_trlib/_trlib.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_trustregion.py +318 -0
- scipy/optimize/_trustregion_constr/__init__.py +6 -0
- scipy/optimize/_trustregion_constr/canonical_constraint.py +390 -0
- scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +231 -0
- scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +584 -0
- scipy/optimize/_trustregion_constr/projections.py +411 -0
- scipy/optimize/_trustregion_constr/qp_subproblem.py +637 -0
- scipy/optimize/_trustregion_constr/report.py +49 -0
- scipy/optimize/_trustregion_constr/tests/__init__.py +0 -0
- scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py +296 -0
- scipy/optimize/_trustregion_constr/tests/test_nested_minimize.py +39 -0
- scipy/optimize/_trustregion_constr/tests/test_projections.py +214 -0
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +645 -0
- scipy/optimize/_trustregion_constr/tests/test_report.py +34 -0
- scipy/optimize/_trustregion_constr/tr_interior_point.py +361 -0
- scipy/optimize/_trustregion_dogleg.py +122 -0
- scipy/optimize/_trustregion_exact.py +437 -0
- scipy/optimize/_trustregion_krylov.py +65 -0
- scipy/optimize/_trustregion_ncg.py +126 -0
- scipy/optimize/_tstutils.py +972 -0
- scipy/optimize/_zeros.cp314-win_arm64.lib +0 -0
- scipy/optimize/_zeros.cp314-win_arm64.pyd +0 -0
- scipy/optimize/_zeros_py.py +1475 -0
- scipy/optimize/cobyla.py +19 -0
- scipy/optimize/cython_optimize/__init__.py +133 -0
- scipy/optimize/cython_optimize/_zeros.cp314-win_arm64.lib +0 -0
- scipy/optimize/cython_optimize/_zeros.cp314-win_arm64.pyd +0 -0
- scipy/optimize/cython_optimize/_zeros.pxd +33 -0
- scipy/optimize/cython_optimize/c_zeros.pxd +26 -0
- scipy/optimize/cython_optimize.pxd +11 -0
- scipy/optimize/elementwise.py +38 -0
- scipy/optimize/lbfgsb.py +23 -0
- scipy/optimize/linesearch.py +18 -0
- scipy/optimize/minpack.py +27 -0
- scipy/optimize/minpack2.py +17 -0
- scipy/optimize/moduleTNC.py +19 -0
- scipy/optimize/nonlin.py +29 -0
- scipy/optimize/optimize.py +40 -0
- scipy/optimize/slsqp.py +22 -0
- scipy/optimize/tests/__init__.py +0 -0
- scipy/optimize/tests/_cython_examples/extending.pyx +43 -0
- scipy/optimize/tests/_cython_examples/meson.build +32 -0
- scipy/optimize/tests/test__basinhopping.py +535 -0
- scipy/optimize/tests/test__differential_evolution.py +1703 -0
- scipy/optimize/tests/test__dual_annealing.py +416 -0
- scipy/optimize/tests/test__linprog_clean_inputs.py +312 -0
- scipy/optimize/tests/test__numdiff.py +885 -0
- scipy/optimize/tests/test__remove_redundancy.py +228 -0
- scipy/optimize/tests/test__root.py +124 -0
- scipy/optimize/tests/test__shgo.py +1164 -0
- scipy/optimize/tests/test__spectral.py +226 -0
- scipy/optimize/tests/test_bracket.py +896 -0
- scipy/optimize/tests/test_chandrupatla.py +982 -0
- scipy/optimize/tests/test_cobyla.py +195 -0
- scipy/optimize/tests/test_cobyqa.py +252 -0
- scipy/optimize/tests/test_constraint_conversion.py +286 -0
- scipy/optimize/tests/test_constraints.py +255 -0
- scipy/optimize/tests/test_cython_optimize.py +92 -0
- scipy/optimize/tests/test_differentiable_functions.py +1025 -0
- scipy/optimize/tests/test_direct.py +321 -0
- scipy/optimize/tests/test_extending.py +28 -0
- scipy/optimize/tests/test_hessian_update_strategy.py +300 -0
- scipy/optimize/tests/test_isotonic_regression.py +167 -0
- scipy/optimize/tests/test_lbfgsb_hessinv.py +65 -0
- scipy/optimize/tests/test_lbfgsb_setulb.py +122 -0
- scipy/optimize/tests/test_least_squares.py +986 -0
- scipy/optimize/tests/test_linear_assignment.py +116 -0
- scipy/optimize/tests/test_linesearch.py +328 -0
- scipy/optimize/tests/test_linprog.py +2577 -0
- scipy/optimize/tests/test_lsq_common.py +297 -0
- scipy/optimize/tests/test_lsq_linear.py +287 -0
- scipy/optimize/tests/test_milp.py +459 -0
- scipy/optimize/tests/test_minimize_constrained.py +845 -0
- scipy/optimize/tests/test_minpack.py +1194 -0
- scipy/optimize/tests/test_nnls.py +469 -0
- scipy/optimize/tests/test_nonlin.py +572 -0
- scipy/optimize/tests/test_optimize.py +3344 -0
- scipy/optimize/tests/test_quadratic_assignment.py +455 -0
- scipy/optimize/tests/test_regression.py +40 -0
- scipy/optimize/tests/test_slsqp.py +645 -0
- scipy/optimize/tests/test_tnc.py +345 -0
- scipy/optimize/tests/test_trustregion.py +110 -0
- scipy/optimize/tests/test_trustregion_exact.py +351 -0
- scipy/optimize/tests/test_trustregion_krylov.py +170 -0
- scipy/optimize/tests/test_zeros.py +998 -0
- scipy/optimize/tnc.py +22 -0
- scipy/optimize/zeros.py +26 -0
- scipy/signal/__init__.py +316 -0
- scipy/signal/_arraytools.py +264 -0
- scipy/signal/_czt.py +575 -0
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +5893 -0
- scipy/signal/_fir_filter_design.py +1458 -0
- scipy/signal/_lti_conversion.py +534 -0
- scipy/signal/_ltisys.py +3546 -0
- scipy/signal/_max_len_seq.py +139 -0
- scipy/signal/_max_len_seq_inner.cp314-win_arm64.lib +0 -0
- scipy/signal/_max_len_seq_inner.cp314-win_arm64.pyd +0 -0
- scipy/signal/_peak_finding.py +1310 -0
- scipy/signal/_peak_finding_utils.cp314-win_arm64.lib +0 -0
- scipy/signal/_peak_finding_utils.cp314-win_arm64.pyd +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_savitzky_golay.py +357 -0
- scipy/signal/_short_time_fft.py +2228 -0
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +5309 -0
- scipy/signal/_sigtools.cp314-win_arm64.lib +0 -0
- scipy/signal/_sigtools.cp314-win_arm64.pyd +0 -0
- scipy/signal/_sosfilt.cp314-win_arm64.lib +0 -0
- scipy/signal/_sosfilt.cp314-win_arm64.pyd +0 -0
- scipy/signal/_spectral_py.py +2471 -0
- scipy/signal/_spline.cp314-win_arm64.lib +0 -0
- scipy/signal/_spline.cp314-win_arm64.pyd +0 -0
- scipy/signal/_spline.pyi +34 -0
- scipy/signal/_spline_filters.py +848 -0
- scipy/signal/_support_alternative_backends.py +73 -0
- scipy/signal/_upfirdn.py +219 -0
- scipy/signal/_upfirdn_apply.cp314-win_arm64.lib +0 -0
- scipy/signal/_upfirdn_apply.cp314-win_arm64.pyd +0 -0
- scipy/signal/_waveforms.py +687 -0
- scipy/signal/_wavelets.py +29 -0
- scipy/signal/bsplines.py +21 -0
- scipy/signal/filter_design.py +28 -0
- scipy/signal/fir_filter_design.py +21 -0
- scipy/signal/lti_conversion.py +20 -0
- scipy/signal/ltisys.py +25 -0
- scipy/signal/signaltools.py +27 -0
- scipy/signal/spectral.py +21 -0
- scipy/signal/spline.py +18 -0
- scipy/signal/tests/__init__.py +0 -0
- scipy/signal/tests/_scipy_spectral_test_shim.py +311 -0
- scipy/signal/tests/mpsig.py +122 -0
- scipy/signal/tests/test_array_tools.py +111 -0
- scipy/signal/tests/test_bsplines.py +365 -0
- scipy/signal/tests/test_cont2discrete.py +424 -0
- scipy/signal/tests/test_czt.py +221 -0
- scipy/signal/tests/test_dltisys.py +599 -0
- scipy/signal/tests/test_filter_design.py +4744 -0
- scipy/signal/tests/test_fir_filter_design.py +851 -0
- scipy/signal/tests/test_ltisys.py +1225 -0
- scipy/signal/tests/test_max_len_seq.py +71 -0
- scipy/signal/tests/test_peak_finding.py +915 -0
- scipy/signal/tests/test_result_type.py +51 -0
- scipy/signal/tests/test_savitzky_golay.py +363 -0
- scipy/signal/tests/test_short_time_fft.py +1107 -0
- scipy/signal/tests/test_signaltools.py +4735 -0
- scipy/signal/tests/test_spectral.py +2141 -0
- scipy/signal/tests/test_splines.py +427 -0
- scipy/signal/tests/test_upfirdn.py +322 -0
- scipy/signal/tests/test_waveforms.py +400 -0
- scipy/signal/tests/test_wavelets.py +59 -0
- scipy/signal/tests/test_windows.py +987 -0
- scipy/signal/waveforms.py +20 -0
- scipy/signal/wavelets.py +17 -0
- scipy/signal/windows/__init__.py +52 -0
- scipy/signal/windows/_windows.py +2513 -0
- scipy/signal/windows/windows.py +23 -0
- scipy/sparse/__init__.py +350 -0
- scipy/sparse/_base.py +1613 -0
- scipy/sparse/_bsr.py +880 -0
- scipy/sparse/_compressed.py +1328 -0
- scipy/sparse/_construct.py +1454 -0
- scipy/sparse/_coo.py +1581 -0
- scipy/sparse/_csc.py +367 -0
- scipy/sparse/_csparsetools.cp314-win_arm64.lib +0 -0
- scipy/sparse/_csparsetools.cp314-win_arm64.pyd +0 -0
- scipy/sparse/_csr.py +558 -0
- scipy/sparse/_data.py +569 -0
- scipy/sparse/_dia.py +677 -0
- scipy/sparse/_dok.py +669 -0
- scipy/sparse/_extract.py +178 -0
- scipy/sparse/_index.py +444 -0
- scipy/sparse/_lil.py +632 -0
- scipy/sparse/_matrix.py +169 -0
- scipy/sparse/_matrix_io.py +167 -0
- scipy/sparse/_sparsetools.cp314-win_arm64.lib +0 -0
- scipy/sparse/_sparsetools.cp314-win_arm64.pyd +0 -0
- scipy/sparse/_spfuncs.py +76 -0
- scipy/sparse/_sputils.py +632 -0
- scipy/sparse/base.py +24 -0
- scipy/sparse/bsr.py +22 -0
- scipy/sparse/compressed.py +20 -0
- scipy/sparse/construct.py +38 -0
- scipy/sparse/coo.py +23 -0
- scipy/sparse/csc.py +22 -0
- scipy/sparse/csgraph/__init__.py +210 -0
- scipy/sparse/csgraph/_flow.cp314-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_flow.cp314-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_laplacian.py +563 -0
- scipy/sparse/csgraph/_matching.cp314-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_matching.cp314-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp314-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cp314-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_reordering.cp314-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_reordering.cp314-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_shortest_path.cp314-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_shortest_path.cp314-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_tools.cp314-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_tools.cp314-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_traversal.cp314-win_arm64.lib +0 -0
- scipy/sparse/csgraph/_traversal.cp314-win_arm64.pyd +0 -0
- scipy/sparse/csgraph/_validation.py +66 -0
- scipy/sparse/csgraph/tests/__init__.py +0 -0
- scipy/sparse/csgraph/tests/test_connected_components.py +119 -0
- scipy/sparse/csgraph/tests/test_conversions.py +61 -0
- scipy/sparse/csgraph/tests/test_flow.py +209 -0
- scipy/sparse/csgraph/tests/test_graph_laplacian.py +368 -0
- scipy/sparse/csgraph/tests/test_matching.py +307 -0
- scipy/sparse/csgraph/tests/test_pydata_sparse.py +197 -0
- scipy/sparse/csgraph/tests/test_reordering.py +70 -0
- scipy/sparse/csgraph/tests/test_shortest_path.py +540 -0
- scipy/sparse/csgraph/tests/test_spanning_tree.py +66 -0
- scipy/sparse/csgraph/tests/test_traversal.py +148 -0
- scipy/sparse/csr.py +22 -0
- scipy/sparse/data.py +18 -0
- scipy/sparse/dia.py +22 -0
- scipy/sparse/dok.py +22 -0
- scipy/sparse/extract.py +23 -0
- scipy/sparse/lil.py +22 -0
- scipy/sparse/linalg/__init__.py +148 -0
- scipy/sparse/linalg/_dsolve/__init__.py +71 -0
- scipy/sparse/linalg/_dsolve/_add_newdocs.py +147 -0
- scipy/sparse/linalg/_dsolve/_superlu.cp314-win_arm64.lib +0 -0
- scipy/sparse/linalg/_dsolve/_superlu.cp314-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_dsolve/linsolve.py +882 -0
- scipy/sparse/linalg/_dsolve/tests/__init__.py +0 -0
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +928 -0
- scipy/sparse/linalg/_eigen/__init__.py +22 -0
- scipy/sparse/linalg/_eigen/_svds.py +540 -0
- scipy/sparse/linalg/_eigen/_svds_doc.py +382 -0
- scipy/sparse/linalg/_eigen/arpack/COPYING +45 -0
- scipy/sparse/linalg/_eigen/arpack/__init__.py +20 -0
- scipy/sparse/linalg/_eigen/arpack/_arpack.cp314-win_arm64.lib +0 -0
- scipy/sparse/linalg/_eigen/arpack/_arpack.cp314-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +1706 -0
- scipy/sparse/linalg/_eigen/arpack/tests/__init__.py +0 -0
- scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py +717 -0
- scipy/sparse/linalg/_eigen/lobpcg/__init__.py +16 -0
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +1110 -0
- scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py +0 -0
- scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py +725 -0
- scipy/sparse/linalg/_eigen/tests/__init__.py +0 -0
- scipy/sparse/linalg/_eigen/tests/test_svds.py +886 -0
- scipy/sparse/linalg/_expm_multiply.py +816 -0
- scipy/sparse/linalg/_interface.py +920 -0
- scipy/sparse/linalg/_isolve/__init__.py +20 -0
- scipy/sparse/linalg/_isolve/_gcrotmk.py +503 -0
- scipy/sparse/linalg/_isolve/iterative.py +1051 -0
- scipy/sparse/linalg/_isolve/lgmres.py +230 -0
- scipy/sparse/linalg/_isolve/lsmr.py +486 -0
- scipy/sparse/linalg/_isolve/lsqr.py +589 -0
- scipy/sparse/linalg/_isolve/minres.py +372 -0
- scipy/sparse/linalg/_isolve/tests/__init__.py +0 -0
- scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py +183 -0
- scipy/sparse/linalg/_isolve/tests/test_iterative.py +809 -0
- scipy/sparse/linalg/_isolve/tests/test_lgmres.py +225 -0
- scipy/sparse/linalg/_isolve/tests/test_lsmr.py +185 -0
- scipy/sparse/linalg/_isolve/tests/test_lsqr.py +120 -0
- scipy/sparse/linalg/_isolve/tests/test_minres.py +97 -0
- scipy/sparse/linalg/_isolve/tests/test_utils.py +9 -0
- scipy/sparse/linalg/_isolve/tfqmr.py +179 -0
- scipy/sparse/linalg/_isolve/utils.py +121 -0
- scipy/sparse/linalg/_matfuncs.py +940 -0
- scipy/sparse/linalg/_norm.py +195 -0
- scipy/sparse/linalg/_onenormest.py +467 -0
- scipy/sparse/linalg/_propack/_cpropack.cp314-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_cpropack.cp314-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp314-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cp314-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp314-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_spropack.cp314-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp314-win_arm64.lib +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cp314-win_arm64.pyd +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +949 -0
- scipy/sparse/linalg/_svdp.py +309 -0
- scipy/sparse/linalg/dsolve.py +22 -0
- scipy/sparse/linalg/eigen.py +21 -0
- scipy/sparse/linalg/interface.py +20 -0
- scipy/sparse/linalg/isolve.py +22 -0
- scipy/sparse/linalg/matfuncs.py +18 -0
- scipy/sparse/linalg/tests/__init__.py +0 -0
- scipy/sparse/linalg/tests/propack_test_data.npz +0 -0
- scipy/sparse/linalg/tests/test_expm_multiply.py +367 -0
- scipy/sparse/linalg/tests/test_interface.py +561 -0
- scipy/sparse/linalg/tests/test_matfuncs.py +592 -0
- scipy/sparse/linalg/tests/test_norm.py +154 -0
- scipy/sparse/linalg/tests/test_onenormest.py +252 -0
- scipy/sparse/linalg/tests/test_propack.py +165 -0
- scipy/sparse/linalg/tests/test_pydata_sparse.py +272 -0
- scipy/sparse/linalg/tests/test_special_sparse_arrays.py +337 -0
- scipy/sparse/sparsetools.py +17 -0
- scipy/sparse/spfuncs.py +17 -0
- scipy/sparse/sputils.py +17 -0
- scipy/sparse/tests/__init__.py +0 -0
- scipy/sparse/tests/data/csc_py2.npz +0 -0
- scipy/sparse/tests/data/csc_py3.npz +0 -0
- scipy/sparse/tests/test_arithmetic1d.py +341 -0
- scipy/sparse/tests/test_array_api.py +561 -0
- scipy/sparse/tests/test_base.py +5870 -0
- scipy/sparse/tests/test_common1d.py +447 -0
- scipy/sparse/tests/test_construct.py +872 -0
- scipy/sparse/tests/test_coo.py +1119 -0
- scipy/sparse/tests/test_csc.py +98 -0
- scipy/sparse/tests/test_csr.py +214 -0
- scipy/sparse/tests/test_dok.py +209 -0
- scipy/sparse/tests/test_extract.py +51 -0
- scipy/sparse/tests/test_indexing1d.py +603 -0
- scipy/sparse/tests/test_matrix_io.py +109 -0
- scipy/sparse/tests/test_minmax1d.py +128 -0
- scipy/sparse/tests/test_sparsetools.py +344 -0
- scipy/sparse/tests/test_spfuncs.py +97 -0
- scipy/sparse/tests/test_sputils.py +424 -0
- scipy/spatial/__init__.py +129 -0
- scipy/spatial/_ckdtree.cp314-win_arm64.lib +0 -0
- scipy/spatial/_ckdtree.cp314-win_arm64.pyd +0 -0
- scipy/spatial/_distance_pybind.cp314-win_arm64.lib +0 -0
- scipy/spatial/_distance_pybind.cp314-win_arm64.pyd +0 -0
- scipy/spatial/_distance_wrap.cp314-win_arm64.lib +0 -0
- scipy/spatial/_distance_wrap.cp314-win_arm64.pyd +0 -0
- scipy/spatial/_geometric_slerp.py +238 -0
- scipy/spatial/_hausdorff.cp314-win_arm64.lib +0 -0
- scipy/spatial/_hausdorff.cp314-win_arm64.pyd +0 -0
- scipy/spatial/_kdtree.py +920 -0
- scipy/spatial/_plotutils.py +274 -0
- scipy/spatial/_procrustes.py +132 -0
- scipy/spatial/_qhull.cp314-win_arm64.lib +0 -0
- scipy/spatial/_qhull.cp314-win_arm64.pyd +0 -0
- scipy/spatial/_qhull.pyi +213 -0
- scipy/spatial/_spherical_voronoi.py +341 -0
- scipy/spatial/_voronoi.cp314-win_arm64.lib +0 -0
- scipy/spatial/_voronoi.cp314-win_arm64.pyd +0 -0
- scipy/spatial/_voronoi.pyi +4 -0
- scipy/spatial/ckdtree.py +18 -0
- scipy/spatial/distance.py +3147 -0
- scipy/spatial/distance.pyi +210 -0
- scipy/spatial/kdtree.py +25 -0
- scipy/spatial/qhull.py +25 -0
- scipy/spatial/qhull_src/COPYING_QHULL.txt +39 -0
- scipy/spatial/tests/__init__.py +0 -0
- scipy/spatial/tests/data/cdist-X1.txt +10 -0
- scipy/spatial/tests/data/cdist-X2.txt +20 -0
- scipy/spatial/tests/data/degenerate_pointset.npz +0 -0
- scipy/spatial/tests/data/iris.txt +150 -0
- scipy/spatial/tests/data/pdist-boolean-inp.txt +20 -0
- scipy/spatial/tests/data/pdist-chebyshev-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-chebyshev-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-cityblock-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-cityblock-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-correlation-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-correlation-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-cosine-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-cosine-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-double-inp.txt +20 -0
- scipy/spatial/tests/data/pdist-euclidean-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-euclidean-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-hamming-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-jaccard-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-jensenshannon-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-jensenshannon-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-minkowski-3.2-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-minkowski-3.2-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-minkowski-5.8-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-seuclidean-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-seuclidean-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-spearman-ml.txt +1 -0
- scipy/spatial/tests/data/random-bool-data.txt +100 -0
- scipy/spatial/tests/data/random-double-data.txt +100 -0
- scipy/spatial/tests/data/random-int-data.txt +100 -0
- scipy/spatial/tests/data/random-uint-data.txt +100 -0
- scipy/spatial/tests/data/selfdual-4d-polytope.txt +27 -0
- scipy/spatial/tests/test__plotutils.py +91 -0
- scipy/spatial/tests/test__procrustes.py +116 -0
- scipy/spatial/tests/test_distance.py +2389 -0
- scipy/spatial/tests/test_hausdorff.py +199 -0
- scipy/spatial/tests/test_kdtree.py +1536 -0
- scipy/spatial/tests/test_qhull.py +1313 -0
- scipy/spatial/tests/test_slerp.py +417 -0
- scipy/spatial/tests/test_spherical_voronoi.py +358 -0
- scipy/spatial/transform/__init__.py +31 -0
- scipy/spatial/transform/_rigid_transform.cp314-win_arm64.lib +0 -0
- scipy/spatial/transform/_rigid_transform.cp314-win_arm64.pyd +0 -0
- scipy/spatial/transform/_rotation.cp314-win_arm64.lib +0 -0
- scipy/spatial/transform/_rotation.cp314-win_arm64.pyd +0 -0
- scipy/spatial/transform/_rotation_groups.py +140 -0
- scipy/spatial/transform/_rotation_spline.py +460 -0
- scipy/spatial/transform/rotation.py +21 -0
- scipy/spatial/transform/tests/__init__.py +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +2569 -0
- scipy/spatial/transform/tests/test_rotation_groups.py +169 -0
- scipy/spatial/transform/tests/test_rotation_spline.py +183 -0
- scipy/special/__init__.pxd +1 -0
- scipy/special/__init__.py +841 -0
- scipy/special/_add_newdocs.py +9961 -0
- scipy/special/_basic.py +3576 -0
- scipy/special/_comb.cp314-win_arm64.lib +0 -0
- scipy/special/_comb.cp314-win_arm64.pyd +0 -0
- scipy/special/_ellip_harm.py +214 -0
- scipy/special/_ellip_harm_2.cp314-win_arm64.lib +0 -0
- scipy/special/_ellip_harm_2.cp314-win_arm64.pyd +0 -0
- scipy/special/_gufuncs.cp314-win_arm64.lib +0 -0
- scipy/special/_gufuncs.cp314-win_arm64.pyd +0 -0
- scipy/special/_input_validation.py +17 -0
- scipy/special/_lambertw.py +149 -0
- scipy/special/_logsumexp.py +426 -0
- scipy/special/_mptestutils.py +453 -0
- scipy/special/_multiufuncs.py +610 -0
- scipy/special/_orthogonal.py +2592 -0
- scipy/special/_orthogonal.pyi +330 -0
- scipy/special/_precompute/__init__.py +0 -0
- scipy/special/_precompute/cosine_cdf.py +17 -0
- scipy/special/_precompute/expn_asy.py +54 -0
- scipy/special/_precompute/gammainc_asy.py +116 -0
- scipy/special/_precompute/gammainc_data.py +124 -0
- scipy/special/_precompute/hyp2f1_data.py +484 -0
- scipy/special/_precompute/lambertw.py +68 -0
- scipy/special/_precompute/loggamma.py +43 -0
- scipy/special/_precompute/struve_convergence.py +131 -0
- scipy/special/_precompute/utils.py +38 -0
- scipy/special/_precompute/wright_bessel.py +342 -0
- scipy/special/_precompute/wright_bessel_data.py +152 -0
- scipy/special/_precompute/wrightomega.py +41 -0
- scipy/special/_precompute/zetac.py +27 -0
- scipy/special/_sf_error.py +15 -0
- scipy/special/_specfun.cp314-win_arm64.lib +0 -0
- scipy/special/_specfun.cp314-win_arm64.pyd +0 -0
- scipy/special/_special_ufuncs.cp314-win_arm64.lib +0 -0
- scipy/special/_special_ufuncs.cp314-win_arm64.pyd +0 -0
- scipy/special/_spfun_stats.py +106 -0
- scipy/special/_spherical_bessel.py +397 -0
- scipy/special/_support_alternative_backends.py +295 -0
- scipy/special/_test_internal.cp314-win_arm64.lib +0 -0
- scipy/special/_test_internal.cp314-win_arm64.pyd +0 -0
- scipy/special/_test_internal.pyi +9 -0
- scipy/special/_testutils.py +321 -0
- scipy/special/_ufuncs.cp314-win_arm64.lib +0 -0
- scipy/special/_ufuncs.cp314-win_arm64.pyd +0 -0
- scipy/special/_ufuncs.pyi +522 -0
- scipy/special/_ufuncs.pyx +13173 -0
- scipy/special/_ufuncs_cxx.cp314-win_arm64.lib +0 -0
- scipy/special/_ufuncs_cxx.cp314-win_arm64.pyd +0 -0
- scipy/special/_ufuncs_cxx.pxd +142 -0
- scipy/special/_ufuncs_cxx.pyx +427 -0
- scipy/special/_ufuncs_cxx_defs.h +147 -0
- scipy/special/_ufuncs_defs.h +57 -0
- scipy/special/add_newdocs.py +15 -0
- scipy/special/basic.py +87 -0
- scipy/special/cython_special.cp314-win_arm64.lib +0 -0
- scipy/special/cython_special.cp314-win_arm64.pyd +0 -0
- scipy/special/cython_special.pxd +259 -0
- scipy/special/cython_special.pyi +3 -0
- scipy/special/orthogonal.py +45 -0
- scipy/special/sf_error.py +20 -0
- scipy/special/specfun.py +24 -0
- scipy/special/spfun_stats.py +17 -0
- scipy/special/tests/__init__.py +0 -0
- scipy/special/tests/_cython_examples/extending.pyx +12 -0
- scipy/special/tests/_cython_examples/meson.build +34 -0
- scipy/special/tests/data/__init__.py +0 -0
- scipy/special/tests/data/boost.npz +0 -0
- scipy/special/tests/data/gsl.npz +0 -0
- scipy/special/tests/data/local.npz +0 -0
- scipy/special/tests/test_basic.py +4815 -0
- scipy/special/tests/test_bdtr.py +112 -0
- scipy/special/tests/test_boost_ufuncs.py +64 -0
- scipy/special/tests/test_boxcox.py +125 -0
- scipy/special/tests/test_cdflib.py +712 -0
- scipy/special/tests/test_cdft_asymptotic.py +49 -0
- scipy/special/tests/test_cephes_intp_cast.py +29 -0
- scipy/special/tests/test_cosine_distr.py +83 -0
- scipy/special/tests/test_cython_special.py +363 -0
- scipy/special/tests/test_data.py +719 -0
- scipy/special/tests/test_dd.py +42 -0
- scipy/special/tests/test_digamma.py +45 -0
- scipy/special/tests/test_ellip_harm.py +278 -0
- scipy/special/tests/test_erfinv.py +89 -0
- scipy/special/tests/test_exponential_integrals.py +118 -0
- scipy/special/tests/test_extending.py +28 -0
- scipy/special/tests/test_faddeeva.py +85 -0
- scipy/special/tests/test_gamma.py +12 -0
- scipy/special/tests/test_gammainc.py +152 -0
- scipy/special/tests/test_hyp2f1.py +2566 -0
- scipy/special/tests/test_hypergeometric.py +234 -0
- scipy/special/tests/test_iv_ratio.py +249 -0
- scipy/special/tests/test_kolmogorov.py +491 -0
- scipy/special/tests/test_lambertw.py +109 -0
- scipy/special/tests/test_legendre.py +1518 -0
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_loggamma.py +70 -0
- scipy/special/tests/test_logit.py +162 -0
- scipy/special/tests/test_logsumexp.py +469 -0
- scipy/special/tests/test_mpmath.py +2293 -0
- scipy/special/tests/test_nan_inputs.py +65 -0
- scipy/special/tests/test_ndtr.py +77 -0
- scipy/special/tests/test_ndtri_exp.py +94 -0
- scipy/special/tests/test_orthogonal.py +821 -0
- scipy/special/tests/test_orthogonal_eval.py +275 -0
- scipy/special/tests/test_owens_t.py +53 -0
- scipy/special/tests/test_pcf.py +24 -0
- scipy/special/tests/test_pdtr.py +48 -0
- scipy/special/tests/test_powm1.py +65 -0
- scipy/special/tests/test_precompute_expn_asy.py +24 -0
- scipy/special/tests/test_precompute_gammainc.py +108 -0
- scipy/special/tests/test_precompute_utils.py +36 -0
- scipy/special/tests/test_round.py +18 -0
- scipy/special/tests/test_sf_error.py +146 -0
- scipy/special/tests/test_sici.py +36 -0
- scipy/special/tests/test_specfun.py +48 -0
- scipy/special/tests/test_spence.py +32 -0
- scipy/special/tests/test_spfun_stats.py +61 -0
- scipy/special/tests/test_sph_harm.py +85 -0
- scipy/special/tests/test_spherical_bessel.py +400 -0
- scipy/special/tests/test_support_alternative_backends.py +248 -0
- scipy/special/tests/test_trig.py +72 -0
- scipy/special/tests/test_ufunc_signatures.py +46 -0
- scipy/special/tests/test_wright_bessel.py +205 -0
- scipy/special/tests/test_wrightomega.py +117 -0
- scipy/special/tests/test_zeta.py +301 -0
- scipy/stats/__init__.py +670 -0
- scipy/stats/_ansari_swilk_statistics.cp314-win_arm64.lib +0 -0
- scipy/stats/_ansari_swilk_statistics.cp314-win_arm64.pyd +0 -0
- scipy/stats/_axis_nan_policy.py +692 -0
- scipy/stats/_biasedurn.cp314-win_arm64.lib +0 -0
- scipy/stats/_biasedurn.cp314-win_arm64.pyd +0 -0
- scipy/stats/_biasedurn.pxd +27 -0
- scipy/stats/_binned_statistic.py +795 -0
- scipy/stats/_binomtest.py +375 -0
- scipy/stats/_bws_test.py +177 -0
- scipy/stats/_censored_data.py +459 -0
- scipy/stats/_common.py +5 -0
- scipy/stats/_constants.py +42 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +12486 -0
- scipy/stats/_correlation.py +210 -0
- scipy/stats/_covariance.py +636 -0
- scipy/stats/_crosstab.py +204 -0
- scipy/stats/_discrete_distns.py +2098 -0
- scipy/stats/_distn_infrastructure.py +4201 -0
- scipy/stats/_distr_params.py +299 -0
- scipy/stats/_distribution_infrastructure.py +5750 -0
- scipy/stats/_entropy.py +428 -0
- scipy/stats/_finite_differences.py +145 -0
- scipy/stats/_fit.py +1351 -0
- scipy/stats/_hypotests.py +2060 -0
- scipy/stats/_kde.py +732 -0
- scipy/stats/_ksstats.py +600 -0
- scipy/stats/_levy_stable/__init__.py +1231 -0
- scipy/stats/_levy_stable/levyst.cp314-win_arm64.lib +0 -0
- scipy/stats/_levy_stable/levyst.cp314-win_arm64.pyd +0 -0
- scipy/stats/_mannwhitneyu.py +492 -0
- scipy/stats/_mgc.py +550 -0
- scipy/stats/_morestats.py +4626 -0
- scipy/stats/_mstats_basic.py +3658 -0
- scipy/stats/_mstats_extras.py +521 -0
- scipy/stats/_multicomp.py +449 -0
- scipy/stats/_multivariate.py +7281 -0
- scipy/stats/_new_distributions.py +452 -0
- scipy/stats/_odds_ratio.py +466 -0
- scipy/stats/_page_trend_test.py +486 -0
- scipy/stats/_probability_distribution.py +1964 -0
- scipy/stats/_qmc.py +2956 -0
- scipy/stats/_qmc_cy.cp314-win_arm64.lib +0 -0
- scipy/stats/_qmc_cy.cp314-win_arm64.pyd +0 -0
- scipy/stats/_qmc_cy.pyi +54 -0
- scipy/stats/_qmvnt.py +454 -0
- scipy/stats/_qmvnt_cy.cp314-win_arm64.lib +0 -0
- scipy/stats/_qmvnt_cy.cp314-win_arm64.pyd +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/__init__.py +4 -0
- scipy/stats/_rcont/rcont.cp314-win_arm64.lib +0 -0
- scipy/stats/_rcont/rcont.cp314-win_arm64.pyd +0 -0
- scipy/stats/_relative_risk.py +263 -0
- scipy/stats/_resampling.py +2352 -0
- scipy/stats/_result_classes.py +40 -0
- scipy/stats/_sampling.py +1314 -0
- scipy/stats/_sensitivity_analysis.py +713 -0
- scipy/stats/_sobol.cp314-win_arm64.lib +0 -0
- scipy/stats/_sobol.cp314-win_arm64.pyd +0 -0
- scipy/stats/_sobol.pyi +54 -0
- scipy/stats/_sobol_direction_numbers.npz +0 -0
- scipy/stats/_stats.cp314-win_arm64.lib +0 -0
- scipy/stats/_stats.cp314-win_arm64.pyd +0 -0
- scipy/stats/_stats.pxd +10 -0
- scipy/stats/_stats_mstats_common.py +322 -0
- scipy/stats/_stats_py.py +11089 -0
- scipy/stats/_stats_pythran.cp314-win_arm64.lib +0 -0
- scipy/stats/_stats_pythran.cp314-win_arm64.pyd +0 -0
- scipy/stats/_survival.py +683 -0
- scipy/stats/_tukeylambda_stats.py +199 -0
- scipy/stats/_unuran/__init__.py +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp314-win_arm64.lib +0 -0
- scipy/stats/_unuran/unuran_wrapper.cp314-win_arm64.pyd +0 -0
- scipy/stats/_unuran/unuran_wrapper.pyi +179 -0
- scipy/stats/_variation.py +126 -0
- scipy/stats/_warnings_errors.py +38 -0
- scipy/stats/_wilcoxon.py +265 -0
- scipy/stats/biasedurn.py +16 -0
- scipy/stats/contingency.py +521 -0
- scipy/stats/distributions.py +24 -0
- scipy/stats/kde.py +18 -0
- scipy/stats/morestats.py +27 -0
- scipy/stats/mstats.py +140 -0
- scipy/stats/mstats_basic.py +42 -0
- scipy/stats/mstats_extras.py +25 -0
- scipy/stats/mvn.py +17 -0
- scipy/stats/qmc.py +236 -0
- scipy/stats/sampling.py +73 -0
- scipy/stats/stats.py +41 -0
- scipy/stats/tests/__init__.py +0 -0
- scipy/stats/tests/common_tests.py +356 -0
- scipy/stats/tests/data/_mvt.py +171 -0
- scipy/stats/tests/data/fisher_exact_results_from_r.py +607 -0
- scipy/stats/tests/data/jf_skew_t_gamlss_pdf_data.npy +0 -0
- scipy/stats/tests/data/levy_stable/stable-Z1-cdf-sample-data.npy +0 -0
- scipy/stats/tests/data/levy_stable/stable-Z1-pdf-sample-data.npy +0 -0
- scipy/stats/tests/data/levy_stable/stable-loc-scale-sample-data.npy +0 -0
- scipy/stats/tests/data/nist_anova/AtmWtAg.dat +108 -0
- scipy/stats/tests/data/nist_anova/SiRstv.dat +85 -0
- scipy/stats/tests/data/nist_anova/SmLs01.dat +249 -0
- scipy/stats/tests/data/nist_anova/SmLs02.dat +1869 -0
- scipy/stats/tests/data/nist_anova/SmLs03.dat +18069 -0
- scipy/stats/tests/data/nist_anova/SmLs04.dat +249 -0
- scipy/stats/tests/data/nist_anova/SmLs05.dat +1869 -0
- scipy/stats/tests/data/nist_anova/SmLs06.dat +18069 -0
- scipy/stats/tests/data/nist_anova/SmLs07.dat +249 -0
- scipy/stats/tests/data/nist_anova/SmLs08.dat +1869 -0
- scipy/stats/tests/data/nist_anova/SmLs09.dat +18069 -0
- scipy/stats/tests/data/nist_linregress/Norris.dat +97 -0
- scipy/stats/tests/data/rel_breitwigner_pdf_sample_data_ROOT.npy +0 -0
- scipy/stats/tests/data/studentized_range_mpmath_ref.json +1499 -0
- scipy/stats/tests/test_axis_nan_policy.py +1388 -0
- scipy/stats/tests/test_binned_statistic.py +568 -0
- scipy/stats/tests/test_censored_data.py +152 -0
- scipy/stats/tests/test_contingency.py +294 -0
- scipy/stats/tests/test_continued_fraction.py +173 -0
- scipy/stats/tests/test_continuous.py +2198 -0
- scipy/stats/tests/test_continuous_basic.py +1053 -0
- scipy/stats/tests/test_continuous_fit_censored.py +683 -0
- scipy/stats/tests/test_correlation.py +80 -0
- scipy/stats/tests/test_crosstab.py +115 -0
- scipy/stats/tests/test_discrete_basic.py +580 -0
- scipy/stats/tests/test_discrete_distns.py +700 -0
- scipy/stats/tests/test_distributions.py +10413 -0
- scipy/stats/tests/test_entropy.py +322 -0
- scipy/stats/tests/test_fast_gen_inversion.py +435 -0
- scipy/stats/tests/test_fit.py +1090 -0
- scipy/stats/tests/test_hypotests.py +1991 -0
- scipy/stats/tests/test_kdeoth.py +676 -0
- scipy/stats/tests/test_marray.py +289 -0
- scipy/stats/tests/test_mgc.py +217 -0
- scipy/stats/tests/test_morestats.py +3259 -0
- scipy/stats/tests/test_mstats_basic.py +2071 -0
- scipy/stats/tests/test_mstats_extras.py +172 -0
- scipy/stats/tests/test_multicomp.py +405 -0
- scipy/stats/tests/test_multivariate.py +4381 -0
- scipy/stats/tests/test_odds_ratio.py +148 -0
- scipy/stats/tests/test_qmc.py +1492 -0
- scipy/stats/tests/test_quantile.py +199 -0
- scipy/stats/tests/test_rank.py +345 -0
- scipy/stats/tests/test_relative_risk.py +95 -0
- scipy/stats/tests/test_resampling.py +2000 -0
- scipy/stats/tests/test_sampling.py +1450 -0
- scipy/stats/tests/test_sensitivity_analysis.py +310 -0
- scipy/stats/tests/test_stats.py +9707 -0
- scipy/stats/tests/test_survival.py +466 -0
- scipy/stats/tests/test_tukeylambda_stats.py +85 -0
- scipy/stats/tests/test_variation.py +216 -0
- scipy/version.py +12 -0
- scipy-1.16.2.dist-info/DELVEWHEEL +2 -0
- scipy-1.16.2.dist-info/LICENSE.txt +912 -0
- scipy-1.16.2.dist-info/METADATA +1061 -0
- scipy-1.16.2.dist-info/RECORD +1530 -0
- scipy-1.16.2.dist-info/WHEEL +4 -0
- scipy.libs/msvcp140-5f1c5dd31916990d94181e07bc3afb32.dll +0 -0
- 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
|
+
|