commit 5fec7886fcc03b2de7c79833fd808daeb3107e94
parent bb4f29f755300a9f7c1d0f1286a78ca1de0f7654
Author: d.levin256@gmail.com <d.levin256@gmail.com>
Date: Wed, 30 Nov 2022 10:28:08 +0000
Merge branch 'v5.x'
Diffstat:
244 files changed, 70853 insertions(+), 18495 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
@@ -22,6 +22,20 @@ set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS ON)
+if (CPU_ARCH)
+ if (NOT KFR_ARCH)
+ message(
+ WARNING
+ "CPU_ARCH is deprecated. Use KFR_ARCH instead. KFR will use machine native architecture by default"
+ )
+ else ()
+ message(
+ WARNING
+ "Both KFR_ARCH and CPU_ARCH are defined. KFR will use architecture set by KFR_ARCH (${KFR_ARCH})"
+ )
+ endif ()
+endif ()
+
if (WIN32 AND CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX
""
@@ -45,37 +59,39 @@ endif ()
# Include autogenerated list of source files
include(sources.cmake)
+include(CMakeDependentOption)
-option(ENABLE_TESTS "Enable tests and examples" OFF)
+option(ENABLE_TESTS "Enable KFR tests" OFF)
+cmake_dependent_option(ENABLE_EXAMPLES "Enable KFR examples" ON "ENABLE_TESTS" OFF)
if (CLANG)
- option(ENABLE_DFT "Enable DFT and related algorithms." ON)
- option(ENABLE_DFT_NP "Enable Non-power of 2 DFT" ON)
+ option(KFR_ENABLE_DFT "Enable DFT and related algorithms." ON)
+ option(KFR_ENABLE_DFT_NP "Enable Non-power of 2 DFT" ON)
if (X86)
option(
- ENABLE_DFT_MULTIARCH
+ KFR_ENABLE_DFT_MULTIARCH
"Build DFT static libraries for various architectures. Requires Clang"
OFF)
endif ()
else ()
- option(ENABLE_DFT "Enable DFT and related algorithms." OFF)
- option(ENABLE_DFT_NP "Enable Non-power of 2 DFT" OFF)
+ option(KFR_ENABLE_DFT "Enable DFT and related algorithms." OFF)
+ option(KFR_ENABLE_DFT_NP "Enable Non-power of 2 DFT" OFF)
endif ()
-option(ENABLE_ASMTEST "Enable writing disassembly" OFF)
-option(REGENERATE_TESTS "Regenerate auto tests" OFF)
-option(DISABLE_CLANG_EXTENSIONS "Disable Clang vector extensions" OFF)
+option(KFR_ENABLE_ASMTEST "Enable writing disassembly" OFF)
+option(KFR_REGENERATE_TESTS "Regenerate auto tests" OFF)
+option(KFR_DISABLE_CLANG_EXTENSIONS "Disable Clang vector extensions" OFF)
option(KFR_EXTENDED_TESTS "Extended tests (up to hour)" OFF)
-option(SKIP_TESTS "Skip tests (only build)" OFF)
+option(KFR_SKIP_TESTS "Build tests but don't run tests" OFF)
option(KFR_STD_COMPLEX "Use std::complex instead of custom complex type" OFF)
-mark_as_advanced(ENABLE_ASMTEST)
-mark_as_advanced(REGENERATE_TESTS)
-mark_as_advanced(DISABLE_CLANG_EXTENSIONS)
+option(KFR_ENABLE_CAPI_BUILD "Enable KFR C API building" OFF)
+mark_as_advanced(KFR_ENABLE_ASMTEST)
+mark_as_advanced(KFR_REGENERATE_TESTS)
+mark_as_advanced(KFR_DISABLE_CLANG_EXTENSIONS)
-if (NOT CPU_ARCH)
- set(CPU_ARCH detect)
+if (NOT KFR_ARCH)
+ set(KFR_ARCH detect)
endif ()
-if (CPU_ARCH STREQUAL "detect" AND X86)
- message(STATUS "Detecting native cpu...")
+if (KFR_ARCH STREQUAL "detect" AND X86)
try_run(
RUN_RESULT COMPILE_RESULT "${CMAKE_CURRENT_BINARY_DIR}/tmpdir"
${CMAKE_CURRENT_SOURCE_DIR}/cmake/detect_cpu.cpp
@@ -86,8 +102,11 @@ if (CPU_ARCH STREQUAL "detect" AND X86)
COMPILE_OUTPUT_VARIABLE COMPILE_OUT
RUN_OUTPUT_VARIABLE RUN_OUT)
if (COMPILE_RESULT AND RUN_RESULT EQUAL 0)
- message(STATUS DETECTED_CPU = ${RUN_OUT})
- set(CPU_ARCH
+ message(
+ STATUS
+ "Default CPU architecture for KFR is ${RUN_OUT} (set KFR_ARCH to override)"
+ )
+ set(KFR_ARCH
${RUN_OUT}
CACHE STRING "Detected CPU" FORCE)
else ()
@@ -96,12 +115,17 @@ if (CPU_ARCH STREQUAL "detect" AND X86)
message(STATUS COMPILE_OUT = ${COMPILE_OUT})
message(STATUS RUN_OUT = ${RUN_OUT})
endif ()
+else ()
+ message(
+ STATUS
+ "Default CPU architecture for KFR is ${KFR_ARCH} (set by cmake variable)"
+ )
endif ()
include(cmake/target_set_arch.cmake)
add_library(use_arch INTERFACE)
-target_set_arch(use_arch INTERFACE ${CPU_ARCH})
+target_set_arch(use_arch INTERFACE ${KFR_ARCH})
if (WIN32)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
@@ -137,7 +161,8 @@ if (APPLE)
endif ()
if (NOT IOS)
if (NOT MSVC OR CLANG)
- target_compile_options(kfr INTERFACE "${CLANG_ARG_PREFIX}-mstackrealign")
+ target_compile_options(kfr
+ INTERFACE "${CLANG_ARG_PREFIX}-mstackrealign")
endif ()
endif ()
if (MSVC)
@@ -145,28 +170,29 @@ if (MSVC)
else ()
target_link_libraries(kfr INTERFACE ${STD_LIB} ${PTHREAD_LIB} m)
endif ()
-if (DISABLE_CLANG_EXTENSIONS)
+if (KFR_DISABLE_CLANG_EXTENSIONS)
target_compile_definitions(kfr INTERFACE -DCMT_DISABLE_CLANG_EXT)
endif ()
if (KFR_STD_COMPLEX)
target_compile_definitions(kfr INTERFACE -DKFR_STD_COMPLEX)
-endif()
+endif ()
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
target_compile_options(kfr INTERFACE -Wno-ignored-qualifiers -Wno-psabi)
endif ()
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
target_compile_options(kfr INTERFACE -Wno-c++1z-extensions -Wno-psabi)
endif ()
+if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
+ target_compile_options(kfr INTERFACE /wd4141)
+endif ()
-if (NOT ENABLE_DFT)
+if (NOT KFR_ENABLE_DFT)
target_compile_definitions(kfr INTERFACE -DKFR_NO_DFT)
endif ()
if (KFR_EXTENDED_TESTS)
target_compile_definitions(kfr INTERFACE -DKFR_EXTENDED_TESTS)
endif ()
-message(STATUS CPU_ARCH=${CPU_ARCH})
-
if (X86)
add_executable(detect_cpu ${CMAKE_CURRENT_SOURCE_DIR}/cmake/detect_cpu.cpp)
target_link_libraries(detect_cpu PRIVATE kfr)
@@ -182,11 +208,11 @@ function (add_arch_library NAME ARCH SRCS DEFS)
target_compile_options(${NAME}_${ARCH} PRIVATE -flto)
endfunction ()
-if (ENABLE_DFT)
+if (KFR_ENABLE_DFT)
set(KFR_DFT_DEFS "${CLANG_ARG_PREFIX}-ffp-contract=fast")
- if (ENABLE_DFT_MULTIARCH)
+ if (KFR_ENABLE_DFT_MULTIARCH)
add_library(kfr_dft INTERFACE)
add_library(kfr_dft_all INTERFACE)
target_link_libraries(kfr_dft INTERFACE kfr kfr_dft_all)
@@ -210,7 +236,7 @@ if (ENABLE_DFT)
add_library(kfr_dft ${KFR_DFT_SRC})
target_link_libraries(kfr_dft kfr use_arch)
target_compile_options(kfr_dft PRIVATE "${KFR_DFT_DEFS}")
- if (ENABLE_DFT_NP)
+ if (KFR_ENABLE_DFT_NP)
target_compile_definitions(kfr_dft PUBLIC -DKFR_DFT_NPo2)
else ()
target_compile_definitions(kfr_dft PUBLIC -DKFR_DFT_NO_NPo2)
@@ -218,16 +244,18 @@ if (ENABLE_DFT)
endif ()
- if (ENABLE_CAPI_BUILD)
+ if (KFR_ENABLE_CAPI_BUILD)
add_subdirectory(capi)
endif ()
endif ()
-if (ENABLE_TESTS)
+if (ENABLE_EXAMPLES)
add_subdirectory(examples)
- add_subdirectory(tests)
add_subdirectory(tools)
endif ()
+if (ENABLE_TESTS)
+ add_subdirectory(tests)
+endif ()
add_library(kfr_io ${KFR_IO_SRC})
target_link_libraries(kfr_io kfr)
@@ -239,7 +267,7 @@ install(
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin)
-if (ENABLE_CAPI_BUILD)
+if (KFR_ENABLE_DFT AND KFR_ENABLE_CAPI_BUILD)
install(
TARGETS kfr_capi
ARCHIVE DESTINATION lib
@@ -249,16 +277,18 @@ endif ()
set(kfr_defines)
-function(append_defines_from target)
+function (append_defines_from target)
get_target_property(compile_defs ${target} INTERFACE_COMPILE_DEFINITIONS)
if (compile_defs)
list(APPEND kfr_defines "${compile_defs}")
endif ()
- set(kfr_defines ${kfr_defines} PARENT_SCOPE)
-endfunction()
+ set(kfr_defines
+ ${kfr_defines}
+ PARENT_SCOPE)
+endfunction ()
append_defines_from(kfr)
-if (ENABLE_DFT)
+if (KFR_ENABLE_DFT)
append_defines_from(kfr_dft)
endif ()
append_defines_from(kfr_io)
@@ -269,8 +299,8 @@ set(kfr_defines "#define ${kfr_defines}\n")
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/kfr_config.h "${kfr_defines}")
-if (ENABLE_DFT)
- if (ENABLE_DFT_MULTIARCH)
+if (KFR_ENABLE_DFT)
+ if (KFR_ENABLE_DFT_MULTIARCH)
install(
TARGETS kfr_dft_sse2 kfr_dft_sse41 kfr_dft_avx kfr_dft_avx2
kfr_dft_avx512
@@ -291,8 +321,7 @@ install(DIRECTORY include/kfr DESTINATION include)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/kfr_config.h
DESTINATION include/kfr
- RENAME config.h
- )
+ RENAME config.h)
# uninstall target
if (NOT TARGET uninstall)
@@ -306,11 +335,3 @@ if (NOT TARGET uninstall)
COMMAND ${CMAKE_COMMAND} -P
${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake)
endif ()
-
-if (DEBUG_CMAKE)
- get_cmake_property(_variableNames VARIABLES)
- list(SORT _variableNames)
- foreach (_variableName ${_variableNames})
- message(STATUS "${_variableName}=${${_variableName}}")
- endforeach ()
-endif ()
diff --git a/KNOWNBUGS.md b/KNOWNBUGS.md
@@ -0,0 +1,9 @@
+# Known bugs and limitations
+
+| Compiler | Architecture | ISA | Description
+| - | - | - | - |
+| Visual Studio | x86/x86_64 | < SSE2 | Not supported, SSE2 is required |
+| GCC | x86/x86_64 | < SSE2 | Not supported, SSE2 is required |
+| Visual Studio 2022 | x86_64 | AVX512 | Internal Compiler Error (sometimes) |
+| Clang 14 | x86/x86_64 | Generic | Code generation bug in Clang |
+| GCC 12 | x86/x86_64 | AVX512 | Code generation bug in GCC |
diff --git a/README.md b/README.md
@@ -4,102 +4,96 @@
<img width="300" height="auto" src="img/KFR1.png">
</p>
-

-[](https://gitter.im/kfrlib/kfr) 
+
+
+https://www.kfr.dev
+
+KFR is an open source C++ DSP framework that contains high performance building blocks for DSP, audio, scientific and other applications. It is distributed under dual GPLv2/v3 and [commercial license](https://kfr.dev/purchase).
+
+## [Installation](docs/docs/installation.md)
Compiler support:
-
-
+
+

-
+
-https://www.kfr.dev
+KFR has no external dependencies except a C++17 compatible standard C++ library.
+CMake is used as build system.
+
+Clang is highly recommended and proven to provide the best performance for KFR. You can use clang as a drop-in replacement of both GCC on Linux and MSVC on Windows. On macOS clang is the default compiler and included in the official Xcode toolchain.
-KFR is an open source C++ DSP framework that focuses on high performance (see benchmark results section).
+_Note_: Building DFT module requires Clang at this moment due to internal compiler errors and lack of optimization in GCC and MSVC.
-KFR has no external dependencies except C++17-compatible standard C++ library.
+:arrow_right: See [Installation](docs/docs/installation.md) for more details
-Some C++17 library features will be emulated if not present in the standard library.
+## Features
-# Features
+### FFT/DFT
+* Optimized DFT implementation for any size (non-power of two sizes are supported)
+* DFT performance is on par with the most performant implementation currently available [See Benchmarks](#benchmark-results)
+* Real Forward and Inverse DFT
+* Discrete Cosine Transform type II (and its inverse, also called DCT type III)
+* Convolution using FFT
+* Convolution filter
+
+:arrow_right: See also [How to apply FFT](docs/docs/dft.md) with KFR
-## What's new in KFR 4.0
+### DSP
* IIR filter design
* Butterworth
* Chebyshev type I and II
* Bessel
* Lowpass, highpass, bandpass and bandstop filters
- * Conversion of arbitrary filter from Z,P,K to SOS format (suitable for biquad function and filter)
-* Discrete Cosine Transform type II (and its inverse, also called DCT type III)
-* cmake uninstall target (thank to [@acxz](https://github.com/acxz))
-* C API: DFT, real DFT, DCT, FIR and IIR filters and convolution, memory allocation
- * Built for SSE2, SSE4.1, AVX, AVX2, AVX512, x86 and x86_64, architecture is selected at runtime
- * Can be used with any compiler and any language with ability to call C functions
- * Windows binaries will be available soon
-* C++17
- * Inline variables
- * Fold expressions
- * Structured binding
-* New vector based types: color, rectangle, point, size, border, geometric vector, 2D matrix
-* Color space conversion (sRGB, XYZ, Lab, LCH)
-* MP3 file reading (using third party dr_lib library, see source code for details)
-* Various optimizations and fixes (thank to [@bmanga](https://github.com/bmanga), [@ncorgan](https://github.com/ncorgan), [@rotkreis](https://github.com/rotkreis), [@mujjingun](https://github.com/mujjingun) for fixes and bug reports)
-
-### Release notes
-
-* DFT is limited to Clang due to ICE in MSVC and broken AVX optimization in GCC 8 and 9. Once fixed, support will be added
-
-## What's new in KFR 3.0
-
-* Optimized non-power of two DFT implementation
-* GCC 7+ support
-* MSVC 2017 support
-* AVX-512 support (MSVC and Clang, GCC has incomplete support of AVX-512 instrinsics)
-* EBU R128
-* Ability to include KFR as a subdirectory in cmake project
-* Ability to link objects built for multiple architectures into one binary
-* Number of automatic tests has been increased
-* C API for DFT
-* GPL version changed from 3 to 2+
-
-## All features
-
-* All code in the library is optimized for Intel, AMD (SSE2, SSE3, SSE4.x, AVX and AVX2 and AVX512) and ARM (NEON) processors
-* Mathematical and statistical functions
+ * Conversion of arbitrary filter from {Z, P, K} to SOS format (suitable for biquad function and filter)
+* Biquad filter [See Benchmarks](#benchmark-results)
+* Simple biquad filter design
+* FIR filter design using window method
+* Loudness measurement according to EBU R128
+* Window functions: Triangular, Bartlett, Cosine, Hann, Bartlett-Hann, Hamming, Bohman, Blackman, Blackman-Harris, Kaiser, Flattop, Gaussian, Lanczos, Rectangular
+* Sample rate conversion with configurable quality and linear phase
+* Oscillators, fast incremental sine/cosine generation, Goertzel algorithm, fractional delay
+
+
+### Base
+
+* Tensors (multidimensional arrays)
+* Statistical functions
+* Random number generation
* Template expressions (See examples)
+* Ring (Circular) buffer
+
+### Math
+
+* Mathematical functions such as `sin`, `log` and `cosh` built on top of SIMD primitives
+* Most of the standard library functions are re-implemented to support vector of any length and data type
+
+### SIMD
+
+* `vec<T, N>` class and related functions that abstracts cpu-specific intrinsics
+* All code in the library is optimized for Intel, AMD (SSE2, SSE3, SSE4.x, AVX and AVX2 and AVX512) and ARM, AArch64 (NEON) processors
* All data types are supported including complex numbers
* All vector lengths are also supported. `vec<float,1>`, `vec<unsigned,3>`, `vec<complex<float>, 11>` all are valid vector types in KFR
-* Most of the standard library functions are re-implemented to support vector of any length and data type
-* Runtime cpu detection
-
-### Included DSP/audio algorithms:
-
-* FFT
-* Convolution
-* FIR filtering
-* FIR filter design using the window method
-* Resampling with configurable quality (See resampling.cpp from Examples directory)
-* Goertzel algorithm
-* Fractional delay
-* Biquad filtering
-* Biquad design functions
-* Oscillators: Sine, Square, Sawtooth, Triangle
-* Window functions: Triangular, Bartlett, Cosine, Hann, Bartlett-Hann, Hamming, Bohman, Blackman, Blackman-Harris, Kaiser, Flattop, Gaussian, Lanczos, Rectangular
-* Audio file reading/writing
-* Pseudorandom number generator
* Sorting
-* Ring (Circular) buffer
-* Simple waveshaper
-* Fast incremental sine/cosine generation
-* EBU R128
-# Benchmark results
-## DFT
-### KFR 3.0.1
+### IO
+
+* Audio file reading/writing
+* WAV
+* FLAC
+* MP3
+
+### C API
+
+C API is available and includes a subset of KFR features including FFT and filter processing.
+
+## Benchmark results
+
+### DFT
Powers of 2, from 16 to 16777216 (*Higher is better*)
@@ -120,214 +114,12 @@ Random sizes from 120 to 30720000 (*Higher is better*)
See [fft benchmark](https://github.com/kfrlib/fft-benchmark) for details about benchmarking process.
-## Biquad
+### Biquad
(*Higher is better*)

-# Usage
-
-## Common prerequisites
-
-* CMake 3.0 or newer for building tests and examples
-* Python 2.7 or 3.x for running examples
-* (Optional) Ninja (https://ninja-build.org/)
-
-For running examples and plotting frequency responses of filters the following python packages are required:
-
-```bash
-pip install matplotlib
-pip install numpy
-pip install scipy
-```
-Or download prebuilt python packages for windows
-
-To obtain the full code, including examples and tests, you can clone the git repository:
-
-```
-git clone https://github.com/kfrlib/kfr.git
-```
-
-## Building KFR C API
-
-### Windows
-
-These commands must be executed in MSVC2017 command prompt
-
-```bash
-cd <path_to_kfr_repository>
-mkdir build && cd build
-cmake -GNinja -DENABLE_CAPI_BUILD=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER="<PATH_TO_LLVM_DIR>/bin/clang-cl.exe" ..
-ninja kfr_capi
-```
-
-### Linux, macOS, other
-
-```bash
-cd <path_to_kfr_repository>
-mkdir build && cd build
-cmake -GNinja -DENABLE_CAPI_BUILD=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang++ ..
-ninja kfr_capi
-```
-
-#### ArchLinux Package
-KFR is available on the [ArchLinux User Repository](https://wiki.archlinux.org/index.php/Arch_User_Repository) (AUR).
-You can install it with an [AUR helper](https://wiki.archlinux.org/index.php/AUR_helpers), like [`yay`](https://aur.archlinux.org/packages/yay/), as follows:
-
-```bash
-yay -S kfr
-```
-To discuss any issues related to this AUR package refer to the comments section of
-[`kfr`](https://aur.archlinux.org/packages/kfr/).
-
-Prebuilt binaries will be available soon.
-
-## Including in CMake project
-
-CMakeLists.txt contains these libraries:
-* `kfr` - header only interface library
-* `kfr_dft` - static library for DFT and related algorithms
-* `kfr_io` - static library for file IO and audio IO
-
-```cmake
-# Include KFR subdirectory
-add_subdirectory(kfr)
-
-# Add header-only KFR to your executable or library, this sets include directories etc
-target_link_libraries(your_executable_or_library kfr)
-
-# Add KFR DFT to your executable or library, (cpp file will be built for this)
-target_link_libraries(your_executable_or_library kfr_dft)
-
-# Add KFR IO to your executable or library, (cpp file will be built for this)
-target_link_libraries(your_executable_or_library kfr_io)
-```
-
-## Makefile, command line etc (Unix-like systems)
-
-```bash
-# Add this to command line
--Ipath_to_kfr/include
-
-# And this if needed
--lkfr_dft -lkfr_io
-
-# C++17 mode must be enabled
--std=c++17
-# or
--std=gnu++17
-```
-
-## Linux
-
-### Prerequisites
-* GCC 7 or newer
-* Clang 6.0 or newer
-
-### Command line
-```bash
-cd <path_to_kfr>
-mkdir build && cd build
-cmake -DENABLE_TESTS=ON -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release ..
-make -- -j
-```
-Or using Ninja
-```bash
-cd <path_to_kfr>
-mkdir build && cd build
-cmake -GNinja -DENABLE_TESTS=ON -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release ..
-ninja
-```
-
-## macOS
-
-### Prerequisites
-* XCode 9.x, 10.x or 11.x
-
-### Command line
-Using Xcode project:
-```bash
-cd <path_to_kfr>
-mkdir build && cd build
-cmake -GXcode -DENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Release ..
-cmake --build .
-```
-Using Unix Makefiles:
-```bash
-cd <path_to_kfr>
-mkdir build && cd build
-cmake -G"Unix Makefiles" -DENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Release ..
-make -- -j
-```
-Or using Ninja:
-```bash
-cd <path_to_kfr>
-mkdir build && cd build
-cmake -GNinja -DENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Release ..
-ninja
-```
-
-## Visual Studio
-
-### Prerequisites
-* Visual Studio 2017
-* Latest Clang (http://llvm.org/)
-* Ninja is highly recommended because Visual Studio does not support parallel build with Clang at this moment.
-
-### Visual Studio IDE
-
-To work with KFR in Visual Studio you must add the path to the `include` directory inside KFR directory to the list of the project's include directories.<br>
-More details:
-https://docs.microsoft.com/en-us/cpp/ide/vcpp-directories-property-page?view=vs-2017
-
-Make sure that LLVM toolset is set for the project<br>
-
-Download and install official LLVM extension:
-* LLVM toolchain for Visual Studio https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.llvm-toolchain
-
-More details:
-https://docs.microsoft.com/en-us/cpp/ide/general-property-page-project?view=vs-2017
-
-LLVM/Clang has very good compatibility with MSVC ABI and it's widely used for building large projects on Windows (including Chrome), so switching to LLVM/Clang should not cause compatibility problems.
-
-### Command line
-Using Ninja:
-```
-cd <path_to_kfr>
-mkdir build && cd build
-call "C:\<path to your Visual Studio installation>\VC\Auxiliary\Build\vcvars64.bat"
-cmake -GNinja -DENABLE_TESTS=ON -DCMAKE_CXX_COMPILER="C:/Program Files/LLVM/bin/clang-cl.exe" -DCMAKE_CXX_FLAGS=-m64 -DCMAKE_BUILD_TYPE=Release ..
-ninja
-```
-Or generate Visual Studio solution (building will be slower):
-```
-cd <path_to_kfr>
-mkdir build && cd build
-cmake -G"Visual Studio 15 2017 Win64" -DENABLE_TESTS=ON -Tllvm -DCMAKE_BUILD_TYPE=Release ..
-```
-
-## MinGW/MSYS
-
-### Prerequisites
-* Latest MinGW or MSYS2
-* Clang 6.0 or newer
-
-Using Makefiles:
-```
-cd <path_to_kfr>
-mkdir build && cd build
-cmake -DENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Release ..
-make -- -j
-```
-Using Ninja:
-```
-cd <path_to_kfr>
-mkdir build && cd build
-cmake -GNinja -DENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Release ..
-ninja
-```
-
## Documentation
Documentation home:
@@ -358,57 +150,8 @@ cd tests
ctest -V
```
-Tested on the following systems:
-
-
-### macOS
-* (**Intel AVX2**) macOS **10.13.6** / Xcode 10 / AppleClang 10.0.0.10001145
-* (**Intel AVX** Azure Pipelines) macOS **10.13.6** / Xcode 10.1 / AppleClang 10.0.0.10001145
-* (**Intel AVX** Azure Pipelines) macOS **10.13.6** / Xcode 10 / AppleClang 10.0.0.10001145
-* (**Intel AVX** Azure Pipelines) macOS **10.13.6** / Xcode 9.4.1 / AppleClang 9.1.0.9020039
-* (**Intel AVX** Azure Pipelines) macOS **10.13.6** / Xcode 9.0.1 / AppleClang 9.0.0.9000038
-* (**Intel AVX** Azure Pipelines) macOS **10.13.6** / Xcode 8.3.3 / AppleClang 8.1.0.8020042
-* (**Intel AVX2**) macOS **10.11.6** / Xcode 7.3 / AppleClang 7.3.0.7030031
-* (**Intel AVX2**) macOS **10.11.4** / Xcode 7.3 / AppleClang 7.3.0.7030031
-* (**ARMv7, ARMv7s, ARM64**) macOS **10.11.6** / Xcode 7.3 / AppleClang 7.3.0.7030031
-* (**Intel AVX**) macOS **10.10.5** / Xcode 7.1 / AppleClang 7.0.0.7000176
-* (**SSE4.2** Travis-CI) macOS **10.11.6** / Xcode 8 (beta4) / AppleClang 8.0.0.8000035
-* (**SSE4.2** Travis-CI) macOS **10.11.5** / Xcode 7.3 / AppleClang 7.3.0.7030031
-* (**SSE4.2** Travis-CI) macOS **10.11.5** / Xcode 7.2 / AppleClang 7.0.2.7000181
-* (**SSE4.2** Travis-CI) macOS **10.10.5** / Xcode 7.1 / AppleClang 7.0.0.7000176
-* (**SSE4.2** Travis-CI) macOS **10.10.5** / Xcode 7 / AppleClang 7.0.0.7000072
-* (**SSE4.2** Travis-CI) macOS **10.10.5** / Xcode 6.4 / AppleClang 6.1.0.6020053
-* (**SSE4.2** Travis-CI) macOS **10.10.3** / Xcode 6.3 / AppleClang 6.1.0.6020049
-
-### Ubuntu
-* (**Intel AVX2**) Ubuntu **18.04** / gcc-7.x / clang version 7.0.0 (tags/RELEASE_700/final)
-* (**Intel AVX2**) Ubuntu **16.04** / gcc-5.4.0 / clang version 3.8.0 (tags/RELEASE_380/final)
-* (**ARMv7 NEON**) Ubuntu **16.04** / gcc-5.4.0 / clang version 3.8.0 (tags/RELEASE_380/final)
-* (**ARMv7 NEON**) Ubuntu **14.04** / gcc-4.8.4 / clang version 3.8.0 (tags/RELEASE_380/final)
-* (**ARMv7 NEON** Travis-CI) Ubuntu **14.04** / gcc-4.8.4 / clang version 3.8.0 (tags/RELEASE_380/final)
-* (**Intel AVX2** Travis-CI) Ubuntu **12.04** / gcc-5.4.0 / clang version 3.8.0 (tags/RELEASE_380/final)
-* (**Intel AVX2** Travis-CI) Ubuntu **14.04** / gcc-5.3.0 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204 / clang version 3.8.0 (tags/RELEASE_380/final)
-
-### Windows
-* (**Intel AVX512**) Windows **10** / Visual Studio 2017 / Clang 7.0
-* (**Intel AVX512**) Windows **10** / Visual Studio 2017 / Clang 6.0
-* (**Intel AVX2**) Windows **10** / MinGW-W64 5.2 / clang version 3.8.0 (branches/release_38)
-* (**Intel AVX2**) Windows **10** / MinGW-W64 4.8 / clang version 3.8.0 (branches/release_38)
-* (**Intel AVX**) Windows **8.1** / MinGW-W64 5.4 / clang version 3.8.0 (branches/release_38)
-* (**Intel AVX**) Windows **8.1** / Visual Studio 2015 Update 2 / clang version 3.9.0 (SVN r273898 (27 June 2016))
-
-### Linux on Windows 10
-* (**Intel AVX2**) Windows **10.0.17134.407** compatible with Ubuntu **18.04** / gcc-7.x / clang version 7.0.0 (tags/RELEASE_700/final)
-* (**Intel AVX2**) Windows **10.0.14393** compatible with Ubuntu **14.04** / gcc-5.4.0 / clang version 3.8.0 (tags/RELEASE_380/final)
-
-## Planned for future versions
-
-* Parallel execution of algorithms
-* Serialization/Deserialization of any expression
-* More formats for audio file reading/writing
-
## License
KFR is dual-licensed, available under both commercial and open-source GPL 2+ license.
-If you want to use KFR in commercial product or a closed-source project, you need to [purchase a Commercial License](https://kfr.dev/purchase-license)
+If you want to use KFR in a commercial product or a closed-source project, you need to [purchase a Commercial License](https://kfr.dev/purchase-license)
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
@@ -1,5 +1,5 @@
jobs:
-- job: Windows_MSVC_x86_64_AVX512_Clang13_Release
+- job: Windows_MSVC_x86_64_AVX512_Clang14_Release
timeoutInMinutes: 180
pool:
vmImage: 'windows-2019'
@@ -16,9 +16,9 @@ jobs:
set PATH=%PATH:C:\Program Files\Git\mingw64\bin;=%
set PATH=%PATH:C:\Strawberry\c\bin;=%
set PATH=C:\sde;%PATH%
- ci\run.cmd build-release -DENABLE_CAPI_BUILD=ON -DARCH_TESTS=ON -DENABLE_DFT_MULTIARCH=ON -DCMAKE_CXX_COMPILER="C:/Program Files/LLVM/bin/clang-cl.exe" -DCMAKE_LINKER="C:/Program Files/LLVM/bin/lld-link.exe" -DUSE_SDE=ON -DCPU_ARCH=sse2 -DCMAKE_CXX_FLAGS=-m64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_AR="C:/Program Files/LLVM/bin/llvm-lib.exe"
+ ci\run.cmd build-release -DKFR_ENABLE_CAPI_BUILD=ON -DKFR_ARCH_TESTS=sse2,ssse3,sse42,avx,avx2,avx512 -DKFR_ENABLE_DFT_MULTIARCH=ON -DCMAKE_CXX_COMPILER="C:/Program Files/LLVM/bin/clang-cl.exe" -DCMAKE_LINKER="C:/Program Files/LLVM/bin/lld-link.exe" -DKFR_USE_SDE=ON -DKFR_ARCH=sse2 -DCMAKE_CXX_FLAGS=-m64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_AR="C:/Program Files/LLVM/bin/llvm-lib.exe"
-- job: Windows_MSVC_x86_AVX512_Clang13_Release
+- job: Windows_MSVC_x86_AVX512_Clang14_Release
timeoutInMinutes: 180
pool:
vmImage: 'windows-2019'
@@ -35,7 +35,7 @@ jobs:
set PATH=%PATH:C:\Program Files\Git\mingw64\bin;=%
set PATH=%PATH:C:\Strawberry\c\bin;=%
set PATH=C:\sde;%PATH%
- ci\run.cmd build-release -DENABLE_CAPI_BUILD=ON -DARCH_TESTS=ON -DENABLE_DFT_MULTIARCH=ON -DCMAKE_CXX_COMPILER="C:/Program Files/LLVM/bin/clang-cl.exe" -DCMAKE_LINKER="C:/Program Files/LLVM/bin/lld-link.exe" -DUSE_SDE=ON -DCPU_ARCH=sse2 -DCMAKE_CXX_FLAGS=-m32 -DCMAKE_BUILD_TYPE=Release -DCMAKE_AR="C:/Program Files/LLVM/bin/llvm-lib.exe"
+ ci\run.cmd build-release -DKFR_ENABLE_CAPI_BUILD=ON -DKFR_ARCH_TESTS=sse2,ssse3,sse42,avx,avx2,avx512 -DKFR_ENABLE_DFT_MULTIARCH=ON -DCMAKE_CXX_COMPILER="C:/Program Files/LLVM/bin/clang-cl.exe" -DCMAKE_LINKER="C:/Program Files/LLVM/bin/lld-link.exe" -DKFR_USE_SDE=ON -DKFR_ARCH=sse2 -DCMAKE_CXX_FLAGS=-m32 -DCMAKE_BUILD_TYPE=Release -DCMAKE_AR="C:/Program Files/LLVM/bin/llvm-lib.exe"
- job: Linux_x86_64_Clang8
timeoutInMinutes: 180
@@ -44,22 +44,12 @@ jobs:
steps:
- bash: |
set -e
- sudo apt-get update && sudo apt-get install -y ninja-build libmpfr-dev clang-8
+ sudo apt-get update && sudo apt-get install -y ninja-build clang-8
curl -o "$(Agent.TempDirectory)/sde.tar.bz2" -L $(SDE_URL_LINUX)
mkdir "$(Agent.TempDirectory)/sde-bin"
tar -C "$(Agent.TempDirectory)/sde-bin" -xjf "$(Agent.TempDirectory)/sde.tar.bz2" --strip 1
sudo ln -s $(Agent.TempDirectory)/sde-bin/sde64 /usr/bin/sde
- ci/run.sh build-release -DENABLE_CAPI_BUILD=ON -DARCH_TESTS=sse2,sse3,sse41,avx,avx2,avx512 -DCPU_ARCH=avx2 -DUSE_SDE=ON -DCMAKE_CXX_COMPILER=clang++-8 -DCMAKE_BUILD_TYPE=Release
-
-- job: Linux_x86_64_Clang9
- timeoutInMinutes: 180
- pool:
- vmImage: 'ubuntu-18.04'
- steps:
- - bash: |
- set -e
- sudo apt-get update && sudo apt-get install -y ninja-build libmpfr-dev clang-9
- ci/run.sh build-release -DCPU_ARCH=avx2 -DCMAKE_CXX_COMPILER=clang++-9 -DCMAKE_BUILD_TYPE=Release
+ ci/run.sh build-release -DKFR_ENABLE_CAPI_BUILD=ON -DKFR_ARCH_TESTS=sse2,sse3,sse41,avx,avx2,avx512 -DKFR_ARCH=avx2 -DKFR_USE_SDE=ON -DCMAKE_CXX_COMPILER=clang++-8 -DCMAKE_BUILD_TYPE=Release
- job: Linux_x86_64_Clang10
timeoutInMinutes: 180
@@ -68,18 +58,8 @@ jobs:
steps:
- bash: |
set -e
- sudo apt-get update && sudo apt-get install -y ninja-build libmpfr-dev clang-10
- ci/run.sh build-release -DCPU_ARCH=avx2 -DCMAKE_CXX_COMPILER=clang++-10 -DCMAKE_BUILD_TYPE=Release
-
-- job: Linux_x86_64_Clang11
- timeoutInMinutes: 180
- pool:
- vmImage: 'ubuntu-20.04'
- steps:
- - bash: |
- set -e
- sudo apt-get update && sudo apt-get install -y ninja-build libmpfr-dev clang-11
- ci/run.sh build-release -DCPU_ARCH=avx2 -DCMAKE_CXX_COMPILER=clang++-11 -DCMAKE_BUILD_TYPE=Release
+ sudo apt-get update && sudo apt-get install -y ninja-build clang-10
+ ci/run.sh build-release -DKFR_ARCH=avx2 -DCMAKE_CXX_COMPILER=clang++-10 -DCMAKE_BUILD_TYPE=Release
- job: Linux_x86_64_Clang12
timeoutInMinutes: 180
@@ -88,24 +68,26 @@ jobs:
steps:
- bash: |
set -e
- sudo apt-get update && sudo apt-get install -y ninja-build libmpfr-dev clang-12
+ sudo apt-get update && sudo apt-get install -y ninja-build clang-12
curl -o "$(Agent.TempDirectory)/sde.tar.bz2" -L $(SDE_URL_LINUX)
mkdir "$(Agent.TempDirectory)/sde-bin"
tar -C "$(Agent.TempDirectory)/sde-bin" -xjf "$(Agent.TempDirectory)/sde.tar.bz2" --strip 1
sudo ln -s $(Agent.TempDirectory)/sde-bin/sde64 /usr/bin/sde
- ci/run.sh build-release -DENABLE_CAPI_BUILD=ON -DARCH_TESTS=sse2,sse3,sse41,avx,avx2,avx512 -DCPU_ARCH=avx2 -DUSE_SDE=ON -DCMAKE_CXX_COMPILER=clang++-12 -DCMAKE_BUILD_TYPE=Release
+ ci/run.sh build-release -DKFR_ENABLE_CAPI_BUILD=ON -DKFR_ARCH_TESTS=sse2,sse3,sse41,avx,avx2,avx512 -DKFR_ARCH=avx2 -DKFR_USE_SDE=ON -DCMAKE_CXX_COMPILER=clang++-12 -DCMAKE_BUILD_TYPE=Release
-- job: Linux_x86_64_Clang13
+- job: Linux_x86_64_Clang14
timeoutInMinutes: 180
pool:
- vmImage: 'ubuntu-20.04'
+ vmImage: 'ubuntu-22.04'
steps:
- bash: |
set -e
- wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
- echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-13 main" | sudo tee /etc/apt/sources.list.d/llvm.list
- sudo apt-get update && sudo apt-get install -y ninja-build libmpfr-dev clang-13
- ci/run.sh build-release -DCPU_ARCH=avx2 -DCMAKE_CXX_COMPILER=clang++-13 -DCMAKE_BUILD_TYPE=Release
+ sudo apt-get update && sudo apt-get install -y ninja-build clang-14
+ curl -o "$(Agent.TempDirectory)/sde.tar.bz2" -L $(SDE_URL_LINUX)
+ mkdir "$(Agent.TempDirectory)/sde-bin"
+ tar -C "$(Agent.TempDirectory)/sde-bin" -xjf "$(Agent.TempDirectory)/sde.tar.bz2" --strip 1
+ sudo ln -s $(Agent.TempDirectory)/sde-bin/sde64 /usr/bin/sde
+ ci/run.sh build-release -DKFR_ENABLE_CAPI_BUILD=ON -DKFR_ARCH_TESTS=sse2,sse3,sse41,avx,avx2,avx512 -DKFR_ARCH=avx2 -DKFR_USE_SDE=ON -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_BUILD_TYPE=Release
- job: Linux_x86_64_GCC7
timeoutInMinutes: 180
@@ -114,8 +96,8 @@ jobs:
steps:
- bash: |
set -e
- sudo apt-get update && sudo apt-get install -y ninja-build libmpfr-dev gcc-7 g++-7
- ci/run.sh build-release -DCPU_ARCH=avx -DENABLE_DFT=OFF -DCMAKE_CXX_COMPILER=g++-7 -DCMAKE_BUILD_TYPE=Release
+ sudo apt-get update && sudo apt-get install -y ninja-build gcc-7 g++-7
+ ci/run.sh build-release -DKFR_ARCH=avx -DKFR_ENABLE_DFT=OFF -DCMAKE_CXX_COMPILER=g++-7 -DCMAKE_BUILD_TYPE=Release
- job: Linux_x86_64_GCC8
timeoutInMinutes: 180
@@ -124,40 +106,40 @@ jobs:
steps:
- bash: |
set -e
- sudo apt-get update && sudo apt-get install -y ninja-build libmpfr-dev gcc-8 g++-8
+ sudo apt-get update && sudo apt-get install -y ninja-build gcc-8 g++-8
curl -o "$(Agent.TempDirectory)/sde.tar.bz2" -L $(SDE_URL_LINUX)
mkdir "$(Agent.TempDirectory)/sde-bin"
tar -C "$(Agent.TempDirectory)/sde-bin" -xjf "$(Agent.TempDirectory)/sde.tar.bz2" --strip 1
sudo ln -s $(Agent.TempDirectory)/sde-bin/sde64 /usr/bin/sde
- ci/run.sh build-release -DARCH_TESTS=sse2,sse3,sse41,avx,avx2 -DUSE_SDE=ON -DCPU_ARCH=avx -DENABLE_DFT=OFF -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_BUILD_TYPE=Release
+ ci/run.sh build-release -DKFR_ARCH_TESTS=sse2,sse3,sse41,avx,avx2 -DKFR_USE_SDE=ON -DKFR_ARCH=avx -DKFR_ENABLE_DFT=OFF -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_BUILD_TYPE=Release
-- job: Linux_x86_64_GCC9
+- job: Linux_x86_64_GCC10
timeoutInMinutes: 180
pool:
- vmImage: 'ubuntu-20.04'
+ vmImage: 'ubuntu-22.04'
steps:
- bash: |
set -e
- sudo apt-get update && sudo apt-get install -y ninja-build libmpfr-dev gcc-9 g++-9
+ sudo apt-get update && sudo apt-get install -y ninja-build gcc-10 g++-10
curl -o "$(Agent.TempDirectory)/sde.tar.bz2" -L $(SDE_URL_LINUX)
mkdir "$(Agent.TempDirectory)/sde-bin"
tar -C "$(Agent.TempDirectory)/sde-bin" -xjf "$(Agent.TempDirectory)/sde.tar.bz2" --strip 1
sudo ln -s $(Agent.TempDirectory)/sde-bin/sde64 /usr/bin/sde
- ci/run.sh build-release -DARCH_TESTS=sse2,sse3,sse41,avx,avx2 -DUSE_SDE=ON -DCPU_ARCH=avx2 -DENABLE_DFT=OFF -DCMAKE_CXX_COMPILER=g++-9 -DCMAKE_BUILD_TYPE=Release
+ ci/run.sh build-release -DKFR_ARCH_TESTS=sse2,sse3,sse41,avx,avx2,avx512 -DKFR_USE_SDE=ON -DKFR_ARCH=avx2 -DKFR_ENABLE_DFT=OFF -DCMAKE_CXX_COMPILER=g++-10 -DCMAKE_BUILD_TYPE=Release
-- job: Linux_x86_64_GCC10
+- job: Linux_x86_64_GCC12
timeoutInMinutes: 180
pool:
- vmImage: 'ubuntu-20.04'
+ vmImage: 'ubuntu-22.04'
steps:
- bash: |
set -e
- sudo apt-get update && sudo apt-get install -y ninja-build libmpfr-dev gcc-10 g++-10
+ sudo apt-get update && sudo apt-get install -y ninja-build gcc-12 g++-12
curl -o "$(Agent.TempDirectory)/sde.tar.bz2" -L $(SDE_URL_LINUX)
mkdir "$(Agent.TempDirectory)/sde-bin"
tar -C "$(Agent.TempDirectory)/sde-bin" -xjf "$(Agent.TempDirectory)/sde.tar.bz2" --strip 1
sudo ln -s $(Agent.TempDirectory)/sde-bin/sde64 /usr/bin/sde
- ci/run.sh build-release -DARCH_TESTS=sse2,sse3,sse41,avx,avx2 -DUSE_SDE=ON -DCPU_ARCH=avx2 -DENABLE_DFT=OFF -DCMAKE_CXX_COMPILER=g++-10 -DCMAKE_BUILD_TYPE=Release
+ ci/run.sh build-release -DKFR_ARCH_TESTS=sse2,sse3,sse41,avx,avx2 -DKFR_USE_SDE=ON -DKFR_ARCH=avx2 -DKFR_ENABLE_DFT=OFF -DCMAKE_CXX_COMPILER=g++-12 -DCMAKE_BUILD_TYPE=Release
- job: Linux_ARM_Clang9_Release
timeoutInMinutes: 180
@@ -192,7 +174,7 @@ jobs:
set -e
/bin/bash -c "sudo xcode-select -s /Applications/Xcode_13.1.app/Contents/Developer"
brew install ninja
- ci/run.sh build-release -DENABLE_CAPI_BUILD=ON -DARCH_TESTS=sse2,ssse3,sse41,avx -DCPU_ARCH=detect -DENABLE_DFT_MULTIARCH=ON -DCMAKE_BUILD_TYPE=Release
+ ci/run.sh build-release -DKFR_ENABLE_CAPI_BUILD=ON -DKFR_ARCH_TESTS=sse2,ssse3,sse41,avx -DKFR_ARCH=detect -DKFR_ENABLE_DFT_MULTIARCH=ON -DCMAKE_BUILD_TYPE=Release
- job: macOS15_x86_64_Clang_Release
timeoutInMinutes: 180
@@ -209,7 +191,7 @@ jobs:
set -e
/bin/bash -c "sudo xcode-select -s /Applications/Xcode_$(XCODE_VER).app/Contents/Developer"
brew install ninja
- ci/run.sh build-release -DENABLE_CAPI_BUILD=ON -DARCH_TESTS=sse2,ssse3,sse41,avx -DCPU_ARCH=detect -DENABLE_DFT_MULTIARCH=ON -DCMAKE_BUILD_TYPE=Release
+ ci/run.sh build-release -DKFR_ENABLE_CAPI_BUILD=ON -DKFR_ARCH_TESTS=sse2,ssse3,sse41,avx -DKFR_ARCH=detect -DKFR_ENABLE_DFT_MULTIARCH=ON -DCMAKE_BUILD_TYPE=Release
- job: macOS_x86_64_Clang_Release
timeoutInMinutes: 180
@@ -231,15 +213,13 @@ jobs:
export PATH=$PATH:$(Agent.TempDirectory)/sde-bin
sde64 -help || true
- # sudo spctl --master-disable
- # sudo /usr/sbin/DevToolsSecurity –enable
sudo security authorizationdb write system.privilege.taskport allow
sde64 -chip_check_exe_only -- $(Agent.TempDirectory)/sde-bin/intel64/nullapp
/bin/bash -c "sudo xcode-select -s /Applications/Xcode_$(XCODE_VER).app/Contents/Developer"
brew install ninja
- ci/run.sh build-release -DENABLE_CAPI_BUILD=ON -DUSE_SDE=ON -DARCH_TESTS=sse2,ssse3,sse41,avx,avx2,avx512 -DCPU_ARCH=sse2 -DENABLE_DFT_MULTIARCH=ON -DCMAKE_BUILD_TYPE=Release
+ ci/run.sh build-release -DKFR_ENABLE_CAPI_BUILD=ON -DKFR_USE_SDE=ON -DKFR_ARCH_TESTS=sse2,ssse3,sse41,avx,avx2,avx512 -DKFR_ARCH=sse2 -DKFR_ENABLE_DFT_MULTIARCH=ON -DCMAKE_BUILD_TYPE=Release
- job: iOS_ARM_Clang_Release
timeoutInMinutes: 180
@@ -250,7 +230,7 @@ jobs:
set -e
/bin/bash -c "sudo xcode-select -s /Applications/Xcode_11.7.app/Contents/Developer"
brew install ninja
- ci/run.sh build-release -DCMAKE_TOOLCHAIN_FILE=../cmake/ios.cmake -DCMAKE_BUILD_TYPE=Release -DIOS_PLATFORM=OS -DIOS_ARCH=armv7 -DCMAKE_MAKE_PROGRAM=/usr/local/bin/ninja -DSKIP_TESTS=ON
+ ci/run.sh build-release -DCMAKE_TOOLCHAIN_FILE=../cmake/ios.cmake -DCMAKE_BUILD_TYPE=Release -DIOS_PLATFORM=OS -DIOS_ARCH=armv7 -DCMAKE_MAKE_PROGRAM=/usr/local/bin/ninja -DKFR_SKIP_TESTS=ON
- job: iOS_ARM64_Clang_Release
timeoutInMinutes: 180
@@ -261,9 +241,9 @@ jobs:
set -e
/bin/bash -c "sudo xcode-select -s /Applications/Xcode_11.7.app/Contents/Developer"
brew install ninja
- ci/run.sh build-release -DCMAKE_TOOLCHAIN_FILE=../cmake/ios.cmake -DCMAKE_BUILD_TYPE=Release -DIOS_PLATFORM=OS64 -DIOS_ARCH=arm64 -DCMAKE_MAKE_PROGRAM=/usr/local/bin/ninja -DSKIP_TESTS=ON
+ ci/run.sh build-release -DCMAKE_TOOLCHAIN_FILE=../cmake/ios.cmake -DCMAKE_BUILD_TYPE=Release -DIOS_PLATFORM=OS64 -DIOS_ARCH=arm64 -DCMAKE_MAKE_PROGRAM=/usr/local/bin/ninja -DKFR_SKIP_TESTS=ON
-- job: Android_ARMv7_Clang_Release
+- job: Android_ARMv7_Clang11_Release
timeoutInMinutes: 180
pool:
vmImage: 'windows-2019'
@@ -275,9 +255,9 @@ jobs:
mkdir "%USERPROFILE%\.android"
echo > "%USERPROFILE%\.android\repositories.cfg"
call "%ANDROID_HOME%\tools\bin\sdkmanager.bat" "ndk-bundle" < %TMP%\always_yes
- ci\run.cmd build-release -DCMAKE_TOOLCHAIN_FILE="%ANDROID_HOME%\ndk-bundle\build\cmake\android.toolchain.cmake" -DANDROID_ABI=armeabi-v7a -DANDROID_ARM_NEON=TRUE -DSKIP_TESTS=ON -DCMAKE_BUILD_TYPE=Release
+ ci\run.cmd build-release -DCMAKE_TOOLCHAIN_FILE="%ANDROID_HOME%\ndk-bundle\build\cmake\android.toolchain.cmake" -DANDROID_ABI=armeabi-v7a -DANDROID_ARM_NEON=TRUE -DKFR_SKIP_TESTS=ON -DCMAKE_BUILD_TYPE=Release
-- job: Android_AArch64_Clang_Release
+- job: Android_AArch64_Clang11_Release
timeoutInMinutes: 180
pool:
vmImage: 'windows-2019'
@@ -289,9 +269,9 @@ jobs:
mkdir "%USERPROFILE%\.android"
echo > "%USERPROFILE%\.android\repositories.cfg"
call "%ANDROID_HOME%\tools\bin\sdkmanager.bat" "ndk-bundle" < %TMP%\always_yes
- ci\run.cmd build-release -DCMAKE_TOOLCHAIN_FILE="%ANDROID_HOME%\ndk-bundle\build\cmake\android.toolchain.cmake" -DANDROID_ABI=arm64-v8a -DANDROID_ARM_NEON=TRUE -DSKIP_TESTS=ON -DCMAKE_BUILD_TYPE=Release
+ ci\run.cmd build-release -DCMAKE_TOOLCHAIN_FILE="%ANDROID_HOME%\ndk-bundle\build\cmake\android.toolchain.cmake" -DANDROID_ABI=arm64-v8a -DANDROID_ARM_NEON=TRUE -DKFR_SKIP_TESTS=ON -DCMAKE_BUILD_TYPE=Release
-- job: Windows_MinGW_x86_Clang13_Release
+- job: Windows_MinGW_x86_Clang14_Release
timeoutInMinutes: 180
pool:
vmImage: 'windows-2019'
@@ -304,9 +284,9 @@ jobs:
set PATH=C:\ProgramData\Chocolatey\bin;C:\Program Files\CMake\bin;C:\tools\msys64\usr\local\bin;C:\tools\msys64\usr\bin;C:\tools\msys64\mingw32\bin;C:\windows;C:\windows\system32;C:\Windows;C:\Windows\System32\WindowsPowerShell\v1.0
call C:\tools\msys64\msys2_shell.cmd -defterm -mingw32 -no-start -full-path -here -c "pacman -S --noconfirm mingw32/mingw-w64-i686-gcc"
call C:\tools\msys64\msys2_shell.cmd -defterm -mingw32 -no-start -full-path -here -c "pacman -S --noconfirm mingw32/mingw-w64-i686-ninja"
- call C:\tools\msys64\msys2_shell.cmd -defterm -mingw32 -no-start -full-path -here -c "ci/run.sh build-release -DCMAKE_CXX_COMPILER=""C:/Program Files/LLVM/bin/clang++.exe"" -DCPU_ARCH=avx -DCMAKE_CXX_FLAGS=--target=i686-w64-windows-gnu -DCMAKE_BUILD_TYPE=Release"
+ call C:\tools\msys64\msys2_shell.cmd -defterm -mingw32 -no-start -full-path -here -c "ci/run.sh build-release -DCMAKE_CXX_COMPILER=""C:/Program Files/LLVM/bin/clang++.exe"" -DKFR_ARCH=avx -DCMAKE_CXX_FLAGS=--target=i686-w64-windows-gnu -DCMAKE_BUILD_TYPE=Release"
-- job: Windows_MinGW_x86_64_Clang13_Release
+- job: Windows_MinGW_x86_64_Clang14_Release
timeoutInMinutes: 180
pool:
vmImage: 'windows-2019'
@@ -319,7 +299,7 @@ jobs:
set PATH=C:\ProgramData\Chocolatey\bin;C:\Program Files\CMake\bin;C:\tools\msys64\usr\local\bin;C:\tools\msys64\usr\bin;C:\tools\msys64\mingw64\bin;C:\windows;C:\windows\system32;C:\Windows;C:\Windows\System32\WindowsPowerShell\v1.0
call C:\tools\msys64\msys2_shell.cmd -defterm -mingw64 -no-start -full-path -here -c "pacman -S --noconfirm mingw64/mingw-w64-x86_64-gcc"
call C:\tools\msys64\msys2_shell.cmd -defterm -mingw64 -no-start -full-path -here -c "pacman -S --noconfirm mingw64/mingw-w64-x86_64-ninja"
- call C:\tools\msys64\msys2_shell.cmd -defterm -mingw64 -no-start -full-path -here -c "ci/run.sh build-release -DCMAKE_CXX_COMPILER=""C:/Program Files/LLVM/bin/clang++.exe"" -DCPU_ARCH=avx -DCMAKE_CXX_FLAGS=--target=x86_64-w64-windows-gnu -DCMAKE_BUILD_TYPE=Release"
+ call C:\tools\msys64\msys2_shell.cmd -defterm -mingw64 -no-start -full-path -here -c "ci/run.sh build-release -DCMAKE_CXX_COMPILER=""C:/Program Files/LLVM/bin/clang++.exe"" -DKFR_ARCH=avx -DCMAKE_CXX_FLAGS=--target=x86_64-w64-windows-gnu -DCMAKE_BUILD_TYPE=Release"
- job: Windows_MSVC_x86_64_AVX512_MSVC2019_Release
timeoutInMinutes: 180
@@ -339,40 +319,41 @@ jobs:
set PATH=%PATH:C:\Program Files\LLVM\bin;=%
set PATH=%PATH:C:\Strawberry\c\bin;=%
set PATH=C:\sde;%PATH%
- ci\run.cmd build-release -DARCH_TESTS=ON -DUSE_SDE=ON -DCPU_ARCH=avx512 -DENABLE_DFT=OFF -DCMAKE_BUILD_TYPE=Release
-
-# - job: Windows_MSVC_x86_AVX512_MSVC2019_Release
-# timeoutInMinutes: 180
-# pool:
-# vmImage: 'windows-2019'
-# steps:
-# - script: |
-# choco uninstall mingw
-# choco install ninja
-
-# curl -o "$(Agent.TempDirectory)/sde.zip" -L $(SDE_URL_WINDOWS)
-# "C:\Program Files\7-Zip\7z.exe" x -oC:\sde "$(Agent.TempDirectory)/sde.zip"
-
-# call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars32.bat"
-# set PATH=%PATH:C:\tools\mingw64\bin;=%
-# set PATH=%PATH:C:\Program Files\Git\mingw64\bin;=%
-# set PATH=%PATH:C:\Program Files\LLVM\bin;=%
-# set PATH=%PATH:C:\Strawberry\c\bin;=%
-# set PATH=C:\sde;%PATH%
-# ci\run.cmd build-release -DARCH_TESTS=OFF -DUSE_SDE=ON -DCPU_ARCH=avx512 -DENABLE_DFT=OFF -DCMAKE_BUILD_TYPE=Release
-
-# - job: Windows_MSVC2022_x86_64_Release
-# timeoutInMinutes: 180
-# pool:
-# vmImage: 'windows-2022'
-# steps:
-# - script: |
-# choco uninstall mingw
-# choco install ninja
-
-# call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
-# set PATH=%PATH:C:\tools\mingw64\bin;=%
-# set PATH=%PATH:C:\Program Files\Git\mingw64\bin;=%
-# set PATH=%PATH:C:\Program Files\LLVM\bin;=%
-# set PATH=%PATH:C:\Strawberry\c\bin;=%
-# ci\run.cmd build-release -DARCH_TESTS=OFF -DCPU_ARCH=detect -DENABLE_DFT=OFF -DCMAKE_BUILD_TYPE=Release
+ ci\run.cmd build-release -DKFR_ARCH_TESTS=ON -DKFR_USE_SDE=ON -DKFR_ARCH=avx512 -DKFR_ENABLE_DFT=OFF -DCMAKE_BUILD_TYPE=Release
+
+- job: Windows_MSVC_x86_AVX512_MSVC2019_Release
+ timeoutInMinutes: 180
+ pool:
+ vmImage: 'windows-2019'
+ steps:
+ - script: |
+ choco uninstall mingw
+ choco install ninja
+
+ curl -o "$(Agent.TempDirectory)/sde.zip" -L $(SDE_URL_WINDOWS)
+ "C:\Program Files\7-Zip\7z.exe" x -oC:\sde "$(Agent.TempDirectory)/sde.zip"
+
+ call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars32.bat"
+ set PATH=%PATH:C:\tools\mingw64\bin;=%
+ set PATH=%PATH:C:\Program Files\Git\mingw64\bin;=%
+ set PATH=%PATH:C:\Program Files\LLVM\bin;=%
+ set PATH=%PATH:C:\Strawberry\c\bin;=%
+ set PATH=C:\sde;%PATH%
+ ci\run.cmd build-release -DKFR_ARCH_TESTS=OFF -DKFR_USE_SDE=ON -DKFR_ARCH=avx512 -DKFR_ENABLE_DFT=OFF -DCMAKE_BUILD_TYPE=Release
+
+- job: Windows_MSVC2022_x86_64_Release
+ timeoutInMinutes: 180
+ pool:
+ vmImage: 'windows-2022'
+ steps:
+ - script: |
+ choco uninstall mingw
+ choco install ninja
+
+ call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
+ set PATH=%PATH:C:\tools\mingw64\bin;=%
+ set PATH=%PATH:C:\Program Files\Git\mingw64\bin;=%
+ set PATH=%PATH:C:\Program Files\LLVM\bin;=%
+ set PATH=%PATH:C:\Strawberry\c\bin;=%
+ set JOBS=-j2
+ ci\run.cmd build-release -DKFR_ARCH_TESTS=sse2,sse42,avx,avx2 -DKFR_ARCH=sse2 -DKFR_ENABLE_DFT=OFF -DCMAKE_BUILD_TYPE=Release
diff --git a/capi/CMakeLists.txt b/capi/CMakeLists.txt
@@ -37,10 +37,13 @@ if (APPLE)
endif ()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/bin)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${PROJECT_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/lib)
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/lib)
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/lib)
add_library(kfr_capi_all INTERFACE)
diff --git a/ci/build_capi_win.cmd b/ci/build_capi_win.cmd
@@ -6,7 +6,7 @@ echo Preparing directories...
rmdir /s /q %build_dir%
mkdir %build_dir%
pushd %build_dir%
-set arguments=-DENABLE_DFT=ON -DENABLE_CAPI_BUILD=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=C:/LLVM9/bin/clang-cl.exe
+set arguments=-DKFR_ENABLE_DFT=ON -DKFR_ENABLE_CAPI_BUILD=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=C:/LLVM9/bin/clang-cl.exe
echo Running cmake -GNinja %arguments% ..
cmake -GNinja %arguments% .. || exit /b
echo Running ninja...
diff --git a/ci/run.cmd b/ci/run.cmd
@@ -7,7 +7,7 @@ pushd %build_dir%
echo Running cmake -GNinja -DENABLE_TESTS=ON %* ..
cmake -GNinja -DENABLE_TESTS=ON %* .. || exit /b
echo Running ninja...
-ninja || exit /b
+ninja %JOBS% || exit /b
echo Running tests...
cd tests && ctest -V || exit /b
popd
diff --git a/cmake/aarch64.cmake b/cmake/aarch64.cmake
@@ -18,11 +18,11 @@ set(TGT_TRIPLET aarch64-linux-gnu)
set (ARM_ROOT "/usr/${TGT_TRIPLET}/include")
if (NOT GCC_VER)
- set (GCC_VER 5.4.0)
+ set (GCC_VER 7.5.0)
endif ()
set (SYS_PATHS "-isystem ${ARM_ROOT}/c++/${GCC_VER} -isystem ${ARM_ROOT}/c++/${GCC_VER}/backward -isystem ${ARM_ROOT}/c++/${GCC_VER}/${TGT_TRIPLET} -isystem ${ARM_ROOT}")
-set (ARM_COMMON_FLAGS "-target ${TGT_TRIPLET} -mcpu=cortex-a72 -static")
+set (ARM_COMMON_FLAGS "-std=gnu++17 -target ${TGT_TRIPLET} -mcpu=cortex-a72 -static")
set (CMAKE_CXX_FLAGS "${SYS_PATHS} ${ARM_COMMON_FLAGS}" CACHE STRING "")
set (CMAKE_C_FLAGS " ${SYS_PATHS} ${ARM_COMMON_FLAGS}" CACHE STRING "")
diff --git a/cmake/arm.cmake b/cmake/arm.cmake
@@ -17,13 +17,13 @@ set(TGT_TRIPLET arm-linux-gnueabihf)
set (ARM_ROOT "/usr/${TGT_TRIPLET}/include")
if (NOT GCC_VER)
- set (GCC_VER 5.4.0)
+ set (GCC_VER 7.5.0)
endif ()
set (SYS_PATHS "-isystem ${ARM_ROOT}/c++/${GCC_VER} -isystem ${ARM_ROOT}/c++/${GCC_VER}/backward -isystem ${ARM_ROOT}/c++/${GCC_VER}/${TGT_TRIPLET} -isystem ${ARM_ROOT}")
set (ARM_COMMON_FLAGS "-target ${TGT_TRIPLET} -mcpu=cortex-a15 -mfpu=neon-vfpv4 -mfloat-abi=hard -static")
-set (CMAKE_CXX_FLAGS "${SYS_PATHS} ${ARM_COMMON_FLAGS}" CACHE STRING "")
+set (CMAKE_CXX_FLAGS "-std=gnu++17 ${SYS_PATHS} ${ARM_COMMON_FLAGS}" CACHE STRING "")
set (CMAKE_C_FLAGS " ${SYS_PATHS} ${ARM_COMMON_FLAGS}" CACHE STRING "")
set (CMAKE_CXX_LINK_FLAGS " ${ARM_COMMON_FLAGS} ${CMAKE_CXX_LINK_FLAGS}")
diff --git a/docs/README.md b/docs/README.md
@@ -0,0 +1 @@
+See [KFR Documentation Index](docs/index.md)
diff --git a/docs/cxxdox.yml b/docs/cxxdox.yml
@@ -16,6 +16,7 @@ clang:
- '-DKFR_ENABLE_FLAC=1'
- '-DCMT_FORCE_GENERIC_CPU=1'
- '-std=gnu++17'
+ - '-DDOCUMENTATION'
input_directory: ../include/kfr
@@ -26,8 +27,10 @@ repository: https://github.com/kfrlib/kfr/blob/{TAG}/include/kfr/{FILE}#L{LINE}
groups:
filter: "Filter API"
cpuid: "Runtime CPU detection"
- cometa: "CoMeta - metaprogramming"
- testo: "Testo - unit test"
+ cometa: "CoMeta"
+ testo: "Testo - Unit testing"
+ univector: "Vector"
+ tensor: "Tensor"
dft: "DFT"
binary_io: "Generic IO"
audio_io: "Audio IO"
@@ -61,6 +64,6 @@ groups:
expressions: "Expressions"
generators: "Generator expressions"
random: "PRNG functions and expressions"
- array: "Array functions"
+ reducing: "Reducing functions"
utility: "Utility functions"
\ No newline at end of file
diff --git a/docs/docs/basics.md b/docs/docs/basics.md
@@ -0,0 +1,334 @@
+# Basics
+
+To include all KFR modules use `kfr/all.hpp` header. Note that DFT and IO modules need linking appropriate static libraries, `kfr_dft` and `kfr_io`.
+
+```c++
+#include <kfr/all.hpp>
+```
+
+Alternatively, you can include only the modules you need:
+
+```c++
+#include <kfr/base.hpp> // Functions, expressions
+#include <kfr/dft.hpp> // DFT/DCT and convolution
+#include <kfr/dsp.hpp> // DSP, Filters etc
+#include <kfr/io.hpp> // Audio file reading
+```
+
+## Types
+
+### SIMD vector
+
+`vec` is a template class that contains 1 or more elements and lets functions operate them in a machine-efficient way.
+
+The class synopsis:
+
+```c++
+template <typename T, size_t N>
+struct alignas(...) vec
+{
+ using value_type = T;
+
+ // Constructors
+ // broadcast scalar to all elements
+ vec(T broadcasting);
+ // initialize all elements
+ template <typename... Ts>
+ vec(Ts... elements);
+ // concatenate vectors (sum(Ns...) == N)
+ template <size_t... Ns>
+ vec(const vec<T, Ns>&... concatenation);
+ // implicit element type conversion
+ template <typename U>
+ vec(const vec<U, N>& conversion);
+ ...
+
+ // element is a proxy class to get/set specific element
+ struct element
+ {
+ };
+
+ // Functions to access elements, const-versions omitted
+ // access by index
+ element operator[](size_t index);
+ // access first element
+ element front();
+ // access last element
+ element back();
+
+ // return size
+ size_t size() const;
+};
+template <typename... T>
+vec(T&&...) -> vec<std::common_type_t<T...>, sizeof...(T)>;
+```
+
+!!! note
+ The class implementation is specific to the target cpu, so `vec` class definition resides in `kfr::CMT_ARCH_NAME` namespace. For avx2 architecture it's `kfr::avx2`. The architecture namespace is declared inline, you should not use it directly, `kfr::vec` as treated by compiler as an alias for `kfr::CMT_ARCH_NAME::vec`.
+
+
+Use can omit the template parameters and let compiler deduce them for you:
+```c++
+vec x{ 10, 5, 2.5, 1.25 }; // vec<double, 4>
+
+some_function(vec{ 3, 2, 1 }); // vec<int, 3>
+```
+
+Vectors can be nested. `vec<vec<float, 2>, 2>` is a valid declaration.
+
+### 1D array
+
+`univector` is a template class that, based on the template parameter, may hold data in heap like `std::vector`, in its storage like `std::array` or hold pointer to external data like `std::span`.
+
+#### `univector<T>`
+
+This specialization holds data in heap. Memory is automatically aligned.
+
+`univector<T>` is derived from `std::vector<T>` but with KFR own allocator that provides alignment for memory allocation and contains all member functions and constructors from `std::vector<T, ...>`.
+
+#### `univector<T, Size>`
+
+This specialization holds data in its storage. `univector<T, Size>` is derived from `std::array<T>`and contains all member functions and constructors from `std::array<T>` but is properly aligned.
+
+`Size` must not be zero.
+
+#### `univector<T, 0>`
+
+This specialization works like `std::span` from C++20 and holds only pointer and size to external memory. Data alignment is preserved and cannot be enforced.
+
+For all specializations data is always contiguous in memory.
+
+#### Alignment
+
+For SIMD operations to be effective, data should be aligned to 16, 32 or 64 bytes boundary. Default STL allocator cannot provide such alignment, so holding data in `std::vector<T>` with defalt allocator may be suboptimal.
+
+KFR has its own STL-compatible allocator `kfr::data_allocator` that aligns memory to 64-bytes boundary. Using it with STL containers may increase performance.
+
+!!! note
+ Define `KFR_USE_STD_ALLOCATION` macro to make `data_allocator` an alias for `std::allocator`. This makes `univector`s interchangeable with `std::vector`s
+
+#### Passing 1D data to KFR functions
+
+Many KFR functions, such as DFT, receive and return data through `univector` class. If it's possible, use `univector` in your code as a storage for all data that may be passed to KFR functions. But if you already have data and need to pass it to KFR, you may use `make_univector` function that constructs `univector<T, 0>` from the pointer and the size or from a STL-compatible container (if `data()` and `size()` is defined).
+
+```c++
+std::vector<float> data; // existing data, or std::array<N, float>
+
+float val = rms(make_univector(data)); // No data copy
+```
+
+```c++
+const float* data; // existing data
+size_t size; //
+
+float val = rms(make_univector(data, size)); // No data copy
+```
+
+```c++
+const float data[1024];
+
+float val = rms(make_univector(data)); // No data copy
+```
+
+#### Slice
+
+You can get subrange of an array using `slice` function defined in all specializations of `univector` class.
+
+```c++
+univector<float, 100> v;
+// ...
+const float s1 = sum(v); // Sum all elements
+const float s2 = sum(v.slice(2, 50)); // Sum 50 elements starting from 2
+```
+
+Result of the call to `slice` is always `univector<T, 0>`, a reference to external data.
+Not tat the lifetime of the reference is limited to the lifetime of the original data.
+
+!!! note
+ `univector` class is also [Expression](expressions.md) and can be used whereever expression is required.
+
+### Tensor (Multidimensional array)
+
+`tensor` is a class that holds or references multidimensional data and provides
+a way to access individual elements and perform complex operations on the data.
+
+The number of elements in each axis of the array is defined by its _shape_.
+The number of dimensions is fixed at compile time.
+
+Tensor class synopsis:
+
+```c++
+
+struct memory_finalizer;
+
+// T is the element type
+// Dims is the number of dimensions
+template <typename T, index_t Dims>
+struct tensor
+{
+ using value_type = T;
+ using shape_type = shape<Dims>;
+
+ // iterates through flattened array
+ struct tensor_iterator;
+
+ // iterates nested arrays
+ struct nested_iterator;
+
+ // construct from external pointer, shape, strides and finalizer
+ tensor(T* data, const shape_type& shape, const shape_type& strides,
+ memory_finalizer finalizer);
+
+ // construct from external pointer, shape and finalizer with default strides
+ tensor(T* data, const shape_type& shape, memory_finalizer finalizer);
+
+ // construct from shape and allocate memory
+ tensor(const shape_type& shape);
+
+ // construct from shape, strides and allocate memory
+ tensor(const shape_type& shape, const shape_type& strides);
+
+ // construct from shape, allocate memory and fill with value
+ tensor(const shape_type& shape, T value);
+
+ // construct from shape, strides, allocate memory and fill with value
+ tensor(const shape_type& shape, const shape_type& strides, T value);
+
+ // construct from shape, allocate memory and fill with flat list
+ tensor(const shape_type& shape, const std::initializer_list<T>& values);
+
+ // initialize with braced list. defined for 1D tensor only
+ template <typename U>
+ tensor(const std::initializer_list<U>& values);
+
+ // initialize with nested braced list. defined for 2D tensor only
+ template <typename U>
+ tensor(const std::initializer_list<std::initializer_list<U>>& values);
+
+ // initialize with nested braced list. defined for 3D tensor only
+ template <typename U>
+ tensor(const std::initializer_list<std::initializer_list<std::initializer_list<U>>>& values)
+
+ // shape of tensor
+ shape_type shape() const;
+ // strides
+ shape_type strides() const;
+
+ pointer data() const;
+ size_type size() const;
+ bool empty() const;
+ tensor_iterator begin() const;
+ tensor_iterator end() const;
+
+ // access individual element by index
+ value_type& access(const shape_type& index) const;
+
+ // access individual element by list of indices
+ value_type& operator()(size_t... index) const;
+
+ // return subrange, individual axis or slice
+ template <typename... Index>
+ tensor<T, ...> operator()(const Index&...) const;
+
+ // return flattened array, see Reshaping below
+ tensor<T, 1> flatten() const;
+ // return reshaped array, see Reshaping below
+ template <index_t dims>
+ tensor<T, dims> reshape(const shape<dims>& new_shape) const;
+
+ // convert multidimensional tensor to string
+ template <typename Fmt = void>
+ std::string to_string(int max_columns = 16, int max_dimensions = INT_MAX, std::string separator = ", ",
+ std::string open = "{", std::string close = "}") const;
+};
+```
+
+Iteration is always goes from the first axis to the last axis.
+
+By default the last axis is contiguous in memory but it can be changed with custom `strides`.
+
+```c++
+tensor<double, 1> t1{ 1, 2, 3, 4, 5, 6 };
+tensor<double, 2> t2{ {1, 2}, {3, 4}, {5, 6} };
+tensor<double, 3> t3{ {{1}, {2}}, {{3}, {4}}, {{5}, {6}} };
+// Memory layout for all these tensors is: 1, 2, 3, 4, 5, 6
+```
+
+!!! important `const`-qualified tensors are writable. This is to make it possible to pass a writable subrange to function without converting to lvalue.
+
+Tensor behaves like a shared pointer to memory (possibly allocated outside tensor class, see [Constructing tensor from external data](#constructing-tensor-from-external-data)) with automatic reference counting. Copy and assignment increments internal counter and the internal pointer still references the original data.
+
+_Important_: Writing to one shared copy will modify all other copies of the this tensor too.
+To get a deep copy call the `copy` member function:
+
+```c++
+tensor<float, 2> t = other;
+t = t.copy();
+```
+
+#### Reshaping
+
+`reshape` and `flatten` functions perform reshaping and return new tensor that shares data with the original tensor.
+
+Not every tensor may be reshaped to any shape. The total number of elements must be same before and after reshaping.
+
+Also, to be able to share data the original tensor must be contiguous. If this requirement isn't meet, `reshape` and `flatten` functions throw `kfr::logic_error` exception.
+There are variants of these functions called `reshape_may_copy` and `flatten_may_copy` that return a new tensor that does not share data with the original tensor in that cases.
+
+#### Slicing
+
+To slice the original array the special value constructed by `trange`, `tstart`, `tstop` or `tall` functions should be passed to tensor's `operator()`.
+
+```c++
+constexpr tensor_range trange(std::optional<signed_index_t> start = std::nullopt,
+ std::optional<signed_index_t> stop = std::nullopt,
+ std::optional<signed_index_t> step = std::nullopt)
+{
+ return { start, stop, step };
+}
+```
+
+If `start` is nullopt, the slice starts from the first element (or the last one if step is negative). If `stop` is nullopt, the slice ends at the last element (or the first one if step is negative).
+If `step` is nullopt or omitted, the step will be equal to 1.
+
+`tstart(start)` and `tstart(start, step)` are equivalents of calling `trange(start, nullopt, nullopt)` and `trange(start, nullopt, step)` and used to return the range starting from the `start` along the given axis.
+
+`tstop(stop)` and `tstop(stop, step)` are equivalents of calling `trange(nullopt, stop, nullopt)` and `trange(nullopt, stop, step)` and used to return the range stopping at the `stop` along the given axis.
+
+`tall()` is equivalent of `trange(nullopt, nullopt, nullopt)` and used to return the whole range of the given axis.
+
+Examples:
+
+```c++
+tensor<double, 2> t1(shape{ 8, 6 });
+// initialize tensor
+t1 = counter(0, 10, 1);
+// t1 =
+// {{ 0, 1, 2, 3, 4, 5, 6, 7},
+// {10, 11, 12, 13, 14, 15, 16, 17},
+// {20, 21, 22, 23, 24, 25, 26, 27},
+// {30, 31, 32, 33, 34, 35, 36, 37},
+// {40, 41, 42, 43, 44, 45, 46, 47},
+// {50, 51, 52, 53, 54, 55, 56, 57}}
+
+// slice tensor
+tensor<double, 2> t2 = t(tstart(2), trange(2, 4));
+// t2 =
+// {{22, 23, 24},
+// {32, 33, 34},
+// {42, 43, 44},
+// {52, 53, 54}}
+```
+
+#### Constructing tensor from external data
+
+```c++
+tensor<float, 1> fn(std::vector<float>&& v)
+{
+ tensor<float, 1> t = tensor_from_container(std::move(v));
+ // no data copy is performed. v is being moved to finalizer
+ // and tensor references original vector data
+ return t;
+}
+```
+
diff --git a/docs/docs/capi.md b/docs/docs/capi.md
@@ -0,0 +1,27 @@
+# KFR C API
+
+## Building KFR C API
+
+Clang is required. See [Installation](installation.md)
+
+### Windows
+
+These commands must be executed in MSVC2019 command prompt.
+
+```bash
+cd <path_to_kfr_repository>
+mkdir build && cd build
+cmake -GNinja -DENABLE_CAPI_BUILD=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER="<PATH_TO_LLVM_DIR>/bin/clang-cl.exe" ..
+ninja kfr_capi
+```
+
+### Linux, macOS, other
+
+```bash
+cd <path_to_kfr_repository>
+mkdir build && cd build
+cmake -GNinja -DENABLE_CAPI_BUILD=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang++ ..
+ninja kfr_capi
+```
+
+Optionally, you can install the binaries into your system using `ninja install`
diff --git a/docs/docs/conv_reverb.md b/docs/docs/conv_reverb.md
@@ -0,0 +1,70 @@
+## How to apply Convolution Reverb
+
+### Mono version
+
+Input/Output data: [See how to pass data to KFR](basics.md)
+```c++
+univector<float> audio;
+univector<float> impulse_response;
+```
+Code
+```c++
+convolve_filter<float> reverb(impulse_response);
+reverb.apply(audio);
+```
+
+!!! note
+ `convolve_filter` uses [Filter API](auto/filter.md) and preserves its internal state between calls to `apply`.
+ Audio can be processed in chunks.
+ Use `reset` function to reset its internal state.
+
+ `convolve_filter` has zero latency.
+
+ Internally, [FFT](dft.md) is used for performing convolution
+
+### True stereo version
+
+Formula
+
+$$
+\begin{aligned}
+ out_{L} &= in_{L} * ir_{LL} + in_{R} * ir_{RL}\\
+ out_{R} &= in_{L} * ir_{LR} + in_{R} * ir_{RR}
+\end{aligned}
+$$
+
+where $*$ is convolution operator.
+
+Input/Output data:
+```c++
+univector<float, 2> stereo_audio;
+univector<float, 4> impulse_response;
+// impulse_response[0] is left to left
+// impulse_response[1] is right to left
+// impulse_response[2] is left to right
+// impulse_response[3] is right to right
+```
+Code
+```c++
+// Prepare filters
+convolve_filter<float> reverb_LL(impulse_response[0]);
+convolve_filter<float> reverb_LR(impulse_response[1]);
+convolve_filter<float> reverb_RL(impulse_response[2]);
+convolve_filter<float> reverb_RR(impulse_response[3]);
+
+// Allocate temp data
+univector<float> tmp1(stereo_audio[0].size());
+univector<float> tmp2(stereo_audio[0].size());
+univector<float> tmp3(stereo_audio[0].size());
+univector<float> tmp4(stereo_audio[0].size());
+
+// Apply convolution
+reverb_LL.apply(tmp1, audio[0]);
+reverb_RL.apply(tmp2, audio[1]);
+reverb_LR.apply(tmp3, audio[0]);
+reverb_RR.apply(tmp4, audio[1]);
+
+// final downmix
+audio[0] = tmp1 + tmp2;
+audio[1] = tmp3 + tmp4;
+```
diff --git a/docs/docs/convert_stereo.md b/docs/docs/convert_stereo.md
@@ -2,7 +2,7 @@
## L/R to M/S
-Input/output data. [See how to pass data to KFR](types.md)
+Input/output data. [See how to pass data to KFR](basics.md)
```c++
univector<float> left;
univector<float> right;
@@ -42,4 +42,4 @@ mono = (left + right) * 0.5f;
or, depending on what results you want to get
```c++
mono = left + right;
-```
-\ No newline at end of file
+```
diff --git a/docs/docs/convolution.md b/docs/docs/convolution.md
@@ -1,115 +1,50 @@
-# How to apply Convolution Reverb
+# Convolution filter details
-## Mono version
-
-Input/Output data: [See how to pass data to KFR](types.md)
-```c++
-univector<float> audio;
-univector<float> impulse_response;
-```
-Code
-```c++
-convolve_filter<float> reverb(impulse_response);
-reverb.apply(audio);
-```
-
-!!! note
- `convolve_filter` uses [Filter API](filters.md) and preserves its internal state between calls to `apply`.
- Audio can be processed in chunks.
- Use `reset` function to reset its internal state.
-
- `convolve_filter` has zero latency.
-
- Internally, [FFT](dft.md) is used for performing convolution
-
-## True stereo version
-
-Formula
-
-$$
-\begin{aligned}
- out_{L} &= in_{L} * ir_{LL} + in_{R} * ir_{RL}\\
- out_{R} &= in_{L} * ir_{LR} + in_{R} * ir_{RR}
-\end{aligned}
-$$
-
-where $*$ is convolution operator.
-
-Input/Output data:
-```c++
-univector<float, 2> stereo_audio;
-univector<float, 4> impulse_response;
-// impulse_response[0] is left to left
-// impulse_response[1] is right to left
-// impulse_response[2] is left to right
-// impulse_response[3] is right to right
-```
-Code
-```c++
-// Prepare filters
-convolve_filter<float> reverb_LL(impulse_response[0]);
-convolve_filter<float> reverb_LR(impulse_response[1]);
-convolve_filter<float> reverb_RL(impulse_response[2]);
-convolve_filter<float> reverb_RR(impulse_response[3]);
-
-// Allocate temp data
-univector<float> tmp1(stereo_audio[0].size());
-univector<float> tmp2(stereo_audio[0].size());
-univector<float> tmp3(stereo_audio[0].size());
-univector<float> tmp4(stereo_audio[0].size());
-
-// Apply convolution
-reverb_LL.apply(tmp1, audio[0]);
-reverb_RL.apply(tmp2, audio[1]);
-reverb_LR.apply(tmp3, audio[0]);
-reverb_RR.apply(tmp4, audio[1]);
-
-// final downmix
-audio[0] = tmp1 + tmp2;
-audio[1] = tmp3 + tmp4;
-```
-
-# Implementation Details
+## Implementation Details
The convolution filter efficiently computes the convolution of two signals.
The efficiency is achieved by employing the FFT and the circular convolution
theorem. The algorithm is a variant of the [overlap-add
method](https://en.wikipedia.org/wiki/Overlap%E2%80%93add_method). It works on
-a fixed block size \(B\) for arbitrarily long input signals. Thus, the
-convolution of a streaming input signal with a long FIR filter \(h[n]\) (where
-the length of \(h[n]\) may exceed the block size \(B\)) is computed with a
-fixed complexity \(O(B \log B)\).
-
-More formally, the convolution filter computes \(y[n] = (x * h)[n]\) by
-partitioning the input \(x\) and filter \(h\) into blocks and applies the
-overlap-add method. Let \(x[n]\) be an input signal of arbitrary length. Often,
-\(x[n]\) is a streaming input with unknown length. Let \(h[n]\) be an FIR
-filter with \(M\) taps. The convolution filter works on a fixed block size
-\(B=2^b\).
+a fixed block size $B$ for arbitrarily long input signals. Thus, the
+convolution of a streaming input signal with a long FIR filter $h[n]$ (where
+the length of $h[n]$ may exceed the block size $B$) is computed with a
+fixed complexity $O(B \log B)$.
+
+More formally, the convolution filter computes $y[n] = (x * h)[n]$ by
+partitioning the input $x$ and filter $h$ into blocks and applies the
+overlap-add method. Let $x[n]$ be an input signal of arbitrary length. Often,
+$x[n]$ is a streaming input with unknown length. Let $h[n]$ be an FIR
+filter with $M$ taps. The convolution filter works on a fixed block size
+$B=2^b$.
First, the input and filter are windowed and shifted to the origin to give the
-\(k\)-th block input \(x_k[n] = x[n + kB] , n=\{0,1,\ldots,B-1\},\forall
-k\in\mathbb{Z}\) and \(j\)-th block filter \(h_j[n] = h[n + jB] ,
-n=\{0,1,\ldots,B-1\},j=\{0,1,\ldots,\lfloor M/B \rfloor\}\). The convolution
-\(y_{k,j}[n] = (x_k * h_j)[n]\) is efficiently computed with length \(2B\) FFTs
+$k$-th block input $x_k[n] = x[n + kB] , n=\{0,1,\ldots,B-1\},\forall k\in\mathbb{Z}$ and $j$-th block filter $h_j[n] = h[n + jB] ,n=\{0,1,\ldots,B-1\},j=\{0,1,\ldots,\lfloor M/B \rfloor\}$. The convolution
+$y_{k,j}[n] = (x_k * h_j)[n]$ is efficiently computed with length $2B$ FFTs
as
-\[
+
+$$
y_{k,j}[n] = \mathrm{IFFT}(\mathrm{FFT}(x_k[n])\cdot\mathrm{FFT}(h_j[n]))
.
-\]
+$$
The overlap-add method sums the "overlap" from the previous block with the current block.
-To complete the \(k\)-th block, the contribution of all blocks of the filter
+To complete the $k$-th block, the contribution of all blocks of the filter
are summed together to give
-\[ y_{k}[n] = \sum_j y_{k-j,j}[n] . \]
+
+$$ y_{k}[n] = \sum_j y_{k-j,j}[n] . $$
+
The final convolution is then the sum of the shifted blocks
-\[ y[n] = \sum_k y_{k}[n - kB] . \]
-Note that \(y_k[n]\) is of length \(2B\) so its second half overlaps and adds
-into the first half of the \(y_{k+1}[n]\) block.
+
+$$ y[n] = \sum_k y_{k}[n - kB] . $$
+
+Note that $y_k[n]$ is of length $2B$ so its second half overlaps and adds
+into the first half of the $y_{k+1}[n]$ block.
## Maximum efficiency criterion
To avoid excess computation or maximize throughput, the convolution filter
-should be given input samples in multiples of the block size \(B\). Otherwise,
+should be given input samples in multiples of the block size $B$. Otherwise,
the FFT of a block is computed twice as many times as would be necessary and
hence throughput is reduced.
+
diff --git a/docs/docs/css/fix.css b/docs/docs/css/fix.css
@@ -1,11 +1,21 @@
-.md-typeset .admonition, .md-typeset details {
- box-shadow: 0 2px 2px 0 rgba(0,0,0,.14) !important;
- }
-.md-typeset .admonition.abstract>.admonition-title, .md-typeset .admonition.abstract>summary, .md-typeset .admonition.summary>.admonition-title, .md-typeset .admonition.summary>summary, .md-typeset .admonition.tldr>.admonition-title, .md-typeset .admonition.tldr>summary, .md-typeset details.abstract>.admonition-title, .md-typeset details.abstract>summary, .md-typeset details.summary>.admonition-title, .md-typeset details.summary>summary, .md-typeset details.tldr>.admonition-title, .md-typeset details.tldr>summary
-{
- background-color: rgba(0,176,255,.06);
-}
-.md-typeset .admonition.abstract, .md-typeset .admonition.summary, .md-typeset .admonition.tldr, .md-typeset details.abstract, .md-typeset details.summary, .md-typeset details.tldr
-{
+.md-typeset .admonition, .md-typeset details {
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .14) !important;
+}
+
+.md-typeset .admonition.abstract>.admonition-title, .md-typeset .admonition.abstract>summary, .md-typeset .admonition.summary>.admonition-title, .md-typeset .admonition.summary>summary, .md-typeset .admonition.tldr>.admonition-title, .md-typeset .admonition.tldr>summary, .md-typeset details.abstract>.admonition-title, .md-typeset details.abstract>summary, .md-typeset details.summary>.admonition-title, .md-typeset details.summary>summary, .md-typeset details.tldr>.admonition-title, .md-typeset details.tldr>summary {
+ background-color: rgba(0, 176, 255, .06);
+}
+
+.md-typeset .admonition.abstract, .md-typeset .admonition.summary, .md-typeset .admonition.tldr, .md-typeset details.abstract, .md-typeset details.summary, .md-typeset details.tldr {
border-left: none;
-}
-\ No newline at end of file
+}
+
+[data-md-color-scheme=slate] {
+ --md-default-bg-color: hsla(var(--md-hue), 15%, 9%, 1);
+ --md-typeset-a-color: #7d8eef;
+}
+
+:root {
+ --md-primary-fg-color: #4051b5;
+ --md-accent-fg-color: #526cfe;
+}
diff --git a/docs/docs/dft.md b/docs/docs/dft.md
@@ -10,7 +10,7 @@ For power of 2 sizes, it uses Fast Fourier Transform.
### Complex input/output
-Apply the FFT to the complex input data: [See how to pass data to KFR](types.md)
+Apply the FFT to the complex input data: [See how to pass data to KFR](basics.md)
```c++
// prepare data (0, 1, 2, ..., 255)
diff --git a/docs/docs/expressions.md b/docs/docs/expressions.md
@@ -1,19 +1,47 @@
# Expressions
-Calling functions on arrays of data is performed lazily using C++ template expressions.
+In KFR, all data is represented through _Expression_ concept.
+Expression is a virtual multidimensional array consisting of elements that can be read (Input expression) or written to (Output expression).
+Expression can have specific size or have infinite size in any dimension. Its size may be known at compile time or at runtime only.
+
+The number of dimensions must be known at compile time.
+
+Normally, expressions do not own any data and can be seen as _data generators_ with any algorithm under the hood. But classes owning data (`tensor` and `univector`) provide expression interface as well. Since KFR5 you can make expression from any user defined or `std` type.
+
+Expressions can refer to other expressions as its arguments.
+prvalue expressions are captured by value and moved to expression storage.
+lvalue expressions are captured by reference.
+The latter may cause dangling references if the resulting expression is used outside of its arguments scope. As always, `std::move` forces variable to be captured by value.
+
+The following function creates Expression that represents a virtual 3-dimensional array with elements starting from 0 at $(0,0,0)$ index
+and incremented by $1$, $10$ and $100$ along each axis.
+```
+counter(0, 1, 10, 100)
+```
+
+To get a single element from Expression, call `get_element` function. It takes the expression itself and the index.
+```
+get_element(counter(0, 1, 10, 100), {1, 2, 3}) == 321
+```
+
+Calling functions or operators on expressions or arrays of data is performed lazily in KFR.
This allows better optimization and does not require saving temporary data.
-For example, subtracting one univector from another gives expression type, not univector:
+Internally a C++ technique called [Expression templates](https://en.wikipedia.org/wiki/Expression_templates) is used but expressions processing is explicitly vectorized in KFR. You can control some aspects of vectorization.
+
+## Functions and operators
+
+For example, subtracting one univector from another produces expression, not univector:
```c++
univector<int, 5> x{1, 2, 3, 4, 5};
univector<int, 5> y{0, 0, 1, 10, -5};
-auto z = x - y; // z is of type expression, not univector.
+auto z = x - y; // z is of type expression_function<...>, not univector.
// This only constructs an expression and does not perform any calculation
```
-But you can always convert expression back to univector to get actual data:
+You should assign expression to a univector (or tensor) to get the data:
```c++
univector<int, 5> x{1, 2, 3, 4, 5};
@@ -23,20 +51,148 @@ univector<int, 5> z = x - y;
```
!!! note
- when an expression is assigned to a `univector` variable, expression is evaluated
- and values are being written to the variable.
+ when an expression is assigned to a `univector` variable, expression is evaluated in `process` function and values are being written to the target storage.
-Same applies to calling KFR functions on univectors, this doesn't calculate value immediately. Instead, new expression will be created.
+Same applies to calling KFR functions on univectors, this doesn't calculate values immediately. Instead, new expression will be created.
```c++
univector<float, 5> x{1, 2, 3, 4, 5};
sqrt(x); // only constructs an expression
-univector<float, 5> values = sqrt(x); // constructs an expression and writes data to univector
+univector<float, 5> values = sqrt(x); // constructs an expression and writes data to univector
+```
+
+Element type of an input expressions can be determined by using `expression_value_type<Expr>` (In KFR4 it was `value_type_of<Expr>`). Since KFR5 all expressions have their type specified.
+
+### Writing custom expressions
+
+To turn a user-defined class into expression, you should define
+`kfr::expression_traits<Class>` and provide typedefs and function to work with it.
+
+Input expressions must implement `get_elements` function to retrieve elements at given index.
+
+Output expressions must implement `set_elements` function to set its elements.
+
+Example of input expression:
+
+```c++
+#include <kfr/all.hpp>
+
+namespace kfr
+{
+
+template <typename T, index_t Size>
+struct identity_matrix
+{
+};
+
+template <typename T, index_t Size>
+struct expression_traits<identity_matrix<T, Size>> : expression_traits_defaults
+{
+ // element type for expression
+ using value_type = T;
+
+ // number of dimensions, must be known at compile time
+ constexpr static size_t dims = 2;
+
+ // function to retrieve shape (size) of matrix, runtime version
+ constexpr static shape<2> get_shape(const identity_matrix<T, Size>& self) { return { Size, Size }; }
+
+ // function to retrieve shape (size) of matrix, compile time version
+ // if the size is unknown at compile time the function must be still defined
+ // but return undefined_size for every axis with unknown size
+ constexpr static shape<2> get_shape() { return { Size, Size }; }
+};
+
+template <typename T, index_t Size, index_t Axis, size_t N>
+vec<T, N> get_elements(const identity_matrix<T, Size>& self, const shape<2>& index,
+ const axis_params<Axis, N>& sh)
+{
+ // identity matrix expression returns 1 if col==row, 0 otherwise
+ // indices<A> returns indices for given axis taking vectorization into account
+ // select is a SIMD-enabled ternary operator function
+ return select(indices<0>(index, sh) == indices<1>(index, sh), 1, 0);
+}
+
+}
+
+int main()
+{
+ using namespace kfr;
+ // Create identity_matrix expression with 9 cols/rows,
+ // Render it to tensor class (trender)
+ // Convert to string with maximum 16 columns of values
+ // And 0 dimensions collapsed (to_string).
+ println(trender(identity_matrix<float, 9>{}).to_string(16, 0));
+}
```
-Input expressions can be read from and output expressions can be written to. Class can be an input and output expression at same time. `univector` is an example of such class.
+**Output**:
+
+```c++
+{{1, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 1, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 1, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 1, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 1, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 1, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 1}}
+```
+
+Expression may be defined in a compact form using only a single class:
+
+```c++
+template <typename T, index_t Size>
+struct identity_matrix : expression_traits_defaults
+{
+ using value_type = T;
+
+ constexpr static size_t dims = 2;
+ constexpr static shape<2> get_shape(const identity_matrix& self) { return { Size, Size }; }
+ constexpr static shape<2> get_shape() { return { Size, Size }; }
+
+ template <index_t Axis, size_t N>
+ friend vec<T, N> get_elements(const identity_matrix& self, const shape<2>& index,
+ const axis_params<Axis, N>& sh)
+ {
+ return select(indices<0>(index, sh) == indices<1>(index, sh), 1, 0);
+ }
+};
+
+```
+
+The same class with the size defined at runtime.
+
+```c++
+template <typename T>
+struct identity_matrix : expression_traits_defaults
+{
+ using value_type = T;
+
+ constexpr static size_t dims = 2;
+ constexpr static shape<2> get_shape(const identity_matrix& self) { return { self.size, self.size }; }
+ // undefined_size means size is not known at compile time
+ constexpr static shape<2> get_shape() { return { undefined_size, undefined_size }; }
+
+ template <index_t Axis, size_t N>
+ friend vec<T, N> get_elements(const identity_matrix& self, const shape<2>& index,
+ const axis_params<Axis, N>& sh)
+ {
+ return select(indices<0>(index, sh) == indices<1>(index, sh), 1, 0);
+ }
+
+ index_t size;
+};
+
+```
+
+### Reducing functions
+
+Reducing functions accept 1D [Expression](expressions.md) and produce scalar.
-Data type of an input expressions can be determined by using `value_type_of<Expression>`. However, not all expressions have their types specified.
-In such cases `value_type_of` will return special type `generic`.
+Some of the reducing functions are:
+`sum`, `rms`, `mean`, `dotproduct`, `product`, `sumsqr`.
-Size (length) of an expression also can be specified or not. `counter` is an example of generic (untyped) expression without the size.
-\ No newline at end of file
+Some of reducing functions have the same names as corresponding regular functions but with `of` suffix to distinguish them:
+`minof`, `maxof`, `absmaxof`, `absminof`
diff --git a/docs/docs/file_support.md b/docs/docs/file_support.md
@@ -4,7 +4,8 @@
* wav: 16-,24-,32-bit signed, 32-,64-bit IEEE
* wav W64: 16-,24-,32-bit signed, 32-,64-bit IEEE
-* flac
+* FLAC
+* MP3
## Writing
diff --git a/docs/docs/fir.md b/docs/docs/fir.md
@@ -4,7 +4,7 @@
```c++ linenums="1"
// Initialize window function
-expression_pointer<fbase> kaiser = to_pointer(window_kaiser(taps.size(), 3.0));
+expression_handle<fbase> kaiser = to_handle(window_kaiser(taps.size(), 3.0));
// Initialize taps
univector<float, 7> taps;
@@ -85,4 +85,4 @@ filter.apply(output, input);
See also [Filter class definition](auto/filter.md)
-[See also a gallery with results of applying various FIR filters](fir_gallery.md)
-\ No newline at end of file
+[See also a gallery with results of applying various FIR filters](fir_gallery.md)
diff --git a/docs/docs/fir_gallery.md b/docs/docs/fir_gallery.md
@@ -5,7 +5,7 @@
Code
```c++ linenums="1"
univector<fbase, 127> taps127;
-expression_pointer<fbase> kaiser = to_pointer(window_kaiser(taps127.size(), 3.0));
+expression_handle<fbase> kaiser = to_handle(window_kaiser(taps127.size(), 3.0));
// Fill taps127 with the band pass FIR filter coefficients using kaiser window and cutoff=0.2 and 0.4
fir_bandpass(taps127, 0.2, 0.4, kaiser, true);
@@ -22,7 +22,7 @@ Result
Code
```c++ linenums="1"
univector<fbase, 127> taps127;
-expression_pointer<fbase> kaiser = to_pointer(window_kaiser(taps127.size(), 3.0));
+expression_handle<fbase> kaiser = to_handle(window_kaiser(taps127.size(), 3.0));
// Fill taps127 with the band stop FIR filter coefficients using kaiser window and cutoff=0.2 and 0.4
fir_bandstop(taps127, 0.2, 0.4, kaiser, true);
@@ -39,7 +39,7 @@ Result
Code
```c++ linenums="1"
univector<fbase, 127> taps127;
-expression_pointer<fbase> kaiser = to_pointer(window_kaiser(taps127.size(), 3.0));
+expression_handle<fbase> kaiser = to_handle(window_kaiser(taps127.size(), 3.0));
// Fill taps127 with the high pass FIR filter coefficients using kaiser window and cutoff=0.2
fir_highpass(taps127, 0.2, kaiser, true);
@@ -56,7 +56,7 @@ Result
Code
```c++ linenums="1"
univector<fbase, 8191> taps8191;
-expression_pointer<fbase> blackman_harris = to_pointer(window_blackman_harris(taps8191.size()));
+expression_handle<fbase> blackman_harris = to_handle(window_blackman_harris(taps8191.size()));
// Fill taps8191 with the low pass FIR filter coefficients using blackman harris window and cutoff=0.15
fir_lowpass(taps8191, 0.15, blackman_harris, true);
@@ -77,7 +77,7 @@ Result
Code
```c++ linenums="1"
univector<fbase, 15> taps15;
-expression_pointer<fbase> hann = to_pointer(window_hann(taps15.size()));
+expression_handle<fbase> hann = to_handle(window_hann(taps15.size()));
// Fill taps15 with the low pass FIR filter coefficients using hann window and cutoff=0.15
fir_lowpass(taps15, 0.15, hann, true);
@@ -95,7 +95,7 @@ Code
```c++ linenums="1"
univector<fbase, 127> taps127;
-expression_pointer<fbase> kaiser = to_pointer(window_kaiser(taps127.size(), 3.0));
+expression_handle<fbase> kaiser = to_handle(window_kaiser(taps127.size(), 3.0));
// Fill taps127 with the low pass FIR filter coefficients using kaiser window and cutoff=0.2
fir_lowpass(taps127, 0.2, kaiser, true);
@@ -110,7 +110,7 @@ Result
```c++ linenums="1"
univector<fbase, 127> taps127;
-expression_pointer<fbase> kaiser = to_pointer(window_kaiser(taps127.size(), 3.0));
+expression_handle<fbase> kaiser = to_handle(window_kaiser(taps127.size(), 3.0));
fir_bandstop(taps127, 0.2, 0.4, kaiser, true);
// Initialize FIR filter with float input/output and fbase taps
filter_fir<fbase, float> fir_filter(taps127);
@@ -130,7 +130,7 @@ Result
```c++ linenums="1"
univector<fbase, 127> taps127;
-expression_pointer<fbase> kaiser = to_pointer(window_kaiser(taps127.size(), 3.0));
+expression_handle<fbase> kaiser = to_handle(window_kaiser(taps127.size(), 3.0));
fir_bandpass(taps127, 0.2, 0.4, kaiser, true);
// Initialize FIR filter with float input/output and fbase taps
filter_fir<fbase, float> fir_filter(taps127);
@@ -144,4 +144,4 @@ plot_save("filtered_noise2", filtered_noise2, "title='Filtered noise 2', div_by_
```
Result
-
-\ No newline at end of file
+
diff --git a/docs/docs/iir_gallery.md b/docs/docs/iir_gallery.md
@@ -0,0 +1,213 @@
+# IIR filters code & examples
+
+## Table of Contents
+
+* [24th-order Bessel filter, lowpass 1khz](#24th-order-bessel-filter-lowpass-1khz)
+* [12th-order Bessel filter, lowpass 1khz](#12th-order-bessel-filter-lowpass-1khz)
+* [6th-order Bessel filter, lowpass 1khz](#6th-order-bessel-filter-lowpass-1khz)
+* [24th-order Butterworth filter, lowpass 1khz](#24th-order-butterworth-filter-lowpass-1khz)
+* [12th-order Butterworth filter, lowpass 1khz](#12th-order-butterworth-filter-lowpass-1khz)
+* [12th-order Butterworth filter, highpass 1khz](#12th-order-butterworth-filter-highpass-1khz)
+* [12th-order Butterworth filter, bandpass](#12th-order-butterworth-filter-bandpass)
+* [12th-order Butterworth filter, bandstop](#12th-order-butterworth-filter-bandstop)
+* [4th-order Bessel filter, bandpass](#4th-order-bessel-filter-bandpass)
+* [8th-order Chebyshev type I filter, lowpass](#8th-order-chebyshev-type-i-filter-lowpass)
+* [8th-order Chebyshev type II filter, lowpass](#8th-order-chebyshev-type-ii-filter-lowpass)
+
+## 24th-order Bessel filter, lowpass 1khz
+
+Code
+```c++ linenums="1"
+const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 10), padwidth=8192";
+constexpr size_t maxorder = 32;
+univector<fbase, 1024> output;
+
+zpk<fbase> filt = iir_lowpass(bessel<fbase>(24), 1000, 48000);
+std::vector<biquad_params<fbase>> bqs = to_sos(filt);
+output = biquad<maxorder>(bqs, unitimpulse());
+plot_save("bessel_lowpass24", output, options + ", title='24th-order Bessel filter, lowpass 1khz'");
+
+```
+Result
+
+
+
+
+## 12th-order Bessel filter, lowpass 1khz
+
+Code
+```c++ linenums="1"
+const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 10), padwidth=8192";
+constexpr size_t maxorder = 32;
+univector<fbase, 1024> output;
+
+zpk<fbase> filt = iir_lowpass(bessel<fbase>(12), 1000, 48000);
+std::vector<biquad_params<fbase>> bqs = to_sos(filt);
+output = biquad<maxorder>(bqs, unitimpulse());
+plot_save("bessel_lowpass12", output, options + ", title='12th-order Bessel filter, lowpass 1khz'");
+
+```
+Result
+
+
+
+## 6th-order Bessel filter, lowpass 1khz
+
+Code
+```c++ linenums="1"
+const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 10), padwidth=8192";
+constexpr size_t maxorder = 32;
+univector<fbase, 1024> output;
+
+zpk<fbase> filt = iir_lowpass(bessel<fbase>(6), 1000, 48000);
+std::vector<biquad_params<fbase>> bqs = to_sos(filt);
+output = biquad<maxorder>(bqs, unitimpulse());
+plot_save("bessel_lowpass6", output, options + ", title='6th-order Bessel filter, lowpass 1khz'");
+```
+Result
+
+
+
+## 24th-order Butterworth filter, lowpass 1khz
+
+Code
+```c++ linenums="1"
+const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 10), padwidth=8192";
+constexpr size_t maxorder = 32;
+univector<fbase, 1024> output;
+
+zpk<fbase> filt = iir_lowpass(butterworth<fbase>(24), 1000, 48000);
+std::vector<biquad_params<fbase>> bqs = to_sos(filt);
+output = biquad<maxorder>(bqs, unitimpulse());
+plot_save("butterworth_lowpass24", output,
+ options + ", title='24th-order Butterworth filter, lowpass 1khz'");
+```
+Result
+
+
+
+
+## 12th-order Butterworth filter, lowpass 1khz
+
+Code
+```c++ linenums="1"
+const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 10), padwidth=8192";
+constexpr size_t maxorder = 32;
+univector<fbase, 1024> output;
+
+zpk<fbase> filt = iir_lowpass(butterworth<fbase>(12), 1000, 48000);
+std::vector<biquad_params<fbase>> bqs = to_sos(filt);
+output = biquad<maxorder>(bqs, unitimpulse());
+plot_save("butterworth_lowpass12", output,
+ options + ", title='12th-order Butterworth filter, lowpass 1khz'");
+```
+Result
+
+
+
+## 12th-order Butterworth filter, highpass 1khz
+
+Code
+```c++ linenums="1"
+const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 10), padwidth=8192";
+constexpr size_t maxorder = 32;
+univector<fbase, 1024> output;
+
+zpk<fbase> filt = iir_highpass(butterworth<fbase>(12), 1000, 48000);
+std::vector<biquad_params<fbase>> bqs = to_sos(filt);
+output = biquad<maxorder>(bqs, unitimpulse());
+plot_save("butterworth_highpass12", output,
+ options + ", title='12th-order Butterworth filter, highpass 1khz'");
+```
+Result
+
+
+
+## 12th-order Butterworth filter, bandpass
+
+Code
+```c++ linenums="1"
+const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 10), padwidth=8192";
+constexpr size_t maxorder = 32;
+univector<fbase, 1024> output;
+
+zpk<fbase> filt = iir_bandpass(butterworth<fbase>(12), 0.1, 0.2);
+std::vector<biquad_params<fbase>> bqs = to_sos(filt);
+output = biquad<maxorder>(bqs, unitimpulse());
+plot_save("butterworth_bandpass12", output,
+ options + ", title='12th-order Butterworth filter, bandpass'");
+```
+Result
+
+
+
+## 12th-order Butterworth filter, bandstop
+
+Code
+```c++ linenums="1"
+const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 10), padwidth=8192";
+constexpr size_t maxorder = 32;
+univector<fbase, 1024> output;
+
+zpk<fbase> filt = iir_bandstop(butterworth<fbase>(12), 0.1, 0.2);
+std::vector<biquad_params<fbase>> bqs = to_sos(filt);
+output = biquad<maxorder>(bqs, unitimpulse());
+plot_save("butterworth_bandstop12", output,
+ options + ", title='12th-order Butterworth filter, bandstop'");
+```
+Result
+
+
+
+## 4th-order Butterworth filter, bandpass
+
+Code
+```c++ linenums="1"
+const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 10), padwidth=8192";
+constexpr size_t maxorder = 32;
+univector<fbase, 1024> output;
+
+zpk<fbase> filt = iir_bandpass(butterworth<fbase>(4), 0.005, 0.9);
+std::vector<biquad_params<fbase>> bqs = to_sos(filt);
+output = biquad<maxorder>(bqs, unitimpulse());
+plot_save("butterworth_bandpass4", output, options + ", title='4th-order Butterworth filter, bandpass'");
+```
+Result
+
+
+
+## 8th-order Chebyshev type I filter, lowpass
+
+Code
+```c++ linenums="1"
+const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 10), padwidth=8192";
+constexpr size_t maxorder = 32;
+univector<fbase, 1024> output;
+
+zpk<fbase> filt = iir_lowpass(chebyshev1<fbase>(8, 2), 0.09);
+std::vector<biquad_params<fbase>> bqs = to_sos(filt);
+output = biquad<maxorder>(bqs, unitimpulse());
+plot_save("chebyshev1_lowpass8", output,
+ options + ", title='8th-order Chebyshev type I filter, lowpass'");
+```
+Result
+
+
+
+## 8th-order Chebyshev type II filter, lowpass
+
+Code
+```c++ linenums="1"
+const std::string options = "phaseresp=True, log_freq=True, freq_dB_lim=(-160, 10), padwidth=8192";
+constexpr size_t maxorder = 32;
+univector<fbase, 1024> output;
+
+zpk<fbase> filt = iir_lowpass(chebyshev2<fbase>(8, 80), 0.09);
+std::vector<biquad_params<fbase>> bqs = to_sos(filt);
+output = biquad<maxorder>(bqs, unitimpulse());
+plot_save("chebyshev2_lowpass8", output,
+ options + ", title='8th-order Chebyshev type II filter, lowpass'");
+```
+Result
+
+
diff --git a/docs/docs/img/bessel_lowpass12.svg b/docs/docs/img/bessel_lowpass12.svg
@@ -0,0 +1,4065 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Created with matplotlib (https://matplotlib.org/) -->
+<svg height="1080pt" version="1.1" viewBox="0 0 720 1080" width="720pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+ </style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 1080
+L 720 1080
+L 720 0
+L 0 0
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="axes_1">
+ <g id="patch_2">
+ <path d="M 60.635 368.44
+L 693.54 368.44
+L 693.54 75.6
+L 60.635 75.6
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_1">
+ <g id="xtick_1">
+ <g id="line2d_1">
+ <path clip-path="url(#pdd429ff062)" d="M 60.635 368.44
+L 60.635 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_2">
+ <defs>
+ <path d="M 0 0
+L 0 3.5
+" id="mdcbbfdbe69" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#mdcbbfdbe69" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- 0 -->
+ <defs>
+ <path d="M 31.78125 66.40625
+Q 24.171875 66.40625 20.328125 58.90625
+Q 16.5 51.421875 16.5 36.375
+Q 16.5 21.390625 20.328125 13.890625
+Q 24.171875 6.390625 31.78125 6.390625
+Q 39.453125 6.390625 43.28125 13.890625
+Q 47.125 21.390625 47.125 36.375
+Q 47.125 51.421875 43.28125 58.90625
+Q 39.453125 66.40625 31.78125 66.40625
+z
+M 31.78125 74.21875
+Q 44.046875 74.21875 50.515625 64.515625
+Q 56.984375 54.828125 56.984375 36.375
+Q 56.984375 17.96875 50.515625 8.265625
+Q 44.046875 -1.421875 31.78125 -1.421875
+Q 19.53125 -1.421875 13.0625 8.265625
+Q 6.59375 17.96875 6.59375 36.375
+Q 6.59375 54.828125 13.0625 64.515625
+Q 19.53125 74.21875 31.78125 74.21875
+z
+" id="DejaVuSans-48"/>
+ </defs>
+ <g transform="translate(57.45375 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_2">
+ <g id="line2d_3">
+ <path clip-path="url(#pdd429ff062)" d="M 184.370093 368.44
+L 184.370093 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_4">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="184.370093" xlink:href="#mdcbbfdbe69" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- 200 -->
+ <defs>
+ <path d="M 19.1875 8.296875
+L 53.609375 8.296875
+L 53.609375 0
+L 7.328125 0
+L 7.328125 8.296875
+Q 12.9375 14.109375 22.625 23.890625
+Q 32.328125 33.6875 34.8125 36.53125
+Q 39.546875 41.84375 41.421875 45.53125
+Q 43.3125 49.21875 43.3125 52.78125
+Q 43.3125 58.59375 39.234375 62.25
+Q 35.15625 65.921875 28.609375 65.921875
+Q 23.96875 65.921875 18.8125 64.3125
+Q 13.671875 62.703125 7.8125 59.421875
+L 7.8125 69.390625
+Q 13.765625 71.78125 18.9375 73
+Q 24.125 74.21875 28.421875 74.21875
+Q 39.75 74.21875 46.484375 68.546875
+Q 53.21875 62.890625 53.21875 53.421875
+Q 53.21875 48.921875 51.53125 44.890625
+Q 49.859375 40.875 45.40625 35.40625
+Q 44.1875 33.984375 37.640625 27.21875
+Q 31.109375 20.453125 19.1875 8.296875
+z
+" id="DejaVuSans-50"/>
+ </defs>
+ <g transform="translate(174.826343 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_3">
+ <g id="line2d_5">
+ <path clip-path="url(#pdd429ff062)" d="M 308.105186 368.44
+L 308.105186 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_6">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="308.105186" xlink:href="#mdcbbfdbe69" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- 400 -->
+ <defs>
+ <path d="M 37.796875 64.3125
+L 12.890625 25.390625
+L 37.796875 25.390625
+z
+M 35.203125 72.90625
+L 47.609375 72.90625
+L 47.609375 25.390625
+L 58.015625 25.390625
+L 58.015625 17.1875
+L 47.609375 17.1875
+L 47.609375 0
+L 37.796875 0
+L 37.796875 17.1875
+L 4.890625 17.1875
+L 4.890625 26.703125
+z
+" id="DejaVuSans-52"/>
+ </defs>
+ <g transform="translate(298.561436 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-52"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_4">
+ <g id="line2d_7">
+ <path clip-path="url(#pdd429ff062)" d="M 431.840279 368.44
+L 431.840279 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_8">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="431.840279" xlink:href="#mdcbbfdbe69" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- 600 -->
+ <defs>
+ <path d="M 33.015625 40.375
+Q 26.375 40.375 22.484375 35.828125
+Q 18.609375 31.296875 18.609375 23.390625
+Q 18.609375 15.53125 22.484375 10.953125
+Q 26.375 6.390625 33.015625 6.390625
+Q 39.65625 6.390625 43.53125 10.953125
+Q 47.40625 15.53125 47.40625 23.390625
+Q 47.40625 31.296875 43.53125 35.828125
+Q 39.65625 40.375 33.015625 40.375
+z
+M 52.59375 71.296875
+L 52.59375 62.3125
+Q 48.875 64.0625 45.09375 64.984375
+Q 41.3125 65.921875 37.59375 65.921875
+Q 27.828125 65.921875 22.671875 59.328125
+Q 17.53125 52.734375 16.796875 39.40625
+Q 19.671875 43.65625 24.015625 45.921875
+Q 28.375 48.1875 33.59375 48.1875
+Q 44.578125 48.1875 50.953125 41.515625
+Q 57.328125 34.859375 57.328125 23.390625
+Q 57.328125 12.15625 50.6875 5.359375
+Q 44.046875 -1.421875 33.015625 -1.421875
+Q 20.359375 -1.421875 13.671875 8.265625
+Q 6.984375 17.96875 6.984375 36.375
+Q 6.984375 53.65625 15.1875 63.9375
+Q 23.390625 74.21875 37.203125 74.21875
+Q 40.921875 74.21875 44.703125 73.484375
+Q 48.484375 72.75 52.59375 71.296875
+z
+" id="DejaVuSans-54"/>
+ </defs>
+ <g transform="translate(422.296529 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-54"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_5">
+ <g id="line2d_9">
+ <path clip-path="url(#pdd429ff062)" d="M 555.575371 368.44
+L 555.575371 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_10">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="555.575371" xlink:href="#mdcbbfdbe69" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- 800 -->
+ <defs>
+ <path d="M 31.78125 34.625
+Q 24.75 34.625 20.71875 30.859375
+Q 16.703125 27.09375 16.703125 20.515625
+Q 16.703125 13.921875 20.71875 10.15625
+Q 24.75 6.390625 31.78125 6.390625
+Q 38.8125 6.390625 42.859375 10.171875
+Q 46.921875 13.96875 46.921875 20.515625
+Q 46.921875 27.09375 42.890625 30.859375
+Q 38.875 34.625 31.78125 34.625
+z
+M 21.921875 38.8125
+Q 15.578125 40.375 12.03125 44.71875
+Q 8.5 49.078125 8.5 55.328125
+Q 8.5 64.0625 14.71875 69.140625
+Q 20.953125 74.21875 31.78125 74.21875
+Q 42.671875 74.21875 48.875 69.140625
+Q 55.078125 64.0625 55.078125 55.328125
+Q 55.078125 49.078125 51.53125 44.71875
+Q 48 40.375 41.703125 38.8125
+Q 48.828125 37.15625 52.796875 32.3125
+Q 56.78125 27.484375 56.78125 20.515625
+Q 56.78125 9.90625 50.3125 4.234375
+Q 43.84375 -1.421875 31.78125 -1.421875
+Q 19.734375 -1.421875 13.25 4.234375
+Q 6.78125 9.90625 6.78125 20.515625
+Q 6.78125 27.484375 10.78125 32.3125
+Q 14.796875 37.15625 21.921875 38.8125
+z
+M 18.3125 54.390625
+Q 18.3125 48.734375 21.84375 45.5625
+Q 25.390625 42.390625 31.78125 42.390625
+Q 38.140625 42.390625 41.71875 45.5625
+Q 45.3125 48.734375 45.3125 54.390625
+Q 45.3125 60.0625 41.71875 63.234375
+Q 38.140625 66.40625 31.78125 66.40625
+Q 25.390625 66.40625 21.84375 63.234375
+Q 18.3125 60.0625 18.3125 54.390625
+z
+" id="DejaVuSans-56"/>
+ </defs>
+ <g transform="translate(546.031621 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-56"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_6">
+ <g id="line2d_11">
+ <path clip-path="url(#pdd429ff062)" d="M 679.310464 368.44
+L 679.310464 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_12">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="679.310464" xlink:href="#mdcbbfdbe69" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- 1000 -->
+ <defs>
+ <path d="M 12.40625 8.296875
+L 28.515625 8.296875
+L 28.515625 63.921875
+L 10.984375 60.40625
+L 10.984375 69.390625
+L 28.421875 72.90625
+L 38.28125 72.90625
+L 38.28125 8.296875
+L 54.390625 8.296875
+L 54.390625 0
+L 12.40625 0
+z
+" id="DejaVuSans-49"/>
+ </defs>
+ <g transform="translate(666.585464 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_7">
+ <!-- Samples -->
+ <defs>
+ <path d="M 53.515625 70.515625
+L 53.515625 60.890625
+Q 47.90625 63.578125 42.921875 64.890625
+Q 37.9375 66.21875 33.296875 66.21875
+Q 25.25 66.21875 20.875 63.09375
+Q 16.5 59.96875 16.5 54.203125
+Q 16.5 49.359375 19.40625 46.890625
+Q 22.3125 44.4375 30.421875 42.921875
+L 36.375 41.703125
+Q 47.40625 39.59375 52.65625 34.296875
+Q 57.90625 29 57.90625 20.125
+Q 57.90625 9.515625 50.796875 4.046875
+Q 43.703125 -1.421875 29.984375 -1.421875
+Q 24.8125 -1.421875 18.96875 -0.25
+Q 13.140625 0.921875 6.890625 3.21875
+L 6.890625 13.375
+Q 12.890625 10.015625 18.65625 8.296875
+Q 24.421875 6.59375 29.984375 6.59375
+Q 38.421875 6.59375 43.015625 9.90625
+Q 47.609375 13.234375 47.609375 19.390625
+Q 47.609375 24.75 44.3125 27.78125
+Q 41.015625 30.8125 33.5 32.328125
+L 27.484375 33.5
+Q 16.453125 35.6875 11.515625 40.375
+Q 6.59375 45.0625 6.59375 53.421875
+Q 6.59375 63.09375 13.40625 68.65625
+Q 20.21875 74.21875 32.171875 74.21875
+Q 37.3125 74.21875 42.625 73.28125
+Q 47.953125 72.359375 53.515625 70.515625
+z
+" id="DejaVuSans-83"/>
+ <path d="M 34.28125 27.484375
+Q 23.390625 27.484375 19.1875 25
+Q 14.984375 22.515625 14.984375 16.5
+Q 14.984375 11.71875 18.140625 8.90625
+Q 21.296875 6.109375 26.703125 6.109375
+Q 34.1875 6.109375 38.703125 11.40625
+Q 43.21875 16.703125 43.21875 25.484375
+L 43.21875 27.484375
+z
+M 52.203125 31.203125
+L 52.203125 0
+L 43.21875 0
+L 43.21875 8.296875
+Q 40.140625 3.328125 35.546875 0.953125
+Q 30.953125 -1.421875 24.3125 -1.421875
+Q 15.921875 -1.421875 10.953125 3.296875
+Q 6 8.015625 6 15.921875
+Q 6 25.140625 12.171875 29.828125
+Q 18.359375 34.515625 30.609375 34.515625
+L 43.21875 34.515625
+L 43.21875 35.40625
+Q 43.21875 41.609375 39.140625 45
+Q 35.0625 48.390625 27.6875 48.390625
+Q 23 48.390625 18.546875 47.265625
+Q 14.109375 46.140625 10.015625 43.890625
+L 10.015625 52.203125
+Q 14.9375 54.109375 19.578125 55.046875
+Q 24.21875 56 28.609375 56
+Q 40.484375 56 46.34375 49.84375
+Q 52.203125 43.703125 52.203125 31.203125
+z
+" id="DejaVuSans-97"/>
+ <path d="M 52 44.1875
+Q 55.375 50.25 60.0625 53.125
+Q 64.75 56 71.09375 56
+Q 79.640625 56 84.28125 50.015625
+Q 88.921875 44.046875 88.921875 33.015625
+L 88.921875 0
+L 79.890625 0
+L 79.890625 32.71875
+Q 79.890625 40.578125 77.09375 44.375
+Q 74.3125 48.1875 68.609375 48.1875
+Q 61.625 48.1875 57.5625 43.546875
+Q 53.515625 38.921875 53.515625 30.90625
+L 53.515625 0
+L 44.484375 0
+L 44.484375 32.71875
+Q 44.484375 40.625 41.703125 44.40625
+Q 38.921875 48.1875 33.109375 48.1875
+Q 26.21875 48.1875 22.15625 43.53125
+Q 18.109375 38.875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.1875 51.21875 25.484375 53.609375
+Q 29.78125 56 35.6875 56
+Q 41.65625 56 45.828125 52.96875
+Q 50 49.953125 52 44.1875
+z
+" id="DejaVuSans-109"/>
+ <path d="M 18.109375 8.203125
+L 18.109375 -20.796875
+L 9.078125 -20.796875
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+z
+M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+" id="DejaVuSans-112"/>
+ <path d="M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 0
+L 9.421875 0
+z
+" id="DejaVuSans-108"/>
+ <path d="M 56.203125 29.59375
+L 56.203125 25.203125
+L 14.890625 25.203125
+Q 15.484375 15.921875 20.484375 11.0625
+Q 25.484375 6.203125 34.421875 6.203125
+Q 39.59375 6.203125 44.453125 7.46875
+Q 49.3125 8.734375 54.109375 11.28125
+L 54.109375 2.78125
+Q 49.265625 0.734375 44.1875 -0.34375
+Q 39.109375 -1.421875 33.890625 -1.421875
+Q 20.796875 -1.421875 13.15625 6.1875
+Q 5.515625 13.8125 5.515625 26.8125
+Q 5.515625 40.234375 12.765625 48.109375
+Q 20.015625 56 32.328125 56
+Q 43.359375 56 49.78125 48.890625
+Q 56.203125 41.796875 56.203125 29.59375
+z
+M 47.21875 32.234375
+Q 47.125 39.59375 43.09375 43.984375
+Q 39.0625 48.390625 32.421875 48.390625
+Q 24.90625 48.390625 20.390625 44.140625
+Q 15.875 39.890625 15.1875 32.171875
+z
+" id="DejaVuSans-101"/>
+ <path d="M 44.28125 53.078125
+L 44.28125 44.578125
+Q 40.484375 46.53125 36.375 47.5
+Q 32.28125 48.484375 27.875 48.484375
+Q 21.1875 48.484375 17.84375 46.4375
+Q 14.5 44.390625 14.5 40.28125
+Q 14.5 37.15625 16.890625 35.375
+Q 19.28125 33.59375 26.515625 31.984375
+L 29.59375 31.296875
+Q 39.15625 29.25 43.1875 25.515625
+Q 47.21875 21.78125 47.21875 15.09375
+Q 47.21875 7.46875 41.1875 3.015625
+Q 35.15625 -1.421875 24.609375 -1.421875
+Q 20.21875 -1.421875 15.453125 -0.5625
+Q 10.6875 0.296875 5.421875 2
+L 5.421875 11.28125
+Q 10.40625 8.6875 15.234375 7.390625
+Q 20.0625 6.109375 24.8125 6.109375
+Q 31.15625 6.109375 34.5625 8.28125
+Q 37.984375 10.453125 37.984375 14.40625
+Q 37.984375 18.0625 35.515625 20.015625
+Q 33.0625 21.96875 24.703125 23.78125
+L 21.578125 24.515625
+Q 13.234375 26.265625 9.515625 29.90625
+Q 5.8125 33.546875 5.8125 39.890625
+Q 5.8125 47.609375 11.28125 51.796875
+Q 16.75 56 26.8125 56
+Q 31.78125 56 36.171875 55.265625
+Q 40.578125 54.546875 44.28125 53.078125
+z
+" id="DejaVuSans-115"/>
+ </defs>
+ <g transform="translate(355.734375 396.716563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-83"/>
+ <use x="63.476562" xlink:href="#DejaVuSans-97"/>
+ <use x="124.755859" xlink:href="#DejaVuSans-109"/>
+ <use x="222.167969" xlink:href="#DejaVuSans-112"/>
+ <use x="285.644531" xlink:href="#DejaVuSans-108"/>
+ <use x="313.427734" xlink:href="#DejaVuSans-101"/>
+ <use x="374.951172" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_2">
+ <g id="ytick_1">
+ <g id="line2d_13">
+ <path clip-path="url(#pdd429ff062)" d="M 60.635 367.360927
+L 693.54 367.360927
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_14">
+ <defs>
+ <path d="M 0 0
+L -3.5 0
+" id="m3e2238fd04" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="367.360927"/>
+ </g>
+ </g>
+ <g id="text_8">
+ <!-- 0.000 -->
+ <defs>
+ <path d="M 10.6875 12.40625
+L 21 12.40625
+L 21 0
+L 10.6875 0
+z
+" id="DejaVuSans-46"/>
+ </defs>
+ <g transform="translate(25.006875 371.160146)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-48"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_2">
+ <g id="line2d_15">
+ <path clip-path="url(#pdd429ff062)" d="M 60.635 314.77417
+L 693.54 314.77417
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_16">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="314.77417"/>
+ </g>
+ </g>
+ <g id="text_9">
+ <!-- 0.005 -->
+ <defs>
+ <path d="M 10.796875 72.90625
+L 49.515625 72.90625
+L 49.515625 64.59375
+L 19.828125 64.59375
+L 19.828125 46.734375
+Q 21.96875 47.46875 24.109375 47.828125
+Q 26.265625 48.1875 28.421875 48.1875
+Q 40.625 48.1875 47.75 41.5
+Q 54.890625 34.8125 54.890625 23.390625
+Q 54.890625 11.625 47.5625 5.09375
+Q 40.234375 -1.421875 26.90625 -1.421875
+Q 22.3125 -1.421875 17.546875 -0.640625
+Q 12.796875 0.140625 7.71875 1.703125
+L 7.71875 11.625
+Q 12.109375 9.234375 16.796875 8.0625
+Q 21.484375 6.890625 26.703125 6.890625
+Q 35.15625 6.890625 40.078125 11.328125
+Q 45.015625 15.765625 45.015625 23.390625
+Q 45.015625 31 40.078125 35.4375
+Q 35.15625 39.890625 26.703125 39.890625
+Q 22.75 39.890625 18.8125 39.015625
+Q 14.890625 38.140625 10.796875 36.28125
+z
+" id="DejaVuSans-53"/>
+ </defs>
+ <g transform="translate(25.006875 318.573388)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-48"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_3">
+ <g id="line2d_17">
+ <path clip-path="url(#pdd429ff062)" d="M 60.635 262.187412
+L 693.54 262.187412
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_18">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="262.187412"/>
+ </g>
+ </g>
+ <g id="text_10">
+ <!-- 0.010 -->
+ <g transform="translate(25.006875 265.986631)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-49"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_4">
+ <g id="line2d_19">
+ <path clip-path="url(#pdd429ff062)" d="M 60.635 209.600654
+L 693.54 209.600654
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_20">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="209.600654"/>
+ </g>
+ </g>
+ <g id="text_11">
+ <!-- 0.015 -->
+ <g transform="translate(25.006875 213.399873)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-49"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_5">
+ <g id="line2d_21">
+ <path clip-path="url(#pdd429ff062)" d="M 60.635 157.013896
+L 693.54 157.013896
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_22">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="157.013896"/>
+ </g>
+ </g>
+ <g id="text_12">
+ <!-- 0.020 -->
+ <g transform="translate(25.006875 160.813115)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-50"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_6">
+ <g id="line2d_23">
+ <path clip-path="url(#pdd429ff062)" d="M 60.635 104.427138
+L 693.54 104.427138
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_24">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="104.427138"/>
+ </g>
+ </g>
+ <g id="text_13">
+ <!-- 0.025 -->
+ <g transform="translate(25.006875 108.226357)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-50"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_14">
+ <!-- Amplitude -->
+ <defs>
+ <path d="M 34.1875 63.1875
+L 20.796875 26.90625
+L 47.609375 26.90625
+z
+M 28.609375 72.90625
+L 39.796875 72.90625
+L 67.578125 0
+L 57.328125 0
+L 50.6875 18.703125
+L 17.828125 18.703125
+L 11.1875 0
+L 0.78125 0
+z
+" id="DejaVuSans-65"/>
+ <path d="M 9.421875 54.6875
+L 18.40625 54.6875
+L 18.40625 0
+L 9.421875 0
+z
+M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 64.59375
+L 9.421875 64.59375
+z
+" id="DejaVuSans-105"/>
+ <path d="M 18.3125 70.21875
+L 18.3125 54.6875
+L 36.8125 54.6875
+L 36.8125 47.703125
+L 18.3125 47.703125
+L 18.3125 18.015625
+Q 18.3125 11.328125 20.140625 9.421875
+Q 21.96875 7.515625 27.59375 7.515625
+L 36.8125 7.515625
+L 36.8125 0
+L 27.59375 0
+Q 17.1875 0 13.234375 3.875
+Q 9.28125 7.765625 9.28125 18.015625
+L 9.28125 47.703125
+L 2.6875 47.703125
+L 2.6875 54.6875
+L 9.28125 54.6875
+L 9.28125 70.21875
+z
+" id="DejaVuSans-116"/>
+ <path d="M 8.5 21.578125
+L 8.5 54.6875
+L 17.484375 54.6875
+L 17.484375 21.921875
+Q 17.484375 14.15625 20.5 10.265625
+Q 23.53125 6.390625 29.59375 6.390625
+Q 36.859375 6.390625 41.078125 11.03125
+Q 45.3125 15.671875 45.3125 23.6875
+L 45.3125 54.6875
+L 54.296875 54.6875
+L 54.296875 0
+L 45.3125 0
+L 45.3125 8.40625
+Q 42.046875 3.421875 37.71875 1
+Q 33.40625 -1.421875 27.6875 -1.421875
+Q 18.265625 -1.421875 13.375 4.4375
+Q 8.5 10.296875 8.5 21.578125
+z
+M 31.109375 56
+z
+" id="DejaVuSans-117"/>
+ <path d="M 45.40625 46.390625
+L 45.40625 75.984375
+L 54.390625 75.984375
+L 54.390625 0
+L 45.40625 0
+L 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+z
+M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+" id="DejaVuSans-100"/>
+ </defs>
+ <g transform="translate(18.927187 247.642656)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-65"/>
+ <use x="68.408203" xlink:href="#DejaVuSans-109"/>
+ <use x="165.820312" xlink:href="#DejaVuSans-112"/>
+ <use x="229.296875" xlink:href="#DejaVuSans-108"/>
+ <use x="257.080078" xlink:href="#DejaVuSans-105"/>
+ <use x="284.863281" xlink:href="#DejaVuSans-116"/>
+ <use x="324.072266" xlink:href="#DejaVuSans-117"/>
+ <use x="387.451172" xlink:href="#DejaVuSans-100"/>
+ <use x="450.927734" xlink:href="#DejaVuSans-101"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_25">
+ <path clip-path="url(#pdd429ff062)" d="M 60.635 367.360927
+L 71.771158 367.274751
+L 73.627185 367.039088
+L 74.864536 366.673973
+L 76.101887 366.00695
+L 77.339238 364.869816
+L 77.957913 364.058887
+L 78.576588 363.045189
+L 79.195264 361.79451
+L 79.813939 360.270454
+L 80.432615 358.43498
+L 81.669966 353.673388
+L 82.907317 347.199759
+L 84.144668 338.729226
+L 85.382019 328.033554
+L 86.61937 314.972892
+L 87.85672 299.524245
+L 89.094071 281.803317
+L 90.950098 251.586657
+L 94.043475 195.729649
+L 96.518177 152.368522
+L 97.755528 133.297059
+L 98.992879 116.974328
+L 100.23023 104.047761
+L 100.848905 99.024364
+L 101.467581 95.029953
+L 102.086256 92.10272
+L 102.704932 90.269358
+L 103.323607 89.544762
+L 103.942283 89.931922
+L 104.560958 91.422013
+L 105.179633 93.99466
+L 105.798309 97.618383
+L 106.416984 102.251205
+L 107.654335 114.32842
+L 108.891686 129.712369
+L 110.129037 147.781357
+L 111.985064 178.395948
+L 117.553143 273.661276
+L 119.409169 300.189757
+L 120.64652 315.383504
+L 121.883871 328.4308
+L 123.121222 339.318229
+L 124.358573 348.122106
+L 125.595924 354.991437
+L 126.833275 360.129186
+L 128.070626 363.77325
+L 128.689301 365.114558
+L 129.307977 366.178374
+L 129.926652 366.99652
+L 130.545327 367.599996
+L 131.164003 368.018621
+L 131.782678 368.280741
+L 133.020029 368.44
+L 134.25738 368.266752
+L 136.113407 367.71177
+L 138.588109 366.956282
+L 140.444135 366.617513
+L 142.300161 366.5282
+L 144.156188 366.648151
+L 147.86824 367.188055
+L 150.961618 367.578154
+L 154.054995 367.719398
+L 157.767048 367.599611
+L 165.809829 367.223802
+L 171.377908 367.281232
+L 181.276716 367.414248
+L 219.015919 367.358378
+L 693.54 367.360927
+L 693.54 367.360927
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_3">
+ <path d="M 60.635 368.44
+L 60.635 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_4">
+ <path d="M 693.54 368.44
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_5">
+ <path d="M 60.635 368.44
+L 693.54 368.44
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_6">
+ <path d="M 60.635 75.6
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_2">
+ <g id="patch_7">
+ <path d="M 60.635 703.24
+L 693.54 703.24
+L 693.54 410.4
+L 60.635 410.4
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_3">
+ <g id="xtick_7">
+ <g id="line2d_26">
+ <path clip-path="url(#p4bd2d14e15)" d="M 60.635 703.24
+L 60.635 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_27">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_15">
+ <!-- 10Hz -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 19.671875 72.90625
+L 19.671875 43.015625
+L 55.515625 43.015625
+L 55.515625 72.90625
+L 65.375 72.90625
+L 65.375 0
+L 55.515625 0
+L 55.515625 34.71875
+L 19.671875 34.71875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-72"/>
+ <path d="M 5.515625 54.6875
+L 48.1875 54.6875
+L 48.1875 46.484375
+L 14.40625 7.171875
+L 48.1875 7.171875
+L 48.1875 0
+L 4.296875 0
+L 4.296875 8.203125
+L 38.09375 47.515625
+L 5.515625 47.515625
+z
+" id="DejaVuSans-122"/>
+ </defs>
+ <g transform="translate(47.888125 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_8">
+ <g id="line2d_28">
+ <path clip-path="url(#p4bd2d14e15)" d="M 60.635 703.24
+L 60.635 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_29">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_9">
+ <g id="line2d_30">
+ <path clip-path="url(#p4bd2d14e15)" d="M 116.999344 703.24
+L 116.999344 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_31">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="116.999344" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_10">
+ <g id="line2d_32">
+ <path clip-path="url(#p4bd2d14e15)" d="M 149.970372 703.24
+L 149.970372 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_33">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="149.970372" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_11">
+ <g id="line2d_34">
+ <path clip-path="url(#p4bd2d14e15)" d="M 173.363688 703.24
+L 173.363688 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_35">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="173.363688" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_12">
+ <g id="line2d_36">
+ <path clip-path="url(#p4bd2d14e15)" d="M 191.508954 703.24
+L 191.508954 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_37">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="191.508954" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_13">
+ <g id="line2d_38">
+ <path clip-path="url(#p4bd2d14e15)" d="M 206.334716 703.24
+L 206.334716 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_39">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="206.334716" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_14">
+ <g id="line2d_40">
+ <path clip-path="url(#p4bd2d14e15)" d="M 218.869719 703.24
+L 218.869719 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_41">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="218.869719" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_15">
+ <g id="line2d_42">
+ <path clip-path="url(#p4bd2d14e15)" d="M 229.728032 703.24
+L 229.728032 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_43">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="229.728032" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_16">
+ <g id="line2d_44">
+ <path clip-path="url(#p4bd2d14e15)" d="M 239.305743 703.24
+L 239.305743 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_45">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="239.305743" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_17">
+ <g id="line2d_46">
+ <path clip-path="url(#p4bd2d14e15)" d="M 247.873298 703.24
+L 247.873298 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_47">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.873298" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_16">
+ <!-- 100Hz -->
+ <g transform="translate(231.945173 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_18">
+ <g id="line2d_48">
+ <path clip-path="url(#p4bd2d14e15)" d="M 247.873298 703.24
+L 247.873298 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_49">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.873298" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_19">
+ <g id="line2d_50">
+ <path clip-path="url(#p4bd2d14e15)" d="M 304.237642 703.24
+L 304.237642 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_51">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="304.237642" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_20">
+ <g id="line2d_52">
+ <path clip-path="url(#p4bd2d14e15)" d="M 337.20867 703.24
+L 337.20867 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_53">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="337.20867" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_21">
+ <g id="line2d_54">
+ <path clip-path="url(#p4bd2d14e15)" d="M 360.601986 703.24
+L 360.601986 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_55">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="360.601986" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_22">
+ <g id="line2d_56">
+ <path clip-path="url(#p4bd2d14e15)" d="M 378.747252 703.24
+L 378.747252 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_57">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="378.747252" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_23">
+ <g id="line2d_58">
+ <path clip-path="url(#p4bd2d14e15)" d="M 393.573014 703.24
+L 393.573014 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_59">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="393.573014" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_24">
+ <g id="line2d_60">
+ <path clip-path="url(#p4bd2d14e15)" d="M 406.108017 703.24
+L 406.108017 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_61">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="406.108017" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_25">
+ <g id="line2d_62">
+ <path clip-path="url(#p4bd2d14e15)" d="M 416.96633 703.24
+L 416.96633 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_63">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="416.96633" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_26">
+ <g id="line2d_64">
+ <path clip-path="url(#p4bd2d14e15)" d="M 426.544041 703.24
+L 426.544041 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_65">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="426.544041" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_27">
+ <g id="line2d_66">
+ <path clip-path="url(#p4bd2d14e15)" d="M 435.111596 703.24
+L 435.111596 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_67">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.111596" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_17">
+ <!-- 1kHz -->
+ <defs>
+ <path d="M 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 31.109375
+L 44.921875 54.6875
+L 56.390625 54.6875
+L 27.390625 29.109375
+L 57.625 0
+L 45.90625 0
+L 18.109375 26.703125
+L 18.109375 0
+L 9.078125 0
+z
+" id="DejaVuSans-107"/>
+ </defs>
+ <g transform="translate(422.650659 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_28">
+ <g id="line2d_68">
+ <path clip-path="url(#p4bd2d14e15)" d="M 435.111596 703.24
+L 435.111596 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_69">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.111596" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_29">
+ <g id="line2d_70">
+ <path clip-path="url(#p4bd2d14e15)" d="M 491.47594 703.24
+L 491.47594 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_71">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="491.47594" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_30">
+ <g id="line2d_72">
+ <path clip-path="url(#p4bd2d14e15)" d="M 524.446968 703.24
+L 524.446968 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_73">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.446968" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_31">
+ <g id="line2d_74">
+ <path clip-path="url(#p4bd2d14e15)" d="M 547.840284 703.24
+L 547.840284 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_75">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.840284" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_32">
+ <g id="line2d_76">
+ <path clip-path="url(#p4bd2d14e15)" d="M 565.98555 703.24
+L 565.98555 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_77">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="565.98555" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_33">
+ <g id="line2d_78">
+ <path clip-path="url(#p4bd2d14e15)" d="M 580.811312 703.24
+L 580.811312 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_79">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="580.811312" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_34">
+ <g id="line2d_80">
+ <path clip-path="url(#p4bd2d14e15)" d="M 593.346315 703.24
+L 593.346315 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_81">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.346315" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_35">
+ <g id="line2d_82">
+ <path clip-path="url(#p4bd2d14e15)" d="M 604.204628 703.24
+L 604.204628 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_83">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.204628" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_36">
+ <g id="line2d_84">
+ <path clip-path="url(#p4bd2d14e15)" d="M 613.78234 703.24
+L 613.78234 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_85">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="613.78234" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_37">
+ <g id="line2d_86">
+ <path clip-path="url(#p4bd2d14e15)" d="M 622.349894 703.24
+L 622.349894 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_87">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.349894" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_18">
+ <!-- 10kHz -->
+ <g transform="translate(606.707707 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_38">
+ <g id="line2d_88">
+ <path clip-path="url(#p4bd2d14e15)" d="M 622.349894 703.24
+L 622.349894 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_89">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.349894" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_39">
+ <g id="line2d_90">
+ <path clip-path="url(#p4bd2d14e15)" d="M 678.714238 703.24
+L 678.714238 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_91">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.714238" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_40">
+ <g id="line2d_92">
+ <path clip-path="url(#p4bd2d14e15)" d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_93">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#mdcbbfdbe69" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_19">
+ <!-- 24kHz -->
+ <g transform="translate(677.897813 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_20">
+ <!-- Frequency (Hz) -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 51.703125 72.90625
+L 51.703125 64.59375
+L 19.671875 64.59375
+L 19.671875 43.109375
+L 48.578125 43.109375
+L 48.578125 34.8125
+L 19.671875 34.8125
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-70"/>
+ <path d="M 41.109375 46.296875
+Q 39.59375 47.171875 37.8125 47.578125
+Q 36.03125 48 33.890625 48
+Q 26.265625 48 22.1875 43.046875
+Q 18.109375 38.09375 18.109375 28.8125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 20.953125 51.171875 25.484375 53.578125
+Q 30.03125 56 36.53125 56
+Q 37.453125 56 38.578125 55.875
+Q 39.703125 55.765625 41.0625 55.515625
+z
+" id="DejaVuSans-114"/>
+ <path d="M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+M 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+L 45.40625 54.6875
+L 54.390625 54.6875
+L 54.390625 -20.796875
+L 45.40625 -20.796875
+z
+" id="DejaVuSans-113"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-110"/>
+ <path d="M 48.78125 52.59375
+L 48.78125 44.1875
+Q 44.96875 46.296875 41.140625 47.34375
+Q 37.3125 48.390625 33.40625 48.390625
+Q 24.65625 48.390625 19.8125 42.84375
+Q 14.984375 37.3125 14.984375 27.296875
+Q 14.984375 17.28125 19.8125 11.734375
+Q 24.65625 6.203125 33.40625 6.203125
+Q 37.3125 6.203125 41.140625 7.25
+Q 44.96875 8.296875 48.78125 10.40625
+L 48.78125 2.09375
+Q 45.015625 0.34375 40.984375 -0.53125
+Q 36.96875 -1.421875 32.421875 -1.421875
+Q 20.0625 -1.421875 12.78125 6.34375
+Q 5.515625 14.109375 5.515625 27.296875
+Q 5.515625 40.671875 12.859375 48.328125
+Q 20.21875 56 33.015625 56
+Q 37.15625 56 41.109375 55.140625
+Q 45.0625 54.296875 48.78125 52.59375
+z
+" id="DejaVuSans-99"/>
+ <path d="M 32.171875 -5.078125
+Q 28.375 -14.84375 24.75 -17.8125
+Q 21.140625 -20.796875 15.09375 -20.796875
+L 7.90625 -20.796875
+L 7.90625 -13.28125
+L 13.1875 -13.28125
+Q 16.890625 -13.28125 18.9375 -11.515625
+Q 21 -9.765625 23.484375 -3.21875
+L 25.09375 0.875
+L 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 11.921875
+L 46.6875 54.6875
+L 56.203125 54.6875
+z
+" id="DejaVuSans-121"/>
+ <path id="DejaVuSans-32"/>
+ <path d="M 31 75.875
+Q 24.46875 64.65625 21.28125 53.65625
+Q 18.109375 42.671875 18.109375 31.390625
+Q 18.109375 20.125 21.3125 9.0625
+Q 24.515625 -2 31 -13.1875
+L 23.1875 -13.1875
+Q 15.875 -1.703125 12.234375 9.375
+Q 8.59375 20.453125 8.59375 31.390625
+Q 8.59375 42.28125 12.203125 53.3125
+Q 15.828125 64.359375 23.1875 75.875
+z
+" id="DejaVuSans-40"/>
+ <path d="M 8.015625 75.875
+L 15.828125 75.875
+Q 23.140625 64.359375 26.78125 53.3125
+Q 30.421875 42.28125 30.421875 31.390625
+Q 30.421875 20.453125 26.78125 9.375
+Q 23.140625 -1.703125 15.828125 -13.1875
+L 8.015625 -13.1875
+Q 14.5 -2 17.703125 9.0625
+Q 20.90625 20.125 20.90625 31.390625
+Q 20.90625 42.671875 17.703125 53.65625
+Q 14.5 64.65625 8.015625 75.875
+z
+" id="DejaVuSans-41"/>
+ </defs>
+ <g transform="translate(338.914844 731.516563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_4">
+ <g id="ytick_7">
+ <g id="line2d_94">
+ <path clip-path="url(#p4bd2d14e15)" d="M 60.635 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_95">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_21">
+ <!-- −160 -->
+ <defs>
+ <path d="M 10.59375 35.5
+L 73.1875 35.5
+L 73.1875 27.203125
+L 10.59375 27.203125
+z
+" id="DejaVuSans-8722"/>
+ </defs>
+ <g transform="translate(26.167812 707.039219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-54"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_8">
+ <g id="line2d_96">
+ <path clip-path="url(#p4bd2d14e15)" d="M 60.635 668.788235
+L 693.54 668.788235
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_97">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="668.788235"/>
+ </g>
+ </g>
+ <g id="text_22">
+ <!-- −140 -->
+ <g transform="translate(26.167812 672.587454)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-52"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_9">
+ <g id="line2d_98">
+ <path clip-path="url(#p4bd2d14e15)" d="M 60.635 634.336471
+L 693.54 634.336471
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_99">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="634.336471"/>
+ </g>
+ </g>
+ <g id="text_23">
+ <!-- −120 -->
+ <g transform="translate(26.167812 638.135689)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-50"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_10">
+ <g id="line2d_100">
+ <path clip-path="url(#p4bd2d14e15)" d="M 60.635 599.884706
+L 693.54 599.884706
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_101">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="599.884706"/>
+ </g>
+ </g>
+ <g id="text_24">
+ <!-- −100 -->
+ <g transform="translate(26.167812 603.683925)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_11">
+ <g id="line2d_102">
+ <path clip-path="url(#p4bd2d14e15)" d="M 60.635 565.432941
+L 693.54 565.432941
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_103">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="565.432941"/>
+ </g>
+ </g>
+ <g id="text_25">
+ <!-- −80 -->
+ <g transform="translate(32.530312 569.23216)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-56"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_12">
+ <g id="line2d_104">
+ <path clip-path="url(#p4bd2d14e15)" d="M 60.635 530.981176
+L 693.54 530.981176
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_105">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="530.981176"/>
+ </g>
+ </g>
+ <g id="text_26">
+ <!-- −60 -->
+ <g transform="translate(32.530312 534.780395)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-54"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_13">
+ <g id="line2d_106">
+ <path clip-path="url(#p4bd2d14e15)" d="M 60.635 496.529412
+L 693.54 496.529412
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_107">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="496.529412"/>
+ </g>
+ </g>
+ <g id="text_27">
+ <!-- −40 -->
+ <g transform="translate(32.530312 500.328631)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-52"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_14">
+ <g id="line2d_108">
+ <path clip-path="url(#p4bd2d14e15)" d="M 60.635 462.077647
+L 693.54 462.077647
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_109">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="462.077647"/>
+ </g>
+ </g>
+ <g id="text_28">
+ <!-- −20 -->
+ <g transform="translate(32.530312 465.876866)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_15">
+ <g id="line2d_110">
+ <path clip-path="url(#p4bd2d14e15)" d="M 60.635 427.625882
+L 693.54 427.625882
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_111">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="427.625882"/>
+ </g>
+ </g>
+ <g id="text_29">
+ <!-- 0 -->
+ <g transform="translate(47.2725 431.425101)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_30">
+ <!-- Gain (dB) -->
+ <defs>
+ <path d="M 59.515625 10.40625
+L 59.515625 29.984375
+L 43.40625 29.984375
+L 43.40625 38.09375
+L 69.28125 38.09375
+L 69.28125 6.78125
+Q 63.578125 2.734375 56.6875 0.65625
+Q 49.8125 -1.421875 42 -1.421875
+Q 24.90625 -1.421875 15.25 8.5625
+Q 5.609375 18.5625 5.609375 36.375
+Q 5.609375 54.25 15.25 64.234375
+Q 24.90625 74.21875 42 74.21875
+Q 49.125 74.21875 55.546875 72.453125
+Q 61.96875 70.703125 67.390625 67.28125
+L 67.390625 56.78125
+Q 61.921875 61.421875 55.765625 63.765625
+Q 49.609375 66.109375 42.828125 66.109375
+Q 29.4375 66.109375 22.71875 58.640625
+Q 16.015625 51.171875 16.015625 36.375
+Q 16.015625 21.625 22.71875 14.15625
+Q 29.4375 6.6875 42.828125 6.6875
+Q 48.046875 6.6875 52.140625 7.59375
+Q 56.25 8.5 59.515625 10.40625
+z
+" id="DejaVuSans-71"/>
+ <path d="M 19.671875 34.8125
+L 19.671875 8.109375
+L 35.5 8.109375
+Q 43.453125 8.109375 47.28125 11.40625
+Q 51.125 14.703125 51.125 21.484375
+Q 51.125 28.328125 47.28125 31.5625
+Q 43.453125 34.8125 35.5 34.8125
+z
+M 19.671875 64.796875
+L 19.671875 42.828125
+L 34.28125 42.828125
+Q 41.5 42.828125 45.03125 45.53125
+Q 48.578125 48.25 48.578125 53.8125
+Q 48.578125 59.328125 45.03125 62.0625
+Q 41.5 64.796875 34.28125 64.796875
+z
+M 9.8125 72.90625
+L 35.015625 72.90625
+Q 46.296875 72.90625 52.390625 68.21875
+Q 58.5 63.53125 58.5 54.890625
+Q 58.5 48.1875 55.375 44.234375
+Q 52.25 40.28125 46.1875 39.3125
+Q 53.46875 37.75 57.5 32.78125
+Q 61.53125 27.828125 61.53125 20.40625
+Q 61.53125 10.640625 54.890625 5.3125
+Q 48.25 0 35.984375 0
+L 9.8125 0
+z
+" id="DejaVuSans-66"/>
+ </defs>
+ <g transform="translate(20.088125 580.411406)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-71"/>
+ <use x="77.490234" xlink:href="#DejaVuSans-97"/>
+ <use x="138.769531" xlink:href="#DejaVuSans-105"/>
+ <use x="166.552734" xlink:href="#DejaVuSans-110"/>
+ <use x="229.931641" xlink:href="#DejaVuSans-32"/>
+ <use x="261.71875" xlink:href="#DejaVuSans-40"/>
+ <use x="300.732422" xlink:href="#DejaVuSans-100"/>
+ <use x="364.208984" xlink:href="#DejaVuSans-66"/>
+ <use x="432.8125" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_112">
+ <path clip-path="url(#p4bd2d14e15)" d="M -1 427.626801
+L 212.156465 427.737135
+L 256.599519 427.958044
+L 285.173986 428.297399
+L 306.276544 428.756005
+L 323.015725 429.334969
+L 336.890405 430.035716
+L 348.739188 430.860022
+L 359.07901 431.810042
+L 368.251151 432.888363
+L 376.492787 434.098061
+L 383.975447 435.442786
+L 390.001653 436.733568
+L 395.611916 438.134452
+L 400.859966 439.649459
+L 405.789752 441.28337
+L 410.437678 443.041958
+L 414.834238 444.932298
+L 419.005232 446.963187
+L 422.97268 449.14561
+L 426.755528 451.493124
+L 430.370192 454.021881
+L 433.830994 456.749855
+L 437.150498 459.694846
+L 440.339792 462.871113
+L 443.408705 466.285186
+L 446.365997 469.932183
+L 449.219502 473.794229
+L 452.362562 478.433128
+L 455.759107 483.871723
+L 459.373772 490.089058
+L 463.509403 497.652681
+L 468.399648 507.074994
+L 474.493626 519.332933
+L 482.056895 535.070041
+L 491.872027 556.0266
+L 504.576193 583.699761
+L 519.705564 617.202025
+L 535.42431 652.548144
+L 549.879186 685.586412
+L 562.646191 715.307944
+L 573.851271 741.947807
+L 583.69767 765.923675
+L 592.410713 787.715613
+L 600.217325 807.828887
+L 607.282365 826.636485
+L 613.729382 844.42466
+L 619.307854 860.408738
+L 623.922797 874.129196
+L 634.347671 907.302259
+L 634.757741 908.712136
+L 634.798634 908.726822
+L 635.206441 910.177028
+L 635.287758 910.418942
+L 635.612213 911.541027
+L 635.733551 911.937178
+L 636.176914 913.561768
+L 636.377646 914.126694
+L 636.617872 914.995727
+L 636.657841 915.04487
+L 636.897242 916.039799
+L 637.096206 916.621498
+L 637.532221 918.202891
+L 637.571743 918.202891
+L 637.808473 919.279966
+L 637.847861 919.238962
+L 638.592631 921.911632
+L 638.904189 923.020054
+L 639.020716 923.020054
+L 639.175826 924.016985
+L 639.369299 924.639723
+L 639.407939 924.57108
+L 639.600861 925.54419
+L 639.63939 925.419529
+L 639.831764 926.253476
+L 639.908587 926.508411
+L 640.176895 927.513908
+L 640.215153 927.513908
+L 640.406171 928.363451
+L 641.655764 932.8746
+L 641.693332 932.789911
+L 641.843432 933.833256
+L 641.880913 933.825329
+L 642.030668 934.354922
+L 642.068063 934.315065
+L 642.589803 936.43517
+L 642.77533 937.31346
+L 642.812385 937.242997
+L 642.849423 937.340962
+L 643.108216 938.380364
+L 643.14512 938.10887
+L 643.182006 938.659992
+L 643.69667 940.646436
+L 643.255729 938.589813
+L 643.769928 940.489303
+L 643.806532 940.505015
+L 643.989307 941.763447
+L 644.025813 941.631849
+L 644.171672 942.308393
+L 644.208096 942.233914
+L 644.244504 942.344542
+L 644.426298 943.455148
+L 644.462608 943.412032
+L 644.643916 944.259244
+L 645.041376 944.402353
+L 693.520145 944.402353
+L 693.520145 944.402353
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_8">
+ <path d="M 60.635 703.24
+L 60.635 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_9">
+ <path d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_10">
+ <path d="M 60.635 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_11">
+ <path d="M 60.635 410.4
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_3">
+ <g id="patch_12">
+ <path d="M 60.635 1038.04
+L 693.54 1038.04
+L 693.54 745.2
+L 60.635 745.2
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_5">
+ <g id="xtick_41">
+ <g id="line2d_113">
+ <path clip-path="url(#p85b34b4f55)" d="M 60.635 1038.04
+L 60.635 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_114">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_31">
+ <!-- 10Hz -->
+ <g transform="translate(47.888125 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_42">
+ <g id="line2d_115">
+ <path clip-path="url(#p85b34b4f55)" d="M 60.635 1038.04
+L 60.635 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_116">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_43">
+ <g id="line2d_117">
+ <path clip-path="url(#p85b34b4f55)" d="M 116.999344 1038.04
+L 116.999344 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_118">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="116.999344" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_44">
+ <g id="line2d_119">
+ <path clip-path="url(#p85b34b4f55)" d="M 149.970372 1038.04
+L 149.970372 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_120">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="149.970372" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_45">
+ <g id="line2d_121">
+ <path clip-path="url(#p85b34b4f55)" d="M 173.363688 1038.04
+L 173.363688 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_122">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="173.363688" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_46">
+ <g id="line2d_123">
+ <path clip-path="url(#p85b34b4f55)" d="M 191.508954 1038.04
+L 191.508954 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_124">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="191.508954" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_47">
+ <g id="line2d_125">
+ <path clip-path="url(#p85b34b4f55)" d="M 206.334716 1038.04
+L 206.334716 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_126">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="206.334716" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_48">
+ <g id="line2d_127">
+ <path clip-path="url(#p85b34b4f55)" d="M 218.869719 1038.04
+L 218.869719 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_128">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="218.869719" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_49">
+ <g id="line2d_129">
+ <path clip-path="url(#p85b34b4f55)" d="M 229.728032 1038.04
+L 229.728032 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_130">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="229.728032" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_50">
+ <g id="line2d_131">
+ <path clip-path="url(#p85b34b4f55)" d="M 239.305743 1038.04
+L 239.305743 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_132">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="239.305743" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_51">
+ <g id="line2d_133">
+ <path clip-path="url(#p85b34b4f55)" d="M 247.873298 1038.04
+L 247.873298 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_134">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.873298" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_32">
+ <!-- 100Hz -->
+ <g transform="translate(231.945173 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_52">
+ <g id="line2d_135">
+ <path clip-path="url(#p85b34b4f55)" d="M 247.873298 1038.04
+L 247.873298 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_136">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.873298" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_53">
+ <g id="line2d_137">
+ <path clip-path="url(#p85b34b4f55)" d="M 304.237642 1038.04
+L 304.237642 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_138">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="304.237642" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_54">
+ <g id="line2d_139">
+ <path clip-path="url(#p85b34b4f55)" d="M 337.20867 1038.04
+L 337.20867 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_140">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="337.20867" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_55">
+ <g id="line2d_141">
+ <path clip-path="url(#p85b34b4f55)" d="M 360.601986 1038.04
+L 360.601986 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_142">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="360.601986" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_56">
+ <g id="line2d_143">
+ <path clip-path="url(#p85b34b4f55)" d="M 378.747252 1038.04
+L 378.747252 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_144">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="378.747252" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_57">
+ <g id="line2d_145">
+ <path clip-path="url(#p85b34b4f55)" d="M 393.573014 1038.04
+L 393.573014 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_146">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="393.573014" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_58">
+ <g id="line2d_147">
+ <path clip-path="url(#p85b34b4f55)" d="M 406.108017 1038.04
+L 406.108017 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_148">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="406.108017" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_59">
+ <g id="line2d_149">
+ <path clip-path="url(#p85b34b4f55)" d="M 416.96633 1038.04
+L 416.96633 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_150">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="416.96633" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_60">
+ <g id="line2d_151">
+ <path clip-path="url(#p85b34b4f55)" d="M 426.544041 1038.04
+L 426.544041 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_152">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="426.544041" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_61">
+ <g id="line2d_153">
+ <path clip-path="url(#p85b34b4f55)" d="M 435.111596 1038.04
+L 435.111596 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_154">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.111596" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_33">
+ <!-- 1kHz -->
+ <g transform="translate(422.650659 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_62">
+ <g id="line2d_155">
+ <path clip-path="url(#p85b34b4f55)" d="M 435.111596 1038.04
+L 435.111596 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_156">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.111596" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_63">
+ <g id="line2d_157">
+ <path clip-path="url(#p85b34b4f55)" d="M 491.47594 1038.04
+L 491.47594 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_158">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="491.47594" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_64">
+ <g id="line2d_159">
+ <path clip-path="url(#p85b34b4f55)" d="M 524.446968 1038.04
+L 524.446968 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_160">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.446968" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_65">
+ <g id="line2d_161">
+ <path clip-path="url(#p85b34b4f55)" d="M 547.840284 1038.04
+L 547.840284 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_162">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.840284" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_66">
+ <g id="line2d_163">
+ <path clip-path="url(#p85b34b4f55)" d="M 565.98555 1038.04
+L 565.98555 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_164">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="565.98555" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_67">
+ <g id="line2d_165">
+ <path clip-path="url(#p85b34b4f55)" d="M 580.811312 1038.04
+L 580.811312 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_166">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="580.811312" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_68">
+ <g id="line2d_167">
+ <path clip-path="url(#p85b34b4f55)" d="M 593.346315 1038.04
+L 593.346315 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_168">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.346315" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_69">
+ <g id="line2d_169">
+ <path clip-path="url(#p85b34b4f55)" d="M 604.204628 1038.04
+L 604.204628 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_170">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.204628" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_70">
+ <g id="line2d_171">
+ <path clip-path="url(#p85b34b4f55)" d="M 613.78234 1038.04
+L 613.78234 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_172">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="613.78234" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_71">
+ <g id="line2d_173">
+ <path clip-path="url(#p85b34b4f55)" d="M 622.349894 1038.04
+L 622.349894 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_174">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.349894" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_34">
+ <!-- 10kHz -->
+ <g transform="translate(606.707707 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_72">
+ <g id="line2d_175">
+ <path clip-path="url(#p85b34b4f55)" d="M 622.349894 1038.04
+L 622.349894 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_176">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.349894" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_73">
+ <g id="line2d_177">
+ <path clip-path="url(#p85b34b4f55)" d="M 678.714238 1038.04
+L 678.714238 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_178">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.714238" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_74">
+ <g id="line2d_179">
+ <path clip-path="url(#p85b34b4f55)" d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_180">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#mdcbbfdbe69" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_35">
+ <!-- 24kHz -->
+ <g transform="translate(677.897813 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_36">
+ <!-- Frequency (Hz) -->
+ <g transform="translate(338.914844 1066.316563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_6">
+ <g id="ytick_16">
+ <g id="line2d_181">
+ <path clip-path="url(#p85b34b4f55)" d="M 60.635 1007.214737
+L 693.54 1007.214737
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_182">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="1007.214737"/>
+ </g>
+ </g>
+ <g id="text_37">
+ <!-- −150 -->
+ <g transform="translate(26.167812 1011.013956)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_17">
+ <g id="line2d_183">
+ <path clip-path="url(#p85b34b4f55)" d="M 60.635 968.683158
+L 693.54 968.683158
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_184">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="968.683158"/>
+ </g>
+ </g>
+ <g id="text_38">
+ <!-- −100 -->
+ <g transform="translate(26.167812 972.482377)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_18">
+ <g id="line2d_185">
+ <path clip-path="url(#p85b34b4f55)" d="M 60.635 930.151579
+L 693.54 930.151579
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_186">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="930.151579"/>
+ </g>
+ </g>
+ <g id="text_39">
+ <!-- −50 -->
+ <g transform="translate(32.530312 933.950798)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-53"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_19">
+ <g id="line2d_187">
+ <path clip-path="url(#p85b34b4f55)" d="M 60.635 891.62
+L 693.54 891.62
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_188">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="891.62"/>
+ </g>
+ </g>
+ <g id="text_40">
+ <!-- 0 -->
+ <g transform="translate(47.2725 895.419219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_20">
+ <g id="line2d_189">
+ <path clip-path="url(#p85b34b4f55)" d="M 60.635 853.088421
+L 693.54 853.088421
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_190">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="853.088421"/>
+ </g>
+ </g>
+ <g id="text_41">
+ <!-- 50 -->
+ <g transform="translate(40.91 856.88764)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-53"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_21">
+ <g id="line2d_191">
+ <path clip-path="url(#p85b34b4f55)" d="M 60.635 814.556842
+L 693.54 814.556842
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_192">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="814.556842"/>
+ </g>
+ </g>
+ <g id="text_42">
+ <!-- 100 -->
+ <g transform="translate(34.5475 818.356061)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_22">
+ <g id="line2d_193">
+ <path clip-path="url(#p85b34b4f55)" d="M 60.635 776.025263
+L 693.54 776.025263
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_194">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m3e2238fd04" y="776.025263"/>
+ </g>
+ </g>
+ <g id="text_43">
+ <!-- 150 -->
+ <g transform="translate(34.5475 779.824482)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-53"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_44">
+ <!-- Phase (${\circ}$) -->
+ <defs>
+ <path d="M 19.671875 64.796875
+L 19.671875 37.40625
+L 32.078125 37.40625
+Q 38.96875 37.40625 42.71875 40.96875
+Q 46.484375 44.53125 46.484375 51.125
+Q 46.484375 57.671875 42.71875 61.234375
+Q 38.96875 64.796875 32.078125 64.796875
+z
+M 9.8125 72.90625
+L 32.078125 72.90625
+Q 44.34375 72.90625 50.609375 67.359375
+Q 56.890625 61.8125 56.890625 51.125
+Q 56.890625 40.328125 50.609375 34.8125
+Q 44.34375 29.296875 32.078125 29.296875
+L 19.671875 29.296875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-80"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-104"/>
+ <path d="M 31.296875 40.671875
+Q 27.390625 40.671875 24.703125 37.953125
+Q 22.015625 35.25 22.015625 31.34375
+Q 22.015625 27.484375 24.703125 24.828125
+Q 27.390625 22.171875 31.296875 22.171875
+Q 35.203125 22.171875 37.890625 24.828125
+Q 40.578125 27.484375 40.578125 31.34375
+Q 40.578125 35.203125 37.859375 37.9375
+Q 35.15625 40.671875 31.296875 40.671875
+z
+M 31.296875 46.96875
+Q 34.421875 46.96875 37.296875 45.765625
+Q 40.1875 44.578125 42.28125 42.328125
+Q 44.53125 40.140625 45.65625 37.34375
+Q 46.78125 34.5625 46.78125 31.34375
+Q 46.78125 24.90625 42.265625 20.4375
+Q 37.75 15.96875 31.203125 15.96875
+Q 24.609375 15.96875 20.21875 20.359375
+Q 15.828125 24.75 15.828125 31.34375
+Q 15.828125 37.890625 20.3125 42.421875
+Q 24.8125 46.96875 31.296875 46.96875
+z
+" id="DejaVuSans-8728"/>
+ </defs>
+ <g transform="translate(20.088125 915.17)rotate(-90)scale(0.1 -0.1)">
+ <use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-80"/>
+ <use transform="translate(60.302734 0.015625)" xlink:href="#DejaVuSans-104"/>
+ <use transform="translate(123.681641 0.015625)" xlink:href="#DejaVuSans-97"/>
+ <use transform="translate(184.960938 0.015625)" xlink:href="#DejaVuSans-115"/>
+ <use transform="translate(237.060547 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(298.583984 0.015625)" xlink:href="#DejaVuSans-32"/>
+ <use transform="translate(330.371094 0.015625)" xlink:href="#DejaVuSans-40"/>
+ <use transform="translate(369.384766 0.015625)" xlink:href="#DejaVuSans-8728"/>
+ <use transform="translate(431.982422 0.015625)" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_195">
+ <path clip-path="url(#p85b34b4f55)" d="M -1 893.966886
+L 17.167871 893.967113
+L 73.532215 896.314227
+L 106.503243 898.661343
+L 129.896559 901.00846
+L 148.041825 903.355581
+L 162.867587 905.702704
+L 175.40259 908.049832
+L 186.260904 910.396965
+L 195.838615 912.744103
+L 204.406169 915.091247
+L 212.156465 917.438399
+L 219.231931 919.785558
+L 225.740729 922.132725
+L 231.766934 924.479901
+L 237.377197 926.827087
+L 242.625248 929.174283
+L 247.555033 931.52149
+L 252.202959 933.868709
+L 260.770513 938.563185
+L 268.520809 943.257717
+L 275.596275 947.952308
+L 282.105073 952.646967
+L 288.131278 957.341697
+L 293.741541 962.036504
+L 298.989592 966.731394
+L 303.919377 971.426373
+L 308.567303 976.121445
+L 312.963863 980.816617
+L 317.134858 985.511894
+L 323.015725 992.555019
+L 328.499818 999.59841
+L 333.637309 1006.642088
+L 338.469417 1013.68607
+L 343.030419 1020.730375
+L 347.349128 1027.775023
+L 348.739188 752.695949
+L 352.772241 759.741081
+L 357.856181 769.135194
+L 362.640888 778.530036
+L 367.159637 787.925653
+L 371.440445 797.322087
+L 375.50712 806.719384
+L 380.320155 818.467286
+L 384.864162 830.216691
+L 389.16763 841.967685
+L 393.254749 853.72035
+L 397.902675 867.825864
+L 402.299235 881.934
+L 406.470229 896.044787
+L 411.0805 912.510496
+L 415.443354 928.97859
+L 419.584 945.446317
+L 424.07157 964.25767
+L 428.324385 983.039098
+L 432.857131 1004.079116
+L 437.613842 1027.214243
+L 438.07456 1029.505475
+L 438.532683 754.364171
+L 445.531974 789.965657
+L 453.51058 830.403864
+L 457.947129 851.786524
+L 461.81171 869.40588
+L 465.500929 885.249869
+L 469.030012 899.500099
+L 472.712901 913.457055
+L 476.236191 925.985497
+L 479.888325 938.18344
+L 483.646195 949.963355
+L 487.488637 961.267954
+L 491.396491 972.063262
+L 495.352583 982.332817
+L 499.341661 992.073085
+L 503.350292 1001.289922
+L 507.562449 1010.407292
+L 511.752988 1018.946118
+L 516.0909 1027.269822
+L 517.313728 1029.527011
+L 517.486927 752.416282
+L 521.865273 760.176594
+L 526.330833 767.63214
+L 530.85797 774.75145
+L 535.42431 781.516781
+L 540.010539 787.92117
+L 544.724016 794.124198
+L 549.529938 800.081015
+L 554.397935 805.762771
+L 559.405251 811.263738
+L 564.511106 816.540063
+L 569.680276 821.564246
+L 574.968156 826.397529
+L 580.413286 831.075149
+L 586.039507 835.61397
+L 591.858007 840.018659
+L 597.869356 844.286384
+L 604.125179 848.449668
+L 610.100268 852.185253
+L 616.13043 855.740161
+L 620.87545 858.404784
+L 623.501103 859.83384
+L 623.829276 860.00067
+L 624.944492 860.602185
+L 625.128884 860.693903
+L 633.146641 864.897667
+L 633.188353 864.754822
+L 633.230043 864.953583
+L 633.39659 864.788333
+L 633.521276 864.906833
+L 633.645772 864.986436
+L 633.687229 865.11725
+L 633.728664 865.043902
+L 633.770078 864.938416
+L 633.811471 865.172735
+L 633.894194 865.014709
+L 634.141859 865.357841
+L 634.183063 865.204877
+L 634.224246 865.118934
+L 634.265409 865.615465
+L 634.306551 865.460381
+L 634.388772 865.224785
+L 634.511947 865.642563
+L 634.552965 865.285149
+L 634.593961 865.372848
+L 634.634937 865.611913
+L 634.675892 865.588595
+L 634.716827 865.285556
+L 634.757741 865.831419
+L 634.839507 865.661335
+L 634.921191 865.462932
+L 635.002793 865.583079
+L 635.206441 865.933436
+L 635.24711 865.65737
+L 635.287758 865.762582
+L 635.328386 865.977321
+L 635.40958 865.874875
+L 635.450147 865.839823
+L 635.490694 866.209726
+L 635.571727 865.940042
+L 635.612213 866.016491
+L 635.652679 865.96122
+L 635.693125 865.830522
+L 635.733551 865.909676
+L 635.773957 866.384684
+L 635.854708 866.122861
+L 636.015971 866.4575
+L 636.056236 865.961984
+L 636.096482 866.303686
+L 636.176914 866.5877
+L 636.337539 866.079989
+L 636.4578 866.53296
+L 636.497848 866.454117
+L 636.537876 866.121643
+L 636.577884 866.228294
+L 636.617872 866.609842
+L 636.69779 866.435332
+L 636.73772 866.192838
+L 636.81752 866.67194
+L 636.857391 866.212736
+L 636.897242 866.653155
+L 636.976886 866.985495
+L 637.016679 866.441317
+L 637.096206 866.732464
+L 637.175656 866.955641
+L 637.215352 866.710083
+L 637.255028 866.987238
+L 637.294685 867.098619
+L 637.41354 866.692039
+L 637.611246 867.461023
+L 637.65073 866.630302
+L 637.72964 866.837012
+L 637.808473 867.052576
+L 637.847861 866.858971
+L 638.005222 867.555997
+L 638.044515 866.879884
+L 638.123044 867.096299
+L 638.201497 867.408183
+L 638.240695 867.381529
+L 638.279874 867.336615
+L 638.319035 867.664387
+L 638.358176 867.212074
+L 638.436403 867.066833
+L 638.592631 867.547985
+L 638.631641 867.189877
+L 638.670632 867.805778
+L 638.709605 867.399384
+L 638.865309 866.955641
+L 638.94305 867.45524
+L 638.981892 867.204568
+L 639.020716 867.204568
+L 639.059522 867.392154
+L 639.098308 868.150008
+L 639.137077 867.970119
+L 639.214558 868.085816
+L 639.253271 867.209884
+L 639.369299 868.403503
+L 639.407939 868.379607
+L 639.523747 867.787126
+L 639.63939 868.526682
+L 639.793326 867.758351
+L 639.908587 868.743625
+L 639.946971 867.693799
+L 640.023685 867.725572
+L 640.100326 868.673152
+L 640.13862 867.993389
+L 640.291614 868.17293
+L 640.329818 867.973037
+L 640.368004 868.168659
+L 640.406171 868.80173
+L 640.444321 868.067115
+L 640.482453 868.079833
+L 640.596742 868.887848
+L 640.710871 868.113881
+L 640.748878 868.265846
+L 640.786868 867.837622
+L 640.824839 868.842898
+L 640.90073 868.345955
+L 640.976549 868.757892
+L 641.014433 868.267797
+L 641.052298 868.515202
+L 641.203585 869.204785
+L 641.316866 868.826383
+L 641.354591 869.359088
+L 641.392299 868.648155
+L 641.429989 869.094495
+L 641.505317 869.417493
+L 641.542955 868.288597
+L 641.580575 868.671585
+L 641.618178 869.734433
+L 641.655764 869.023022
+L 641.693332 868.371939
+L 641.730883 869.081362
+L 641.768416 869.461804
+L 641.805933 867.834152
+L 641.880913 868.78199
+L 641.955825 868.659327
+L 642.030668 869.047151
+L 642.068063 868.213531
+L 642.142803 868.856482
+L 642.180147 869.832676
+L 642.254783 868.880192
+L 642.329352 868.531897
+L 642.403851 869.694715
+L 642.478283 869.1105
+L 642.515473 869.444652
+L 642.552647 869.452256
+L 642.589803 869.579055
+L 642.626942 868.469176
+L 642.70117 869.279201
+L 642.812385 869.337949
+L 642.849423 870.020884
+L 642.886444 869.938147
+L 642.923448 868.883049
+L 642.997406 869.353178
+L 643.034359 869.488992
+L 643.071296 868.920029
+L 643.108216 869.269401
+L 643.182006 870.821418
+L 643.255729 869.754261
+L 643.292566 868.578962
+L 643.329386 869.854088
+L 643.366189 868.868794
+L 643.476498 869.901178
+L 643.513235 868.766431
+L 643.586659 868.839857
+L 643.69667 869.762112
+L 643.733307 868.902714
+L 643.769928 869.776596
+L 643.806532 869.246805
+L 643.879691 868.751574
+L 643.916246 870.517155
+L 643.952785 869.63584
+L 643.989307 870.573805
+L 644.025813 870.415148
+L 644.062302 869.986455
+L 644.098775 870.663106
+L 644.135232 869.99809
+L 644.208096 870.851802
+L 644.280895 870.656871
+L 644.31727 870.58807
+L 644.353629 869.243165
+L 644.426298 870.312106
+L 644.571442 870.717861
+L 644.643916 870.062321
+L 644.680129 872.235616
+L 644.716326 870.253015
+L 644.788672 871.530709
+L 644.933171 868.911005
+L 644.969255 871.39455
+L 645.041376 870.384958
+L 645.077413 869.684014
+L 645.113434 871.221111
+L 645.185427 870.060817
+L 645.2214 869.702592
+L 645.257357 871.842654
+L 645.329223 870.969062
+L 645.365132 869.857862
+L 645.401026 871.872252
+L 645.580255 868.99203
+L 645.616054 871.752191
+L 645.687604 871.487337
+L 645.794811 869.996746
+L 645.973176 873.091716
+L 646.008802 872.168149
+L 646.080008 871.571379
+L 646.115587 868.820641
+L 646.186699 870.058133
+L 646.257749 871.879988
+L 646.29325 870.156819
+L 646.364207 870.281013
+L 646.435102 867.962239
+L 646.541329 869.515748
+L 646.576707 869.471451
+L 646.647417 872.421377
+L 646.682749 869.40275
+L 646.718066 870.80257
+L 646.753367 871.082522
+L 646.788653 871.025382
+L 646.859179 869.385545
+L 646.894419 870.295476
+L 646.929644 871.55589
+L 646.964854 870.269036
+L 647.000048 869.887735
+L 647.035227 871.515722
+L 647.070391 869.200116
+L 647.10554 870.118855
+L 647.140673 869.378175
+L 647.175792 871.923778
+L 647.245983 869.980389
+L 647.316114 869.86716
+L 647.351156 871.853947
+L 647.386184 873.705298
+L 647.421197 871.773861
+L 647.456194 873.70218
+L 647.665863 869.760336
+L 647.770495 873.493675
+L 647.805343 869.818724
+L 647.840175 874.604979
+L 647.874993 870.647952
+L 647.944583 870.418893
+L 647.979356 874.388135
+L 648.014114 870.879295
+L 648.048858 875.083621
+L 648.083586 871.783047
+L 648.1183 873.504185
+L 648.152998 870.638717
+L 648.187682 871.497946
+L 648.222351 869.195048
+L 648.291645 871.320461
+L 648.360881 871.025171
+L 648.395476 877.083028
+L 648.430057 869.309449
+L 648.499174 872.28596
+L 648.568233 875.079715
+L 648.637233 874.711179
+L 648.671711 876.429286
+L 648.706174 873.668474
+L 648.740623 874.339173
+L 648.809477 876.082166
+L 648.94701 868.717021
+L 649.118601 874.643046
+L 649.152875 870.445497
+L 649.221381 873.229039
+L 649.324032 875.782806
+L 649.426554 866.817141
+L 649.494829 873.942129
+L 649.563048 873.875028
+L 649.699314 867.832352
+L 649.733345 871.430954
+L 649.767361 866.543283
+L 649.801363 870.8388
+L 649.835351 869.112506
+L 649.869325 869.938985
+L 649.903285 872.265715
+L 649.937231 871.651768
+L 649.971162 868.527247
+L 650.005079 876.634182
+L 650.038982 865.835569
+L 650.072871 870.934141
+L 650.106746 867.006344
+L 650.140607 873.410455
+L 650.174454 870.848535
+L 650.208286 870.832471
+L 650.242105 872.183812
+L 650.309699 866.236405
+L 650.343476 871.62374
+L 650.377238 871.457708
+L 650.410986 872.699621
+L 650.579518 865.430709
+L 650.68047 875.401742
+L 650.747701 868.255719
+L 650.781296 868.970327
+L 650.915538 878.46585
+L 650.949063 871.761342
+L 651.016073 878.163866
+L 651.083028 866.72828
+L 651.183357 873.992831
+L 651.316936 879.549337
+L 651.450297 873.459762
+L 651.583439 883.923378
+L 651.716364 866.899785
+L 651.815915 882.674959
+L 651.849071 881.358206
+L 651.882214 877.924859
+L 651.915344 882.904209
+L 651.94846 884.093488
+L 652.08079 877.878207
+L 652.146874 870.479185
+L 652.179896 888.869322
+L 652.245899 870.299123
+L 652.31185 876.125501
+L 652.344805 870.140993
+L 652.377746 900.265594
+L 652.44359 866.08918
+L 652.50938 877.684326
+L 652.575117 875.207586
+L 652.607965 865.403615
+L 652.673623 873.565109
+L 652.706431 897.504984
+L 652.804778 891.62
+L 652.935723 857.449073
+L 652.968426 856.941579
+L 653.001116 878.707491
+L 653.099108 875.612245
+L 653.16437 851.932977
+L 653.196981 881.237159
+L 653.359842 865.784982
+L 653.392375 864.654044
+L 653.424896 859.53588
+L 653.457403 860.585116
+L 653.522378 880.113378
+L 653.587301 874.324906
+L 653.749384 844.311282
+L 653.878817 877.72221
+L 653.911143 841.541966
+L 653.975757 856.301712
+L 654.04032 880.113378
+L 654.104831 878.072411
+L 654.201502 866.747369
+L 654.2337 878.440097
+L 654.265886 865.19745
+L 654.298059 872.583527
+L 654.362366 861.827531
+L 654.3945 866.429021
+L 654.426622 873.813535
+L 654.458732 854.09688
+L 654.522912 871.148133
+L 654.554983 883.070827
+L 654.651121 877.85943
+L 654.71515 877.70203
+L 654.747145 893.043827
+L 654.875001 850.889568
+L 654.906934 881.698117
+L 655.002657 879.331974
+L 655.193765 908.866839
+L 655.320922 860.999434
+L 655.384426 894.668847
+L 655.416159 858.112203
+L 655.44788 890.532098
+L 655.57464 845.213113
+L 655.511285 895.758615
+L 655.606299 869.410691
+L 655.66958 866.320264
+L 655.732813 903.153038
+L 655.827569 907.580392
+L 655.85913 871.556346
+L 655.922215 852.433523
+L 655.953739 929.919318
+L 655.985251 885.061966
+L 656.048238 904.043268
+L 656.079713 959.33404
+L 656.142627 877.62004
+L 656.174066 885.563507
+L 656.205493 836.723085
+L 656.236908 944.952731
+L 656.26831 884.316219
+L 656.2997 911.332019
+L 656.331078 871.2215
+L 656.42514 851.324023
+L 656.487788 900.584032
+L 656.519094 894.829173
+L 656.581669 903.279862
+L 656.644196 838.131971
+L 656.737897 820.810771
+L 656.800304 907.449516
+L 656.956113 767.578393
+L 656.987239 911.774714
+L 657.080545 902.141554
+L 657.14269 874.317176
+L 657.173745 835.212829
+L 657.235818 840.450608
+L 657.266837 898.682133
+L 657.297845 781.291896
+L 657.359824 867.626648
+L 657.390796 919.388985
+L 657.452704 879.364752
+L 657.48364 853.338073
+L 657.514565 866.28757
+L 657.545478 977.847861
+L 657.607269 845.853631
+L 657.669013 892.542087
+L 657.73071 871.316827
+L 657.76154 853.756123
+L 657.79236 969.176166
+L 657.853963 810.068363
+L 657.91552 911.640322
+L 657.946281 822.240227
+L 657.97703 817.398233
+L 658.007768 829.837453
+L 658.099911 822.492946
+L 658.130603 928.880175
+L 658.253252 820.338744
+L 658.283886 858.802042
+L 658.314507 873.479724
+L 658.345118 833.335125
+L 658.406304 874.154565
+L 658.467444 897.492177
+L 658.497997 876.926215
+L 658.559069 880.981107
+L 658.589587 850.684914
+L 658.65059 1006.49875
+L 658.711547 868.33933
+L 658.742008 880.38765
+L 658.772458 858.249184
+L 658.802897 830.307007
+L 658.833324 898.349022
+L 658.86374 906.975852
+L 658.894144 997.812328
+L 658.954919 851.480464
+L 659.045996 939.241264
+L 659.076332 883.720577
+L 659.106657 812.992556
+L 659.136971 933.15877
+L 659.167273 1023.038155
+L 659.227844 881.975975
+L 659.28837 882.595921
+L 659.379075 848.204561
+L 659.409287 957.725027
+L 659.469678 839.147763
+L 659.499857 819.443791
+L 659.530024 838.811882
+L 659.590326 909.406866
+L 659.62046 820.717334
+L 659.650583 836.476701
+L 659.680694 767.772041
+L 659.740884 872.669822
+L 659.770962 872.959224
+L 659.80103 789.255144
+L 659.86113 874.396831
+L 659.891164 944.097948
+L 659.951199 885.11289
+L 660.011189 792.38884
+L 660.041167 854.431864
+L 660.071135 878.051095
+L 660.101091 794.785572
+L 660.190894 853.113197
+L 660.220806 916.499465
+L 660.280598 873.641036
+L 660.340345 875.80281
+L 660.400049 807.362207
+L 660.489523 891.614708
+L 660.519326 808.864509
+L 660.578898 861.527301
+L 660.668175 934.596596
+L 660.638427 840.246125
+L 660.697912 912.952905
+L 660.757354 865.630489
+L 660.816753 900.531322
+L 660.846436 1013.23274
+L 660.876108 787.122685
+L 660.905769 1001.802301
+L 660.93542 842.44121
+L 661.024307 935.73686
+L 661.053914 848.618771
+L 661.113096 904.857098
+L 661.142671 993.133753
+L 661.201789 885.589297
+L 661.231332 859.086736
+L 661.260864 975.823072
+L 661.319896 923.068219
+L 661.349396 843.009693
+L 661.378885 960.31663
+L 661.408364 903.222689
+L 661.437832 997.566905
+L 661.467289 860.562833
+L 661.496735 786.267563
+L 661.526171 878.994318
+L 661.643808 980.51199
+L 661.614415 874.989858
+L 661.673191 975.831209
+L 661.849264 816.852388
+L 661.878573 897.044731
+L 661.966435 1006.916549
+L 662.024957 990.883648
+L 662.141876 777.345254
+L 662.112662 1018.939492
+L 662.229454 832.483392
+L 662.287787 913.580659
+L 662.316938 770.990488
+L 662.375209 970.57956
+L 662.404328 871.790329
+L 662.433438 843.136607
+L 662.491625 802.497477
+L 662.578827 1008.202095
+L 662.607874 871.689509
+L 662.665937 971.605812
+L 662.694953 991.9336
+L 662.723958 824.148973
+L 662.810912 867.412512
+L 662.839876 874.764092
+L 662.86883 830.557999
+L 662.897773 831.93905
+L 662.926706 977.050606
+L 662.984542 771.370391
+L 663.013444 924.517564
+L 663.071218 947.955919
+L 663.157802 834.352943
+L 663.215473 784.292771
+L 663.273103 1026.671546
+L 663.388242 1022.973922
+L 663.44575 756.82556
+L 663.531936 791.660239
+L 663.560644 804.02464
+L 663.589343 1028.860489
+L 663.675377 1004.281329
+L 663.847172 820.678883
+L 663.904357 979.005765
+L 663.932934 815.632256
+L 663.990059 942.475403
+L 664.018606 975.92942
+L 664.047143 916.846732
+L 664.07567 943.83384
+L 664.104187 922.558771
+L 664.189679 1026.016733
+L 664.218156 790.075645
+L 664.303528 899.02313
+L 664.331965 943.265248
+L 664.360392 778.1612
+L 664.38881 1002.868196
+L 664.445615 852.413514
+L 664.530748 1008.688779
+L 664.559106 1004.805589
+L 664.672439 777.743806
+L 664.729047 988.867447
+L 664.785615 952.049377
+L 664.813884 790.297241
+L 664.870393 959.248501
+L 664.898633 959.181028
+L 664.955083 999.410387
+L 665.039685 829.834835
+L 665.096038 809.646932
+L 665.124199 1012.943363
+L 665.152351 774.218658
+L 665.180493 1014.847981
+L 665.208626 981.560954
+L 665.236748 1008.044016
+L 665.264861 870.87007
+L 665.321058 972.004878
+L 665.349141 1009.047877
+L 665.377216 961.573782
+L 665.46138 810.053185
+L 665.433335 1013.390982
+L 665.489415 863.607641
+L 665.517441 858.558642
+L 665.629447 1011.681859
+L 665.685392 1010.788222
+L 665.769238 771.844483
+L 665.797168 1017.147372
+L 665.880899 856.570803
+L 665.90879 943.80331
+L 665.992406 860.114176
+L 666.020259 799.682512
+L 666.048102 882.224958
+L 666.075936 870.604766
+L 666.10376 1012.934633
+L 666.187176 931.573381
+L 666.214962 760.93649
+L 666.270506 1014.522997
+L 666.298264 896.176503
+L 666.381481 945.27719
+L 666.409201 802.721998
+L 666.630621 1010.727078
+L 666.685882 793.536554
+L 666.741106 898.511149
+L 666.796292 884.073432
+L 666.823871 870.682532
+L 666.934093 941.143143
+L 666.961625 860.701574
+L 667.016662 1005.118926
+L 667.044166 874.937709
+L 667.071661 1011.832542
+L 667.126623 810.038552
+L 667.154091 869.408542
+L 667.236436 812.789106
+L 667.263867 1013.57633
+L 667.373495 842.142066
+L 667.482975 977.00534
+L 667.592308 784.827707
+L 667.564989 986.164254
+L 667.619619 815.737017
+L 667.674212 983.302225
+L 667.728768 957.956128
+L 667.756033 832.925922
+L 667.783288 986.534172
+L 667.810535 873.652144
+L 667.837772 1021.168549
+L 667.919429 1006.591245
+L 668.055341 843.865161
+L 668.082497 946.688006
+L 668.109643 986.826768
+L 668.13678 766.201338
+L 668.218137 1004.574567
+L 668.245238 1020.390583
+L 668.326487 1022.002274
+L 668.380608 921.557966
+L 668.407655 884.682029
+L 668.434693 1027.501528
+L 668.488742 754.50668
+L 668.623707 1024.099583
+L 668.650673 791.548306
+L 668.731518 976.269433
+L 668.866081 757.989143
+L 668.892967 1012.943889
+L 668.973572 870.902502
+L 669.027264 936.597861
+L 669.054097 771.984831
+L 669.080921 1021.091347
+L 669.161339 781.027771
+L 669.241678 958.808174
+L 669.26844 770.635118
+L 669.321938 900.550406
+L 669.348674 1020.625671
+L 669.375401 791.659425
+L 669.428828 923.893501
+L 669.508903 773.519348
+L 669.535578 839.190629
+L 669.642187 977.281221
+L 669.668818 780.097974
+L 669.748658 859.82944
+L 669.775253 967.26305
+L 669.80184 836.977804
+L 669.854988 849.073032
+L 669.881549 841.733741
+L 669.934646 956.041881
+L 669.961181 945.350207
+L 670.040734 978.698044
+L 670.093726 794.134728
+L 670.17315 987.269761
+L 670.226056 837.124873
+L 670.252496 791.131202
+L 670.30535 759.890027
+L 670.384567 993.408981
+L 670.463708 830.088576
+L 670.490071 1010.84342
+L 670.516425 764.931778
+L 670.569108 968.355563
+L 670.595437 957.821281
+L 670.674372 804.738494
+L 670.726953 838.338585
+L 670.753231 1023.726131
+L 670.7795 837.374921
+L 670.832014 850.744523
+L 670.91072 1005.97757
+L 670.936938 829.672481
+L 670.963148 951.817242
+L 671.094072 815.466709
+L 671.120231 779.021289
+L 671.146382 874.113115
+L 671.198659 957.211659
+L 671.224785 765.950999
+L 671.277011 970.440013
+L 671.303112 805.935277
+L 671.355288 831.182386
+L 671.407431 1019.032004
+L 671.43349 786.858153
+L 671.485582 962.998617
+L 671.511616 786.87566
+L 671.589667 829.047597
+L 671.64166 913.096996
+L 671.667644 908.603083
+L 671.693619 804.796752
+L 671.745546 909.645956
+L 671.849299 1004.711355
+L 671.797439 884.541201
+L 671.875217 991.777226
+L 671.901126 771.322122
+L 672.004681 826.885631
+L 672.030549 939.141595
+L 672.13394 910.46965
+L 672.159767 842.136717
+L 672.211396 870.499765
+L 672.262993 810.321917
+L 672.288779 1012.349449
+L 672.314557 782.654364
+L 672.391842 919.789385
+L 672.417587 908.452747
+L 672.443324 959.256038
+L 672.494774 881.498368
+L 672.520487 760.172446
+L 672.546192 974.476026
+L 672.571888 845.010912
+L 672.597577 983.550962
+L 672.648929 763.381433
+L 672.674593 849.627224
+L 672.725897 797.540916
+L 672.751537 845.317562
+L 672.828408 988.746285
+L 672.854015 902.593312
+L 672.905206 908.035
+L 672.930789 873.760117
+L 672.981932 962.904208
+L 673.058585 766.699588
+L 673.033042 992.88226
+L 673.08412 979.287507
+L 673.186181 755.947081
+L 673.211676 864.821145
+L 673.288113 1012.039042
+L 673.339031 795.410964
+L 673.415349 836.238188
+L 673.440772 755.228681
+L 673.466188 815.459828
+L 673.491595 1016.40247
+L 673.542386 764.332076
+L 673.593146 975.357003
+L 673.618514 776.613767
+L 673.669225 1013.398142
+L 673.69457 996.871872
+L 673.719906 1025.782297
+L 673.770555 793.364389
+L 673.821172 795.175179
+L 673.846469 1028.92806
+L 673.922312 795.530051
+L 673.947577 932.70602
+L 673.998084 758.438212
+L 674.023326 863.332524
+L 674.04856 806.055669
+L 674.099005 817.805243
+L 674.124215 1010.49348
+L 674.149418 798.198316
+L 674.1998 824.303404
+L 674.224979 912.055357
+L 674.325619 889.073419
+L 674.350759 897.87596
+L 674.375892 896.067844
+L 674.501438 818.140436
+L 674.551603 887.118332
+L 674.601736 813.82881
+L 674.626791 884.552331
+L 674.651839 869.853958
+L 674.676878 768.949235
+L 674.726935 947.172145
+L 674.751951 883.356352
+L 674.77696 892.698112
+L 674.801962 860.726785
+L 674.851941 826.068472
+L 674.876919 885.931809
+L 674.926853 916.505001
+L 674.951808 881.319668
+L 674.976756 869.821696
+L 675.076469 1001.723812
+L 675.101379 928.895544
+L 675.151174 979.39005
+L 675.176061 961.868789
+L 675.225811 848.80059
+L 675.250675 980.46959
+L 675.275531 965.842907
+L 675.350053 975.745177
+L 675.399697 914.296344
+L 675.424508 963.699011
+L 675.498894 927.361582
+L 675.523674 818.347944
+L 675.548447 963.082106
+L 675.59797 927.638998
+L 675.647463 989.223268
+L 675.696925 970.572415
+L 675.721645 851.900924
+L 675.771063 1011.205042
+L 675.79576 995.616995
+L 675.943788 755.556022
+L 676.017701 999.362348
+L 676.042324 754.684284
+L 676.066939 967.335228
+L 676.091547 976.484453
+L 676.189904 985.924016
+L 676.239038 779.487269
+L 676.288142 1004.906707
+L 676.337216 850.421161
+L 676.361743 754.445966
+L 676.386261 1008.289554
+L 676.410773 941.946791
+L 676.435277 951.091658
+L 676.459773 768.584721
+L 676.533219 783.251615
+L 676.557686 948.241941
+L 676.655481 932.407631
+L 676.753159 791.128992
+L 676.77756 1026.071339
+L 676.875091 1005.263316
+L 676.899455 997.619147
+L 676.923813 799.462509
+L 677.021169 854.532034
+L 677.045489 817.500627
+L 677.069803 866.618268
+L 677.094109 972.741163
+L 677.1427 788.92456
+L 677.166984 828.016531
+L 677.191262 761.929053
+L 677.215532 904.82703
+L 677.26405 805.610425
+L 677.288298 978.086223
+L 677.361 908.808718
+L 677.385219 794.568428
+L 677.482024 855.958557
+L 677.530384 838.819384
+L 677.602869 988.073682
+L 677.67529 825.064338
+L 677.723535 918.233014
+L 677.819939 1014.61021
+L 677.96433 851.57928
+L 677.988371 985.209303
+L 678.060449 842.084973
+L 678.084461 937.395378
+L 678.132464 761.185285
+L 678.156455 778.89108
+L 678.276302 1011.791634
+L 678.372053 762.691877
+L 678.395973 779.777274
+L 678.491584 1021.605437
+L 678.515469 962.158567
+L 678.587082 764.872055
+L 678.563218 972.952327
+L 678.610939 937.274039
+L 678.682468 889.615916
+L 678.730119 991.246475
+L 678.801543 1024.689809
+L 678.849125 758.015069
+L 678.920444 1024.818928
+L 678.944204 795.033054
+L 679.01544 851.116513
+L 679.039172 1010.562026
+L 679.110326 804.913649
+L 679.13403 822.288727
+L 679.181417 1002.475685
+L 679.228776 795.188939
+L 679.252446 873.046826
+L 679.276109 766.328068
+L 679.323413 785.812458
+L 679.37069 767.58458
+L 679.441554 1001.102554
+L 679.465162 995.622783
+L 679.488763 796.227263
+L 679.583098 902.320557
+L 679.606664 804.518964
+L 679.630224 1011.504605
+L 679.677323 952.72524
+L 679.747921 815.028355
+L 679.724395 973.245106
+L 679.794952 906.205581
+L 679.818457 973.465275
+L 679.865447 856.693549
+L 679.888932 906.884665
+L 679.935881 776.505757
+L 679.959346 964.900312
+L 679.982804 830.860128
+L 680.029699 987.92292
+L 680.076568 843.212455
+L 680.099992 813.89137
+L 680.123409 898.828654
+L 680.170223 837.233976
+L 680.217011 1017.937406
+L 680.240394 807.589601
+L 680.310505 821.091362
+L 680.333862 994.722144
+L 680.427222 950.582366
+L 680.520475 798.457209
+L 680.543771 874.275082
+L 680.567061 1007.02123
+L 680.636891 1006.991038
+L 680.68341 859.583806
+L 680.75314 914.292006
+L 680.77637 935.627506
+L 680.82281 905.36885
+L 680.84602 817.242032
+L 680.892421 1029.185167
+L 680.915611 939.954279
+L 680.938795 992.525819
+L 680.961972 831.064579
+L 680.985142 843.218263
+L 681.077758 1013.198495
+L 681.031463 811.131475
+L 681.100895 908.72132
+L 681.170268 781.033599
+L 681.14715 947.29992
+L 681.193379 900.519429
+L 681.216484 1015.865711
+L 681.285758 816.817718
+L 681.308836 788.321736
+L 681.331908 892.603106
+L 681.354973 1008.171523
+L 681.378032 782.984508
+L 681.42413 946.573513
+L 681.470202 775.907374
+L 681.493228 818.195478
+L 681.516247 1026.623503
+L 681.585267 785.252649
+L 681.654228 760.598038
+L 681.677202 901.906757
+L 681.700169 982.751857
+L 681.723131 817.790892
+L 681.746085 979.078214
+L 681.791975 760.697808
+L 681.81491 1008.106857
+L 681.837839 983.198511
+L 681.860761 982.898571
+L 681.883677 783.253426
+L 681.929489 1008.570806
+L 681.952385 826.778626
+L 681.975275 976.498909
+L 682.066771 885.64773
+L 682.089628 793.36902
+L 682.135325 1000.129564
+L 682.158163 1013.570017
+L 682.180995 978.384658
+L 682.27226 760.937665
+L 682.29506 1023.385012
+L 682.363422 916.221341
+L 682.386196 769.176431
+L 682.454482 939.78165
+L 682.477231 975.26587
+L 682.590881 773.051171
+L 682.681687 999.582471
+L 682.795051 913.7063
+L 682.840353 812.452213
+L 682.862994 887.332124
+L 682.88563 983.691578
+L 682.976107 909.336181
+L 683.066484 797.215234
+L 683.089062 993.165364
+L 683.179314 951.472977
+L 683.201861 802.773888
+L 683.269465 983.782244
+L 683.291987 930.80905
+L 683.404505 771.037335
+L 683.359517 981.473764
+L 683.42699 800.938187
+L 683.494407 1024.098939
+L 683.561769 1015.775745
+L 683.58421 1025.640251
+L 683.629075 1001.971833
+L 683.651498 1020.159462
+L 683.696325 774.150592
+L 683.763519 940.501071
+L 683.785905 1023.118677
+L 683.808285 834.076506
+L 683.830658 975.02746
+L 683.875387 993.786017
+L 683.942434 792.547836
+L 683.987101 783.257256
+L 684.054056 1011.370545
+L 684.165524 804.706236
+L 684.1878 832.41347
+L 684.210069 1014.768902
+L 684.25459 783.526208
+L 684.299086 867.345114
+L 684.321325 1004.266402
+L 684.343558 834.640143
+L 684.388005 938.667411
+L 684.476827 782.366471
+L 684.432428 950.847758
+L 684.521202 796.453726
+L 684.54338 1019.637269
+L 684.632032 919.215272
+L 684.676323 790.296997
+L 684.720588 909.258077
+L 684.76483 1015.095917
+L 684.786942 874.886911
+L 684.809048 796.225742
+L 684.853242 1022.232208
+L 684.897412 859.794235
+L 684.919488 838.514732
+L 684.985679 936.664386
+L 684.963621 807.299861
+L 685.007731 829.248893
+L 685.029777 833.559053
+L 685.139918 991.395566
+L 685.095879 787.36421
+L 685.161928 954.379441
+L 685.271889 794.255054
+L 685.249909 1028.228456
+L 685.293864 843.781097
+L 685.337795 1021.879448
+L 685.403647 852.909483
+L 685.447519 794.937727
+L 685.491367 974.566664
+L 685.557095 779.951454
+L 685.600885 964.199344
+L 685.710255 770.124222
+L 685.819478 1023.433815
+L 685.841305 770.490066
+L 685.928554 976.22143
+L 686.01571 1018.428164
+L 686.037485 794.855172
+L 686.059253 1005.034598
+L 686.146269 828.377101
+L 686.189743 759.266149
+L 686.276619 970.977288
+L 686.320023 954.732484
+L 686.40676 766.494799
+L 686.450095 1029.467379
+L 686.515053 846.342617
+L 686.558329 890.209756
+L 686.579959 1003.134646
+L 686.623201 782.712336
+L 686.644813 889.122254
+L 686.688021 890.477111
+L 686.752789 803.996218
+L 686.795939 1026.734547
+L 686.860621 890.770362
+L 686.882171 881.545752
+L 686.903714 768.76599
+L 686.946785 913.343476
+L 686.968311 778.707243
+L 686.989832 975.999899
+L 687.011347 757.563015
+L 687.075859 966.092041
+L 687.161794 763.133093
+L 687.118838 1004.676613
+L 687.183264 982.035345
+L 687.311963 827.730596
+L 687.376237 1010.057187
+L 687.440459 1004.481994
+L 687.483246 755.925842
+L 687.504631 1014.85398
+L 687.547385 993.318167
+L 687.632824 759.171629
+L 687.654169 886.615884
+L 687.675509 998.82887
+L 687.696844 794.82518
+L 687.760814 988.594469
+L 687.867319 766.075736
+L 687.994941 1028.532483
+L 688.10114 769.364519
+L 688.143581 917.978264
+L 688.164793 931.601695
+L 688.207201 778.970683
+L 688.249586 977.873371
+L 688.270771 895.49855
+L 688.313123 1029.282599
+L 688.355453 830.651889
+L 688.37661 916.573573
+L 688.461183 786.558086
+L 688.418907 988.270343
+L 688.482312 851.700271
+L 688.503436 850.02699
+L 688.566775 809.271543
+L 688.587877 1029.060366
+L 688.67223 754.5409
+L 688.714374 820.424474
+L 688.735438 836.160948
+L 688.756496 768.305929
+L 688.819638 802.98435
+L 688.924766 801.791291
+L 688.945776 989.802591
+L 689.008771 797.598799
+L 689.050741 935.014212
+L 689.071718 931.571678
+L 689.155571 787.584737
+L 689.176521 943.54526
+L 689.260266 1013.143818
+L 689.302106 772.079912
+L 689.323018 989.38995
+L 689.406613 914.542345
+L 689.427498 860.94457
+L 689.469252 937.115194
+L 689.490121 1019.516912
+L 689.510985 806.42202
+L 689.573544 960.976842
+L 689.594387 960.976842
+L 689.615224 1009.861817
+L 689.656882 871.148133
+L 689.677703 921.412469
+L 689.719329 752.906316
+L 689.740134 986.939472
+L 689.760934 905.826554
+L 689.864853 1016.960125
+L 689.823301 752.906316
+L 689.885621 960.976842
+L 689.906383 866.955641
+L 689.947892 970.503769
+L 689.968639 894.376036
+L 689.98938 995.655263
+L 690.010116 891.62
+L 690.051573 960.976842
+L 690.134422 752.906316
+L 690.155121 902.436772
+L 690.196504 1023.04172
+L 690.217187 752.906316
+L 690.258538 891.62
+L 690.279205 891.62
+L 690.320525 1004.371054
+L 690.361823 752.906316
+L 690.382465 1004.371054
+L 690.464978 842.735025
+L 690.485593 842.735025
+L 690.526807 891.62
+L 690.609174 752.906316
+L 690.629753 891.62
+L 690.712015 752.906316
+L 690.753116 981.448709
+L 690.855775 850.676265
+L 690.876291 848.225788
+L 690.958305 995.655263
+L 690.978796 891.62
+L 691.019761 752.906316
+L 691.081171 781.319423
+L 691.10163 891.62
+L 691.183417 878.246441
+L 691.22428 891.62
+L 691.265122 822.263158
+L 691.285535 960.976842
+L 691.326346 752.906316
+L 691.367137 763.723088
+L 691.469025 891.62
+L 691.550443 981.448709
+L 691.570785 752.906316
+L 691.672418 891.62
+L 691.69273 822.263158
+L 691.713036 966.467605
+L 691.773924 891.62
+L 691.79421 987.5702
+L 691.855038 891.62
+L 691.895565 981.448709
+L 691.956317 752.906316
+L 692.017023 981.448709
+L 692.077685 912.091867
+L 692.138301 891.62
+L 692.158496 1009.861817
+L 692.198872 856.941579
+L 692.239227 891.62
+L 692.279563 891.62
+L 692.299723 897.110763
+L 692.340029 822.263158
+L 692.360174 960.976842
+L 692.380315 960.976842
+L 692.40045 1009.861817
+L 692.42058 822.263158
+L 692.440706 752.906316
+L 692.460826 995.655263
+L 692.480941 960.976842
+L 692.501052 960.976842
+L 692.541258 752.906316
+L 692.62161 891.62
+L 692.641686 891.62
+L 692.701883 926.298421
+L 692.74199 891.62
+L 692.762036 891.62
+L 692.862192 752.906316
+L 692.882208 981.448709
+L 692.962225 815.419442
+L 693.002203 981.448709
+L 693.082102 752.906316
+L 693.122021 960.976842
+L 693.201802 891.62
+L 693.261586 752.906316
+L 693.301418 891.62
+L 693.361129 960.976842
+L 693.341231 752.906316
+L 693.381023 880.803228
+L 693.420797 960.976842
+L 693.500285 822.263158
+L 693.520145 822.263158
+L 693.520145 822.263158
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_13">
+ <path d="M 60.635 1038.04
+L 60.635 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_14">
+ <path d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_15">
+ <path d="M 60.635 1038.04
+L 693.54 1038.04
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_16">
+ <path d="M 60.635 745.2
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="text_45">
+ <!-- 12th-order Bessel filter, lowpass 1khz -->
+ <defs>
+ <path d="M 4.890625 31.390625
+L 31.203125 31.390625
+L 31.203125 23.390625
+L 4.890625 23.390625
+z
+" id="DejaVuSans-45"/>
+ <path d="M 30.609375 48.390625
+Q 23.390625 48.390625 19.1875 42.75
+Q 14.984375 37.109375 14.984375 27.296875
+Q 14.984375 17.484375 19.15625 11.84375
+Q 23.34375 6.203125 30.609375 6.203125
+Q 37.796875 6.203125 41.984375 11.859375
+Q 46.1875 17.53125 46.1875 27.296875
+Q 46.1875 37.015625 41.984375 42.703125
+Q 37.796875 48.390625 30.609375 48.390625
+z
+M 30.609375 56
+Q 42.328125 56 49.015625 48.375
+Q 55.71875 40.765625 55.71875 27.296875
+Q 55.71875 13.875 49.015625 6.21875
+Q 42.328125 -1.421875 30.609375 -1.421875
+Q 18.84375 -1.421875 12.171875 6.21875
+Q 5.515625 13.875 5.515625 27.296875
+Q 5.515625 40.765625 12.171875 48.375
+Q 18.84375 56 30.609375 56
+z
+" id="DejaVuSans-111"/>
+ <path d="M 37.109375 75.984375
+L 37.109375 68.5
+L 28.515625 68.5
+Q 23.6875 68.5 21.796875 66.546875
+Q 19.921875 64.59375 19.921875 59.515625
+L 19.921875 54.6875
+L 34.71875 54.6875
+L 34.71875 47.703125
+L 19.921875 47.703125
+L 19.921875 0
+L 10.890625 0
+L 10.890625 47.703125
+L 2.296875 47.703125
+L 2.296875 54.6875
+L 10.890625 54.6875
+L 10.890625 58.5
+Q 10.890625 67.625 15.140625 71.796875
+Q 19.390625 75.984375 28.609375 75.984375
+z
+" id="DejaVuSans-102"/>
+ <path d="M 11.71875 12.40625
+L 22.015625 12.40625
+L 22.015625 4
+L 14.015625 -11.625
+L 7.71875 -11.625
+L 11.71875 4
+z
+" id="DejaVuSans-44"/>
+ <path d="M 4.203125 54.6875
+L 13.1875 54.6875
+L 24.421875 12.015625
+L 35.59375 54.6875
+L 46.1875 54.6875
+L 57.421875 12.015625
+L 68.609375 54.6875
+L 77.59375 54.6875
+L 63.28125 0
+L 52.6875 0
+L 40.921875 44.828125
+L 29.109375 0
+L 18.5 0
+z
+" id="DejaVuSans-119"/>
+ </defs>
+ <g transform="translate(209.07375 33.7575)scale(0.16 -0.16)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-50"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-116"/>
+ <use x="166.455078" xlink:href="#DejaVuSans-104"/>
+ <use x="229.833984" xlink:href="#DejaVuSans-45"/>
+ <use x="265.933594" xlink:href="#DejaVuSans-111"/>
+ <use x="327.115234" xlink:href="#DejaVuSans-114"/>
+ <use x="368.212891" xlink:href="#DejaVuSans-100"/>
+ <use x="431.689453" xlink:href="#DejaVuSans-101"/>
+ <use x="493.212891" xlink:href="#DejaVuSans-114"/>
+ <use x="534.326172" xlink:href="#DejaVuSans-32"/>
+ <use x="566.113281" xlink:href="#DejaVuSans-66"/>
+ <use x="634.716797" xlink:href="#DejaVuSans-101"/>
+ <use x="696.240234" xlink:href="#DejaVuSans-115"/>
+ <use x="748.339844" xlink:href="#DejaVuSans-115"/>
+ <use x="800.439453" xlink:href="#DejaVuSans-101"/>
+ <use x="861.962891" xlink:href="#DejaVuSans-108"/>
+ <use x="889.746094" xlink:href="#DejaVuSans-32"/>
+ <use x="921.533203" xlink:href="#DejaVuSans-102"/>
+ <use x="956.738281" xlink:href="#DejaVuSans-105"/>
+ <use x="984.521484" xlink:href="#DejaVuSans-108"/>
+ <use x="1012.304688" xlink:href="#DejaVuSans-116"/>
+ <use x="1051.513672" xlink:href="#DejaVuSans-101"/>
+ <use x="1113.037109" xlink:href="#DejaVuSans-114"/>
+ <use x="1154.150391" xlink:href="#DejaVuSans-44"/>
+ <use x="1185.9375" xlink:href="#DejaVuSans-32"/>
+ <use x="1217.724609" xlink:href="#DejaVuSans-108"/>
+ <use x="1245.507812" xlink:href="#DejaVuSans-111"/>
+ <use x="1306.689453" xlink:href="#DejaVuSans-119"/>
+ <use x="1388.476562" xlink:href="#DejaVuSans-112"/>
+ <use x="1451.953125" xlink:href="#DejaVuSans-97"/>
+ <use x="1513.232422" xlink:href="#DejaVuSans-115"/>
+ <use x="1565.332031" xlink:href="#DejaVuSans-115"/>
+ <use x="1617.431641" xlink:href="#DejaVuSans-32"/>
+ <use x="1649.21875" xlink:href="#DejaVuSans-49"/>
+ <use x="1712.841797" xlink:href="#DejaVuSans-107"/>
+ <use x="1770.751953" xlink:href="#DejaVuSans-104"/>
+ <use x="1834.130859" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="pdd429ff062">
+ <rect height="292.84" width="632.905" x="60.635" y="75.6"/>
+ </clipPath>
+ <clipPath id="p4bd2d14e15">
+ <rect height="292.84" width="632.905" x="60.635" y="410.4"/>
+ </clipPath>
+ <clipPath id="p85b34b4f55">
+ <rect height="292.84" width="632.905" x="60.635" y="745.2"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/docs/docs/img/bessel_lowpass24.svg b/docs/docs/img/bessel_lowpass24.svg
@@ -0,0 +1,4983 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Created with matplotlib (https://matplotlib.org/) -->
+<svg height="1080pt" version="1.1" viewBox="0 0 720 1080" width="720pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+ </style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 1080
+L 720 1080
+L 720 0
+L 0 0
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="axes_1">
+ <g id="patch_2">
+ <path d="M 67.025 368.44
+L 693.54 368.44
+L 693.54 75.6
+L 67.025 75.6
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_1">
+ <g id="xtick_1">
+ <g id="line2d_1">
+ <path clip-path="url(#p6db0961ebd)" d="M 67.025 368.44
+L 67.025 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_2">
+ <defs>
+ <path d="M 0 0
+L 0 3.5
+" id="ma0d00544b3" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#ma0d00544b3" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- 0 -->
+ <defs>
+ <path d="M 31.78125 66.40625
+Q 24.171875 66.40625 20.328125 58.90625
+Q 16.5 51.421875 16.5 36.375
+Q 16.5 21.390625 20.328125 13.890625
+Q 24.171875 6.390625 31.78125 6.390625
+Q 39.453125 6.390625 43.28125 13.890625
+Q 47.125 21.390625 47.125 36.375
+Q 47.125 51.421875 43.28125 58.90625
+Q 39.453125 66.40625 31.78125 66.40625
+z
+M 31.78125 74.21875
+Q 44.046875 74.21875 50.515625 64.515625
+Q 56.984375 54.828125 56.984375 36.375
+Q 56.984375 17.96875 50.515625 8.265625
+Q 44.046875 -1.421875 31.78125 -1.421875
+Q 19.53125 -1.421875 13.0625 8.265625
+Q 6.59375 17.96875 6.59375 36.375
+Q 6.59375 54.828125 13.0625 64.515625
+Q 19.53125 74.21875 31.78125 74.21875
+z
+" id="DejaVuSans-48"/>
+ </defs>
+ <g transform="translate(63.84375 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_2">
+ <g id="line2d_3">
+ <path clip-path="url(#p6db0961ebd)" d="M 189.510826 368.44
+L 189.510826 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_4">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="189.510826" xlink:href="#ma0d00544b3" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- 200 -->
+ <defs>
+ <path d="M 19.1875 8.296875
+L 53.609375 8.296875
+L 53.609375 0
+L 7.328125 0
+L 7.328125 8.296875
+Q 12.9375 14.109375 22.625 23.890625
+Q 32.328125 33.6875 34.8125 36.53125
+Q 39.546875 41.84375 41.421875 45.53125
+Q 43.3125 49.21875 43.3125 52.78125
+Q 43.3125 58.59375 39.234375 62.25
+Q 35.15625 65.921875 28.609375 65.921875
+Q 23.96875 65.921875 18.8125 64.3125
+Q 13.671875 62.703125 7.8125 59.421875
+L 7.8125 69.390625
+Q 13.765625 71.78125 18.9375 73
+Q 24.125 74.21875 28.421875 74.21875
+Q 39.75 74.21875 46.484375 68.546875
+Q 53.21875 62.890625 53.21875 53.421875
+Q 53.21875 48.921875 51.53125 44.890625
+Q 49.859375 40.875 45.40625 35.40625
+Q 44.1875 33.984375 37.640625 27.21875
+Q 31.109375 20.453125 19.1875 8.296875
+z
+" id="DejaVuSans-50"/>
+ </defs>
+ <g transform="translate(179.967076 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_3">
+ <g id="line2d_5">
+ <path clip-path="url(#p6db0961ebd)" d="M 311.996652 368.44
+L 311.996652 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_6">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="311.996652" xlink:href="#ma0d00544b3" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- 400 -->
+ <defs>
+ <path d="M 37.796875 64.3125
+L 12.890625 25.390625
+L 37.796875 25.390625
+z
+M 35.203125 72.90625
+L 47.609375 72.90625
+L 47.609375 25.390625
+L 58.015625 25.390625
+L 58.015625 17.1875
+L 47.609375 17.1875
+L 47.609375 0
+L 37.796875 0
+L 37.796875 17.1875
+L 4.890625 17.1875
+L 4.890625 26.703125
+z
+" id="DejaVuSans-52"/>
+ </defs>
+ <g transform="translate(302.452902 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-52"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_4">
+ <g id="line2d_7">
+ <path clip-path="url(#p6db0961ebd)" d="M 434.482478 368.44
+L 434.482478 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_8">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="434.482478" xlink:href="#ma0d00544b3" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- 600 -->
+ <defs>
+ <path d="M 33.015625 40.375
+Q 26.375 40.375 22.484375 35.828125
+Q 18.609375 31.296875 18.609375 23.390625
+Q 18.609375 15.53125 22.484375 10.953125
+Q 26.375 6.390625 33.015625 6.390625
+Q 39.65625 6.390625 43.53125 10.953125
+Q 47.40625 15.53125 47.40625 23.390625
+Q 47.40625 31.296875 43.53125 35.828125
+Q 39.65625 40.375 33.015625 40.375
+z
+M 52.59375 71.296875
+L 52.59375 62.3125
+Q 48.875 64.0625 45.09375 64.984375
+Q 41.3125 65.921875 37.59375 65.921875
+Q 27.828125 65.921875 22.671875 59.328125
+Q 17.53125 52.734375 16.796875 39.40625
+Q 19.671875 43.65625 24.015625 45.921875
+Q 28.375 48.1875 33.59375 48.1875
+Q 44.578125 48.1875 50.953125 41.515625
+Q 57.328125 34.859375 57.328125 23.390625
+Q 57.328125 12.15625 50.6875 5.359375
+Q 44.046875 -1.421875 33.015625 -1.421875
+Q 20.359375 -1.421875 13.671875 8.265625
+Q 6.984375 17.96875 6.984375 36.375
+Q 6.984375 53.65625 15.1875 63.9375
+Q 23.390625 74.21875 37.203125 74.21875
+Q 40.921875 74.21875 44.703125 73.484375
+Q 48.484375 72.75 52.59375 71.296875
+z
+" id="DejaVuSans-54"/>
+ </defs>
+ <g transform="translate(424.938728 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-54"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_5">
+ <g id="line2d_9">
+ <path clip-path="url(#p6db0961ebd)" d="M 556.968304 368.44
+L 556.968304 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_10">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="556.968304" xlink:href="#ma0d00544b3" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- 800 -->
+ <defs>
+ <path d="M 31.78125 34.625
+Q 24.75 34.625 20.71875 30.859375
+Q 16.703125 27.09375 16.703125 20.515625
+Q 16.703125 13.921875 20.71875 10.15625
+Q 24.75 6.390625 31.78125 6.390625
+Q 38.8125 6.390625 42.859375 10.171875
+Q 46.921875 13.96875 46.921875 20.515625
+Q 46.921875 27.09375 42.890625 30.859375
+Q 38.875 34.625 31.78125 34.625
+z
+M 21.921875 38.8125
+Q 15.578125 40.375 12.03125 44.71875
+Q 8.5 49.078125 8.5 55.328125
+Q 8.5 64.0625 14.71875 69.140625
+Q 20.953125 74.21875 31.78125 74.21875
+Q 42.671875 74.21875 48.875 69.140625
+Q 55.078125 64.0625 55.078125 55.328125
+Q 55.078125 49.078125 51.53125 44.71875
+Q 48 40.375 41.703125 38.8125
+Q 48.828125 37.15625 52.796875 32.3125
+Q 56.78125 27.484375 56.78125 20.515625
+Q 56.78125 9.90625 50.3125 4.234375
+Q 43.84375 -1.421875 31.78125 -1.421875
+Q 19.734375 -1.421875 13.25 4.234375
+Q 6.78125 9.90625 6.78125 20.515625
+Q 6.78125 27.484375 10.78125 32.3125
+Q 14.796875 37.15625 21.921875 38.8125
+z
+M 18.3125 54.390625
+Q 18.3125 48.734375 21.84375 45.5625
+Q 25.390625 42.390625 31.78125 42.390625
+Q 38.140625 42.390625 41.71875 45.5625
+Q 45.3125 48.734375 45.3125 54.390625
+Q 45.3125 60.0625 41.71875 63.234375
+Q 38.140625 66.40625 31.78125 66.40625
+Q 25.390625 66.40625 21.84375 63.234375
+Q 18.3125 60.0625 18.3125 54.390625
+z
+" id="DejaVuSans-56"/>
+ </defs>
+ <g transform="translate(547.424554 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-56"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_6">
+ <g id="line2d_11">
+ <path clip-path="url(#p6db0961ebd)" d="M 679.45413 368.44
+L 679.45413 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_12">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="679.45413" xlink:href="#ma0d00544b3" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- 1000 -->
+ <defs>
+ <path d="M 12.40625 8.296875
+L 28.515625 8.296875
+L 28.515625 63.921875
+L 10.984375 60.40625
+L 10.984375 69.390625
+L 28.421875 72.90625
+L 38.28125 72.90625
+L 38.28125 8.296875
+L 54.390625 8.296875
+L 54.390625 0
+L 12.40625 0
+z
+" id="DejaVuSans-49"/>
+ </defs>
+ <g transform="translate(666.72913 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_7">
+ <!-- Samples -->
+ <defs>
+ <path d="M 53.515625 70.515625
+L 53.515625 60.890625
+Q 47.90625 63.578125 42.921875 64.890625
+Q 37.9375 66.21875 33.296875 66.21875
+Q 25.25 66.21875 20.875 63.09375
+Q 16.5 59.96875 16.5 54.203125
+Q 16.5 49.359375 19.40625 46.890625
+Q 22.3125 44.4375 30.421875 42.921875
+L 36.375 41.703125
+Q 47.40625 39.59375 52.65625 34.296875
+Q 57.90625 29 57.90625 20.125
+Q 57.90625 9.515625 50.796875 4.046875
+Q 43.703125 -1.421875 29.984375 -1.421875
+Q 24.8125 -1.421875 18.96875 -0.25
+Q 13.140625 0.921875 6.890625 3.21875
+L 6.890625 13.375
+Q 12.890625 10.015625 18.65625 8.296875
+Q 24.421875 6.59375 29.984375 6.59375
+Q 38.421875 6.59375 43.015625 9.90625
+Q 47.609375 13.234375 47.609375 19.390625
+Q 47.609375 24.75 44.3125 27.78125
+Q 41.015625 30.8125 33.5 32.328125
+L 27.484375 33.5
+Q 16.453125 35.6875 11.515625 40.375
+Q 6.59375 45.0625 6.59375 53.421875
+Q 6.59375 63.09375 13.40625 68.65625
+Q 20.21875 74.21875 32.171875 74.21875
+Q 37.3125 74.21875 42.625 73.28125
+Q 47.953125 72.359375 53.515625 70.515625
+z
+" id="DejaVuSans-83"/>
+ <path d="M 34.28125 27.484375
+Q 23.390625 27.484375 19.1875 25
+Q 14.984375 22.515625 14.984375 16.5
+Q 14.984375 11.71875 18.140625 8.90625
+Q 21.296875 6.109375 26.703125 6.109375
+Q 34.1875 6.109375 38.703125 11.40625
+Q 43.21875 16.703125 43.21875 25.484375
+L 43.21875 27.484375
+z
+M 52.203125 31.203125
+L 52.203125 0
+L 43.21875 0
+L 43.21875 8.296875
+Q 40.140625 3.328125 35.546875 0.953125
+Q 30.953125 -1.421875 24.3125 -1.421875
+Q 15.921875 -1.421875 10.953125 3.296875
+Q 6 8.015625 6 15.921875
+Q 6 25.140625 12.171875 29.828125
+Q 18.359375 34.515625 30.609375 34.515625
+L 43.21875 34.515625
+L 43.21875 35.40625
+Q 43.21875 41.609375 39.140625 45
+Q 35.0625 48.390625 27.6875 48.390625
+Q 23 48.390625 18.546875 47.265625
+Q 14.109375 46.140625 10.015625 43.890625
+L 10.015625 52.203125
+Q 14.9375 54.109375 19.578125 55.046875
+Q 24.21875 56 28.609375 56
+Q 40.484375 56 46.34375 49.84375
+Q 52.203125 43.703125 52.203125 31.203125
+z
+" id="DejaVuSans-97"/>
+ <path d="M 52 44.1875
+Q 55.375 50.25 60.0625 53.125
+Q 64.75 56 71.09375 56
+Q 79.640625 56 84.28125 50.015625
+Q 88.921875 44.046875 88.921875 33.015625
+L 88.921875 0
+L 79.890625 0
+L 79.890625 32.71875
+Q 79.890625 40.578125 77.09375 44.375
+Q 74.3125 48.1875 68.609375 48.1875
+Q 61.625 48.1875 57.5625 43.546875
+Q 53.515625 38.921875 53.515625 30.90625
+L 53.515625 0
+L 44.484375 0
+L 44.484375 32.71875
+Q 44.484375 40.625 41.703125 44.40625
+Q 38.921875 48.1875 33.109375 48.1875
+Q 26.21875 48.1875 22.15625 43.53125
+Q 18.109375 38.875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.1875 51.21875 25.484375 53.609375
+Q 29.78125 56 35.6875 56
+Q 41.65625 56 45.828125 52.96875
+Q 50 49.953125 52 44.1875
+z
+" id="DejaVuSans-109"/>
+ <path d="M 18.109375 8.203125
+L 18.109375 -20.796875
+L 9.078125 -20.796875
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+z
+M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+" id="DejaVuSans-112"/>
+ <path d="M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 0
+L 9.421875 0
+z
+" id="DejaVuSans-108"/>
+ <path d="M 56.203125 29.59375
+L 56.203125 25.203125
+L 14.890625 25.203125
+Q 15.484375 15.921875 20.484375 11.0625
+Q 25.484375 6.203125 34.421875 6.203125
+Q 39.59375 6.203125 44.453125 7.46875
+Q 49.3125 8.734375 54.109375 11.28125
+L 54.109375 2.78125
+Q 49.265625 0.734375 44.1875 -0.34375
+Q 39.109375 -1.421875 33.890625 -1.421875
+Q 20.796875 -1.421875 13.15625 6.1875
+Q 5.515625 13.8125 5.515625 26.8125
+Q 5.515625 40.234375 12.765625 48.109375
+Q 20.015625 56 32.328125 56
+Q 43.359375 56 49.78125 48.890625
+Q 56.203125 41.796875 56.203125 29.59375
+z
+M 47.21875 32.234375
+Q 47.125 39.59375 43.09375 43.984375
+Q 39.0625 48.390625 32.421875 48.390625
+Q 24.90625 48.390625 20.390625 44.140625
+Q 15.875 39.890625 15.1875 32.171875
+z
+" id="DejaVuSans-101"/>
+ <path d="M 44.28125 53.078125
+L 44.28125 44.578125
+Q 40.484375 46.53125 36.375 47.5
+Q 32.28125 48.484375 27.875 48.484375
+Q 21.1875 48.484375 17.84375 46.4375
+Q 14.5 44.390625 14.5 40.28125
+Q 14.5 37.15625 16.890625 35.375
+Q 19.28125 33.59375 26.515625 31.984375
+L 29.59375 31.296875
+Q 39.15625 29.25 43.1875 25.515625
+Q 47.21875 21.78125 47.21875 15.09375
+Q 47.21875 7.46875 41.1875 3.015625
+Q 35.15625 -1.421875 24.609375 -1.421875
+Q 20.21875 -1.421875 15.453125 -0.5625
+Q 10.6875 0.296875 5.421875 2
+L 5.421875 11.28125
+Q 10.40625 8.6875 15.234375 7.390625
+Q 20.0625 6.109375 24.8125 6.109375
+Q 31.15625 6.109375 34.5625 8.28125
+Q 37.984375 10.453125 37.984375 14.40625
+Q 37.984375 18.0625 35.515625 20.015625
+Q 33.0625 21.96875 24.703125 23.78125
+L 21.578125 24.515625
+Q 13.234375 26.265625 9.515625 29.90625
+Q 5.8125 33.546875 5.8125 39.890625
+Q 5.8125 47.609375 11.28125 51.796875
+Q 16.75 56 26.8125 56
+Q 31.78125 56 36.171875 55.265625
+Q 40.578125 54.546875 44.28125 53.078125
+z
+" id="DejaVuSans-115"/>
+ </defs>
+ <g transform="translate(358.929375 396.716563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-83"/>
+ <use x="63.476562" xlink:href="#DejaVuSans-97"/>
+ <use x="124.755859" xlink:href="#DejaVuSans-109"/>
+ <use x="222.167969" xlink:href="#DejaVuSans-112"/>
+ <use x="285.644531" xlink:href="#DejaVuSans-108"/>
+ <use x="313.427734" xlink:href="#DejaVuSans-101"/>
+ <use x="374.951172" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_2">
+ <g id="ytick_1">
+ <g id="line2d_13">
+ <path clip-path="url(#p6db0961ebd)" d="M 67.025 368.412821
+L 693.54 368.412821
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_14">
+ <defs>
+ <path d="M 0 0
+L -3.5 0
+" id="m2af44981c6" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="368.412821"/>
+ </g>
+ </g>
+ <g id="text_8">
+ <!-- 0.0000 -->
+ <defs>
+ <path d="M 10.6875 12.40625
+L 21 12.40625
+L 21 0
+L 10.6875 0
+z
+" id="DejaVuSans-46"/>
+ </defs>
+ <g transform="translate(25.034375 372.21204)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-48"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-48"/>
+ <use x="286.279297" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_2">
+ <g id="line2d_15">
+ <path clip-path="url(#p6db0961ebd)" d="M 67.025 332.916182
+L 693.54 332.916182
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_16">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="332.916182"/>
+ </g>
+ </g>
+ <g id="text_9">
+ <!-- 0.0025 -->
+ <defs>
+ <path d="M 10.796875 72.90625
+L 49.515625 72.90625
+L 49.515625 64.59375
+L 19.828125 64.59375
+L 19.828125 46.734375
+Q 21.96875 47.46875 24.109375 47.828125
+Q 26.265625 48.1875 28.421875 48.1875
+Q 40.625 48.1875 47.75 41.5
+Q 54.890625 34.8125 54.890625 23.390625
+Q 54.890625 11.625 47.5625 5.09375
+Q 40.234375 -1.421875 26.90625 -1.421875
+Q 22.3125 -1.421875 17.546875 -0.640625
+Q 12.796875 0.140625 7.71875 1.703125
+L 7.71875 11.625
+Q 12.109375 9.234375 16.796875 8.0625
+Q 21.484375 6.890625 26.703125 6.890625
+Q 35.15625 6.890625 40.078125 11.328125
+Q 45.015625 15.765625 45.015625 23.390625
+Q 45.015625 31 40.078125 35.4375
+Q 35.15625 39.890625 26.703125 39.890625
+Q 22.75 39.890625 18.8125 39.015625
+Q 14.890625 38.140625 10.796875 36.28125
+z
+" id="DejaVuSans-53"/>
+ </defs>
+ <g transform="translate(25.034375 336.715401)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-48"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-50"/>
+ <use x="286.279297" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_3">
+ <g id="line2d_17">
+ <path clip-path="url(#p6db0961ebd)" d="M 67.025 297.419543
+L 693.54 297.419543
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_18">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="297.419543"/>
+ </g>
+ </g>
+ <g id="text_10">
+ <!-- 0.0050 -->
+ <g transform="translate(25.034375 301.218762)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-48"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-53"/>
+ <use x="286.279297" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_4">
+ <g id="line2d_19">
+ <path clip-path="url(#p6db0961ebd)" d="M 67.025 261.922904
+L 693.54 261.922904
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_20">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="261.922904"/>
+ </g>
+ </g>
+ <g id="text_11">
+ <!-- 0.0075 -->
+ <defs>
+ <path d="M 8.203125 72.90625
+L 55.078125 72.90625
+L 55.078125 68.703125
+L 28.609375 0
+L 18.3125 0
+L 43.21875 64.59375
+L 8.203125 64.59375
+z
+" id="DejaVuSans-55"/>
+ </defs>
+ <g transform="translate(25.034375 265.722123)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-48"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-55"/>
+ <use x="286.279297" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_5">
+ <g id="line2d_21">
+ <path clip-path="url(#p6db0961ebd)" d="M 67.025 226.426265
+L 693.54 226.426265
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_22">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="226.426265"/>
+ </g>
+ </g>
+ <g id="text_12">
+ <!-- 0.0100 -->
+ <g transform="translate(25.034375 230.225484)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-49"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-48"/>
+ <use x="286.279297" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_6">
+ <g id="line2d_23">
+ <path clip-path="url(#p6db0961ebd)" d="M 67.025 190.929626
+L 693.54 190.929626
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_24">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="190.929626"/>
+ </g>
+ </g>
+ <g id="text_13">
+ <!-- 0.0125 -->
+ <g transform="translate(25.034375 194.728845)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-49"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-50"/>
+ <use x="286.279297" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_7">
+ <g id="line2d_25">
+ <path clip-path="url(#p6db0961ebd)" d="M 67.025 155.432987
+L 693.54 155.432987
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_26">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="155.432987"/>
+ </g>
+ </g>
+ <g id="text_14">
+ <!-- 0.0150 -->
+ <g transform="translate(25.034375 159.232206)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-49"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-53"/>
+ <use x="286.279297" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_8">
+ <g id="line2d_27">
+ <path clip-path="url(#p6db0961ebd)" d="M 67.025 119.936348
+L 693.54 119.936348
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_28">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="119.936348"/>
+ </g>
+ </g>
+ <g id="text_15">
+ <!-- 0.0175 -->
+ <g transform="translate(25.034375 123.735567)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-49"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-55"/>
+ <use x="286.279297" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_9">
+ <g id="line2d_29">
+ <path clip-path="url(#p6db0961ebd)" d="M 67.025 84.439709
+L 693.54 84.439709
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_30">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="84.439709"/>
+ </g>
+ </g>
+ <g id="text_16">
+ <!-- 0.0200 -->
+ <g transform="translate(25.034375 88.238928)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-50"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-48"/>
+ <use x="286.279297" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_17">
+ <!-- Amplitude -->
+ <defs>
+ <path d="M 34.1875 63.1875
+L 20.796875 26.90625
+L 47.609375 26.90625
+z
+M 28.609375 72.90625
+L 39.796875 72.90625
+L 67.578125 0
+L 57.328125 0
+L 50.6875 18.703125
+L 17.828125 18.703125
+L 11.1875 0
+L 0.78125 0
+z
+" id="DejaVuSans-65"/>
+ <path d="M 9.421875 54.6875
+L 18.40625 54.6875
+L 18.40625 0
+L 9.421875 0
+z
+M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 64.59375
+L 9.421875 64.59375
+z
+" id="DejaVuSans-105"/>
+ <path d="M 18.3125 70.21875
+L 18.3125 54.6875
+L 36.8125 54.6875
+L 36.8125 47.703125
+L 18.3125 47.703125
+L 18.3125 18.015625
+Q 18.3125 11.328125 20.140625 9.421875
+Q 21.96875 7.515625 27.59375 7.515625
+L 36.8125 7.515625
+L 36.8125 0
+L 27.59375 0
+Q 17.1875 0 13.234375 3.875
+Q 9.28125 7.765625 9.28125 18.015625
+L 9.28125 47.703125
+L 2.6875 47.703125
+L 2.6875 54.6875
+L 9.28125 54.6875
+L 9.28125 70.21875
+z
+" id="DejaVuSans-116"/>
+ <path d="M 8.5 21.578125
+L 8.5 54.6875
+L 17.484375 54.6875
+L 17.484375 21.921875
+Q 17.484375 14.15625 20.5 10.265625
+Q 23.53125 6.390625 29.59375 6.390625
+Q 36.859375 6.390625 41.078125 11.03125
+Q 45.3125 15.671875 45.3125 23.6875
+L 45.3125 54.6875
+L 54.296875 54.6875
+L 54.296875 0
+L 45.3125 0
+L 45.3125 8.40625
+Q 42.046875 3.421875 37.71875 1
+Q 33.40625 -1.421875 27.6875 -1.421875
+Q 18.265625 -1.421875 13.375 4.4375
+Q 8.5 10.296875 8.5 21.578125
+z
+M 31.109375 56
+z
+" id="DejaVuSans-117"/>
+ <path d="M 45.40625 46.390625
+L 45.40625 75.984375
+L 54.390625 75.984375
+L 54.390625 0
+L 45.40625 0
+L 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+z
+M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+" id="DejaVuSans-100"/>
+ </defs>
+ <g transform="translate(18.954688 247.642656)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-65"/>
+ <use x="68.408203" xlink:href="#DejaVuSans-109"/>
+ <use x="165.820312" xlink:href="#DejaVuSans-112"/>
+ <use x="229.296875" xlink:href="#DejaVuSans-108"/>
+ <use x="257.080078" xlink:href="#DejaVuSans-105"/>
+ <use x="284.863281" xlink:href="#DejaVuSans-116"/>
+ <use x="324.072266" xlink:href="#DejaVuSans-117"/>
+ <use x="387.451172" xlink:href="#DejaVuSans-100"/>
+ <use x="450.927734" xlink:href="#DejaVuSans-101"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_31">
+ <path clip-path="url(#p6db0961ebd)" d="M 67.025 368.412821
+L 104.383177 368.323807
+L 107.445323 368.114166
+L 109.895039 367.701789
+L 111.732326 367.120764
+L 112.957185 366.53379
+L 114.182043 365.72884
+L 115.406901 364.644555
+L 116.63176 363.209034
+L 117.856618 361.340057
+L 119.081476 358.945958
+L 120.306334 355.927301
+L 121.531193 352.179406
+L 122.756051 347.595793
+L 123.980909 342.072485
+L 125.205767 335.513114
+L 126.430626 327.834641
+L 127.655484 318.973473
+L 128.880342 308.891675
+L 130.71763 291.476436
+L 132.554917 271.448228
+L 134.392204 249.161467
+L 137.45435 208.676847
+L 141.128925 159.724232
+L 142.966212 137.639605
+L 144.8035 118.666295
+L 146.028358 108.262072
+L 147.253216 99.964196
+L 148.478074 93.985456
+L 149.090503 91.916837
+L 149.702933 90.481549
+L 150.315362 89.689096
+L 150.927791 89.544762
+L 151.54022 90.049559
+L 152.152649 91.200216
+L 152.765078 92.989217
+L 153.377507 95.404879
+L 153.989936 98.431471
+L 155.214795 106.235317
+L 156.439653 116.201133
+L 157.664511 128.078743
+L 159.501799 148.835234
+L 161.951515 180.274144
+L 168.075806 261.406544
+L 169.913094 282.682969
+L 171.750381 301.475403
+L 173.587669 317.532429
+L 174.812527 326.686776
+L 176.037385 334.63072
+L 177.262243 341.422052
+L 178.487102 347.140493
+L 179.71196 351.881506
+L 180.936818 355.750348
+L 182.161676 358.8566
+L 183.386535 361.309405
+L 184.611393 363.213519
+L 185.836251 364.666267
+L 187.061109 365.755392
+L 188.285968 366.557777
+L 189.510826 367.138929
+L 191.348113 367.711649
+L 193.185401 368.045891
+L 196.247546 368.314117
+L 201.146979 368.434451
+L 213.395562 368.392553
+L 693.54 368.412821
+L 693.54 368.412821
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_3">
+ <path d="M 67.025 368.44
+L 67.025 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_4">
+ <path d="M 693.54 368.44
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_5">
+ <path d="M 67.025 368.44
+L 693.54 368.44
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_6">
+ <path d="M 67.025 75.6
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_2">
+ <g id="patch_7">
+ <path d="M 67.025 703.24
+L 693.54 703.24
+L 693.54 410.4
+L 67.025 410.4
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_3">
+ <g id="xtick_7">
+ <g id="line2d_32">
+ <path clip-path="url(#pcde1009af9)" d="M 67.025 703.24
+L 67.025 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_33">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_18">
+ <!-- 10Hz -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 19.671875 72.90625
+L 19.671875 43.015625
+L 55.515625 43.015625
+L 55.515625 72.90625
+L 65.375 72.90625
+L 65.375 0
+L 55.515625 0
+L 55.515625 34.71875
+L 19.671875 34.71875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-72"/>
+ <path d="M 5.515625 54.6875
+L 48.1875 54.6875
+L 48.1875 46.484375
+L 14.40625 7.171875
+L 48.1875 7.171875
+L 48.1875 0
+L 4.296875 0
+L 4.296875 8.203125
+L 38.09375 47.515625
+L 5.515625 47.515625
+z
+" id="DejaVuSans-122"/>
+ </defs>
+ <g transform="translate(54.278125 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_8">
+ <g id="line2d_34">
+ <path clip-path="url(#pcde1009af9)" d="M 67.025 703.24
+L 67.025 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_35">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_9">
+ <g id="line2d_36">
+ <path clip-path="url(#pcde1009af9)" d="M 122.820273 703.24
+L 122.820273 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_37">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="122.820273" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_10">
+ <g id="line2d_38">
+ <path clip-path="url(#pcde1009af9)" d="M 155.458415 703.24
+L 155.458415 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_39">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="155.458415" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_11">
+ <g id="line2d_40">
+ <path clip-path="url(#pcde1009af9)" d="M 178.615545 703.24
+L 178.615545 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_41">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="178.615545" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_12">
+ <g id="line2d_42">
+ <path clip-path="url(#pcde1009af9)" d="M 196.577611 703.24
+L 196.577611 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_43">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="196.577611" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_13">
+ <g id="line2d_44">
+ <path clip-path="url(#pcde1009af9)" d="M 211.253687 703.24
+L 211.253687 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_45">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="211.253687" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_14">
+ <g id="line2d_46">
+ <path clip-path="url(#pcde1009af9)" d="M 223.662133 703.24
+L 223.662133 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_47">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="223.662133" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_15">
+ <g id="line2d_48">
+ <path clip-path="url(#pcde1009af9)" d="M 234.410818 703.24
+L 234.410818 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_49">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="234.410818" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_16">
+ <g id="line2d_50">
+ <path clip-path="url(#pcde1009af9)" d="M 243.89183 703.24
+L 243.89183 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_51">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="243.89183" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_17">
+ <g id="line2d_52">
+ <path clip-path="url(#pcde1009af9)" d="M 252.372884 703.24
+L 252.372884 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_53">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="252.372884" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_19">
+ <!-- 100Hz -->
+ <g transform="translate(236.444759 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_18">
+ <g id="line2d_54">
+ <path clip-path="url(#pcde1009af9)" d="M 252.372884 703.24
+L 252.372884 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_55">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="252.372884" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_19">
+ <g id="line2d_56">
+ <path clip-path="url(#pcde1009af9)" d="M 308.168156 703.24
+L 308.168156 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_57">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="308.168156" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_20">
+ <g id="line2d_58">
+ <path clip-path="url(#pcde1009af9)" d="M 340.806298 703.24
+L 340.806298 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_59">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="340.806298" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_21">
+ <g id="line2d_60">
+ <path clip-path="url(#pcde1009af9)" d="M 363.963429 703.24
+L 363.963429 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_61">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="363.963429" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_22">
+ <g id="line2d_62">
+ <path clip-path="url(#pcde1009af9)" d="M 381.925495 703.24
+L 381.925495 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_63">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="381.925495" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_23">
+ <g id="line2d_64">
+ <path clip-path="url(#pcde1009af9)" d="M 396.601571 703.24
+L 396.601571 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_65">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="396.601571" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_24">
+ <g id="line2d_66">
+ <path clip-path="url(#pcde1009af9)" d="M 409.010017 703.24
+L 409.010017 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_67">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="409.010017" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_25">
+ <g id="line2d_68">
+ <path clip-path="url(#pcde1009af9)" d="M 419.758702 703.24
+L 419.758702 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_69">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="419.758702" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_26">
+ <g id="line2d_70">
+ <path clip-path="url(#pcde1009af9)" d="M 429.239713 703.24
+L 429.239713 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_71">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="429.239713" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_27">
+ <g id="line2d_72">
+ <path clip-path="url(#pcde1009af9)" d="M 437.720767 703.24
+L 437.720767 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_73">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="437.720767" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_20">
+ <!-- 1kHz -->
+ <defs>
+ <path d="M 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 31.109375
+L 44.921875 54.6875
+L 56.390625 54.6875
+L 27.390625 29.109375
+L 57.625 0
+L 45.90625 0
+L 18.109375 26.703125
+L 18.109375 0
+L 9.078125 0
+z
+" id="DejaVuSans-107"/>
+ </defs>
+ <g transform="translate(425.25983 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_28">
+ <g id="line2d_74">
+ <path clip-path="url(#pcde1009af9)" d="M 437.720767 703.24
+L 437.720767 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_75">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="437.720767" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_29">
+ <g id="line2d_76">
+ <path clip-path="url(#pcde1009af9)" d="M 493.51604 703.24
+L 493.51604 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_77">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="493.51604" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_30">
+ <g id="line2d_78">
+ <path clip-path="url(#pcde1009af9)" d="M 526.154182 703.24
+L 526.154182 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_79">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="526.154182" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_31">
+ <g id="line2d_80">
+ <path clip-path="url(#pcde1009af9)" d="M 549.311313 703.24
+L 549.311313 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_81">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="549.311313" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_32">
+ <g id="line2d_82">
+ <path clip-path="url(#pcde1009af9)" d="M 567.273378 703.24
+L 567.273378 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_83">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="567.273378" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_33">
+ <g id="line2d_84">
+ <path clip-path="url(#pcde1009af9)" d="M 581.949455 703.24
+L 581.949455 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_85">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="581.949455" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_34">
+ <g id="line2d_86">
+ <path clip-path="url(#pcde1009af9)" d="M 594.357901 703.24
+L 594.357901 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_87">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="594.357901" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_35">
+ <g id="line2d_88">
+ <path clip-path="url(#pcde1009af9)" d="M 605.106585 703.24
+L 605.106585 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_89">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="605.106585" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_36">
+ <g id="line2d_90">
+ <path clip-path="url(#pcde1009af9)" d="M 614.587597 703.24
+L 614.587597 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_91">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="614.587597" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_37">
+ <g id="line2d_92">
+ <path clip-path="url(#pcde1009af9)" d="M 623.068651 703.24
+L 623.068651 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_93">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.068651" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_21">
+ <!-- 10kHz -->
+ <g transform="translate(607.426464 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_38">
+ <g id="line2d_94">
+ <path clip-path="url(#pcde1009af9)" d="M 623.068651 703.24
+L 623.068651 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_95">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.068651" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_39">
+ <g id="line2d_96">
+ <path clip-path="url(#pcde1009af9)" d="M 678.863924 703.24
+L 678.863924 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_97">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.863924" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_40">
+ <g id="line2d_98">
+ <path clip-path="url(#pcde1009af9)" d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_99">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#ma0d00544b3" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_22">
+ <!-- 24kHz -->
+ <g transform="translate(677.897812 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_23">
+ <!-- Frequency (Hz) -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 51.703125 72.90625
+L 51.703125 64.59375
+L 19.671875 64.59375
+L 19.671875 43.109375
+L 48.578125 43.109375
+L 48.578125 34.8125
+L 19.671875 34.8125
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-70"/>
+ <path d="M 41.109375 46.296875
+Q 39.59375 47.171875 37.8125 47.578125
+Q 36.03125 48 33.890625 48
+Q 26.265625 48 22.1875 43.046875
+Q 18.109375 38.09375 18.109375 28.8125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 20.953125 51.171875 25.484375 53.578125
+Q 30.03125 56 36.53125 56
+Q 37.453125 56 38.578125 55.875
+Q 39.703125 55.765625 41.0625 55.515625
+z
+" id="DejaVuSans-114"/>
+ <path d="M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+M 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+L 45.40625 54.6875
+L 54.390625 54.6875
+L 54.390625 -20.796875
+L 45.40625 -20.796875
+z
+" id="DejaVuSans-113"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-110"/>
+ <path d="M 48.78125 52.59375
+L 48.78125 44.1875
+Q 44.96875 46.296875 41.140625 47.34375
+Q 37.3125 48.390625 33.40625 48.390625
+Q 24.65625 48.390625 19.8125 42.84375
+Q 14.984375 37.3125 14.984375 27.296875
+Q 14.984375 17.28125 19.8125 11.734375
+Q 24.65625 6.203125 33.40625 6.203125
+Q 37.3125 6.203125 41.140625 7.25
+Q 44.96875 8.296875 48.78125 10.40625
+L 48.78125 2.09375
+Q 45.015625 0.34375 40.984375 -0.53125
+Q 36.96875 -1.421875 32.421875 -1.421875
+Q 20.0625 -1.421875 12.78125 6.34375
+Q 5.515625 14.109375 5.515625 27.296875
+Q 5.515625 40.671875 12.859375 48.328125
+Q 20.21875 56 33.015625 56
+Q 37.15625 56 41.109375 55.140625
+Q 45.0625 54.296875 48.78125 52.59375
+z
+" id="DejaVuSans-99"/>
+ <path d="M 32.171875 -5.078125
+Q 28.375 -14.84375 24.75 -17.8125
+Q 21.140625 -20.796875 15.09375 -20.796875
+L 7.90625 -20.796875
+L 7.90625 -13.28125
+L 13.1875 -13.28125
+Q 16.890625 -13.28125 18.9375 -11.515625
+Q 21 -9.765625 23.484375 -3.21875
+L 25.09375 0.875
+L 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 11.921875
+L 46.6875 54.6875
+L 56.203125 54.6875
+z
+" id="DejaVuSans-121"/>
+ <path id="DejaVuSans-32"/>
+ <path d="M 31 75.875
+Q 24.46875 64.65625 21.28125 53.65625
+Q 18.109375 42.671875 18.109375 31.390625
+Q 18.109375 20.125 21.3125 9.0625
+Q 24.515625 -2 31 -13.1875
+L 23.1875 -13.1875
+Q 15.875 -1.703125 12.234375 9.375
+Q 8.59375 20.453125 8.59375 31.390625
+Q 8.59375 42.28125 12.203125 53.3125
+Q 15.828125 64.359375 23.1875 75.875
+z
+" id="DejaVuSans-40"/>
+ <path d="M 8.015625 75.875
+L 15.828125 75.875
+Q 23.140625 64.359375 26.78125 53.3125
+Q 30.421875 42.28125 30.421875 31.390625
+Q 30.421875 20.453125 26.78125 9.375
+Q 23.140625 -1.703125 15.828125 -13.1875
+L 8.015625 -13.1875
+Q 14.5 -2 17.703125 9.0625
+Q 20.90625 20.125 20.90625 31.390625
+Q 20.90625 42.671875 17.703125 53.65625
+Q 14.5 64.65625 8.015625 75.875
+z
+" id="DejaVuSans-41"/>
+ </defs>
+ <g transform="translate(342.109844 731.516563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_4">
+ <g id="ytick_10">
+ <g id="line2d_100">
+ <path clip-path="url(#pcde1009af9)" d="M 67.025 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_101">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_24">
+ <!-- −160 -->
+ <defs>
+ <path d="M 10.59375 35.5
+L 73.1875 35.5
+L 73.1875 27.203125
+L 10.59375 27.203125
+z
+" id="DejaVuSans-8722"/>
+ </defs>
+ <g transform="translate(32.557813 707.039219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-54"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_11">
+ <g id="line2d_102">
+ <path clip-path="url(#pcde1009af9)" d="M 67.025 668.788235
+L 693.54 668.788235
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_103">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="668.788235"/>
+ </g>
+ </g>
+ <g id="text_25">
+ <!-- −140 -->
+ <g transform="translate(32.557813 672.587454)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-52"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_12">
+ <g id="line2d_104">
+ <path clip-path="url(#pcde1009af9)" d="M 67.025 634.336471
+L 693.54 634.336471
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_105">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="634.336471"/>
+ </g>
+ </g>
+ <g id="text_26">
+ <!-- −120 -->
+ <g transform="translate(32.557813 638.135689)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-50"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_13">
+ <g id="line2d_106">
+ <path clip-path="url(#pcde1009af9)" d="M 67.025 599.884706
+L 693.54 599.884706
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_107">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="599.884706"/>
+ </g>
+ </g>
+ <g id="text_27">
+ <!-- −100 -->
+ <g transform="translate(32.557813 603.683925)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_14">
+ <g id="line2d_108">
+ <path clip-path="url(#pcde1009af9)" d="M 67.025 565.432941
+L 693.54 565.432941
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_109">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="565.432941"/>
+ </g>
+ </g>
+ <g id="text_28">
+ <!-- −80 -->
+ <g transform="translate(38.920313 569.23216)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-56"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_15">
+ <g id="line2d_110">
+ <path clip-path="url(#pcde1009af9)" d="M 67.025 530.981176
+L 693.54 530.981176
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_111">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="530.981176"/>
+ </g>
+ </g>
+ <g id="text_29">
+ <!-- −60 -->
+ <g transform="translate(38.920313 534.780395)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-54"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_16">
+ <g id="line2d_112">
+ <path clip-path="url(#pcde1009af9)" d="M 67.025 496.529412
+L 693.54 496.529412
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_113">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="496.529412"/>
+ </g>
+ </g>
+ <g id="text_30">
+ <!-- −40 -->
+ <g transform="translate(38.920313 500.328631)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-52"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_17">
+ <g id="line2d_114">
+ <path clip-path="url(#pcde1009af9)" d="M 67.025 462.077647
+L 693.54 462.077647
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_115">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="462.077647"/>
+ </g>
+ </g>
+ <g id="text_31">
+ <!-- −20 -->
+ <g transform="translate(38.920313 465.876866)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_18">
+ <g id="line2d_116">
+ <path clip-path="url(#pcde1009af9)" d="M 67.025 427.625882
+L 693.54 427.625882
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_117">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="427.625882"/>
+ </g>
+ </g>
+ <g id="text_32">
+ <!-- 0 -->
+ <g transform="translate(53.6625 431.425101)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_33">
+ <!-- Gain (dB) -->
+ <defs>
+ <path d="M 59.515625 10.40625
+L 59.515625 29.984375
+L 43.40625 29.984375
+L 43.40625 38.09375
+L 69.28125 38.09375
+L 69.28125 6.78125
+Q 63.578125 2.734375 56.6875 0.65625
+Q 49.8125 -1.421875 42 -1.421875
+Q 24.90625 -1.421875 15.25 8.5625
+Q 5.609375 18.5625 5.609375 36.375
+Q 5.609375 54.25 15.25 64.234375
+Q 24.90625 74.21875 42 74.21875
+Q 49.125 74.21875 55.546875 72.453125
+Q 61.96875 70.703125 67.390625 67.28125
+L 67.390625 56.78125
+Q 61.921875 61.421875 55.765625 63.765625
+Q 49.609375 66.109375 42.828125 66.109375
+Q 29.4375 66.109375 22.71875 58.640625
+Q 16.015625 51.171875 16.015625 36.375
+Q 16.015625 21.625 22.71875 14.15625
+Q 29.4375 6.6875 42.828125 6.6875
+Q 48.046875 6.6875 52.140625 7.59375
+Q 56.25 8.5 59.515625 10.40625
+z
+" id="DejaVuSans-71"/>
+ <path d="M 19.671875 34.8125
+L 19.671875 8.109375
+L 35.5 8.109375
+Q 43.453125 8.109375 47.28125 11.40625
+Q 51.125 14.703125 51.125 21.484375
+Q 51.125 28.328125 47.28125 31.5625
+Q 43.453125 34.8125 35.5 34.8125
+z
+M 19.671875 64.796875
+L 19.671875 42.828125
+L 34.28125 42.828125
+Q 41.5 42.828125 45.03125 45.53125
+Q 48.578125 48.25 48.578125 53.8125
+Q 48.578125 59.328125 45.03125 62.0625
+Q 41.5 64.796875 34.28125 64.796875
+z
+M 9.8125 72.90625
+L 35.015625 72.90625
+Q 46.296875 72.90625 52.390625 68.21875
+Q 58.5 63.53125 58.5 54.890625
+Q 58.5 48.1875 55.375 44.234375
+Q 52.25 40.28125 46.1875 39.3125
+Q 53.46875 37.75 57.5 32.78125
+Q 61.53125 27.828125 61.53125 20.40625
+Q 61.53125 10.640625 54.890625 5.3125
+Q 48.25 0 35.984375 0
+L 9.8125 0
+z
+" id="DejaVuSans-66"/>
+ </defs>
+ <g transform="translate(26.478125 580.411406)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-71"/>
+ <use x="77.490234" xlink:href="#DejaVuSans-97"/>
+ <use x="138.769531" xlink:href="#DejaVuSans-105"/>
+ <use x="166.552734" xlink:href="#DejaVuSans-110"/>
+ <use x="229.931641" xlink:href="#DejaVuSans-32"/>
+ <use x="261.71875" xlink:href="#DejaVuSans-40"/>
+ <use x="300.732422" xlink:href="#DejaVuSans-100"/>
+ <use x="364.208984" xlink:href="#DejaVuSans-66"/>
+ <use x="432.8125" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_118">
+ <path clip-path="url(#pcde1009af9)" d="M -1 427.627631
+L 191.382546 427.737815
+L 236.429134 427.968799
+L 265.139885 428.326098
+L 286.259044 428.810133
+L 302.973092 429.421477
+L 316.806275 430.160862
+L 328.607204 431.029182
+L 338.897223 432.027503
+L 348.01968 433.157074
+L 356.212735 434.419332
+L 363.648377 435.815922
+L 370.454872 437.34871
+L 376.73043 439.0198
+L 382.551922 440.831564
+L 387.980646 442.78666
+L 393.066268 444.888074
+L 397.849589 447.139153
+L 402.364543 449.54366
+L 406.639648 452.105831
+L 410.699108 454.830449
+L 414.563637 457.722949
+L 418.251101 460.789534
+L 421.777018 464.037351
+L 425.15495 467.474719
+L 428.39682 471.111472
+L 431.513167 474.959458
+L 434.513348 479.033316
+L 437.405716 483.351609
+L 440.197749 487.938342
+L 442.896177 492.824484
+L 445.507073 498.048356
+L 448.035937 503.652687
+L 450.487769 509.676008
+L 452.867121 516.138592
+L 455.178157 523.02849
+L 457.793092 531.539465
+L 460.681135 541.733398
+L 464.151309 554.869948
+L 468.449834 572.093135
+L 474.046374 595.48617
+L 482.045417 629.942864
+L 493.673105 681.089583
+L 509.246403 750.635447
+L 526.468005 828.550718
+L 542.592627 902.547079
+L 545.981093 918.301568
+L 547.563068 925.417454
+L 547.923765 927.130677
+L 548.640348 930.418519
+L 548.877798 931.397407
+L 549.93774 936.45412
+L 550.1714 937.3079
+L 550.752598 940.545422
+L 551.099313 941.671885
+L 551.329629 942.781142
+L 551.559289 944.402353
+L 693.520345 944.402353
+L 693.520345 944.402353
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_8">
+ <path d="M 67.025 703.24
+L 67.025 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_9">
+ <path d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_10">
+ <path d="M 67.025 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_11">
+ <path d="M 67.025 410.4
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_3">
+ <g id="patch_12">
+ <path d="M 67.025 1038.04
+L 693.54 1038.04
+L 693.54 745.2
+L 67.025 745.2
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_5">
+ <g id="xtick_41">
+ <g id="line2d_119">
+ <path clip-path="url(#p03f2f015a4)" d="M 67.025 1038.04
+L 67.025 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_120">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_34">
+ <!-- 10Hz -->
+ <g transform="translate(54.278125 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_42">
+ <g id="line2d_121">
+ <path clip-path="url(#p03f2f015a4)" d="M 67.025 1038.04
+L 67.025 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_122">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_43">
+ <g id="line2d_123">
+ <path clip-path="url(#p03f2f015a4)" d="M 122.820273 1038.04
+L 122.820273 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_124">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="122.820273" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_44">
+ <g id="line2d_125">
+ <path clip-path="url(#p03f2f015a4)" d="M 155.458415 1038.04
+L 155.458415 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_126">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="155.458415" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_45">
+ <g id="line2d_127">
+ <path clip-path="url(#p03f2f015a4)" d="M 178.615545 1038.04
+L 178.615545 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_128">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="178.615545" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_46">
+ <g id="line2d_129">
+ <path clip-path="url(#p03f2f015a4)" d="M 196.577611 1038.04
+L 196.577611 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_130">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="196.577611" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_47">
+ <g id="line2d_131">
+ <path clip-path="url(#p03f2f015a4)" d="M 211.253687 1038.04
+L 211.253687 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_132">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="211.253687" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_48">
+ <g id="line2d_133">
+ <path clip-path="url(#p03f2f015a4)" d="M 223.662133 1038.04
+L 223.662133 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_134">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="223.662133" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_49">
+ <g id="line2d_135">
+ <path clip-path="url(#p03f2f015a4)" d="M 234.410818 1038.04
+L 234.410818 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_136">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="234.410818" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_50">
+ <g id="line2d_137">
+ <path clip-path="url(#p03f2f015a4)" d="M 243.89183 1038.04
+L 243.89183 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_138">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="243.89183" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_51">
+ <g id="line2d_139">
+ <path clip-path="url(#p03f2f015a4)" d="M 252.372884 1038.04
+L 252.372884 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_140">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="252.372884" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_35">
+ <!-- 100Hz -->
+ <g transform="translate(236.444759 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_52">
+ <g id="line2d_141">
+ <path clip-path="url(#p03f2f015a4)" d="M 252.372884 1038.04
+L 252.372884 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_142">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="252.372884" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_53">
+ <g id="line2d_143">
+ <path clip-path="url(#p03f2f015a4)" d="M 308.168156 1038.04
+L 308.168156 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_144">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="308.168156" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_54">
+ <g id="line2d_145">
+ <path clip-path="url(#p03f2f015a4)" d="M 340.806298 1038.04
+L 340.806298 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_146">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="340.806298" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_55">
+ <g id="line2d_147">
+ <path clip-path="url(#p03f2f015a4)" d="M 363.963429 1038.04
+L 363.963429 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_148">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="363.963429" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_56">
+ <g id="line2d_149">
+ <path clip-path="url(#p03f2f015a4)" d="M 381.925495 1038.04
+L 381.925495 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_150">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="381.925495" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_57">
+ <g id="line2d_151">
+ <path clip-path="url(#p03f2f015a4)" d="M 396.601571 1038.04
+L 396.601571 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_152">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="396.601571" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_58">
+ <g id="line2d_153">
+ <path clip-path="url(#p03f2f015a4)" d="M 409.010017 1038.04
+L 409.010017 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_154">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="409.010017" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_59">
+ <g id="line2d_155">
+ <path clip-path="url(#p03f2f015a4)" d="M 419.758702 1038.04
+L 419.758702 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_156">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="419.758702" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_60">
+ <g id="line2d_157">
+ <path clip-path="url(#p03f2f015a4)" d="M 429.239713 1038.04
+L 429.239713 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_158">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="429.239713" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_61">
+ <g id="line2d_159">
+ <path clip-path="url(#p03f2f015a4)" d="M 437.720767 1038.04
+L 437.720767 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_160">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="437.720767" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_36">
+ <!-- 1kHz -->
+ <g transform="translate(425.25983 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_62">
+ <g id="line2d_161">
+ <path clip-path="url(#p03f2f015a4)" d="M 437.720767 1038.04
+L 437.720767 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_162">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="437.720767" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_63">
+ <g id="line2d_163">
+ <path clip-path="url(#p03f2f015a4)" d="M 493.51604 1038.04
+L 493.51604 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_164">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="493.51604" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_64">
+ <g id="line2d_165">
+ <path clip-path="url(#p03f2f015a4)" d="M 526.154182 1038.04
+L 526.154182 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_166">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="526.154182" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_65">
+ <g id="line2d_167">
+ <path clip-path="url(#p03f2f015a4)" d="M 549.311313 1038.04
+L 549.311313 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_168">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="549.311313" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_66">
+ <g id="line2d_169">
+ <path clip-path="url(#p03f2f015a4)" d="M 567.273378 1038.04
+L 567.273378 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_170">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="567.273378" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_67">
+ <g id="line2d_171">
+ <path clip-path="url(#p03f2f015a4)" d="M 581.949455 1038.04
+L 581.949455 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_172">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="581.949455" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_68">
+ <g id="line2d_173">
+ <path clip-path="url(#p03f2f015a4)" d="M 594.357901 1038.04
+L 594.357901 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_174">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="594.357901" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_69">
+ <g id="line2d_175">
+ <path clip-path="url(#p03f2f015a4)" d="M 605.106585 1038.04
+L 605.106585 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_176">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="605.106585" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_70">
+ <g id="line2d_177">
+ <path clip-path="url(#p03f2f015a4)" d="M 614.587597 1038.04
+L 614.587597 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_178">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="614.587597" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_71">
+ <g id="line2d_179">
+ <path clip-path="url(#p03f2f015a4)" d="M 623.068651 1038.04
+L 623.068651 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_180">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.068651" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_37">
+ <!-- 10kHz -->
+ <g transform="translate(607.426464 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_72">
+ <g id="line2d_181">
+ <path clip-path="url(#p03f2f015a4)" d="M 623.068651 1038.04
+L 623.068651 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_182">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.068651" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_73">
+ <g id="line2d_183">
+ <path clip-path="url(#p03f2f015a4)" d="M 678.863924 1038.04
+L 678.863924 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_184">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.863924" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_74">
+ <g id="line2d_185">
+ <path clip-path="url(#p03f2f015a4)" d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_186">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#ma0d00544b3" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_38">
+ <!-- 24kHz -->
+ <g transform="translate(677.897812 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_39">
+ <!-- Frequency (Hz) -->
+ <g transform="translate(342.109844 1066.316563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_6">
+ <g id="ytick_19">
+ <g id="line2d_187">
+ <path clip-path="url(#p03f2f015a4)" d="M 67.025 1007.214737
+L 693.54 1007.214737
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_188">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="1007.214737"/>
+ </g>
+ </g>
+ <g id="text_40">
+ <!-- −150 -->
+ <g transform="translate(32.557813 1011.013956)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_20">
+ <g id="line2d_189">
+ <path clip-path="url(#p03f2f015a4)" d="M 67.025 968.683158
+L 693.54 968.683158
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_190">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="968.683158"/>
+ </g>
+ </g>
+ <g id="text_41">
+ <!-- −100 -->
+ <g transform="translate(32.557813 972.482377)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_21">
+ <g id="line2d_191">
+ <path clip-path="url(#p03f2f015a4)" d="M 67.025 930.151579
+L 693.54 930.151579
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_192">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="930.151579"/>
+ </g>
+ </g>
+ <g id="text_42">
+ <!-- −50 -->
+ <g transform="translate(38.920313 933.950798)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-53"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_22">
+ <g id="line2d_193">
+ <path clip-path="url(#p03f2f015a4)" d="M 67.025 891.62
+L 693.54 891.62
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_194">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="891.62"/>
+ </g>
+ </g>
+ <g id="text_43">
+ <!-- 0 -->
+ <g transform="translate(53.6625 895.419219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_23">
+ <g id="line2d_195">
+ <path clip-path="url(#p03f2f015a4)" d="M 67.025 853.088421
+L 693.54 853.088421
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_196">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="853.088421"/>
+ </g>
+ </g>
+ <g id="text_44">
+ <!-- 50 -->
+ <g transform="translate(47.3 856.88764)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-53"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_24">
+ <g id="line2d_197">
+ <path clip-path="url(#p03f2f015a4)" d="M 67.025 814.556842
+L 693.54 814.556842
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_198">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="814.556842"/>
+ </g>
+ </g>
+ <g id="text_45">
+ <!-- 100 -->
+ <g transform="translate(40.9375 818.356061)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_25">
+ <g id="line2d_199">
+ <path clip-path="url(#p03f2f015a4)" d="M 67.025 776.025263
+L 693.54 776.025263
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_200">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.025" xlink:href="#m2af44981c6" y="776.025263"/>
+ </g>
+ </g>
+ <g id="text_46">
+ <!-- 150 -->
+ <g transform="translate(40.9375 779.824482)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-53"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_47">
+ <!-- Phase (${\circ}$) -->
+ <defs>
+ <path d="M 19.671875 64.796875
+L 19.671875 37.40625
+L 32.078125 37.40625
+Q 38.96875 37.40625 42.71875 40.96875
+Q 46.484375 44.53125 46.484375 51.125
+Q 46.484375 57.671875 42.71875 61.234375
+Q 38.96875 64.796875 32.078125 64.796875
+z
+M 9.8125 72.90625
+L 32.078125 72.90625
+Q 44.34375 72.90625 50.609375 67.359375
+Q 56.890625 61.8125 56.890625 51.125
+Q 56.890625 40.328125 50.609375 34.8125
+Q 44.34375 29.296875 32.078125 29.296875
+L 19.671875 29.296875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-80"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-104"/>
+ <path d="M 31.296875 40.671875
+Q 27.390625 40.671875 24.703125 37.953125
+Q 22.015625 35.25 22.015625 31.34375
+Q 22.015625 27.484375 24.703125 24.828125
+Q 27.390625 22.171875 31.296875 22.171875
+Q 35.203125 22.171875 37.890625 24.828125
+Q 40.578125 27.484375 40.578125 31.34375
+Q 40.578125 35.203125 37.859375 37.9375
+Q 35.15625 40.671875 31.296875 40.671875
+z
+M 31.296875 46.96875
+Q 34.421875 46.96875 37.296875 45.765625
+Q 40.1875 44.578125 42.28125 42.328125
+Q 44.53125 40.140625 45.65625 37.34375
+Q 46.78125 34.5625 46.78125 31.34375
+Q 46.78125 24.90625 42.265625 20.4375
+Q 37.75 15.96875 31.203125 15.96875
+Q 24.609375 15.96875 20.21875 20.359375
+Q 15.828125 24.75 15.828125 31.34375
+Q 15.828125 37.890625 20.3125 42.421875
+Q 24.8125 46.96875 31.296875 46.96875
+z
+" id="DejaVuSans-8728"/>
+ </defs>
+ <g transform="translate(26.478125 915.17)rotate(-90)scale(0.1 -0.1)">
+ <use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-80"/>
+ <use transform="translate(60.302734 0.015625)" xlink:href="#DejaVuSans-104"/>
+ <use transform="translate(123.681641 0.015625)" xlink:href="#DejaVuSans-97"/>
+ <use transform="translate(184.960938 0.015625)" xlink:href="#DejaVuSans-115"/>
+ <use transform="translate(237.060547 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(298.583984 0.015625)" xlink:href="#DejaVuSans-32"/>
+ <use transform="translate(330.371094 0.015625)" xlink:href="#DejaVuSans-40"/>
+ <use transform="translate(369.384766 0.015625)" xlink:href="#DejaVuSans-8728"/>
+ <use transform="translate(431.982422 0.015625)" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_201">
+ <path clip-path="url(#p03f2f015a4)" d="M -1 896.247307
+L 23.996729 896.24793
+L 79.792001 900.875862
+L 112.430143 905.503796
+L 135.587274 910.131735
+L 153.54934 914.759678
+L 168.225416 919.387629
+L 180.633862 924.015588
+L 191.382546 928.643556
+L 200.863558 933.271535
+L 209.344612 937.899527
+L 217.016659 942.527532
+L 224.020689 947.155552
+L 230.463771 951.783588
+L 236.429134 956.411643
+L 241.982754 961.039716
+L 247.177819 965.667809
+L 252.057832 970.295925
+L 256.658831 974.924063
+L 261.011002 979.552226
+L 265.139885 984.180415
+L 269.067277 988.808631
+L 272.811931 993.436876
+L 276.390101 998.06515
+L 279.815961 1002.693456
+L 286.259044 1011.950168
+L 292.224407 1021.207021
+L 295.049103 1025.835504
+L 297.778027 753.036658
+L 302.973092 762.293826
+L 307.853105 771.551169
+L 312.454103 780.808697
+L 316.806275 790.066422
+L 320.935158 799.324353
+L 324.862549 808.582502
+L 328.607204 817.84088
+L 333.916528 831.728899
+L 338.897223 845.617495
+L 343.587612 859.506704
+L 348.01968 873.396562
+L 352.220401 887.287106
+L 356.212735 901.178374
+L 360.016383 915.070403
+L 364.823516 933.594353
+L 369.359677 952.119807
+L 373.653792 970.646853
+L 377.730388 989.175579
+L 381.610443 1007.70607
+L 385.312041 1026.238416
+L 386.211442 753.444434
+L 390.563613 776.613233
+L 394.692496 799.785271
+L 398.619888 822.960719
+L 403.093014 850.775999
+L 407.330601 878.596731
+L 411.356218 906.423212
+L 415.811655 938.895102
+L 420.033364 971.375688
+L 424.044649 1003.865426
+L 426.792204 1027.078202
+L 427.330638 754.293979
+L 431.513167 791.446125
+L 435.489064 828.60868
+L 439.739084 870.414228
+L 444.21221 916.779524
+L 449.271188 971.843478
+L 454.41516 1029.209142
+L 454.797563 756.022492
+L 459.250065 804.229375
+L 462.781138 840.145139
+L 466.163803 872.172604
+L 469.410031 900.70641
+L 472.530405 926.241007
+L 475.828636 951.411343
+L 479.278974 975.959705
+L 482.857144 999.711065
+L 486.283004 1021.002763
+L 487.56277 1028.623611
+L 487.816299 752.685553
+L 491.526429 773.745331
+L 495.30404 793.872186
+L 499.132523 813.043427
+L 502.997052 831.255214
+L 506.884505 848.518045
+L 510.783357 864.853132
+L 514.864652 880.985247
+L 518.921146 896.1136
+L 523.110206 910.859994
+L 527.247252 924.60778
+L 531.476885 937.905728
+L 536.053354 951.443674
+L 541.949174 967.949504
+L 542.207173 968.536297
+L 542.592627 969.685412
+L 543.990375 973.108083
+L 544.116248 973.220664
+L 544.742676 975.113217
+L 544.867378 975.168042
+L 545.240332 975.892092
+L 545.858106 977.378383
+L 545.981093 977.484051
+L 546.59323 979.675802
+L 546.715101 979.818617
+L 546.95829 979.728077
+L 547.079609 980.235255
+L 547.200747 980.247791
+L 547.563068 982.03525
+L 547.923765 982.435288
+L 548.402195 984.111684
+L 548.52136 984.941381
+L 548.640348 984.95778
+L 548.759161 985.402134
+L 548.877798 984.885105
+L 549.703401 988.152869
+L 549.820656 988.249443
+L 549.93774 987.990937
+L 550.054655 988.286551
+L 550.404383 991.084145
+L 550.520622 990.823948
+L 550.636693 991.030372
+L 550.868335 990.624255
+L 550.983907 991.690406
+L 551.099313 991.670772
+L 551.329629 993.868485
+L 551.444541 994.045932
+L 551.559289 993.419699
+L 551.673873 993.628251
+L 551.902554 992.117249
+L 552.016651 993.152868
+L 552.244361 996.686329
+L 552.357975 997.125009
+L 552.471429 995.39167
+L 552.584724 995.626237
+L 552.697859 991.996681
+L 553.261161 998.915097
+L 553.37335 994.631679
+L 553.485383 996.81643
+L 553.59726 994.167319
+L 553.820549 994.845209
+L 554.04322 999.979868
+L 554.154325 999.553886
+L 554.376076 993.209198
+L 554.486723 994.54171
+L 554.597217 991.130162
+L 554.927795 997.902438
+L 555.037687 996.76798
+L 555.147429 998.093901
+L 555.257021 993.58842
+L 555.366464 994.694501
+L 555.475759 993.69763
+L 555.584906 993.829134
+L 555.802756 999.577565
+L 555.91146 997.662765
+L 556.020018 999.217692
+L 556.236695 991.767932
+L 556.344815 990.991448
+L 556.452791 1002.028098
+L 556.560621 998.869211
+L 556.668308 1004.089916
+L 556.883249 1001.642447
+L 557.097618 997.804658
+L 557.204589 995.04127
+L 557.418105 1007.153371
+L 557.631057 1014.387358
+L 557.737322 1012.569717
+L 557.949431 1004.551156
+L 558.055277 1008.039882
+L 558.160983 1005.265498
+L 558.371981 1018.769311
+L 558.477273 1018.963363
+L 558.582427 1024.218111
+L 558.687444 1015.422976
+L 558.792324 1020.356777
+L 558.897068 1009.731606
+L 559.106148 1028.357462
+L 559.210484 764.065576
+L 559.314685 765.795589
+L 559.418752 762.865685
+L 559.522684 777.945878
+L 559.626483 1027.987088
+L 559.730147 760.020395
+L 559.937077 1023.337896
+L 560.040343 760.837294
+L 560.349347 814.368524
+L 560.452085 785.492523
+L 560.65717 971.608215
+L 560.759516 1019.777092
+L 560.861733 789.072025
+L 560.96382 832.369257
+L 561.065778 976.856645
+L 561.269306 917.477335
+L 561.472322 962.744479
+L 561.573638 959.142304
+L 561.674826 971.059986
+L 561.775888 943.144154
+L 561.876823 960.009586
+L 561.977631 922.745924
+L 562.279302 981.437206
+L 562.379608 977.874944
+L 562.479789 998.319536
+L 562.579845 986.50813
+L 562.679778 1005.939784
+L 562.879271 963.373707
+L 562.978833 971.484088
+L 563.078272 991.5286
+L 563.177587 989.132874
+L 563.375853 1012.198647
+L 563.57363 994.174413
+L 563.672337 1004.898013
+L 563.770924 1000.0114
+L 563.967734 1015.427883
+L 564.06596 758.843511
+L 564.164065 762.20486
+L 564.262051 758.01415
+L 564.359918 761.863309
+L 564.457666 1028.778321
+L 564.555296 753.575709
+L 564.652807 1016.53941
+L 564.7502 752.547391
+L 564.847476 769.283803
+L 565.1386 783.334392
+L 565.235407 803.848331
+L 565.332099 772.969319
+L 565.428674 792.282945
+L 565.525134 780.400521
+L 565.717707 808.706441
+L 565.813821 818.013929
+L 565.90982 839.098831
+L 566.005706 830.206788
+L 566.101477 835.468455
+L 566.197134 851.042166
+L 566.292678 803.068017
+L 566.57863 854.501666
+L 566.768702 876.923982
+L 566.958327 916.022437
+L 567.052972 831.545032
+L 567.241929 893.299611
+L 567.336241 902.808394
+L 567.430443 894.828538
+L 567.524535 895.034775
+L 567.618517 917.687877
+L 567.712389 915.026134
+L 567.899806 925.176821
+L 567.993351 918.99682
+L 568.086788 924.086559
+L 568.180116 921.139527
+L 568.459453 955.547911
+L 568.55235 971.096487
+L 568.645141 966.228847
+L 568.737824 983.203043
+L 568.922872 968.933551
+L 569.107495 974.27756
+L 569.199647 991.95872
+L 569.291695 988.931115
+L 569.475475 1010.292838
+L 569.567208 1009.195473
+L 569.75036 1002.138301
+L 569.933097 1017.064918
+L 570.02431 1017.458862
+L 570.11542 762.320909
+L 570.206427 769.995508
+L 570.297331 787.12688
+L 570.659924 758.426658
+L 570.750318 757.45641
+L 570.84061 789.162299
+L 570.930802 787.196044
+L 571.20077 813.451109
+L 571.290559 813.743293
+L 571.469836 798.722197
+L 571.648715 824.466587
+L 571.738006 824.10763
+L 571.827198 844.502345
+L 571.916291 839.915458
+L 572.094182 854.160029
+L 572.18298 825.823115
+L 572.625508 882.764677
+L 572.80184 907.797745
+L 572.889861 876.848873
+L 572.977786 897.946494
+L 573.065616 888.100229
+L 573.50333 936.898763
+L 573.677752 924.231481
+L 573.764821 921.334945
+L 574.025466 938.865089
+L 574.11216 948.537044
+L 574.198761 943.312835
+L 574.285269 998.638539
+L 574.371684 982.7862
+L 574.458006 993.909174
+L 574.630373 971.943616
+L 574.716419 967.770899
+L 574.802373 974.025429
+L 575.145272 1026.41957
+L 575.230769 754.274826
+L 575.316176 1007.32019
+L 575.401492 1003.55042
+L 575.571853 1011.680698
+L 575.656898 1025.900606
+L 575.741854 772.46468
+L 575.82672 792.81512
+L 575.911497 799.632959
+L 575.996185 766.414248
+L 576.080783 775.919472
+L 576.165293 781.68895
+L 576.249714 774.886701
+L 576.334047 1029.050711
+L 576.418291 779.830732
+L 576.502448 781.290841
+L 576.586516 809.975957
+L 576.670497 800.757435
+L 576.75439 807.562481
+L 576.838196 799.152675
+L 576.921915 799.753532
+L 577.005547 800.14689
+L 577.089092 809.129519
+L 577.17255 808.308463
+L 577.255922 852.689237
+L 577.339207 851.446975
+L 577.422407 830.928111
+L 577.588549 877.009774
+L 577.671491 868.446527
+L 577.754348 862.622918
+L 577.83712 864.881955
+L 577.919806 859.903737
+L 578.167358 921.393988
+L 578.249707 924.551521
+L 578.331971 856.061754
+L 578.414151 868.91708
+L 578.496248 873.326772
+L 578.905479 952.459585
+L 578.987076 913.419283
+L 579.06859 914.212756
+L 579.231372 938.649718
+L 579.31264 927.26716
+L 579.474929 962.02128
+L 579.555951 957.373023
+L 579.636892 1010.114509
+L 579.717752 962.988139
+L 579.79853 812.99055
+L 579.959844 954.131297
+L 580.04038 933.221535
+L 580.20121 993.048996
+L 580.281505 977.488257
+L 580.36172 987.937442
+L 580.441855 977.009168
+L 580.52191 1014.820511
+L 580.601886 991.233161
+L 580.681782 1004.689037
+L 580.761599 1002.037006
+L 580.841337 982.439123
+L 580.920996 1006.675997
+L 581.000577 773.229389
+L 581.080078 1024.458969
+L 581.159502 1002.575451
+L 581.238847 759.433833
+L 581.318114 978.316053
+L 581.397303 911.740895
+L 581.476414 824.107893
+L 581.555447 1004.356476
+L 581.634403 783.745992
+L 581.713282 803.81209
+L 581.870807 866.619245
+L 581.949455 822.263158
+L 582.028025 875.181001
+L 582.184937 764.187442
+L 582.341543 848.533392
+L 582.419732 822.263158
+L 582.497845 877.930288
+L 582.575883 835.685313
+L 582.653844 852.810433
+L 582.731731 880.338873
+L 582.809542 998.177721
+L 582.887278 834.524415
+L 582.964939 859.24612
+L 583.042525 858.176539
+L 583.274835 933.80099
+L 583.352123 960.976842
+L 583.429337 883.65791
+L 583.506477 929.431078
+L 583.660536 804.923947
+L 583.891072 970.813484
+L 584.044397 1017.753162
+L 584.12095 1002.863385
+L 584.197431 945.082116
+L 584.273838 946.956019
+L 584.350174 946.513362
+L 584.426437 971.335047
+L 584.502628 968.479411
+L 584.578746 975.98198
+L 584.654793 1019.052558
+L 584.730768 761.923414
+L 584.806672 960.976842
+L 584.958264 779.262624
+L 585.109572 1002.075817
+L 585.185119 994.643372
+L 585.336001 1026.330693
+L 585.411336 759.679639
+L 585.486601 775.307235
+L 585.636919 783.028686
+L 585.786958 1014.971931
+L 585.861872 753.580093
+L 585.936717 796.208156
+L 586.011492 761.097521
+L 586.086198 946.770288
+L 586.160834 811.752739
+L 586.235402 864.444148
+L 586.3099 862.400344
+L 586.38433 777.748095
+L 586.458691 852.628136
+L 586.532983 788.595858
+L 586.607207 851.068531
+L 586.681362 823.047556
+L 586.903419 912.876266
+L 587.051117 777.748095
+L 587.124865 762.742958
+L 587.419182 983.074741
+L 587.492593 861.49763
+L 587.565937 902.826182
+L 587.639215 1014.55908
+L 587.712426 1006.570802
+L 587.785571 994.029231
+L 587.858649 886.542047
+L 587.931661 942.591853
+L 588.004606 910.504783
+L 588.077486 978.316053
+L 588.29573 791.234235
+L 588.368347 824.155902
+L 588.73045 1009.545991
+L 588.802676 997.306471
+L 588.946934 760.842779
+L 589.090933 1024.566172
+L 589.234675 987.205887
+L 589.30645 995.655263
+L 589.378161 779.070277
+L 589.449808 792.343425
+L 589.521391 860.66559
+L 589.664368 778.70035
+L 589.80709 1005.043918
+L 589.94956 792.150768
+L 590.091779 860.457311
+L 590.162794 836.702733
+L 590.446229 978.140047
+L 590.516932 755.819298
+L 590.587573 873.986343
+L 590.658153 766.249096
+L 590.86952 879.269307
+L 590.939852 925.374506
+L 591.080333 860.197739
+L 591.150482 930.8743
+L 591.220569 829.691214
+L 591.290596 862.170336
+L 591.639818 1018.42979
+L 591.709481 1004.133059
+L 591.779084 781.982292
+L 591.848626 863.910314
+L 592.056894 954.451183
+L 592.264625 1011.049417
+L 592.402815 757.612216
+L 592.540768 1013.808831
+L 592.609656 784.827554
+L 592.747255 1012.122132
+L 592.815967 775.462358
+L 592.884619 826.940723
+L 592.953214 787.17679
+L 593.090228 1008.447399
+L 593.158647 875.289448
+L 593.227009 1029.174807
+L 593.295312 753.498107
+L 593.363558 791.456289
+L 593.431745 828.779526
+L 593.499875 814.465004
+L 593.567948 832.616413
+L 593.635962 918.695737
+L 593.70392 848.470927
+L 593.77182 918.857869
+L 593.839663 802.353502
+L 593.907449 810.51965
+L 594.110464 883.999644
+L 594.178022 859.838287
+L 594.312969 979.480349
+L 594.380357 928.76396
+L 594.447689 865.262198
+L 594.514965 916.625113
+L 594.582185 853.916189
+L 594.649348 890.7823
+L 594.716456 898.417439
+L 594.917444 987.732931
+L 594.984328 895.538097
+L 595.051157 977.939229
+L 595.117931 925.125521
+L 595.184649 926.050842
+L 595.251312 925.302483
+L 595.450971 979.126966
+L 595.517413 993.897983
+L 595.583802 768.121972
+L 595.650135 860.825616
+L 595.782638 985.387072
+L 595.848808 974.082222
+L 595.980984 1018.776417
+L 596.046991 1018.295632
+L 596.112944 770.864227
+L 596.178843 1013.609378
+L 596.244688 766.145754
+L 596.31048 1005.756529
+L 596.376217 790.626544
+L 596.507531 1027.10275
+L 596.573108 758.534446
+L 596.638632 796.972674
+L 596.704102 778.298841
+L 596.900193 838.797215
+L 596.965451 842.807188
+L 597.030656 752.279747
+L 597.095808 795.195702
+L 597.290949 843.868203
+L 597.355891 809.691526
+L 597.420781 889.400402
+L 597.550403 775.94835
+L 597.679817 870.139368
+L 597.873549 753.157308
+L 598.002445 936.892491
+L 598.066816 778.174382
+L 598.131135 834.265237
+L 598.323785 908.852869
+L 598.3879 920.891883
+L 598.451963 909.582193
+L 598.515975 834.928083
+L 598.579937 987.757042
+L 598.643848 957.361666
+L 598.707708 940.913459
+L 598.771517 810.834637
+L 598.835276 935.65783
+L 598.898984 930.459694
+L 599.089808 1017.28963
+L 599.216772 776.491525
+L 599.28018 907.042988
+L 599.343537 953.931963
+L 599.406845 893.815305
+L 599.470102 1008.877712
+L 599.533311 939.070301
+L 599.596469 1009.201705
+L 599.659578 982.820002
+L 599.722638 1016.964475
+L 599.785648 870.215177
+L 599.848609 932.181376
+L 599.911521 941.015444
+L 600.037197 1025.622828
+L 600.099961 799.795515
+L 600.162677 1020.050277
+L 600.287962 810.741027
+L 600.350531 821.240161
+L 600.537948 950.16859
+L 600.600324 916.22051
+L 600.72493 806.565215
+L 600.787161 796.137159
+L 600.849344 866.181156
+L 600.911478 795.255173
+L 601.097595 927.831752
+L 601.159539 805.774601
+L 601.221435 872.04788
+L 601.283283 806.140215
+L 601.468543 964.590812
+L 601.530202 951.355598
+L 601.591814 965.722945
+L 601.653378 807.053593
+L 601.714896 963.825823
+L 601.776366 760.735137
+L 601.899166 993.878262
+L 602.02178 840.766589
+L 602.083016 1020.53359
+L 602.20535 800.45307
+L 602.449461 1019.552402
+L 602.510373 755.993775
+L 602.63206 1013.039369
+L 602.692834 983.92104
+L 602.753562 853.839556
+L 602.814245 906.44515
+L 602.874882 899.517558
+L 602.996019 1022.465357
+L 603.056519 768.424047
+L 603.116974 963.903947
+L 603.177384 803.907295
+L 603.298067 994.901111
+L 603.478753 788.050723
+L 603.538891 796.492044
+L 603.598985 986.503963
+L 603.659034 814.44056
+L 603.719038 879.169199
+L 603.778997 892.829907
+L 603.838912 950.941797
+L 603.958608 775.82452
+L 604.01839 835.661638
+L 604.078127 805.956719
+L 604.197468 866.215498
+L 604.257072 814.51686
+L 604.376148 939.225908
+L 604.43562 925.754928
+L 604.495049 923.343439
+L 604.554433 809.999306
+L 604.613774 832.919547
+L 604.673071 831.050575
+L 604.732324 843.415414
+L 604.909823 978.002376
+L 604.968902 959.446846
+L 605.027938 878.252743
+L 605.086931 1024.217145
+L 605.14588 827.135402
+L 605.204786 863.180954
+L 605.381247 993.970204
+L 605.439982 976.362737
+L 605.498673 756.459746
+L 605.557322 1003.023819
+L 605.615928 816.672602
+L 605.674492 1011.998572
+L 605.733013 859.180924
+L 605.908321 1001.136143
+L 605.966672 781.896764
+L 606.024981 783.808937
+L 606.083248 801.993171
+L 606.199655 947.647982
+L 606.257796 776.239759
+L 606.315894 928.466456
+L 606.431966 766.334942
+L 606.489939 767.47208
+L 606.54787 962.382971
+L 606.60576 906.865294
+L 606.663608 960.962508
+L 606.721414 752.5304
+L 606.779179 804.445358
+L 606.836903 766.900375
+L 606.894585 780.39054
+L 607.124902 930.964379
+L 607.182378 872.508456
+L 607.239813 937.169942
+L 607.297208 831.0545
+L 607.354561 1011.262398
+L 607.411874 844.048995
+L 607.583567 935.814032
+L 607.697826 821.524092
+L 607.925859 971.832551
+L 607.982767 904.889284
+L 608.039634 909.146361
+L 608.096461 997.73657
+L 608.153248 975.596984
+L 608.209995 944.595869
+L 608.266702 850.857707
+L 608.323369 897.976206
+L 608.379996 851.194526
+L 608.436584 883.238636
+L 608.606107 967.059756
+L 608.662536 968.930935
+L 608.775275 753.019364
+L 608.831585 892.061915
+L 608.887856 1018.686567
+L 608.944088 905.402415
+L 609.00028 1013.62049
+L 609.056433 973.154663
+L 609.168622 1019.818808
+L 609.224658 754.246093
+L 609.280655 846.019658
+L 609.336613 761.401611
+L 609.504254 988.932536
+L 609.560057 1027.111915
+L 609.615821 788.530235
+L 609.671547 810.454939
+L 609.727234 830.432311
+L 609.782882 816.75308
+L 609.949597 991.788317
+L 610.005092 1029.312009
+L 610.060549 759.820354
+L 610.115968 772.684884
+L 610.171348 960.779117
+L 610.226691 899.76847
+L 610.281995 895.191996
+L 610.39249 801.26782
+L 610.447681 808.172081
+L 610.502834 787.88831
+L 610.557949 833.199926
+L 610.613026 785.488987
+L 610.723068 973.230018
+L 610.887849 822.451073
+L 610.942701 804.968923
+L 611.107034 940.472433
+L 611.161737 955.667974
+L 611.325623 853.936126
+L 611.380178 852.26335
+L 611.543621 938.084567
+L 611.598028 869.153339
+L 611.652399 929.908412
+L 611.706733 912.429152
+L 611.76103 969.767705
+L 611.81529 832.244889
+L 611.869514 920.604301
+L 611.977853 843.93398
+L 612.031968 878.559364
+L 612.194094 1006.145729
+L 612.409755 808.674029
+L 612.62484 1010.98203
+L 612.732168 779.937415
+L 612.785778 844.344869
+L 612.839352 1015.738354
+L 612.892891 940.163984
+L 612.999862 998.657126
+L 613.053294 833.239763
+L 613.106691 1023.606244
+L 613.160052 811.333325
+L 613.213378 912.703187
+L 613.266669 837.839558
+L 613.319924 1028.280088
+L 613.373144 970.851252
+L 613.426329 960.563196
+L 613.479479 809.788909
+L 613.585674 817.000848
+L 613.691729 1011.955898
+L 613.744704 950.124749
+L 613.797644 870.125045
+L 613.850549 890.55108
+L 613.90342 998.653972
+L 613.956256 975.183396
+L 614.061824 829.765727
+L 614.167254 977.938622
+L 614.219917 940.779531
+L 614.272545 967.187885
+L 614.3777 832.902586
+L 614.430225 918.445244
+L 614.482717 994.299458
+L 614.535174 910.595697
+L 614.639986 922.098065
+L 614.692341 800.413429
+L 614.849201 973.585466
+L 614.90142 859.503024
+L 614.953605 913.710536
+L 615.005757 908.598267
+L 615.057874 913.072327
+L 615.109958 966.13852
+L 615.162008 966.081219
+L 615.214025 907.54284
+L 615.266008 1008.093726
+L 615.317957 907.043483
+L 615.369873 893.228351
+L 615.473604 753.106315
+L 615.52542 1024.668012
+L 615.577202 797.127164
+L 615.73235 847.114886
+L 615.783999 788.682239
+L 615.835615 859.789939
+L 615.990266 754.882485
+L 616.247358 997.328831
+L 616.349966 763.962354
+L 616.40122 817.925327
+L 616.452442 781.413043
+L 616.503632 844.675793
+L 616.554789 773.994271
+L 616.605914 835.447426
+L 616.657006 752.684475
+L 616.810088 873.923011
+L 616.86105 870.552243
+L 616.911981 821.875344
+L 617.013745 826.766637
+L 617.064579 912.320192
+L 617.166151 902.895022
+L 617.216888 957.387791
+L 617.267594 925.672739
+L 617.318268 871.975112
+L 617.36891 982.0008
+L 617.419521 907.763864
+L 617.470099 760.797653
+L 617.520646 949.764028
+L 617.571161 940.764224
+L 617.621644 893.891861
+L 617.672096 994.265856
+L 617.722516 958.903905
+L 617.873586 858.857
+L 617.974143 995.017612
+L 618.024374 977.932894
+L 618.074574 920.117448
+L 618.17488 929.417758
+L 618.224986 926.307157
+L 618.275061 976.773312
+L 618.325105 945.48878
+L 618.375118 760.440593
+L 618.4251 1004.1579
+L 618.52497 995.370312
+L 618.574859 1011.213368
+L 618.72434 758.836575
+L 618.82384 798.129847
+L 618.923217 768.668677
+L 618.97286 781.641462
+L 619.022472 836.929849
+L 619.072054 830.785729
+L 619.220615 752.69221
+L 619.368903 876.025829
+L 619.516918 772.114548
+L 619.566196 862.18828
+L 619.615444 807.960008
+L 620.008346 942.112488
+L 620.155191 868.036214
+L 620.20408 874.306613
+L 620.252939 942.262388
+L 620.350568 938.125449
+L 620.399339 960.97917
+L 620.44808 905.974359
+L 620.496791 941.476709
+L 620.545473 938.815673
+L 620.594126 907.052492
+L 620.642749 976.203399
+L 620.739907 970.677698
+L 620.836948 1013.555728
+L 620.885425 969.857024
+L 620.933872 753.40107
+L 620.982291 985.217443
+L 621.03068 927.109281
+L 621.07904 945.644033
+L 621.127371 991.933361
+L 621.175673 991.486684
+L 621.223947 967.587994
+L 621.272191 973.752416
+L 621.320406 988.549518
+L 621.368593 916.560026
+L 621.41675 986.891218
+L 621.464879 988.115773
+L 621.512979 768.997519
+L 621.561051 999.913107
+L 621.609094 771.061602
+L 621.705093 757.377884
+L 621.800978 977.438331
+L 621.848878 761.535723
+L 621.944592 823.461453
+L 621.992406 795.452391
+L 622.040192 800.442678
+L 622.08795 817.305948
+L 622.183381 817.052271
+L 622.231053 824.656105
+L 622.278698 813.201056
+L 622.373903 862.360653
+L 622.421463 816.786432
+L 622.468995 862.777713
+L 622.516499 851.438992
+L 622.563975 875.258411
+L 622.611423 955.533295
+L 622.658843 867.708054
+L 622.706235 828.491543
+L 622.753599 834.203954
+L 623.037201 941.290023
+L 623.084371 864.833875
+L 623.178628 891.577738
+L 623.225716 888.878493
+L 623.272775 934.827175
+L 623.366812 927.395615
+L 623.460739 967.869513
+L 623.601425 797.065121
+L 623.741865 975.548333
+L 623.788624 956.733252
+L 623.835356 992.852675
+L 623.88206 753.404628
+L 623.928738 1022.942613
+L 623.975389 766.128046
+L 624.022012 806.405001
+L 624.161721 987.595484
+L 624.208237 988.492514
+L 624.254726 998.143102
+L 624.301188 794.788409
+L 624.347623 1019.589814
+L 624.394032 799.998425
+L 624.440413 760.929236
+L 624.486768 1013.863384
+L 624.533097 788.156684
+L 624.579399 762.357053
+L 624.671922 765.194213
+L 624.718144 765.25042
+L 624.76434 841.339133
+L 624.810509 838.68426
+L 624.856651 761.115853
+L 624.902767 825.156471
+L 624.948857 795.870471
+L 624.99492 800.176
+L 625.132952 879.713438
+L 625.17891 839.383783
+L 625.224842 822.570515
+L 625.270747 910.32218
+L 625.316627 850.313986
+L 625.36248 859.877035
+L 625.408308 843.392496
+L 625.454109 856.265463
+L 625.545633 966.943818
+L 625.682725 765.783991
+L 625.865151 923.388675
+L 625.910693 915.903827
+L 625.956209 917.446946
+L 626.0017 947.212467
+L 626.047165 754.068148
+L 626.092604 964.118775
+L 626.183405 872.300489
+L 626.228768 943.618096
+L 626.274105 859.496404
+L 626.364702 968.188063
+L 626.409962 799.33933
+L 626.455197 928.03167
+L 626.500407 981.427142
+L 626.545591 803.243041
+L 626.59075 858.177122
+L 626.726074 980.193256
+L 626.771132 782.296987
+L 626.816164 943.125193
+L 626.861172 957.548299
+L 626.906154 758.701995
+L 626.951111 1009.644547
+L 626.996043 879.280477
+L 627.04095 969.628255
+L 627.085831 1017.580292
+L 627.130688 967.649439
+L 627.17552 1008.38496
+L 627.354598 778.882675
+L 627.443988 977.222985
+L 627.488646 956.264304
+L 627.622471 785.476711
+L 627.756073 989.844144
+L 627.845019 1005.741133
+L 627.889454 821.394668
+L 627.978253 787.458799
+L 628.022615 1000.296164
+L 628.066953 833.083621
+L 628.111266 812.038873
+L 628.155556 1026.546433
+L 628.244061 982.335117
+L 628.376637 786.61494
+L 628.464899 1020.991944
+L 628.553065 761.226343
+L 628.641135 792.558383
+L 628.773059 944.774736
+L 628.860888 811.97111
+L 628.904767 991.131964
+L 628.948622 799.554022
+L 629.080043 881.605938
+L 629.123803 873.774819
+L 629.167538 846.400077
+L 629.21125 993.563324
+L 629.254939 874.956482
+L 629.298603 907.62454
+L 629.342244 859.04256
+L 629.385861 847.053511
+L 629.429455 856.10543
+L 629.516571 929.467985
+L 629.560094 921.986563
+L 629.603593 825.22703
+L 629.647069 914.639374
+L 629.820738 793.85005
+L 629.907432 1013.996128
+L 629.994033 1010.744778
+L 630.166956 763.469333
+L 630.210129 995.79029
+L 630.296405 869.427406
+L 630.339508 1005.38697
+L 630.425646 773.939729
+L 630.46868 908.16365
+L 630.511692 879.705097
+L 630.597645 870.543322
+L 630.683507 1013.805381
+L 630.812129 774.297924
+L 630.854957 1001.639345
+L 630.897762 797.420472
+L 630.940545 759.314214
+L 630.983305 1003.193895
+L 631.026042 786.833608
+L 631.068757 783.232019
+L 631.111448 799.340813
+L 631.154118 790.429435
+L 631.196764 912.091867
+L 631.28199 840.140724
+L 631.324569 781.786643
+L 631.409659 805.224919
+L 631.537127 953.37394
+L 631.579571 876.413366
+L 631.621993 926.298421
+L 631.664392 1028.554248
+L 631.70677 827.75392
+L 631.791457 889.922608
+L 631.833768 877.413446
+L 631.876056 885.354686
+L 631.960566 972.732918
+L 632.087164 822.263158
+L 632.213564 928.33485
+L 632.255653 919.967009
+L 632.29772 927.559619
+L 632.339765 796.300528
+L 632.381789 980.25565
+L 632.42379 960.976842
+L 632.46577 881.964905
+L 632.507727 950.16007
+L 632.549663 952.261051
+L 632.591577 917.58263
+L 632.633469 1016.12713
+L 632.717187 971.793615
+L 632.800819 981.448709
+L 632.842603 912.091867
+L 632.884364 1001.285312
+L 632.926104 1000.09613
+L 632.967822 921.412469
+L 633.009519 969.692633
+L 633.051194 975.183396
+L 633.092848 1012.456118
+L 633.13448 1004.371054
+L 633.176091 752.906316
+L 633.21768 981.448709
+L 633.259247 995.655263
+L 633.300793 761.622107
+L 633.342318 1024.842922
+L 633.383821 783.581746
+L 633.508203 752.906316
+L 633.549621 1018.44888
+L 633.591017 781.319423
+L 633.632392 798.946592
+L 633.673746 905.826554
+L 633.715079 763.723088
+L 633.880198 1009.861817
+L 633.921425 787.584737
+L 634.003816 912.091867
+L 634.044979 760.19828
+L 634.127244 856.941579
+L 634.168344 975.183396
+L 634.209424 891.62
+L 634.250483 891.62
+L 634.332537 773.378183
+L 634.373533 822.263158
+L 634.496396 891.62
+L 634.537309 902.436772
+L 634.5782 871.148133
+L 634.659922 874.819145
+L 634.700751 914.542345
+L 634.74156 848.856515
+L 634.945295 995.655263
+L 635.107912 856.941579
+L 635.148515 981.448709
+L 635.22966 931.184373
+L 635.270202 891.62
+L 635.310723 1016.12713
+L 635.391705 967.242156
+L 635.432165 787.584737
+L 635.472605 822.263158
+L 635.634161 1009.861817
+L 635.6745 752.906316
+L 635.755116 891.62
+L 635.916108 995.655263
+L 635.996483 752.906316
+L 636.03664 1024.842922
+L 636.116895 1001.920577
+L 636.237127 787.584737
+L 636.35718 1016.12713
+L 636.397158 752.906316
+L 636.477055 859.880825
+L 636.516973 773.378183
+L 636.556872 870.32803
+L 636.596751 815.523089
+L 636.63661 975.183396
+L 636.676449 752.906316
+L 636.716269 767.11287
+L 636.83561 960.976842
+L 636.954774 752.906316
+L 636.994457 995.655263
+L 637.034119 912.091867
+L 637.073763 783.581746
+L 637.113386 801.791291
+L 637.152991 959.59748
+L 637.192575 833.07993
+L 637.232141 752.906316
+L 637.271686 960.976842
+L 637.35072 842.735025
+L 637.547965 960.976842
+L 637.587356 801.791291
+L 637.626728 981.448709
+L 637.66608 811.446385
+L 637.823298 990.769311
+L 637.862555 752.906316
+L 637.901792 891.62
+L 638.01939 960.976842
+L 638.136816 926.298421
+L 638.17592 1019.516912
+L 638.293118 752.906316
+L 638.332146 790.902898
+L 638.410146 752.906316
+L 638.48807 995.655263
+L 638.643692 752.906316
+L 638.760211 1009.861817
+L 638.799014 891.62
+L 638.876562 752.906316
+L 638.915309 785.589185
+L 638.954037 1025.447732
+L 639.031436 822.263158
+L 639.070108 822.263158
+L 639.108761 752.906316
+L 639.147396 842.735025
+L 639.22461 912.091867
+L 639.263189 752.906316
+L 639.30175 891.62
+L 639.340292 981.448709
+L 639.378816 950.16007
+L 639.417322 880.803228
+L 639.494277 896.505952
+L 639.532727 968.268806
+L 639.609573 935.014212
+L 639.647968 912.091867
+L 639.724704 891.62
+L 639.763044 995.655263
+L 639.877956 856.941579
+L 639.954472 891.62
+L 639.992703 752.906316
+L 640.030916 995.655263
+L 640.183587 879.331974
+L 640.221709 960.976842
+L 640.259814 752.906316
+L 640.2979 960.976842
+L 640.335969 950.16007
+L 640.374019 960.976842
+L 640.412051 1016.12713
+L 640.450066 787.584737
+L 640.526041 822.263158
+L 640.639869 1027.293399
+L 640.677776 979.443093
+L 640.829226 801.791291
+L 640.867044 752.906316
+L 640.904844 981.448709
+L 640.980391 796.300528
+L 641.018138 814.971194
+L 641.055868 773.378183
+L 641.093579 891.62
+L 641.16895 852.055627
+L 641.281873 761.622107
+L 641.319479 793.85005
+L 641.357068 811.446385
+L 641.394638 801.791291
+L 641.432192 898.911964
+L 641.507246 882.904209
+L 641.544747 856.941579
+L 641.58223 752.906316
+L 641.619696 891.62
+L 641.694576 846.483774
+L 641.769386 931.024105
+L 641.844126 915.481649
+L 641.881471 909.497566
+L 642.030675 1001.920577
+L 642.067932 917.58263
+L 642.142396 956.973851
+L 642.179603 969.692633
+L 642.216792 796.300528
+L 642.291118 880.803228
+L 642.439565 1002.947227
+L 642.550722 752.906316
+L 642.513687 1024.481012
+L 642.58774 822.263158
+L 642.735641 1016.12713
+L 642.772574 768.747453
+L 642.809491 1023.04172
+L 642.84639 784.64549
+L 642.920137 763.306554
+L 642.993818 1012.456118
+L 643.06743 756.431124
+L 643.104211 842.735025
+L 643.140976 807.282053
+L 643.177723 853.551798
+L 643.214454 891.62
+L 643.251168 752.906316
+L 643.287866 1017.803057
+L 643.324546 805.462303
+L 643.36121 943.54526
+L 643.434488 843.197353
+L 643.507699 810.232837
+L 643.544279 878.018257
+L 643.617391 868.995988
+L 643.653921 828.11583
+L 643.726933 848.225788
+L 643.763414 849.649615
+L 643.799879 913.539019
+L 643.872759 874.61378
+L 643.945572 772.839747
+L 643.981955 979.550785
+L 644.05467 905.074613
+L 644.127319 816.772395
+L 644.199903 969.160684
+L 644.23617 881.605938
+L 644.272422 762.226918
+L 644.308656 932.563735
+L 644.381077 765.194341
+L 644.489586 967.073741
+L 644.525723 765.117726
+L 644.597949 842.022927
+L 644.706166 1003.977711
+L 644.77823 1002.34629
+L 644.814238 1025.654058
+L 644.886205 1006.008162
+L 644.922165 930.407551
+L 644.994036 1006.295773
+L 645.065843 983.247939
+L 645.137586 766.558665
+L 645.173433 841.658313
+L 645.209265 837.473037
+L 645.352432 1015.153305
+L 645.388184 760.64797
+L 645.495345 785.293086
+L 645.566706 989.127741
+L 645.602363 788.859479
+L 645.638004 764.442324
+L 645.673629 925.989657
+L 645.744833 775.361295
+L 645.85152 882.316372
+L 645.922567 872.067873
+L 645.958066 831.679746
+L 646.029019 863.376757
+L 646.064472 849.146482
+L 646.206127 980.860201
+L 646.347533 758.837716
+L 646.382846 914.56136
+L 646.453425 850.092065
+L 646.488692 764.414361
+L 646.559178 787.41634
+L 646.594398 887.738975
+L 646.664792 839.187358
+L 646.735125 969.036081
+L 646.770268 788.974224
+L 646.840508 914.98281
+L 646.875606 893.286964
+L 646.910688 923.918067
+L 647.050863 1022.519294
+L 647.085868 1013.223457
+L 647.120859 763.775475
+L 647.155834 1028.04772
+L 647.190794 927.931285
+L 647.295583 999.586544
+L 647.330483 979.984027
+L 647.365367 943.537897
+L 647.400236 777.970285
+L 647.435091 1023.68356
+L 647.46993 829.458791
+L 647.539562 995.242305
+L 647.574356 972.045343
+L 647.609135 768.590942
+L 647.643899 1027.43259
+L 647.713381 772.84741
+L 647.852167 1018.604536
+L 647.92147 989.209697
+L 647.956099 781.545808
+L 648.025313 804.805179
+L 648.129022 986.662878
+L 648.198087 950.146836
+L 648.370492 772.848766
+L 648.404928 934.156424
+L 648.473757 791.670681
+L 648.611239 941.646818
+L 648.645573 913.737307
+L 648.679892 910.215348
+L 648.714197 957.763209
+L 648.748487 857.26032
+L 648.817023 900.895367
+L 648.851269 890.29139
+L 648.8855 822.72151
+L 648.919717 918.001203
+L 648.95392 994.715143
+L 649.022281 990.336854
+L 649.05644 897.27421
+L 649.124715 979.231845
+L 649.192931 1005.613153
+L 649.227018 965.136518
+L 649.329191 754.520984
+L 649.36322 782.014589
+L 649.397235 986.744381
+L 649.465221 972.705442
+L 649.499192 784.348631
+L 649.53315 992.746545
+L 649.567093 974.943757
+L 649.601021 842.735025
+L 649.634935 1010.967521
+L 649.668835 989.569341
+L 649.702721 1006.906199
+L 649.736593 992.83047
+L 649.77045 952.968397
+L 649.804293 969.440135
+L 649.871936 1021.602567
+L 649.905737 828.356667
+L 649.973295 969.194712
+L 650.007053 1029.249765
+L 650.141943 777.974605
+L 650.310238 1006.296961
+L 650.377457 763.782435
+L 650.444621 902.981855
+L 650.478182 863.633831
+L 650.612285 1028.311377
+L 650.679253 827.997079
+L 650.746166 883.976375
+L 650.779601 893.254584
+L 650.879824 841.279928
+L 650.913204 841.781231
+L 650.94657 863.728372
+L 650.979922 1018.045659
+L 651.01326 851.188667
+L 651.046585 887.948987
+L 651.079896 898.129931
+L 651.179745 1017.370575
+L 651.146476 830.978949
+L 651.213001 950.495835
+L 651.246243 938.35283
+L 651.279471 978.035151
+L 651.312686 769.239125
+L 651.345887 1022.149842
+L 651.412248 817.190903
+L 651.478554 1014.492547
+L 651.511686 818.666729
+L 651.544805 819.706371
+L 651.577911 759.171629
+L 651.64408 965.377606
+L 651.710196 936.89197
+L 651.743233 1014.147938
+L 651.842264 762.561411
+L 651.908217 1011.496401
+L 651.941173 757.841712
+L 651.974116 752.906316
+L 652.039961 831.196454
+L 652.072863 976.049048
+L 652.105752 903.126622
+L 652.138628 766.086219
+L 652.17149 785.483755
+L 652.204338 998.679796
+L 652.269995 813.754661
+L 652.401149 895.395395
+L 652.466646 757.477338
+L 652.532089 789.133362
+L 652.695466 969.418389
+L 652.728101 752.906316
+L 652.793333 903.126622
+L 652.858512 935.014212
+L 652.891081 809.083255
+L 652.923637 893.091253
+L 652.988711 785.950153
+L 653.021227 875.548896
+L 653.086222 794.876701
+L 653.216053 990.087977
+L 653.31329 766.086219
+L 653.345676 1000.541215
+L 653.442756 945.135705
+L 653.507411 937.660276
+L 653.539719 969.692633
+L 653.604296 822.263158
+L 653.636566 847.489957
+L 653.668822 997.573791
+L 653.733296 951.467952
+L 653.797718 973.264868
+L 653.862089 778.868946
+L 653.894255 1005.669325
+L 653.958548 813.547367
+L 653.990676 774.954439
+L 654.022791 1017.857771
+L 654.054893 757.098807
+L 654.119058 923.976672
+L 654.183172 944.175987
+L 654.247236 787.584737
+L 654.279248 1017.833891
+L 654.37521 991.103804
+L 654.407171 1021.171909
+L 654.534891 752.906316
+L 654.662409 960.976842
+L 654.853308 779.872272
+L 654.91684 992.579739
+L 654.980323 880.803228
+L 655.075452 871.148133
+L 655.107137 955.48608
+L 655.202117 752.906316
+L 655.265375 1017.153781
+L 655.328583 985.406965
+L 655.360169 760.674743
+L 655.423302 812.141666
+L 655.486387 1017.464719
+L 655.51791 957.828337
+L 655.549422 756.909307
+L 655.612407 778.868946
+L 655.769656 924.696607
+L 655.801069 919.83234
+L 655.832469 937.20889
+L 655.863858 833.016266
+L 655.926598 868.63556
+L 655.95795 897.071997
+L 655.989289 863.715198
+L 656.020616 776.442108
+L 656.051932 916.200477
+L 656.114525 822.750443
+L 656.239567 952.363691
+L 656.270797 936.759342
+L 656.302015 1015.52265
+L 656.333221 763.347069
+L 656.395596 972.340891
+L 656.426766 958.371372
+L 656.551324 830.697323
+L 656.67569 956.080729
+L 656.7378 968.761853
+L 656.768838 770.82719
+L 656.799863 1000.399701
+L 656.861878 986.15903
+L 656.892868 763.539965
+L 656.985765 811.401756
+L 657.016707 999.564765
+L 657.078556 772.251008
+L 657.140356 867.396774
+L 657.20211 863.522147
+L 657.294651 889.805959
+L 657.356286 773.099657
+L 657.448651 972.3805
+L 657.540909 972.537214
+L 657.571639 780.751481
+L 657.755769 952.194252
+L 657.786416 947.450312
+L 657.817052 796.381285
+L 657.878289 876.059929
+L 657.90889 948.096126
+L 657.939479 838.807753
+L 657.970057 908.359174
+L 658.031177 773.499206
+L 658.06172 916.076584
+L 658.092251 856.764099
+L 658.183775 910.059398
+L 658.21426 786.719914
+L 658.244734 940.032928
+L 658.275195 1017.142638
+L 658.305646 798.421686
+L 658.366512 1006.849863
+L 658.396928 1015.600531
+L 658.488107 1026.484155
+L 658.518477 814.263419
+L 658.609518 1023.990012
+L 658.639842 1014.955257
+L 658.821548 771.846851
+L 658.972656 992.291833
+L 659.002844 928.888094
+L 659.03302 773.836097
+L 659.123482 835.615687
+L 659.183733 888.608184
+L 659.213842 755.957652
+L 659.243939 943.828239
+L 659.334164 884.683686
+L 659.364216 879.650105
+L 659.484314 1016.139826
+L 659.514311 796.308931
+L 659.544296 1029.242341
+L 659.604233 903.848335
+L 659.634185 853.728144
+L 659.664126 948.787631
+L 659.694055 1016.812061
+L 659.723974 752.780966
+L 659.813662 777.101323
+L 659.843536 947.987519
+L 659.933092 936.663624
+L 659.962922 761.934368
+L 659.99274 995.331188
+L 660.052345 769.909806
+L 660.141668 1000.952153
+L 660.171421 970.255734
+L 660.260613 1001.29793
+L 660.290321 777.385028
+L 660.379382 930.208637
+L 660.409046 761.121993
+L 660.468343 970.956086
+L 660.527597 811.652023
+L 660.616395 881.210659
+L 660.675539 936.992281
+L 660.73464 896.983483
+L 660.764174 850.723054
+L 660.793698 911.772829
+L 660.82321 894.396879
+L 660.882203 999.392545
+L 660.911683 931.341642
+L 660.941153 827.580013
+L 660.970611 986.245117
+L 661.000059 885.063502
+L 661.029496 911.82011
+L 661.058922 863.980115
+L 661.088338 818.872606
+L 661.17652 1022.274642
+L 661.205893 795.327323
+L 661.264606 918.732808
+L 661.323276 1028.472032
+L 661.381903 1013.443622
+L 661.411201 760.001178
+L 661.49903 882.275672
+L 661.586764 999.576034
+L 661.615987 949.879483
+L 661.6452 773.150241
+L 661.674402 1027.652939
+L 661.703594 1015.962237
+L 661.732775 1022.231445
+L 661.791105 1026.023125
+L 661.849393 778.641651
+L 661.878521 1024.461497
+L 661.936745 761.543432
+L 661.965842 774.450396
+L 662.053068 1008.596113
+L 662.082123 829.329422
+L 662.111167 853.632964
+L 662.1402 783.238746
+L 662.198236 851.643436
+L 662.25623 915.058029
+L 662.314182 894.81037
+L 662.343143 796.16437
+L 662.372093 918.011043
+L 662.429962 868.65709
+L 662.45888 861.286453
+L 662.545575 982.386434
+L 662.574452 976.274055
+L 662.603319 856.929734
+L 662.689858 895.819339
+L 662.718683 916.749845
+L 662.747499 768.21956
+L 662.776304 978.963159
+L 662.833883 793.53098
+L 662.891421 940.820063
+L 662.948918 904.786877
+L 662.977651 907.244269
+L 663.006373 1024.198794
+L 663.035086 795.566843
+L 663.063788 1017.013854
+L 663.09248 913.4973
+L 663.178495 913.754842
+L 663.235787 1026.638514
+L 663.264418 906.680071
+L 663.293039 752.995604
+L 663.321649 1024.318247
+L 663.35025 967.931343
+L 663.37884 959.672294
+L 663.40742 974.330006
+L 663.43599 1010.192871
+L 663.464549 791.602099
+L 663.550168 797.573308
+L 663.635695 820.806189
+L 663.664184 990.540066
+L 663.721132 771.613566
+L 663.891734 1027.258889
+L 663.976899 793.096885
+L 664.005268 825.392168
+L 664.14696 937.07947
+L 664.175269 779.621027
+L 664.260135 867.125606
+L 664.288404 892.22282
+L 664.316663 813.417842
+L 664.344912 951.095758
+L 664.373151 986.323878
+L 664.40138 777.419054
+L 664.486008 929.27029
+L 664.514198 904.887626
+L 664.570548 1018.038769
+L 664.598708 966.250329
+L 664.626858 864.784593
+L 664.654998 1023.922025
+L 664.71125 936.796859
+L 664.767462 771.124658
+L 664.795553 962.752862
+L 664.823634 1009.335324
+L 664.851706 805.627821
+L 664.935862 991.424649
+L 665.019931 1023.000289
+L 665.075928 755.954349
+L 665.131886 988.746225
+L 665.187805 907.027896
+L 665.21575 992.777763
+L 665.243685 988.646837
+L 665.327433 758.929904
+L 665.299527 1025.87983
+L 665.35533 774.503017
+L 665.411094 771.709219
+L 665.438961 829.213574
+L 665.466819 1010.064994
+L 665.494668 804.983859
+L 665.522506 973.673456
+L 665.578155 779.791721
+L 665.633765 894.98701
+L 665.661556 912.66463
+L 665.689337 779.428418
+L 665.74487 923.597575
+L 665.772622 810.111124
+L 665.828098 887.581341
+L 665.938935 968.736321
+L 665.966621 782.639794
+L 665.994297 995.500443
+L 666.04962 894.15484
+L 666.132534 1018.195355
+L 666.104906 859.451874
+L 666.160153 927.748558
+L 666.187763 827.3397
+L 666.215363 986.744945
+L 666.242953 887.942447
+L 666.325668 980.805224
+L 666.353221 753.931952
+L 666.380765 995.918849
+L 666.435823 976.527165
+L 666.490844 888.468135
+L 666.545827 939.206164
+L 666.600773 1005.625924
+L 666.655681 760.473378
+L 666.710552 1003.849902
+L 666.765386 756.896983
+L 666.820182 797.965661
+L 666.847566 948.075468
+L 666.874941 766.36459
+L 666.929663 790.296492
+L 666.984347 992.961007
+L 667.011675 942.116452
+L 667.120896 757.158146
+L 667.229969 983.013672
+L 667.257214 835.167889
+L 667.284449 814.642339
+L 667.447671 1021.032242
+L 667.474843 1021.915409
+L 667.529158 774.031138
+L 667.610563 895.811917
+L 667.691885 971.85091
+L 667.718974 786.829573
+L 667.746055 1012.520149
+L 667.800187 871.155901
+L 667.881319 990.888129
+L 667.908344 967.0377
+L 667.935361 765.25426
+L 667.989366 1009.313268
+L 668.016356 934.697856
+L 668.070307 1002.25374
+L 668.097269 800.324472
+L 668.124222 976.133297
+L 668.178102 786.991576
+L 668.205028 966.234562
+L 668.312642 829.077852
+L 668.393259 993.571825
+L 668.420113 824.585891
+L 668.446958 787.026595
+L 668.500622 1000.009587
+L 668.55425 895.09302
+L 668.58105 944.714992
+L 668.607842 791.880831
+L 668.741667 942.193415
+L 668.795134 940.380253
+L 668.821855 759.969208
+L 668.901963 961.324469
+L 669.008651 755.123128
+L 669.141811 1022.956941
+L 669.221602 933.147589
+L 669.248181 766.070526
+L 669.327867 925.759543
+L 669.380947 999.693701
+L 669.433991 756.120297
+L 669.460501 1019.325863
+L 669.487001 916.67639
+L 669.539976 979.796474
+L 669.592917 778.104909
+L 669.645822 790.768558
+L 669.725115 982.396253
+L 669.751529 836.623806
+L 669.777934 799.488478
+L 669.80433 851.850333
+L 669.830718 959.834329
+L 669.857097 824.109235
+L 669.909829 882.458405
+L 669.962526 817.950803
+L 670.041508 1025.93284
+L 670.015189 810.816736
+L 670.067818 824.536364
+L 670.120412 783.153288
+L 670.146697 819.680614
+L 670.251748 1016.320917
+L 670.199239 790.601341
+L 670.277989 976.652915
+L 670.409068 763.068888
+L 670.487613 969.891247
+L 670.513778 807.25802
+L 670.539934 891.62
+L 670.592221 755.428774
+L 670.618352 761.923414
+L 670.696693 1028.334517
+L 670.72279 1022.088752
+L 670.827092 795.087306
+L 670.853147 871.148133
+L 670.905231 998.399143
+L 670.93126 787.584737
+L 671.009297 812.426516
+L 671.11323 1006.573919
+L 671.217028 784.021313
+L 671.294789 949.695715
+L 671.268877 752.906316
+L 671.320693 780.082168
+L 671.346588 752.906316
+L 671.372475 792.343425
+L 671.501785 1027.065434
+L 671.605084 800.617614
+L 671.630888 974.789416
+L 671.70825 753.904805
+L 671.785538 1016.12713
+L 671.837023 921.821355
+L 671.888474 987.818951
+L 671.914187 764.173041
+L 671.965589 987.2973
+L 672.016958 932.309629
+L 672.042631 830.084991
+L 672.068295 974.462982
+L 672.119599 908.959211
+L 672.17087 859.589198
+L 672.196493 986.315602
+L 672.350062 759.548423
+L 672.375628 769.199747
+L 672.452278 1008.235785
+L 672.477812 768.268069
+L 672.554365 1004.648893
+L 672.60536 792.257351
+L 672.656323 904.608113
+L 672.681792 1022.073831
+L 672.732706 762.396794
+L 672.758152 764.227666
+L 672.834439 1002.510482
+L 672.885257 958.411507
+L 672.936042 910.504783
+L 672.961423 1022.831115
+L 673.012161 785.859294
+L 673.138866 1016.84625
+L 673.214793 774.226923
+L 673.265372 892.686705
+L 673.290649 1014.911269
+L 673.34118 782.055884
+L 673.366433 895.740863
+L 673.416917 930.338119
+L 673.467368 831.639078
+L 673.517788 1000.079192
+L 673.542986 820.179449
+L 673.568177 949.936404
+L 673.593359 754.389049
+L 673.668859 895.567014
+L 673.744288 954.918758
+L 673.769416 752.377286
+L 673.819647 962.593226
+L 673.844751 921.605829
+L 673.869847 886.879715
+L 673.894935 972.954025
+L 673.920015 1021.140521
+L 673.970153 1003.376346
+L 674.0453 755.276244
+L 674.070334 783.039995
+L 674.170391 1017.993981
+L 674.295287 757.988403
+L 674.320243 836.881343
+L 674.395064 814.277403
+L 674.419989 771.446253
+L 674.444907 867.084538
+L 674.469817 831.991314
+L 674.544499 967.74554
+L 674.594249 962.913266
+L 674.619113 845.547596
+L 674.693657 930.22372
+L 674.71849 948.988286
+L 674.792943 763.860489
+L 674.842539 891.656575
+L 674.892106 976.863609
+L 674.916877 970.206073
+L 674.941641 762.843119
+L 674.991147 986.218255
+L 675.015888 932.315009
+L 675.090066 854.685735
+L 675.114777 1001.108977
+L 675.13948 755.650125
+L 675.188864 985.992396
+L 675.213544 813.266573
+L 675.287541 982.051118
+L 675.312191 1008.710621
+L 675.336834 754.295296
+L 675.435329 826.310636
+L 675.55828 1025.556869
+L 675.63196 786.103003
+L 675.681042 890.916816
+L 675.75461 779.421496
+L 675.730095 937.458924
+L 675.803618 833.253814
+L 675.828111 826.793877
+L 675.901545 966.207452
+L 675.877074 768.920175
+L 675.926008 876.898858
+L 675.974911 781.054948
+L 675.999352 821.322062
+L 676.023786 1001.188904
+L 676.07263 793.190917
+L 676.121445 954.371107
+L 676.218986 765.294741
+L 676.243352 831.406073
+L 676.316408 978.2911
+L 676.340746 894.936186
+L 676.389398 1025.67423
+L 676.413713 827.040158
+L 676.510901 1008.961479
+L 676.535179 963.937082
+L 676.559451 792.534199
+L 676.656463 873.239955
+L 676.680697 981.122131
+L 676.704925 841.08934
+L 676.777563 938.128442
+L 676.801761 761.809042
+L 676.825952 964.575966
+L 676.898482 792.723907
+L 676.970946 754.46602
+L 677.067463 1019.046103
+L 677.091575 1014.104395
+L 677.115679 814.412982
+L 677.212023 842.385195
+L 677.236091 978.787715
+L 677.308252 790.327896
+L 677.332291 771.852607
+L 677.356323 788.111944
+L 677.45238 984.487722
+L 677.476376 971.074277
+L 677.500366 812.54696
+L 677.57229 998.279161
+L 677.596251 895.901128
+L 677.620204 833.487278
+L 677.66809 981.872301
+L 677.763775 836.759899
+L 677.787679 838.269567
+L 677.811576 979.73506
+L 677.883223 971.886173
+L 677.954806 787.451261
+L 677.978653 801.619955
+L 678.097782 1011.680409
+L 678.264268 776.606722
+L 678.288023 1005.613227
+L 678.359248 764.796103
+L 678.382975 946.887192
+L 678.430409 841.910816
+L 678.454116 1023.819413
+L 678.477815 841.861318
+L 678.572544 899.937644
+L 678.596208 1021.61626
+L 678.643517 773.537822
+L 678.667161 827.977128
+L 678.714428 945.710714
+L 678.738051 906.945127
+L 678.761667 760.62341
+L 678.808879 971.697549
+L 678.856062 786.110083
+L 678.903219 998.134546
+L 678.950347 988.884157
+L 678.973901 777.602745
+L 678.997448 1013.024763
+L 679.068048 873.926606
+L 679.11508 881.153202
+L 679.138586 768.504334
+L 679.185577 1018.715552
+L 679.256012 864.192248
+L 679.279477 835.776875
+L 679.302934 892.429743
+L 679.373267 792.380467
+L 679.420121 1027.2065
+L 679.443538 755.543484
+L 679.513748 925.942125
+L 679.537138 967.430234
+L 679.630628 784.394282
+L 679.583897 985.193106
+L 679.653984 875.878546
+L 679.677333 770.358992
+L 679.724011 965.822088
+L 679.747339 940.253119
+L 679.770661 989.072607
+L 679.793976 783.459351
+L 679.863881 1014.668584
+L 679.88717 937.786894
+L 679.933726 864.083509
+L 679.956994 1027.127688
+L 680.09646 770.664325
+L 680.166103 760.322831
+L 680.212498 1000.640364
+L 680.258867 757.872664
+L 680.328369 787.406662
+L 680.351524 1002.14032
+L 680.397812 766.114221
+L 680.420946 927.895724
+L 680.444074 778.383625
+L 680.490309 952.649252
+L 680.536518 881.823151
+L 680.559612 966.646966
+L 680.5827 812.709776
+L 680.651924 904.602344
+L 680.674985 777.002857
+L 680.721088 784.584888
+L 680.744129 1024.51307
+L 680.83623 917.081633
+L 680.928225 789.876749
+L 680.88224 989.803486
+L 680.974183 836.160975
+L 681.020114 980.043682
+L 681.043071 829.1767
+L 681.06602 968.742935
+L 681.088963 791.669911
+L 681.18067 922.137218
+L 681.249381 1029.096662
+L 681.226484 905.358714
+L 681.272272 907.386832
+L 681.318034 912.788819
+L 681.340906 827.295149
+L 681.432326 997.831837
+L 681.455165 930.969087
+L 681.477997 921.771423
+L 681.546455 909.446692
+L 681.592062 1015.40727
+L 681.728727 766.845667
+L 681.751482 766.024258
+L 681.86516 1012.832946
+L 681.819708 765.522491
+L 681.887876 1010.646527
+L 681.910586 797.440979
+L 681.978678 869.520379
+L 682.001362 1023.289549
+L 682.046712 812.715139
+L 682.069377 825.528535
+L 682.114689 879.106746
+L 682.137335 753.799741
+L 682.205235 790.470458
+L 682.318274 975.533537
+L 682.363446 773.789839
+L 682.431156 860.668888
+L 682.521347 1023.702579
+L 682.543879 959.252039
+L 682.611437 776.896034
+L 682.633944 965.881007
+L 682.701426 1001.803686
+L 682.746383 754.734023
+L 682.791315 959.762692
+L 682.836222 1027.381566
+L 682.858666 978.547252
+L 682.881104 872.548507
+L 682.94838 1016.204041
+L 682.970793 1016.35905
+L 683.082763 759.732836
+L 683.105139 1001.757639
+L 683.194578 940.040707
+L 683.261593 792.111332
+L 683.283918 1015.456036
+L 683.328551 753.648385
+L 683.417743 896.033325
+L 683.506836 968.452674
+L 683.462302 784.54326
+L 683.529094 929.194339
+L 683.551346 921.510512
+L 683.573591 979.161345
+L 683.618064 810.663027
+L 683.662512 881.964906
+L 683.795709 1014.832917
+L 683.84006 779.745288
+L 683.906539 1007.280734
+L 684.017216 803.046027
+L 684.039334 907.481085
+L 684.061445 997.557006
+L 684.08355 775.130031
+L 684.149829 922.837338
+L 684.171909 917.792798
+L 684.193984 927.352939
+L 684.216053 831.44914
+L 684.260172 936.883356
+L 684.304267 834.305406
+L 684.392385 992.713949
+L 684.370364 798.902977
+L 684.436408 987.971123
+L 684.45841 916.289146
+L 684.524381 1023.620728
+L 684.546359 931.360574
+L 684.568332 938.430638
+L 684.612258 984.428454
+L 684.678103 846.98528
+L 684.765813 805.64882
+L 684.787725 1006.636171
+L 684.875316 795.764865
+L 684.919075 920.268179
+L 684.98467 1022.066286
+L 685.02837 1015.043635
+L 685.093876 752.991341
+L 685.159328 758.377705
+L 685.290074 1002.858216
+L 685.333608 774.325393
+L 685.377119 1013.049871
+L 685.420607 814.573001
+L 685.485794 903.544775
+L 685.507512 867.211535
+L 685.529223 770.482429
+L 685.594323 957.878573
+L 685.702705 762.939066
+L 685.746017 833.220735
+L 685.767665 829.745317
+L 685.832572 985.428088
+L 685.854196 949.192565
+L 685.875814 797.182433
+L 685.919033 1028.489438
+L 685.962229 938.143716
+L 686.005402 1004.759142
+L 686.091678 779.60782
+L 686.177861 774.529656
+L 686.199393 993.551495
+L 686.263953 767.083582
+L 686.328461 867.444059
+L 686.414392 752.719026
+L 686.43586 867.24085
+L 686.457323 1011.782087
+L 686.543116 956.201304
+L 686.56455 958.334152
+L 686.585979 1018.228364
+L 686.607401 890.419447
+L 686.671635 954.424215
+L 686.7572 755.684403
+L 686.778577 946.813619
+L 686.842675 791.127707
+L 686.885378 871.493997
+L 686.906721 1004.506141
+L 686.928058 777.682645
+L 686.992037 959.302515
+L 687.077263 1019.671064
+L 687.119842 825.83771
+L 687.183668 784.525786
+L 687.226191 1016.820759
+L 687.289933 768.651786
+L 687.332399 955.131737
+L 687.353624 1014.402358
+L 687.396057 993.494868
+L 687.438468 790.565279
+L 687.459665 995.25537
+L 687.502042 817.124498
+L 687.565566 969.238341
+L 687.544397 795.420331
+L 687.58673 851.150728
+L 687.607888 790.0449
+L 687.650187 929.092383
+L 687.692464 835.65867
+L 687.755838 1002.21991
+L 687.79806 818.264369
+L 687.903517 1013.029888
+L 687.924592 940.444303
+L 687.945661 864.150063
+L 687.987784 940.891416
+L 688.008837 933.128986
+L 688.029884 1017.882523
+L 688.050926 879.498542
+L 688.114018 939.661262
+L 688.156052 831.670041
+L 688.177061 998.279757
+L 688.219063 949.29846
+L 688.282024 836.438573
+L 688.261042 992.59623
+L 688.344935 913.90108
+L 688.365895 911.145149
+L 688.386849 775.071266
+L 688.407798 966.918458
+L 688.470612 845.867031
+L 688.491539 844.943211
+L 688.51246 875.375577
+L 688.533376 793.645074
+L 688.554287 765.375781
+L 688.575192 1014.281652
+L 688.679637 958.633832
+L 688.700509 960.159668
+L 688.783946 769.765252
+L 688.846467 890.66144
+L 688.908939 1005.641108
+L 688.888121 809.841726
+L 688.929753 946.390129
+L 688.950561 757.804536
+L 688.971363 1013.04388
+L 689.033739 884.135274
+L 689.05452 973.514066
+L 689.116831 837.09745
+L 689.158345 768.903336
+L 689.179094 956.759398
+L 689.241309 924.469496
+L 689.262036 969.825227
+L 689.282758 761.770108
+L 689.324187 1012.101211
+L 689.38629 813.640715
+L 689.427665 1028.265482
+L 689.448345 767.644819
+L 689.489688 785.207483
+L 689.572311 940.800314
+L 689.634223 873.843843
+L 689.654849 877.569467
+L 689.716698 817.632428
+L 689.757904 1011.867433
+L 689.778499 776.384027
+L 689.860826 1027.458152
+L 689.881395 802.683168
+L 690.004697 989.724443
+L 689.922516 775.530328
+L 690.025228 946.770288
+L 690.066277 983.899187
+L 690.12781 752.906316
+L 690.230261 1024.203398
+L 690.250735 1014.026149
+L 690.271204 1024.575865
+L 690.291669 811.446385
+L 690.373473 991.652272
+L 690.414344 765.775281
+L 690.434772 1021.617893
+L 690.475612 981.448709
+L 690.496024 1001.920577
+L 690.516431 940.130798
+L 690.618389 796.300528
+L 690.55723 993.554282
+L 690.638765 813.547367
+L 690.659136 944.175987
+L 690.740568 836.469712
+L 690.801588 808.889598
+L 690.781253 842.735025
+L 690.842242 825.019194
+L 690.862561 992.716017
+L 690.943788 891.62
+L 691.045206 752.906316
+L 691.16674 1024.842922
+L 691.267877 926.298421
+L 691.28809 981.448709
+L 691.368888 752.906316
+L 691.328499 995.655263
+L 691.389075 995.655263
+L 691.409257 995.655263
+L 691.429434 974.350402
+L 691.530242 752.906316
+L 691.510091 995.655263
+L 691.550389 822.263158
+L 691.590667 752.906316
+L 691.651046 1009.861817
+L 691.771669 752.906316
+L 691.731481 1024.842922
+L 691.791755 773.378183
+L 691.831913 822.263158
+L 691.851984 752.906316
+L 691.972306 891.62
+L 692.012374 891.62
+L 692.052421 818.820624
+L 692.132456 842.735025
+L 692.152453 912.091867
+L 692.172444 822.263158
+L 692.25236 891.62
+L 692.312246 891.62
+L 692.332197 1014.492547
+L 692.411955 960.976842
+L 692.511541 752.906316
+L 692.551342 822.263158
+L 692.571234 891.62
+L 692.591122 752.906316
+L 692.630883 752.906316
+L 692.650756 752.906316
+L 692.769891 981.448709
+L 692.908659 752.906316
+L 692.987848 960.976842
+L 693.047189 891.62
+L 693.086725 891.62
+L 693.106486 960.976842
+L 693.145993 752.906316
+L 693.18548 891.62
+L 693.244675 752.906316
+L 693.284115 856.941579
+L 693.323535 891.62
+L 693.343237 752.906316
+L 693.422 891.62
+L 693.441679 960.976842
+L 693.500686 891.62
+L 693.520345 822.263158
+L 693.520345 822.263158
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_13">
+ <path d="M 67.025 1038.04
+L 67.025 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_14">
+ <path d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_15">
+ <path d="M 67.025 1038.04
+L 693.54 1038.04
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_16">
+ <path d="M 67.025 745.2
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="text_48">
+ <!-- 24th-order Bessel filter, lowpass 1khz -->
+ <defs>
+ <path d="M 4.890625 31.390625
+L 31.203125 31.390625
+L 31.203125 23.390625
+L 4.890625 23.390625
+z
+" id="DejaVuSans-45"/>
+ <path d="M 30.609375 48.390625
+Q 23.390625 48.390625 19.1875 42.75
+Q 14.984375 37.109375 14.984375 27.296875
+Q 14.984375 17.484375 19.15625 11.84375
+Q 23.34375 6.203125 30.609375 6.203125
+Q 37.796875 6.203125 41.984375 11.859375
+Q 46.1875 17.53125 46.1875 27.296875
+Q 46.1875 37.015625 41.984375 42.703125
+Q 37.796875 48.390625 30.609375 48.390625
+z
+M 30.609375 56
+Q 42.328125 56 49.015625 48.375
+Q 55.71875 40.765625 55.71875 27.296875
+Q 55.71875 13.875 49.015625 6.21875
+Q 42.328125 -1.421875 30.609375 -1.421875
+Q 18.84375 -1.421875 12.171875 6.21875
+Q 5.515625 13.875 5.515625 27.296875
+Q 5.515625 40.765625 12.171875 48.375
+Q 18.84375 56 30.609375 56
+z
+" id="DejaVuSans-111"/>
+ <path d="M 37.109375 75.984375
+L 37.109375 68.5
+L 28.515625 68.5
+Q 23.6875 68.5 21.796875 66.546875
+Q 19.921875 64.59375 19.921875 59.515625
+L 19.921875 54.6875
+L 34.71875 54.6875
+L 34.71875 47.703125
+L 19.921875 47.703125
+L 19.921875 0
+L 10.890625 0
+L 10.890625 47.703125
+L 2.296875 47.703125
+L 2.296875 54.6875
+L 10.890625 54.6875
+L 10.890625 58.5
+Q 10.890625 67.625 15.140625 71.796875
+Q 19.390625 75.984375 28.609375 75.984375
+z
+" id="DejaVuSans-102"/>
+ <path d="M 11.71875 12.40625
+L 22.015625 12.40625
+L 22.015625 4
+L 14.015625 -11.625
+L 7.71875 -11.625
+L 11.71875 4
+z
+" id="DejaVuSans-44"/>
+ <path d="M 4.203125 54.6875
+L 13.1875 54.6875
+L 24.421875 12.015625
+L 35.59375 54.6875
+L 46.1875 54.6875
+L 57.421875 12.015625
+L 68.609375 54.6875
+L 77.59375 54.6875
+L 63.28125 0
+L 52.6875 0
+L 40.921875 44.828125
+L 29.109375 0
+L 18.5 0
+z
+" id="DejaVuSans-119"/>
+ </defs>
+ <g transform="translate(209.07375 33.7575)scale(0.16 -0.16)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-116"/>
+ <use x="166.455078" xlink:href="#DejaVuSans-104"/>
+ <use x="229.833984" xlink:href="#DejaVuSans-45"/>
+ <use x="265.933594" xlink:href="#DejaVuSans-111"/>
+ <use x="327.115234" xlink:href="#DejaVuSans-114"/>
+ <use x="368.212891" xlink:href="#DejaVuSans-100"/>
+ <use x="431.689453" xlink:href="#DejaVuSans-101"/>
+ <use x="493.212891" xlink:href="#DejaVuSans-114"/>
+ <use x="534.326172" xlink:href="#DejaVuSans-32"/>
+ <use x="566.113281" xlink:href="#DejaVuSans-66"/>
+ <use x="634.716797" xlink:href="#DejaVuSans-101"/>
+ <use x="696.240234" xlink:href="#DejaVuSans-115"/>
+ <use x="748.339844" xlink:href="#DejaVuSans-115"/>
+ <use x="800.439453" xlink:href="#DejaVuSans-101"/>
+ <use x="861.962891" xlink:href="#DejaVuSans-108"/>
+ <use x="889.746094" xlink:href="#DejaVuSans-32"/>
+ <use x="921.533203" xlink:href="#DejaVuSans-102"/>
+ <use x="956.738281" xlink:href="#DejaVuSans-105"/>
+ <use x="984.521484" xlink:href="#DejaVuSans-108"/>
+ <use x="1012.304688" xlink:href="#DejaVuSans-116"/>
+ <use x="1051.513672" xlink:href="#DejaVuSans-101"/>
+ <use x="1113.037109" xlink:href="#DejaVuSans-114"/>
+ <use x="1154.150391" xlink:href="#DejaVuSans-44"/>
+ <use x="1185.9375" xlink:href="#DejaVuSans-32"/>
+ <use x="1217.724609" xlink:href="#DejaVuSans-108"/>
+ <use x="1245.507812" xlink:href="#DejaVuSans-111"/>
+ <use x="1306.689453" xlink:href="#DejaVuSans-119"/>
+ <use x="1388.476562" xlink:href="#DejaVuSans-112"/>
+ <use x="1451.953125" xlink:href="#DejaVuSans-97"/>
+ <use x="1513.232422" xlink:href="#DejaVuSans-115"/>
+ <use x="1565.332031" xlink:href="#DejaVuSans-115"/>
+ <use x="1617.431641" xlink:href="#DejaVuSans-32"/>
+ <use x="1649.21875" xlink:href="#DejaVuSans-49"/>
+ <use x="1712.841797" xlink:href="#DejaVuSans-107"/>
+ <use x="1770.751953" xlink:href="#DejaVuSans-104"/>
+ <use x="1834.130859" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="p6db0961ebd">
+ <rect height="292.84" width="626.515" x="67.025" y="75.6"/>
+ </clipPath>
+ <clipPath id="pcde1009af9">
+ <rect height="292.84" width="626.515" x="67.025" y="410.4"/>
+ </clipPath>
+ <clipPath id="p03f2f015a4">
+ <rect height="292.84" width="626.515" x="67.025" y="745.2"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/docs/docs/img/bessel_lowpass6.svg b/docs/docs/img/bessel_lowpass6.svg
@@ -0,0 +1,3017 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Created with matplotlib (https://matplotlib.org/) -->
+<svg height="1080pt" version="1.1" viewBox="0 0 720 1080" width="720pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+ </style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 1080
+L 720 1080
+L 720 0
+L 0 0
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="axes_1">
+ <g id="patch_2">
+ <path d="M 60.635 368.44
+L 693.54 368.44
+L 693.54 75.6
+L 60.635 75.6
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_1">
+ <g id="xtick_1">
+ <g id="line2d_1">
+ <path clip-path="url(#p7698809570)" d="M 60.635 368.44
+L 60.635 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_2">
+ <defs>
+ <path d="M 0 0
+L 0 3.5
+" id="mf1d2ccf567" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#mf1d2ccf567" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- 0 -->
+ <defs>
+ <path d="M 31.78125 66.40625
+Q 24.171875 66.40625 20.328125 58.90625
+Q 16.5 51.421875 16.5 36.375
+Q 16.5 21.390625 20.328125 13.890625
+Q 24.171875 6.390625 31.78125 6.390625
+Q 39.453125 6.390625 43.28125 13.890625
+Q 47.125 21.390625 47.125 36.375
+Q 47.125 51.421875 43.28125 58.90625
+Q 39.453125 66.40625 31.78125 66.40625
+z
+M 31.78125 74.21875
+Q 44.046875 74.21875 50.515625 64.515625
+Q 56.984375 54.828125 56.984375 36.375
+Q 56.984375 17.96875 50.515625 8.265625
+Q 44.046875 -1.421875 31.78125 -1.421875
+Q 19.53125 -1.421875 13.0625 8.265625
+Q 6.59375 17.96875 6.59375 36.375
+Q 6.59375 54.828125 13.0625 64.515625
+Q 19.53125 74.21875 31.78125 74.21875
+z
+" id="DejaVuSans-48"/>
+ </defs>
+ <g transform="translate(57.45375 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_2">
+ <g id="line2d_3">
+ <path clip-path="url(#p7698809570)" d="M 184.370093 368.44
+L 184.370093 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_4">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="184.370093" xlink:href="#mf1d2ccf567" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- 200 -->
+ <defs>
+ <path d="M 19.1875 8.296875
+L 53.609375 8.296875
+L 53.609375 0
+L 7.328125 0
+L 7.328125 8.296875
+Q 12.9375 14.109375 22.625 23.890625
+Q 32.328125 33.6875 34.8125 36.53125
+Q 39.546875 41.84375 41.421875 45.53125
+Q 43.3125 49.21875 43.3125 52.78125
+Q 43.3125 58.59375 39.234375 62.25
+Q 35.15625 65.921875 28.609375 65.921875
+Q 23.96875 65.921875 18.8125 64.3125
+Q 13.671875 62.703125 7.8125 59.421875
+L 7.8125 69.390625
+Q 13.765625 71.78125 18.9375 73
+Q 24.125 74.21875 28.421875 74.21875
+Q 39.75 74.21875 46.484375 68.546875
+Q 53.21875 62.890625 53.21875 53.421875
+Q 53.21875 48.921875 51.53125 44.890625
+Q 49.859375 40.875 45.40625 35.40625
+Q 44.1875 33.984375 37.640625 27.21875
+Q 31.109375 20.453125 19.1875 8.296875
+z
+" id="DejaVuSans-50"/>
+ </defs>
+ <g transform="translate(174.826343 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_3">
+ <g id="line2d_5">
+ <path clip-path="url(#p7698809570)" d="M 308.105186 368.44
+L 308.105186 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_6">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="308.105186" xlink:href="#mf1d2ccf567" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- 400 -->
+ <defs>
+ <path d="M 37.796875 64.3125
+L 12.890625 25.390625
+L 37.796875 25.390625
+z
+M 35.203125 72.90625
+L 47.609375 72.90625
+L 47.609375 25.390625
+L 58.015625 25.390625
+L 58.015625 17.1875
+L 47.609375 17.1875
+L 47.609375 0
+L 37.796875 0
+L 37.796875 17.1875
+L 4.890625 17.1875
+L 4.890625 26.703125
+z
+" id="DejaVuSans-52"/>
+ </defs>
+ <g transform="translate(298.561436 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-52"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_4">
+ <g id="line2d_7">
+ <path clip-path="url(#p7698809570)" d="M 431.840279 368.44
+L 431.840279 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_8">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="431.840279" xlink:href="#mf1d2ccf567" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- 600 -->
+ <defs>
+ <path d="M 33.015625 40.375
+Q 26.375 40.375 22.484375 35.828125
+Q 18.609375 31.296875 18.609375 23.390625
+Q 18.609375 15.53125 22.484375 10.953125
+Q 26.375 6.390625 33.015625 6.390625
+Q 39.65625 6.390625 43.53125 10.953125
+Q 47.40625 15.53125 47.40625 23.390625
+Q 47.40625 31.296875 43.53125 35.828125
+Q 39.65625 40.375 33.015625 40.375
+z
+M 52.59375 71.296875
+L 52.59375 62.3125
+Q 48.875 64.0625 45.09375 64.984375
+Q 41.3125 65.921875 37.59375 65.921875
+Q 27.828125 65.921875 22.671875 59.328125
+Q 17.53125 52.734375 16.796875 39.40625
+Q 19.671875 43.65625 24.015625 45.921875
+Q 28.375 48.1875 33.59375 48.1875
+Q 44.578125 48.1875 50.953125 41.515625
+Q 57.328125 34.859375 57.328125 23.390625
+Q 57.328125 12.15625 50.6875 5.359375
+Q 44.046875 -1.421875 33.015625 -1.421875
+Q 20.359375 -1.421875 13.671875 8.265625
+Q 6.984375 17.96875 6.984375 36.375
+Q 6.984375 53.65625 15.1875 63.9375
+Q 23.390625 74.21875 37.203125 74.21875
+Q 40.921875 74.21875 44.703125 73.484375
+Q 48.484375 72.75 52.59375 71.296875
+z
+" id="DejaVuSans-54"/>
+ </defs>
+ <g transform="translate(422.296529 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-54"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_5">
+ <g id="line2d_9">
+ <path clip-path="url(#p7698809570)" d="M 555.575371 368.44
+L 555.575371 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_10">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="555.575371" xlink:href="#mf1d2ccf567" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- 800 -->
+ <defs>
+ <path d="M 31.78125 34.625
+Q 24.75 34.625 20.71875 30.859375
+Q 16.703125 27.09375 16.703125 20.515625
+Q 16.703125 13.921875 20.71875 10.15625
+Q 24.75 6.390625 31.78125 6.390625
+Q 38.8125 6.390625 42.859375 10.171875
+Q 46.921875 13.96875 46.921875 20.515625
+Q 46.921875 27.09375 42.890625 30.859375
+Q 38.875 34.625 31.78125 34.625
+z
+M 21.921875 38.8125
+Q 15.578125 40.375 12.03125 44.71875
+Q 8.5 49.078125 8.5 55.328125
+Q 8.5 64.0625 14.71875 69.140625
+Q 20.953125 74.21875 31.78125 74.21875
+Q 42.671875 74.21875 48.875 69.140625
+Q 55.078125 64.0625 55.078125 55.328125
+Q 55.078125 49.078125 51.53125 44.71875
+Q 48 40.375 41.703125 38.8125
+Q 48.828125 37.15625 52.796875 32.3125
+Q 56.78125 27.484375 56.78125 20.515625
+Q 56.78125 9.90625 50.3125 4.234375
+Q 43.84375 -1.421875 31.78125 -1.421875
+Q 19.734375 -1.421875 13.25 4.234375
+Q 6.78125 9.90625 6.78125 20.515625
+Q 6.78125 27.484375 10.78125 32.3125
+Q 14.796875 37.15625 21.921875 38.8125
+z
+M 18.3125 54.390625
+Q 18.3125 48.734375 21.84375 45.5625
+Q 25.390625 42.390625 31.78125 42.390625
+Q 38.140625 42.390625 41.71875 45.5625
+Q 45.3125 48.734375 45.3125 54.390625
+Q 45.3125 60.0625 41.71875 63.234375
+Q 38.140625 66.40625 31.78125 66.40625
+Q 25.390625 66.40625 21.84375 63.234375
+Q 18.3125 60.0625 18.3125 54.390625
+z
+" id="DejaVuSans-56"/>
+ </defs>
+ <g transform="translate(546.031621 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-56"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_6">
+ <g id="line2d_11">
+ <path clip-path="url(#p7698809570)" d="M 679.310464 368.44
+L 679.310464 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_12">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="679.310464" xlink:href="#mf1d2ccf567" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- 1000 -->
+ <defs>
+ <path d="M 12.40625 8.296875
+L 28.515625 8.296875
+L 28.515625 63.921875
+L 10.984375 60.40625
+L 10.984375 69.390625
+L 28.421875 72.90625
+L 38.28125 72.90625
+L 38.28125 8.296875
+L 54.390625 8.296875
+L 54.390625 0
+L 12.40625 0
+z
+" id="DejaVuSans-49"/>
+ </defs>
+ <g transform="translate(666.585464 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_7">
+ <!-- Samples -->
+ <defs>
+ <path d="M 53.515625 70.515625
+L 53.515625 60.890625
+Q 47.90625 63.578125 42.921875 64.890625
+Q 37.9375 66.21875 33.296875 66.21875
+Q 25.25 66.21875 20.875 63.09375
+Q 16.5 59.96875 16.5 54.203125
+Q 16.5 49.359375 19.40625 46.890625
+Q 22.3125 44.4375 30.421875 42.921875
+L 36.375 41.703125
+Q 47.40625 39.59375 52.65625 34.296875
+Q 57.90625 29 57.90625 20.125
+Q 57.90625 9.515625 50.796875 4.046875
+Q 43.703125 -1.421875 29.984375 -1.421875
+Q 24.8125 -1.421875 18.96875 -0.25
+Q 13.140625 0.921875 6.890625 3.21875
+L 6.890625 13.375
+Q 12.890625 10.015625 18.65625 8.296875
+Q 24.421875 6.59375 29.984375 6.59375
+Q 38.421875 6.59375 43.015625 9.90625
+Q 47.609375 13.234375 47.609375 19.390625
+Q 47.609375 24.75 44.3125 27.78125
+Q 41.015625 30.8125 33.5 32.328125
+L 27.484375 33.5
+Q 16.453125 35.6875 11.515625 40.375
+Q 6.59375 45.0625 6.59375 53.421875
+Q 6.59375 63.09375 13.40625 68.65625
+Q 20.21875 74.21875 32.171875 74.21875
+Q 37.3125 74.21875 42.625 73.28125
+Q 47.953125 72.359375 53.515625 70.515625
+z
+" id="DejaVuSans-83"/>
+ <path d="M 34.28125 27.484375
+Q 23.390625 27.484375 19.1875 25
+Q 14.984375 22.515625 14.984375 16.5
+Q 14.984375 11.71875 18.140625 8.90625
+Q 21.296875 6.109375 26.703125 6.109375
+Q 34.1875 6.109375 38.703125 11.40625
+Q 43.21875 16.703125 43.21875 25.484375
+L 43.21875 27.484375
+z
+M 52.203125 31.203125
+L 52.203125 0
+L 43.21875 0
+L 43.21875 8.296875
+Q 40.140625 3.328125 35.546875 0.953125
+Q 30.953125 -1.421875 24.3125 -1.421875
+Q 15.921875 -1.421875 10.953125 3.296875
+Q 6 8.015625 6 15.921875
+Q 6 25.140625 12.171875 29.828125
+Q 18.359375 34.515625 30.609375 34.515625
+L 43.21875 34.515625
+L 43.21875 35.40625
+Q 43.21875 41.609375 39.140625 45
+Q 35.0625 48.390625 27.6875 48.390625
+Q 23 48.390625 18.546875 47.265625
+Q 14.109375 46.140625 10.015625 43.890625
+L 10.015625 52.203125
+Q 14.9375 54.109375 19.578125 55.046875
+Q 24.21875 56 28.609375 56
+Q 40.484375 56 46.34375 49.84375
+Q 52.203125 43.703125 52.203125 31.203125
+z
+" id="DejaVuSans-97"/>
+ <path d="M 52 44.1875
+Q 55.375 50.25 60.0625 53.125
+Q 64.75 56 71.09375 56
+Q 79.640625 56 84.28125 50.015625
+Q 88.921875 44.046875 88.921875 33.015625
+L 88.921875 0
+L 79.890625 0
+L 79.890625 32.71875
+Q 79.890625 40.578125 77.09375 44.375
+Q 74.3125 48.1875 68.609375 48.1875
+Q 61.625 48.1875 57.5625 43.546875
+Q 53.515625 38.921875 53.515625 30.90625
+L 53.515625 0
+L 44.484375 0
+L 44.484375 32.71875
+Q 44.484375 40.625 41.703125 44.40625
+Q 38.921875 48.1875 33.109375 48.1875
+Q 26.21875 48.1875 22.15625 43.53125
+Q 18.109375 38.875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.1875 51.21875 25.484375 53.609375
+Q 29.78125 56 35.6875 56
+Q 41.65625 56 45.828125 52.96875
+Q 50 49.953125 52 44.1875
+z
+" id="DejaVuSans-109"/>
+ <path d="M 18.109375 8.203125
+L 18.109375 -20.796875
+L 9.078125 -20.796875
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+z
+M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+" id="DejaVuSans-112"/>
+ <path d="M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 0
+L 9.421875 0
+z
+" id="DejaVuSans-108"/>
+ <path d="M 56.203125 29.59375
+L 56.203125 25.203125
+L 14.890625 25.203125
+Q 15.484375 15.921875 20.484375 11.0625
+Q 25.484375 6.203125 34.421875 6.203125
+Q 39.59375 6.203125 44.453125 7.46875
+Q 49.3125 8.734375 54.109375 11.28125
+L 54.109375 2.78125
+Q 49.265625 0.734375 44.1875 -0.34375
+Q 39.109375 -1.421875 33.890625 -1.421875
+Q 20.796875 -1.421875 13.15625 6.1875
+Q 5.515625 13.8125 5.515625 26.8125
+Q 5.515625 40.234375 12.765625 48.109375
+Q 20.015625 56 32.328125 56
+Q 43.359375 56 49.78125 48.890625
+Q 56.203125 41.796875 56.203125 29.59375
+z
+M 47.21875 32.234375
+Q 47.125 39.59375 43.09375 43.984375
+Q 39.0625 48.390625 32.421875 48.390625
+Q 24.90625 48.390625 20.390625 44.140625
+Q 15.875 39.890625 15.1875 32.171875
+z
+" id="DejaVuSans-101"/>
+ <path d="M 44.28125 53.078125
+L 44.28125 44.578125
+Q 40.484375 46.53125 36.375 47.5
+Q 32.28125 48.484375 27.875 48.484375
+Q 21.1875 48.484375 17.84375 46.4375
+Q 14.5 44.390625 14.5 40.28125
+Q 14.5 37.15625 16.890625 35.375
+Q 19.28125 33.59375 26.515625 31.984375
+L 29.59375 31.296875
+Q 39.15625 29.25 43.1875 25.515625
+Q 47.21875 21.78125 47.21875 15.09375
+Q 47.21875 7.46875 41.1875 3.015625
+Q 35.15625 -1.421875 24.609375 -1.421875
+Q 20.21875 -1.421875 15.453125 -0.5625
+Q 10.6875 0.296875 5.421875 2
+L 5.421875 11.28125
+Q 10.40625 8.6875 15.234375 7.390625
+Q 20.0625 6.109375 24.8125 6.109375
+Q 31.15625 6.109375 34.5625 8.28125
+Q 37.984375 10.453125 37.984375 14.40625
+Q 37.984375 18.0625 35.515625 20.015625
+Q 33.0625 21.96875 24.703125 23.78125
+L 21.578125 24.515625
+Q 13.234375 26.265625 9.515625 29.90625
+Q 5.8125 33.546875 5.8125 39.890625
+Q 5.8125 47.609375 11.28125 51.796875
+Q 16.75 56 26.8125 56
+Q 31.78125 56 36.171875 55.265625
+Q 40.578125 54.546875 44.28125 53.078125
+z
+" id="DejaVuSans-115"/>
+ </defs>
+ <g transform="translate(355.734375 396.716563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-83"/>
+ <use x="63.476562" xlink:href="#DejaVuSans-97"/>
+ <use x="124.755859" xlink:href="#DejaVuSans-109"/>
+ <use x="222.167969" xlink:href="#DejaVuSans-112"/>
+ <use x="285.644531" xlink:href="#DejaVuSans-108"/>
+ <use x="313.427734" xlink:href="#DejaVuSans-101"/>
+ <use x="374.951172" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_2">
+ <g id="ytick_1">
+ <g id="line2d_13">
+ <path clip-path="url(#p7698809570)" d="M 60.635 362.90616
+L 693.54 362.90616
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_14">
+ <defs>
+ <path d="M 0 0
+L -3.5 0
+" id="m9696ac068d" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="362.90616"/>
+ </g>
+ </g>
+ <g id="text_8">
+ <!-- 0.000 -->
+ <defs>
+ <path d="M 10.6875 12.40625
+L 21 12.40625
+L 21 0
+L 10.6875 0
+z
+" id="DejaVuSans-46"/>
+ </defs>
+ <g transform="translate(25.006875 366.705379)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-48"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_2">
+ <g id="line2d_15">
+ <path clip-path="url(#p7698809570)" d="M 60.635 322.649214
+L 693.54 322.649214
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_16">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="322.649214"/>
+ </g>
+ </g>
+ <g id="text_9">
+ <!-- 0.005 -->
+ <defs>
+ <path d="M 10.796875 72.90625
+L 49.515625 72.90625
+L 49.515625 64.59375
+L 19.828125 64.59375
+L 19.828125 46.734375
+Q 21.96875 47.46875 24.109375 47.828125
+Q 26.265625 48.1875 28.421875 48.1875
+Q 40.625 48.1875 47.75 41.5
+Q 54.890625 34.8125 54.890625 23.390625
+Q 54.890625 11.625 47.5625 5.09375
+Q 40.234375 -1.421875 26.90625 -1.421875
+Q 22.3125 -1.421875 17.546875 -0.640625
+Q 12.796875 0.140625 7.71875 1.703125
+L 7.71875 11.625
+Q 12.109375 9.234375 16.796875 8.0625
+Q 21.484375 6.890625 26.703125 6.890625
+Q 35.15625 6.890625 40.078125 11.328125
+Q 45.015625 15.765625 45.015625 23.390625
+Q 45.015625 31 40.078125 35.4375
+Q 35.15625 39.890625 26.703125 39.890625
+Q 22.75 39.890625 18.8125 39.015625
+Q 14.890625 38.140625 10.796875 36.28125
+z
+" id="DejaVuSans-53"/>
+ </defs>
+ <g transform="translate(25.006875 326.448433)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-48"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_3">
+ <g id="line2d_17">
+ <path clip-path="url(#p7698809570)" d="M 60.635 282.392268
+L 693.54 282.392268
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_18">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="282.392268"/>
+ </g>
+ </g>
+ <g id="text_10">
+ <!-- 0.010 -->
+ <g transform="translate(25.006875 286.191487)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-49"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_4">
+ <g id="line2d_19">
+ <path clip-path="url(#p7698809570)" d="M 60.635 242.135322
+L 693.54 242.135322
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_20">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="242.135322"/>
+ </g>
+ </g>
+ <g id="text_11">
+ <!-- 0.015 -->
+ <g transform="translate(25.006875 245.93454)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-49"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_5">
+ <g id="line2d_21">
+ <path clip-path="url(#p7698809570)" d="M 60.635 201.878375
+L 693.54 201.878375
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_22">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="201.878375"/>
+ </g>
+ </g>
+ <g id="text_12">
+ <!-- 0.020 -->
+ <g transform="translate(25.006875 205.677594)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-50"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_6">
+ <g id="line2d_23">
+ <path clip-path="url(#p7698809570)" d="M 60.635 161.621429
+L 693.54 161.621429
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_24">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="161.621429"/>
+ </g>
+ </g>
+ <g id="text_13">
+ <!-- 0.025 -->
+ <g transform="translate(25.006875 165.420648)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-50"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_7">
+ <g id="line2d_25">
+ <path clip-path="url(#p7698809570)" d="M 60.635 121.364483
+L 693.54 121.364483
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_26">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="121.364483"/>
+ </g>
+ </g>
+ <g id="text_14">
+ <!-- 0.030 -->
+ <defs>
+ <path d="M 40.578125 39.3125
+Q 47.65625 37.796875 51.625 33
+Q 55.609375 28.21875 55.609375 21.1875
+Q 55.609375 10.40625 48.1875 4.484375
+Q 40.765625 -1.421875 27.09375 -1.421875
+Q 22.515625 -1.421875 17.65625 -0.515625
+Q 12.796875 0.390625 7.625 2.203125
+L 7.625 11.71875
+Q 11.71875 9.328125 16.59375 8.109375
+Q 21.484375 6.890625 26.8125 6.890625
+Q 36.078125 6.890625 40.9375 10.546875
+Q 45.796875 14.203125 45.796875 21.1875
+Q 45.796875 27.640625 41.28125 31.265625
+Q 36.765625 34.90625 28.71875 34.90625
+L 20.21875 34.90625
+L 20.21875 43.015625
+L 29.109375 43.015625
+Q 36.375 43.015625 40.234375 45.921875
+Q 44.09375 48.828125 44.09375 54.296875
+Q 44.09375 59.90625 40.109375 62.90625
+Q 36.140625 65.921875 28.71875 65.921875
+Q 24.65625 65.921875 20.015625 65.03125
+Q 15.375 64.15625 9.8125 62.3125
+L 9.8125 71.09375
+Q 15.4375 72.65625 20.34375 73.4375
+Q 25.25 74.21875 29.59375 74.21875
+Q 40.828125 74.21875 47.359375 69.109375
+Q 53.90625 64.015625 53.90625 55.328125
+Q 53.90625 49.265625 50.4375 45.09375
+Q 46.96875 40.921875 40.578125 39.3125
+z
+" id="DejaVuSans-51"/>
+ </defs>
+ <g transform="translate(25.006875 125.163702)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-51"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_8">
+ <g id="line2d_27">
+ <path clip-path="url(#p7698809570)" d="M 60.635 81.107537
+L 693.54 81.107537
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_28">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="81.107537"/>
+ </g>
+ </g>
+ <g id="text_15">
+ <!-- 0.035 -->
+ <g transform="translate(25.006875 84.906755)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-51"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_16">
+ <!-- Amplitude -->
+ <defs>
+ <path d="M 34.1875 63.1875
+L 20.796875 26.90625
+L 47.609375 26.90625
+z
+M 28.609375 72.90625
+L 39.796875 72.90625
+L 67.578125 0
+L 57.328125 0
+L 50.6875 18.703125
+L 17.828125 18.703125
+L 11.1875 0
+L 0.78125 0
+z
+" id="DejaVuSans-65"/>
+ <path d="M 9.421875 54.6875
+L 18.40625 54.6875
+L 18.40625 0
+L 9.421875 0
+z
+M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 64.59375
+L 9.421875 64.59375
+z
+" id="DejaVuSans-105"/>
+ <path d="M 18.3125 70.21875
+L 18.3125 54.6875
+L 36.8125 54.6875
+L 36.8125 47.703125
+L 18.3125 47.703125
+L 18.3125 18.015625
+Q 18.3125 11.328125 20.140625 9.421875
+Q 21.96875 7.515625 27.59375 7.515625
+L 36.8125 7.515625
+L 36.8125 0
+L 27.59375 0
+Q 17.1875 0 13.234375 3.875
+Q 9.28125 7.765625 9.28125 18.015625
+L 9.28125 47.703125
+L 2.6875 47.703125
+L 2.6875 54.6875
+L 9.28125 54.6875
+L 9.28125 70.21875
+z
+" id="DejaVuSans-116"/>
+ <path d="M 8.5 21.578125
+L 8.5 54.6875
+L 17.484375 54.6875
+L 17.484375 21.921875
+Q 17.484375 14.15625 20.5 10.265625
+Q 23.53125 6.390625 29.59375 6.390625
+Q 36.859375 6.390625 41.078125 11.03125
+Q 45.3125 15.671875 45.3125 23.6875
+L 45.3125 54.6875
+L 54.296875 54.6875
+L 54.296875 0
+L 45.3125 0
+L 45.3125 8.40625
+Q 42.046875 3.421875 37.71875 1
+Q 33.40625 -1.421875 27.6875 -1.421875
+Q 18.265625 -1.421875 13.375 4.4375
+Q 8.5 10.296875 8.5 21.578125
+z
+M 31.109375 56
+z
+" id="DejaVuSans-117"/>
+ <path d="M 45.40625 46.390625
+L 45.40625 75.984375
+L 54.390625 75.984375
+L 54.390625 0
+L 45.40625 0
+L 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+z
+M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+" id="DejaVuSans-100"/>
+ </defs>
+ <g transform="translate(18.927187 247.642656)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-65"/>
+ <use x="68.408203" xlink:href="#DejaVuSans-109"/>
+ <use x="165.820312" xlink:href="#DejaVuSans-112"/>
+ <use x="229.296875" xlink:href="#DejaVuSans-108"/>
+ <use x="257.080078" xlink:href="#DejaVuSans-105"/>
+ <use x="284.863281" xlink:href="#DejaVuSans-116"/>
+ <use x="324.072266" xlink:href="#DejaVuSans-117"/>
+ <use x="387.451172" xlink:href="#DejaVuSans-100"/>
+ <use x="450.927734" xlink:href="#DejaVuSans-101"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_29">
+ <path clip-path="url(#p7698809570)" d="M 60.635 362.905684
+L 62.491026 362.789343
+L 63.109702 362.567638
+L 63.728377 362.097495
+L 64.347053 361.233295
+L 64.965728 359.806623
+L 65.584404 357.638921
+L 66.203079 354.55479
+L 66.821755 350.394537
+L 67.44043 345.025059
+L 68.059106 338.3485
+L 69.296457 320.893372
+L 70.533807 298.122696
+L 71.771158 270.837506
+L 74.24586 208.707998
+L 76.101887 162.96907
+L 77.339238 136.46315
+L 78.576588 114.992037
+L 79.195264 106.514001
+L 79.813939 99.679575
+L 80.432615 94.554544
+L 81.05129 91.174298
+L 81.669966 89.544762
+L 82.288641 89.643915
+L 82.907317 91.42382
+L 83.525992 94.813058
+L 84.144668 99.719475
+L 84.763343 106.033148
+L 86.000694 122.372395
+L 87.238045 142.714529
+L 89.094071 178.099602
+L 93.4248 263.858976
+L 95.280826 295.055093
+L 96.518177 312.732111
+L 97.755528 327.700075
+L 98.992879 339.953676
+L 100.23023 349.614205
+L 101.467581 356.898829
+L 102.704932 362.09004
+L 103.323607 363.9997
+L 103.942283 365.507256
+L 104.560958 366.654326
+L 105.179633 367.481968
+L 105.798309 368.030155
+L 106.416984 368.337323
+L 107.03566 368.44
+L 107.654335 368.372503
+L 108.891686 367.85189
+L 110.129037 366.998665
+L 114.459765 363.604018
+L 115.697116 362.885073
+L 116.934467 362.345178
+L 118.171818 361.983213
+L 120.027845 361.73721
+L 121.883871 361.767948
+L 124.358573 362.064859
+L 130.545327 362.937765
+L 133.638705 363.121948
+L 137.969433 363.113699
+L 151.580293 362.862362
+L 221.490621 362.906156
+L 693.54 362.90616
+L 693.54 362.90616
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_3">
+ <path d="M 60.635 368.44
+L 60.635 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_4">
+ <path d="M 693.54 368.44
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_5">
+ <path d="M 60.635 368.44
+L 693.54 368.44
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_6">
+ <path d="M 60.635 75.6
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_2">
+ <g id="patch_7">
+ <path d="M 60.635 703.24
+L 693.54 703.24
+L 693.54 410.4
+L 60.635 410.4
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_3">
+ <g id="xtick_7">
+ <g id="line2d_30">
+ <path clip-path="url(#p132af09dac)" d="M 60.635 703.24
+L 60.635 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_31">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_17">
+ <!-- 10Hz -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 19.671875 72.90625
+L 19.671875 43.015625
+L 55.515625 43.015625
+L 55.515625 72.90625
+L 65.375 72.90625
+L 65.375 0
+L 55.515625 0
+L 55.515625 34.71875
+L 19.671875 34.71875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-72"/>
+ <path d="M 5.515625 54.6875
+L 48.1875 54.6875
+L 48.1875 46.484375
+L 14.40625 7.171875
+L 48.1875 7.171875
+L 48.1875 0
+L 4.296875 0
+L 4.296875 8.203125
+L 38.09375 47.515625
+L 5.515625 47.515625
+z
+" id="DejaVuSans-122"/>
+ </defs>
+ <g transform="translate(47.888125 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_8">
+ <g id="line2d_32">
+ <path clip-path="url(#p132af09dac)" d="M 60.635 703.24
+L 60.635 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_33">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_9">
+ <g id="line2d_34">
+ <path clip-path="url(#p132af09dac)" d="M 116.999344 703.24
+L 116.999344 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_35">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="116.999344" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_10">
+ <g id="line2d_36">
+ <path clip-path="url(#p132af09dac)" d="M 149.970372 703.24
+L 149.970372 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_37">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="149.970372" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_11">
+ <g id="line2d_38">
+ <path clip-path="url(#p132af09dac)" d="M 173.363688 703.24
+L 173.363688 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_39">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="173.363688" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_12">
+ <g id="line2d_40">
+ <path clip-path="url(#p132af09dac)" d="M 191.508954 703.24
+L 191.508954 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_41">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="191.508954" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_13">
+ <g id="line2d_42">
+ <path clip-path="url(#p132af09dac)" d="M 206.334716 703.24
+L 206.334716 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_43">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="206.334716" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_14">
+ <g id="line2d_44">
+ <path clip-path="url(#p132af09dac)" d="M 218.869719 703.24
+L 218.869719 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_45">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="218.869719" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_15">
+ <g id="line2d_46">
+ <path clip-path="url(#p132af09dac)" d="M 229.728032 703.24
+L 229.728032 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_47">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="229.728032" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_16">
+ <g id="line2d_48">
+ <path clip-path="url(#p132af09dac)" d="M 239.305743 703.24
+L 239.305743 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_49">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="239.305743" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_17">
+ <g id="line2d_50">
+ <path clip-path="url(#p132af09dac)" d="M 247.873298 703.24
+L 247.873298 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_51">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.873298" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_18">
+ <!-- 100Hz -->
+ <g transform="translate(231.945173 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_18">
+ <g id="line2d_52">
+ <path clip-path="url(#p132af09dac)" d="M 247.873298 703.24
+L 247.873298 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_53">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.873298" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_19">
+ <g id="line2d_54">
+ <path clip-path="url(#p132af09dac)" d="M 304.237642 703.24
+L 304.237642 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_55">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="304.237642" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_20">
+ <g id="line2d_56">
+ <path clip-path="url(#p132af09dac)" d="M 337.20867 703.24
+L 337.20867 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_57">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="337.20867" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_21">
+ <g id="line2d_58">
+ <path clip-path="url(#p132af09dac)" d="M 360.601986 703.24
+L 360.601986 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_59">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="360.601986" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_22">
+ <g id="line2d_60">
+ <path clip-path="url(#p132af09dac)" d="M 378.747252 703.24
+L 378.747252 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_61">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="378.747252" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_23">
+ <g id="line2d_62">
+ <path clip-path="url(#p132af09dac)" d="M 393.573014 703.24
+L 393.573014 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_63">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="393.573014" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_24">
+ <g id="line2d_64">
+ <path clip-path="url(#p132af09dac)" d="M 406.108017 703.24
+L 406.108017 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_65">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="406.108017" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_25">
+ <g id="line2d_66">
+ <path clip-path="url(#p132af09dac)" d="M 416.96633 703.24
+L 416.96633 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_67">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="416.96633" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_26">
+ <g id="line2d_68">
+ <path clip-path="url(#p132af09dac)" d="M 426.544041 703.24
+L 426.544041 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_69">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="426.544041" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_27">
+ <g id="line2d_70">
+ <path clip-path="url(#p132af09dac)" d="M 435.111596 703.24
+L 435.111596 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_71">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.111596" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_19">
+ <!-- 1kHz -->
+ <defs>
+ <path d="M 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 31.109375
+L 44.921875 54.6875
+L 56.390625 54.6875
+L 27.390625 29.109375
+L 57.625 0
+L 45.90625 0
+L 18.109375 26.703125
+L 18.109375 0
+L 9.078125 0
+z
+" id="DejaVuSans-107"/>
+ </defs>
+ <g transform="translate(422.650659 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_28">
+ <g id="line2d_72">
+ <path clip-path="url(#p132af09dac)" d="M 435.111596 703.24
+L 435.111596 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_73">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.111596" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_29">
+ <g id="line2d_74">
+ <path clip-path="url(#p132af09dac)" d="M 491.47594 703.24
+L 491.47594 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_75">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="491.47594" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_30">
+ <g id="line2d_76">
+ <path clip-path="url(#p132af09dac)" d="M 524.446968 703.24
+L 524.446968 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_77">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.446968" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_31">
+ <g id="line2d_78">
+ <path clip-path="url(#p132af09dac)" d="M 547.840284 703.24
+L 547.840284 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_79">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.840284" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_32">
+ <g id="line2d_80">
+ <path clip-path="url(#p132af09dac)" d="M 565.98555 703.24
+L 565.98555 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_81">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="565.98555" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_33">
+ <g id="line2d_82">
+ <path clip-path="url(#p132af09dac)" d="M 580.811312 703.24
+L 580.811312 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_83">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="580.811312" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_34">
+ <g id="line2d_84">
+ <path clip-path="url(#p132af09dac)" d="M 593.346315 703.24
+L 593.346315 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_85">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.346315" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_35">
+ <g id="line2d_86">
+ <path clip-path="url(#p132af09dac)" d="M 604.204628 703.24
+L 604.204628 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_87">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.204628" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_36">
+ <g id="line2d_88">
+ <path clip-path="url(#p132af09dac)" d="M 613.78234 703.24
+L 613.78234 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_89">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="613.78234" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_37">
+ <g id="line2d_90">
+ <path clip-path="url(#p132af09dac)" d="M 622.349894 703.24
+L 622.349894 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_91">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.349894" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_20">
+ <!-- 10kHz -->
+ <g transform="translate(606.707707 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_38">
+ <g id="line2d_92">
+ <path clip-path="url(#p132af09dac)" d="M 622.349894 703.24
+L 622.349894 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_93">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.349894" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_39">
+ <g id="line2d_94">
+ <path clip-path="url(#p132af09dac)" d="M 678.714238 703.24
+L 678.714238 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_95">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.714238" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_40">
+ <g id="line2d_96">
+ <path clip-path="url(#p132af09dac)" d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_97">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#mf1d2ccf567" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_21">
+ <!-- 24kHz -->
+ <g transform="translate(677.897813 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_22">
+ <!-- Frequency (Hz) -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 51.703125 72.90625
+L 51.703125 64.59375
+L 19.671875 64.59375
+L 19.671875 43.109375
+L 48.578125 43.109375
+L 48.578125 34.8125
+L 19.671875 34.8125
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-70"/>
+ <path d="M 41.109375 46.296875
+Q 39.59375 47.171875 37.8125 47.578125
+Q 36.03125 48 33.890625 48
+Q 26.265625 48 22.1875 43.046875
+Q 18.109375 38.09375 18.109375 28.8125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 20.953125 51.171875 25.484375 53.578125
+Q 30.03125 56 36.53125 56
+Q 37.453125 56 38.578125 55.875
+Q 39.703125 55.765625 41.0625 55.515625
+z
+" id="DejaVuSans-114"/>
+ <path d="M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+M 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+L 45.40625 54.6875
+L 54.390625 54.6875
+L 54.390625 -20.796875
+L 45.40625 -20.796875
+z
+" id="DejaVuSans-113"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-110"/>
+ <path d="M 48.78125 52.59375
+L 48.78125 44.1875
+Q 44.96875 46.296875 41.140625 47.34375
+Q 37.3125 48.390625 33.40625 48.390625
+Q 24.65625 48.390625 19.8125 42.84375
+Q 14.984375 37.3125 14.984375 27.296875
+Q 14.984375 17.28125 19.8125 11.734375
+Q 24.65625 6.203125 33.40625 6.203125
+Q 37.3125 6.203125 41.140625 7.25
+Q 44.96875 8.296875 48.78125 10.40625
+L 48.78125 2.09375
+Q 45.015625 0.34375 40.984375 -0.53125
+Q 36.96875 -1.421875 32.421875 -1.421875
+Q 20.0625 -1.421875 12.78125 6.34375
+Q 5.515625 14.109375 5.515625 27.296875
+Q 5.515625 40.671875 12.859375 48.328125
+Q 20.21875 56 33.015625 56
+Q 37.15625 56 41.109375 55.140625
+Q 45.0625 54.296875 48.78125 52.59375
+z
+" id="DejaVuSans-99"/>
+ <path d="M 32.171875 -5.078125
+Q 28.375 -14.84375 24.75 -17.8125
+Q 21.140625 -20.796875 15.09375 -20.796875
+L 7.90625 -20.796875
+L 7.90625 -13.28125
+L 13.1875 -13.28125
+Q 16.890625 -13.28125 18.9375 -11.515625
+Q 21 -9.765625 23.484375 -3.21875
+L 25.09375 0.875
+L 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 11.921875
+L 46.6875 54.6875
+L 56.203125 54.6875
+z
+" id="DejaVuSans-121"/>
+ <path id="DejaVuSans-32"/>
+ <path d="M 31 75.875
+Q 24.46875 64.65625 21.28125 53.65625
+Q 18.109375 42.671875 18.109375 31.390625
+Q 18.109375 20.125 21.3125 9.0625
+Q 24.515625 -2 31 -13.1875
+L 23.1875 -13.1875
+Q 15.875 -1.703125 12.234375 9.375
+Q 8.59375 20.453125 8.59375 31.390625
+Q 8.59375 42.28125 12.203125 53.3125
+Q 15.828125 64.359375 23.1875 75.875
+z
+" id="DejaVuSans-40"/>
+ <path d="M 8.015625 75.875
+L 15.828125 75.875
+Q 23.140625 64.359375 26.78125 53.3125
+Q 30.421875 42.28125 30.421875 31.390625
+Q 30.421875 20.453125 26.78125 9.375
+Q 23.140625 -1.703125 15.828125 -13.1875
+L 8.015625 -13.1875
+Q 14.5 -2 17.703125 9.0625
+Q 20.90625 20.125 20.90625 31.390625
+Q 20.90625 42.671875 17.703125 53.65625
+Q 14.5 64.65625 8.015625 75.875
+z
+" id="DejaVuSans-41"/>
+ </defs>
+ <g transform="translate(338.914844 731.516563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_4">
+ <g id="ytick_9">
+ <g id="line2d_98">
+ <path clip-path="url(#p132af09dac)" d="M 60.635 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_99">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_23">
+ <!-- −160 -->
+ <defs>
+ <path d="M 10.59375 35.5
+L 73.1875 35.5
+L 73.1875 27.203125
+L 10.59375 27.203125
+z
+" id="DejaVuSans-8722"/>
+ </defs>
+ <g transform="translate(26.167812 707.039219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-54"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_10">
+ <g id="line2d_100">
+ <path clip-path="url(#p132af09dac)" d="M 60.635 668.788235
+L 693.54 668.788235
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_101">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="668.788235"/>
+ </g>
+ </g>
+ <g id="text_24">
+ <!-- −140 -->
+ <g transform="translate(26.167812 672.587454)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-52"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_11">
+ <g id="line2d_102">
+ <path clip-path="url(#p132af09dac)" d="M 60.635 634.336471
+L 693.54 634.336471
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_103">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="634.336471"/>
+ </g>
+ </g>
+ <g id="text_25">
+ <!-- −120 -->
+ <g transform="translate(26.167812 638.135689)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-50"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_12">
+ <g id="line2d_104">
+ <path clip-path="url(#p132af09dac)" d="M 60.635 599.884706
+L 693.54 599.884706
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_105">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="599.884706"/>
+ </g>
+ </g>
+ <g id="text_26">
+ <!-- −100 -->
+ <g transform="translate(26.167812 603.683925)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_13">
+ <g id="line2d_106">
+ <path clip-path="url(#p132af09dac)" d="M 60.635 565.432941
+L 693.54 565.432941
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_107">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="565.432941"/>
+ </g>
+ </g>
+ <g id="text_27">
+ <!-- −80 -->
+ <g transform="translate(32.530312 569.23216)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-56"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_14">
+ <g id="line2d_108">
+ <path clip-path="url(#p132af09dac)" d="M 60.635 530.981176
+L 693.54 530.981176
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_109">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="530.981176"/>
+ </g>
+ </g>
+ <g id="text_28">
+ <!-- −60 -->
+ <g transform="translate(32.530312 534.780395)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-54"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_15">
+ <g id="line2d_110">
+ <path clip-path="url(#p132af09dac)" d="M 60.635 496.529412
+L 693.54 496.529412
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_111">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="496.529412"/>
+ </g>
+ </g>
+ <g id="text_29">
+ <!-- −40 -->
+ <g transform="translate(32.530312 500.328631)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-52"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_16">
+ <g id="line2d_112">
+ <path clip-path="url(#p132af09dac)" d="M 60.635 462.077647
+L 693.54 462.077647
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_113">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="462.077647"/>
+ </g>
+ </g>
+ <g id="text_30">
+ <!-- −20 -->
+ <g transform="translate(32.530312 465.876866)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_17">
+ <g id="line2d_114">
+ <path clip-path="url(#p132af09dac)" d="M 60.635 427.625882
+L 693.54 427.625882
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_115">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="427.625882"/>
+ </g>
+ </g>
+ <g id="text_31">
+ <!-- 0 -->
+ <g transform="translate(47.2725 431.425101)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_32">
+ <!-- Gain (dB) -->
+ <defs>
+ <path d="M 59.515625 10.40625
+L 59.515625 29.984375
+L 43.40625 29.984375
+L 43.40625 38.09375
+L 69.28125 38.09375
+L 69.28125 6.78125
+Q 63.578125 2.734375 56.6875 0.65625
+Q 49.8125 -1.421875 42 -1.421875
+Q 24.90625 -1.421875 15.25 8.5625
+Q 5.609375 18.5625 5.609375 36.375
+Q 5.609375 54.25 15.25 64.234375
+Q 24.90625 74.21875 42 74.21875
+Q 49.125 74.21875 55.546875 72.453125
+Q 61.96875 70.703125 67.390625 67.28125
+L 67.390625 56.78125
+Q 61.921875 61.421875 55.765625 63.765625
+Q 49.609375 66.109375 42.828125 66.109375
+Q 29.4375 66.109375 22.71875 58.640625
+Q 16.015625 51.171875 16.015625 36.375
+Q 16.015625 21.625 22.71875 14.15625
+Q 29.4375 6.6875 42.828125 6.6875
+Q 48.046875 6.6875 52.140625 7.59375
+Q 56.25 8.5 59.515625 10.40625
+z
+" id="DejaVuSans-71"/>
+ <path d="M 19.671875 34.8125
+L 19.671875 8.109375
+L 35.5 8.109375
+Q 43.453125 8.109375 47.28125 11.40625
+Q 51.125 14.703125 51.125 21.484375
+Q 51.125 28.328125 47.28125 31.5625
+Q 43.453125 34.8125 35.5 34.8125
+z
+M 19.671875 64.796875
+L 19.671875 42.828125
+L 34.28125 42.828125
+Q 41.5 42.828125 45.03125 45.53125
+Q 48.578125 48.25 48.578125 53.8125
+Q 48.578125 59.328125 45.03125 62.0625
+Q 41.5 64.796875 34.28125 64.796875
+z
+M 9.8125 72.90625
+L 35.015625 72.90625
+Q 46.296875 72.90625 52.390625 68.21875
+Q 58.5 63.53125 58.5 54.890625
+Q 58.5 48.1875 55.375 44.234375
+Q 52.25 40.28125 46.1875 39.3125
+Q 53.46875 37.75 57.5 32.78125
+Q 61.53125 27.828125 61.53125 20.40625
+Q 61.53125 10.640625 54.890625 5.3125
+Q 48.25 0 35.984375 0
+L 9.8125 0
+z
+" id="DejaVuSans-66"/>
+ </defs>
+ <g transform="translate(20.088125 580.411406)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-71"/>
+ <use x="77.490234" xlink:href="#DejaVuSans-97"/>
+ <use x="138.769531" xlink:href="#DejaVuSans-105"/>
+ <use x="166.552734" xlink:href="#DejaVuSans-110"/>
+ <use x="229.931641" xlink:href="#DejaVuSans-32"/>
+ <use x="261.71875" xlink:href="#DejaVuSans-40"/>
+ <use x="300.732422" xlink:href="#DejaVuSans-100"/>
+ <use x="364.208984" xlink:href="#DejaVuSans-66"/>
+ <use x="432.8125" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_116">
+ <path clip-path="url(#p132af09dac)" d="M -1 427.62639
+L 231.766934 427.725552
+L 278.915779 427.944239
+L 308.567303 428.287781
+L 330.248628 428.758231
+L 347.349128 429.358549
+L 360.283721 430.020387
+L 371.440445 430.796977
+L 381.249497 431.693693
+L 390.001653 432.717623
+L 397.902675 433.87803
+L 404.411472 435.048726
+L 410.437678 436.349572
+L 416.04794 437.791554
+L 421.295991 439.385223
+L 426.225777 441.138775
+L 430.873702 443.055864
+L 435.270263 445.133727
+L 439.441257 447.362296
+L 443.408705 449.724676
+L 447.601209 452.479607
+L 451.97626 455.628896
+L 456.495009 459.155285
+L 461.467876 463.322246
+L 467.124068 468.371054
+L 473.310819 474.197443
+L 480.708331 481.482659
+L 489.466037 490.43369
+L 499.987888 501.514685
+L 512.676001 515.207375
+L 527.256649 531.274515
+L 542.465077 548.365099
+L 556.673431 564.660011
+L 569.406637 579.5957
+L 580.57273 593.031145
+L 590.389023 605.18612
+L 599.083536 616.302416
+L 606.822298 626.552821
+L 613.78234 636.1351
+L 620.095429 645.199651
+L 625.862296 653.86481
+L 631.161667 662.226742
+L 636.015971 670.297285
+L 640.520568 678.21483
+L 644.680129 685.970696
+L 648.568233 693.68849
+L 652.179896 701.348034
+L 655.57464 709.068983
+L 658.742008 716.824808
+L 661.702563 724.658823
+L 664.50238 732.69966
+L 667.126623 740.917274
+L 669.5889 749.362443
+L 671.901126 758.091017
+L 674.073786 767.16606
+L 676.116147 776.660589
+L 678.03643 786.661368
+L 679.818457 797.127145
+L 681.493228 808.302304
+L 683.043899 820.159313
+L 684.499017 833.038436
+L 685.819478 846.709993
+L 687.054361 861.859121
+L 688.164793 878.247001
+L 689.260266 898.223007
+L 690.093008 917.261855
+L 690.794195 937.24298
+L 691.019761 944.402353
+L 693.520145 944.402353
+L 693.520145 944.402353
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_8">
+ <path d="M 60.635 703.24
+L 60.635 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_9">
+ <path d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_10">
+ <path d="M 60.635 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_11">
+ <path d="M 60.635 410.4
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_3">
+ <g id="patch_12">
+ <path d="M 60.635 1038.04
+L 693.54 1038.04
+L 693.54 745.2
+L 60.635 745.2
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_5">
+ <g id="xtick_41">
+ <g id="line2d_117">
+ <path clip-path="url(#p0635cadd9a)" d="M 60.635 1038.04
+L 60.635 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_118">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_33">
+ <!-- 10Hz -->
+ <g transform="translate(47.888125 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_42">
+ <g id="line2d_119">
+ <path clip-path="url(#p0635cadd9a)" d="M 60.635 1038.04
+L 60.635 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_120">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_43">
+ <g id="line2d_121">
+ <path clip-path="url(#p0635cadd9a)" d="M 116.999344 1038.04
+L 116.999344 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_122">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="116.999344" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_44">
+ <g id="line2d_123">
+ <path clip-path="url(#p0635cadd9a)" d="M 149.970372 1038.04
+L 149.970372 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_124">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="149.970372" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_45">
+ <g id="line2d_125">
+ <path clip-path="url(#p0635cadd9a)" d="M 173.363688 1038.04
+L 173.363688 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_126">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="173.363688" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_46">
+ <g id="line2d_127">
+ <path clip-path="url(#p0635cadd9a)" d="M 191.508954 1038.04
+L 191.508954 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_128">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="191.508954" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_47">
+ <g id="line2d_129">
+ <path clip-path="url(#p0635cadd9a)" d="M 206.334716 1038.04
+L 206.334716 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_130">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="206.334716" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_48">
+ <g id="line2d_131">
+ <path clip-path="url(#p0635cadd9a)" d="M 218.869719 1038.04
+L 218.869719 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_132">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="218.869719" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_49">
+ <g id="line2d_133">
+ <path clip-path="url(#p0635cadd9a)" d="M 229.728032 1038.04
+L 229.728032 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_134">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="229.728032" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_50">
+ <g id="line2d_135">
+ <path clip-path="url(#p0635cadd9a)" d="M 239.305743 1038.04
+L 239.305743 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_136">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="239.305743" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_51">
+ <g id="line2d_137">
+ <path clip-path="url(#p0635cadd9a)" d="M 247.873298 1038.04
+L 247.873298 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_138">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.873298" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_34">
+ <!-- 100Hz -->
+ <g transform="translate(231.945173 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_52">
+ <g id="line2d_139">
+ <path clip-path="url(#p0635cadd9a)" d="M 247.873298 1038.04
+L 247.873298 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_140">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.873298" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_53">
+ <g id="line2d_141">
+ <path clip-path="url(#p0635cadd9a)" d="M 304.237642 1038.04
+L 304.237642 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_142">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="304.237642" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_54">
+ <g id="line2d_143">
+ <path clip-path="url(#p0635cadd9a)" d="M 337.20867 1038.04
+L 337.20867 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_144">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="337.20867" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_55">
+ <g id="line2d_145">
+ <path clip-path="url(#p0635cadd9a)" d="M 360.601986 1038.04
+L 360.601986 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_146">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="360.601986" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_56">
+ <g id="line2d_147">
+ <path clip-path="url(#p0635cadd9a)" d="M 378.747252 1038.04
+L 378.747252 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_148">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="378.747252" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_57">
+ <g id="line2d_149">
+ <path clip-path="url(#p0635cadd9a)" d="M 393.573014 1038.04
+L 393.573014 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_150">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="393.573014" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_58">
+ <g id="line2d_151">
+ <path clip-path="url(#p0635cadd9a)" d="M 406.108017 1038.04
+L 406.108017 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_152">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="406.108017" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_59">
+ <g id="line2d_153">
+ <path clip-path="url(#p0635cadd9a)" d="M 416.96633 1038.04
+L 416.96633 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_154">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="416.96633" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_60">
+ <g id="line2d_155">
+ <path clip-path="url(#p0635cadd9a)" d="M 426.544041 1038.04
+L 426.544041 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_156">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="426.544041" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_61">
+ <g id="line2d_157">
+ <path clip-path="url(#p0635cadd9a)" d="M 435.111596 1038.04
+L 435.111596 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_158">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.111596" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_35">
+ <!-- 1kHz -->
+ <g transform="translate(422.650659 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_62">
+ <g id="line2d_159">
+ <path clip-path="url(#p0635cadd9a)" d="M 435.111596 1038.04
+L 435.111596 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_160">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.111596" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_63">
+ <g id="line2d_161">
+ <path clip-path="url(#p0635cadd9a)" d="M 491.47594 1038.04
+L 491.47594 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_162">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="491.47594" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_64">
+ <g id="line2d_163">
+ <path clip-path="url(#p0635cadd9a)" d="M 524.446968 1038.04
+L 524.446968 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_164">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.446968" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_65">
+ <g id="line2d_165">
+ <path clip-path="url(#p0635cadd9a)" d="M 547.840284 1038.04
+L 547.840284 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_166">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.840284" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_66">
+ <g id="line2d_167">
+ <path clip-path="url(#p0635cadd9a)" d="M 565.98555 1038.04
+L 565.98555 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_168">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="565.98555" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_67">
+ <g id="line2d_169">
+ <path clip-path="url(#p0635cadd9a)" d="M 580.811312 1038.04
+L 580.811312 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_170">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="580.811312" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_68">
+ <g id="line2d_171">
+ <path clip-path="url(#p0635cadd9a)" d="M 593.346315 1038.04
+L 593.346315 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_172">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.346315" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_69">
+ <g id="line2d_173">
+ <path clip-path="url(#p0635cadd9a)" d="M 604.204628 1038.04
+L 604.204628 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_174">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.204628" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_70">
+ <g id="line2d_175">
+ <path clip-path="url(#p0635cadd9a)" d="M 613.78234 1038.04
+L 613.78234 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_176">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="613.78234" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_71">
+ <g id="line2d_177">
+ <path clip-path="url(#p0635cadd9a)" d="M 622.349894 1038.04
+L 622.349894 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_178">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.349894" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_36">
+ <!-- 10kHz -->
+ <g transform="translate(606.707707 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_72">
+ <g id="line2d_179">
+ <path clip-path="url(#p0635cadd9a)" d="M 622.349894 1038.04
+L 622.349894 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_180">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.349894" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_73">
+ <g id="line2d_181">
+ <path clip-path="url(#p0635cadd9a)" d="M 678.714238 1038.04
+L 678.714238 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_182">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.714238" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_74">
+ <g id="line2d_183">
+ <path clip-path="url(#p0635cadd9a)" d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_184">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#mf1d2ccf567" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_37">
+ <!-- 24kHz -->
+ <g transform="translate(677.897813 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_38">
+ <!-- Frequency (Hz) -->
+ <g transform="translate(338.914844 1066.316563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_6">
+ <g id="ytick_18">
+ <g id="line2d_185">
+ <path clip-path="url(#p0635cadd9a)" d="M 60.635 1007.214737
+L 693.54 1007.214737
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_186">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="1007.214737"/>
+ </g>
+ </g>
+ <g id="text_39">
+ <!-- −150 -->
+ <g transform="translate(26.167812 1011.013956)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_19">
+ <g id="line2d_187">
+ <path clip-path="url(#p0635cadd9a)" d="M 60.635 968.683158
+L 693.54 968.683158
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_188">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="968.683158"/>
+ </g>
+ </g>
+ <g id="text_40">
+ <!-- −100 -->
+ <g transform="translate(26.167812 972.482377)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_20">
+ <g id="line2d_189">
+ <path clip-path="url(#p0635cadd9a)" d="M 60.635 930.151579
+L 693.54 930.151579
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_190">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="930.151579"/>
+ </g>
+ </g>
+ <g id="text_41">
+ <!-- −50 -->
+ <g transform="translate(32.530312 933.950798)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-53"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_21">
+ <g id="line2d_191">
+ <path clip-path="url(#p0635cadd9a)" d="M 60.635 891.62
+L 693.54 891.62
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_192">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="891.62"/>
+ </g>
+ </g>
+ <g id="text_42">
+ <!-- 0 -->
+ <g transform="translate(47.2725 895.419219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_22">
+ <g id="line2d_193">
+ <path clip-path="url(#p0635cadd9a)" d="M 60.635 853.088421
+L 693.54 853.088421
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_194">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="853.088421"/>
+ </g>
+ </g>
+ <g id="text_43">
+ <!-- 50 -->
+ <g transform="translate(40.91 856.88764)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-53"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_23">
+ <g id="line2d_195">
+ <path clip-path="url(#p0635cadd9a)" d="M 60.635 814.556842
+L 693.54 814.556842
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_196">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="814.556842"/>
+ </g>
+ </g>
+ <g id="text_44">
+ <!-- 100 -->
+ <g transform="translate(34.5475 818.356061)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_24">
+ <g id="line2d_197">
+ <path clip-path="url(#p0635cadd9a)" d="M 60.635 776.025263
+L 693.54 776.025263
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_198">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="60.635" xlink:href="#m9696ac068d" y="776.025263"/>
+ </g>
+ </g>
+ <g id="text_45">
+ <!-- 150 -->
+ <g transform="translate(34.5475 779.824482)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-53"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_46">
+ <!-- Phase (${\circ}$) -->
+ <defs>
+ <path d="M 19.671875 64.796875
+L 19.671875 37.40625
+L 32.078125 37.40625
+Q 38.96875 37.40625 42.71875 40.96875
+Q 46.484375 44.53125 46.484375 51.125
+Q 46.484375 57.671875 42.71875 61.234375
+Q 38.96875 64.796875 32.078125 64.796875
+z
+M 9.8125 72.90625
+L 32.078125 72.90625
+Q 44.34375 72.90625 50.609375 67.359375
+Q 56.890625 61.8125 56.890625 51.125
+Q 56.890625 40.328125 50.609375 34.8125
+Q 44.34375 29.296875 32.078125 29.296875
+L 19.671875 29.296875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-80"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-104"/>
+ <path d="M 31.296875 40.671875
+Q 27.390625 40.671875 24.703125 37.953125
+Q 22.015625 35.25 22.015625 31.34375
+Q 22.015625 27.484375 24.703125 24.828125
+Q 27.390625 22.171875 31.296875 22.171875
+Q 35.203125 22.171875 37.890625 24.828125
+Q 40.578125 27.484375 40.578125 31.34375
+Q 40.578125 35.203125 37.859375 37.9375
+Q 35.15625 40.671875 31.296875 40.671875
+z
+M 31.296875 46.96875
+Q 34.421875 46.96875 37.296875 45.765625
+Q 40.1875 44.578125 42.28125 42.328125
+Q 44.53125 40.140625 45.65625 37.34375
+Q 46.78125 34.5625 46.78125 31.34375
+Q 46.78125 24.90625 42.265625 20.4375
+Q 37.75 15.96875 31.203125 15.96875
+Q 24.609375 15.96875 20.21875 20.359375
+Q 15.828125 24.75 15.828125 31.34375
+Q 15.828125 37.890625 20.3125 42.421875
+Q 24.8125 46.96875 31.296875 46.96875
+z
+" id="DejaVuSans-8728"/>
+ </defs>
+ <g transform="translate(20.088125 915.17)rotate(-90)scale(0.1 -0.1)">
+ <use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-80"/>
+ <use transform="translate(60.302734 0.015625)" xlink:href="#DejaVuSans-104"/>
+ <use transform="translate(123.681641 0.015625)" xlink:href="#DejaVuSans-97"/>
+ <use transform="translate(184.960938 0.015625)" xlink:href="#DejaVuSans-115"/>
+ <use transform="translate(237.060547 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(298.583984 0.015625)" xlink:href="#DejaVuSans-32"/>
+ <use transform="translate(330.371094 0.015625)" xlink:href="#DejaVuSans-40"/>
+ <use transform="translate(369.384766 0.015625)" xlink:href="#DejaVuSans-8728"/>
+ <use transform="translate(431.982422 0.015625)" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_199">
+ <path clip-path="url(#p0635cadd9a)" d="M -1 892.826781
+L 17.167871 892.826899
+L 73.532215 894.033797
+L 106.503243 895.240697
+L 129.896559 896.447598
+L 148.041825 897.6545
+L 162.867587 898.861403
+L 175.40259 900.068309
+L 186.260904 901.275218
+L 195.838615 902.482129
+L 204.406169 903.689044
+L 219.231931 906.102884
+L 231.766934 908.516741
+L 242.625248 910.930618
+L 252.202959 913.344517
+L 260.770513 915.758442
+L 268.520809 918.172396
+L 275.596275 920.586381
+L 282.105073 923.0004
+L 288.131278 925.414455
+L 296.407897 929.035615
+L 303.919377 932.656873
+L 310.795293 936.27824
+L 317.134858 939.899725
+L 323.015725 943.521338
+L 328.499818 947.143088
+L 333.637309 950.764985
+L 338.469417 954.387037
+L 344.495622 959.216699
+L 350.105885 964.046674
+L 355.353936 968.876979
+L 360.283721 973.707628
+L 364.931647 978.538625
+L 370.391184 984.577849
+L 375.50712 990.617549
+L 380.320155 996.657587
+L 384.864162 1002.697706
+L 390.001653 1009.945312
+L 394.833761 1017.191081
+L 399.394763 1024.432874
+L 402.299235 1029.256944
+L 403.009428 753.03494
+L 407.814335 761.462265
+L 412.351097 769.863411
+L 417.243794 779.412871
+L 422.417616 790.052182
+L 427.804789 801.676394
+L 433.830994 815.220457
+L 444.264677 839.347457
+L 452.362562 857.800153
+L 457.947129 869.967577
+L 462.834573 880.087956
+L 467.444844 889.122247
+L 471.807698 897.193244
+L 476.236191 904.909951
+L 480.435914 911.797097
+L 484.688729 918.362427
+L 488.976176 924.587195
+L 493.282177 930.465097
+L 497.813519 936.273091
+L 502.314399 941.685697
+L 506.973907 946.94225
+L 511.752988 951.994435
+L 516.617222 956.810554
+L 521.536721 961.372264
+L 526.640611 965.801549
+L 531.878999 970.051038
+L 537.208543 974.090226
+L 542.719192 977.988883
+L 548.354822 981.707025
+L 554.177863 985.28617
+L 560.227676 988.745225
+L 566.523758 992.088052
+L 573.068957 995.309543
+L 579.852756 998.400421
+L 587.001845 1001.41047
+L 594.450533 1004.303806
+L 602.31673 1007.119102
+L 610.652318 1009.864396
+L 619.604089 1012.575161
+L 629.30218 1015.27565
+L 640.062014 1018.036269
+L 652.640801 1021.026287
+L 670.98935 1025.130747
+L 688.524555 1029.097233
+L 688.65115 1029.151272
+L 688.67223 1029.134144
+L 688.924766 1029.187845
+L 689.092689 1029.207496
+L 689.448378 1029.312966
+L 689.469252 1029.395578
+L 689.490121 1029.247515
+L 689.531844 1029.262996
+L 689.615224 1029.264903
+L 689.677703 1029.516585
+L 689.740134 1029.487927
+L 689.781728 1029.373967
+L 689.802517 752.164822
+L 689.823301 1029.502499
+L 689.885621 1029.482629
+L 689.906383 1029.310432
+L 689.968639 1029.36209
+L 689.98938 752.234665
+L 690.072293 1029.370828
+L 690.093008 752.306978
+L 690.113718 1029.506056
+L 690.217187 1029.344406
+L 690.258538 1029.266727
+L 690.341177 752.282273
+L 690.382465 752.573085
+L 690.464978 1029.559133
+L 690.423732 752.191335
+L 690.485593 1029.12429
+L 690.506203 752.906316
+L 690.526807 1029.459463
+L 690.58859 1029.341628
+L 690.629753 1029.26994
+L 690.650326 1028.6991
+L 690.670895 752.33292
+L 690.691458 1029.156525
+L 690.753116 752.906316
+L 690.814727 1029.516112
+L 690.855775 752.481772
+L 690.876291 1029.450723
+L 690.999281 752.325376
+L 691.060706 753.596165
+L 691.081171 1028.127824
+L 691.10163 752.906316
+L 691.162978 754.179634
+L 691.183417 754.515382
+L 691.203851 752.906316
+L 691.22428 754.055898
+L 691.244703 1029.092182
+L 691.305943 753.458211
+L 691.326346 753.596165
+L 691.346744 753.519525
+L 691.367137 752.906316
+L 691.387525 1028.495
+L 691.469025 756.054821
+L 691.530096 765.775281
+L 691.509744 752.906316
+L 691.550443 757.307079
+L 691.570785 752.906316
+L 691.591122 763.723088
+L 691.611454 1023.04172
+L 691.652102 752.906316
+L 691.69273 760.19828
+L 691.753633 767.11287
+L 691.814491 752.906316
+L 691.834767 752.906316
+L 691.855038 995.655263
+L 691.936071 778.868946
+L 691.976557 778.868946
+L 691.996793 773.378183
+L 692.017023 1004.371054
+L 692.097895 801.791291
+L 692.138301 752.906316
+L 692.158496 981.448709
+L 692.239227 801.791291
+L 692.259398 752.906316
+L 692.279563 811.446385
+L 692.360174 979.186387
+L 692.319879 752.906316
+L 692.40045 962.356204
+L 692.42058 952.793
+L 692.501052 981.448709
+L 692.541258 752.906316
+L 692.661757 891.62
+L 692.74199 981.448709
+L 692.701883 811.446385
+L 692.762036 891.62
+L 692.802113 752.906316
+L 692.862192 891.62
+L 692.882208 891.62
+L 692.90222 960.976842
+L 692.962225 891.62
+L 693.002203 995.655263
+L 693.082102 822.263158
+L 693.141974 891.62
+L 693.122021 752.906316
+L 693.181864 871.148133
+L 693.241663 912.091867
+L 693.301418 822.263158
+L 693.361129 960.976842
+L 693.420797 897.110763
+L 693.440676 880.803228
+L 693.46055 902.436772
+L 693.500285 960.976842
+L 693.520145 822.263158
+L 693.520145 822.263158
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_13">
+ <path d="M 60.635 1038.04
+L 60.635 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_14">
+ <path d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_15">
+ <path d="M 60.635 1038.04
+L 693.54 1038.04
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_16">
+ <path d="M 60.635 745.2
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="text_47">
+ <!-- 6th-order Bessel filter, lowpass 1khz -->
+ <defs>
+ <path d="M 4.890625 31.390625
+L 31.203125 31.390625
+L 31.203125 23.390625
+L 4.890625 23.390625
+z
+" id="DejaVuSans-45"/>
+ <path d="M 30.609375 48.390625
+Q 23.390625 48.390625 19.1875 42.75
+Q 14.984375 37.109375 14.984375 27.296875
+Q 14.984375 17.484375 19.15625 11.84375
+Q 23.34375 6.203125 30.609375 6.203125
+Q 37.796875 6.203125 41.984375 11.859375
+Q 46.1875 17.53125 46.1875 27.296875
+Q 46.1875 37.015625 41.984375 42.703125
+Q 37.796875 48.390625 30.609375 48.390625
+z
+M 30.609375 56
+Q 42.328125 56 49.015625 48.375
+Q 55.71875 40.765625 55.71875 27.296875
+Q 55.71875 13.875 49.015625 6.21875
+Q 42.328125 -1.421875 30.609375 -1.421875
+Q 18.84375 -1.421875 12.171875 6.21875
+Q 5.515625 13.875 5.515625 27.296875
+Q 5.515625 40.765625 12.171875 48.375
+Q 18.84375 56 30.609375 56
+z
+" id="DejaVuSans-111"/>
+ <path d="M 37.109375 75.984375
+L 37.109375 68.5
+L 28.515625 68.5
+Q 23.6875 68.5 21.796875 66.546875
+Q 19.921875 64.59375 19.921875 59.515625
+L 19.921875 54.6875
+L 34.71875 54.6875
+L 34.71875 47.703125
+L 19.921875 47.703125
+L 19.921875 0
+L 10.890625 0
+L 10.890625 47.703125
+L 2.296875 47.703125
+L 2.296875 54.6875
+L 10.890625 54.6875
+L 10.890625 58.5
+Q 10.890625 67.625 15.140625 71.796875
+Q 19.390625 75.984375 28.609375 75.984375
+z
+" id="DejaVuSans-102"/>
+ <path d="M 11.71875 12.40625
+L 22.015625 12.40625
+L 22.015625 4
+L 14.015625 -11.625
+L 7.71875 -11.625
+L 11.71875 4
+z
+" id="DejaVuSans-44"/>
+ <path d="M 4.203125 54.6875
+L 13.1875 54.6875
+L 24.421875 12.015625
+L 35.59375 54.6875
+L 46.1875 54.6875
+L 57.421875 12.015625
+L 68.609375 54.6875
+L 77.59375 54.6875
+L 63.28125 0
+L 52.6875 0
+L 40.921875 44.828125
+L 29.109375 0
+L 18.5 0
+z
+" id="DejaVuSans-119"/>
+ </defs>
+ <g transform="translate(214.16375 33.7575)scale(0.16 -0.16)">
+ <use xlink:href="#DejaVuSans-54"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-116"/>
+ <use x="102.832031" xlink:href="#DejaVuSans-104"/>
+ <use x="166.210938" xlink:href="#DejaVuSans-45"/>
+ <use x="202.310547" xlink:href="#DejaVuSans-111"/>
+ <use x="263.492188" xlink:href="#DejaVuSans-114"/>
+ <use x="304.589844" xlink:href="#DejaVuSans-100"/>
+ <use x="368.066406" xlink:href="#DejaVuSans-101"/>
+ <use x="429.589844" xlink:href="#DejaVuSans-114"/>
+ <use x="470.703125" xlink:href="#DejaVuSans-32"/>
+ <use x="502.490234" xlink:href="#DejaVuSans-66"/>
+ <use x="571.09375" xlink:href="#DejaVuSans-101"/>
+ <use x="632.617188" xlink:href="#DejaVuSans-115"/>
+ <use x="684.716797" xlink:href="#DejaVuSans-115"/>
+ <use x="736.816406" xlink:href="#DejaVuSans-101"/>
+ <use x="798.339844" xlink:href="#DejaVuSans-108"/>
+ <use x="826.123047" xlink:href="#DejaVuSans-32"/>
+ <use x="857.910156" xlink:href="#DejaVuSans-102"/>
+ <use x="893.115234" xlink:href="#DejaVuSans-105"/>
+ <use x="920.898438" xlink:href="#DejaVuSans-108"/>
+ <use x="948.681641" xlink:href="#DejaVuSans-116"/>
+ <use x="987.890625" xlink:href="#DejaVuSans-101"/>
+ <use x="1049.414062" xlink:href="#DejaVuSans-114"/>
+ <use x="1090.527344" xlink:href="#DejaVuSans-44"/>
+ <use x="1122.314453" xlink:href="#DejaVuSans-32"/>
+ <use x="1154.101562" xlink:href="#DejaVuSans-108"/>
+ <use x="1181.884766" xlink:href="#DejaVuSans-111"/>
+ <use x="1243.066406" xlink:href="#DejaVuSans-119"/>
+ <use x="1324.853516" xlink:href="#DejaVuSans-112"/>
+ <use x="1388.330078" xlink:href="#DejaVuSans-97"/>
+ <use x="1449.609375" xlink:href="#DejaVuSans-115"/>
+ <use x="1501.708984" xlink:href="#DejaVuSans-115"/>
+ <use x="1553.808594" xlink:href="#DejaVuSans-32"/>
+ <use x="1585.595703" xlink:href="#DejaVuSans-49"/>
+ <use x="1649.21875" xlink:href="#DejaVuSans-107"/>
+ <use x="1707.128906" xlink:href="#DejaVuSans-104"/>
+ <use x="1770.507812" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="p7698809570">
+ <rect height="292.84" width="632.905" x="60.635" y="75.6"/>
+ </clipPath>
+ <clipPath id="p132af09dac">
+ <rect height="292.84" width="632.905" x="60.635" y="410.4"/>
+ </clipPath>
+ <clipPath id="p0635cadd9a">
+ <rect height="292.84" width="632.905" x="60.635" y="745.2"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/docs/docs/img/butterworth_bandpass12.svg b/docs/docs/img/butterworth_bandpass12.svg
@@ -0,0 +1,4844 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Created with matplotlib (https://matplotlib.org/) -->
+<svg height="1080pt" version="1.1" viewBox="0 0 720 1080" width="720pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+ </style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 1080
+L 720 1080
+L 720 0
+L 0 0
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="axes_1">
+ <g id="patch_2">
+ <path d="M 68.96 368.44
+L 693.54 368.44
+L 693.54 75.6
+L 68.96 75.6
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_1">
+ <g id="xtick_1">
+ <g id="line2d_1">
+ <path clip-path="url(#p46b4aed2e7)" d="M 68.96 368.44
+L 68.96 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_2">
+ <defs>
+ <path d="M 0 0
+L 0 3.5
+" id="m0c3b1ae8ab" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m0c3b1ae8ab" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- 0 -->
+ <defs>
+ <path d="M 31.78125 66.40625
+Q 24.171875 66.40625 20.328125 58.90625
+Q 16.5 51.421875 16.5 36.375
+Q 16.5 21.390625 20.328125 13.890625
+Q 24.171875 6.390625 31.78125 6.390625
+Q 39.453125 6.390625 43.28125 13.890625
+Q 47.125 21.390625 47.125 36.375
+Q 47.125 51.421875 43.28125 58.90625
+Q 39.453125 66.40625 31.78125 66.40625
+z
+M 31.78125 74.21875
+Q 44.046875 74.21875 50.515625 64.515625
+Q 56.984375 54.828125 56.984375 36.375
+Q 56.984375 17.96875 50.515625 8.265625
+Q 44.046875 -1.421875 31.78125 -1.421875
+Q 19.53125 -1.421875 13.0625 8.265625
+Q 6.59375 17.96875 6.59375 36.375
+Q 6.59375 54.828125 13.0625 64.515625
+Q 19.53125 74.21875 31.78125 74.21875
+z
+" id="DejaVuSans-48"/>
+ </defs>
+ <g transform="translate(65.77875 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_2">
+ <g id="line2d_3">
+ <path clip-path="url(#p46b4aed2e7)" d="M 191.067527 368.44
+L 191.067527 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_4">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="191.067527" xlink:href="#m0c3b1ae8ab" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- 200 -->
+ <defs>
+ <path d="M 19.1875 8.296875
+L 53.609375 8.296875
+L 53.609375 0
+L 7.328125 0
+L 7.328125 8.296875
+Q 12.9375 14.109375 22.625 23.890625
+Q 32.328125 33.6875 34.8125 36.53125
+Q 39.546875 41.84375 41.421875 45.53125
+Q 43.3125 49.21875 43.3125 52.78125
+Q 43.3125 58.59375 39.234375 62.25
+Q 35.15625 65.921875 28.609375 65.921875
+Q 23.96875 65.921875 18.8125 64.3125
+Q 13.671875 62.703125 7.8125 59.421875
+L 7.8125 69.390625
+Q 13.765625 71.78125 18.9375 73
+Q 24.125 74.21875 28.421875 74.21875
+Q 39.75 74.21875 46.484375 68.546875
+Q 53.21875 62.890625 53.21875 53.421875
+Q 53.21875 48.921875 51.53125 44.890625
+Q 49.859375 40.875 45.40625 35.40625
+Q 44.1875 33.984375 37.640625 27.21875
+Q 31.109375 20.453125 19.1875 8.296875
+z
+" id="DejaVuSans-50"/>
+ </defs>
+ <g transform="translate(181.523777 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_3">
+ <g id="line2d_5">
+ <path clip-path="url(#p46b4aed2e7)" d="M 313.175054 368.44
+L 313.175054 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_6">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="313.175054" xlink:href="#m0c3b1ae8ab" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- 400 -->
+ <defs>
+ <path d="M 37.796875 64.3125
+L 12.890625 25.390625
+L 37.796875 25.390625
+z
+M 35.203125 72.90625
+L 47.609375 72.90625
+L 47.609375 25.390625
+L 58.015625 25.390625
+L 58.015625 17.1875
+L 47.609375 17.1875
+L 47.609375 0
+L 37.796875 0
+L 37.796875 17.1875
+L 4.890625 17.1875
+L 4.890625 26.703125
+z
+" id="DejaVuSans-52"/>
+ </defs>
+ <g transform="translate(303.631304 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-52"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_4">
+ <g id="line2d_7">
+ <path clip-path="url(#p46b4aed2e7)" d="M 435.282581 368.44
+L 435.282581 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_8">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.282581" xlink:href="#m0c3b1ae8ab" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- 600 -->
+ <defs>
+ <path d="M 33.015625 40.375
+Q 26.375 40.375 22.484375 35.828125
+Q 18.609375 31.296875 18.609375 23.390625
+Q 18.609375 15.53125 22.484375 10.953125
+Q 26.375 6.390625 33.015625 6.390625
+Q 39.65625 6.390625 43.53125 10.953125
+Q 47.40625 15.53125 47.40625 23.390625
+Q 47.40625 31.296875 43.53125 35.828125
+Q 39.65625 40.375 33.015625 40.375
+z
+M 52.59375 71.296875
+L 52.59375 62.3125
+Q 48.875 64.0625 45.09375 64.984375
+Q 41.3125 65.921875 37.59375 65.921875
+Q 27.828125 65.921875 22.671875 59.328125
+Q 17.53125 52.734375 16.796875 39.40625
+Q 19.671875 43.65625 24.015625 45.921875
+Q 28.375 48.1875 33.59375 48.1875
+Q 44.578125 48.1875 50.953125 41.515625
+Q 57.328125 34.859375 57.328125 23.390625
+Q 57.328125 12.15625 50.6875 5.359375
+Q 44.046875 -1.421875 33.015625 -1.421875
+Q 20.359375 -1.421875 13.671875 8.265625
+Q 6.984375 17.96875 6.984375 36.375
+Q 6.984375 53.65625 15.1875 63.9375
+Q 23.390625 74.21875 37.203125 74.21875
+Q 40.921875 74.21875 44.703125 73.484375
+Q 48.484375 72.75 52.59375 71.296875
+z
+" id="DejaVuSans-54"/>
+ </defs>
+ <g transform="translate(425.738831 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-54"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_5">
+ <g id="line2d_9">
+ <path clip-path="url(#p46b4aed2e7)" d="M 557.390108 368.44
+L 557.390108 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_10">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="557.390108" xlink:href="#m0c3b1ae8ab" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- 800 -->
+ <defs>
+ <path d="M 31.78125 34.625
+Q 24.75 34.625 20.71875 30.859375
+Q 16.703125 27.09375 16.703125 20.515625
+Q 16.703125 13.921875 20.71875 10.15625
+Q 24.75 6.390625 31.78125 6.390625
+Q 38.8125 6.390625 42.859375 10.171875
+Q 46.921875 13.96875 46.921875 20.515625
+Q 46.921875 27.09375 42.890625 30.859375
+Q 38.875 34.625 31.78125 34.625
+z
+M 21.921875 38.8125
+Q 15.578125 40.375 12.03125 44.71875
+Q 8.5 49.078125 8.5 55.328125
+Q 8.5 64.0625 14.71875 69.140625
+Q 20.953125 74.21875 31.78125 74.21875
+Q 42.671875 74.21875 48.875 69.140625
+Q 55.078125 64.0625 55.078125 55.328125
+Q 55.078125 49.078125 51.53125 44.71875
+Q 48 40.375 41.703125 38.8125
+Q 48.828125 37.15625 52.796875 32.3125
+Q 56.78125 27.484375 56.78125 20.515625
+Q 56.78125 9.90625 50.3125 4.234375
+Q 43.84375 -1.421875 31.78125 -1.421875
+Q 19.734375 -1.421875 13.25 4.234375
+Q 6.78125 9.90625 6.78125 20.515625
+Q 6.78125 27.484375 10.78125 32.3125
+Q 14.796875 37.15625 21.921875 38.8125
+z
+M 18.3125 54.390625
+Q 18.3125 48.734375 21.84375 45.5625
+Q 25.390625 42.390625 31.78125 42.390625
+Q 38.140625 42.390625 41.71875 45.5625
+Q 45.3125 48.734375 45.3125 54.390625
+Q 45.3125 60.0625 41.71875 63.234375
+Q 38.140625 66.40625 31.78125 66.40625
+Q 25.390625 66.40625 21.84375 63.234375
+Q 18.3125 60.0625 18.3125 54.390625
+z
+" id="DejaVuSans-56"/>
+ </defs>
+ <g transform="translate(547.846358 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-56"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_6">
+ <g id="line2d_11">
+ <path clip-path="url(#p46b4aed2e7)" d="M 679.497634 368.44
+L 679.497634 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_12">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="679.497634" xlink:href="#m0c3b1ae8ab" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- 1000 -->
+ <defs>
+ <path d="M 12.40625 8.296875
+L 28.515625 8.296875
+L 28.515625 63.921875
+L 10.984375 60.40625
+L 10.984375 69.390625
+L 28.421875 72.90625
+L 38.28125 72.90625
+L 38.28125 8.296875
+L 54.390625 8.296875
+L 54.390625 0
+L 12.40625 0
+z
+" id="DejaVuSans-49"/>
+ </defs>
+ <g transform="translate(666.772634 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_7">
+ <!-- Samples -->
+ <defs>
+ <path d="M 53.515625 70.515625
+L 53.515625 60.890625
+Q 47.90625 63.578125 42.921875 64.890625
+Q 37.9375 66.21875 33.296875 66.21875
+Q 25.25 66.21875 20.875 63.09375
+Q 16.5 59.96875 16.5 54.203125
+Q 16.5 49.359375 19.40625 46.890625
+Q 22.3125 44.4375 30.421875 42.921875
+L 36.375 41.703125
+Q 47.40625 39.59375 52.65625 34.296875
+Q 57.90625 29 57.90625 20.125
+Q 57.90625 9.515625 50.796875 4.046875
+Q 43.703125 -1.421875 29.984375 -1.421875
+Q 24.8125 -1.421875 18.96875 -0.25
+Q 13.140625 0.921875 6.890625 3.21875
+L 6.890625 13.375
+Q 12.890625 10.015625 18.65625 8.296875
+Q 24.421875 6.59375 29.984375 6.59375
+Q 38.421875 6.59375 43.015625 9.90625
+Q 47.609375 13.234375 47.609375 19.390625
+Q 47.609375 24.75 44.3125 27.78125
+Q 41.015625 30.8125 33.5 32.328125
+L 27.484375 33.5
+Q 16.453125 35.6875 11.515625 40.375
+Q 6.59375 45.0625 6.59375 53.421875
+Q 6.59375 63.09375 13.40625 68.65625
+Q 20.21875 74.21875 32.171875 74.21875
+Q 37.3125 74.21875 42.625 73.28125
+Q 47.953125 72.359375 53.515625 70.515625
+z
+" id="DejaVuSans-83"/>
+ <path d="M 34.28125 27.484375
+Q 23.390625 27.484375 19.1875 25
+Q 14.984375 22.515625 14.984375 16.5
+Q 14.984375 11.71875 18.140625 8.90625
+Q 21.296875 6.109375 26.703125 6.109375
+Q 34.1875 6.109375 38.703125 11.40625
+Q 43.21875 16.703125 43.21875 25.484375
+L 43.21875 27.484375
+z
+M 52.203125 31.203125
+L 52.203125 0
+L 43.21875 0
+L 43.21875 8.296875
+Q 40.140625 3.328125 35.546875 0.953125
+Q 30.953125 -1.421875 24.3125 -1.421875
+Q 15.921875 -1.421875 10.953125 3.296875
+Q 6 8.015625 6 15.921875
+Q 6 25.140625 12.171875 29.828125
+Q 18.359375 34.515625 30.609375 34.515625
+L 43.21875 34.515625
+L 43.21875 35.40625
+Q 43.21875 41.609375 39.140625 45
+Q 35.0625 48.390625 27.6875 48.390625
+Q 23 48.390625 18.546875 47.265625
+Q 14.109375 46.140625 10.015625 43.890625
+L 10.015625 52.203125
+Q 14.9375 54.109375 19.578125 55.046875
+Q 24.21875 56 28.609375 56
+Q 40.484375 56 46.34375 49.84375
+Q 52.203125 43.703125 52.203125 31.203125
+z
+" id="DejaVuSans-97"/>
+ <path d="M 52 44.1875
+Q 55.375 50.25 60.0625 53.125
+Q 64.75 56 71.09375 56
+Q 79.640625 56 84.28125 50.015625
+Q 88.921875 44.046875 88.921875 33.015625
+L 88.921875 0
+L 79.890625 0
+L 79.890625 32.71875
+Q 79.890625 40.578125 77.09375 44.375
+Q 74.3125 48.1875 68.609375 48.1875
+Q 61.625 48.1875 57.5625 43.546875
+Q 53.515625 38.921875 53.515625 30.90625
+L 53.515625 0
+L 44.484375 0
+L 44.484375 32.71875
+Q 44.484375 40.625 41.703125 44.40625
+Q 38.921875 48.1875 33.109375 48.1875
+Q 26.21875 48.1875 22.15625 43.53125
+Q 18.109375 38.875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.1875 51.21875 25.484375 53.609375
+Q 29.78125 56 35.6875 56
+Q 41.65625 56 45.828125 52.96875
+Q 50 49.953125 52 44.1875
+z
+" id="DejaVuSans-109"/>
+ <path d="M 18.109375 8.203125
+L 18.109375 -20.796875
+L 9.078125 -20.796875
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+z
+M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+" id="DejaVuSans-112"/>
+ <path d="M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 0
+L 9.421875 0
+z
+" id="DejaVuSans-108"/>
+ <path d="M 56.203125 29.59375
+L 56.203125 25.203125
+L 14.890625 25.203125
+Q 15.484375 15.921875 20.484375 11.0625
+Q 25.484375 6.203125 34.421875 6.203125
+Q 39.59375 6.203125 44.453125 7.46875
+Q 49.3125 8.734375 54.109375 11.28125
+L 54.109375 2.78125
+Q 49.265625 0.734375 44.1875 -0.34375
+Q 39.109375 -1.421875 33.890625 -1.421875
+Q 20.796875 -1.421875 13.15625 6.1875
+Q 5.515625 13.8125 5.515625 26.8125
+Q 5.515625 40.234375 12.765625 48.109375
+Q 20.015625 56 32.328125 56
+Q 43.359375 56 49.78125 48.890625
+Q 56.203125 41.796875 56.203125 29.59375
+z
+M 47.21875 32.234375
+Q 47.125 39.59375 43.09375 43.984375
+Q 39.0625 48.390625 32.421875 48.390625
+Q 24.90625 48.390625 20.390625 44.140625
+Q 15.875 39.890625 15.1875 32.171875
+z
+" id="DejaVuSans-101"/>
+ <path d="M 44.28125 53.078125
+L 44.28125 44.578125
+Q 40.484375 46.53125 36.375 47.5
+Q 32.28125 48.484375 27.875 48.484375
+Q 21.1875 48.484375 17.84375 46.4375
+Q 14.5 44.390625 14.5 40.28125
+Q 14.5 37.15625 16.890625 35.375
+Q 19.28125 33.59375 26.515625 31.984375
+L 29.59375 31.296875
+Q 39.15625 29.25 43.1875 25.515625
+Q 47.21875 21.78125 47.21875 15.09375
+Q 47.21875 7.46875 41.1875 3.015625
+Q 35.15625 -1.421875 24.609375 -1.421875
+Q 20.21875 -1.421875 15.453125 -0.5625
+Q 10.6875 0.296875 5.421875 2
+L 5.421875 11.28125
+Q 10.40625 8.6875 15.234375 7.390625
+Q 20.0625 6.109375 24.8125 6.109375
+Q 31.15625 6.109375 34.5625 8.28125
+Q 37.984375 10.453125 37.984375 14.40625
+Q 37.984375 18.0625 35.515625 20.015625
+Q 33.0625 21.96875 24.703125 23.78125
+L 21.578125 24.515625
+Q 13.234375 26.265625 9.515625 29.90625
+Q 5.8125 33.546875 5.8125 39.890625
+Q 5.8125 47.609375 11.28125 51.796875
+Q 16.75 56 26.8125 56
+Q 31.78125 56 36.171875 55.265625
+Q 40.578125 54.546875 44.28125 53.078125
+z
+" id="DejaVuSans-115"/>
+ </defs>
+ <g transform="translate(359.896875 396.716563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-83"/>
+ <use x="63.476562" xlink:href="#DejaVuSans-97"/>
+ <use x="124.755859" xlink:href="#DejaVuSans-109"/>
+ <use x="222.167969" xlink:href="#DejaVuSans-112"/>
+ <use x="285.644531" xlink:href="#DejaVuSans-108"/>
+ <use x="313.427734" xlink:href="#DejaVuSans-101"/>
+ <use x="374.951172" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_2">
+ <g id="ytick_1">
+ <g id="line2d_13">
+ <path clip-path="url(#p46b4aed2e7)" d="M 68.96 348.587613
+L 693.54 348.587613
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_14">
+ <defs>
+ <path d="M 0 0
+L -3.5 0
+" id="m9958b18091" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="348.587613"/>
+ </g>
+ </g>
+ <g id="text_8">
+ <!-- −0.075 -->
+ <defs>
+ <path d="M 10.59375 35.5
+L 73.1875 35.5
+L 73.1875 27.203125
+L 10.59375 27.203125
+z
+" id="DejaVuSans-8722"/>
+ <path d="M 10.6875 12.40625
+L 21 12.40625
+L 21 0
+L 10.6875 0
+z
+" id="DejaVuSans-46"/>
+ <path d="M 8.203125 72.90625
+L 55.078125 72.90625
+L 55.078125 68.703125
+L 28.609375 0
+L 18.3125 0
+L 43.21875 64.59375
+L 8.203125 64.59375
+z
+" id="DejaVuSans-55"/>
+ <path d="M 10.796875 72.90625
+L 49.515625 72.90625
+L 49.515625 64.59375
+L 19.828125 64.59375
+L 19.828125 46.734375
+Q 21.96875 47.46875 24.109375 47.828125
+Q 26.265625 48.1875 28.421875 48.1875
+Q 40.625 48.1875 47.75 41.5
+Q 54.890625 34.8125 54.890625 23.390625
+Q 54.890625 11.625 47.5625 5.09375
+Q 40.234375 -1.421875 26.90625 -1.421875
+Q 22.3125 -1.421875 17.546875 -0.640625
+Q 12.796875 0.140625 7.71875 1.703125
+L 7.71875 11.625
+Q 12.109375 9.234375 16.796875 8.0625
+Q 21.484375 6.890625 26.703125 6.890625
+Q 35.15625 6.890625 40.078125 11.328125
+Q 45.015625 15.765625 45.015625 23.390625
+Q 45.015625 31 40.078125 35.4375
+Q 35.15625 39.890625 26.703125 39.890625
+Q 22.75 39.890625 18.8125 39.015625
+Q 14.890625 38.140625 10.796875 36.28125
+z
+" id="DejaVuSans-53"/>
+ </defs>
+ <g transform="translate(24.952188 352.386832)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-48"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-46"/>
+ <use x="179.199219" xlink:href="#DejaVuSans-48"/>
+ <use x="242.822266" xlink:href="#DejaVuSans-55"/>
+ <use x="306.445312" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_2">
+ <g id="line2d_15">
+ <path clip-path="url(#p46b4aed2e7)" d="M 68.96 309.412661
+L 693.54 309.412661
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_16">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="309.412661"/>
+ </g>
+ </g>
+ <g id="text_9">
+ <!-- −0.050 -->
+ <g transform="translate(24.952188 313.21188)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-48"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-46"/>
+ <use x="179.199219" xlink:href="#DejaVuSans-48"/>
+ <use x="242.822266" xlink:href="#DejaVuSans-53"/>
+ <use x="306.445312" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_3">
+ <g id="line2d_17">
+ <path clip-path="url(#p46b4aed2e7)" d="M 68.96 270.237709
+L 693.54 270.237709
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_18">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="270.237709"/>
+ </g>
+ </g>
+ <g id="text_10">
+ <!-- −0.025 -->
+ <g transform="translate(24.952188 274.036928)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-48"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-46"/>
+ <use x="179.199219" xlink:href="#DejaVuSans-48"/>
+ <use x="242.822266" xlink:href="#DejaVuSans-50"/>
+ <use x="306.445312" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_4">
+ <g id="line2d_19">
+ <path clip-path="url(#p46b4aed2e7)" d="M 68.96 231.062756
+L 693.54 231.062756
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_20">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="231.062756"/>
+ </g>
+ </g>
+ <g id="text_11">
+ <!-- 0.000 -->
+ <g transform="translate(33.331875 234.861975)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-48"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_5">
+ <g id="line2d_21">
+ <path clip-path="url(#p46b4aed2e7)" d="M 68.96 191.887804
+L 693.54 191.887804
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_22">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="191.887804"/>
+ </g>
+ </g>
+ <g id="text_12">
+ <!-- 0.025 -->
+ <g transform="translate(33.331875 195.687023)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-50"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_6">
+ <g id="line2d_23">
+ <path clip-path="url(#p46b4aed2e7)" d="M 68.96 152.712852
+L 693.54 152.712852
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_24">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="152.712852"/>
+ </g>
+ </g>
+ <g id="text_13">
+ <!-- 0.050 -->
+ <g transform="translate(33.331875 156.512071)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-53"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_7">
+ <g id="line2d_25">
+ <path clip-path="url(#p46b4aed2e7)" d="M 68.96 113.537899
+L 693.54 113.537899
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_26">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="113.537899"/>
+ </g>
+ </g>
+ <g id="text_14">
+ <!-- 0.075 -->
+ <g transform="translate(33.331875 117.337118)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-55"/>
+ <use x="222.65625" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_15">
+ <!-- Amplitude -->
+ <defs>
+ <path d="M 34.1875 63.1875
+L 20.796875 26.90625
+L 47.609375 26.90625
+z
+M 28.609375 72.90625
+L 39.796875 72.90625
+L 67.578125 0
+L 57.328125 0
+L 50.6875 18.703125
+L 17.828125 18.703125
+L 11.1875 0
+L 0.78125 0
+z
+" id="DejaVuSans-65"/>
+ <path d="M 9.421875 54.6875
+L 18.40625 54.6875
+L 18.40625 0
+L 9.421875 0
+z
+M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 64.59375
+L 9.421875 64.59375
+z
+" id="DejaVuSans-105"/>
+ <path d="M 18.3125 70.21875
+L 18.3125 54.6875
+L 36.8125 54.6875
+L 36.8125 47.703125
+L 18.3125 47.703125
+L 18.3125 18.015625
+Q 18.3125 11.328125 20.140625 9.421875
+Q 21.96875 7.515625 27.59375 7.515625
+L 36.8125 7.515625
+L 36.8125 0
+L 27.59375 0
+Q 17.1875 0 13.234375 3.875
+Q 9.28125 7.765625 9.28125 18.015625
+L 9.28125 47.703125
+L 2.6875 47.703125
+L 2.6875 54.6875
+L 9.28125 54.6875
+L 9.28125 70.21875
+z
+" id="DejaVuSans-116"/>
+ <path d="M 8.5 21.578125
+L 8.5 54.6875
+L 17.484375 54.6875
+L 17.484375 21.921875
+Q 17.484375 14.15625 20.5 10.265625
+Q 23.53125 6.390625 29.59375 6.390625
+Q 36.859375 6.390625 41.078125 11.03125
+Q 45.3125 15.671875 45.3125 23.6875
+L 45.3125 54.6875
+L 54.296875 54.6875
+L 54.296875 0
+L 45.3125 0
+L 45.3125 8.40625
+Q 42.046875 3.421875 37.71875 1
+Q 33.40625 -1.421875 27.6875 -1.421875
+Q 18.265625 -1.421875 13.375 4.4375
+Q 8.5 10.296875 8.5 21.578125
+z
+M 31.109375 56
+z
+" id="DejaVuSans-117"/>
+ <path d="M 45.40625 46.390625
+L 45.40625 75.984375
+L 54.390625 75.984375
+L 54.390625 0
+L 45.40625 0
+L 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+z
+M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+" id="DejaVuSans-100"/>
+ </defs>
+ <g transform="translate(18.8725 247.642656)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-65"/>
+ <use x="68.408203" xlink:href="#DejaVuSans-109"/>
+ <use x="165.820312" xlink:href="#DejaVuSans-112"/>
+ <use x="229.296875" xlink:href="#DejaVuSans-108"/>
+ <use x="257.080078" xlink:href="#DejaVuSans-105"/>
+ <use x="284.863281" xlink:href="#DejaVuSans-116"/>
+ <use x="324.072266" xlink:href="#DejaVuSans-117"/>
+ <use x="387.451172" xlink:href="#DejaVuSans-100"/>
+ <use x="450.927734" xlink:href="#DejaVuSans-101"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_27">
+ <path clip-path="url(#p46b4aed2e7)" d="M 68.96 231.062756
+L 75.675914 231.106267
+L 77.507527 231.372601
+L 78.118065 231.313826
+L 78.728602 231.024152
+L 79.33914 230.463544
+L 80.560215 229.10107
+L 81.170753 229.010174
+L 81.78129 229.893597
+L 82.391828 231.962276
+L 83.612903 238.025171
+L 84.223441 239.818317
+L 84.833978 238.895123
+L 85.444516 234.326888
+L 86.055054 226.325567
+L 87.276129 208.253311
+L 87.886667 204.923454
+L 88.497204 209.621988
+L 89.107742 223.3223
+L 90.939355 284.036696
+L 91.549892 289.245768
+L 92.16043 277.678124
+L 92.770968 249.345427
+L 93.992043 168.779135
+L 94.602581 138.698057
+L 95.213118 130.044521
+L 95.823656 148.332637
+L 96.434194 191.664491
+L 97.655269 309.927746
+L 98.265806 353.550063
+L 98.876344 368.44
+L 99.486882 349.063229
+L 100.097419 299.236923
+L 101.318495 162.767959
+L 101.929032 111.250861
+L 102.53957 89.544762
+L 103.150108 102.056532
+L 103.760645 143.854267
+L 104.98172 262.013584
+L 105.592258 307.66169
+L 106.202796 330.030228
+L 106.813333 327.172059
+L 107.423871 304.28463
+L 108.644946 238.817936
+L 109.255484 215.365527
+L 109.866022 204.355107
+L 110.476559 204.164276
+L 111.697634 214.433038
+L 112.308172 214.307582
+L 112.91871 208.273083
+L 113.529247 199.09793
+L 114.139785 191.932269
+L 114.750323 192.050575
+L 115.36086 202.556414
+L 115.971398 222.929012
+L 117.192473 273.98683
+L 117.803011 291.225988
+L 118.413548 295.895815
+L 119.024086 286.827844
+L 119.634624 266.746951
+L 120.855699 216.993365
+L 121.466237 199.43117
+L 122.076774 191.425533
+L 122.687312 192.628794
+L 123.297849 200.093828
+L 124.518925 217.741756
+L 125.129462 222.338433
+L 125.74 223.763537
+L 126.350538 224.055434
+L 126.961075 225.876013
+L 127.571613 231.193711
+L 128.182151 240.304646
+L 129.403226 261.909716
+L 130.013763 267.968314
+L 130.624301 267.298488
+L 131.234839 259.318546
+L 131.845376 245.573509
+L 133.066452 214.214954
+L 133.676989 203.69552
+L 134.287527 199.460045
+L 134.898065 201.374424
+L 135.508602 207.688848
+L 136.729677 223.330876
+L 137.340215 228.719878
+L 137.950753 231.785972
+L 139.171828 235.104612
+L 139.782366 237.957295
+L 141.003441 247.500623
+L 141.613978 251.919703
+L 142.224516 253.817278
+L 142.835054 251.899855
+L 143.445591 245.897049
+L 145.887742 210.512587
+L 146.49828 208.149633
+L 147.108817 209.795135
+L 147.719355 214.405764
+L 148.94043 226.176522
+L 149.550968 230.719365
+L 150.161505 233.725642
+L 150.772043 235.589779
+L 151.993118 238.824729
+L 153.824731 245.414542
+L 154.435269 245.669451
+L 155.045806 243.65406
+L 155.656344 239.26286
+L 157.487957 220.235334
+L 158.098495 216.146713
+L 158.709032 214.698337
+L 159.31957 215.886768
+L 159.930108 219.091169
+L 161.76172 231.169185
+L 162.372258 233.769835
+L 162.982796 235.535879
+L 165.424946 240.552089
+L 166.035484 241.204092
+L 166.646022 240.811383
+L 167.256559 239.015964
+L 167.867097 235.798954
+L 169.69871 222.987938
+L 170.309247 220.287991
+L 170.919785 219.330777
+L 171.530323 220.134533
+L 172.14086 222.33002
+L 173.972473 231.17208
+L 174.583011 233.320839
+L 175.193548 234.880541
+L 176.414624 236.945277
+L 177.025161 237.72613
+L 177.635699 238.282387
+L 178.246237 238.387574
+L 178.856774 237.774606
+L 179.467312 236.267761
+L 180.077849 233.891517
+L 181.909462 225.076984
+L 182.52 223.245447
+L 183.130538 222.582993
+L 183.741075 223.115096
+L 184.351613 224.621382
+L 186.793763 232.823316
+L 187.404301 234.143648
+L 188.014839 235.116405
+L 188.625376 235.831328
+L 189.235914 236.330621
+L 189.846452 236.571085
+L 190.456989 236.436443
+L 191.067527 235.792997
+L 191.678065 234.564442
+L 192.288602 232.794304
+L 194.120215 226.618034
+L 194.730753 225.351235
+L 195.34129 224.881843
+L 195.951828 225.234958
+L 196.562366 226.277932
+L 199.615054 233.485932
+L 200.225591 234.292319
+L 200.836129 234.853563
+L 201.446667 235.186977
+L 202.057204 235.27017
+L 202.667742 235.046162
+L 203.27828 234.453675
+L 203.888817 233.469025
+L 205.109892 230.605191
+L 206.330968 227.748229
+L 206.941505 226.859527
+L 207.552043 226.5236
+L 208.162581 226.761917
+L 208.773118 227.493515
+L 209.994194 229.787802
+L 211.215269 232.071304
+L 211.825806 232.944411
+L 212.436344 233.598735
+L 213.046882 234.039017
+L 213.657419 234.268717
+L 214.267957 234.275935
+L 214.878495 234.035148
+L 215.489032 233.523393
+L 216.09957 232.743306
+L 217.320645 230.619693
+L 218.54172 228.579445
+L 219.152258 227.949344
+L 219.762796 227.708271
+L 220.373333 227.873209
+L 220.983871 228.393779
+L 222.204946 230.07426
+L 223.426022 231.823018
+L 224.036559 232.514295
+L 224.647097 233.036153
+L 225.257634 233.379647
+L 225.868172 233.541225
+L 226.47871 233.514344
+L 227.089247 233.289738
+L 227.699785 232.863822
+L 228.92086 231.494018
+L 230.752473 229.194331
+L 231.363011 228.743929
+L 231.973548 228.571062
+L 232.584086 228.68851
+L 233.194624 229.06416
+L 234.415699 230.303385
+L 235.636774 231.637889
+L 236.857849 232.589224
+L 237.468387 232.855347
+L 238.078925 232.970468
+L 238.689462 232.930843
+L 239.3 232.735235
+L 239.910538 232.389082
+L 241.131613 231.337051
+L 242.963226 229.652061
+L 243.573763 229.328043
+L 244.184301 229.204381
+L 244.794839 229.290359
+L 245.405376 229.564934
+L 246.626452 230.484221
+L 248.458065 231.919108
+L 249.67914 232.44343
+L 250.289677 232.526024
+L 250.900215 232.484229
+L 252.12129 232.043636
+L 253.342366 231.236875
+L 255.173978 229.994751
+L 255.784516 229.76046
+L 256.395054 229.67227
+L 257.005591 229.736746
+L 258.226667 230.24976
+L 260.668817 231.719353
+L 261.889892 232.122547
+L 263.110968 232.142918
+L 264.332043 231.790307
+L 266.163656 230.830018
+L 267.384731 230.252537
+L 268.605806 230.019742
+L 269.826882 230.220429
+L 271.658495 231.032924
+L 272.87957 231.565989
+L 274.100645 231.874127
+L 275.32172 231.882534
+L 276.542796 231.603502
+L 280.206022 230.323256
+L 281.427097 230.317076
+L 282.648172 230.604532
+L 285.70086 231.592647
+L 286.921935 231.713408
+L 288.143011 231.598873
+L 289.974624 231.104428
+L 291.806237 230.594571
+L 293.027312 230.472717
+L 294.248387 230.588674
+L 296.690538 231.215052
+L 298.522151 231.535696
+L 299.743226 231.533438
+L 301.574839 231.232188
+L 304.016989 230.706411
+L 305.238065 230.618121
+L 306.45914 230.707038
+L 311.343441 231.438781
+L 313.175054 231.286223
+L 316.83828 230.742808
+L 318.669892 230.795834
+L 323.554194 231.348176
+L 325.385806 231.229375
+L 329.049032 230.820381
+L 330.880645 230.862459
+L 336.375484 231.266314
+L 339.428172 231.003179
+L 341.870323 230.871637
+L 344.312473 231.007822
+L 347.365161 231.22139
+L 349.807312 231.155412
+L 354.081075 230.91839
+L 357.133763 231.064679
+L 360.186452 231.187072
+L 363.23914 231.061587
+L 366.291828 230.953677
+L 369.955054 231.095922
+L 373.007742 231.150376
+L 380.944731 231.041024
+L 385.218495 231.128865
+L 393.766022 231.065192
+L 398.039785 231.103857
+L 405.366237 231.051149
+L 410.861075 231.084071
+L 417.576989 231.054295
+L 424.292903 231.060911
+L 431.008817 231.072085
+L 438.335269 231.044914
+L 465.198925 231.054276
+L 490.230968 231.059637
+L 525.642151 231.060204
+L 652.023441 231.062904
+L 693.54 231.062722
+L 693.54 231.062722
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_3">
+ <path d="M 68.96 368.44
+L 68.96 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_4">
+ <path d="M 693.54 368.44
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_5">
+ <path d="M 68.96 368.44
+L 693.54 368.44
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_6">
+ <path d="M 68.96 75.6
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_2">
+ <g id="patch_7">
+ <path d="M 68.96 703.24
+L 693.54 703.24
+L 693.54 410.4
+L 68.96 410.4
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_3">
+ <g id="xtick_7">
+ <g id="line2d_28">
+ <path clip-path="url(#paf46f83122)" d="M 68.96 703.24
+L 68.96 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_29">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_16">
+ <!-- 10Hz -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 19.671875 72.90625
+L 19.671875 43.015625
+L 55.515625 43.015625
+L 55.515625 72.90625
+L 65.375 72.90625
+L 65.375 0
+L 55.515625 0
+L 55.515625 34.71875
+L 19.671875 34.71875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-72"/>
+ <path d="M 5.515625 54.6875
+L 48.1875 54.6875
+L 48.1875 46.484375
+L 14.40625 7.171875
+L 48.1875 7.171875
+L 48.1875 0
+L 4.296875 0
+L 4.296875 8.203125
+L 38.09375 47.515625
+L 5.515625 47.515625
+z
+" id="DejaVuSans-122"/>
+ </defs>
+ <g transform="translate(56.213125 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_8">
+ <g id="line2d_30">
+ <path clip-path="url(#paf46f83122)" d="M 68.96 703.24
+L 68.96 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_31">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_9">
+ <g id="line2d_32">
+ <path clip-path="url(#paf46f83122)" d="M 124.582948 703.24
+L 124.582948 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_33">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="124.582948" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_10">
+ <g id="line2d_34">
+ <path clip-path="url(#paf46f83122)" d="M 157.120287 703.24
+L 157.120287 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_35">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="157.120287" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_11">
+ <g id="line2d_36">
+ <path clip-path="url(#paf46f83122)" d="M 180.205896 703.24
+L 180.205896 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_37">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="180.205896" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_12">
+ <g id="line2d_38">
+ <path clip-path="url(#paf46f83122)" d="M 198.112486 703.24
+L 198.112486 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_39">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="198.112486" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_13">
+ <g id="line2d_40">
+ <path clip-path="url(#paf46f83122)" d="M 212.743235 703.24
+L 212.743235 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_41">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="212.743235" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_14">
+ <g id="line2d_42">
+ <path clip-path="url(#paf46f83122)" d="M 225.113357 703.24
+L 225.113357 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_43">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="225.113357" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_15">
+ <g id="line2d_44">
+ <path clip-path="url(#paf46f83122)" d="M 235.828845 703.24
+L 235.828845 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_45">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="235.828845" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_16">
+ <g id="line2d_46">
+ <path clip-path="url(#paf46f83122)" d="M 245.280574 703.24
+L 245.280574 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_47">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="245.280574" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_17">
+ <g id="line2d_48">
+ <path clip-path="url(#paf46f83122)" d="M 253.735434 703.24
+L 253.735434 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_49">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="253.735434" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_17">
+ <!-- 100Hz -->
+ <g transform="translate(237.807309 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_18">
+ <g id="line2d_50">
+ <path clip-path="url(#paf46f83122)" d="M 253.735434 703.24
+L 253.735434 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_51">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="253.735434" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_19">
+ <g id="line2d_52">
+ <path clip-path="url(#paf46f83122)" d="M 309.358382 703.24
+L 309.358382 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_53">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="309.358382" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_20">
+ <g id="line2d_54">
+ <path clip-path="url(#paf46f83122)" d="M 341.895721 703.24
+L 341.895721 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_55">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="341.895721" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_21">
+ <g id="line2d_56">
+ <path clip-path="url(#paf46f83122)" d="M 364.981331 703.24
+L 364.981331 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_57">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="364.981331" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_22">
+ <g id="line2d_58">
+ <path clip-path="url(#paf46f83122)" d="M 382.88792 703.24
+L 382.88792 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_59">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="382.88792" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_23">
+ <g id="line2d_60">
+ <path clip-path="url(#paf46f83122)" d="M 397.518669 703.24
+L 397.518669 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_61">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="397.518669" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_24">
+ <g id="line2d_62">
+ <path clip-path="url(#paf46f83122)" d="M 409.888792 703.24
+L 409.888792 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_63">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="409.888792" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_25">
+ <g id="line2d_64">
+ <path clip-path="url(#paf46f83122)" d="M 420.604279 703.24
+L 420.604279 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_65">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="420.604279" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_26">
+ <g id="line2d_66">
+ <path clip-path="url(#paf46f83122)" d="M 430.056008 703.24
+L 430.056008 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_67">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="430.056008" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_27">
+ <g id="line2d_68">
+ <path clip-path="url(#paf46f83122)" d="M 438.510868 703.24
+L 438.510868 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_69">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="438.510868" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_18">
+ <!-- 1kHz -->
+ <defs>
+ <path d="M 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 31.109375
+L 44.921875 54.6875
+L 56.390625 54.6875
+L 27.390625 29.109375
+L 57.625 0
+L 45.90625 0
+L 18.109375 26.703125
+L 18.109375 0
+L 9.078125 0
+z
+" id="DejaVuSans-107"/>
+ </defs>
+ <g transform="translate(426.049931 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_28">
+ <g id="line2d_70">
+ <path clip-path="url(#paf46f83122)" d="M 438.510868 703.24
+L 438.510868 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_71">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="438.510868" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_29">
+ <g id="line2d_72">
+ <path clip-path="url(#paf46f83122)" d="M 494.133817 703.24
+L 494.133817 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_73">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="494.133817" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_30">
+ <g id="line2d_74">
+ <path clip-path="url(#paf46f83122)" d="M 526.671155 703.24
+L 526.671155 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_75">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="526.671155" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_31">
+ <g id="line2d_76">
+ <path clip-path="url(#paf46f83122)" d="M 549.756765 703.24
+L 549.756765 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_77">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="549.756765" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_32">
+ <g id="line2d_78">
+ <path clip-path="url(#paf46f83122)" d="M 567.663355 703.24
+L 567.663355 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_79">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="567.663355" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_33">
+ <g id="line2d_80">
+ <path clip-path="url(#paf46f83122)" d="M 582.294104 703.24
+L 582.294104 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_81">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="582.294104" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_34">
+ <g id="line2d_82">
+ <path clip-path="url(#paf46f83122)" d="M 594.664226 703.24
+L 594.664226 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_83">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="594.664226" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_35">
+ <g id="line2d_84">
+ <path clip-path="url(#paf46f83122)" d="M 605.379713 703.24
+L 605.379713 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_85">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="605.379713" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_36">
+ <g id="line2d_86">
+ <path clip-path="url(#paf46f83122)" d="M 614.831443 703.24
+L 614.831443 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_87">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="614.831443" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_37">
+ <g id="line2d_88">
+ <path clip-path="url(#paf46f83122)" d="M 623.286303 703.24
+L 623.286303 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_89">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.286303" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_19">
+ <!-- 10kHz -->
+ <g transform="translate(607.644115 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_38">
+ <g id="line2d_90">
+ <path clip-path="url(#paf46f83122)" d="M 623.286303 703.24
+L 623.286303 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_91">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.286303" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_39">
+ <g id="line2d_92">
+ <path clip-path="url(#paf46f83122)" d="M 678.909251 703.24
+L 678.909251 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_93">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.909251" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_40">
+ <g id="line2d_94">
+ <path clip-path="url(#paf46f83122)" d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_95">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#m0c3b1ae8ab" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_20">
+ <!-- 24kHz -->
+ <g transform="translate(677.897812 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_21">
+ <!-- Frequency (Hz) -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 51.703125 72.90625
+L 51.703125 64.59375
+L 19.671875 64.59375
+L 19.671875 43.109375
+L 48.578125 43.109375
+L 48.578125 34.8125
+L 19.671875 34.8125
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-70"/>
+ <path d="M 41.109375 46.296875
+Q 39.59375 47.171875 37.8125 47.578125
+Q 36.03125 48 33.890625 48
+Q 26.265625 48 22.1875 43.046875
+Q 18.109375 38.09375 18.109375 28.8125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 20.953125 51.171875 25.484375 53.578125
+Q 30.03125 56 36.53125 56
+Q 37.453125 56 38.578125 55.875
+Q 39.703125 55.765625 41.0625 55.515625
+z
+" id="DejaVuSans-114"/>
+ <path d="M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+M 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+L 45.40625 54.6875
+L 54.390625 54.6875
+L 54.390625 -20.796875
+L 45.40625 -20.796875
+z
+" id="DejaVuSans-113"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-110"/>
+ <path d="M 48.78125 52.59375
+L 48.78125 44.1875
+Q 44.96875 46.296875 41.140625 47.34375
+Q 37.3125 48.390625 33.40625 48.390625
+Q 24.65625 48.390625 19.8125 42.84375
+Q 14.984375 37.3125 14.984375 27.296875
+Q 14.984375 17.28125 19.8125 11.734375
+Q 24.65625 6.203125 33.40625 6.203125
+Q 37.3125 6.203125 41.140625 7.25
+Q 44.96875 8.296875 48.78125 10.40625
+L 48.78125 2.09375
+Q 45.015625 0.34375 40.984375 -0.53125
+Q 36.96875 -1.421875 32.421875 -1.421875
+Q 20.0625 -1.421875 12.78125 6.34375
+Q 5.515625 14.109375 5.515625 27.296875
+Q 5.515625 40.671875 12.859375 48.328125
+Q 20.21875 56 33.015625 56
+Q 37.15625 56 41.109375 55.140625
+Q 45.0625 54.296875 48.78125 52.59375
+z
+" id="DejaVuSans-99"/>
+ <path d="M 32.171875 -5.078125
+Q 28.375 -14.84375 24.75 -17.8125
+Q 21.140625 -20.796875 15.09375 -20.796875
+L 7.90625 -20.796875
+L 7.90625 -13.28125
+L 13.1875 -13.28125
+Q 16.890625 -13.28125 18.9375 -11.515625
+Q 21 -9.765625 23.484375 -3.21875
+L 25.09375 0.875
+L 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 11.921875
+L 46.6875 54.6875
+L 56.203125 54.6875
+z
+" id="DejaVuSans-121"/>
+ <path id="DejaVuSans-32"/>
+ <path d="M 31 75.875
+Q 24.46875 64.65625 21.28125 53.65625
+Q 18.109375 42.671875 18.109375 31.390625
+Q 18.109375 20.125 21.3125 9.0625
+Q 24.515625 -2 31 -13.1875
+L 23.1875 -13.1875
+Q 15.875 -1.703125 12.234375 9.375
+Q 8.59375 20.453125 8.59375 31.390625
+Q 8.59375 42.28125 12.203125 53.3125
+Q 15.828125 64.359375 23.1875 75.875
+z
+" id="DejaVuSans-40"/>
+ <path d="M 8.015625 75.875
+L 15.828125 75.875
+Q 23.140625 64.359375 26.78125 53.3125
+Q 30.421875 42.28125 30.421875 31.390625
+Q 30.421875 20.453125 26.78125 9.375
+Q 23.140625 -1.703125 15.828125 -13.1875
+L 8.015625 -13.1875
+Q 14.5 -2 17.703125 9.0625
+Q 20.90625 20.125 20.90625 31.390625
+Q 20.90625 42.671875 17.703125 53.65625
+Q 14.5 64.65625 8.015625 75.875
+z
+" id="DejaVuSans-41"/>
+ </defs>
+ <g transform="translate(343.077344 731.516563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_4">
+ <g id="ytick_8">
+ <g id="line2d_96">
+ <path clip-path="url(#paf46f83122)" d="M 68.96 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_97">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_22">
+ <!-- −160 -->
+ <g transform="translate(34.492813 707.039219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-54"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_9">
+ <g id="line2d_98">
+ <path clip-path="url(#paf46f83122)" d="M 68.96 668.788235
+L 693.54 668.788235
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_99">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="668.788235"/>
+ </g>
+ </g>
+ <g id="text_23">
+ <!-- −140 -->
+ <g transform="translate(34.492813 672.587454)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-52"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_10">
+ <g id="line2d_100">
+ <path clip-path="url(#paf46f83122)" d="M 68.96 634.336471
+L 693.54 634.336471
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_101">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="634.336471"/>
+ </g>
+ </g>
+ <g id="text_24">
+ <!-- −120 -->
+ <g transform="translate(34.492813 638.135689)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-50"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_11">
+ <g id="line2d_102">
+ <path clip-path="url(#paf46f83122)" d="M 68.96 599.884706
+L 693.54 599.884706
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_103">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="599.884706"/>
+ </g>
+ </g>
+ <g id="text_25">
+ <!-- −100 -->
+ <g transform="translate(34.492813 603.683925)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_12">
+ <g id="line2d_104">
+ <path clip-path="url(#paf46f83122)" d="M 68.96 565.432941
+L 693.54 565.432941
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_105">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="565.432941"/>
+ </g>
+ </g>
+ <g id="text_26">
+ <!-- −80 -->
+ <g transform="translate(40.855313 569.23216)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-56"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_13">
+ <g id="line2d_106">
+ <path clip-path="url(#paf46f83122)" d="M 68.96 530.981176
+L 693.54 530.981176
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_107">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="530.981176"/>
+ </g>
+ </g>
+ <g id="text_27">
+ <!-- −60 -->
+ <g transform="translate(40.855313 534.780395)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-54"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_14">
+ <g id="line2d_108">
+ <path clip-path="url(#paf46f83122)" d="M 68.96 496.529412
+L 693.54 496.529412
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_109">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="496.529412"/>
+ </g>
+ </g>
+ <g id="text_28">
+ <!-- −40 -->
+ <g transform="translate(40.855313 500.328631)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-52"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_15">
+ <g id="line2d_110">
+ <path clip-path="url(#paf46f83122)" d="M 68.96 462.077647
+L 693.54 462.077647
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_111">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="462.077647"/>
+ </g>
+ </g>
+ <g id="text_29">
+ <!-- −20 -->
+ <g transform="translate(40.855313 465.876866)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_16">
+ <g id="line2d_112">
+ <path clip-path="url(#paf46f83122)" d="M 68.96 427.625882
+L 693.54 427.625882
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_113">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="427.625882"/>
+ </g>
+ </g>
+ <g id="text_30">
+ <!-- 0 -->
+ <g transform="translate(55.5975 431.425101)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_31">
+ <!-- Gain (dB) -->
+ <defs>
+ <path d="M 59.515625 10.40625
+L 59.515625 29.984375
+L 43.40625 29.984375
+L 43.40625 38.09375
+L 69.28125 38.09375
+L 69.28125 6.78125
+Q 63.578125 2.734375 56.6875 0.65625
+Q 49.8125 -1.421875 42 -1.421875
+Q 24.90625 -1.421875 15.25 8.5625
+Q 5.609375 18.5625 5.609375 36.375
+Q 5.609375 54.25 15.25 64.234375
+Q 24.90625 74.21875 42 74.21875
+Q 49.125 74.21875 55.546875 72.453125
+Q 61.96875 70.703125 67.390625 67.28125
+L 67.390625 56.78125
+Q 61.921875 61.421875 55.765625 63.765625
+Q 49.609375 66.109375 42.828125 66.109375
+Q 29.4375 66.109375 22.71875 58.640625
+Q 16.015625 51.171875 16.015625 36.375
+Q 16.015625 21.625 22.71875 14.15625
+Q 29.4375 6.6875 42.828125 6.6875
+Q 48.046875 6.6875 52.140625 7.59375
+Q 56.25 8.5 59.515625 10.40625
+z
+" id="DejaVuSans-71"/>
+ <path d="M 19.671875 34.8125
+L 19.671875 8.109375
+L 35.5 8.109375
+Q 43.453125 8.109375 47.28125 11.40625
+Q 51.125 14.703125 51.125 21.484375
+Q 51.125 28.328125 47.28125 31.5625
+Q 43.453125 34.8125 35.5 34.8125
+z
+M 19.671875 64.796875
+L 19.671875 42.828125
+L 34.28125 42.828125
+Q 41.5 42.828125 45.03125 45.53125
+Q 48.578125 48.25 48.578125 53.8125
+Q 48.578125 59.328125 45.03125 62.0625
+Q 41.5 64.796875 34.28125 64.796875
+z
+M 9.8125 72.90625
+L 35.015625 72.90625
+Q 46.296875 72.90625 52.390625 68.21875
+Q 58.5 63.53125 58.5 54.890625
+Q 58.5 48.1875 55.375 44.234375
+Q 52.25 40.28125 46.1875 39.3125
+Q 53.46875 37.75 57.5 32.78125
+Q 61.53125 27.828125 61.53125 20.40625
+Q 61.53125 10.640625 54.890625 5.3125
+Q 48.25 0 35.984375 0
+L 9.8125 0
+z
+" id="DejaVuSans-66"/>
+ </defs>
+ <g transform="translate(28.413125 580.411406)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-71"/>
+ <use x="77.490234" xlink:href="#DejaVuSans-97"/>
+ <use x="138.769531" xlink:href="#DejaVuSans-105"/>
+ <use x="166.552734" xlink:href="#DejaVuSans-110"/>
+ <use x="229.931641" xlink:href="#DejaVuSans-32"/>
+ <use x="261.71875" xlink:href="#DejaVuSans-40"/>
+ <use x="300.732422" xlink:href="#DejaVuSans-100"/>
+ <use x="364.208984" xlink:href="#DejaVuSans-66"/>
+ <use x="432.8125" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_114">
+ <path clip-path="url(#paf46f83122)" d="M -1 669.73135
+L 296.279847 669.626667
+L 343.139885 669.393596
+L 371.452725 669.044478
+L 392.33965 668.569199
+L 406.83096 668.061321
+L 415.425259 667.639115
+L 417.284345 667.60149
+L 419.697969 667.298099
+L 422.041112 667.403584
+L 424.317774 666.874947
+L 426.531624 667.288675
+L 427.616058 666.640274
+L 428.152829 666.345507
+L 428.686034 666.29402
+L 429.215718 666.538546
+L 430.264713 667.358158
+L 430.784113 667.362148
+L 431.300172 666.886023
+L 432.32244 665.579235
+L 432.828732 665.436658
+L 433.331849 665.860003
+L 434.328718 667.640848
+L 434.822547 667.83636
+L 435.313356 666.982277
+L 436.286058 664.479911
+L 436.768023 664.119574
+L 437.247111 664.743477
+L 437.723355 666.335802
+L 438.19679 668.349336
+L 438.667448 669.169363
+L 439.135362 667.556752
+L 440.063082 662.876568
+L 440.522951 662.102248
+L 440.9802 662.84081
+L 441.434858 665.321248
+L 441.886955 669.516774
+L 442.336519 672.53699
+L 442.783578 669.017316
+L 443.228161 663.891053
+L 443.670294 660.526292
+L 444.110005 659.137175
+L 444.547319 659.750979
+L 444.982263 662.804482
+L 445.414862 669.798789
+L 445.845141 682.588148
+L 446.69884 661.890884
+L 447.122308 657.107227
+L 447.543553 655.052398
+L 447.962598 655.252972
+L 448.379466 657.989544
+L 448.79418 664.802463
+L 449.206762 681.770667
+L 450.025615 657.673093
+L 450.43193 652.31679
+L 450.836197 649.81637
+L 451.238439 649.468058
+L 451.638674 651.216101
+L 452.433204 660.164806
+L 452.827539 657.386822
+L 453.219946 650.754567
+L 453.610442 646.110874
+L 453.999048 643.548107
+L 454.385781 642.729259
+L 454.77066 643.452069
+L 455.534922 647.077828
+L 455.914341 645.88965
+L 456.667839 638.804618
+L 457.041951 636.473608
+L 457.414328 635.36587
+L 457.784984 635.330433
+L 458.5212 636.433251
+L 458.88679 635.570814
+L 459.973673 628.850414
+L 460.33272 627.619135
+L 460.690168 627.10525
+L 461.400323 626.864297
+L 461.753057 626.050818
+L 463.148692 619.649481
+L 463.49384 618.861673
+L 464.179716 617.861452
+L 464.520468 617.024477
+L 465.197661 614.247299
+L 465.869188 611.559929
+L 466.535141 609.896626
+L 467.195614 608.310649
+L 468.176241 604.59214
+L 468.823397 602.411794
+L 470.10226 598.746472
+L 471.6727 593.275602
+L 472.600421 590.401719
+L 476.207633 577.872345
+L 479.659647 565.690155
+L 484.042823 549.274973
+L 487.691039 534.813005
+L 491.180587 520.188743
+L 494.75831 504.219833
+L 498.183308 487.833137
+L 501.253238 472.066024
+L 504.623684 453.51399
+L 507.261622 439.122994
+L 508.253562 434.669497
+L 509.03838 431.958515
+L 509.815596 430.084722
+L 510.393608 429.163669
+L 511.15787 428.412013
+L 511.914922 428.012861
+L 512.851304 427.7795
+L 514.509738 427.652738
+L 519.631744 427.625928
+L 560.143421 427.732702
+L 561.271512 427.972132
+L 561.981218 428.323583
+L 562.584581 428.853655
+L 563.183442 429.702523
+L 563.777866 430.975537
+L 564.465842 433.087809
+L 565.244945 436.308354
+L 566.304008 441.760954
+L 568.381104 453.945131
+L 572.291927 476.662233
+L 575.596169 494.454244
+L 579.014998 511.655716
+L 582.684981 528.996646
+L 586.641082 546.633056
+L 591.186619 565.809863
+L 594.887817 580.72339
+L 598.425807 594.56265
+L 599.254746 597.755839
+L 600.451074 602.318816
+L 601.073629 604.593767
+L 608.980896 634.294289
+L 609.093208 634.104805
+L 609.149306 634.125081
+L 609.317362 635.408331
+L 609.429205 635.971815
+L 609.485067 635.873115
+L 609.596677 635.709708
+L 609.708131 636.457942
+L 609.875022 637.64322
+L 610.041567 637.279644
+L 610.152406 638.042711
+L 610.318377 639.309289
+L 610.484005 638.834913
+L 610.594234 639.612443
+L 610.759295 640.970851
+L 610.924017 640.375526
+L 610.978849 640.603804
+L 611.197804 642.628787
+L 611.25245 642.401843
+L 611.361629 641.901471
+L 611.47066 642.705837
+L 611.63393 644.284036
+L 611.796868 643.412718
+L 611.851107 643.615601
+L 612.067698 645.937605
+L 612.121755 645.631255
+L 612.229759 644.909217
+L 612.283706 645.096095
+L 612.499134 647.590577
+L 612.552901 647.239921
+L 612.660327 646.390897
+L 612.713986 646.559262
+L 612.928264 649.244123
+L 612.981744 648.845716
+L 613.088597 647.857662
+L 613.141971 648.004772
+L 613.35511 650.899511
+L 613.408307 650.449582
+L 613.514594 649.309397
+L 613.567685 649.432266
+L 613.779698 652.558127
+L 613.832614 652.052529
+L 613.938341 650.745957
+L 613.991153 650.841359
+L 614.202051 654.221484
+L 614.25469 653.655639
+L 614.359863 652.167174
+L 614.412397 652.231639
+L 614.622194 655.89125
+L 614.674557 655.260081
+L 614.779181 653.572847
+L 614.831443 653.602672
+L 615.040147 657.569266
+L 615.092239 656.867115
+L 615.248311 654.953999
+L 615.455936 659.257579
+L 615.507758 658.478105
+L 615.663025 656.285143
+L 615.869581 660.958472
+L 615.921137 660.094528
+L 616.075606 657.595611
+L 616.281104 662.674509
+L 616.332397 661.71799
+L 616.486077 658.884892
+L 616.588368 661.58276
+L 616.690528 664.408582
+L 616.74156 663.350238
+L 616.89446 660.152464
+L 616.996231 662.986488
+L 617.097874 666.163976
+L 617.148647 664.993171
+L 617.300774 661.397798
+L 617.402032 664.368281
+L 617.503163 667.944442
+L 617.55368 666.648855
+L 617.705042 662.620357
+L 617.805791 665.726272
+L 617.906415 669.754291
+L 617.956679 668.319539
+L 618.107283 663.819604
+L 618.207529 667.058421
+L 618.30765 671.598515
+L 618.357664 670.007659
+L 618.507518 664.995
+L 618.607266 668.362532
+L 618.70689 673.48293
+L 618.756655 671.715847
+L 618.905767 666.146013
+L 619.005021 669.636275
+L 619.104152 675.414364
+L 619.153672 673.44692
+L 619.302049 667.27212
+L 619.400814 670.877218
+L 619.499458 677.400896
+L 619.548735 675.203856
+L 619.696384 668.372808
+L 619.794665 672.082876
+L 619.892827 679.452146
+L 619.941862 676.989736
+L 620.08879 669.447582
+L 620.186593 673.250763
+L 620.284276 681.579658
+L 620.333073 678.807635
+L 620.479287 670.495966
+L 620.576615 674.378459
+L 620.673825 683.797346
+L 620.722386 680.660416
+L 620.867893 671.517507
+L 620.964751 675.463682
+L 621.061492 686.122025
+L 621.109819 682.550389
+L 621.254626 672.511783
+L 621.302837 673.414961
+L 621.447296 688.573906
+L 621.495391 684.478732
+L 621.639504 673.4784
+L 621.687484 674.3517
+L 621.783359 683.611014
+L 621.831253 691.176799
+L 621.879119 686.444531
+L 622.022545 674.417005
+L 622.070297 675.255708
+L 622.165715 684.874907
+L 622.213382 693.957181
+L 622.261021 688.443242
+L 622.403766 675.327281
+L 622.451292 676.126939
+L 622.546259 686.046903
+L 622.5937 696.939803
+L 622.641113 690.464289
+L 622.783185 676.20896
+L 622.830487 676.965466
+L 622.925006 687.114957
+L 622.972224 700.133414
+L 623.019414 692.487507
+L 623.160819 677.061822
+L 623.207898 677.77149
+L 623.301974 688.06945
+L 623.348971 703.490101
+L 623.39594 694.478365
+L 623.536683 677.885702
+L 623.583543 678.545323
+L 623.67718 688.904364
+L 623.723958 706.805107
+L 623.770708 696.382751
+L 623.910796 678.680492
+L 623.957437 679.287392
+L 624.050639 689.618091
+L 624.0972 709.552499
+L 624.143733 698.124062
+L 624.283172 679.446147
+L 624.329598 679.998223
+L 624.422369 690.213675
+L 624.468714 710.93043
+L 624.515033 699.608131
+L 624.653828 680.182688
+L 624.70004 680.678434
+L 624.792384 690.698399
+L 624.838517 710.587819
+L 624.884622 700.742025
+L 625.022781 680.890207
+L 625.068781 681.328724
+L 625.160701 691.082851
+L 625.206622 709.098036
+L 625.252517 701.464981
+L 625.390044 681.568866
+L 625.435834 681.94986
+L 625.527336 691.379701
+L 625.573048 707.227918
+L 625.618733 701.774777
+L 625.755635 682.218902
+L 625.801216 682.542667
+L 625.892303 691.602454
+L 625.937807 705.399111
+L 625.983286 701.728859
+L 626.119567 682.840627
+L 626.164943 683.108017
+L 626.255617 691.764396
+L 626.300916 703.757845
+L 626.346189 701.41925
+L 626.481856 683.434427
+L 626.527028 683.646817
+L 626.617294 691.87784
+L 626.662389 702.329687
+L 626.707459 700.941201
+L 626.842517 684.000764
+L 626.887486 684.16
+L 626.977348 691.953681
+L 627.022242 701.099185
+L 627.06711 700.373265
+L 627.201565 684.54017
+L 627.246333 684.648516
+L 627.335794 692.001206
+L 627.380488 700.040549
+L 627.425156 699.771516
+L 627.559013 685.053247
+L 627.603582 685.113322
+L 627.692646 692.028106
+L 627.781612 699.1721
+L 627.914876 685.540662
+L 627.959248 685.555378
+L 628.047918 692.040589
+L 628.136491 698.596404
+L 628.313344 685.975639
+L 628.401625 692.043561
+L 628.489808 698.055909
+L 628.665885 686.375048
+L 628.753778 692.040827
+L 628.841576 697.555838
+L 629.016883 686.754538
+L 629.104394 692.035281
+L 629.191809 697.09764
+L 629.366354 687.115019
+L 629.453484 692.02908
+L 629.54052 696.680581
+L 629.714308 687.457386
+L 629.887722 696.302731
+L 629.931016 693.032964
+L 630.060761 687.782506
+L 630.233428 695.961574
+L 630.276537 693.080736
+L 630.405724 688.091225
+L 630.577651 695.65436
+L 630.620576 693.114544
+L 630.749211 688.384363
+L 630.920404 695.37832
+L 630.963146 693.137495
+L 631.091234 688.662711
+L 631.2617 695.130776
+L 631.30426 693.152191
+L 631.431805 688.927035
+L 631.60155 694.909207
+L 631.64393 693.160787
+L 631.770937 689.178071
+L 631.939966 694.711275
+L 631.982168 693.165054
+L 632.108641 689.416529
+L 632.150755 690.283625
+L 632.276962 694.534831
+L 632.318987 693.166429
+L 632.444931 689.643089
+L 632.486868 690.439897
+L 632.612548 694.377915
+L 632.654398 693.166072
+L 632.779817 689.858406
+L 632.821579 690.58954
+L 632.946737 694.238746
+L 632.988413 693.164907
+L 633.113311 690.063103
+L 633.1549 690.733021
+L 633.27954 694.115708
+L 633.321043 693.163663
+L 633.445425 690.25778
+L 633.486843 690.870762
+L 633.610968 694.007335
+L 633.652301 693.162906
+L 633.77617 690.443006
+L 633.817418 691.003145
+L 633.941033 693.912304
+L 633.982196 693.163071
+L 634.105558 690.619327
+L 634.146636 691.130515
+L 634.269746 693.829414
+L 634.310741 693.164484
+L 634.433599 690.787261
+L 634.47451 691.253187
+L 634.597118 693.757581
+L 634.637946 693.167384
+L 634.760305 690.947299
+L 634.80105 691.37145
+L 634.92316 693.695819
+L 634.963822 693.171937
+L 635.085686 691.099912
+L 635.126266 691.485567
+L 635.247883 693.643237
+L 635.288381 693.178251
+L 635.409752 691.245542
+L 635.450169 691.595781
+L 635.571296 693.599026
+L 635.611632 693.186391
+L 635.732516 691.384611
+L 635.77277 691.702314
+L 635.893412 693.562452
+L 635.933586 693.196383
+L 636.053986 691.517517
+L 636.09408 691.805375
+L 636.21424 693.532845
+L 636.254253 693.208225
+L 636.374174 691.644636
+L 636.414108 691.905155
+L 636.53379 693.509599
+L 636.573645 693.221894
+L 636.693089 691.766324
+L 636.732865 692.001833
+L 636.852073 693.49216
+L 636.89177 693.237349
+L 637.010742 691.882916
+L 637.050361 692.095575
+L 637.169098 693.480025
+L 637.208639 693.254536
+L 637.327143 691.994728
+L 637.366605 692.186538
+L 637.484876 693.472732
+L 637.524261 693.27339
+L 637.6423 692.102058
+L 637.681608 692.274867
+L 637.799416 693.469863
+L 637.838647 693.293843
+L 637.956225 692.205185
+L 637.99538 692.360698
+L 638.112728 693.471034
+L 638.151807 693.315819
+L 638.268927 692.304371
+L 638.307929 692.444161
+L 638.424822 693.475894
+L 638.463749 693.339241
+L 638.580415 692.399865
+L 638.619266 692.525376
+L 638.735706 693.484122
+L 638.774482 693.364029
+L 638.890698 692.491897
+L 638.929399 692.604457
+L 639.045391 693.495425
+L 639.084018 693.390105
+L 639.199787 692.580685
+L 639.238339 692.681512
+L 639.353885 693.509533
+L 639.392364 693.41739
+L 639.507689 692.666432
+L 639.546094 692.756641
+L 639.661198 693.5262
+L 639.69953 693.445807
+L 639.814414 692.749328
+L 639.852673 692.829941
+L 639.967339 693.545199
+L 640.005524 693.475281
+L 640.119972 692.829551
+L 640.158085 692.901501
+L 640.272315 693.566322
+L 640.310356 693.505739
+L 640.42437 692.907268
+L 640.462339 692.971406
+L 640.576138 693.58938
+L 640.614035 693.537109
+L 640.727619 692.982634
+L 640.765444 693.039737
+L 640.878814 693.614196
+L 640.916568 693.569324
+L 641.029725 693.055795
+L 641.067409 693.10657
+L 641.180353 693.640611
+L 641.217966 693.602319
+L 641.330699 693.126887
+L 641.368241 693.171978
+L 641.480763 693.668475
+L 641.518235 693.636031
+L 641.630547 693.196035
+L 641.66795 693.236027
+L 641.780053 693.697654
+L 641.817385 693.670401
+L 641.92928 693.263359
+L 641.966543 693.298782
+L 642.07823 693.728021
+L 642.115425 693.705374
+L 642.226905 693.328967
+L 642.26403 693.360304
+L 642.375304 693.759463
+L 642.449401 693.620253
+L 642.523429 693.392963
+L 642.560418 693.42065
+L 642.671282 693.791872
+L 642.745106 693.666809
+L 642.818863 693.455443
+L 642.855715 693.479875
+L 643.002958 693.813379
+L 643.039726 693.712944
+L 643.113212 693.516494
+L 643.14993 693.538029
+L 643.296634 693.850251
+L 643.333268 693.758685
+L 643.406486 693.576201
+L 643.44307 693.59516
+L 643.589239 693.887484
+L 643.62574 693.804053
+L 643.698692 693.63464
+L 643.735143 693.651315
+L 643.880782 693.925038
+L 643.91715 693.849068
+L 643.989838 693.691883
+L 644.026157 693.706537
+L 644.171269 693.962876
+L 644.207506 693.893748
+L 644.316119 693.760866
+L 644.460708 694.000961
+L 644.496815 693.938108
+L 644.605037 693.814341
+L 644.641079 693.884473
+L 644.749107 694.039261
+L 644.785084 693.98216
+L 644.892919 693.866997
+L 644.928832 693.931713
+L 645.036473 694.077743
+L 645.072322 694.025916
+L 645.179771 693.918869
+L 645.215556 693.978605
+L 645.322814 694.116379
+L 645.358535 694.069386
+L 645.465602 693.96999
+L 645.50126 694.025148
+L 645.608137 694.15514
+L 645.643731 694.112577
+L 645.750419 694.020389
+L 645.78595 694.071338
+L 645.892449 694.194001
+L 645.927917 694.155498
+L 646.034228 694.070096
+L 646.069634 694.117177
+L 646.175757 694.232938
+L 646.2111 694.198155
+L 646.317037 694.119137
+L 646.352318 694.162663
+L 646.458069 694.271929
+L 646.493288 694.240552
+L 646.598853 694.167538
+L 646.63401 694.207798
+L 646.73939 694.310951
+L 646.774486 694.282695
+L 646.879682 694.215323
+L 646.914717 694.252583
+L 647.019729 694.349987
+L 647.054703 694.324586
+L 647.159532 694.262515
+L 647.194445 694.297018
+L 647.333944 694.36623
+L 647.473202 694.341107
+L 647.612218 694.40763
+L 647.750993 694.38485
+L 647.889529 694.448786
+L 648.027826 694.42825
+L 648.200363 694.46245
+L 648.338126 694.507738
+L 648.475653 694.50555
+L 648.612945 694.548059
+L 648.750002 694.548233
+L 648.886826 694.58822
+L 649.023416 694.59051
+L 649.159775 694.628211
+L 649.329898 694.618865
+L 650.006806 694.767792
+L 650.911667 694.876102
+L 651.244228 694.911166
+L 651.905245 695.038857
+L 652.593502 695.116462
+L 653.016626 695.182997
+L 653.566597 695.255472
+L 655.415099 695.516408
+L 656.479232 695.667209
+L 659.469769 696.060063
+L 664.800288 696.709676
+L 674.924997 697.732078
+L 682.734901 698.28695
+L 689.687407 698.562141
+L 693.520406 698.606008
+L 693.520406 698.606008
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_8">
+ <path d="M 68.96 703.24
+L 68.96 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_9">
+ <path d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_10">
+ <path d="M 68.96 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_11">
+ <path d="M 68.96 410.4
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_3">
+ <g id="patch_12">
+ <path d="M 68.96 1038.04
+L 693.54 1038.04
+L 693.54 745.2
+L 68.96 745.2
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_5">
+ <g id="xtick_41">
+ <g id="line2d_115">
+ <path clip-path="url(#p35aa359eb2)" d="M 68.96 1038.04
+L 68.96 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_116">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_32">
+ <!-- 10Hz -->
+ <g transform="translate(56.213125 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_42">
+ <g id="line2d_117">
+ <path clip-path="url(#p35aa359eb2)" d="M 68.96 1038.04
+L 68.96 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_118">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_43">
+ <g id="line2d_119">
+ <path clip-path="url(#p35aa359eb2)" d="M 124.582948 1038.04
+L 124.582948 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_120">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="124.582948" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_44">
+ <g id="line2d_121">
+ <path clip-path="url(#p35aa359eb2)" d="M 157.120287 1038.04
+L 157.120287 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_122">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="157.120287" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_45">
+ <g id="line2d_123">
+ <path clip-path="url(#p35aa359eb2)" d="M 180.205896 1038.04
+L 180.205896 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_124">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="180.205896" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_46">
+ <g id="line2d_125">
+ <path clip-path="url(#p35aa359eb2)" d="M 198.112486 1038.04
+L 198.112486 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_126">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="198.112486" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_47">
+ <g id="line2d_127">
+ <path clip-path="url(#p35aa359eb2)" d="M 212.743235 1038.04
+L 212.743235 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_128">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="212.743235" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_48">
+ <g id="line2d_129">
+ <path clip-path="url(#p35aa359eb2)" d="M 225.113357 1038.04
+L 225.113357 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_130">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="225.113357" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_49">
+ <g id="line2d_131">
+ <path clip-path="url(#p35aa359eb2)" d="M 235.828845 1038.04
+L 235.828845 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_132">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="235.828845" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_50">
+ <g id="line2d_133">
+ <path clip-path="url(#p35aa359eb2)" d="M 245.280574 1038.04
+L 245.280574 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_134">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="245.280574" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_51">
+ <g id="line2d_135">
+ <path clip-path="url(#p35aa359eb2)" d="M 253.735434 1038.04
+L 253.735434 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_136">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="253.735434" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_33">
+ <!-- 100Hz -->
+ <g transform="translate(237.807309 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_52">
+ <g id="line2d_137">
+ <path clip-path="url(#p35aa359eb2)" d="M 253.735434 1038.04
+L 253.735434 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_138">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="253.735434" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_53">
+ <g id="line2d_139">
+ <path clip-path="url(#p35aa359eb2)" d="M 309.358382 1038.04
+L 309.358382 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_140">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="309.358382" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_54">
+ <g id="line2d_141">
+ <path clip-path="url(#p35aa359eb2)" d="M 341.895721 1038.04
+L 341.895721 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_142">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="341.895721" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_55">
+ <g id="line2d_143">
+ <path clip-path="url(#p35aa359eb2)" d="M 364.981331 1038.04
+L 364.981331 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_144">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="364.981331" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_56">
+ <g id="line2d_145">
+ <path clip-path="url(#p35aa359eb2)" d="M 382.88792 1038.04
+L 382.88792 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_146">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="382.88792" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_57">
+ <g id="line2d_147">
+ <path clip-path="url(#p35aa359eb2)" d="M 397.518669 1038.04
+L 397.518669 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_148">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="397.518669" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_58">
+ <g id="line2d_149">
+ <path clip-path="url(#p35aa359eb2)" d="M 409.888792 1038.04
+L 409.888792 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_150">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="409.888792" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_59">
+ <g id="line2d_151">
+ <path clip-path="url(#p35aa359eb2)" d="M 420.604279 1038.04
+L 420.604279 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_152">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="420.604279" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_60">
+ <g id="line2d_153">
+ <path clip-path="url(#p35aa359eb2)" d="M 430.056008 1038.04
+L 430.056008 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_154">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="430.056008" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_61">
+ <g id="line2d_155">
+ <path clip-path="url(#p35aa359eb2)" d="M 438.510868 1038.04
+L 438.510868 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_156">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="438.510868" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_34">
+ <!-- 1kHz -->
+ <g transform="translate(426.049931 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_62">
+ <g id="line2d_157">
+ <path clip-path="url(#p35aa359eb2)" d="M 438.510868 1038.04
+L 438.510868 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_158">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="438.510868" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_63">
+ <g id="line2d_159">
+ <path clip-path="url(#p35aa359eb2)" d="M 494.133817 1038.04
+L 494.133817 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_160">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="494.133817" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_64">
+ <g id="line2d_161">
+ <path clip-path="url(#p35aa359eb2)" d="M 526.671155 1038.04
+L 526.671155 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_162">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="526.671155" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_65">
+ <g id="line2d_163">
+ <path clip-path="url(#p35aa359eb2)" d="M 549.756765 1038.04
+L 549.756765 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_164">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="549.756765" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_66">
+ <g id="line2d_165">
+ <path clip-path="url(#p35aa359eb2)" d="M 567.663355 1038.04
+L 567.663355 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_166">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="567.663355" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_67">
+ <g id="line2d_167">
+ <path clip-path="url(#p35aa359eb2)" d="M 582.294104 1038.04
+L 582.294104 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_168">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="582.294104" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_68">
+ <g id="line2d_169">
+ <path clip-path="url(#p35aa359eb2)" d="M 594.664226 1038.04
+L 594.664226 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_170">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="594.664226" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_69">
+ <g id="line2d_171">
+ <path clip-path="url(#p35aa359eb2)" d="M 605.379713 1038.04
+L 605.379713 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_172">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="605.379713" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_70">
+ <g id="line2d_173">
+ <path clip-path="url(#p35aa359eb2)" d="M 614.831443 1038.04
+L 614.831443 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_174">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="614.831443" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_71">
+ <g id="line2d_175">
+ <path clip-path="url(#p35aa359eb2)" d="M 623.286303 1038.04
+L 623.286303 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_176">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.286303" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_35">
+ <!-- 10kHz -->
+ <g transform="translate(607.644115 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_72">
+ <g id="line2d_177">
+ <path clip-path="url(#p35aa359eb2)" d="M 623.286303 1038.04
+L 623.286303 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_178">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.286303" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_73">
+ <g id="line2d_179">
+ <path clip-path="url(#p35aa359eb2)" d="M 678.909251 1038.04
+L 678.909251 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_180">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.909251" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_74">
+ <g id="line2d_181">
+ <path clip-path="url(#p35aa359eb2)" d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_182">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#m0c3b1ae8ab" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_36">
+ <!-- 24kHz -->
+ <g transform="translate(677.897812 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_37">
+ <!-- Frequency (Hz) -->
+ <g transform="translate(343.077344 1066.316563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_6">
+ <g id="ytick_17">
+ <g id="line2d_183">
+ <path clip-path="url(#p35aa359eb2)" d="M 68.96 1007.214737
+L 693.54 1007.214737
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_184">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="1007.214737"/>
+ </g>
+ </g>
+ <g id="text_38">
+ <!-- −150 -->
+ <g transform="translate(34.492813 1011.013956)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_18">
+ <g id="line2d_185">
+ <path clip-path="url(#p35aa359eb2)" d="M 68.96 968.683158
+L 693.54 968.683158
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_186">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="968.683158"/>
+ </g>
+ </g>
+ <g id="text_39">
+ <!-- −100 -->
+ <g transform="translate(34.492813 972.482377)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_19">
+ <g id="line2d_187">
+ <path clip-path="url(#p35aa359eb2)" d="M 68.96 930.151579
+L 693.54 930.151579
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_188">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="930.151579"/>
+ </g>
+ </g>
+ <g id="text_40">
+ <!-- −50 -->
+ <g transform="translate(40.855313 933.950798)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-53"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_20">
+ <g id="line2d_189">
+ <path clip-path="url(#p35aa359eb2)" d="M 68.96 891.62
+L 693.54 891.62
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_190">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="891.62"/>
+ </g>
+ </g>
+ <g id="text_41">
+ <!-- 0 -->
+ <g transform="translate(55.5975 895.419219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_21">
+ <g id="line2d_191">
+ <path clip-path="url(#p35aa359eb2)" d="M 68.96 853.088421
+L 693.54 853.088421
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_192">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="853.088421"/>
+ </g>
+ </g>
+ <g id="text_42">
+ <!-- 50 -->
+ <g transform="translate(49.235 856.88764)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-53"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_22">
+ <g id="line2d_193">
+ <path clip-path="url(#p35aa359eb2)" d="M 68.96 814.556842
+L 693.54 814.556842
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_194">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="814.556842"/>
+ </g>
+ </g>
+ <g id="text_43">
+ <!-- 100 -->
+ <g transform="translate(42.8725 818.356061)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_23">
+ <g id="line2d_195">
+ <path clip-path="url(#p35aa359eb2)" d="M 68.96 776.025263
+L 693.54 776.025263
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_196">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="68.96" xlink:href="#m9958b18091" y="776.025263"/>
+ </g>
+ </g>
+ <g id="text_44">
+ <!-- 150 -->
+ <g transform="translate(42.8725 779.824482)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-53"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_45">
+ <!-- Phase (${\circ}$) -->
+ <defs>
+ <path d="M 19.671875 64.796875
+L 19.671875 37.40625
+L 32.078125 37.40625
+Q 38.96875 37.40625 42.71875 40.96875
+Q 46.484375 44.53125 46.484375 51.125
+Q 46.484375 57.671875 42.71875 61.234375
+Q 38.96875 64.796875 32.078125 64.796875
+z
+M 9.8125 72.90625
+L 32.078125 72.90625
+Q 44.34375 72.90625 50.609375 67.359375
+Q 56.890625 61.8125 56.890625 51.125
+Q 56.890625 40.328125 50.609375 34.8125
+Q 44.34375 29.296875 32.078125 29.296875
+L 19.671875 29.296875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-80"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-104"/>
+ <path d="M 31.296875 40.671875
+Q 27.390625 40.671875 24.703125 37.953125
+Q 22.015625 35.25 22.015625 31.34375
+Q 22.015625 27.484375 24.703125 24.828125
+Q 27.390625 22.171875 31.296875 22.171875
+Q 35.203125 22.171875 37.890625 24.828125
+Q 40.578125 27.484375 40.578125 31.34375
+Q 40.578125 35.203125 37.859375 37.9375
+Q 35.15625 40.671875 31.296875 40.671875
+z
+M 31.296875 46.96875
+Q 34.421875 46.96875 37.296875 45.765625
+Q 40.1875 44.578125 42.28125 42.328125
+Q 44.53125 40.140625 45.65625 37.34375
+Q 46.78125 34.5625 46.78125 31.34375
+Q 46.78125 24.90625 42.265625 20.4375
+Q 37.75 15.96875 31.203125 15.96875
+Q 24.609375 15.96875 20.21875 20.359375
+Q 15.828125 24.75 15.828125 31.34375
+Q 15.828125 37.890625 20.3125 42.421875
+Q 24.8125 46.96875 31.296875 46.96875
+z
+" id="DejaVuSans-8728"/>
+ </defs>
+ <g transform="translate(28.413125 915.17)rotate(-90)scale(0.1 -0.1)">
+ <use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-80"/>
+ <use transform="translate(60.302734 0.015625)" xlink:href="#DejaVuSans-104"/>
+ <use transform="translate(123.681641 0.015625)" xlink:href="#DejaVuSans-97"/>
+ <use transform="translate(184.960938 0.015625)" xlink:href="#DejaVuSans-115"/>
+ <use transform="translate(237.060547 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(298.583984 0.015625)" xlink:href="#DejaVuSans-32"/>
+ <use transform="translate(330.371094 0.015625)" xlink:href="#DejaVuSans-40"/>
+ <use transform="translate(369.384766 0.015625)" xlink:href="#DejaVuSans-8728"/>
+ <use transform="translate(431.982422 0.015625)" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_197">
+ <path clip-path="url(#p35aa359eb2)" d="M -1 787.474861
+L 26.064622 787.479921
+L 81.68757 822.053527
+L 114.224909 856.627137
+L 137.310518 891.200749
+L 155.217108 925.774367
+L 169.847857 960.347991
+L 182.217979 994.921623
+L 192.933466 1029.495263
+L 202.385196 786.641546
+L 210.840056 821.215207
+L 218.488408 855.788882
+L 225.470805 890.36257
+L 231.893989 924.936274
+L 237.840927 959.509994
+L 243.377395 994.083731
+L 248.556415 1028.657488
+L 253.421356 785.803896
+L 258.008144 820.377693
+L 262.346874 854.951514
+L 266.463004 889.525359
+L 270.378266 924.099228
+L 274.111356 958.673124
+L 277.678474 993.247048
+L 281.093754 1027.821001
+L 284.369594 784.967615
+L 287.516937 819.541629
+L 293.463876 888.689758
+L 299.000343 957.838027
+L 304.179363 1026.986447
+L 306.648695 784.133348
+L 311.370465 853.282013
+L 315.829777 922.430854
+L 320.054276 991.579881
+L 322.085953 1026.154468
+L 324.067459 783.301736
+L 327.889465 852.451165
+L 331.537682 921.60081
+L 335.02723 990.750681
+L 336.716702 1025.325705
+L 338.371337 782.473421
+L 343.139885 886.199048
+L 347.640894 989.925254
+L 349.086824 1024.500795
+L 350.507161 781.649043
+L 354.623291 885.376318
+L 358.538553 989.104224
+L 359.802311 1023.680365
+L 361.046475 780.829238
+L 365.838761 919.134938
+L 369.254041 1022.865004
+L 370.360913 780.014631
+L 374.641765 918.323233
+L 377.708901 1022.055182
+L 378.70577 779.205791
+L 382.573842 917.517869
+L 385.357252 1021.251048
+L 386.264007 778.403104
+L 390.650178 951.296341
+L 392.33965 1020.451931
+L 393.171232 777.606395
+L 397.204591 950.504162
+L 398.762833 1019.655272
+L 399.530752 776.814013
+L 403.990064 984.280885
+L 404.709772 1018.854462
+L 405.423083 776.020719
+L 409.574713 983.476442
+L 410.24624 1018.034764
+L 410.912193 775.213182
+L 415.425259 1017.166118
+L 416.049752 774.36088
+L 420.2902 1016.191365
+L 420.878093 773.398487
+L 424.876989 1015.009138
+L 425.432333 772.193095
+L 429.215718 1013.454791
+L 429.74193 770.485845
+L 433.331849 1011.297306
+L 433.831832 767.798076
+L 436.768023 977.77579
+L 437.247111 1008.305585
+L 437.723355 763.330714
+L 438.667448 842.098873
+L 439.600563 918.968536
+L 440.9802 1004.4737
+L 441.434858 756.102779
+L 441.886955 791.689496
+L 442.783578 891.33353
+L 443.670294 953.710058
+L 444.982263 1023.497962
+L 445.414862 773.402203
+L 445.845141 833.653737
+L 446.273126 910.496328
+L 447.122308 960.49768
+L 448.379466 1013.286679
+L 448.79418 1025.876086
+L 449.206762 1009.845724
+L 449.617233 948.708878
+L 450.025615 956.270729
+L 451.638674 1006.395553
+L 452.036922 1010.942548
+L 452.433204 999.442416
+L 452.827539 977.124533
+L 453.219946 973.064644
+L 453.610442 979.048301
+L 454.77066 1003.721665
+L 455.153701 1006.01011
+L 455.534922 1000.545658
+L 455.914341 990.633506
+L 456.291974 986.20107
+L 456.667839 988.326478
+L 457.784984 1004.305551
+L 458.153936 1006.036337
+L 458.5212 1003.69016
+L 458.88679 998.987759
+L 459.250722 996.069457
+L 459.613012 996.692014
+L 460.33272 1003.723051
+L 460.690168 1007.037414
+L 461.046031 1008.570838
+L 461.400323 1007.815821
+L 462.104248 1004.030257
+L 462.453908 1004.238414
+L 462.802052 1006.106354
+L 463.49384 1011.144659
+L 463.837511 1012.540066
+L 464.179716 1012.606826
+L 464.859779 1011.054975
+L 465.197661 1011.257528
+L 465.534127 1012.496879
+L 466.535141 1017.42959
+L 466.866057 1017.922774
+L 467.523823 1017.700862
+L 467.850695 1018.024851
+L 468.176241 1018.97257
+L 469.145028 1022.974206
+L 469.465376 1023.689726
+L 470.418816 1024.746779
+L 471.048207 1026.714048
+L 471.6727 1029.034223
+L 471.983134 752.441414
+L 473.212996 754.953794
+L 474.724283 759.769457
+L 475.617579 762.002662
+L 480.77809 779.099417
+L 484.838667 794.884114
+L 487.179911 805.275348
+L 489.45478 816.458733
+L 491.666934 828.559333
+L 493.819738 841.735854
+L 495.68603 854.513754
+L 497.509903 868.489325
+L 499.293242 883.911465
+L 501.03781 901.131981
+L 502.533802 918.084617
+L 504.002414 937.360628
+L 505.240181 956.350568
+L 506.459146 978.338122
+L 507.659871 1003.850962
+L 508.64693 1027.424126
+L 508.842894 754.850228
+L 511.347804 814.680928
+L 513.037276 848.786597
+L 514.873671 881.177062
+L 517.199832 917.967897
+L 519.973221 958.075937
+L 523.310373 1002.935422
+L 525.24802 1027.818145
+L 525.407398 752.407822
+L 530.047242 809.666674
+L 538.050006 905.137554
+L 544.953024 988.523254
+L 548.13396 1028.605507
+L 548.253821 752.720726
+L 551.883404 800.924757
+L 554.805885 842.573548
+L 557.305315 881.308743
+L 559.312915 915.730078
+L 560.96542 947.719758
+L 562.484335 981.674635
+L 564.269879 1027.262609
+L 564.36792 752.395487
+L 564.465842 754.944956
+L 566.112488 795.002269
+L 567.443629 821.806965
+L 568.753049 843.726024
+L 570.223824 864.487703
+L 571.75754 883.013719
+L 573.437702 900.622197
+L 575.254692 917.26482
+L 577.115084 932.287831
+L 579.096591 946.497211
+L 581.189408 959.874517
+L 583.306451 972.009441
+L 585.519774 983.438369
+L 587.89324 994.506786
+L 590.552809 1005.704271
+L 592.989997 1014.969034
+L 597.263723 1029.448305
+L 597.328727 752.165272
+L 597.393678 752.335108
+L 598.873222 756.888229
+L 599.064211 757.478083
+L 599.381518 758.393271
+L 599.571302 758.963653
+L 599.823651 759.797336
+L 600.012394 760.149942
+L 600.388552 761.30742
+L 600.513547 761.565259
+L 600.887369 762.719029
+L 601.011591 762.947992
+L 601.383105 764.101932
+L 601.506562 764.298954
+L 601.814376 765.471219
+L 601.875797 765.457296
+L 601.937171 765.477113
+L 602.059779 765.899765
+L 602.304435 766.824881
+L 602.426483 766.780266
+L 602.548347 767.19408
+L 602.791519 768.155177
+L 602.91283 768.055459
+L 603.033958 768.458893
+L 603.275665 769.463368
+L 603.396247 769.303503
+L 603.516647 769.694685
+L 603.756908 770.750712
+L 603.876769 770.525176
+L 603.936632 770.601081
+L 604.235282 772.01847
+L 604.294878 771.860476
+L 604.354431 771.721222
+L 604.413939 771.774858
+L 604.710821 773.267914
+L 604.770065 773.074136
+L 604.829266 772.892361
+L 604.888424 772.920761
+L 605.124618 774.514478
+L 605.242455 774.26806
+L 605.360119 774.039102
+L 605.594931 775.739236
+L 605.71208 775.443381
+L 605.829058 775.130131
+L 606.062504 776.948432
+L 606.178973 776.601257
+L 606.295273 776.194035
+L 606.469407 777.765152
+L 606.527368 778.143143
+L 606.585287 778.108569
+L 606.758794 777.23094
+L 606.874257 778.211663
+L 606.989555 779.324439
+L 607.047141 779.286195
+L 607.219654 778.240908
+L 607.334456 779.270013
+L 607.449095 780.493385
+L 607.506353 780.453629
+L 607.677882 779.223935
+L 607.792031 780.303965
+L 607.906018 781.651036
+L 607.962951 781.612366
+L 608.133508 780.179949
+L 608.19028 780.5088
+L 608.360355 782.798443
+L 608.416966 782.763953
+L 608.586562 781.108808
+L 608.643014 781.435391
+L 608.812133 783.936648
+L 608.868427 783.910001
+L 609.037072 782.010292
+L 609.093208 782.332632
+L 609.261382 785.066682
+L 609.317362 785.05219
+L 609.485067 782.884107
+L 609.540891 783.199912
+L 609.7638 786.192276
+L 609.930576 783.729871
+L 609.986091 784.03651
+L 610.207767 787.332092
+L 610.373624 784.547115
+L 610.428834 784.841591
+L 610.649292 788.473559
+L 610.81424 785.335269
+L 610.869147 785.614197
+L 611.088401 789.618691
+L 611.25245 786.093659
+L 611.307058 786.353244
+L 611.52512 790.769592
+L 611.688279 786.821493
+L 611.742592 787.057507
+L 611.959476 791.928467
+L 612.121755 787.51785
+L 612.175775 787.725617
+L 612.391493 793.09762
+L 612.552901 788.181664
+L 612.606632 788.356048
+L 612.821196 794.279449
+L 612.981744 788.811704
+L 613.035188 788.947106
+L 613.248611 795.476448
+L 613.408307 789.406557
+L 613.461468 789.496916
+L 613.673762 796.6912
+L 613.726747 795.062257
+L 613.832614 789.964598
+L 613.885495 790.003411
+L 614.096671 797.926357
+L 614.149379 796.198299
+L 614.307293 790.464313
+L 614.517364 799.184636
+L 614.569796 797.36059
+L 614.726886 790.877122
+L 614.935863 800.468783
+L 614.988022 798.554241
+L 615.144297 791.239094
+L 615.35219 801.781553
+L 615.40408 799.784943
+L 615.559547 791.547226
+L 615.766369 803.125663
+L 615.817991 801.059036
+L 615.97266 791.798233
+L 616.178421 804.503747
+L 616.229779 802.383587
+L 616.383656 791.988531
+L 616.588368 805.918291
+L 616.639464 803.766458
+L 616.792559 792.114218
+L 616.996231 807.371565
+L 617.047069 805.216386
+L 617.199388 792.171051
+L 617.402032 808.865534
+L 617.452613 806.743042
+L 617.604166 792.154431
+L 617.805791 810.401761
+L 617.856119 808.357072
+L 618.006912 792.059395
+L 618.207529 811.981304
+L 618.257605 810.070111
+L 618.407646 791.880604
+L 618.607266 813.604593
+L 618.657093 811.894724
+L 618.80639 791.612351
+L 619.005021 815.271319
+L 619.054602 813.844269
+L 619.203162 791.248581
+L 619.400814 816.980311
+L 619.450152 815.93262
+L 619.597981 790.782929
+L 619.794665 818.729437
+L 619.843761 818.17371
+L 619.990868 790.208792
+L 620.235449 820.580817
+L 620.381841 789.519435
+L 620.430579 796.039453
+L 620.625235 823.16556
+L 620.770918 788.708144
+L 620.81942 795.81006
+L 621.013136 825.936531
+L 621.158117 787.768443
+L 621.206386 795.514711
+L 621.399172 828.897606
+L 621.543457 786.694377
+L 621.591495 795.153028
+L 621.783359 832.046025
+L 621.926956 785.480878
+L 621.974765 794.725094
+L 622.165715 835.370471
+L 622.261021 783.465052
+L 622.356213 794.231505
+L 622.546259 838.849559
+L 622.641113 780.846895
+L 622.735856 793.673428
+L 622.925006 842.45121
+L 623.019414 777.654049
+L 623.113712 793.052637
+L 623.301974 846.133386
+L 623.348971 832.003611
+L 623.39594 773.78703
+L 623.489797 792.371551
+L 623.67718 849.84642
+L 623.723958 841.412218
+L 623.770708 769.158859
+L 623.864127 791.633245
+L 624.0972 854.138369
+L 624.143733 763.728996
+L 624.236719 790.841445
+L 624.468714 869.332227
+L 624.515033 757.551988
+L 624.60759 790.000507
+L 624.838517 884.046043
+L 624.884622 1028.248286
+L 624.930701 770.834297
+L 625.022781 807.196504
+L 625.206622 895.787874
+L 625.252517 1021.29265
+L 625.298386 768.528952
+L 625.390044 807.107529
+L 625.573048 904.283578
+L 625.618733 1014.503361
+L 625.664393 766.182722
+L 625.755635 806.985688
+L 625.937807 910.322599
+L 625.983286 1008.21794
+L 626.028738 763.821879
+L 626.119567 806.832879
+L 626.300916 914.696043
+L 626.346189 1002.640551
+L 626.391437 761.4726
+L 626.481856 806.651141
+L 626.662389 917.955605
+L 626.707459 997.83488
+L 626.752504 759.159607
+L 626.842517 806.442623
+L 627.022242 920.455176
+L 627.06711 993.765733
+L 627.111953 756.905
+L 627.201565 806.209554
+L 627.380488 922.4206
+L 627.425156 990.348275
+L 627.4698 754.727401
+L 627.559013 805.954216
+L 627.737141 923.998957
+L 627.781612 987.483264
+L 627.826058 752.641475
+L 627.914876 805.67891
+L 628.092217 925.288718
+L 628.180741 1028.085188
+L 628.224966 780.136021
+L 628.313344 829.702297
+L 628.489808 983.04376
+L 628.533863 1026.210539
+L 628.577895 779.13517
+L 628.665885 829.986299
+L 628.885439 1024.448184
+L 628.929278 778.152459
+L 629.016883 830.235461
+L 629.235481 1022.798514
+L 629.279129 777.191505
+L 629.366354 830.451353
+L 629.584002 1021.259606
+L 629.627461 776.255319
+L 629.714308 830.635607
+L 629.931016 1019.827796
+L 629.974288 775.346329
+L 630.060761 830.789896
+L 630.276537 1018.498185
+L 630.319622 774.466396
+L 630.405724 830.915912
+L 630.620576 1017.265071
+L 630.663477 773.616859
+L 630.749211 831.015349
+L 630.963146 1016.122302
+L 631.005864 772.798576
+L 631.091234 831.089886
+L 631.30426 1015.063544
+L 631.346797 772.011981
+L 631.431805 831.141175
+L 631.64393 1014.082484
+L 631.686288 771.257139
+L 631.770937 831.170828
+L 631.982168 1013.172974
+L 632.024348 770.533793
+L 632.108641 831.180407
+L 632.318987 1012.329127
+L 632.36099 769.841426
+L 632.444931 831.171418
+L 632.654398 1011.545379
+L 632.696226 769.179301
+L 632.779817 831.145302
+L 632.988413 1010.816526
+L 633.030067 768.546514
+L 633.113311 831.103436
+L 633.321043 1010.137731
+L 633.362525 767.942026
+L 633.445425 831.047121
+L 633.652301 1009.504532
+L 633.693612 767.364705
+L 633.77617 830.977592
+L 633.982196 1008.912827
+L 634.023338 766.813352
+L 634.105558 830.896005
+L 634.310741 1008.35886
+L 634.351714 766.286731
+L 634.433599 830.803447
+L 634.637946 1007.839203
+L 634.678753 765.783585
+L 634.760305 830.700932
+L 634.963822 1007.350729
+L 635.004464 765.302658
+L 635.085686 830.589403
+L 635.288381 1006.890597
+L 635.328858 764.842709
+L 635.409752 830.469736
+L 635.611632 1006.456221
+L 635.651947 764.402521
+L 635.732516 830.342741
+L 635.933586 1006.045258
+L 635.973739 763.980912
+L 636.053986 830.209164
+L 636.254253 1005.655576
+L 636.294247 763.57674
+L 636.374174 830.069693
+L 636.573645 1005.285247
+L 636.613479 763.188909
+L 636.693089 829.924958
+L 636.89177 1004.932519
+L 636.931447 762.816372
+L 637.010742 829.775536
+L 637.208639 1004.595803
+L 637.248159 762.45813
+L 637.327143 829.621955
+L 637.524261 1004.273659
+L 637.563627 762.113239
+L 637.6423 829.464694
+L 637.838647 1003.964781
+L 637.877859 761.780804
+L 637.956225 829.304191
+L 638.151807 1003.667983
+L 638.190866 761.45998
+L 638.268927 829.140842
+L 638.463749 1003.38219
+L 638.502656 761.149975
+L 638.580415 828.975005
+L 638.774482 1003.106427
+L 638.81324 760.850042
+L 638.890698 828.807004
+L 639.084018 1002.839806
+L 639.122626 760.559482
+L 639.199787 828.637131
+L 639.392364 1002.581523
+L 639.430824 760.277641
+L 639.507689 828.46565
+L 639.69953 1002.330846
+L 639.737843 760.003908
+L 639.814414 828.292795
+L 640.005524 1002.087111
+L 640.043692 759.73771
+L 640.119972 828.118779
+L 640.310356 1001.849713
+L 640.348379 759.478515
+L 640.42437 827.943791
+L 640.614035 1001.618103
+L 640.651914 759.225826
+L 640.727619 827.767999
+L 640.916568 1001.391782
+L 640.954305 758.979181
+L 641.029725 827.591553
+L 641.217966 1001.170293
+L 641.255561 758.73815
+L 641.330699 827.414587
+L 641.518235 1000.953223
+L 641.55569 758.502333
+L 641.630547 827.237219
+L 641.817385 1000.740196
+L 641.854701 758.271357
+L 641.92928 827.059551
+L 642.115425 1000.530866
+L 642.152602 758.044877
+L 642.226905 826.881678
+L 642.412361 1000.324921
+L 642.449401 757.822572
+L 642.523429 826.703678
+L 642.708203 1000.122077
+L 642.745106 757.604144
+L 642.818863 826.525623
+L 643.002958 999.922073
+L 643.039726 757.389318
+L 643.113212 826.347574
+L 643.296634 999.724672
+L 643.333268 757.177835
+L 643.406486 826.169584
+L 643.589239 999.529658
+L 643.62574 756.96946
+L 643.698692 825.991699
+L 643.880782 999.336834
+L 643.91715 756.763971
+L 643.989838 825.81396
+L 644.171269 999.146019
+L 644.207506 756.561163
+L 644.279931 825.636398
+L 644.460708 998.95705
+L 644.496815 756.360848
+L 644.568979 825.459044
+L 644.749107 998.769777
+L 644.785084 756.16285
+L 644.85699 825.281921
+L 645.036473 998.584063
+L 645.072322 755.967005
+L 645.143971 825.105048
+L 645.322814 998.399783
+L 645.358535 755.773164
+L 645.429929 824.928444
+L 645.608137 998.216823
+L 645.643731 755.581186
+L 645.714872 824.752119
+L 645.892449 998.03508
+L 645.927917 755.390942
+L 645.998807 824.576085
+L 646.175757 997.854457
+L 646.2111 755.202312
+L 646.28174 824.40035
+L 646.458069 997.674868
+L 646.493288 755.015185
+L 646.56368 824.224919
+L 646.73939 997.496234
+L 646.774486 754.829458
+L 646.844632 824.049797
+L 647.019729 997.318482
+L 647.054703 754.645036
+L 647.124604 823.874986
+L 647.299092 997.141546
+L 647.333944 754.461831
+L 647.403603 823.700485
+L 647.577486 996.965365
+L 647.612218 754.279761
+L 647.681635 823.526296
+L 647.854918 996.789884
+L 647.889529 754.09875
+L 647.958708 823.352416
+L 648.131393 996.615053
+L 648.165886 753.918727
+L 648.234826 823.178844
+L 648.406919 996.440825
+L 648.441294 753.739629
+L 648.509998 823.005576
+L 648.681503 996.267157
+L 648.71576 753.561395
+L 648.78423 822.832608
+L 648.95515 996.094012
+L 648.98929 753.383969
+L 649.057528 822.659937
+L 649.227867 995.921354
+L 649.261892 753.207299
+L 649.329898 822.487557
+L 649.499661 995.74915
+L 649.53357 753.031338
+L 649.601346 822.315464
+L 649.770537 995.57737
+L 649.804332 752.856041
+L 649.87188 822.143652
+L 650.040502 995.405989
+L 650.074183 752.681367
+L 650.141505 821.972117
+L 650.309561 995.234981
+L 650.34313 752.507278
+L 650.410226 821.800851
+L 650.577722 995.064323
+L 650.611179 752.333738
+L 650.678051 821.62985
+L 650.844989 994.893994
+L 650.878335 752.160716
+L 650.944985 821.459108
+L 651.144605 1029.415549
+L 651.177826 786.653536
+L 651.244228 855.906924
+L 651.409994 1029.243473
+L 651.443106 786.481262
+L 651.509289 855.739732
+L 651.674508 1029.071828
+L 651.707511 786.309404
+L 651.773477 855.572554
+L 651.938153 1028.900592
+L 651.971048 786.137941
+L 652.036797 855.405399
+L 652.200935 1028.729742
+L 652.233722 785.966855
+L 652.299257 855.238277
+L 652.462859 1028.559258
+L 652.49554 785.796128
+L 652.560861 855.071198
+L 652.723931 1028.389119
+L 652.756506 785.625742
+L 652.821615 854.904169
+L 652.984157 1028.219309
+L 653.016626 785.455683
+L 653.081524 854.737198
+L 653.243541 1028.049809
+L 653.275905 785.285934
+L 653.37292 889.209387
+L 653.50209 1027.880606
+L 653.53435 785.116484
+L 653.631052 889.043881
+L 653.759808 1027.711684
+L 653.791965 784.947318
+L 653.888357 888.87836
+L 654.016701 1027.543031
+L 654.048755 784.778425
+L 654.14484 888.712834
+L 654.272775 1027.374633
+L 654.304726 784.609792
+L 654.400506 888.547312
+L 654.528034 1027.20648
+L 654.559884 784.441409
+L 654.655359 888.381803
+L 654.782483 1027.03856
+L 654.814233 784.273267
+L 654.909406 888.216313
+L 655.036128 1026.870865
+L 655.067778 784.105356
+L 655.162651 888.050852
+L 655.288974 1026.703383
+L 655.320524 783.937666
+L 655.415099 887.885423
+L 655.541026 1026.536108
+L 655.572477 783.770189
+L 655.666756 887.720035
+L 655.792289 1026.36903
+L 655.823642 783.602919
+L 655.917626 887.554691
+L 656.042767 1026.202143
+L 656.074022 783.435846
+L 656.167714 887.389397
+L 656.292466 1026.035439
+L 656.323624 783.268965
+L 656.417025 887.224156
+L 656.541391 1025.868911
+L 656.572452 783.102268
+L 656.665564 887.058974
+L 656.789545 1025.702554
+L 656.820511 782.93575
+L 656.913336 886.893852
+L 657.036935 1025.536363
+L 657.067805 782.769404
+L 657.160345 886.728796
+L 657.283564 1025.370331
+L 657.31434 782.603226
+L 657.406595 886.563806
+L 657.529438 1025.204453
+L 657.560119 782.437211
+L 657.652093 886.398887
+L 657.774561 1025.038726
+L 657.805148 782.271352
+L 657.896842 886.23404
+L 658.018937 1024.873144
+L 658.049432 782.105646
+L 658.140846 886.069267
+L 658.262571 1024.707704
+L 658.292973 781.940089
+L 658.384111 885.90457
+L 658.505468 1024.542401
+L 658.535778 781.774676
+L 658.626641 885.739951
+L 658.747632 1024.377233
+L 658.777851 781.609403
+L 658.86844 885.57541
+L 658.989067 1024.212195
+L 659.019195 781.444268
+L 659.109512 885.410949
+L 659.229778 1024.047284
+L 659.259816 781.279265
+L 659.349863 885.246569
+L 659.469769 1023.882498
+L 659.499717 781.114393
+L 659.589496 885.082271
+L 659.709044 1023.717833
+L 659.738904 780.949648
+L 659.828415 884.918055
+L 659.947608 1023.553287
+L 659.977379 780.785027
+L 660.066625 884.753923
+L 660.185465 1023.388858
+L 660.215148 780.620528
+L 660.30413 884.589874
+L 660.422619 1023.224542
+L 660.452214 780.456147
+L 660.540934 884.425909
+L 660.659075 1023.060338
+L 660.688583 780.291881
+L 660.777042 884.262027
+L 660.894835 1022.896243
+L 660.924257 780.12773
+L 661.012456 884.09823
+L 661.129905 1022.732255
+L 661.159241 779.96369
+L 661.247182 883.934518
+L 661.364289 1022.568374
+L 661.393538 779.799759
+L 661.481224 883.770889
+L 661.597989 1022.404595
+L 661.627154 779.635936
+L 661.714585 883.607345
+L 661.831012 1022.240918
+L 661.860092 779.472218
+L 661.947269 883.443884
+L 662.063359 1022.077341
+L 662.092355 779.308602
+L 662.179281 883.280508
+L 662.295036 1021.913862
+L 662.323948 779.145089
+L 662.410624 883.117215
+L 662.526045 1021.75048
+L 662.554875 778.981675
+L 662.641301 882.954005
+L 662.756392 1021.587194
+L 662.785139 778.818359
+L 662.871318 882.790878
+L 662.986079 1021.424001
+L 663.014744 778.655139
+L 663.100677 882.627833
+L 663.215111 1021.2609
+L 663.243694 778.492014
+L 663.329382 882.464871
+L 663.443491 1021.097891
+L 663.471993 778.328983
+L 663.557438 882.30199
+L 663.671223 1020.934971
+L 663.699644 778.166043
+L 663.784847 882.13919
+L 663.89831 1020.77214
+L 663.926651 778.003194
+L 664.011613 881.976471
+L 664.124757 1020.609395
+L 664.153018 777.840434
+L 664.237741 881.813832
+L 664.350566 1020.446737
+L 664.378748 777.677761
+L 664.463233 881.651272
+L 664.575742 1020.284164
+L 664.603845 777.515175
+L 664.688093 881.488792
+L 664.800288 1020.121675
+L 664.828312 777.352675
+L 664.912325 881.32639
+L 665.024207 1019.959269
+L 665.052153 777.190259
+L 665.135932 881.164065
+L 665.247503 1019.796944
+L 665.275371 777.027926
+L 665.358918 881.001818
+L 665.470179 1019.6347
+L 665.49797 776.865675
+L 665.581286 880.839647
+L 665.692239 1019.472535
+L 665.719954 776.703504
+L 665.803039 880.677552
+L 665.913687 1019.31045
+L 665.941325 776.541413
+L 666.024182 880.515531
+L 666.134525 1019.148442
+L 666.162087 776.379402
+L 666.244716 880.353586
+L 666.354757 1018.986511
+L 666.382243 776.217467
+L 666.464646 880.191715
+L 666.574386 1018.824655
+L 666.601797 776.05561
+L 666.683975 880.029917
+L 666.793415 1018.662875
+L 666.820752 775.893828
+L 666.902707 879.868191
+L 667.011849 1018.501169
+L 667.039111 775.732121
+L 667.120843 879.706537
+L 667.229689 1018.339536
+L 667.256878 775.570488
+L 667.338388 879.544955
+L 667.44694 1018.177976
+L 667.474055 775.408929
+L 667.555345 879.383443
+L 667.663604 1018.016487
+L 667.690646 775.247441
+L 667.771718 879.222001
+L 667.879685 1017.855069
+L 667.906654 775.086025
+L 667.987508 879.060627
+L 668.095186 1017.693721
+L 668.122083 774.924679
+L 668.202719 878.899323
+L 668.310109 1017.532442
+L 668.336934 774.763403
+L 668.417355 878.738086
+L 668.524458 1017.371232
+L 668.551212 774.602195
+L 668.631419 878.576916
+L 668.738237 1017.210089
+L 668.764919 774.441056
+L 668.844912 878.415813
+L 668.951447 1017.049013
+L 668.978058 774.279983
+L 669.05784 878.254776
+L 669.164092 1016.888003
+L 669.190633 774.118977
+L 669.270204 878.093804
+L 669.376175 1016.727059
+L 669.402646 773.958037
+L 669.482007 877.932896
+L 669.587699 1016.566179
+L 669.614101 773.797162
+L 669.693253 877.772052
+L 669.798668 1016.405363
+L 669.825 773.63635
+L 669.903944 877.611272
+L 670.009082 1016.24461
+L 670.035346 773.475603
+L 670.114083 877.450554
+L 670.218947 1016.08392
+L 670.245142 773.314918
+L 670.323674 877.289896
+L 670.428264 1015.923292
+L 670.454391 773.154295
+L 670.532719 877.129302
+L 670.637037 1015.762725
+L 670.663095 772.993733
+L 670.74122 876.968767
+L 670.845268 1015.602218
+L 670.871259 772.833231
+L 670.949181 876.808292
+L 671.05296 1015.441771
+L 671.078884 772.67279
+L 671.156605 876.647876
+L 671.260116 1015.281383
+L 671.285973 772.512408
+L 671.363494 876.487519
+L 671.466738 1015.121054
+L 671.492529 772.352084
+L 671.56985 876.32722
+L 671.67283 1014.960782
+L 671.698554 772.191818
+L 671.775678 876.166977
+L 671.878394 1014.800567
+L 671.904052 772.031609
+L 671.980979 876.006792
+L 672.083433 1014.640409
+L 672.109026 771.871457
+L 672.185756 875.846663
+L 672.287949 1014.480307
+L 672.313477 771.71136
+L 672.390012 875.686589
+L 672.491945 1014.32026
+L 672.517408 771.551319
+L 672.593749 875.52657
+L 672.695424 1014.160267
+L 672.720822 771.391333
+L 672.79697 875.366605
+L 672.898388 1014.000329
+L 672.923722 771.2314
+L 672.999678 875.206694
+L 673.10084 1013.840444
+L 673.126111 771.071521
+L 673.201875 875.046835
+L 673.302783 1013.680612
+L 673.32799 770.911695
+L 673.403564 874.88703
+L 673.504219 1013.520831
+L 673.529363 770.75192
+L 673.604747 874.727275
+L 673.70515 1013.361103
+L 673.730231 770.592197
+L 673.805428 874.567572
+L 673.90558 1013.201425
+L 673.930598 770.432525
+L 674.005607 874.40792
+L 674.10551 1013.041797
+L 674.130466 770.272904
+L 674.205289 874.248317
+L 674.304943 1012.88222
+L 674.329838 770.113332
+L 674.404474 874.088764
+L 674.503882 1012.722691
+L 674.528715 769.953809
+L 674.603167 873.92926
+L 674.702329 1012.563211
+L 674.727101 769.794334
+L 674.801369 873.769804
+L 674.900287 1012.403779
+L 674.924997 769.634908
+L 674.999083 873.610396
+L 675.097757 1012.244394
+L 675.122407 769.475529
+L 675.19631 873.451035
+L 675.294743 1012.085056
+L 675.319332 769.316197
+L 675.393054 873.291721
+L 675.491246 1011.925765
+L 675.515775 769.156911
+L 675.589317 873.132452
+L 675.687269 1011.766519
+L 675.711738 768.99767
+L 675.785101 872.973229
+L 675.882814 1011.607318
+L 675.907224 768.838475
+L 675.980409 872.814051
+L 676.077885 1011.448162
+L 676.102235 768.679325
+L 676.175242 872.654917
+L 676.272482 1011.28905
+L 676.296773 768.520218
+L 676.393866 907.154363
+L 676.466608 1011.129982
+L 676.490841 768.361155
+L 676.587699 906.995322
+L 676.660266 1010.970957
+L 676.68444 768.202135
+L 676.781065 906.836324
+L 676.853458 1010.811973
+L 676.877574 768.043157
+L 676.973967 906.677367
+L 677.046185 1010.653032
+L 677.070244 767.884221
+L 677.166406 906.518452
+L 677.238451 1010.494133
+L 677.262452 767.725326
+L 677.358384 906.359578
+L 677.430258 1010.335274
+L 677.454201 767.566472
+L 677.549904 906.200744
+L 677.621607 1010.176455
+L 677.645493 767.407659
+L 677.740969 906.041951
+L 677.8125 1010.017677
+L 677.83633 767.248885
+L 677.931579 905.883196
+L 678.002941 1009.858937
+L 678.026715 767.09015
+L 678.121738 905.724481
+L 678.192931 1009.700236
+L 678.216648 766.931455
+L 678.311447 905.565804
+L 678.382472 1009.541574
+L 678.406134 766.772797
+L 678.500709 905.407166
+L 678.571567 1009.382949
+L 678.595172 766.614177
+L 678.689525 905.248564
+L 678.760217 1009.224361
+L 678.783767 766.455594
+L 678.877898 905.09
+L 678.948424 1009.065811
+L 678.971919 766.297047
+L 679.06583 904.931472
+L 679.136192 1008.907296
+L 679.159632 766.138537
+L 679.253323 904.77298
+L 679.32352 1008.748817
+L 679.346906 765.980063
+L 679.440379 904.614523
+L 679.510413 1008.590374
+L 679.533744 765.821623
+L 679.627 904.456101
+L 679.696871 1008.431965
+L 679.720148 765.663219
+L 679.813188 904.297714
+L 679.882897 1008.27359
+L 679.90612 765.504848
+L 679.998945 904.13936
+L 680.068493 1008.115249
+L 680.091662 765.346512
+L 680.184273 903.98104
+L 680.253661 1007.956942
+L 680.276777 765.188208
+L 680.369174 903.822753
+L 680.438402 1007.798667
+L 680.461465 765.029938
+L 680.55365 903.664499
+L 680.622719 1007.640425
+L 680.645729 764.871699
+L 680.737702 903.506276
+L 680.806613 1007.482214
+L 680.829571 764.713492
+L 680.921334 903.348085
+L 680.990087 1007.324035
+L 681.012992 764.555317
+L 681.104546 903.189925
+L 681.173143 1007.165887
+L 681.195996 764.397173
+L 681.287341 903.031796
+L 681.355782 1007.007769
+L 681.378583 764.239058
+L 681.469721 902.873697
+L 681.538006 1006.84968
+L 681.560755 764.080974
+L 681.651687 902.715627
+L 681.719818 1006.691622
+L 681.742515 763.922919
+L 681.833241 902.557587
+L 681.901218 1006.533592
+L 681.923864 763.764894
+L 682.014385 902.399575
+L 682.082209 1006.375591
+L 682.104804 763.606896
+L 682.195122 902.241592
+L 682.262793 1006.217619
+L 682.285338 763.448927
+L 682.375452 902.083636
+L 682.442972 1006.059673
+L 682.465465 763.290985
+L 682.555378 901.925708
+L 682.622746 1005.901755
+L 682.64519 763.13307
+L 682.734901 901.767807
+L 682.802119 1005.743864
+L 682.824513 762.975182
+L 682.914024 901.609932
+L 682.981092 1005.585999
+L 683.003436 762.81732
+L 683.092748 901.452083
+L 683.159667 1005.42816
+L 683.181961 762.659484
+L 683.271075 901.29426
+L 683.337845 1005.270346
+L 683.36009 762.501673
+L 683.449006 901.136462
+L 683.515628 1005.112557
+L 683.537824 762.343888
+L 683.626543 900.978688
+L 683.693019 1004.954793
+L 683.715165 762.186127
+L 683.803689 900.820939
+L 683.870018 1004.797053
+L 683.892115 762.028389
+L 683.980445 900.663214
+L 684.046628 1004.639336
+L 684.068677 761.870676
+L 684.156812 900.505512
+L 684.222849 1004.481642
+L 684.24485 761.712985
+L 684.332792 900.347832
+L 684.398685 1004.323971
+L 684.420637 761.555317
+L 684.508387 900.190175
+L 684.574136 1004.166323
+L 684.596041 761.397671
+L 684.683599 900.032541
+L 684.749205 1004.008696
+L 684.771061 761.240048
+L 684.858429 899.874928
+L 684.923892 1003.851091
+L 684.945701 761.082445
+L 685.032879 899.717336
+L 685.0982 1003.693507
+L 685.119962 760.924863
+L 685.20695 899.559764
+L 685.27213 1003.535944
+L 685.293845 760.767302
+L 685.380645 899.402214
+L 685.445684 1003.3784
+L 685.467352 760.609762
+L 685.553965 899.244683
+L 685.618863 1003.220877
+L 685.640484 760.452241
+L 685.726911 899.087171
+L 685.79167 1003.063372
+L 685.813244 760.294738
+L 685.899485 898.929679
+L 685.964105 1002.905887
+L 685.985633 760.137255
+L 686.071689 898.772205
+L 686.13617 1002.74842
+L 686.157652 759.979791
+L 686.243524 898.614749
+L 686.307867 1002.590971
+L 686.329304 759.822344
+L 686.414992 898.457311
+L 686.479198 1002.43354
+L 686.500588 759.664915
+L 686.586094 898.299891
+L 686.650163 1002.276126
+L 686.671509 759.507503
+L 686.756832 898.142487
+L 686.820766 1002.118728
+L 686.842065 759.350107
+L 686.927208 897.9851
+L 686.991006 1001.961347
+L 687.01226 759.192728
+L 687.097223 897.827729
+L 687.160886 1001.803982
+L 687.182095 759.035366
+L 687.266878 897.670374
+L 687.330407 1001.646633
+L 687.351572 758.878018
+L 687.436176 897.513034
+L 687.49957 1001.489299
+L 687.520691 758.720686
+L 687.605117 897.355709
+L 687.668378 1001.331979
+L 687.689454 758.563368
+L 687.773703 897.198399
+L 687.836831 1001.174674
+L 687.857863 758.406064
+L 687.941935 897.041102
+L 688.004932 1001.017383
+L 688.02592 758.248775
+L 688.109816 896.883819
+L 688.172681 1000.860104
+L 688.193625 758.091499
+L 688.277346 896.72655
+L 688.34008 1000.70284
+L 688.36098 757.934236
+L 688.444527 896.569293
+L 688.507131 1000.545588
+L 688.527988 757.776985
+L 688.611361 896.412049
+L 688.673834 1000.388348
+L 688.694648 757.619747
+L 688.777849 896.254817
+L 688.840193 1000.23112
+L 688.860963 757.462521
+L 688.943991 896.097596
+L 689.006206 1000.073904
+L 689.026934 757.305306
+L 689.109791 895.940386
+L 689.171878 999.916699
+L 689.192562 757.148101
+L 689.275249 895.783188
+L 689.337207 999.759504
+L 689.35785 756.990908
+L 689.440366 895.626
+L 689.502197 999.60232
+L 689.522797 756.833725
+L 689.605144 895.468822
+L 689.666849 999.445146
+L 689.687407 756.676552
+L 689.769585 895.311653
+L 689.831163 999.287981
+L 689.851679 756.519389
+L 689.933689 895.154494
+L 689.995142 999.130825
+L 690.015615 756.362234
+L 690.097458 894.997344
+L 690.158786 998.973677
+L 690.179218 756.205087
+L 690.260894 894.840201
+L 690.322097 998.816539
+L 690.342487 756.04795
+L 690.423998 894.683068
+L 690.485076 998.659408
+L 690.505425 755.89082
+L 690.58677 894.525941
+L 690.647725 998.502284
+L 690.668033 755.733697
+L 690.749214 894.368822
+L 690.810045 998.345168
+L 690.830312 755.576581
+L 690.911329 894.21171
+L 690.972038 998.188058
+L 690.992264 755.419472
+L 691.073117 894.054605
+L 691.133704 998.030955
+L 691.153889 755.26237
+L 691.23458 893.897505
+L 691.295045 997.873857
+L 691.31519 755.105273
+L 691.395718 893.740411
+L 691.456062 997.716765
+L 691.476166 754.948182
+L 691.556534 893.583322
+L 691.616757 997.559679
+L 691.636821 754.791096
+L 691.717028 893.426238
+L 691.77713 997.402597
+L 691.797155 754.634014
+L 691.877202 893.269159
+L 691.937184 997.245519
+L 691.957169 754.476937
+L 692.037056 893.112085
+L 692.096919 997.088445
+L 692.116864 754.319864
+L 692.196593 892.955013
+L 692.256337 996.931375
+L 692.276242 754.162794
+L 692.355813 892.797945
+L 692.415439 996.774308
+L 692.435305 754.005727
+L 692.514718 892.64088
+L 692.574226 996.617244
+L 692.594052 753.848664
+L 692.673309 892.483817
+L 692.7327 996.460182
+L 692.752487 753.691602
+L 692.831587 892.326756
+L 692.890861 996.303122
+L 692.910609 753.534542
+L 692.989553 892.169698
+L 693.048711 996.146064
+L 693.06842 753.377484
+L 693.147209 892.01264
+L 693.206251 995.989007
+L 693.225922 753.220428
+L 693.304556 891.855584
+L 693.363482 995.831951
+L 693.383114 753.063371
+L 693.461596 891.698528
+L 693.520406 995.674895
+L 693.520406 995.674895
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_13">
+ <path d="M 68.96 1038.04
+L 68.96 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_14">
+ <path d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_15">
+ <path d="M 68.96 1038.04
+L 693.54 1038.04
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_16">
+ <path d="M 68.96 745.2
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="text_46">
+ <!-- 12th-order Butterworth filter, bandpass -->
+ <defs>
+ <path d="M 4.890625 31.390625
+L 31.203125 31.390625
+L 31.203125 23.390625
+L 4.890625 23.390625
+z
+" id="DejaVuSans-45"/>
+ <path d="M 30.609375 48.390625
+Q 23.390625 48.390625 19.1875 42.75
+Q 14.984375 37.109375 14.984375 27.296875
+Q 14.984375 17.484375 19.15625 11.84375
+Q 23.34375 6.203125 30.609375 6.203125
+Q 37.796875 6.203125 41.984375 11.859375
+Q 46.1875 17.53125 46.1875 27.296875
+Q 46.1875 37.015625 41.984375 42.703125
+Q 37.796875 48.390625 30.609375 48.390625
+z
+M 30.609375 56
+Q 42.328125 56 49.015625 48.375
+Q 55.71875 40.765625 55.71875 27.296875
+Q 55.71875 13.875 49.015625 6.21875
+Q 42.328125 -1.421875 30.609375 -1.421875
+Q 18.84375 -1.421875 12.171875 6.21875
+Q 5.515625 13.875 5.515625 27.296875
+Q 5.515625 40.765625 12.171875 48.375
+Q 18.84375 56 30.609375 56
+z
+" id="DejaVuSans-111"/>
+ <path d="M 4.203125 54.6875
+L 13.1875 54.6875
+L 24.421875 12.015625
+L 35.59375 54.6875
+L 46.1875 54.6875
+L 57.421875 12.015625
+L 68.609375 54.6875
+L 77.59375 54.6875
+L 63.28125 0
+L 52.6875 0
+L 40.921875 44.828125
+L 29.109375 0
+L 18.5 0
+z
+" id="DejaVuSans-119"/>
+ <path d="M 37.109375 75.984375
+L 37.109375 68.5
+L 28.515625 68.5
+Q 23.6875 68.5 21.796875 66.546875
+Q 19.921875 64.59375 19.921875 59.515625
+L 19.921875 54.6875
+L 34.71875 54.6875
+L 34.71875 47.703125
+L 19.921875 47.703125
+L 19.921875 0
+L 10.890625 0
+L 10.890625 47.703125
+L 2.296875 47.703125
+L 2.296875 54.6875
+L 10.890625 54.6875
+L 10.890625 58.5
+Q 10.890625 67.625 15.140625 71.796875
+Q 19.390625 75.984375 28.609375 75.984375
+z
+" id="DejaVuSans-102"/>
+ <path d="M 11.71875 12.40625
+L 22.015625 12.40625
+L 22.015625 4
+L 14.015625 -11.625
+L 7.71875 -11.625
+L 11.71875 4
+z
+" id="DejaVuSans-44"/>
+ <path d="M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+M 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+z
+" id="DejaVuSans-98"/>
+ </defs>
+ <g transform="translate(202.05375 33.7575)scale(0.16 -0.16)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-50"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-116"/>
+ <use x="166.455078" xlink:href="#DejaVuSans-104"/>
+ <use x="229.833984" xlink:href="#DejaVuSans-45"/>
+ <use x="265.933594" xlink:href="#DejaVuSans-111"/>
+ <use x="327.115234" xlink:href="#DejaVuSans-114"/>
+ <use x="368.212891" xlink:href="#DejaVuSans-100"/>
+ <use x="431.689453" xlink:href="#DejaVuSans-101"/>
+ <use x="493.212891" xlink:href="#DejaVuSans-114"/>
+ <use x="534.326172" xlink:href="#DejaVuSans-32"/>
+ <use x="566.113281" xlink:href="#DejaVuSans-66"/>
+ <use x="634.716797" xlink:href="#DejaVuSans-117"/>
+ <use x="698.095703" xlink:href="#DejaVuSans-116"/>
+ <use x="737.304688" xlink:href="#DejaVuSans-116"/>
+ <use x="776.513672" xlink:href="#DejaVuSans-101"/>
+ <use x="838.037109" xlink:href="#DejaVuSans-114"/>
+ <use x="879.150391" xlink:href="#DejaVuSans-119"/>
+ <use x="960.9375" xlink:href="#DejaVuSans-111"/>
+ <use x="1022.119141" xlink:href="#DejaVuSans-114"/>
+ <use x="1063.232422" xlink:href="#DejaVuSans-116"/>
+ <use x="1102.441406" xlink:href="#DejaVuSans-104"/>
+ <use x="1165.820312" xlink:href="#DejaVuSans-32"/>
+ <use x="1197.607422" xlink:href="#DejaVuSans-102"/>
+ <use x="1232.8125" xlink:href="#DejaVuSans-105"/>
+ <use x="1260.595703" xlink:href="#DejaVuSans-108"/>
+ <use x="1288.378906" xlink:href="#DejaVuSans-116"/>
+ <use x="1327.587891" xlink:href="#DejaVuSans-101"/>
+ <use x="1389.111328" xlink:href="#DejaVuSans-114"/>
+ <use x="1430.224609" xlink:href="#DejaVuSans-44"/>
+ <use x="1462.011719" xlink:href="#DejaVuSans-32"/>
+ <use x="1493.798828" xlink:href="#DejaVuSans-98"/>
+ <use x="1557.275391" xlink:href="#DejaVuSans-97"/>
+ <use x="1618.554688" xlink:href="#DejaVuSans-110"/>
+ <use x="1681.933594" xlink:href="#DejaVuSans-100"/>
+ <use x="1745.410156" xlink:href="#DejaVuSans-112"/>
+ <use x="1808.886719" xlink:href="#DejaVuSans-97"/>
+ <use x="1870.166016" xlink:href="#DejaVuSans-115"/>
+ <use x="1922.265625" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="p46b4aed2e7">
+ <rect height="292.84" width="624.58" x="68.96" y="75.6"/>
+ </clipPath>
+ <clipPath id="paf46f83122">
+ <rect height="292.84" width="624.58" x="68.96" y="410.4"/>
+ </clipPath>
+ <clipPath id="p35aa359eb2">
+ <rect height="292.84" width="624.58" x="68.96" y="745.2"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/docs/docs/img/butterworth_bandpass4.svg b/docs/docs/img/butterworth_bandpass4.svg
@@ -0,0 +1,2878 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Created with matplotlib (https://matplotlib.org/) -->
+<svg height="1080pt" version="1.1" viewBox="0 0 720 1080" width="720pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+ </style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 1080
+L 720 1080
+L 720 0
+L 0 0
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="axes_1">
+ <g id="patch_2">
+ <path d="M 59.735 368.44
+L 693.54 368.44
+L 693.54 75.6
+L 59.735 75.6
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_1">
+ <g id="xtick_1">
+ <g id="line2d_1">
+ <path clip-path="url(#p59b22bd295)" d="M 59.735 368.44
+L 59.735 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_2">
+ <defs>
+ <path d="M 0 0
+L 0 3.5
+" id="m38e9cc38fe" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m38e9cc38fe" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- 0 -->
+ <defs>
+ <path d="M 31.78125 66.40625
+Q 24.171875 66.40625 20.328125 58.90625
+Q 16.5 51.421875 16.5 36.375
+Q 16.5 21.390625 20.328125 13.890625
+Q 24.171875 6.390625 31.78125 6.390625
+Q 39.453125 6.390625 43.28125 13.890625
+Q 47.125 21.390625 47.125 36.375
+Q 47.125 51.421875 43.28125 58.90625
+Q 39.453125 66.40625 31.78125 66.40625
+z
+M 31.78125 74.21875
+Q 44.046875 74.21875 50.515625 64.515625
+Q 56.984375 54.828125 56.984375 36.375
+Q 56.984375 17.96875 50.515625 8.265625
+Q 44.046875 -1.421875 31.78125 -1.421875
+Q 19.53125 -1.421875 13.0625 8.265625
+Q 6.59375 17.96875 6.59375 36.375
+Q 6.59375 54.828125 13.0625 64.515625
+Q 19.53125 74.21875 31.78125 74.21875
+z
+" id="DejaVuSans-48"/>
+ </defs>
+ <g transform="translate(56.55375 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_2">
+ <g id="line2d_3">
+ <path clip-path="url(#p59b22bd295)" d="M 183.646046 368.44
+L 183.646046 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_4">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="183.646046" xlink:href="#m38e9cc38fe" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- 200 -->
+ <defs>
+ <path d="M 19.1875 8.296875
+L 53.609375 8.296875
+L 53.609375 0
+L 7.328125 0
+L 7.328125 8.296875
+Q 12.9375 14.109375 22.625 23.890625
+Q 32.328125 33.6875 34.8125 36.53125
+Q 39.546875 41.84375 41.421875 45.53125
+Q 43.3125 49.21875 43.3125 52.78125
+Q 43.3125 58.59375 39.234375 62.25
+Q 35.15625 65.921875 28.609375 65.921875
+Q 23.96875 65.921875 18.8125 64.3125
+Q 13.671875 62.703125 7.8125 59.421875
+L 7.8125 69.390625
+Q 13.765625 71.78125 18.9375 73
+Q 24.125 74.21875 28.421875 74.21875
+Q 39.75 74.21875 46.484375 68.546875
+Q 53.21875 62.890625 53.21875 53.421875
+Q 53.21875 48.921875 51.53125 44.890625
+Q 49.859375 40.875 45.40625 35.40625
+Q 44.1875 33.984375 37.640625 27.21875
+Q 31.109375 20.453125 19.1875 8.296875
+z
+" id="DejaVuSans-50"/>
+ </defs>
+ <g transform="translate(174.102296 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_3">
+ <g id="line2d_5">
+ <path clip-path="url(#p59b22bd295)" d="M 307.557092 368.44
+L 307.557092 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_6">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="307.557092" xlink:href="#m38e9cc38fe" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- 400 -->
+ <defs>
+ <path d="M 37.796875 64.3125
+L 12.890625 25.390625
+L 37.796875 25.390625
+z
+M 35.203125 72.90625
+L 47.609375 72.90625
+L 47.609375 25.390625
+L 58.015625 25.390625
+L 58.015625 17.1875
+L 47.609375 17.1875
+L 47.609375 0
+L 37.796875 0
+L 37.796875 17.1875
+L 4.890625 17.1875
+L 4.890625 26.703125
+z
+" id="DejaVuSans-52"/>
+ </defs>
+ <g transform="translate(298.013342 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-52"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_4">
+ <g id="line2d_7">
+ <path clip-path="url(#p59b22bd295)" d="M 431.468138 368.44
+L 431.468138 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_8">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="431.468138" xlink:href="#m38e9cc38fe" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- 600 -->
+ <defs>
+ <path d="M 33.015625 40.375
+Q 26.375 40.375 22.484375 35.828125
+Q 18.609375 31.296875 18.609375 23.390625
+Q 18.609375 15.53125 22.484375 10.953125
+Q 26.375 6.390625 33.015625 6.390625
+Q 39.65625 6.390625 43.53125 10.953125
+Q 47.40625 15.53125 47.40625 23.390625
+Q 47.40625 31.296875 43.53125 35.828125
+Q 39.65625 40.375 33.015625 40.375
+z
+M 52.59375 71.296875
+L 52.59375 62.3125
+Q 48.875 64.0625 45.09375 64.984375
+Q 41.3125 65.921875 37.59375 65.921875
+Q 27.828125 65.921875 22.671875 59.328125
+Q 17.53125 52.734375 16.796875 39.40625
+Q 19.671875 43.65625 24.015625 45.921875
+Q 28.375 48.1875 33.59375 48.1875
+Q 44.578125 48.1875 50.953125 41.515625
+Q 57.328125 34.859375 57.328125 23.390625
+Q 57.328125 12.15625 50.6875 5.359375
+Q 44.046875 -1.421875 33.015625 -1.421875
+Q 20.359375 -1.421875 13.671875 8.265625
+Q 6.984375 17.96875 6.984375 36.375
+Q 6.984375 53.65625 15.1875 63.9375
+Q 23.390625 74.21875 37.203125 74.21875
+Q 40.921875 74.21875 44.703125 73.484375
+Q 48.484375 72.75 52.59375 71.296875
+z
+" id="DejaVuSans-54"/>
+ </defs>
+ <g transform="translate(421.924388 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-54"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_5">
+ <g id="line2d_9">
+ <path clip-path="url(#p59b22bd295)" d="M 555.379184 368.44
+L 555.379184 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_10">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="555.379184" xlink:href="#m38e9cc38fe" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- 800 -->
+ <defs>
+ <path d="M 31.78125 34.625
+Q 24.75 34.625 20.71875 30.859375
+Q 16.703125 27.09375 16.703125 20.515625
+Q 16.703125 13.921875 20.71875 10.15625
+Q 24.75 6.390625 31.78125 6.390625
+Q 38.8125 6.390625 42.859375 10.171875
+Q 46.921875 13.96875 46.921875 20.515625
+Q 46.921875 27.09375 42.890625 30.859375
+Q 38.875 34.625 31.78125 34.625
+z
+M 21.921875 38.8125
+Q 15.578125 40.375 12.03125 44.71875
+Q 8.5 49.078125 8.5 55.328125
+Q 8.5 64.0625 14.71875 69.140625
+Q 20.953125 74.21875 31.78125 74.21875
+Q 42.671875 74.21875 48.875 69.140625
+Q 55.078125 64.0625 55.078125 55.328125
+Q 55.078125 49.078125 51.53125 44.71875
+Q 48 40.375 41.703125 38.8125
+Q 48.828125 37.15625 52.796875 32.3125
+Q 56.78125 27.484375 56.78125 20.515625
+Q 56.78125 9.90625 50.3125 4.234375
+Q 43.84375 -1.421875 31.78125 -1.421875
+Q 19.734375 -1.421875 13.25 4.234375
+Q 6.78125 9.90625 6.78125 20.515625
+Q 6.78125 27.484375 10.78125 32.3125
+Q 14.796875 37.15625 21.921875 38.8125
+z
+M 18.3125 54.390625
+Q 18.3125 48.734375 21.84375 45.5625
+Q 25.390625 42.390625 31.78125 42.390625
+Q 38.140625 42.390625 41.71875 45.5625
+Q 45.3125 48.734375 45.3125 54.390625
+Q 45.3125 60.0625 41.71875 63.234375
+Q 38.140625 66.40625 31.78125 66.40625
+Q 25.390625 66.40625 21.84375 63.234375
+Q 18.3125 60.0625 18.3125 54.390625
+z
+" id="DejaVuSans-56"/>
+ </defs>
+ <g transform="translate(545.835434 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-56"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_6">
+ <g id="line2d_11">
+ <path clip-path="url(#p59b22bd295)" d="M 679.29023 368.44
+L 679.29023 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_12">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="679.29023" xlink:href="#m38e9cc38fe" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- 1000 -->
+ <defs>
+ <path d="M 12.40625 8.296875
+L 28.515625 8.296875
+L 28.515625 63.921875
+L 10.984375 60.40625
+L 10.984375 69.390625
+L 28.421875 72.90625
+L 38.28125 72.90625
+L 38.28125 8.296875
+L 54.390625 8.296875
+L 54.390625 0
+L 12.40625 0
+z
+" id="DejaVuSans-49"/>
+ </defs>
+ <g transform="translate(666.56523 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_7">
+ <!-- Samples -->
+ <defs>
+ <path d="M 53.515625 70.515625
+L 53.515625 60.890625
+Q 47.90625 63.578125 42.921875 64.890625
+Q 37.9375 66.21875 33.296875 66.21875
+Q 25.25 66.21875 20.875 63.09375
+Q 16.5 59.96875 16.5 54.203125
+Q 16.5 49.359375 19.40625 46.890625
+Q 22.3125 44.4375 30.421875 42.921875
+L 36.375 41.703125
+Q 47.40625 39.59375 52.65625 34.296875
+Q 57.90625 29 57.90625 20.125
+Q 57.90625 9.515625 50.796875 4.046875
+Q 43.703125 -1.421875 29.984375 -1.421875
+Q 24.8125 -1.421875 18.96875 -0.25
+Q 13.140625 0.921875 6.890625 3.21875
+L 6.890625 13.375
+Q 12.890625 10.015625 18.65625 8.296875
+Q 24.421875 6.59375 29.984375 6.59375
+Q 38.421875 6.59375 43.015625 9.90625
+Q 47.609375 13.234375 47.609375 19.390625
+Q 47.609375 24.75 44.3125 27.78125
+Q 41.015625 30.8125 33.5 32.328125
+L 27.484375 33.5
+Q 16.453125 35.6875 11.515625 40.375
+Q 6.59375 45.0625 6.59375 53.421875
+Q 6.59375 63.09375 13.40625 68.65625
+Q 20.21875 74.21875 32.171875 74.21875
+Q 37.3125 74.21875 42.625 73.28125
+Q 47.953125 72.359375 53.515625 70.515625
+z
+" id="DejaVuSans-83"/>
+ <path d="M 34.28125 27.484375
+Q 23.390625 27.484375 19.1875 25
+Q 14.984375 22.515625 14.984375 16.5
+Q 14.984375 11.71875 18.140625 8.90625
+Q 21.296875 6.109375 26.703125 6.109375
+Q 34.1875 6.109375 38.703125 11.40625
+Q 43.21875 16.703125 43.21875 25.484375
+L 43.21875 27.484375
+z
+M 52.203125 31.203125
+L 52.203125 0
+L 43.21875 0
+L 43.21875 8.296875
+Q 40.140625 3.328125 35.546875 0.953125
+Q 30.953125 -1.421875 24.3125 -1.421875
+Q 15.921875 -1.421875 10.953125 3.296875
+Q 6 8.015625 6 15.921875
+Q 6 25.140625 12.171875 29.828125
+Q 18.359375 34.515625 30.609375 34.515625
+L 43.21875 34.515625
+L 43.21875 35.40625
+Q 43.21875 41.609375 39.140625 45
+Q 35.0625 48.390625 27.6875 48.390625
+Q 23 48.390625 18.546875 47.265625
+Q 14.109375 46.140625 10.015625 43.890625
+L 10.015625 52.203125
+Q 14.9375 54.109375 19.578125 55.046875
+Q 24.21875 56 28.609375 56
+Q 40.484375 56 46.34375 49.84375
+Q 52.203125 43.703125 52.203125 31.203125
+z
+" id="DejaVuSans-97"/>
+ <path d="M 52 44.1875
+Q 55.375 50.25 60.0625 53.125
+Q 64.75 56 71.09375 56
+Q 79.640625 56 84.28125 50.015625
+Q 88.921875 44.046875 88.921875 33.015625
+L 88.921875 0
+L 79.890625 0
+L 79.890625 32.71875
+Q 79.890625 40.578125 77.09375 44.375
+Q 74.3125 48.1875 68.609375 48.1875
+Q 61.625 48.1875 57.5625 43.546875
+Q 53.515625 38.921875 53.515625 30.90625
+L 53.515625 0
+L 44.484375 0
+L 44.484375 32.71875
+Q 44.484375 40.625 41.703125 44.40625
+Q 38.921875 48.1875 33.109375 48.1875
+Q 26.21875 48.1875 22.15625 43.53125
+Q 18.109375 38.875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.1875 51.21875 25.484375 53.609375
+Q 29.78125 56 35.6875 56
+Q 41.65625 56 45.828125 52.96875
+Q 50 49.953125 52 44.1875
+z
+" id="DejaVuSans-109"/>
+ <path d="M 18.109375 8.203125
+L 18.109375 -20.796875
+L 9.078125 -20.796875
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+z
+M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+" id="DejaVuSans-112"/>
+ <path d="M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 0
+L 9.421875 0
+z
+" id="DejaVuSans-108"/>
+ <path d="M 56.203125 29.59375
+L 56.203125 25.203125
+L 14.890625 25.203125
+Q 15.484375 15.921875 20.484375 11.0625
+Q 25.484375 6.203125 34.421875 6.203125
+Q 39.59375 6.203125 44.453125 7.46875
+Q 49.3125 8.734375 54.109375 11.28125
+L 54.109375 2.78125
+Q 49.265625 0.734375 44.1875 -0.34375
+Q 39.109375 -1.421875 33.890625 -1.421875
+Q 20.796875 -1.421875 13.15625 6.1875
+Q 5.515625 13.8125 5.515625 26.8125
+Q 5.515625 40.234375 12.765625 48.109375
+Q 20.015625 56 32.328125 56
+Q 43.359375 56 49.78125 48.890625
+Q 56.203125 41.796875 56.203125 29.59375
+z
+M 47.21875 32.234375
+Q 47.125 39.59375 43.09375 43.984375
+Q 39.0625 48.390625 32.421875 48.390625
+Q 24.90625 48.390625 20.390625 44.140625
+Q 15.875 39.890625 15.1875 32.171875
+z
+" id="DejaVuSans-101"/>
+ <path d="M 44.28125 53.078125
+L 44.28125 44.578125
+Q 40.484375 46.53125 36.375 47.5
+Q 32.28125 48.484375 27.875 48.484375
+Q 21.1875 48.484375 17.84375 46.4375
+Q 14.5 44.390625 14.5 40.28125
+Q 14.5 37.15625 16.890625 35.375
+Q 19.28125 33.59375 26.515625 31.984375
+L 29.59375 31.296875
+Q 39.15625 29.25 43.1875 25.515625
+Q 47.21875 21.78125 47.21875 15.09375
+Q 47.21875 7.46875 41.1875 3.015625
+Q 35.15625 -1.421875 24.609375 -1.421875
+Q 20.21875 -1.421875 15.453125 -0.5625
+Q 10.6875 0.296875 5.421875 2
+L 5.421875 11.28125
+Q 10.40625 8.6875 15.234375 7.390625
+Q 20.0625 6.109375 24.8125 6.109375
+Q 31.15625 6.109375 34.5625 8.28125
+Q 37.984375 10.453125 37.984375 14.40625
+Q 37.984375 18.0625 35.515625 20.015625
+Q 33.0625 21.96875 24.703125 23.78125
+L 21.578125 24.515625
+Q 13.234375 26.265625 9.515625 29.90625
+Q 5.8125 33.546875 5.8125 39.890625
+Q 5.8125 47.609375 11.28125 51.796875
+Q 16.75 56 26.8125 56
+Q 31.78125 56 36.171875 55.265625
+Q 40.578125 54.546875 44.28125 53.078125
+z
+" id="DejaVuSans-115"/>
+ </defs>
+ <g transform="translate(355.284375 396.716563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-83"/>
+ <use x="63.476562" xlink:href="#DejaVuSans-97"/>
+ <use x="124.755859" xlink:href="#DejaVuSans-109"/>
+ <use x="222.167969" xlink:href="#DejaVuSans-112"/>
+ <use x="285.644531" xlink:href="#DejaVuSans-108"/>
+ <use x="313.427734" xlink:href="#DejaVuSans-101"/>
+ <use x="374.951172" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_2">
+ <g id="ytick_1">
+ <g id="line2d_13">
+ <path clip-path="url(#p59b22bd295)" d="M 59.735 326.309238
+L 693.54 326.309238
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_14">
+ <defs>
+ <path d="M 0 0
+L -3.5 0
+" id="m1d73fd18c8" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="326.309238"/>
+ </g>
+ </g>
+ <g id="text_8">
+ <!-- −0.2 -->
+ <defs>
+ <path d="M 10.59375 35.5
+L 73.1875 35.5
+L 73.1875 27.203125
+L 10.59375 27.203125
+z
+" id="DejaVuSans-8722"/>
+ <path d="M 10.6875 12.40625
+L 21 12.40625
+L 21 0
+L 10.6875 0
+z
+" id="DejaVuSans-46"/>
+ </defs>
+ <g transform="translate(28.452187 330.108457)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-48"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-46"/>
+ <use x="179.199219" xlink:href="#DejaVuSans-50"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_2">
+ <g id="line2d_15">
+ <path clip-path="url(#p59b22bd295)" d="M 59.735 270.492379
+L 693.54 270.492379
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_16">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="270.492379"/>
+ </g>
+ </g>
+ <g id="text_9">
+ <!-- 0.0 -->
+ <g transform="translate(36.831875 274.291598)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_3">
+ <g id="line2d_17">
+ <path clip-path="url(#p59b22bd295)" d="M 59.735 214.67552
+L 693.54 214.67552
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_18">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="214.67552"/>
+ </g>
+ </g>
+ <g id="text_10">
+ <!-- 0.2 -->
+ <g transform="translate(36.831875 218.474739)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-50"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_4">
+ <g id="line2d_19">
+ <path clip-path="url(#p59b22bd295)" d="M 59.735 158.858661
+L 693.54 158.858661
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_20">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="158.858661"/>
+ </g>
+ </g>
+ <g id="text_11">
+ <!-- 0.4 -->
+ <g transform="translate(36.831875 162.657879)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-52"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_5">
+ <g id="line2d_21">
+ <path clip-path="url(#p59b22bd295)" d="M 59.735 103.041802
+L 693.54 103.041802
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_22">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="103.041802"/>
+ </g>
+ </g>
+ <g id="text_12">
+ <!-- 0.6 -->
+ <g transform="translate(36.831875 106.84102)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-54"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_13">
+ <!-- Amplitude -->
+ <defs>
+ <path d="M 34.1875 63.1875
+L 20.796875 26.90625
+L 47.609375 26.90625
+z
+M 28.609375 72.90625
+L 39.796875 72.90625
+L 67.578125 0
+L 57.328125 0
+L 50.6875 18.703125
+L 17.828125 18.703125
+L 11.1875 0
+L 0.78125 0
+z
+" id="DejaVuSans-65"/>
+ <path d="M 9.421875 54.6875
+L 18.40625 54.6875
+L 18.40625 0
+L 9.421875 0
+z
+M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 64.59375
+L 9.421875 64.59375
+z
+" id="DejaVuSans-105"/>
+ <path d="M 18.3125 70.21875
+L 18.3125 54.6875
+L 36.8125 54.6875
+L 36.8125 47.703125
+L 18.3125 47.703125
+L 18.3125 18.015625
+Q 18.3125 11.328125 20.140625 9.421875
+Q 21.96875 7.515625 27.59375 7.515625
+L 36.8125 7.515625
+L 36.8125 0
+L 27.59375 0
+Q 17.1875 0 13.234375 3.875
+Q 9.28125 7.765625 9.28125 18.015625
+L 9.28125 47.703125
+L 2.6875 47.703125
+L 2.6875 54.6875
+L 9.28125 54.6875
+L 9.28125 70.21875
+z
+" id="DejaVuSans-116"/>
+ <path d="M 8.5 21.578125
+L 8.5 54.6875
+L 17.484375 54.6875
+L 17.484375 21.921875
+Q 17.484375 14.15625 20.5 10.265625
+Q 23.53125 6.390625 29.59375 6.390625
+Q 36.859375 6.390625 41.078125 11.03125
+Q 45.3125 15.671875 45.3125 23.6875
+L 45.3125 54.6875
+L 54.296875 54.6875
+L 54.296875 0
+L 45.3125 0
+L 45.3125 8.40625
+Q 42.046875 3.421875 37.71875 1
+Q 33.40625 -1.421875 27.6875 -1.421875
+Q 18.265625 -1.421875 13.375 4.4375
+Q 8.5 10.296875 8.5 21.578125
+z
+M 31.109375 56
+z
+" id="DejaVuSans-117"/>
+ <path d="M 45.40625 46.390625
+L 45.40625 75.984375
+L 54.390625 75.984375
+L 54.390625 0
+L 45.40625 0
+L 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+z
+M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+" id="DejaVuSans-100"/>
+ </defs>
+ <g transform="translate(22.3725 247.642656)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-65"/>
+ <use x="68.408203" xlink:href="#DejaVuSans-109"/>
+ <use x="165.820312" xlink:href="#DejaVuSans-112"/>
+ <use x="229.296875" xlink:href="#DejaVuSans-108"/>
+ <use x="257.080078" xlink:href="#DejaVuSans-105"/>
+ <use x="284.863281" xlink:href="#DejaVuSans-116"/>
+ <use x="324.072266" xlink:href="#DejaVuSans-117"/>
+ <use x="387.451172" xlink:href="#DejaVuSans-100"/>
+ <use x="450.927734" xlink:href="#DejaVuSans-101"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_23">
+ <path clip-path="url(#p59b22bd295)" d="M 59.735 89.544762
+L 60.354555 129.554539
+L 60.97411 368.44
+L 61.593666 242.077612
+L 62.213221 287.536482
+L 62.832776 294.989077
+L 63.452331 255.571617
+L 64.071887 309.170795
+L 64.691442 252.894323
+L 65.310997 302.618801
+L 65.930552 263.549182
+L 66.550108 288.947981
+L 67.169663 276.439821
+L 67.789218 276.693885
+L 68.408773 285.497558
+L 69.028328 269.670242
+L 69.647884 288.857962
+L 70.267439 268.157334
+L 70.886994 287.431511
+L 71.506549 270.442172
+L 72.126105 283.374692
+L 72.74566 274.232608
+L 73.365215 278.868976
+L 73.98477 277.635091
+L 74.604326 275.408788
+L 75.223881 279.603282
+L 75.843436 273.593849
+L 76.462991 279.94177
+L 77.082546 273.283695
+L 77.702102 279.042253
+L 78.321657 273.923306
+L 78.941212 277.538498
+L 79.560767 274.872735
+L 80.180323 276.018012
+L 80.799878 275.637488
+L 81.419433 274.857591
+L 82.038988 275.96657
+L 82.658543 274.186197
+L 83.278099 275.838358
+L 83.897654 273.938217
+L 84.517209 275.381201
+L 85.136764 273.946483
+L 85.75632 274.777847
+L 86.375875 274.031438
+L 86.99543 274.189164
+L 87.614985 274.060552
+L 88.234541 273.713262
+L 88.854096 273.970975
+L 89.473651 273.379201
+L 90.093206 273.762375
+L 90.712761 273.164155
+L 91.332317 273.473371
+L 91.951872 273.019958
+L 92.571427 273.154969
+L 93.190982 272.897358
+L 94.430093 272.761447
+L 95.049648 272.584153
+L 95.669203 272.596872
+L 96.288759 272.362652
+L 96.908314 272.4051
+L 97.527869 272.178068
+L 98.147424 272.197578
+L 98.766979 272.016522
+L 100.00609 271.864488
+L 112.397195 270.445975
+L 122.310078 269.71822
+L 131.603407 269.305166
+L 141.51629 269.096058
+L 153.28784 269.083208
+L 168.157165 269.31065
+L 193.55893 269.969436
+L 222.678025 270.652364
+L 244.362458 270.932088
+L 267.286002 271.000893
+L 297.024653 270.850725
+L 376.947278 270.347238
+L 424.033475 270.367802
+L 552.281408 270.529093
+L 693.54 270.483427
+L 693.54 270.483427
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_3">
+ <path d="M 59.735 368.44
+L 59.735 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_4">
+ <path d="M 693.54 368.44
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_5">
+ <path d="M 59.735 368.44
+L 693.54 368.44
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_6">
+ <path d="M 59.735 75.6
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_2">
+ <g id="patch_7">
+ <path d="M 59.735 703.24
+L 693.54 703.24
+L 693.54 410.4
+L 59.735 410.4
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_3">
+ <g id="xtick_7">
+ <g id="line2d_24">
+ <path clip-path="url(#paa3f082897)" d="M 59.735 703.24
+L 59.735 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_25">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_14">
+ <!-- 10Hz -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 19.671875 72.90625
+L 19.671875 43.015625
+L 55.515625 43.015625
+L 55.515625 72.90625
+L 65.375 72.90625
+L 65.375 0
+L 55.515625 0
+L 55.515625 34.71875
+L 19.671875 34.71875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-72"/>
+ <path d="M 5.515625 54.6875
+L 48.1875 54.6875
+L 48.1875 46.484375
+L 14.40625 7.171875
+L 48.1875 7.171875
+L 48.1875 0
+L 4.296875 0
+L 4.296875 8.203125
+L 38.09375 47.515625
+L 5.515625 47.515625
+z
+" id="DejaVuSans-122"/>
+ </defs>
+ <g transform="translate(46.988125 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_8">
+ <g id="line2d_26">
+ <path clip-path="url(#paa3f082897)" d="M 59.735 703.24
+L 59.735 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_27">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_9">
+ <g id="line2d_28">
+ <path clip-path="url(#paa3f082897)" d="M 116.179495 703.24
+L 116.179495 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_29">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="116.179495" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_10">
+ <g id="line2d_30">
+ <path clip-path="url(#paa3f082897)" d="M 149.197408 703.24
+L 149.197408 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_31">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="149.197408" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_11">
+ <g id="line2d_32">
+ <path clip-path="url(#paa3f082897)" d="M 172.62399 703.24
+L 172.62399 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_33">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="172.62399" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_12">
+ <g id="line2d_34">
+ <path clip-path="url(#paa3f082897)" d="M 190.795059 703.24
+L 190.795059 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_35">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="190.795059" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_13">
+ <g id="line2d_36">
+ <path clip-path="url(#paa3f082897)" d="M 205.641903 703.24
+L 205.641903 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_37">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="205.641903" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_14">
+ <g id="line2d_38">
+ <path clip-path="url(#paa3f082897)" d="M 218.194731 703.24
+L 218.194731 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_39">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="218.194731" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_15">
+ <g id="line2d_40">
+ <path clip-path="url(#paa3f082897)" d="M 229.068485 703.24
+L 229.068485 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_41">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="229.068485" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_16">
+ <g id="line2d_42">
+ <path clip-path="url(#paa3f082897)" d="M 238.659816 703.24
+L 238.659816 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_43">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="238.659816" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_17">
+ <g id="line2d_44">
+ <path clip-path="url(#paa3f082897)" d="M 247.239554 703.24
+L 247.239554 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_45">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.239554" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_15">
+ <!-- 100Hz -->
+ <g transform="translate(231.311429 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_18">
+ <g id="line2d_46">
+ <path clip-path="url(#paa3f082897)" d="M 247.239554 703.24
+L 247.239554 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_47">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.239554" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_19">
+ <g id="line2d_48">
+ <path clip-path="url(#paa3f082897)" d="M 303.684049 703.24
+L 303.684049 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_49">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="303.684049" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_20">
+ <g id="line2d_50">
+ <path clip-path="url(#paa3f082897)" d="M 336.701962 703.24
+L 336.701962 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_51">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="336.701962" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_21">
+ <g id="line2d_52">
+ <path clip-path="url(#paa3f082897)" d="M 360.128544 703.24
+L 360.128544 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_53">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="360.128544" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_22">
+ <g id="line2d_54">
+ <path clip-path="url(#paa3f082897)" d="M 378.299612 703.24
+L 378.299612 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_55">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="378.299612" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_23">
+ <g id="line2d_56">
+ <path clip-path="url(#paa3f082897)" d="M 393.146456 703.24
+L 393.146456 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_57">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="393.146456" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_24">
+ <g id="line2d_58">
+ <path clip-path="url(#paa3f082897)" d="M 405.699284 703.24
+L 405.699284 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_59">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="405.699284" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_25">
+ <g id="line2d_60">
+ <path clip-path="url(#paa3f082897)" d="M 416.573038 703.24
+L 416.573038 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_61">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="416.573038" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_26">
+ <g id="line2d_62">
+ <path clip-path="url(#paa3f082897)" d="M 426.164369 703.24
+L 426.164369 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_63">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="426.164369" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_27">
+ <g id="line2d_64">
+ <path clip-path="url(#paa3f082897)" d="M 434.744107 703.24
+L 434.744107 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_65">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="434.744107" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_16">
+ <!-- 1kHz -->
+ <defs>
+ <path d="M 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 31.109375
+L 44.921875 54.6875
+L 56.390625 54.6875
+L 27.390625 29.109375
+L 57.625 0
+L 45.90625 0
+L 18.109375 26.703125
+L 18.109375 0
+L 9.078125 0
+z
+" id="DejaVuSans-107"/>
+ </defs>
+ <g transform="translate(422.28317 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_28">
+ <g id="line2d_66">
+ <path clip-path="url(#paa3f082897)" d="M 434.744107 703.24
+L 434.744107 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_67">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="434.744107" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_29">
+ <g id="line2d_68">
+ <path clip-path="url(#paa3f082897)" d="M 491.188602 703.24
+L 491.188602 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_69">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="491.188602" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_30">
+ <g id="line2d_70">
+ <path clip-path="url(#paa3f082897)" d="M 524.206515 703.24
+L 524.206515 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_71">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.206515" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_31">
+ <g id="line2d_72">
+ <path clip-path="url(#paa3f082897)" d="M 547.633097 703.24
+L 547.633097 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_73">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.633097" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_32">
+ <g id="line2d_74">
+ <path clip-path="url(#paa3f082897)" d="M 565.804166 703.24
+L 565.804166 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_75">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="565.804166" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_33">
+ <g id="line2d_76">
+ <path clip-path="url(#paa3f082897)" d="M 580.65101 703.24
+L 580.65101 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_77">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="580.65101" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_34">
+ <g id="line2d_78">
+ <path clip-path="url(#paa3f082897)" d="M 593.203838 703.24
+L 593.203838 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_79">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.203838" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_35">
+ <g id="line2d_80">
+ <path clip-path="url(#paa3f082897)" d="M 604.077592 703.24
+L 604.077592 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_81">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.077592" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_36">
+ <g id="line2d_82">
+ <path clip-path="url(#paa3f082897)" d="M 613.668923 703.24
+L 613.668923 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_83">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="613.668923" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_37">
+ <g id="line2d_84">
+ <path clip-path="url(#paa3f082897)" d="M 622.248661 703.24
+L 622.248661 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_85">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.248661" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_17">
+ <!-- 10kHz -->
+ <g transform="translate(606.606473 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_38">
+ <g id="line2d_86">
+ <path clip-path="url(#paa3f082897)" d="M 622.248661 703.24
+L 622.248661 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_87">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.248661" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_39">
+ <g id="line2d_88">
+ <path clip-path="url(#paa3f082897)" d="M 678.693156 703.24
+L 678.693156 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_89">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.693156" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_40">
+ <g id="line2d_90">
+ <path clip-path="url(#paa3f082897)" d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_91">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#m38e9cc38fe" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_18">
+ <!-- 24kHz -->
+ <g transform="translate(677.897813 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_19">
+ <!-- Frequency (Hz) -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 51.703125 72.90625
+L 51.703125 64.59375
+L 19.671875 64.59375
+L 19.671875 43.109375
+L 48.578125 43.109375
+L 48.578125 34.8125
+L 19.671875 34.8125
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-70"/>
+ <path d="M 41.109375 46.296875
+Q 39.59375 47.171875 37.8125 47.578125
+Q 36.03125 48 33.890625 48
+Q 26.265625 48 22.1875 43.046875
+Q 18.109375 38.09375 18.109375 28.8125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 20.953125 51.171875 25.484375 53.578125
+Q 30.03125 56 36.53125 56
+Q 37.453125 56 38.578125 55.875
+Q 39.703125 55.765625 41.0625 55.515625
+z
+" id="DejaVuSans-114"/>
+ <path d="M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+M 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+L 45.40625 54.6875
+L 54.390625 54.6875
+L 54.390625 -20.796875
+L 45.40625 -20.796875
+z
+" id="DejaVuSans-113"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-110"/>
+ <path d="M 48.78125 52.59375
+L 48.78125 44.1875
+Q 44.96875 46.296875 41.140625 47.34375
+Q 37.3125 48.390625 33.40625 48.390625
+Q 24.65625 48.390625 19.8125 42.84375
+Q 14.984375 37.3125 14.984375 27.296875
+Q 14.984375 17.28125 19.8125 11.734375
+Q 24.65625 6.203125 33.40625 6.203125
+Q 37.3125 6.203125 41.140625 7.25
+Q 44.96875 8.296875 48.78125 10.40625
+L 48.78125 2.09375
+Q 45.015625 0.34375 40.984375 -0.53125
+Q 36.96875 -1.421875 32.421875 -1.421875
+Q 20.0625 -1.421875 12.78125 6.34375
+Q 5.515625 14.109375 5.515625 27.296875
+Q 5.515625 40.671875 12.859375 48.328125
+Q 20.21875 56 33.015625 56
+Q 37.15625 56 41.109375 55.140625
+Q 45.0625 54.296875 48.78125 52.59375
+z
+" id="DejaVuSans-99"/>
+ <path d="M 32.171875 -5.078125
+Q 28.375 -14.84375 24.75 -17.8125
+Q 21.140625 -20.796875 15.09375 -20.796875
+L 7.90625 -20.796875
+L 7.90625 -13.28125
+L 13.1875 -13.28125
+Q 16.890625 -13.28125 18.9375 -11.515625
+Q 21 -9.765625 23.484375 -3.21875
+L 25.09375 0.875
+L 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 11.921875
+L 46.6875 54.6875
+L 56.203125 54.6875
+z
+" id="DejaVuSans-121"/>
+ <path id="DejaVuSans-32"/>
+ <path d="M 31 75.875
+Q 24.46875 64.65625 21.28125 53.65625
+Q 18.109375 42.671875 18.109375 31.390625
+Q 18.109375 20.125 21.3125 9.0625
+Q 24.515625 -2 31 -13.1875
+L 23.1875 -13.1875
+Q 15.875 -1.703125 12.234375 9.375
+Q 8.59375 20.453125 8.59375 31.390625
+Q 8.59375 42.28125 12.203125 53.3125
+Q 15.828125 64.359375 23.1875 75.875
+z
+" id="DejaVuSans-40"/>
+ <path d="M 8.015625 75.875
+L 15.828125 75.875
+Q 23.140625 64.359375 26.78125 53.3125
+Q 30.421875 42.28125 30.421875 31.390625
+Q 30.421875 20.453125 26.78125 9.375
+Q 23.140625 -1.703125 15.828125 -13.1875
+L 8.015625 -13.1875
+Q 14.5 -2 17.703125 9.0625
+Q 20.90625 20.125 20.90625 31.390625
+Q 20.90625 42.671875 17.703125 53.65625
+Q 14.5 64.65625 8.015625 75.875
+z
+" id="DejaVuSans-41"/>
+ </defs>
+ <g transform="translate(338.464844 731.516563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_4">
+ <g id="ytick_6">
+ <g id="line2d_92">
+ <path clip-path="url(#paa3f082897)" d="M 59.735 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_93">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_20">
+ <!-- −160 -->
+ <g transform="translate(25.267812 707.039219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-54"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_7">
+ <g id="line2d_94">
+ <path clip-path="url(#paa3f082897)" d="M 59.735 668.788235
+L 693.54 668.788235
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_95">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="668.788235"/>
+ </g>
+ </g>
+ <g id="text_21">
+ <!-- −140 -->
+ <g transform="translate(25.267812 672.587454)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-52"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_8">
+ <g id="line2d_96">
+ <path clip-path="url(#paa3f082897)" d="M 59.735 634.336471
+L 693.54 634.336471
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_97">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="634.336471"/>
+ </g>
+ </g>
+ <g id="text_22">
+ <!-- −120 -->
+ <g transform="translate(25.267812 638.135689)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-50"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_9">
+ <g id="line2d_98">
+ <path clip-path="url(#paa3f082897)" d="M 59.735 599.884706
+L 693.54 599.884706
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_99">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="599.884706"/>
+ </g>
+ </g>
+ <g id="text_23">
+ <!-- −100 -->
+ <g transform="translate(25.267812 603.683925)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_10">
+ <g id="line2d_100">
+ <path clip-path="url(#paa3f082897)" d="M 59.735 565.432941
+L 693.54 565.432941
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_101">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="565.432941"/>
+ </g>
+ </g>
+ <g id="text_24">
+ <!-- −80 -->
+ <g transform="translate(31.630312 569.23216)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-56"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_11">
+ <g id="line2d_102">
+ <path clip-path="url(#paa3f082897)" d="M 59.735 530.981176
+L 693.54 530.981176
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_103">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="530.981176"/>
+ </g>
+ </g>
+ <g id="text_25">
+ <!-- −60 -->
+ <g transform="translate(31.630312 534.780395)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-54"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_12">
+ <g id="line2d_104">
+ <path clip-path="url(#paa3f082897)" d="M 59.735 496.529412
+L 693.54 496.529412
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_105">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="496.529412"/>
+ </g>
+ </g>
+ <g id="text_26">
+ <!-- −40 -->
+ <g transform="translate(31.630312 500.328631)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-52"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_13">
+ <g id="line2d_106">
+ <path clip-path="url(#paa3f082897)" d="M 59.735 462.077647
+L 693.54 462.077647
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_107">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="462.077647"/>
+ </g>
+ </g>
+ <g id="text_27">
+ <!-- −20 -->
+ <g transform="translate(31.630312 465.876866)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_14">
+ <g id="line2d_108">
+ <path clip-path="url(#paa3f082897)" d="M 59.735 427.625882
+L 693.54 427.625882
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_109">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="427.625882"/>
+ </g>
+ </g>
+ <g id="text_28">
+ <!-- 0 -->
+ <g transform="translate(46.3725 431.425101)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_29">
+ <!-- Gain (dB) -->
+ <defs>
+ <path d="M 59.515625 10.40625
+L 59.515625 29.984375
+L 43.40625 29.984375
+L 43.40625 38.09375
+L 69.28125 38.09375
+L 69.28125 6.78125
+Q 63.578125 2.734375 56.6875 0.65625
+Q 49.8125 -1.421875 42 -1.421875
+Q 24.90625 -1.421875 15.25 8.5625
+Q 5.609375 18.5625 5.609375 36.375
+Q 5.609375 54.25 15.25 64.234375
+Q 24.90625 74.21875 42 74.21875
+Q 49.125 74.21875 55.546875 72.453125
+Q 61.96875 70.703125 67.390625 67.28125
+L 67.390625 56.78125
+Q 61.921875 61.421875 55.765625 63.765625
+Q 49.609375 66.109375 42.828125 66.109375
+Q 29.4375 66.109375 22.71875 58.640625
+Q 16.015625 51.171875 16.015625 36.375
+Q 16.015625 21.625 22.71875 14.15625
+Q 29.4375 6.6875 42.828125 6.6875
+Q 48.046875 6.6875 52.140625 7.59375
+Q 56.25 8.5 59.515625 10.40625
+z
+" id="DejaVuSans-71"/>
+ <path d="M 19.671875 34.8125
+L 19.671875 8.109375
+L 35.5 8.109375
+Q 43.453125 8.109375 47.28125 11.40625
+Q 51.125 14.703125 51.125 21.484375
+Q 51.125 28.328125 47.28125 31.5625
+Q 43.453125 34.8125 35.5 34.8125
+z
+M 19.671875 64.796875
+L 19.671875 42.828125
+L 34.28125 42.828125
+Q 41.5 42.828125 45.03125 45.53125
+Q 48.578125 48.25 48.578125 53.8125
+Q 48.578125 59.328125 45.03125 62.0625
+Q 41.5 64.796875 34.28125 64.796875
+z
+M 9.8125 72.90625
+L 35.015625 72.90625
+Q 46.296875 72.90625 52.390625 68.21875
+Q 58.5 63.53125 58.5 54.890625
+Q 58.5 48.1875 55.375 44.234375
+Q 52.25 40.28125 46.1875 39.3125
+Q 53.46875 37.75 57.5 32.78125
+Q 61.53125 27.828125 61.53125 20.40625
+Q 61.53125 10.640625 54.890625 5.3125
+Q 48.25 0 35.984375 0
+L 9.8125 0
+z
+" id="DejaVuSans-66"/>
+ </defs>
+ <g transform="translate(19.188125 580.411406)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-71"/>
+ <use x="77.490234" xlink:href="#DejaVuSans-97"/>
+ <use x="138.769531" xlink:href="#DejaVuSans-105"/>
+ <use x="166.552734" xlink:href="#DejaVuSans-110"/>
+ <use x="229.931641" xlink:href="#DejaVuSans-32"/>
+ <use x="261.71875" xlink:href="#DejaVuSans-40"/>
+ <use x="300.732422" xlink:href="#DejaVuSans-100"/>
+ <use x="364.208984" xlink:href="#DejaVuSans-66"/>
+ <use x="432.8125" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_110">
+ <path clip-path="url(#paa3f082897)" d="M -1 558.708461
+L 16.20606 558.708186
+L 72.650555 558.587456
+L 105.668468 545.909307
+L 129.09505 525.008965
+L 147.266119 510.778253
+L 162.112963 499.965434
+L 203.710614 470.840614
+L 218.557458 459.924086
+L 231.110286 450.717202
+L 236.728527 446.787047
+L 241.98404 443.308128
+L 246.920836 440.270376
+L 251.575371 437.657164
+L 255.978184 435.44725
+L 260.155109 433.615684
+L 264.128199 432.13382
+L 267.916426 430.968743
+L 271.53623 430.082542
+L 275.001953 429.43201
+L 278.326178 428.969549
+L 284.593284 428.415261
+L 293.173022 427.977121
+L 300.934339 427.762793
+L 324.360921 427.654008
+L 457.250994 427.623814
+L 512.785622 427.626712
+L 549.091153 427.626694
+L 574.285235 427.625241
+L 603.338656 427.625855
+L 623.495539 427.625811
+L 641.506688 427.625791
+L 663.402956 427.626086
+L 679.86952 427.829401
+L 681.406901 428.125887
+L 682.370335 428.544722
+L 683.074201 429.087365
+L 683.704763 429.861459
+L 684.285945 430.939612
+L 684.885122 432.563763
+L 685.501868 434.933447
+L 686.17929 438.495236
+L 686.937409 443.735038
+L 687.816607 451.444545
+L 688.791854 462.10904
+L 689.693056 474.373774
+L 690.563775 489.457732
+L 691.364047 507.899679
+L 692.075605 531.636785
+L 692.539838 554.392011
+L 692.740855 570.280416
+L 692.780999 569.358594
+L 692.801064 569.102911
+L 692.821124 570.131762
+L 693.061455 610.002182
+L 693.081451 596.09977
+L 693.121427 588.334293
+L 693.181355 592.924838
+L 693.221283 595.148028
+L 693.281137 592.202233
+L 693.301079 592.249792
+L 693.360875 593.056485
+L 693.440535 592.884195
+L 693.520117 592.898888
+L 693.520117 592.898888
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_8">
+ <path d="M 59.735 703.24
+L 59.735 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_9">
+ <path d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_10">
+ <path d="M 59.735 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_11">
+ <path d="M 59.735 410.4
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_3">
+ <g id="patch_12">
+ <path d="M 59.735 1038.04
+L 693.54 1038.04
+L 693.54 745.2
+L 59.735 745.2
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_5">
+ <g id="xtick_41">
+ <g id="line2d_111">
+ <path clip-path="url(#p83b815841d)" d="M 59.735 1038.04
+L 59.735 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_112">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_30">
+ <!-- 10Hz -->
+ <g transform="translate(46.988125 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_42">
+ <g id="line2d_113">
+ <path clip-path="url(#p83b815841d)" d="M 59.735 1038.04
+L 59.735 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_114">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_43">
+ <g id="line2d_115">
+ <path clip-path="url(#p83b815841d)" d="M 116.179495 1038.04
+L 116.179495 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_116">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="116.179495" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_44">
+ <g id="line2d_117">
+ <path clip-path="url(#p83b815841d)" d="M 149.197408 1038.04
+L 149.197408 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_118">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="149.197408" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_45">
+ <g id="line2d_119">
+ <path clip-path="url(#p83b815841d)" d="M 172.62399 1038.04
+L 172.62399 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_120">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="172.62399" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_46">
+ <g id="line2d_121">
+ <path clip-path="url(#p83b815841d)" d="M 190.795059 1038.04
+L 190.795059 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_122">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="190.795059" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_47">
+ <g id="line2d_123">
+ <path clip-path="url(#p83b815841d)" d="M 205.641903 1038.04
+L 205.641903 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_124">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="205.641903" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_48">
+ <g id="line2d_125">
+ <path clip-path="url(#p83b815841d)" d="M 218.194731 1038.04
+L 218.194731 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_126">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="218.194731" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_49">
+ <g id="line2d_127">
+ <path clip-path="url(#p83b815841d)" d="M 229.068485 1038.04
+L 229.068485 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_128">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="229.068485" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_50">
+ <g id="line2d_129">
+ <path clip-path="url(#p83b815841d)" d="M 238.659816 1038.04
+L 238.659816 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_130">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="238.659816" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_51">
+ <g id="line2d_131">
+ <path clip-path="url(#p83b815841d)" d="M 247.239554 1038.04
+L 247.239554 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_132">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.239554" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_31">
+ <!-- 100Hz -->
+ <g transform="translate(231.311429 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_52">
+ <g id="line2d_133">
+ <path clip-path="url(#p83b815841d)" d="M 247.239554 1038.04
+L 247.239554 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_134">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.239554" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_53">
+ <g id="line2d_135">
+ <path clip-path="url(#p83b815841d)" d="M 303.684049 1038.04
+L 303.684049 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_136">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="303.684049" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_54">
+ <g id="line2d_137">
+ <path clip-path="url(#p83b815841d)" d="M 336.701962 1038.04
+L 336.701962 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_138">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="336.701962" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_55">
+ <g id="line2d_139">
+ <path clip-path="url(#p83b815841d)" d="M 360.128544 1038.04
+L 360.128544 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_140">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="360.128544" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_56">
+ <g id="line2d_141">
+ <path clip-path="url(#p83b815841d)" d="M 378.299612 1038.04
+L 378.299612 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_142">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="378.299612" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_57">
+ <g id="line2d_143">
+ <path clip-path="url(#p83b815841d)" d="M 393.146456 1038.04
+L 393.146456 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_144">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="393.146456" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_58">
+ <g id="line2d_145">
+ <path clip-path="url(#p83b815841d)" d="M 405.699284 1038.04
+L 405.699284 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_146">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="405.699284" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_59">
+ <g id="line2d_147">
+ <path clip-path="url(#p83b815841d)" d="M 416.573038 1038.04
+L 416.573038 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_148">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="416.573038" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_60">
+ <g id="line2d_149">
+ <path clip-path="url(#p83b815841d)" d="M 426.164369 1038.04
+L 426.164369 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_150">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="426.164369" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_61">
+ <g id="line2d_151">
+ <path clip-path="url(#p83b815841d)" d="M 434.744107 1038.04
+L 434.744107 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_152">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="434.744107" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_32">
+ <!-- 1kHz -->
+ <g transform="translate(422.28317 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_62">
+ <g id="line2d_153">
+ <path clip-path="url(#p83b815841d)" d="M 434.744107 1038.04
+L 434.744107 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_154">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="434.744107" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_63">
+ <g id="line2d_155">
+ <path clip-path="url(#p83b815841d)" d="M 491.188602 1038.04
+L 491.188602 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_156">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="491.188602" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_64">
+ <g id="line2d_157">
+ <path clip-path="url(#p83b815841d)" d="M 524.206515 1038.04
+L 524.206515 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_158">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.206515" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_65">
+ <g id="line2d_159">
+ <path clip-path="url(#p83b815841d)" d="M 547.633097 1038.04
+L 547.633097 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_160">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.633097" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_66">
+ <g id="line2d_161">
+ <path clip-path="url(#p83b815841d)" d="M 565.804166 1038.04
+L 565.804166 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_162">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="565.804166" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_67">
+ <g id="line2d_163">
+ <path clip-path="url(#p83b815841d)" d="M 580.65101 1038.04
+L 580.65101 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_164">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="580.65101" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_68">
+ <g id="line2d_165">
+ <path clip-path="url(#p83b815841d)" d="M 593.203838 1038.04
+L 593.203838 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_166">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.203838" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_69">
+ <g id="line2d_167">
+ <path clip-path="url(#p83b815841d)" d="M 604.077592 1038.04
+L 604.077592 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_168">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.077592" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_70">
+ <g id="line2d_169">
+ <path clip-path="url(#p83b815841d)" d="M 613.668923 1038.04
+L 613.668923 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_170">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="613.668923" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_71">
+ <g id="line2d_171">
+ <path clip-path="url(#p83b815841d)" d="M 622.248661 1038.04
+L 622.248661 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_172">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.248661" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_33">
+ <!-- 10kHz -->
+ <g transform="translate(606.606473 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_72">
+ <g id="line2d_173">
+ <path clip-path="url(#p83b815841d)" d="M 622.248661 1038.04
+L 622.248661 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_174">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.248661" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_73">
+ <g id="line2d_175">
+ <path clip-path="url(#p83b815841d)" d="M 678.693156 1038.04
+L 678.693156 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_176">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.693156" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_74">
+ <g id="line2d_177">
+ <path clip-path="url(#p83b815841d)" d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_178">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#m38e9cc38fe" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_34">
+ <!-- 24kHz -->
+ <g transform="translate(677.897813 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_35">
+ <!-- Frequency (Hz) -->
+ <g transform="translate(338.464844 1066.316563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_6">
+ <g id="ytick_15">
+ <g id="line2d_179">
+ <path clip-path="url(#p83b815841d)" d="M 59.735 1007.214737
+L 693.54 1007.214737
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_180">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="1007.214737"/>
+ </g>
+ </g>
+ <g id="text_36">
+ <!-- −150 -->
+ <defs>
+ <path d="M 10.796875 72.90625
+L 49.515625 72.90625
+L 49.515625 64.59375
+L 19.828125 64.59375
+L 19.828125 46.734375
+Q 21.96875 47.46875 24.109375 47.828125
+Q 26.265625 48.1875 28.421875 48.1875
+Q 40.625 48.1875 47.75 41.5
+Q 54.890625 34.8125 54.890625 23.390625
+Q 54.890625 11.625 47.5625 5.09375
+Q 40.234375 -1.421875 26.90625 -1.421875
+Q 22.3125 -1.421875 17.546875 -0.640625
+Q 12.796875 0.140625 7.71875 1.703125
+L 7.71875 11.625
+Q 12.109375 9.234375 16.796875 8.0625
+Q 21.484375 6.890625 26.703125 6.890625
+Q 35.15625 6.890625 40.078125 11.328125
+Q 45.015625 15.765625 45.015625 23.390625
+Q 45.015625 31 40.078125 35.4375
+Q 35.15625 39.890625 26.703125 39.890625
+Q 22.75 39.890625 18.8125 39.015625
+Q 14.890625 38.140625 10.796875 36.28125
+z
+" id="DejaVuSans-53"/>
+ </defs>
+ <g transform="translate(25.267812 1011.013956)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_16">
+ <g id="line2d_181">
+ <path clip-path="url(#p83b815841d)" d="M 59.735 968.683158
+L 693.54 968.683158
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_182">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="968.683158"/>
+ </g>
+ </g>
+ <g id="text_37">
+ <!-- −100 -->
+ <g transform="translate(25.267812 972.482377)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_17">
+ <g id="line2d_183">
+ <path clip-path="url(#p83b815841d)" d="M 59.735 930.151579
+L 693.54 930.151579
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_184">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="930.151579"/>
+ </g>
+ </g>
+ <g id="text_38">
+ <!-- −50 -->
+ <g transform="translate(31.630312 933.950798)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-53"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_18">
+ <g id="line2d_185">
+ <path clip-path="url(#p83b815841d)" d="M 59.735 891.62
+L 693.54 891.62
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_186">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="891.62"/>
+ </g>
+ </g>
+ <g id="text_39">
+ <!-- 0 -->
+ <g transform="translate(46.3725 895.419219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_19">
+ <g id="line2d_187">
+ <path clip-path="url(#p83b815841d)" d="M 59.735 853.088421
+L 693.54 853.088421
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_188">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="853.088421"/>
+ </g>
+ </g>
+ <g id="text_40">
+ <!-- 50 -->
+ <g transform="translate(40.01 856.88764)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-53"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_20">
+ <g id="line2d_189">
+ <path clip-path="url(#p83b815841d)" d="M 59.735 814.556842
+L 693.54 814.556842
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_190">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="814.556842"/>
+ </g>
+ </g>
+ <g id="text_41">
+ <!-- 100 -->
+ <g transform="translate(33.6475 818.356061)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_21">
+ <g id="line2d_191">
+ <path clip-path="url(#p83b815841d)" d="M 59.735 776.025263
+L 693.54 776.025263
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_192">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m1d73fd18c8" y="776.025263"/>
+ </g>
+ </g>
+ <g id="text_42">
+ <!-- 150 -->
+ <g transform="translate(33.6475 779.824482)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-53"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_43">
+ <!-- Phase (${\circ}$) -->
+ <defs>
+ <path d="M 19.671875 64.796875
+L 19.671875 37.40625
+L 32.078125 37.40625
+Q 38.96875 37.40625 42.71875 40.96875
+Q 46.484375 44.53125 46.484375 51.125
+Q 46.484375 57.671875 42.71875 61.234375
+Q 38.96875 64.796875 32.078125 64.796875
+z
+M 9.8125 72.90625
+L 32.078125 72.90625
+Q 44.34375 72.90625 50.609375 67.359375
+Q 56.890625 61.8125 56.890625 51.125
+Q 56.890625 40.328125 50.609375 34.8125
+Q 44.34375 29.296875 32.078125 29.296875
+L 19.671875 29.296875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-80"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-104"/>
+ <path d="M 31.296875 40.671875
+Q 27.390625 40.671875 24.703125 37.953125
+Q 22.015625 35.25 22.015625 31.34375
+Q 22.015625 27.484375 24.703125 24.828125
+Q 27.390625 22.171875 31.296875 22.171875
+Q 35.203125 22.171875 37.890625 24.828125
+Q 40.578125 27.484375 40.578125 31.34375
+Q 40.578125 35.203125 37.859375 37.9375
+Q 35.15625 40.671875 31.296875 40.671875
+z
+M 31.296875 46.96875
+Q 34.421875 46.96875 37.296875 45.765625
+Q 40.1875 44.578125 42.28125 42.328125
+Q 44.53125 40.140625 45.65625 37.34375
+Q 46.78125 34.5625 46.78125 31.34375
+Q 46.78125 24.90625 42.265625 20.4375
+Q 37.75 15.96875 31.203125 15.96875
+Q 24.609375 15.96875 20.21875 20.359375
+Q 15.828125 24.75 15.828125 31.34375
+Q 15.828125 37.890625 20.3125 42.421875
+Q 24.8125 46.96875 31.296875 46.96875
+z
+" id="DejaVuSans-8728"/>
+ </defs>
+ <g transform="translate(19.188125 915.17)rotate(-90)scale(0.1 -0.1)">
+ <use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-80"/>
+ <use transform="translate(60.302734 0.015625)" xlink:href="#DejaVuSans-104"/>
+ <use transform="translate(123.681641 0.015625)" xlink:href="#DejaVuSans-97"/>
+ <use transform="translate(184.960938 0.015625)" xlink:href="#DejaVuSans-115"/>
+ <use transform="translate(237.060547 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(298.583984 0.015625)" xlink:href="#DejaVuSans-32"/>
+ <use transform="translate(330.371094 0.015625)" xlink:href="#DejaVuSans-40"/>
+ <use transform="translate(369.384766 0.015625)" xlink:href="#DejaVuSans-8728"/>
+ <use transform="translate(431.982422 0.015625)" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_193">
+ <path clip-path="url(#p83b815841d)" d="M -1 760.229581
+L 16.20606 760.230252
+L 72.650555 791.3266
+L 105.668468 873.657781
+L 129.09505 901.400165
+L 147.266119 914.906026
+L 162.112963 924.662417
+L 174.665791 932.498758
+L 195.130876 945.038982
+L 203.710614 950.736301
+L 211.471931 956.61696
+L 218.557458 962.943596
+L 225.075511 969.819519
+L 231.110286 977.224506
+L 236.728527 985.066432
+L 241.98404 993.222125
+L 246.920836 1001.56113
+L 251.575371 1009.956473
+L 255.978184 1018.288112
+L 260.155109 1026.443314
+L 264.128199 756.889218
+L 271.53623 771.413367
+L 275.001953 777.911611
+L 278.326178 783.837169
+L 281.520006 789.183531
+L 284.593284 793.982579
+L 287.554781 798.299611
+L 293.173022 805.817949
+L 298.428535 812.268123
+L 303.365331 817.815565
+L 308.019866 822.495177
+L 312.422679 826.522329
+L 318.610378 831.859452
+L 322.488834 834.954072
+L 326.190935 837.646839
+L 334.770673 843.477747
+L 339.515638 846.364064
+L 348.248876 851.270713
+L 353.590607 853.915502
+L 359.809826 856.892083
+L 369.931662 861.152434
+L 381.725563 865.475686
+L 386.176518 866.956751
+L 398.976485 870.797084
+L 413.823329 874.600644
+L 427.947245 877.649822
+L 450.461046 881.652708
+L 467.76202 884.198303
+L 477.070108 885.424605
+L 506.708607 888.865012
+L 515.130454 889.753812
+L 521.29213 890.397114
+L 528.08867 891.095886
+L 535.891334 891.903331
+L 545.497973 892.907236
+L 555.401643 893.976642
+L 563.153102 894.84943
+L 571.039796 895.785952
+L 576.40709 896.45743
+L 590.524602 898.402034
+L 602.855736 900.399825
+L 614.144672 902.60198
+L 622.550291 904.575556
+L 629.210833 906.42402
+L 636.936302 909.006076
+L 642.554543 911.293695
+L 645.726917 912.789554
+L 649.432197 914.776396
+L 651.955602 916.309691
+L 655.171089 918.532811
+L 658.08025 920.862115
+L 660.621431 923.216342
+L 662.79622 925.523994
+L 664.631389 927.733537
+L 666.37062 930.098529
+L 668.236399 932.993871
+L 669.954215 936.071279
+L 671.558454 939.394408
+L 673.055032 942.985835
+L 674.424098 946.802143
+L 675.770528 951.185693
+L 677.119383 956.39611
+L 678.350484 962.102274
+L 679.492409 968.483397
+L 680.57193 975.821712
+L 681.591293 984.339802
+L 682.552561 994.271503
+L 683.502614 1006.435001
+L 684.530587 1022.657893
+L 684.907229 1029.36188
+L 684.92933 752.338032
+L 685.039747 754.374988
+L 689.19129 829.373711
+L 691.077674 857.179138
+L 691.486471 862.747898
+L 691.893226 868.993527
+L 691.954065 868.942966
+L 692.378666 877.097504
+L 692.418988 875.147733
+L 692.439142 874.134076
+L 692.479435 875.765047
+L 692.539838 880.821105
+L 692.580081 876.860834
+L 692.620304 874.528484
+L 692.640409 876.923729
+L 692.700691 886.465366
+L 692.740855 877.859829
+L 692.780999 872.082681
+L 692.821124 883.870807
+L 692.861228 897.73288
+L 692.901313 875.356829
+L 692.921348 859.623135
+L 692.981423 887.376454
+L 693.041454 952.284655
+L 693.061455 769.451947
+L 693.141408 890.446426
+L 693.201321 990.25149
+L 693.221283 753.947599
+L 693.301079 891.671066
+L 693.360875 995.390498
+L 693.380797 753.061995
+L 693.460438 891.68671
+L 693.520117 995.672036
+L 693.520117 995.672036
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_13">
+ <path d="M 59.735 1038.04
+L 59.735 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_14">
+ <path d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_15">
+ <path d="M 59.735 1038.04
+L 693.54 1038.04
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_16">
+ <path d="M 59.735 745.2
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="text_44">
+ <!-- 4th-order Butterworth filter, bandpass -->
+ <defs>
+ <path d="M 4.890625 31.390625
+L 31.203125 31.390625
+L 31.203125 23.390625
+L 4.890625 23.390625
+z
+" id="DejaVuSans-45"/>
+ <path d="M 30.609375 48.390625
+Q 23.390625 48.390625 19.1875 42.75
+Q 14.984375 37.109375 14.984375 27.296875
+Q 14.984375 17.484375 19.15625 11.84375
+Q 23.34375 6.203125 30.609375 6.203125
+Q 37.796875 6.203125 41.984375 11.859375
+Q 46.1875 17.53125 46.1875 27.296875
+Q 46.1875 37.015625 41.984375 42.703125
+Q 37.796875 48.390625 30.609375 48.390625
+z
+M 30.609375 56
+Q 42.328125 56 49.015625 48.375
+Q 55.71875 40.765625 55.71875 27.296875
+Q 55.71875 13.875 49.015625 6.21875
+Q 42.328125 -1.421875 30.609375 -1.421875
+Q 18.84375 -1.421875 12.171875 6.21875
+Q 5.515625 13.875 5.515625 27.296875
+Q 5.515625 40.765625 12.171875 48.375
+Q 18.84375 56 30.609375 56
+z
+" id="DejaVuSans-111"/>
+ <path d="M 4.203125 54.6875
+L 13.1875 54.6875
+L 24.421875 12.015625
+L 35.59375 54.6875
+L 46.1875 54.6875
+L 57.421875 12.015625
+L 68.609375 54.6875
+L 77.59375 54.6875
+L 63.28125 0
+L 52.6875 0
+L 40.921875 44.828125
+L 29.109375 0
+L 18.5 0
+z
+" id="DejaVuSans-119"/>
+ <path d="M 37.109375 75.984375
+L 37.109375 68.5
+L 28.515625 68.5
+Q 23.6875 68.5 21.796875 66.546875
+Q 19.921875 64.59375 19.921875 59.515625
+L 19.921875 54.6875
+L 34.71875 54.6875
+L 34.71875 47.703125
+L 19.921875 47.703125
+L 19.921875 0
+L 10.890625 0
+L 10.890625 47.703125
+L 2.296875 47.703125
+L 2.296875 54.6875
+L 10.890625 54.6875
+L 10.890625 58.5
+Q 10.890625 67.625 15.140625 71.796875
+Q 19.390625 75.984375 28.609375 75.984375
+z
+" id="DejaVuSans-102"/>
+ <path d="M 11.71875 12.40625
+L 22.015625 12.40625
+L 22.015625 4
+L 14.015625 -11.625
+L 7.71875 -11.625
+L 11.71875 4
+z
+" id="DejaVuSans-44"/>
+ <path d="M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+M 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+z
+" id="DejaVuSans-98"/>
+ </defs>
+ <g transform="translate(207.14375 33.7575)scale(0.16 -0.16)">
+ <use xlink:href="#DejaVuSans-52"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-116"/>
+ <use x="102.832031" xlink:href="#DejaVuSans-104"/>
+ <use x="166.210938" xlink:href="#DejaVuSans-45"/>
+ <use x="202.310547" xlink:href="#DejaVuSans-111"/>
+ <use x="263.492188" xlink:href="#DejaVuSans-114"/>
+ <use x="304.589844" xlink:href="#DejaVuSans-100"/>
+ <use x="368.066406" xlink:href="#DejaVuSans-101"/>
+ <use x="429.589844" xlink:href="#DejaVuSans-114"/>
+ <use x="470.703125" xlink:href="#DejaVuSans-32"/>
+ <use x="502.490234" xlink:href="#DejaVuSans-66"/>
+ <use x="571.09375" xlink:href="#DejaVuSans-117"/>
+ <use x="634.472656" xlink:href="#DejaVuSans-116"/>
+ <use x="673.681641" xlink:href="#DejaVuSans-116"/>
+ <use x="712.890625" xlink:href="#DejaVuSans-101"/>
+ <use x="774.414062" xlink:href="#DejaVuSans-114"/>
+ <use x="815.527344" xlink:href="#DejaVuSans-119"/>
+ <use x="897.314453" xlink:href="#DejaVuSans-111"/>
+ <use x="958.496094" xlink:href="#DejaVuSans-114"/>
+ <use x="999.609375" xlink:href="#DejaVuSans-116"/>
+ <use x="1038.818359" xlink:href="#DejaVuSans-104"/>
+ <use x="1102.197266" xlink:href="#DejaVuSans-32"/>
+ <use x="1133.984375" xlink:href="#DejaVuSans-102"/>
+ <use x="1169.189453" xlink:href="#DejaVuSans-105"/>
+ <use x="1196.972656" xlink:href="#DejaVuSans-108"/>
+ <use x="1224.755859" xlink:href="#DejaVuSans-116"/>
+ <use x="1263.964844" xlink:href="#DejaVuSans-101"/>
+ <use x="1325.488281" xlink:href="#DejaVuSans-114"/>
+ <use x="1366.601562" xlink:href="#DejaVuSans-44"/>
+ <use x="1398.388672" xlink:href="#DejaVuSans-32"/>
+ <use x="1430.175781" xlink:href="#DejaVuSans-98"/>
+ <use x="1493.652344" xlink:href="#DejaVuSans-97"/>
+ <use x="1554.931641" xlink:href="#DejaVuSans-110"/>
+ <use x="1618.310547" xlink:href="#DejaVuSans-100"/>
+ <use x="1681.787109" xlink:href="#DejaVuSans-112"/>
+ <use x="1745.263672" xlink:href="#DejaVuSans-97"/>
+ <use x="1806.542969" xlink:href="#DejaVuSans-115"/>
+ <use x="1858.642578" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="p59b22bd295">
+ <rect height="292.84" width="633.805" x="59.735" y="75.6"/>
+ </clipPath>
+ <clipPath id="paa3f082897">
+ <rect height="292.84" width="633.805" x="59.735" y="410.4"/>
+ </clipPath>
+ <clipPath id="p83b815841d">
+ <rect height="292.84" width="633.805" x="59.735" y="745.2"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/docs/docs/img/butterworth_bandstop12.svg b/docs/docs/img/butterworth_bandstop12.svg
@@ -0,0 +1,3068 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Created with matplotlib (https://matplotlib.org/) -->
+<svg height="1080pt" version="1.1" viewBox="0 0 720 1080" width="720pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+ </style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 1080
+L 720 1080
+L 720 0
+L 0 0
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="axes_1">
+ <g id="patch_2">
+ <path d="M 59.735 368.44
+L 693.54 368.44
+L 693.54 75.6
+L 59.735 75.6
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_1">
+ <g id="xtick_1">
+ <g id="line2d_1">
+ <path clip-path="url(#pe1ad9ad180)" d="M 59.735 368.44
+L 59.735 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_2">
+ <defs>
+ <path d="M 0 0
+L 0 3.5
+" id="m816ae47b83" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m816ae47b83" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- 0 -->
+ <defs>
+ <path d="M 31.78125 66.40625
+Q 24.171875 66.40625 20.328125 58.90625
+Q 16.5 51.421875 16.5 36.375
+Q 16.5 21.390625 20.328125 13.890625
+Q 24.171875 6.390625 31.78125 6.390625
+Q 39.453125 6.390625 43.28125 13.890625
+Q 47.125 21.390625 47.125 36.375
+Q 47.125 51.421875 43.28125 58.90625
+Q 39.453125 66.40625 31.78125 66.40625
+z
+M 31.78125 74.21875
+Q 44.046875 74.21875 50.515625 64.515625
+Q 56.984375 54.828125 56.984375 36.375
+Q 56.984375 17.96875 50.515625 8.265625
+Q 44.046875 -1.421875 31.78125 -1.421875
+Q 19.53125 -1.421875 13.0625 8.265625
+Q 6.59375 17.96875 6.59375 36.375
+Q 6.59375 54.828125 13.0625 64.515625
+Q 19.53125 74.21875 31.78125 74.21875
+z
+" id="DejaVuSans-48"/>
+ </defs>
+ <g transform="translate(56.55375 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_2">
+ <g id="line2d_3">
+ <path clip-path="url(#pe1ad9ad180)" d="M 183.646046 368.44
+L 183.646046 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_4">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="183.646046" xlink:href="#m816ae47b83" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- 200 -->
+ <defs>
+ <path d="M 19.1875 8.296875
+L 53.609375 8.296875
+L 53.609375 0
+L 7.328125 0
+L 7.328125 8.296875
+Q 12.9375 14.109375 22.625 23.890625
+Q 32.328125 33.6875 34.8125 36.53125
+Q 39.546875 41.84375 41.421875 45.53125
+Q 43.3125 49.21875 43.3125 52.78125
+Q 43.3125 58.59375 39.234375 62.25
+Q 35.15625 65.921875 28.609375 65.921875
+Q 23.96875 65.921875 18.8125 64.3125
+Q 13.671875 62.703125 7.8125 59.421875
+L 7.8125 69.390625
+Q 13.765625 71.78125 18.9375 73
+Q 24.125 74.21875 28.421875 74.21875
+Q 39.75 74.21875 46.484375 68.546875
+Q 53.21875 62.890625 53.21875 53.421875
+Q 53.21875 48.921875 51.53125 44.890625
+Q 49.859375 40.875 45.40625 35.40625
+Q 44.1875 33.984375 37.640625 27.21875
+Q 31.109375 20.453125 19.1875 8.296875
+z
+" id="DejaVuSans-50"/>
+ </defs>
+ <g transform="translate(174.102296 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_3">
+ <g id="line2d_5">
+ <path clip-path="url(#pe1ad9ad180)" d="M 307.557092 368.44
+L 307.557092 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_6">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="307.557092" xlink:href="#m816ae47b83" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- 400 -->
+ <defs>
+ <path d="M 37.796875 64.3125
+L 12.890625 25.390625
+L 37.796875 25.390625
+z
+M 35.203125 72.90625
+L 47.609375 72.90625
+L 47.609375 25.390625
+L 58.015625 25.390625
+L 58.015625 17.1875
+L 47.609375 17.1875
+L 47.609375 0
+L 37.796875 0
+L 37.796875 17.1875
+L 4.890625 17.1875
+L 4.890625 26.703125
+z
+" id="DejaVuSans-52"/>
+ </defs>
+ <g transform="translate(298.013342 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-52"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_4">
+ <g id="line2d_7">
+ <path clip-path="url(#pe1ad9ad180)" d="M 431.468138 368.44
+L 431.468138 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_8">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="431.468138" xlink:href="#m816ae47b83" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- 600 -->
+ <defs>
+ <path d="M 33.015625 40.375
+Q 26.375 40.375 22.484375 35.828125
+Q 18.609375 31.296875 18.609375 23.390625
+Q 18.609375 15.53125 22.484375 10.953125
+Q 26.375 6.390625 33.015625 6.390625
+Q 39.65625 6.390625 43.53125 10.953125
+Q 47.40625 15.53125 47.40625 23.390625
+Q 47.40625 31.296875 43.53125 35.828125
+Q 39.65625 40.375 33.015625 40.375
+z
+M 52.59375 71.296875
+L 52.59375 62.3125
+Q 48.875 64.0625 45.09375 64.984375
+Q 41.3125 65.921875 37.59375 65.921875
+Q 27.828125 65.921875 22.671875 59.328125
+Q 17.53125 52.734375 16.796875 39.40625
+Q 19.671875 43.65625 24.015625 45.921875
+Q 28.375 48.1875 33.59375 48.1875
+Q 44.578125 48.1875 50.953125 41.515625
+Q 57.328125 34.859375 57.328125 23.390625
+Q 57.328125 12.15625 50.6875 5.359375
+Q 44.046875 -1.421875 33.015625 -1.421875
+Q 20.359375 -1.421875 13.671875 8.265625
+Q 6.984375 17.96875 6.984375 36.375
+Q 6.984375 53.65625 15.1875 63.9375
+Q 23.390625 74.21875 37.203125 74.21875
+Q 40.921875 74.21875 44.703125 73.484375
+Q 48.484375 72.75 52.59375 71.296875
+z
+" id="DejaVuSans-54"/>
+ </defs>
+ <g transform="translate(421.924388 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-54"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_5">
+ <g id="line2d_9">
+ <path clip-path="url(#pe1ad9ad180)" d="M 555.379184 368.44
+L 555.379184 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_10">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="555.379184" xlink:href="#m816ae47b83" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- 800 -->
+ <defs>
+ <path d="M 31.78125 34.625
+Q 24.75 34.625 20.71875 30.859375
+Q 16.703125 27.09375 16.703125 20.515625
+Q 16.703125 13.921875 20.71875 10.15625
+Q 24.75 6.390625 31.78125 6.390625
+Q 38.8125 6.390625 42.859375 10.171875
+Q 46.921875 13.96875 46.921875 20.515625
+Q 46.921875 27.09375 42.890625 30.859375
+Q 38.875 34.625 31.78125 34.625
+z
+M 21.921875 38.8125
+Q 15.578125 40.375 12.03125 44.71875
+Q 8.5 49.078125 8.5 55.328125
+Q 8.5 64.0625 14.71875 69.140625
+Q 20.953125 74.21875 31.78125 74.21875
+Q 42.671875 74.21875 48.875 69.140625
+Q 55.078125 64.0625 55.078125 55.328125
+Q 55.078125 49.078125 51.53125 44.71875
+Q 48 40.375 41.703125 38.8125
+Q 48.828125 37.15625 52.796875 32.3125
+Q 56.78125 27.484375 56.78125 20.515625
+Q 56.78125 9.90625 50.3125 4.234375
+Q 43.84375 -1.421875 31.78125 -1.421875
+Q 19.734375 -1.421875 13.25 4.234375
+Q 6.78125 9.90625 6.78125 20.515625
+Q 6.78125 27.484375 10.78125 32.3125
+Q 14.796875 37.15625 21.921875 38.8125
+z
+M 18.3125 54.390625
+Q 18.3125 48.734375 21.84375 45.5625
+Q 25.390625 42.390625 31.78125 42.390625
+Q 38.140625 42.390625 41.71875 45.5625
+Q 45.3125 48.734375 45.3125 54.390625
+Q 45.3125 60.0625 41.71875 63.234375
+Q 38.140625 66.40625 31.78125 66.40625
+Q 25.390625 66.40625 21.84375 63.234375
+Q 18.3125 60.0625 18.3125 54.390625
+z
+" id="DejaVuSans-56"/>
+ </defs>
+ <g transform="translate(545.835434 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-56"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_6">
+ <g id="line2d_11">
+ <path clip-path="url(#pe1ad9ad180)" d="M 679.29023 368.44
+L 679.29023 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_12">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="679.29023" xlink:href="#m816ae47b83" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- 1000 -->
+ <defs>
+ <path d="M 12.40625 8.296875
+L 28.515625 8.296875
+L 28.515625 63.921875
+L 10.984375 60.40625
+L 10.984375 69.390625
+L 28.421875 72.90625
+L 38.28125 72.90625
+L 38.28125 8.296875
+L 54.390625 8.296875
+L 54.390625 0
+L 12.40625 0
+z
+" id="DejaVuSans-49"/>
+ </defs>
+ <g transform="translate(666.56523 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_7">
+ <!-- Samples -->
+ <defs>
+ <path d="M 53.515625 70.515625
+L 53.515625 60.890625
+Q 47.90625 63.578125 42.921875 64.890625
+Q 37.9375 66.21875 33.296875 66.21875
+Q 25.25 66.21875 20.875 63.09375
+Q 16.5 59.96875 16.5 54.203125
+Q 16.5 49.359375 19.40625 46.890625
+Q 22.3125 44.4375 30.421875 42.921875
+L 36.375 41.703125
+Q 47.40625 39.59375 52.65625 34.296875
+Q 57.90625 29 57.90625 20.125
+Q 57.90625 9.515625 50.796875 4.046875
+Q 43.703125 -1.421875 29.984375 -1.421875
+Q 24.8125 -1.421875 18.96875 -0.25
+Q 13.140625 0.921875 6.890625 3.21875
+L 6.890625 13.375
+Q 12.890625 10.015625 18.65625 8.296875
+Q 24.421875 6.59375 29.984375 6.59375
+Q 38.421875 6.59375 43.015625 9.90625
+Q 47.609375 13.234375 47.609375 19.390625
+Q 47.609375 24.75 44.3125 27.78125
+Q 41.015625 30.8125 33.5 32.328125
+L 27.484375 33.5
+Q 16.453125 35.6875 11.515625 40.375
+Q 6.59375 45.0625 6.59375 53.421875
+Q 6.59375 63.09375 13.40625 68.65625
+Q 20.21875 74.21875 32.171875 74.21875
+Q 37.3125 74.21875 42.625 73.28125
+Q 47.953125 72.359375 53.515625 70.515625
+z
+" id="DejaVuSans-83"/>
+ <path d="M 34.28125 27.484375
+Q 23.390625 27.484375 19.1875 25
+Q 14.984375 22.515625 14.984375 16.5
+Q 14.984375 11.71875 18.140625 8.90625
+Q 21.296875 6.109375 26.703125 6.109375
+Q 34.1875 6.109375 38.703125 11.40625
+Q 43.21875 16.703125 43.21875 25.484375
+L 43.21875 27.484375
+z
+M 52.203125 31.203125
+L 52.203125 0
+L 43.21875 0
+L 43.21875 8.296875
+Q 40.140625 3.328125 35.546875 0.953125
+Q 30.953125 -1.421875 24.3125 -1.421875
+Q 15.921875 -1.421875 10.953125 3.296875
+Q 6 8.015625 6 15.921875
+Q 6 25.140625 12.171875 29.828125
+Q 18.359375 34.515625 30.609375 34.515625
+L 43.21875 34.515625
+L 43.21875 35.40625
+Q 43.21875 41.609375 39.140625 45
+Q 35.0625 48.390625 27.6875 48.390625
+Q 23 48.390625 18.546875 47.265625
+Q 14.109375 46.140625 10.015625 43.890625
+L 10.015625 52.203125
+Q 14.9375 54.109375 19.578125 55.046875
+Q 24.21875 56 28.609375 56
+Q 40.484375 56 46.34375 49.84375
+Q 52.203125 43.703125 52.203125 31.203125
+z
+" id="DejaVuSans-97"/>
+ <path d="M 52 44.1875
+Q 55.375 50.25 60.0625 53.125
+Q 64.75 56 71.09375 56
+Q 79.640625 56 84.28125 50.015625
+Q 88.921875 44.046875 88.921875 33.015625
+L 88.921875 0
+L 79.890625 0
+L 79.890625 32.71875
+Q 79.890625 40.578125 77.09375 44.375
+Q 74.3125 48.1875 68.609375 48.1875
+Q 61.625 48.1875 57.5625 43.546875
+Q 53.515625 38.921875 53.515625 30.90625
+L 53.515625 0
+L 44.484375 0
+L 44.484375 32.71875
+Q 44.484375 40.625 41.703125 44.40625
+Q 38.921875 48.1875 33.109375 48.1875
+Q 26.21875 48.1875 22.15625 43.53125
+Q 18.109375 38.875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.1875 51.21875 25.484375 53.609375
+Q 29.78125 56 35.6875 56
+Q 41.65625 56 45.828125 52.96875
+Q 50 49.953125 52 44.1875
+z
+" id="DejaVuSans-109"/>
+ <path d="M 18.109375 8.203125
+L 18.109375 -20.796875
+L 9.078125 -20.796875
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+z
+M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+" id="DejaVuSans-112"/>
+ <path d="M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 0
+L 9.421875 0
+z
+" id="DejaVuSans-108"/>
+ <path d="M 56.203125 29.59375
+L 56.203125 25.203125
+L 14.890625 25.203125
+Q 15.484375 15.921875 20.484375 11.0625
+Q 25.484375 6.203125 34.421875 6.203125
+Q 39.59375 6.203125 44.453125 7.46875
+Q 49.3125 8.734375 54.109375 11.28125
+L 54.109375 2.78125
+Q 49.265625 0.734375 44.1875 -0.34375
+Q 39.109375 -1.421875 33.890625 -1.421875
+Q 20.796875 -1.421875 13.15625 6.1875
+Q 5.515625 13.8125 5.515625 26.8125
+Q 5.515625 40.234375 12.765625 48.109375
+Q 20.015625 56 32.328125 56
+Q 43.359375 56 49.78125 48.890625
+Q 56.203125 41.796875 56.203125 29.59375
+z
+M 47.21875 32.234375
+Q 47.125 39.59375 43.09375 43.984375
+Q 39.0625 48.390625 32.421875 48.390625
+Q 24.90625 48.390625 20.390625 44.140625
+Q 15.875 39.890625 15.1875 32.171875
+z
+" id="DejaVuSans-101"/>
+ <path d="M 44.28125 53.078125
+L 44.28125 44.578125
+Q 40.484375 46.53125 36.375 47.5
+Q 32.28125 48.484375 27.875 48.484375
+Q 21.1875 48.484375 17.84375 46.4375
+Q 14.5 44.390625 14.5 40.28125
+Q 14.5 37.15625 16.890625 35.375
+Q 19.28125 33.59375 26.515625 31.984375
+L 29.59375 31.296875
+Q 39.15625 29.25 43.1875 25.515625
+Q 47.21875 21.78125 47.21875 15.09375
+Q 47.21875 7.46875 41.1875 3.015625
+Q 35.15625 -1.421875 24.609375 -1.421875
+Q 20.21875 -1.421875 15.453125 -0.5625
+Q 10.6875 0.296875 5.421875 2
+L 5.421875 11.28125
+Q 10.40625 8.6875 15.234375 7.390625
+Q 20.0625 6.109375 24.8125 6.109375
+Q 31.15625 6.109375 34.5625 8.28125
+Q 37.984375 10.453125 37.984375 14.40625
+Q 37.984375 18.0625 35.515625 20.015625
+Q 33.0625 21.96875 24.703125 23.78125
+L 21.578125 24.515625
+Q 13.234375 26.265625 9.515625 29.90625
+Q 5.8125 33.546875 5.8125 39.890625
+Q 5.8125 47.609375 11.28125 51.796875
+Q 16.75 56 26.8125 56
+Q 31.78125 56 36.171875 55.265625
+Q 40.578125 54.546875 44.28125 53.078125
+z
+" id="DejaVuSans-115"/>
+ </defs>
+ <g transform="translate(355.284375 396.716563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-83"/>
+ <use x="63.476562" xlink:href="#DejaVuSans-97"/>
+ <use x="124.755859" xlink:href="#DejaVuSans-109"/>
+ <use x="222.167969" xlink:href="#DejaVuSans-112"/>
+ <use x="285.644531" xlink:href="#DejaVuSans-108"/>
+ <use x="313.427734" xlink:href="#DejaVuSans-101"/>
+ <use x="374.951172" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_2">
+ <g id="ytick_1">
+ <g id="line2d_13">
+ <path clip-path="url(#pe1ad9ad180)" d="M 59.735 354.530339
+L 693.54 354.530339
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_14">
+ <defs>
+ <path d="M 0 0
+L -3.5 0
+" id="me9cbca6570" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="354.530339"/>
+ </g>
+ </g>
+ <g id="text_8">
+ <!-- −0.6 -->
+ <defs>
+ <path d="M 10.59375 35.5
+L 73.1875 35.5
+L 73.1875 27.203125
+L 10.59375 27.203125
+z
+" id="DejaVuSans-8722"/>
+ <path d="M 10.6875 12.40625
+L 21 12.40625
+L 21 0
+L 10.6875 0
+z
+" id="DejaVuSans-46"/>
+ </defs>
+ <g transform="translate(28.452187 358.329558)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-48"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-46"/>
+ <use x="179.199219" xlink:href="#DejaVuSans-54"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_2">
+ <g id="line2d_15">
+ <path clip-path="url(#pe1ad9ad180)" d="M 59.735 295.769669
+L 693.54 295.769669
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_16">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="295.769669"/>
+ </g>
+ </g>
+ <g id="text_9">
+ <!-- −0.4 -->
+ <g transform="translate(28.452187 299.568887)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-48"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-46"/>
+ <use x="179.199219" xlink:href="#DejaVuSans-52"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_3">
+ <g id="line2d_17">
+ <path clip-path="url(#pe1ad9ad180)" d="M 59.735 237.008998
+L 693.54 237.008998
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_18">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="237.008998"/>
+ </g>
+ </g>
+ <g id="text_10">
+ <!-- −0.2 -->
+ <g transform="translate(28.452187 240.808217)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-48"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-46"/>
+ <use x="179.199219" xlink:href="#DejaVuSans-50"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_4">
+ <g id="line2d_19">
+ <path clip-path="url(#pe1ad9ad180)" d="M 59.735 178.248328
+L 693.54 178.248328
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_20">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="178.248328"/>
+ </g>
+ </g>
+ <g id="text_11">
+ <!-- 0.0 -->
+ <g transform="translate(36.831875 182.047546)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_5">
+ <g id="line2d_21">
+ <path clip-path="url(#pe1ad9ad180)" d="M 59.735 119.487657
+L 693.54 119.487657
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_22">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="119.487657"/>
+ </g>
+ </g>
+ <g id="text_12">
+ <!-- 0.2 -->
+ <g transform="translate(36.831875 123.286876)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-50"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_13">
+ <!-- Amplitude -->
+ <defs>
+ <path d="M 34.1875 63.1875
+L 20.796875 26.90625
+L 47.609375 26.90625
+z
+M 28.609375 72.90625
+L 39.796875 72.90625
+L 67.578125 0
+L 57.328125 0
+L 50.6875 18.703125
+L 17.828125 18.703125
+L 11.1875 0
+L 0.78125 0
+z
+" id="DejaVuSans-65"/>
+ <path d="M 9.421875 54.6875
+L 18.40625 54.6875
+L 18.40625 0
+L 9.421875 0
+z
+M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 64.59375
+L 9.421875 64.59375
+z
+" id="DejaVuSans-105"/>
+ <path d="M 18.3125 70.21875
+L 18.3125 54.6875
+L 36.8125 54.6875
+L 36.8125 47.703125
+L 18.3125 47.703125
+L 18.3125 18.015625
+Q 18.3125 11.328125 20.140625 9.421875
+Q 21.96875 7.515625 27.59375 7.515625
+L 36.8125 7.515625
+L 36.8125 0
+L 27.59375 0
+Q 17.1875 0 13.234375 3.875
+Q 9.28125 7.765625 9.28125 18.015625
+L 9.28125 47.703125
+L 2.6875 47.703125
+L 2.6875 54.6875
+L 9.28125 54.6875
+L 9.28125 70.21875
+z
+" id="DejaVuSans-116"/>
+ <path d="M 8.5 21.578125
+L 8.5 54.6875
+L 17.484375 54.6875
+L 17.484375 21.921875
+Q 17.484375 14.15625 20.5 10.265625
+Q 23.53125 6.390625 29.59375 6.390625
+Q 36.859375 6.390625 41.078125 11.03125
+Q 45.3125 15.671875 45.3125 23.6875
+L 45.3125 54.6875
+L 54.296875 54.6875
+L 54.296875 0
+L 45.3125 0
+L 45.3125 8.40625
+Q 42.046875 3.421875 37.71875 1
+Q 33.40625 -1.421875 27.6875 -1.421875
+Q 18.265625 -1.421875 13.375 4.4375
+Q 8.5 10.296875 8.5 21.578125
+z
+M 31.109375 56
+z
+" id="DejaVuSans-117"/>
+ <path d="M 45.40625 46.390625
+L 45.40625 75.984375
+L 54.390625 75.984375
+L 54.390625 0
+L 45.40625 0
+L 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+z
+M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+" id="DejaVuSans-100"/>
+ </defs>
+ <g transform="translate(22.3725 247.642656)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-65"/>
+ <use x="68.408203" xlink:href="#DejaVuSans-109"/>
+ <use x="165.820312" xlink:href="#DejaVuSans-112"/>
+ <use x="229.296875" xlink:href="#DejaVuSans-108"/>
+ <use x="257.080078" xlink:href="#DejaVuSans-105"/>
+ <use x="284.863281" xlink:href="#DejaVuSans-116"/>
+ <use x="324.072266" xlink:href="#DejaVuSans-117"/>
+ <use x="387.451172" xlink:href="#DejaVuSans-100"/>
+ <use x="450.927734" xlink:href="#DejaVuSans-101"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_23">
+ <path clip-path="url(#pe1ad9ad180)" d="M 59.735 90.637128
+L 60.354555 368.44
+L 60.97411 101.257995
+L 61.593666 89.544762
+L 62.213221 162.537788
+L 62.832776 216.318021
+L 63.452331 218.856564
+L 64.691442 149.172991
+L 65.310997 131.759202
+L 65.930552 138.649771
+L 67.169663 179.056115
+L 67.789218 185.565005
+L 68.408773 176.952802
+L 69.647884 142.841032
+L 70.267439 135.23766
+L 70.886994 139.20082
+L 72.74566 175.017556
+L 73.365215 176.539869
+L 73.98477 171.15552
+L 74.604326 163.116652
+L 75.223881 157.603751
+L 75.843436 158.258247
+L 76.462991 165.675244
+L 77.702102 189.224243
+L 78.321657 197.169066
+L 78.941212 199.096816
+L 79.560767 195.446722
+L 80.799878 182.54496
+L 81.419433 179.444167
+L 82.038988 180.450464
+L 83.278099 189.109864
+L 83.897654 191.570786
+L 84.517209 190.106083
+L 85.136764 184.604964
+L 86.375875 168.649629
+L 86.99543 163.180844
+L 87.614985 161.666806
+L 88.234541 164.073071
+L 90.093206 178.097894
+L 90.712761 179.285637
+L 91.332317 178.090254
+L 91.951872 175.763721
+L 92.571427 174.003384
+L 93.190982 174.20566
+L 93.810538 176.880931
+L 95.669203 190.32779
+L 96.288759 191.621516
+L 96.908314 189.936666
+L 97.527869 185.834798
+L 98.766979 175.908423
+L 99.386535 172.882101
+L 100.00609 172.048181
+L 100.625645 173.049514
+L 101.864756 176.461216
+L 102.484311 176.861972
+L 103.103866 175.88973
+L 104.342977 172.189011
+L 104.962532 171.415784
+L 105.582087 172.360443
+L 106.201642 175.064209
+L 107.440753 182.892636
+L 108.060308 185.890913
+L 108.679863 187.151139
+L 109.299418 186.484418
+L 109.918974 184.30596
+L 111.158084 178.826514
+L 111.777639 177.126317
+L 112.397195 176.567533
+L 113.01675 176.887163
+L 113.636305 177.497057
+L 114.25586 177.75786
+L 114.875415 177.255369
+L 115.494971 175.972593
+L 116.734081 172.859021
+L 117.353636 172.292715
+L 117.973192 172.975776
+L 118.592747 174.884904
+L 120.451413 182.671638
+L 121.070968 183.841586
+L 121.690523 183.797376
+L 122.310078 182.771357
+L 123.549189 179.772416
+L 124.168744 178.74354
+L 124.788299 178.295781
+L 126.646965 178.191607
+L 127.26652 177.54629
+L 129.125186 174.121441
+L 129.744741 173.685295
+L 130.364296 174.102606
+L 130.983851 175.356425
+L 132.842517 180.779276
+L 133.462072 181.776812
+L 134.081628 182.013475
+L 134.701183 181.600644
+L 136.559848 179.295262
+L 137.179404 178.907746
+L 139.038069 178.261912
+L 139.657625 177.671261
+L 141.51629 175.187308
+L 142.135846 174.877288
+L 142.755401 175.138743
+L 143.374956 175.963413
+L 145.233622 179.723631
+L 145.853177 180.527138
+L 146.472732 180.851881
+L 147.092287 180.742285
+L 148.331398 179.847613
+L 149.570508 179.061992
+L 151.429174 178.22939
+L 152.668284 177.113306
+L 153.907395 175.980243
+L 154.52695 175.776447
+L 155.146505 175.955559
+L 155.766061 176.512774
+L 158.244282 179.765488
+L 158.863837 180.086282
+L 159.483392 180.113313
+L 160.722502 179.625759
+L 162.581168 178.773299
+L 163.820279 178.187561
+L 166.2985 176.558812
+L 166.918055 176.433256
+L 167.53761 176.566749
+L 168.157165 176.955122
+L 170.635386 179.289131
+L 171.254941 179.56952
+L 171.874497 179.648681
+L 173.113607 179.382669
+L 176.211383 178.160944
+L 178.689604 176.983542
+L 179.309159 176.910853
+L 179.928715 177.015665
+L 180.54827 177.293643
+L 183.646046 179.211528
+L 184.265601 179.302511
+L 185.504712 179.157032
+L 187.982933 178.384563
+L 191.080709 177.298151
+L 191.700264 177.259116
+L 192.319819 177.34334
+L 193.55893 177.839566
+L 195.417595 178.774634
+L 196.656706 179.043088
+L 197.895816 178.963265
+L 199.754482 178.522468
+L 203.471813 177.532792
+L 204.710924 177.582258
+L 205.950034 177.945754
+L 207.8087 178.63244
+L 209.04781 178.848049
+L 210.286921 178.804006
+L 212.145587 178.458371
+L 215.243363 177.771524
+L 216.482473 177.701794
+L 217.721584 177.869328
+L 221.438915 178.701176
+L 222.678025 178.676605
+L 224.536691 178.407636
+L 227.634467 177.882706
+L 228.873578 177.840387
+L 230.112688 177.969346
+L 233.83002 178.590475
+L 235.688685 178.525011
+L 241.264682 177.943153
+L 243.123348 178.128749
+L 246.221124 178.506981
+L 248.07979 178.45978
+L 253.655787 178.019611
+L 256.134008 178.233251
+L 258.612229 178.443968
+L 261.09045 178.366698
+L 265.427336 178.072079
+L 267.905557 178.184283
+L 271.622889 178.40217
+L 274.720665 178.255782
+L 277.818441 178.114954
+L 280.916217 178.241977
+L 284.013993 178.364862
+L 287.731325 178.22069
+L 290.829101 178.151307
+L 299.502874 178.250902
+L 303.839761 178.185831
+L 310.654868 178.286386
+L 316.85042 178.214182
+L 323.045973 178.27686
+L 329.86108 178.234894
+L 336.056632 178.259403
+L 342.87174 178.248325
+L 349.067292 178.248097
+L 355.8824 178.255768
+L 363.936618 178.229963
+L 456.869902 178.250651
+L 693.54 178.248337
+L 693.54 178.248337
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_3">
+ <path d="M 59.735 368.44
+L 59.735 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_4">
+ <path d="M 693.54 368.44
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_5">
+ <path d="M 59.735 368.44
+L 693.54 368.44
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_6">
+ <path d="M 59.735 75.6
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_2">
+ <g id="patch_7">
+ <path d="M 59.735 703.24
+L 693.54 703.24
+L 693.54 410.4
+L 59.735 410.4
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_3">
+ <g id="xtick_7">
+ <g id="line2d_24">
+ <path clip-path="url(#p652a3695bd)" d="M 59.735 703.24
+L 59.735 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_25">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_14">
+ <!-- 10Hz -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 19.671875 72.90625
+L 19.671875 43.015625
+L 55.515625 43.015625
+L 55.515625 72.90625
+L 65.375 72.90625
+L 65.375 0
+L 55.515625 0
+L 55.515625 34.71875
+L 19.671875 34.71875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-72"/>
+ <path d="M 5.515625 54.6875
+L 48.1875 54.6875
+L 48.1875 46.484375
+L 14.40625 7.171875
+L 48.1875 7.171875
+L 48.1875 0
+L 4.296875 0
+L 4.296875 8.203125
+L 38.09375 47.515625
+L 5.515625 47.515625
+z
+" id="DejaVuSans-122"/>
+ </defs>
+ <g transform="translate(46.988125 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_8">
+ <g id="line2d_26">
+ <path clip-path="url(#p652a3695bd)" d="M 59.735 703.24
+L 59.735 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_27">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_9">
+ <g id="line2d_28">
+ <path clip-path="url(#p652a3695bd)" d="M 116.179495 703.24
+L 116.179495 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_29">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="116.179495" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_10">
+ <g id="line2d_30">
+ <path clip-path="url(#p652a3695bd)" d="M 149.197408 703.24
+L 149.197408 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_31">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="149.197408" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_11">
+ <g id="line2d_32">
+ <path clip-path="url(#p652a3695bd)" d="M 172.62399 703.24
+L 172.62399 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_33">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="172.62399" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_12">
+ <g id="line2d_34">
+ <path clip-path="url(#p652a3695bd)" d="M 190.795059 703.24
+L 190.795059 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_35">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="190.795059" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_13">
+ <g id="line2d_36">
+ <path clip-path="url(#p652a3695bd)" d="M 205.641903 703.24
+L 205.641903 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_37">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="205.641903" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_14">
+ <g id="line2d_38">
+ <path clip-path="url(#p652a3695bd)" d="M 218.194731 703.24
+L 218.194731 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_39">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="218.194731" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_15">
+ <g id="line2d_40">
+ <path clip-path="url(#p652a3695bd)" d="M 229.068485 703.24
+L 229.068485 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_41">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="229.068485" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_16">
+ <g id="line2d_42">
+ <path clip-path="url(#p652a3695bd)" d="M 238.659816 703.24
+L 238.659816 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_43">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="238.659816" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_17">
+ <g id="line2d_44">
+ <path clip-path="url(#p652a3695bd)" d="M 247.239554 703.24
+L 247.239554 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_45">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.239554" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_15">
+ <!-- 100Hz -->
+ <g transform="translate(231.311429 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_18">
+ <g id="line2d_46">
+ <path clip-path="url(#p652a3695bd)" d="M 247.239554 703.24
+L 247.239554 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_47">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.239554" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_19">
+ <g id="line2d_48">
+ <path clip-path="url(#p652a3695bd)" d="M 303.684049 703.24
+L 303.684049 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_49">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="303.684049" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_20">
+ <g id="line2d_50">
+ <path clip-path="url(#p652a3695bd)" d="M 336.701962 703.24
+L 336.701962 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_51">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="336.701962" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_21">
+ <g id="line2d_52">
+ <path clip-path="url(#p652a3695bd)" d="M 360.128544 703.24
+L 360.128544 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_53">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="360.128544" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_22">
+ <g id="line2d_54">
+ <path clip-path="url(#p652a3695bd)" d="M 378.299612 703.24
+L 378.299612 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_55">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="378.299612" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_23">
+ <g id="line2d_56">
+ <path clip-path="url(#p652a3695bd)" d="M 393.146456 703.24
+L 393.146456 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_57">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="393.146456" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_24">
+ <g id="line2d_58">
+ <path clip-path="url(#p652a3695bd)" d="M 405.699284 703.24
+L 405.699284 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_59">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="405.699284" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_25">
+ <g id="line2d_60">
+ <path clip-path="url(#p652a3695bd)" d="M 416.573038 703.24
+L 416.573038 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_61">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="416.573038" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_26">
+ <g id="line2d_62">
+ <path clip-path="url(#p652a3695bd)" d="M 426.164369 703.24
+L 426.164369 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_63">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="426.164369" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_27">
+ <g id="line2d_64">
+ <path clip-path="url(#p652a3695bd)" d="M 434.744107 703.24
+L 434.744107 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_65">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="434.744107" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_16">
+ <!-- 1kHz -->
+ <defs>
+ <path d="M 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 31.109375
+L 44.921875 54.6875
+L 56.390625 54.6875
+L 27.390625 29.109375
+L 57.625 0
+L 45.90625 0
+L 18.109375 26.703125
+L 18.109375 0
+L 9.078125 0
+z
+" id="DejaVuSans-107"/>
+ </defs>
+ <g transform="translate(422.28317 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_28">
+ <g id="line2d_66">
+ <path clip-path="url(#p652a3695bd)" d="M 434.744107 703.24
+L 434.744107 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_67">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="434.744107" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_29">
+ <g id="line2d_68">
+ <path clip-path="url(#p652a3695bd)" d="M 491.188602 703.24
+L 491.188602 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_69">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="491.188602" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_30">
+ <g id="line2d_70">
+ <path clip-path="url(#p652a3695bd)" d="M 524.206515 703.24
+L 524.206515 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_71">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.206515" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_31">
+ <g id="line2d_72">
+ <path clip-path="url(#p652a3695bd)" d="M 547.633097 703.24
+L 547.633097 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_73">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.633097" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_32">
+ <g id="line2d_74">
+ <path clip-path="url(#p652a3695bd)" d="M 565.804166 703.24
+L 565.804166 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_75">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="565.804166" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_33">
+ <g id="line2d_76">
+ <path clip-path="url(#p652a3695bd)" d="M 580.65101 703.24
+L 580.65101 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_77">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="580.65101" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_34">
+ <g id="line2d_78">
+ <path clip-path="url(#p652a3695bd)" d="M 593.203838 703.24
+L 593.203838 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_79">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.203838" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_35">
+ <g id="line2d_80">
+ <path clip-path="url(#p652a3695bd)" d="M 604.077592 703.24
+L 604.077592 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_81">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.077592" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_36">
+ <g id="line2d_82">
+ <path clip-path="url(#p652a3695bd)" d="M 613.668923 703.24
+L 613.668923 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_83">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="613.668923" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_37">
+ <g id="line2d_84">
+ <path clip-path="url(#p652a3695bd)" d="M 622.248661 703.24
+L 622.248661 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_85">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.248661" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_17">
+ <!-- 10kHz -->
+ <g transform="translate(606.606473 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_38">
+ <g id="line2d_86">
+ <path clip-path="url(#p652a3695bd)" d="M 622.248661 703.24
+L 622.248661 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_87">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.248661" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_39">
+ <g id="line2d_88">
+ <path clip-path="url(#p652a3695bd)" d="M 678.693156 703.24
+L 678.693156 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_89">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.693156" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_40">
+ <g id="line2d_90">
+ <path clip-path="url(#p652a3695bd)" d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_91">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#m816ae47b83" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_18">
+ <!-- 24kHz -->
+ <g transform="translate(677.897813 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_19">
+ <!-- Frequency (Hz) -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 51.703125 72.90625
+L 51.703125 64.59375
+L 19.671875 64.59375
+L 19.671875 43.109375
+L 48.578125 43.109375
+L 48.578125 34.8125
+L 19.671875 34.8125
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-70"/>
+ <path d="M 41.109375 46.296875
+Q 39.59375 47.171875 37.8125 47.578125
+Q 36.03125 48 33.890625 48
+Q 26.265625 48 22.1875 43.046875
+Q 18.109375 38.09375 18.109375 28.8125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 20.953125 51.171875 25.484375 53.578125
+Q 30.03125 56 36.53125 56
+Q 37.453125 56 38.578125 55.875
+Q 39.703125 55.765625 41.0625 55.515625
+z
+" id="DejaVuSans-114"/>
+ <path d="M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+M 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+L 45.40625 54.6875
+L 54.390625 54.6875
+L 54.390625 -20.796875
+L 45.40625 -20.796875
+z
+" id="DejaVuSans-113"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-110"/>
+ <path d="M 48.78125 52.59375
+L 48.78125 44.1875
+Q 44.96875 46.296875 41.140625 47.34375
+Q 37.3125 48.390625 33.40625 48.390625
+Q 24.65625 48.390625 19.8125 42.84375
+Q 14.984375 37.3125 14.984375 27.296875
+Q 14.984375 17.28125 19.8125 11.734375
+Q 24.65625 6.203125 33.40625 6.203125
+Q 37.3125 6.203125 41.140625 7.25
+Q 44.96875 8.296875 48.78125 10.40625
+L 48.78125 2.09375
+Q 45.015625 0.34375 40.984375 -0.53125
+Q 36.96875 -1.421875 32.421875 -1.421875
+Q 20.0625 -1.421875 12.78125 6.34375
+Q 5.515625 14.109375 5.515625 27.296875
+Q 5.515625 40.671875 12.859375 48.328125
+Q 20.21875 56 33.015625 56
+Q 37.15625 56 41.109375 55.140625
+Q 45.0625 54.296875 48.78125 52.59375
+z
+" id="DejaVuSans-99"/>
+ <path d="M 32.171875 -5.078125
+Q 28.375 -14.84375 24.75 -17.8125
+Q 21.140625 -20.796875 15.09375 -20.796875
+L 7.90625 -20.796875
+L 7.90625 -13.28125
+L 13.1875 -13.28125
+Q 16.890625 -13.28125 18.9375 -11.515625
+Q 21 -9.765625 23.484375 -3.21875
+L 25.09375 0.875
+L 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 11.921875
+L 46.6875 54.6875
+L 56.203125 54.6875
+z
+" id="DejaVuSans-121"/>
+ <path id="DejaVuSans-32"/>
+ <path d="M 31 75.875
+Q 24.46875 64.65625 21.28125 53.65625
+Q 18.109375 42.671875 18.109375 31.390625
+Q 18.109375 20.125 21.3125 9.0625
+Q 24.515625 -2 31 -13.1875
+L 23.1875 -13.1875
+Q 15.875 -1.703125 12.234375 9.375
+Q 8.59375 20.453125 8.59375 31.390625
+Q 8.59375 42.28125 12.203125 53.3125
+Q 15.828125 64.359375 23.1875 75.875
+z
+" id="DejaVuSans-40"/>
+ <path d="M 8.015625 75.875
+L 15.828125 75.875
+Q 23.140625 64.359375 26.78125 53.3125
+Q 30.421875 42.28125 30.421875 31.390625
+Q 30.421875 20.453125 26.78125 9.375
+Q 23.140625 -1.703125 15.828125 -13.1875
+L 8.015625 -13.1875
+Q 14.5 -2 17.703125 9.0625
+Q 20.90625 20.125 20.90625 31.390625
+Q 20.90625 42.671875 17.703125 53.65625
+Q 14.5 64.65625 8.015625 75.875
+z
+" id="DejaVuSans-41"/>
+ </defs>
+ <g transform="translate(338.464844 731.516563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_4">
+ <g id="ytick_6">
+ <g id="line2d_92">
+ <path clip-path="url(#p652a3695bd)" d="M 59.735 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_93">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_20">
+ <!-- −160 -->
+ <g transform="translate(25.267812 707.039219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-54"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_7">
+ <g id="line2d_94">
+ <path clip-path="url(#p652a3695bd)" d="M 59.735 668.788235
+L 693.54 668.788235
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_95">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="668.788235"/>
+ </g>
+ </g>
+ <g id="text_21">
+ <!-- −140 -->
+ <g transform="translate(25.267812 672.587454)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-52"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_8">
+ <g id="line2d_96">
+ <path clip-path="url(#p652a3695bd)" d="M 59.735 634.336471
+L 693.54 634.336471
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_97">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="634.336471"/>
+ </g>
+ </g>
+ <g id="text_22">
+ <!-- −120 -->
+ <g transform="translate(25.267812 638.135689)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-50"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_9">
+ <g id="line2d_98">
+ <path clip-path="url(#p652a3695bd)" d="M 59.735 599.884706
+L 693.54 599.884706
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_99">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="599.884706"/>
+ </g>
+ </g>
+ <g id="text_23">
+ <!-- −100 -->
+ <g transform="translate(25.267812 603.683925)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_10">
+ <g id="line2d_100">
+ <path clip-path="url(#p652a3695bd)" d="M 59.735 565.432941
+L 693.54 565.432941
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_101">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="565.432941"/>
+ </g>
+ </g>
+ <g id="text_24">
+ <!-- −80 -->
+ <g transform="translate(31.630312 569.23216)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-56"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_11">
+ <g id="line2d_102">
+ <path clip-path="url(#p652a3695bd)" d="M 59.735 530.981176
+L 693.54 530.981176
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_103">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="530.981176"/>
+ </g>
+ </g>
+ <g id="text_25">
+ <!-- −60 -->
+ <g transform="translate(31.630312 534.780395)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-54"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_12">
+ <g id="line2d_104">
+ <path clip-path="url(#p652a3695bd)" d="M 59.735 496.529412
+L 693.54 496.529412
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_105">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="496.529412"/>
+ </g>
+ </g>
+ <g id="text_26">
+ <!-- −40 -->
+ <g transform="translate(31.630312 500.328631)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-52"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_13">
+ <g id="line2d_106">
+ <path clip-path="url(#p652a3695bd)" d="M 59.735 462.077647
+L 693.54 462.077647
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_107">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="462.077647"/>
+ </g>
+ </g>
+ <g id="text_27">
+ <!-- −20 -->
+ <g transform="translate(31.630312 465.876866)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_14">
+ <g id="line2d_108">
+ <path clip-path="url(#p652a3695bd)" d="M 59.735 427.625882
+L 693.54 427.625882
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_109">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="427.625882"/>
+ </g>
+ </g>
+ <g id="text_28">
+ <!-- 0 -->
+ <g transform="translate(46.3725 431.425101)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_29">
+ <!-- Gain (dB) -->
+ <defs>
+ <path d="M 59.515625 10.40625
+L 59.515625 29.984375
+L 43.40625 29.984375
+L 43.40625 38.09375
+L 69.28125 38.09375
+L 69.28125 6.78125
+Q 63.578125 2.734375 56.6875 0.65625
+Q 49.8125 -1.421875 42 -1.421875
+Q 24.90625 -1.421875 15.25 8.5625
+Q 5.609375 18.5625 5.609375 36.375
+Q 5.609375 54.25 15.25 64.234375
+Q 24.90625 74.21875 42 74.21875
+Q 49.125 74.21875 55.546875 72.453125
+Q 61.96875 70.703125 67.390625 67.28125
+L 67.390625 56.78125
+Q 61.921875 61.421875 55.765625 63.765625
+Q 49.609375 66.109375 42.828125 66.109375
+Q 29.4375 66.109375 22.71875 58.640625
+Q 16.015625 51.171875 16.015625 36.375
+Q 16.015625 21.625 22.71875 14.15625
+Q 29.4375 6.6875 42.828125 6.6875
+Q 48.046875 6.6875 52.140625 7.59375
+Q 56.25 8.5 59.515625 10.40625
+z
+" id="DejaVuSans-71"/>
+ <path d="M 19.671875 34.8125
+L 19.671875 8.109375
+L 35.5 8.109375
+Q 43.453125 8.109375 47.28125 11.40625
+Q 51.125 14.703125 51.125 21.484375
+Q 51.125 28.328125 47.28125 31.5625
+Q 43.453125 34.8125 35.5 34.8125
+z
+M 19.671875 64.796875
+L 19.671875 42.828125
+L 34.28125 42.828125
+Q 41.5 42.828125 45.03125 45.53125
+Q 48.578125 48.25 48.578125 53.8125
+Q 48.578125 59.328125 45.03125 62.0625
+Q 41.5 64.796875 34.28125 64.796875
+z
+M 9.8125 72.90625
+L 35.015625 72.90625
+Q 46.296875 72.90625 52.390625 68.21875
+Q 58.5 63.53125 58.5 54.890625
+Q 58.5 48.1875 55.375 44.234375
+Q 52.25 40.28125 46.1875 39.3125
+Q 53.46875 37.75 57.5 32.78125
+Q 61.53125 27.828125 61.53125 20.40625
+Q 61.53125 10.640625 54.890625 5.3125
+Q 48.25 0 35.984375 0
+L 9.8125 0
+z
+" id="DejaVuSans-66"/>
+ </defs>
+ <g transform="translate(19.188125 580.411406)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-71"/>
+ <use x="77.490234" xlink:href="#DejaVuSans-97"/>
+ <use x="138.769531" xlink:href="#DejaVuSans-105"/>
+ <use x="166.552734" xlink:href="#DejaVuSans-110"/>
+ <use x="229.931641" xlink:href="#DejaVuSans-32"/>
+ <use x="261.71875" xlink:href="#DejaVuSans-40"/>
+ <use x="300.732422" xlink:href="#DejaVuSans-100"/>
+ <use x="364.208984" xlink:href="#DejaVuSans-66"/>
+ <use x="432.8125" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_110">
+ <path clip-path="url(#p652a3695bd)" d="M -1 427.625883
+L 500.779933 427.734477
+L 502.251006 427.95351
+L 503.285737 428.346561
+L 503.900322 428.774933
+L 504.510304 429.437476
+L 505.115751 430.429829
+L 505.716729 431.850912
+L 506.313304 433.774201
+L 507.102 437.145747
+L 508.077248 442.475439
+L 509.423265 451.303741
+L 511.308354 465.337044
+L 513.514327 483.503971
+L 515.662113 503.080616
+L 517.754705 524.338292
+L 519.626792 545.668206
+L 521.456805 569.268821
+L 523.085504 593.12883
+L 523.887798 606.216324
+L 524.52399 616.90411
+L 524.840232 621.266504
+L 525.15525 628.427462
+L 525.625505 641.54157
+L 525.781655 641.22359
+L 525.937506 640.62171
+L 526.09306 641.281403
+L 526.248316 643.638115
+L 526.557945 655.697427
+L 526.712319 669.377293
+L 526.866401 669.810919
+L 527.173692 655.757524
+L 527.326904 654.448522
+L 527.479829 654.873017
+L 528.08867 659.828306
+L 528.542333 658.517393
+L 528.692994 658.563394
+L 529.292865 659.493684
+L 530.332123 660.108183
+L 532.945145 661.80904
+L 536.713888 664.02696
+L 540.185294 665.869204
+L 540.446295 665.408303
+L 540.576482 665.449788
+L 540.706462 665.946003
+L 541.095161 668.302781
+L 541.353266 664.664836
+L 541.610556 662.027583
+L 541.738897 663.081694
+L 541.867036 666.955939
+L 542.12271 686.715729
+L 542.377584 657.921063
+L 542.631663 650.595738
+L 542.758405 649.829398
+L 543.011301 651.196949
+L 543.137454 649.538371
+L 543.640124 633.587239
+L 545.375426 603.470802
+L 546.471763 585.749421
+L 547.910955 564.880024
+L 549.791147 540.722877
+L 551.742399 518.527612
+L 553.869272 496.932427
+L 556.049648 477.026185
+L 558.277899 458.646598
+L 560.038104 445.719781
+L 561.258085 438.228204
+L 562.161224 433.986933
+L 562.856805 431.639368
+L 563.546495 430.053168
+L 564.230393 429.055836
+L 564.908595 428.458441
+L 565.676829 428.073989
+L 566.721454 427.819548
+L 568.402454 427.67765
+L 572.547022 427.628328
+L 640.635747 427.625882
+L 693.520117 427.625882
+L 693.520117 427.625882
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_8">
+ <path d="M 59.735 703.24
+L 59.735 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_9">
+ <path d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_10">
+ <path d="M 59.735 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_11">
+ <path d="M 59.735 410.4
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_3">
+ <g id="patch_12">
+ <path d="M 59.735 1038.04
+L 693.54 1038.04
+L 693.54 745.2
+L 59.735 745.2
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_5">
+ <g id="xtick_41">
+ <g id="line2d_111">
+ <path clip-path="url(#p72ab0bbb96)" d="M 59.735 1038.04
+L 59.735 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_112">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_30">
+ <!-- 10Hz -->
+ <g transform="translate(46.988125 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_42">
+ <g id="line2d_113">
+ <path clip-path="url(#p72ab0bbb96)" d="M 59.735 1038.04
+L 59.735 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_114">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_43">
+ <g id="line2d_115">
+ <path clip-path="url(#p72ab0bbb96)" d="M 116.179495 1038.04
+L 116.179495 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_116">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="116.179495" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_44">
+ <g id="line2d_117">
+ <path clip-path="url(#p72ab0bbb96)" d="M 149.197408 1038.04
+L 149.197408 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_118">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="149.197408" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_45">
+ <g id="line2d_119">
+ <path clip-path="url(#p72ab0bbb96)" d="M 172.62399 1038.04
+L 172.62399 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_120">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="172.62399" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_46">
+ <g id="line2d_121">
+ <path clip-path="url(#p72ab0bbb96)" d="M 190.795059 1038.04
+L 190.795059 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_122">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="190.795059" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_47">
+ <g id="line2d_123">
+ <path clip-path="url(#p72ab0bbb96)" d="M 205.641903 1038.04
+L 205.641903 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_124">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="205.641903" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_48">
+ <g id="line2d_125">
+ <path clip-path="url(#p72ab0bbb96)" d="M 218.194731 1038.04
+L 218.194731 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_126">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="218.194731" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_49">
+ <g id="line2d_127">
+ <path clip-path="url(#p72ab0bbb96)" d="M 229.068485 1038.04
+L 229.068485 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_128">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="229.068485" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_50">
+ <g id="line2d_129">
+ <path clip-path="url(#p72ab0bbb96)" d="M 238.659816 1038.04
+L 238.659816 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_130">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="238.659816" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_51">
+ <g id="line2d_131">
+ <path clip-path="url(#p72ab0bbb96)" d="M 247.239554 1038.04
+L 247.239554 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_132">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.239554" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_31">
+ <!-- 100Hz -->
+ <g transform="translate(231.311429 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_52">
+ <g id="line2d_133">
+ <path clip-path="url(#p72ab0bbb96)" d="M 247.239554 1038.04
+L 247.239554 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_134">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.239554" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_53">
+ <g id="line2d_135">
+ <path clip-path="url(#p72ab0bbb96)" d="M 303.684049 1038.04
+L 303.684049 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_136">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="303.684049" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_54">
+ <g id="line2d_137">
+ <path clip-path="url(#p72ab0bbb96)" d="M 336.701962 1038.04
+L 336.701962 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_138">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="336.701962" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_55">
+ <g id="line2d_139">
+ <path clip-path="url(#p72ab0bbb96)" d="M 360.128544 1038.04
+L 360.128544 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_140">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="360.128544" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_56">
+ <g id="line2d_141">
+ <path clip-path="url(#p72ab0bbb96)" d="M 378.299612 1038.04
+L 378.299612 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_142">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="378.299612" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_57">
+ <g id="line2d_143">
+ <path clip-path="url(#p72ab0bbb96)" d="M 393.146456 1038.04
+L 393.146456 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_144">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="393.146456" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_58">
+ <g id="line2d_145">
+ <path clip-path="url(#p72ab0bbb96)" d="M 405.699284 1038.04
+L 405.699284 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_146">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="405.699284" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_59">
+ <g id="line2d_147">
+ <path clip-path="url(#p72ab0bbb96)" d="M 416.573038 1038.04
+L 416.573038 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_148">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="416.573038" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_60">
+ <g id="line2d_149">
+ <path clip-path="url(#p72ab0bbb96)" d="M 426.164369 1038.04
+L 426.164369 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_150">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="426.164369" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_61">
+ <g id="line2d_151">
+ <path clip-path="url(#p72ab0bbb96)" d="M 434.744107 1038.04
+L 434.744107 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_152">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="434.744107" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_32">
+ <!-- 1kHz -->
+ <g transform="translate(422.28317 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_62">
+ <g id="line2d_153">
+ <path clip-path="url(#p72ab0bbb96)" d="M 434.744107 1038.04
+L 434.744107 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_154">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="434.744107" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_63">
+ <g id="line2d_155">
+ <path clip-path="url(#p72ab0bbb96)" d="M 491.188602 1038.04
+L 491.188602 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_156">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="491.188602" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_64">
+ <g id="line2d_157">
+ <path clip-path="url(#p72ab0bbb96)" d="M 524.206515 1038.04
+L 524.206515 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_158">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.206515" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_65">
+ <g id="line2d_159">
+ <path clip-path="url(#p72ab0bbb96)" d="M 547.633097 1038.04
+L 547.633097 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_160">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.633097" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_66">
+ <g id="line2d_161">
+ <path clip-path="url(#p72ab0bbb96)" d="M 565.804166 1038.04
+L 565.804166 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_162">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="565.804166" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_67">
+ <g id="line2d_163">
+ <path clip-path="url(#p72ab0bbb96)" d="M 580.65101 1038.04
+L 580.65101 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_164">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="580.65101" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_68">
+ <g id="line2d_165">
+ <path clip-path="url(#p72ab0bbb96)" d="M 593.203838 1038.04
+L 593.203838 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_166">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.203838" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_69">
+ <g id="line2d_167">
+ <path clip-path="url(#p72ab0bbb96)" d="M 604.077592 1038.04
+L 604.077592 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_168">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.077592" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_70">
+ <g id="line2d_169">
+ <path clip-path="url(#p72ab0bbb96)" d="M 613.668923 1038.04
+L 613.668923 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_170">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="613.668923" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_71">
+ <g id="line2d_171">
+ <path clip-path="url(#p72ab0bbb96)" d="M 622.248661 1038.04
+L 622.248661 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_172">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.248661" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_33">
+ <!-- 10kHz -->
+ <g transform="translate(606.606473 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_72">
+ <g id="line2d_173">
+ <path clip-path="url(#p72ab0bbb96)" d="M 622.248661 1038.04
+L 622.248661 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_174">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.248661" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_73">
+ <g id="line2d_175">
+ <path clip-path="url(#p72ab0bbb96)" d="M 678.693156 1038.04
+L 678.693156 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_176">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.693156" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_74">
+ <g id="line2d_177">
+ <path clip-path="url(#p72ab0bbb96)" d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_178">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#m816ae47b83" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_34">
+ <!-- 24kHz -->
+ <g transform="translate(677.897813 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_35">
+ <!-- Frequency (Hz) -->
+ <g transform="translate(338.464844 1066.316563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_6">
+ <g id="ytick_15">
+ <g id="line2d_179">
+ <path clip-path="url(#p72ab0bbb96)" d="M 59.735 1007.214737
+L 693.54 1007.214737
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_180">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="1007.214737"/>
+ </g>
+ </g>
+ <g id="text_36">
+ <!-- −150 -->
+ <defs>
+ <path d="M 10.796875 72.90625
+L 49.515625 72.90625
+L 49.515625 64.59375
+L 19.828125 64.59375
+L 19.828125 46.734375
+Q 21.96875 47.46875 24.109375 47.828125
+Q 26.265625 48.1875 28.421875 48.1875
+Q 40.625 48.1875 47.75 41.5
+Q 54.890625 34.8125 54.890625 23.390625
+Q 54.890625 11.625 47.5625 5.09375
+Q 40.234375 -1.421875 26.90625 -1.421875
+Q 22.3125 -1.421875 17.546875 -0.640625
+Q 12.796875 0.140625 7.71875 1.703125
+L 7.71875 11.625
+Q 12.109375 9.234375 16.796875 8.0625
+Q 21.484375 6.890625 26.703125 6.890625
+Q 35.15625 6.890625 40.078125 11.328125
+Q 45.015625 15.765625 45.015625 23.390625
+Q 45.015625 31 40.078125 35.4375
+Q 35.15625 39.890625 26.703125 39.890625
+Q 22.75 39.890625 18.8125 39.015625
+Q 14.890625 38.140625 10.796875 36.28125
+z
+" id="DejaVuSans-53"/>
+ </defs>
+ <g transform="translate(25.267812 1011.013956)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_16">
+ <g id="line2d_181">
+ <path clip-path="url(#p72ab0bbb96)" d="M 59.735 968.683158
+L 693.54 968.683158
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_182">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="968.683158"/>
+ </g>
+ </g>
+ <g id="text_37">
+ <!-- −100 -->
+ <g transform="translate(25.267812 972.482377)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_17">
+ <g id="line2d_183">
+ <path clip-path="url(#p72ab0bbb96)" d="M 59.735 930.151579
+L 693.54 930.151579
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_184">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="930.151579"/>
+ </g>
+ </g>
+ <g id="text_38">
+ <!-- −50 -->
+ <g transform="translate(31.630312 933.950798)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-53"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_18">
+ <g id="line2d_185">
+ <path clip-path="url(#p72ab0bbb96)" d="M 59.735 891.62
+L 693.54 891.62
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_186">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="891.62"/>
+ </g>
+ </g>
+ <g id="text_39">
+ <!-- 0 -->
+ <g transform="translate(46.3725 895.419219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_19">
+ <g id="line2d_187">
+ <path clip-path="url(#p72ab0bbb96)" d="M 59.735 853.088421
+L 693.54 853.088421
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_188">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="853.088421"/>
+ </g>
+ </g>
+ <g id="text_40">
+ <!-- 50 -->
+ <g transform="translate(40.01 856.88764)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-53"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_20">
+ <g id="line2d_189">
+ <path clip-path="url(#p72ab0bbb96)" d="M 59.735 814.556842
+L 693.54 814.556842
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_190">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="814.556842"/>
+ </g>
+ </g>
+ <g id="text_41">
+ <!-- 100 -->
+ <g transform="translate(33.6475 818.356061)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_21">
+ <g id="line2d_191">
+ <path clip-path="url(#p72ab0bbb96)" d="M 59.735 776.025263
+L 693.54 776.025263
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_192">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#me9cbca6570" y="776.025263"/>
+ </g>
+ </g>
+ <g id="text_42">
+ <!-- 150 -->
+ <g transform="translate(33.6475 779.824482)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-53"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_43">
+ <!-- Phase (${\circ}$) -->
+ <defs>
+ <path d="M 19.671875 64.796875
+L 19.671875 37.40625
+L 32.078125 37.40625
+Q 38.96875 37.40625 42.71875 40.96875
+Q 46.484375 44.53125 46.484375 51.125
+Q 46.484375 57.671875 42.71875 61.234375
+Q 38.96875 64.796875 32.078125 64.796875
+z
+M 9.8125 72.90625
+L 32.078125 72.90625
+Q 44.34375 72.90625 50.609375 67.359375
+Q 56.890625 61.8125 56.890625 51.125
+Q 56.890625 40.328125 50.609375 34.8125
+Q 44.34375 29.296875 32.078125 29.296875
+L 19.671875 29.296875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-80"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-104"/>
+ <path d="M 31.296875 40.671875
+Q 27.390625 40.671875 24.703125 37.953125
+Q 22.015625 35.25 22.015625 31.34375
+Q 22.015625 27.484375 24.703125 24.828125
+Q 27.390625 22.171875 31.296875 22.171875
+Q 35.203125 22.171875 37.890625 24.828125
+Q 40.578125 27.484375 40.578125 31.34375
+Q 40.578125 35.203125 37.859375 37.9375
+Q 35.15625 40.671875 31.296875 40.671875
+z
+M 31.296875 46.96875
+Q 34.421875 46.96875 37.296875 45.765625
+Q 40.1875 44.578125 42.28125 42.328125
+Q 44.53125 40.140625 45.65625 37.34375
+Q 46.78125 34.5625 46.78125 31.34375
+Q 46.78125 24.90625 42.265625 20.4375
+Q 37.75 15.96875 31.203125 15.96875
+Q 24.609375 15.96875 20.21875 20.359375
+Q 15.828125 24.75 15.828125 31.34375
+Q 15.828125 37.890625 20.3125 42.421875
+Q 24.8125 46.96875 31.296875 46.96875
+z
+" id="DejaVuSans-8728"/>
+ </defs>
+ <g transform="translate(19.188125 915.17)rotate(-90)scale(0.1 -0.1)">
+ <use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-80"/>
+ <use transform="translate(60.302734 0.015625)" xlink:href="#DejaVuSans-104"/>
+ <use transform="translate(123.681641 0.015625)" xlink:href="#DejaVuSans-97"/>
+ <use transform="translate(184.960938 0.015625)" xlink:href="#DejaVuSans-115"/>
+ <use transform="translate(237.060547 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(298.583984 0.015625)" xlink:href="#DejaVuSans-32"/>
+ <use transform="translate(330.371094 0.015625)" xlink:href="#DejaVuSans-40"/>
+ <use transform="translate(369.384766 0.015625)" xlink:href="#DejaVuSans-8728"/>
+ <use transform="translate(431.982422 0.015625)" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_193">
+ <path clip-path="url(#p72ab0bbb96)" d="M -1 892.039767
+L 16.20606 892.039805
+L 72.650555 892.45962
+L 105.668468 892.879452
+L 147.266119 893.719198
+L 174.665791 894.559093
+L 195.130876 895.399201
+L 211.471931 896.239593
+L 231.110286 897.500849
+L 246.920836 898.763074
+L 260.155109 900.026497
+L 271.53623 901.291326
+L 284.593284 902.980305
+L 295.843169 904.672677
+L 305.72585 906.368929
+L 314.537919 908.0696
+L 324.360921 910.202417
+L 333.125522 912.343963
+L 341.037779 914.495282
+L 348.248876 916.657416
+L 356.13557 919.267798
+L 363.325431 921.897226
+L 369.931662 924.547641
+L 376.041942 927.221052
+L 381.725563 929.919532
+L 387.890943 933.102276
+L 393.622206 936.325535
+L 398.976485 939.592965
+L 404.000327 942.908387
+L 408.732159 946.275808
+L 413.823329 950.193377
+L 418.61484 954.191016
+L 423.140015 958.275807
+L 427.426909 962.455315
+L 431.499368 966.737648
+L 435.377824 971.13153
+L 439.079925 975.64637
+L 442.621013 980.292356
+L 446.014512 985.080554
+L 449.272234 990.023021
+L 452.787839 995.784165
+L 456.157928 1001.778022
+L 459.39407 1008.027731
+L 462.506507 1014.559233
+L 465.504349 1021.401771
+L 468.395737 1028.588498
+L 468.710755 1029.409858
+L 469.02456 752.808615
+L 471.795677 760.467925
+L 474.475589 768.563219
+L 477.070108 777.146477
+L 479.58451 786.278483
+L 482.023593 796.031025
+L 484.39174 806.489877
+L 486.692959 817.758938
+L 488.930931 829.966192
+L 490.869885 841.733903
+L 492.763742 854.513087
+L 494.614553 868.489318
+L 496.424232 883.911745
+L 498.194567 901.132337
+L 499.712654 918.084997
+L 501.202958 937.360672
+L 502.459007 956.35037
+L 503.695975 978.338219
+L 504.914435 1003.851013
+L 505.916073 1027.424046
+L 506.114931 754.850106
+L 508.656839 814.681077
+L 510.371264 848.786865
+L 512.234782 881.17762
+L 514.595301 917.966303
+L 517.409652 958.067566
+L 520.796094 1002.966405
+L 522.76236 1027.924989
+L 522.924092 1029.50701
+L 523.085504 753.709822
+L 523.567828 760.820475
+L 524.047312 767.362824
+L 524.206515 767.760902
+L 524.365407 767.85162
+L 524.52399 768.865443
+L 524.840232 776.182861
+L 525.312304 789.14792
+L 525.469055 785.376938
+L 525.781655 771.788498
+L 525.937506 776.309446
+L 526.248316 801.018157
+L 526.557945 840.34304
+L 526.712319 879.463119
+L 527.020191 1009.793679
+L 527.173692 759.229221
+L 527.784818 876.992798
+L 528.391393 1024.454695
+L 528.542333 780.895511
+L 529.591152 1023.024879
+L 529.739887 780.29619
+L 530.773491 1023.369505
+L 530.920084 780.678925
+L 531.938909 1023.822209
+L 532.083421 781.128042
+L 533.087883 1024.246322
+L 533.230372 781.548222
+L 534.220871 1024.640652
+L 534.361393 781.939072
+L 535.338312 1025.00852
+L 535.47692 782.303841
+L 536.440626 1025.352746
+L 536.577372 782.645288
+L 537.528217 1025.675403
+L 537.66315 782.965649
+L 538.601474 1025.963347
+L 538.734642 783.256698
+L 539.660769 1025.961177
+L 539.792218 783.281778
+L 540.706462 1023.549697
+L 540.836234 780.39552
+L 541.738897 1011.541636
+L 541.867036 757.571758
+L 541.994973 785.073808
+L 542.250247 939.232083
+L 542.631663 988.752034
+L 542.884951 1004.705431
+L 543.011301 1002.192069
+L 543.263413 988.003053
+L 543.389177 989.030017
+L 543.8903 1005.872518
+L 544.0151 1006.692589
+L 544.264128 1005.997124
+L 544.388357 1006.771003
+L 545.86451 1027.298612
+L 545.986323 1028.893706
+L 546.107955 752.909342
+L 546.954325 763.631139
+L 550.023148 804.081639
+L 552.868727 844.213036
+L 555.293139 881.308665
+L 557.330391 915.730117
+L 559.007303 947.719766
+L 560.446799 979.271007
+L 562.260957 1024.693757
+L 562.360568 1027.262606
+L 562.460058 752.39549
+L 562.559426 754.944963
+L 564.230393 795.002278
+L 565.485448 820.071229
+L 566.815759 842.29225
+L 568.21738 862.09251
+L 569.777256 880.986737
+L 571.486001 898.895483
+L 573.246765 915.039351
+L 575.140623 930.362939
+L 577.157622 944.827973
+L 579.206855 957.935365
+L 581.363596 970.309389
+L 583.618187 981.95064
+L 585.961178 992.875592
+L 588.383404 1003.111595
+L 590.876058 1012.692977
+L 593.498677 1021.885883
+L 595.84173 1029.4358
+L 595.907693 752.212773
+L 595.973604 752.41652
+L 598.758435 760.653609
+L 601.635755 768.474311
+L 604.652107 776.023107
+L 607.731965 783.136975
+L 610.974031 790.063816
+L 614.30264 796.65525
+L 617.803425 803.093897
+L 621.449516 809.332618
+L 625.261832 815.413859
+L 629.254626 821.363991
+L 633.477508 827.255063
+L 637.926251 833.078405
+L 642.666018 838.916072
+L 647.775189 844.854786
+L 653.400405 851.047789
+L 659.783151 857.735488
+L 667.610099 865.598502
+L 690.584393 888.461946
+L 693.520117 891.598395
+L 693.520117 891.598395
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_13">
+ <path d="M 59.735 1038.04
+L 59.735 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_14">
+ <path d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_15">
+ <path d="M 59.735 1038.04
+L 693.54 1038.04
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_16">
+ <path d="M 59.735 745.2
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="text_44">
+ <!-- 12th-order Butterworth filter, bandstop -->
+ <defs>
+ <path d="M 4.890625 31.390625
+L 31.203125 31.390625
+L 31.203125 23.390625
+L 4.890625 23.390625
+z
+" id="DejaVuSans-45"/>
+ <path d="M 30.609375 48.390625
+Q 23.390625 48.390625 19.1875 42.75
+Q 14.984375 37.109375 14.984375 27.296875
+Q 14.984375 17.484375 19.15625 11.84375
+Q 23.34375 6.203125 30.609375 6.203125
+Q 37.796875 6.203125 41.984375 11.859375
+Q 46.1875 17.53125 46.1875 27.296875
+Q 46.1875 37.015625 41.984375 42.703125
+Q 37.796875 48.390625 30.609375 48.390625
+z
+M 30.609375 56
+Q 42.328125 56 49.015625 48.375
+Q 55.71875 40.765625 55.71875 27.296875
+Q 55.71875 13.875 49.015625 6.21875
+Q 42.328125 -1.421875 30.609375 -1.421875
+Q 18.84375 -1.421875 12.171875 6.21875
+Q 5.515625 13.875 5.515625 27.296875
+Q 5.515625 40.765625 12.171875 48.375
+Q 18.84375 56 30.609375 56
+z
+" id="DejaVuSans-111"/>
+ <path d="M 4.203125 54.6875
+L 13.1875 54.6875
+L 24.421875 12.015625
+L 35.59375 54.6875
+L 46.1875 54.6875
+L 57.421875 12.015625
+L 68.609375 54.6875
+L 77.59375 54.6875
+L 63.28125 0
+L 52.6875 0
+L 40.921875 44.828125
+L 29.109375 0
+L 18.5 0
+z
+" id="DejaVuSans-119"/>
+ <path d="M 37.109375 75.984375
+L 37.109375 68.5
+L 28.515625 68.5
+Q 23.6875 68.5 21.796875 66.546875
+Q 19.921875 64.59375 19.921875 59.515625
+L 19.921875 54.6875
+L 34.71875 54.6875
+L 34.71875 47.703125
+L 19.921875 47.703125
+L 19.921875 0
+L 10.890625 0
+L 10.890625 47.703125
+L 2.296875 47.703125
+L 2.296875 54.6875
+L 10.890625 54.6875
+L 10.890625 58.5
+Q 10.890625 67.625 15.140625 71.796875
+Q 19.390625 75.984375 28.609375 75.984375
+z
+" id="DejaVuSans-102"/>
+ <path d="M 11.71875 12.40625
+L 22.015625 12.40625
+L 22.015625 4
+L 14.015625 -11.625
+L 7.71875 -11.625
+L 11.71875 4
+z
+" id="DejaVuSans-44"/>
+ <path d="M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+M 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+z
+" id="DejaVuSans-98"/>
+ </defs>
+ <g transform="translate(203.0925 33.7575)scale(0.16 -0.16)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-50"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-116"/>
+ <use x="166.455078" xlink:href="#DejaVuSans-104"/>
+ <use x="229.833984" xlink:href="#DejaVuSans-45"/>
+ <use x="265.933594" xlink:href="#DejaVuSans-111"/>
+ <use x="327.115234" xlink:href="#DejaVuSans-114"/>
+ <use x="368.212891" xlink:href="#DejaVuSans-100"/>
+ <use x="431.689453" xlink:href="#DejaVuSans-101"/>
+ <use x="493.212891" xlink:href="#DejaVuSans-114"/>
+ <use x="534.326172" xlink:href="#DejaVuSans-32"/>
+ <use x="566.113281" xlink:href="#DejaVuSans-66"/>
+ <use x="634.716797" xlink:href="#DejaVuSans-117"/>
+ <use x="698.095703" xlink:href="#DejaVuSans-116"/>
+ <use x="737.304688" xlink:href="#DejaVuSans-116"/>
+ <use x="776.513672" xlink:href="#DejaVuSans-101"/>
+ <use x="838.037109" xlink:href="#DejaVuSans-114"/>
+ <use x="879.150391" xlink:href="#DejaVuSans-119"/>
+ <use x="960.9375" xlink:href="#DejaVuSans-111"/>
+ <use x="1022.119141" xlink:href="#DejaVuSans-114"/>
+ <use x="1063.232422" xlink:href="#DejaVuSans-116"/>
+ <use x="1102.441406" xlink:href="#DejaVuSans-104"/>
+ <use x="1165.820312" xlink:href="#DejaVuSans-32"/>
+ <use x="1197.607422" xlink:href="#DejaVuSans-102"/>
+ <use x="1232.8125" xlink:href="#DejaVuSans-105"/>
+ <use x="1260.595703" xlink:href="#DejaVuSans-108"/>
+ <use x="1288.378906" xlink:href="#DejaVuSans-116"/>
+ <use x="1327.587891" xlink:href="#DejaVuSans-101"/>
+ <use x="1389.111328" xlink:href="#DejaVuSans-114"/>
+ <use x="1430.224609" xlink:href="#DejaVuSans-44"/>
+ <use x="1462.011719" xlink:href="#DejaVuSans-32"/>
+ <use x="1493.798828" xlink:href="#DejaVuSans-98"/>
+ <use x="1557.275391" xlink:href="#DejaVuSans-97"/>
+ <use x="1618.554688" xlink:href="#DejaVuSans-110"/>
+ <use x="1681.933594" xlink:href="#DejaVuSans-100"/>
+ <use x="1745.410156" xlink:href="#DejaVuSans-115"/>
+ <use x="1797.509766" xlink:href="#DejaVuSans-116"/>
+ <use x="1836.71875" xlink:href="#DejaVuSans-111"/>
+ <use x="1897.900391" xlink:href="#DejaVuSans-112"/>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="pe1ad9ad180">
+ <rect height="292.84" width="633.805" x="59.735" y="75.6"/>
+ </clipPath>
+ <clipPath id="p652a3695bd">
+ <rect height="292.84" width="633.805" x="59.735" y="410.4"/>
+ </clipPath>
+ <clipPath id="p72ab0bbb96">
+ <rect height="292.84" width="633.805" x="59.735" y="745.2"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/docs/docs/img/butterworth_highpass12.svg b/docs/docs/img/butterworth_highpass12.svg
@@ -0,0 +1,2935 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Created with matplotlib (https://matplotlib.org/) -->
+<svg height="1080pt" version="1.1" viewBox="0 0 720 1080" width="720pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+ </style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 1080
+L 720 1080
+L 720 0
+L 0 0
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="axes_1">
+ <g id="patch_2">
+ <path d="M 59.735 368.44
+L 693.54 368.44
+L 693.54 75.6
+L 59.735 75.6
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_1">
+ <g id="xtick_1">
+ <g id="line2d_1">
+ <path clip-path="url(#p8eb76c013d)" d="M 59.735 368.44
+L 59.735 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_2">
+ <defs>
+ <path d="M 0 0
+L 0 3.5
+" id="mdc80396e89" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#mdc80396e89" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- 0 -->
+ <defs>
+ <path d="M 31.78125 66.40625
+Q 24.171875 66.40625 20.328125 58.90625
+Q 16.5 51.421875 16.5 36.375
+Q 16.5 21.390625 20.328125 13.890625
+Q 24.171875 6.390625 31.78125 6.390625
+Q 39.453125 6.390625 43.28125 13.890625
+Q 47.125 21.390625 47.125 36.375
+Q 47.125 51.421875 43.28125 58.90625
+Q 39.453125 66.40625 31.78125 66.40625
+z
+M 31.78125 74.21875
+Q 44.046875 74.21875 50.515625 64.515625
+Q 56.984375 54.828125 56.984375 36.375
+Q 56.984375 17.96875 50.515625 8.265625
+Q 44.046875 -1.421875 31.78125 -1.421875
+Q 19.53125 -1.421875 13.0625 8.265625
+Q 6.59375 17.96875 6.59375 36.375
+Q 6.59375 54.828125 13.0625 64.515625
+Q 19.53125 74.21875 31.78125 74.21875
+z
+" id="DejaVuSans-48"/>
+ </defs>
+ <g transform="translate(56.55375 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_2">
+ <g id="line2d_3">
+ <path clip-path="url(#p8eb76c013d)" d="M 183.646046 368.44
+L 183.646046 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_4">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="183.646046" xlink:href="#mdc80396e89" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- 200 -->
+ <defs>
+ <path d="M 19.1875 8.296875
+L 53.609375 8.296875
+L 53.609375 0
+L 7.328125 0
+L 7.328125 8.296875
+Q 12.9375 14.109375 22.625 23.890625
+Q 32.328125 33.6875 34.8125 36.53125
+Q 39.546875 41.84375 41.421875 45.53125
+Q 43.3125 49.21875 43.3125 52.78125
+Q 43.3125 58.59375 39.234375 62.25
+Q 35.15625 65.921875 28.609375 65.921875
+Q 23.96875 65.921875 18.8125 64.3125
+Q 13.671875 62.703125 7.8125 59.421875
+L 7.8125 69.390625
+Q 13.765625 71.78125 18.9375 73
+Q 24.125 74.21875 28.421875 74.21875
+Q 39.75 74.21875 46.484375 68.546875
+Q 53.21875 62.890625 53.21875 53.421875
+Q 53.21875 48.921875 51.53125 44.890625
+Q 49.859375 40.875 45.40625 35.40625
+Q 44.1875 33.984375 37.640625 27.21875
+Q 31.109375 20.453125 19.1875 8.296875
+z
+" id="DejaVuSans-50"/>
+ </defs>
+ <g transform="translate(174.102296 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_3">
+ <g id="line2d_5">
+ <path clip-path="url(#p8eb76c013d)" d="M 307.557092 368.44
+L 307.557092 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_6">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="307.557092" xlink:href="#mdc80396e89" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- 400 -->
+ <defs>
+ <path d="M 37.796875 64.3125
+L 12.890625 25.390625
+L 37.796875 25.390625
+z
+M 35.203125 72.90625
+L 47.609375 72.90625
+L 47.609375 25.390625
+L 58.015625 25.390625
+L 58.015625 17.1875
+L 47.609375 17.1875
+L 47.609375 0
+L 37.796875 0
+L 37.796875 17.1875
+L 4.890625 17.1875
+L 4.890625 26.703125
+z
+" id="DejaVuSans-52"/>
+ </defs>
+ <g transform="translate(298.013342 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-52"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_4">
+ <g id="line2d_7">
+ <path clip-path="url(#p8eb76c013d)" d="M 431.468138 368.44
+L 431.468138 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_8">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="431.468138" xlink:href="#mdc80396e89" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- 600 -->
+ <defs>
+ <path d="M 33.015625 40.375
+Q 26.375 40.375 22.484375 35.828125
+Q 18.609375 31.296875 18.609375 23.390625
+Q 18.609375 15.53125 22.484375 10.953125
+Q 26.375 6.390625 33.015625 6.390625
+Q 39.65625 6.390625 43.53125 10.953125
+Q 47.40625 15.53125 47.40625 23.390625
+Q 47.40625 31.296875 43.53125 35.828125
+Q 39.65625 40.375 33.015625 40.375
+z
+M 52.59375 71.296875
+L 52.59375 62.3125
+Q 48.875 64.0625 45.09375 64.984375
+Q 41.3125 65.921875 37.59375 65.921875
+Q 27.828125 65.921875 22.671875 59.328125
+Q 17.53125 52.734375 16.796875 39.40625
+Q 19.671875 43.65625 24.015625 45.921875
+Q 28.375 48.1875 33.59375 48.1875
+Q 44.578125 48.1875 50.953125 41.515625
+Q 57.328125 34.859375 57.328125 23.390625
+Q 57.328125 12.15625 50.6875 5.359375
+Q 44.046875 -1.421875 33.015625 -1.421875
+Q 20.359375 -1.421875 13.671875 8.265625
+Q 6.984375 17.96875 6.984375 36.375
+Q 6.984375 53.65625 15.1875 63.9375
+Q 23.390625 74.21875 37.203125 74.21875
+Q 40.921875 74.21875 44.703125 73.484375
+Q 48.484375 72.75 52.59375 71.296875
+z
+" id="DejaVuSans-54"/>
+ </defs>
+ <g transform="translate(421.924388 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-54"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_5">
+ <g id="line2d_9">
+ <path clip-path="url(#p8eb76c013d)" d="M 555.379184 368.44
+L 555.379184 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_10">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="555.379184" xlink:href="#mdc80396e89" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- 800 -->
+ <defs>
+ <path d="M 31.78125 34.625
+Q 24.75 34.625 20.71875 30.859375
+Q 16.703125 27.09375 16.703125 20.515625
+Q 16.703125 13.921875 20.71875 10.15625
+Q 24.75 6.390625 31.78125 6.390625
+Q 38.8125 6.390625 42.859375 10.171875
+Q 46.921875 13.96875 46.921875 20.515625
+Q 46.921875 27.09375 42.890625 30.859375
+Q 38.875 34.625 31.78125 34.625
+z
+M 21.921875 38.8125
+Q 15.578125 40.375 12.03125 44.71875
+Q 8.5 49.078125 8.5 55.328125
+Q 8.5 64.0625 14.71875 69.140625
+Q 20.953125 74.21875 31.78125 74.21875
+Q 42.671875 74.21875 48.875 69.140625
+Q 55.078125 64.0625 55.078125 55.328125
+Q 55.078125 49.078125 51.53125 44.71875
+Q 48 40.375 41.703125 38.8125
+Q 48.828125 37.15625 52.796875 32.3125
+Q 56.78125 27.484375 56.78125 20.515625
+Q 56.78125 9.90625 50.3125 4.234375
+Q 43.84375 -1.421875 31.78125 -1.421875
+Q 19.734375 -1.421875 13.25 4.234375
+Q 6.78125 9.90625 6.78125 20.515625
+Q 6.78125 27.484375 10.78125 32.3125
+Q 14.796875 37.15625 21.921875 38.8125
+z
+M 18.3125 54.390625
+Q 18.3125 48.734375 21.84375 45.5625
+Q 25.390625 42.390625 31.78125 42.390625
+Q 38.140625 42.390625 41.71875 45.5625
+Q 45.3125 48.734375 45.3125 54.390625
+Q 45.3125 60.0625 41.71875 63.234375
+Q 38.140625 66.40625 31.78125 66.40625
+Q 25.390625 66.40625 21.84375 63.234375
+Q 18.3125 60.0625 18.3125 54.390625
+z
+" id="DejaVuSans-56"/>
+ </defs>
+ <g transform="translate(545.835434 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-56"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_6">
+ <g id="line2d_11">
+ <path clip-path="url(#p8eb76c013d)" d="M 679.29023 368.44
+L 679.29023 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_12">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="679.29023" xlink:href="#mdc80396e89" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- 1000 -->
+ <defs>
+ <path d="M 12.40625 8.296875
+L 28.515625 8.296875
+L 28.515625 63.921875
+L 10.984375 60.40625
+L 10.984375 69.390625
+L 28.421875 72.90625
+L 38.28125 72.90625
+L 38.28125 8.296875
+L 54.390625 8.296875
+L 54.390625 0
+L 12.40625 0
+z
+" id="DejaVuSans-49"/>
+ </defs>
+ <g transform="translate(666.56523 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_7">
+ <!-- Samples -->
+ <defs>
+ <path d="M 53.515625 70.515625
+L 53.515625 60.890625
+Q 47.90625 63.578125 42.921875 64.890625
+Q 37.9375 66.21875 33.296875 66.21875
+Q 25.25 66.21875 20.875 63.09375
+Q 16.5 59.96875 16.5 54.203125
+Q 16.5 49.359375 19.40625 46.890625
+Q 22.3125 44.4375 30.421875 42.921875
+L 36.375 41.703125
+Q 47.40625 39.59375 52.65625 34.296875
+Q 57.90625 29 57.90625 20.125
+Q 57.90625 9.515625 50.796875 4.046875
+Q 43.703125 -1.421875 29.984375 -1.421875
+Q 24.8125 -1.421875 18.96875 -0.25
+Q 13.140625 0.921875 6.890625 3.21875
+L 6.890625 13.375
+Q 12.890625 10.015625 18.65625 8.296875
+Q 24.421875 6.59375 29.984375 6.59375
+Q 38.421875 6.59375 43.015625 9.90625
+Q 47.609375 13.234375 47.609375 19.390625
+Q 47.609375 24.75 44.3125 27.78125
+Q 41.015625 30.8125 33.5 32.328125
+L 27.484375 33.5
+Q 16.453125 35.6875 11.515625 40.375
+Q 6.59375 45.0625 6.59375 53.421875
+Q 6.59375 63.09375 13.40625 68.65625
+Q 20.21875 74.21875 32.171875 74.21875
+Q 37.3125 74.21875 42.625 73.28125
+Q 47.953125 72.359375 53.515625 70.515625
+z
+" id="DejaVuSans-83"/>
+ <path d="M 34.28125 27.484375
+Q 23.390625 27.484375 19.1875 25
+Q 14.984375 22.515625 14.984375 16.5
+Q 14.984375 11.71875 18.140625 8.90625
+Q 21.296875 6.109375 26.703125 6.109375
+Q 34.1875 6.109375 38.703125 11.40625
+Q 43.21875 16.703125 43.21875 25.484375
+L 43.21875 27.484375
+z
+M 52.203125 31.203125
+L 52.203125 0
+L 43.21875 0
+L 43.21875 8.296875
+Q 40.140625 3.328125 35.546875 0.953125
+Q 30.953125 -1.421875 24.3125 -1.421875
+Q 15.921875 -1.421875 10.953125 3.296875
+Q 6 8.015625 6 15.921875
+Q 6 25.140625 12.171875 29.828125
+Q 18.359375 34.515625 30.609375 34.515625
+L 43.21875 34.515625
+L 43.21875 35.40625
+Q 43.21875 41.609375 39.140625 45
+Q 35.0625 48.390625 27.6875 48.390625
+Q 23 48.390625 18.546875 47.265625
+Q 14.109375 46.140625 10.015625 43.890625
+L 10.015625 52.203125
+Q 14.9375 54.109375 19.578125 55.046875
+Q 24.21875 56 28.609375 56
+Q 40.484375 56 46.34375 49.84375
+Q 52.203125 43.703125 52.203125 31.203125
+z
+" id="DejaVuSans-97"/>
+ <path d="M 52 44.1875
+Q 55.375 50.25 60.0625 53.125
+Q 64.75 56 71.09375 56
+Q 79.640625 56 84.28125 50.015625
+Q 88.921875 44.046875 88.921875 33.015625
+L 88.921875 0
+L 79.890625 0
+L 79.890625 32.71875
+Q 79.890625 40.578125 77.09375 44.375
+Q 74.3125 48.1875 68.609375 48.1875
+Q 61.625 48.1875 57.5625 43.546875
+Q 53.515625 38.921875 53.515625 30.90625
+L 53.515625 0
+L 44.484375 0
+L 44.484375 32.71875
+Q 44.484375 40.625 41.703125 44.40625
+Q 38.921875 48.1875 33.109375 48.1875
+Q 26.21875 48.1875 22.15625 43.53125
+Q 18.109375 38.875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.1875 51.21875 25.484375 53.609375
+Q 29.78125 56 35.6875 56
+Q 41.65625 56 45.828125 52.96875
+Q 50 49.953125 52 44.1875
+z
+" id="DejaVuSans-109"/>
+ <path d="M 18.109375 8.203125
+L 18.109375 -20.796875
+L 9.078125 -20.796875
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+z
+M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+" id="DejaVuSans-112"/>
+ <path d="M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 0
+L 9.421875 0
+z
+" id="DejaVuSans-108"/>
+ <path d="M 56.203125 29.59375
+L 56.203125 25.203125
+L 14.890625 25.203125
+Q 15.484375 15.921875 20.484375 11.0625
+Q 25.484375 6.203125 34.421875 6.203125
+Q 39.59375 6.203125 44.453125 7.46875
+Q 49.3125 8.734375 54.109375 11.28125
+L 54.109375 2.78125
+Q 49.265625 0.734375 44.1875 -0.34375
+Q 39.109375 -1.421875 33.890625 -1.421875
+Q 20.796875 -1.421875 13.15625 6.1875
+Q 5.515625 13.8125 5.515625 26.8125
+Q 5.515625 40.234375 12.765625 48.109375
+Q 20.015625 56 32.328125 56
+Q 43.359375 56 49.78125 48.890625
+Q 56.203125 41.796875 56.203125 29.59375
+z
+M 47.21875 32.234375
+Q 47.125 39.59375 43.09375 43.984375
+Q 39.0625 48.390625 32.421875 48.390625
+Q 24.90625 48.390625 20.390625 44.140625
+Q 15.875 39.890625 15.1875 32.171875
+z
+" id="DejaVuSans-101"/>
+ <path d="M 44.28125 53.078125
+L 44.28125 44.578125
+Q 40.484375 46.53125 36.375 47.5
+Q 32.28125 48.484375 27.875 48.484375
+Q 21.1875 48.484375 17.84375 46.4375
+Q 14.5 44.390625 14.5 40.28125
+Q 14.5 37.15625 16.890625 35.375
+Q 19.28125 33.59375 26.515625 31.984375
+L 29.59375 31.296875
+Q 39.15625 29.25 43.1875 25.515625
+Q 47.21875 21.78125 47.21875 15.09375
+Q 47.21875 7.46875 41.1875 3.015625
+Q 35.15625 -1.421875 24.609375 -1.421875
+Q 20.21875 -1.421875 15.453125 -0.5625
+Q 10.6875 0.296875 5.421875 2
+L 5.421875 11.28125
+Q 10.40625 8.6875 15.234375 7.390625
+Q 20.0625 6.109375 24.8125 6.109375
+Q 31.15625 6.109375 34.5625 8.28125
+Q 37.984375 10.453125 37.984375 14.40625
+Q 37.984375 18.0625 35.515625 20.015625
+Q 33.0625 21.96875 24.703125 23.78125
+L 21.578125 24.515625
+Q 13.234375 26.265625 9.515625 29.90625
+Q 5.8125 33.546875 5.8125 39.890625
+Q 5.8125 47.609375 11.28125 51.796875
+Q 16.75 56 26.8125 56
+Q 31.78125 56 36.171875 55.265625
+Q 40.578125 54.546875 44.28125 53.078125
+z
+" id="DejaVuSans-115"/>
+ </defs>
+ <g transform="translate(355.284375 396.716563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-83"/>
+ <use x="63.476562" xlink:href="#DejaVuSans-97"/>
+ <use x="124.755859" xlink:href="#DejaVuSans-109"/>
+ <use x="222.167969" xlink:href="#DejaVuSans-112"/>
+ <use x="285.644531" xlink:href="#DejaVuSans-108"/>
+ <use x="313.427734" xlink:href="#DejaVuSans-101"/>
+ <use x="374.951172" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_2">
+ <g id="ytick_1">
+ <g id="line2d_13">
+ <path clip-path="url(#p8eb76c013d)" d="M 59.735 366.809211
+L 693.54 366.809211
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_14">
+ <defs>
+ <path d="M 0 0
+L -3.5 0
+" id="m4e7416062d" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="366.809211"/>
+ </g>
+ </g>
+ <g id="text_8">
+ <!-- −0.6 -->
+ <defs>
+ <path d="M 10.59375 35.5
+L 73.1875 35.5
+L 73.1875 27.203125
+L 10.59375 27.203125
+z
+" id="DejaVuSans-8722"/>
+ <path d="M 10.6875 12.40625
+L 21 12.40625
+L 21 0
+L 10.6875 0
+z
+" id="DejaVuSans-46"/>
+ </defs>
+ <g transform="translate(28.452187 370.60843)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-48"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-46"/>
+ <use x="179.199219" xlink:href="#DejaVuSans-54"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_2">
+ <g id="line2d_15">
+ <path clip-path="url(#p8eb76c013d)" d="M 59.735 320.804626
+L 693.54 320.804626
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_16">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="320.804626"/>
+ </g>
+ </g>
+ <g id="text_9">
+ <!-- −0.4 -->
+ <g transform="translate(28.452187 324.603845)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-48"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-46"/>
+ <use x="179.199219" xlink:href="#DejaVuSans-52"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_3">
+ <g id="line2d_17">
+ <path clip-path="url(#p8eb76c013d)" d="M 59.735 274.800041
+L 693.54 274.800041
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_18">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="274.800041"/>
+ </g>
+ </g>
+ <g id="text_10">
+ <!-- −0.2 -->
+ <g transform="translate(28.452187 278.59926)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-48"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-46"/>
+ <use x="179.199219" xlink:href="#DejaVuSans-50"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_4">
+ <g id="line2d_19">
+ <path clip-path="url(#p8eb76c013d)" d="M 59.735 228.795456
+L 693.54 228.795456
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_20">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="228.795456"/>
+ </g>
+ </g>
+ <g id="text_11">
+ <!-- 0.0 -->
+ <g transform="translate(36.831875 232.594675)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_5">
+ <g id="line2d_21">
+ <path clip-path="url(#p8eb76c013d)" d="M 59.735 182.790872
+L 693.54 182.790872
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_22">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="182.790872"/>
+ </g>
+ </g>
+ <g id="text_12">
+ <!-- 0.2 -->
+ <g transform="translate(36.831875 186.59009)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-50"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_6">
+ <g id="line2d_23">
+ <path clip-path="url(#p8eb76c013d)" d="M 59.735 136.786287
+L 693.54 136.786287
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_24">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="136.786287"/>
+ </g>
+ </g>
+ <g id="text_13">
+ <!-- 0.4 -->
+ <g transform="translate(36.831875 140.585505)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-52"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_7">
+ <g id="line2d_25">
+ <path clip-path="url(#p8eb76c013d)" d="M 59.735 90.781702
+L 693.54 90.781702
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_26">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="90.781702"/>
+ </g>
+ </g>
+ <g id="text_14">
+ <!-- 0.6 -->
+ <g transform="translate(36.831875 94.580921)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-54"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_15">
+ <!-- Amplitude -->
+ <defs>
+ <path d="M 34.1875 63.1875
+L 20.796875 26.90625
+L 47.609375 26.90625
+z
+M 28.609375 72.90625
+L 39.796875 72.90625
+L 67.578125 0
+L 57.328125 0
+L 50.6875 18.703125
+L 17.828125 18.703125
+L 11.1875 0
+L 0.78125 0
+z
+" id="DejaVuSans-65"/>
+ <path d="M 9.421875 54.6875
+L 18.40625 54.6875
+L 18.40625 0
+L 9.421875 0
+z
+M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 64.59375
+L 9.421875 64.59375
+z
+" id="DejaVuSans-105"/>
+ <path d="M 18.3125 70.21875
+L 18.3125 54.6875
+L 36.8125 54.6875
+L 36.8125 47.703125
+L 18.3125 47.703125
+L 18.3125 18.015625
+Q 18.3125 11.328125 20.140625 9.421875
+Q 21.96875 7.515625 27.59375 7.515625
+L 36.8125 7.515625
+L 36.8125 0
+L 27.59375 0
+Q 17.1875 0 13.234375 3.875
+Q 9.28125 7.765625 9.28125 18.015625
+L 9.28125 47.703125
+L 2.6875 47.703125
+L 2.6875 54.6875
+L 9.28125 54.6875
+L 9.28125 70.21875
+z
+" id="DejaVuSans-116"/>
+ <path d="M 8.5 21.578125
+L 8.5 54.6875
+L 17.484375 54.6875
+L 17.484375 21.921875
+Q 17.484375 14.15625 20.5 10.265625
+Q 23.53125 6.390625 29.59375 6.390625
+Q 36.859375 6.390625 41.078125 11.03125
+Q 45.3125 15.671875 45.3125 23.6875
+L 45.3125 54.6875
+L 54.296875 54.6875
+L 54.296875 0
+L 45.3125 0
+L 45.3125 8.40625
+Q 42.046875 3.421875 37.71875 1
+Q 33.40625 -1.421875 27.6875 -1.421875
+Q 18.265625 -1.421875 13.375 4.4375
+Q 8.5 10.296875 8.5 21.578125
+z
+M 31.109375 56
+z
+" id="DejaVuSans-117"/>
+ <path d="M 45.40625 46.390625
+L 45.40625 75.984375
+L 54.390625 75.984375
+L 54.390625 0
+L 45.40625 0
+L 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+z
+M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+" id="DejaVuSans-100"/>
+ </defs>
+ <g transform="translate(22.3725 247.642656)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-65"/>
+ <use x="68.408203" xlink:href="#DejaVuSans-109"/>
+ <use x="165.820312" xlink:href="#DejaVuSans-112"/>
+ <use x="229.296875" xlink:href="#DejaVuSans-108"/>
+ <use x="257.080078" xlink:href="#DejaVuSans-105"/>
+ <use x="284.863281" xlink:href="#DejaVuSans-116"/>
+ <use x="324.072266" xlink:href="#DejaVuSans-117"/>
+ <use x="387.451172" xlink:href="#DejaVuSans-100"/>
+ <use x="450.927734" xlink:href="#DejaVuSans-101"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_27">
+ <path clip-path="url(#p8eb76c013d)" d="M 59.735 89.544762
+L 60.354555 368.44
+L 60.97411 298.012617
+L 61.593666 251.131118
+L 62.213221 221.995848
+L 62.832776 205.91455
+L 63.452331 199.134344
+L 64.071887 198.694138
+L 64.691442 202.295467
+L 65.930552 215.081763
+L 67.169663 228.442761
+L 67.789218 233.883025
+L 68.408773 238.14885
+L 69.028328 241.163293
+L 69.647884 242.951115
+L 70.267439 243.608656
+L 70.886994 243.279324
+L 71.506549 242.133922
+L 72.126105 240.355163
+L 73.365215 235.619517
+L 75.223881 227.926224
+L 76.462991 223.764496
+L 77.082546 222.188826
+L 77.702102 220.995335
+L 78.321657 220.194511
+L 78.941212 219.780723
+L 79.560767 219.734699
+L 80.180323 220.026064
+L 80.799878 220.615843
+L 81.419433 221.458869
+L 82.658543 223.706314
+L 86.375875 231.438166
+L 87.614985 233.297785
+L 88.234541 233.980459
+L 88.854096 234.484559
+L 89.473651 234.806756
+L 90.093206 234.948895
+L 90.712761 234.917507
+L 91.332317 234.72325
+L 91.951872 234.3803
+L 93.190982 233.318781
+L 94.430093 231.892319
+L 98.766979 226.485823
+L 100.00609 225.414775
+L 101.2452 224.72198
+L 102.484311 224.435766
+L 103.723421 224.546697
+L 104.962532 225.012593
+L 106.201642 225.765579
+L 108.060308 227.24408
+L 111.158084 229.859967
+L 112.397195 230.713327
+L 113.636305 231.362228
+L 114.875415 231.770876
+L 116.114526 231.924853
+L 117.353636 231.830332
+L 118.592747 231.511833
+L 120.451413 230.703569
+L 123.549189 228.921888
+L 126.02741 227.607403
+L 127.886075 226.924509
+L 129.125186 226.664501
+L 130.364296 226.572141
+L 131.603407 226.643103
+L 133.462072 227.01899
+L 135.320738 227.635368
+L 140.896735 229.734296
+L 142.755401 230.159015
+L 144.614066 230.340101
+L 146.472732 230.273156
+L 148.331398 229.991484
+L 151.429174 229.221935
+L 155.146505 228.26028
+L 157.624726 227.853504
+L 159.483392 227.737307
+L 161.961613 227.837556
+L 164.439834 228.168709
+L 171.874497 229.375612
+L 174.352717 229.508471
+L 176.830938 229.445162
+L 180.54827 229.080908
+L 186.743822 228.413845
+L 189.841598 228.317451
+L 193.55893 228.45666
+L 204.091369 229.110702
+L 208.428255 229.02599
+L 220.199804 228.585714
+L 225.775802 228.720692
+L 234.449575 228.935009
+L 241.264682 228.833053
+L 250.558011 228.704427
+L 298.263763 228.815439
+L 333.578412 228.793939
+L 393.675269 228.795125
+L 693.54 228.795456
+L 693.54 228.795456
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_3">
+ <path d="M 59.735 368.44
+L 59.735 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_4">
+ <path d="M 693.54 368.44
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_5">
+ <path d="M 59.735 368.44
+L 693.54 368.44
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_6">
+ <path d="M 59.735 75.6
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_2">
+ <g id="patch_7">
+ <path d="M 59.735 703.24
+L 693.54 703.24
+L 693.54 410.4
+L 59.735 410.4
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_3">
+ <g id="xtick_7">
+ <g id="line2d_28">
+ <path clip-path="url(#p17d9798417)" d="M 59.735 703.24
+L 59.735 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_29">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_16">
+ <!-- 10Hz -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 19.671875 72.90625
+L 19.671875 43.015625
+L 55.515625 43.015625
+L 55.515625 72.90625
+L 65.375 72.90625
+L 65.375 0
+L 55.515625 0
+L 55.515625 34.71875
+L 19.671875 34.71875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-72"/>
+ <path d="M 5.515625 54.6875
+L 48.1875 54.6875
+L 48.1875 46.484375
+L 14.40625 7.171875
+L 48.1875 7.171875
+L 48.1875 0
+L 4.296875 0
+L 4.296875 8.203125
+L 38.09375 47.515625
+L 5.515625 47.515625
+z
+" id="DejaVuSans-122"/>
+ </defs>
+ <g transform="translate(46.988125 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_8">
+ <g id="line2d_30">
+ <path clip-path="url(#p17d9798417)" d="M 59.735 703.24
+L 59.735 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_31">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_9">
+ <g id="line2d_32">
+ <path clip-path="url(#p17d9798417)" d="M 116.179495 703.24
+L 116.179495 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_33">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="116.179495" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_10">
+ <g id="line2d_34">
+ <path clip-path="url(#p17d9798417)" d="M 149.197408 703.24
+L 149.197408 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_35">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="149.197408" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_11">
+ <g id="line2d_36">
+ <path clip-path="url(#p17d9798417)" d="M 172.62399 703.24
+L 172.62399 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_37">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="172.62399" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_12">
+ <g id="line2d_38">
+ <path clip-path="url(#p17d9798417)" d="M 190.795059 703.24
+L 190.795059 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_39">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="190.795059" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_13">
+ <g id="line2d_40">
+ <path clip-path="url(#p17d9798417)" d="M 205.641903 703.24
+L 205.641903 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_41">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="205.641903" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_14">
+ <g id="line2d_42">
+ <path clip-path="url(#p17d9798417)" d="M 218.194731 703.24
+L 218.194731 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_43">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="218.194731" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_15">
+ <g id="line2d_44">
+ <path clip-path="url(#p17d9798417)" d="M 229.068485 703.24
+L 229.068485 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_45">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="229.068485" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_16">
+ <g id="line2d_46">
+ <path clip-path="url(#p17d9798417)" d="M 238.659816 703.24
+L 238.659816 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_47">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="238.659816" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_17">
+ <g id="line2d_48">
+ <path clip-path="url(#p17d9798417)" d="M 247.239554 703.24
+L 247.239554 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_49">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.239554" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_17">
+ <!-- 100Hz -->
+ <g transform="translate(231.311429 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_18">
+ <g id="line2d_50">
+ <path clip-path="url(#p17d9798417)" d="M 247.239554 703.24
+L 247.239554 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_51">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.239554" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_19">
+ <g id="line2d_52">
+ <path clip-path="url(#p17d9798417)" d="M 303.684049 703.24
+L 303.684049 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_53">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="303.684049" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_20">
+ <g id="line2d_54">
+ <path clip-path="url(#p17d9798417)" d="M 336.701962 703.24
+L 336.701962 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_55">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="336.701962" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_21">
+ <g id="line2d_56">
+ <path clip-path="url(#p17d9798417)" d="M 360.128544 703.24
+L 360.128544 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_57">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="360.128544" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_22">
+ <g id="line2d_58">
+ <path clip-path="url(#p17d9798417)" d="M 378.299612 703.24
+L 378.299612 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_59">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="378.299612" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_23">
+ <g id="line2d_60">
+ <path clip-path="url(#p17d9798417)" d="M 393.146456 703.24
+L 393.146456 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_61">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="393.146456" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_24">
+ <g id="line2d_62">
+ <path clip-path="url(#p17d9798417)" d="M 405.699284 703.24
+L 405.699284 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_63">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="405.699284" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_25">
+ <g id="line2d_64">
+ <path clip-path="url(#p17d9798417)" d="M 416.573038 703.24
+L 416.573038 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_65">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="416.573038" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_26">
+ <g id="line2d_66">
+ <path clip-path="url(#p17d9798417)" d="M 426.164369 703.24
+L 426.164369 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_67">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="426.164369" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_27">
+ <g id="line2d_68">
+ <path clip-path="url(#p17d9798417)" d="M 434.744107 703.24
+L 434.744107 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_69">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="434.744107" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_18">
+ <!-- 1kHz -->
+ <defs>
+ <path d="M 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 31.109375
+L 44.921875 54.6875
+L 56.390625 54.6875
+L 27.390625 29.109375
+L 57.625 0
+L 45.90625 0
+L 18.109375 26.703125
+L 18.109375 0
+L 9.078125 0
+z
+" id="DejaVuSans-107"/>
+ </defs>
+ <g transform="translate(422.28317 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_28">
+ <g id="line2d_70">
+ <path clip-path="url(#p17d9798417)" d="M 434.744107 703.24
+L 434.744107 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_71">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="434.744107" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_29">
+ <g id="line2d_72">
+ <path clip-path="url(#p17d9798417)" d="M 491.188602 703.24
+L 491.188602 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_73">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="491.188602" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_30">
+ <g id="line2d_74">
+ <path clip-path="url(#p17d9798417)" d="M 524.206515 703.24
+L 524.206515 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_75">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.206515" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_31">
+ <g id="line2d_76">
+ <path clip-path="url(#p17d9798417)" d="M 547.633097 703.24
+L 547.633097 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_77">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.633097" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_32">
+ <g id="line2d_78">
+ <path clip-path="url(#p17d9798417)" d="M 565.804166 703.24
+L 565.804166 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_79">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="565.804166" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_33">
+ <g id="line2d_80">
+ <path clip-path="url(#p17d9798417)" d="M 580.65101 703.24
+L 580.65101 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_81">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="580.65101" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_34">
+ <g id="line2d_82">
+ <path clip-path="url(#p17d9798417)" d="M 593.203838 703.24
+L 593.203838 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_83">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.203838" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_35">
+ <g id="line2d_84">
+ <path clip-path="url(#p17d9798417)" d="M 604.077592 703.24
+L 604.077592 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_85">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.077592" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_36">
+ <g id="line2d_86">
+ <path clip-path="url(#p17d9798417)" d="M 613.668923 703.24
+L 613.668923 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_87">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="613.668923" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_37">
+ <g id="line2d_88">
+ <path clip-path="url(#p17d9798417)" d="M 622.248661 703.24
+L 622.248661 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_89">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.248661" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_19">
+ <!-- 10kHz -->
+ <g transform="translate(606.606473 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_38">
+ <g id="line2d_90">
+ <path clip-path="url(#p17d9798417)" d="M 622.248661 703.24
+L 622.248661 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_91">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.248661" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_39">
+ <g id="line2d_92">
+ <path clip-path="url(#p17d9798417)" d="M 678.693156 703.24
+L 678.693156 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_93">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.693156" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_40">
+ <g id="line2d_94">
+ <path clip-path="url(#p17d9798417)" d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_95">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#mdc80396e89" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_20">
+ <!-- 24kHz -->
+ <g transform="translate(677.897813 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_21">
+ <!-- Frequency (Hz) -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 51.703125 72.90625
+L 51.703125 64.59375
+L 19.671875 64.59375
+L 19.671875 43.109375
+L 48.578125 43.109375
+L 48.578125 34.8125
+L 19.671875 34.8125
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-70"/>
+ <path d="M 41.109375 46.296875
+Q 39.59375 47.171875 37.8125 47.578125
+Q 36.03125 48 33.890625 48
+Q 26.265625 48 22.1875 43.046875
+Q 18.109375 38.09375 18.109375 28.8125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 20.953125 51.171875 25.484375 53.578125
+Q 30.03125 56 36.53125 56
+Q 37.453125 56 38.578125 55.875
+Q 39.703125 55.765625 41.0625 55.515625
+z
+" id="DejaVuSans-114"/>
+ <path d="M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+M 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+L 45.40625 54.6875
+L 54.390625 54.6875
+L 54.390625 -20.796875
+L 45.40625 -20.796875
+z
+" id="DejaVuSans-113"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-110"/>
+ <path d="M 48.78125 52.59375
+L 48.78125 44.1875
+Q 44.96875 46.296875 41.140625 47.34375
+Q 37.3125 48.390625 33.40625 48.390625
+Q 24.65625 48.390625 19.8125 42.84375
+Q 14.984375 37.3125 14.984375 27.296875
+Q 14.984375 17.28125 19.8125 11.734375
+Q 24.65625 6.203125 33.40625 6.203125
+Q 37.3125 6.203125 41.140625 7.25
+Q 44.96875 8.296875 48.78125 10.40625
+L 48.78125 2.09375
+Q 45.015625 0.34375 40.984375 -0.53125
+Q 36.96875 -1.421875 32.421875 -1.421875
+Q 20.0625 -1.421875 12.78125 6.34375
+Q 5.515625 14.109375 5.515625 27.296875
+Q 5.515625 40.671875 12.859375 48.328125
+Q 20.21875 56 33.015625 56
+Q 37.15625 56 41.109375 55.140625
+Q 45.0625 54.296875 48.78125 52.59375
+z
+" id="DejaVuSans-99"/>
+ <path d="M 32.171875 -5.078125
+Q 28.375 -14.84375 24.75 -17.8125
+Q 21.140625 -20.796875 15.09375 -20.796875
+L 7.90625 -20.796875
+L 7.90625 -13.28125
+L 13.1875 -13.28125
+Q 16.890625 -13.28125 18.9375 -11.515625
+Q 21 -9.765625 23.484375 -3.21875
+L 25.09375 0.875
+L 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 11.921875
+L 46.6875 54.6875
+L 56.203125 54.6875
+z
+" id="DejaVuSans-121"/>
+ <path id="DejaVuSans-32"/>
+ <path d="M 31 75.875
+Q 24.46875 64.65625 21.28125 53.65625
+Q 18.109375 42.671875 18.109375 31.390625
+Q 18.109375 20.125 21.3125 9.0625
+Q 24.515625 -2 31 -13.1875
+L 23.1875 -13.1875
+Q 15.875 -1.703125 12.234375 9.375
+Q 8.59375 20.453125 8.59375 31.390625
+Q 8.59375 42.28125 12.203125 53.3125
+Q 15.828125 64.359375 23.1875 75.875
+z
+" id="DejaVuSans-40"/>
+ <path d="M 8.015625 75.875
+L 15.828125 75.875
+Q 23.140625 64.359375 26.78125 53.3125
+Q 30.421875 42.28125 30.421875 31.390625
+Q 30.421875 20.453125 26.78125 9.375
+Q 23.140625 -1.703125 15.828125 -13.1875
+L 8.015625 -13.1875
+Q 14.5 -2 17.703125 9.0625
+Q 20.90625 20.125 20.90625 31.390625
+Q 20.90625 42.671875 17.703125 53.65625
+Q 14.5 64.65625 8.015625 75.875
+z
+" id="DejaVuSans-41"/>
+ </defs>
+ <g transform="translate(338.464844 731.516563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_4">
+ <g id="ytick_8">
+ <g id="line2d_96">
+ <path clip-path="url(#p17d9798417)" d="M 59.735 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_97">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_22">
+ <!-- −160 -->
+ <g transform="translate(25.267812 707.039219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-54"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_9">
+ <g id="line2d_98">
+ <path clip-path="url(#p17d9798417)" d="M 59.735 668.788235
+L 693.54 668.788235
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_99">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="668.788235"/>
+ </g>
+ </g>
+ <g id="text_23">
+ <!-- −140 -->
+ <g transform="translate(25.267812 672.587454)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-52"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_10">
+ <g id="line2d_100">
+ <path clip-path="url(#p17d9798417)" d="M 59.735 634.336471
+L 693.54 634.336471
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_101">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="634.336471"/>
+ </g>
+ </g>
+ <g id="text_24">
+ <!-- −120 -->
+ <g transform="translate(25.267812 638.135689)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-50"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_11">
+ <g id="line2d_102">
+ <path clip-path="url(#p17d9798417)" d="M 59.735 599.884706
+L 693.54 599.884706
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_103">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="599.884706"/>
+ </g>
+ </g>
+ <g id="text_25">
+ <!-- −100 -->
+ <g transform="translate(25.267812 603.683925)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_12">
+ <g id="line2d_104">
+ <path clip-path="url(#p17d9798417)" d="M 59.735 565.432941
+L 693.54 565.432941
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_105">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="565.432941"/>
+ </g>
+ </g>
+ <g id="text_26">
+ <!-- −80 -->
+ <g transform="translate(31.630312 569.23216)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-56"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_13">
+ <g id="line2d_106">
+ <path clip-path="url(#p17d9798417)" d="M 59.735 530.981176
+L 693.54 530.981176
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_107">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="530.981176"/>
+ </g>
+ </g>
+ <g id="text_27">
+ <!-- −60 -->
+ <g transform="translate(31.630312 534.780395)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-54"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_14">
+ <g id="line2d_108">
+ <path clip-path="url(#p17d9798417)" d="M 59.735 496.529412
+L 693.54 496.529412
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_109">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="496.529412"/>
+ </g>
+ </g>
+ <g id="text_28">
+ <!-- −40 -->
+ <g transform="translate(31.630312 500.328631)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-52"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_15">
+ <g id="line2d_110">
+ <path clip-path="url(#p17d9798417)" d="M 59.735 462.077647
+L 693.54 462.077647
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_111">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="462.077647"/>
+ </g>
+ </g>
+ <g id="text_29">
+ <!-- −20 -->
+ <g transform="translate(31.630312 465.876866)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_16">
+ <g id="line2d_112">
+ <path clip-path="url(#p17d9798417)" d="M 59.735 427.625882
+L 693.54 427.625882
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_113">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="427.625882"/>
+ </g>
+ </g>
+ <g id="text_30">
+ <!-- 0 -->
+ <g transform="translate(46.3725 431.425101)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_31">
+ <!-- Gain (dB) -->
+ <defs>
+ <path d="M 59.515625 10.40625
+L 59.515625 29.984375
+L 43.40625 29.984375
+L 43.40625 38.09375
+L 69.28125 38.09375
+L 69.28125 6.78125
+Q 63.578125 2.734375 56.6875 0.65625
+Q 49.8125 -1.421875 42 -1.421875
+Q 24.90625 -1.421875 15.25 8.5625
+Q 5.609375 18.5625 5.609375 36.375
+Q 5.609375 54.25 15.25 64.234375
+Q 24.90625 74.21875 42 74.21875
+Q 49.125 74.21875 55.546875 72.453125
+Q 61.96875 70.703125 67.390625 67.28125
+L 67.390625 56.78125
+Q 61.921875 61.421875 55.765625 63.765625
+Q 49.609375 66.109375 42.828125 66.109375
+Q 29.4375 66.109375 22.71875 58.640625
+Q 16.015625 51.171875 16.015625 36.375
+Q 16.015625 21.625 22.71875 14.15625
+Q 29.4375 6.6875 42.828125 6.6875
+Q 48.046875 6.6875 52.140625 7.59375
+Q 56.25 8.5 59.515625 10.40625
+z
+" id="DejaVuSans-71"/>
+ <path d="M 19.671875 34.8125
+L 19.671875 8.109375
+L 35.5 8.109375
+Q 43.453125 8.109375 47.28125 11.40625
+Q 51.125 14.703125 51.125 21.484375
+Q 51.125 28.328125 47.28125 31.5625
+Q 43.453125 34.8125 35.5 34.8125
+z
+M 19.671875 64.796875
+L 19.671875 42.828125
+L 34.28125 42.828125
+Q 41.5 42.828125 45.03125 45.53125
+Q 48.578125 48.25 48.578125 53.8125
+Q 48.578125 59.328125 45.03125 62.0625
+Q 41.5 64.796875 34.28125 64.796875
+z
+M 9.8125 72.90625
+L 35.015625 72.90625
+Q 46.296875 72.90625 52.390625 68.21875
+Q 58.5 63.53125 58.5 54.890625
+Q 58.5 48.1875 55.375 44.234375
+Q 52.25 40.28125 46.1875 39.3125
+Q 53.46875 37.75 57.5 32.78125
+Q 61.53125 27.828125 61.53125 20.40625
+Q 61.53125 10.640625 54.890625 5.3125
+Q 48.25 0 35.984375 0
+L 9.8125 0
+z
+" id="DejaVuSans-66"/>
+ </defs>
+ <g transform="translate(19.188125 580.411406)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-71"/>
+ <use x="77.490234" xlink:href="#DejaVuSans-97"/>
+ <use x="138.769531" xlink:href="#DejaVuSans-105"/>
+ <use x="166.552734" xlink:href="#DejaVuSans-110"/>
+ <use x="229.931641" xlink:href="#DejaVuSans-32"/>
+ <use x="261.71875" xlink:href="#DejaVuSans-40"/>
+ <use x="300.732422" xlink:href="#DejaVuSans-100"/>
+ <use x="364.208984" xlink:href="#DejaVuSans-66"/>
+ <use x="432.8125" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_114">
+ <path clip-path="url(#p17d9798417)" d="M -1 696.893575
+L 231.110286 696.793665
+L 284.593284 696.613713
+L 287.554781 696.378366
+L 293.173022 695.654059
+L 295.843169 695.68844
+L 298.428535 696.478056
+L 300.934339 698.272249
+L 303.365331 700.428609
+L 305.72585 699.740164
+L 308.019866 695.028645
+L 310.251025 690.042314
+L 312.422679 686.509433
+L 314.537919 684.700981
+L 316.599604 684.648615
+L 318.610378 685.86193
+L 320.572694 685.105094
+L 322.488834 679.205604
+L 324.360921 672.212586
+L 326.190935 666.40442
+L 327.980725 661.829827
+L 329.732023 658.162951
+L 334.770673 648.775837
+L 337.964501 641.528271
+L 341.037779 634.30336
+L 345.440591 624.723256
+L 349.617517 615.611141
+L 358.603401 595.73812
+L 425.311668 448.923408
+L 428.464276 442.59544
+L 430.500187 438.886308
+L 432.486436 435.716071
+L 433.944963 433.746936
+L 435.377824 432.143509
+L 436.785909 430.889419
+L 438.170058 429.943946
+L 439.531074 429.252612
+L 441.311083 428.629019
+L 443.482737 428.170357
+L 446.014512 427.8883
+L 450.066701 427.705972
+L 458.329581 427.632852
+L 518.610992 427.625882
+L 693.520117 427.625882
+L 693.520117 427.625882
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_8">
+ <path d="M 59.735 703.24
+L 59.735 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_9">
+ <path d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_10">
+ <path d="M 59.735 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_11">
+ <path d="M 59.735 410.4
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_3">
+ <g id="patch_12">
+ <path d="M 59.735 1038.04
+L 693.54 1038.04
+L 693.54 745.2
+L 59.735 745.2
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_5">
+ <g id="xtick_41">
+ <g id="line2d_115">
+ <path clip-path="url(#p5fcf182881)" d="M 59.735 1038.04
+L 59.735 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_116">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_32">
+ <!-- 10Hz -->
+ <g transform="translate(46.988125 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_42">
+ <g id="line2d_117">
+ <path clip-path="url(#p5fcf182881)" d="M 59.735 1038.04
+L 59.735 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_118">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_43">
+ <g id="line2d_119">
+ <path clip-path="url(#p5fcf182881)" d="M 116.179495 1038.04
+L 116.179495 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_120">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="116.179495" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_44">
+ <g id="line2d_121">
+ <path clip-path="url(#p5fcf182881)" d="M 149.197408 1038.04
+L 149.197408 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_122">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="149.197408" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_45">
+ <g id="line2d_123">
+ <path clip-path="url(#p5fcf182881)" d="M 172.62399 1038.04
+L 172.62399 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_124">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="172.62399" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_46">
+ <g id="line2d_125">
+ <path clip-path="url(#p5fcf182881)" d="M 190.795059 1038.04
+L 190.795059 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_126">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="190.795059" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_47">
+ <g id="line2d_127">
+ <path clip-path="url(#p5fcf182881)" d="M 205.641903 1038.04
+L 205.641903 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_128">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="205.641903" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_48">
+ <g id="line2d_129">
+ <path clip-path="url(#p5fcf182881)" d="M 218.194731 1038.04
+L 218.194731 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_130">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="218.194731" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_49">
+ <g id="line2d_131">
+ <path clip-path="url(#p5fcf182881)" d="M 229.068485 1038.04
+L 229.068485 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_132">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="229.068485" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_50">
+ <g id="line2d_133">
+ <path clip-path="url(#p5fcf182881)" d="M 238.659816 1038.04
+L 238.659816 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_134">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="238.659816" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_51">
+ <g id="line2d_135">
+ <path clip-path="url(#p5fcf182881)" d="M 247.239554 1038.04
+L 247.239554 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_136">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.239554" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_33">
+ <!-- 100Hz -->
+ <g transform="translate(231.311429 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_52">
+ <g id="line2d_137">
+ <path clip-path="url(#p5fcf182881)" d="M 247.239554 1038.04
+L 247.239554 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_138">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="247.239554" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_53">
+ <g id="line2d_139">
+ <path clip-path="url(#p5fcf182881)" d="M 303.684049 1038.04
+L 303.684049 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_140">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="303.684049" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_54">
+ <g id="line2d_141">
+ <path clip-path="url(#p5fcf182881)" d="M 336.701962 1038.04
+L 336.701962 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_142">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="336.701962" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_55">
+ <g id="line2d_143">
+ <path clip-path="url(#p5fcf182881)" d="M 360.128544 1038.04
+L 360.128544 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_144">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="360.128544" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_56">
+ <g id="line2d_145">
+ <path clip-path="url(#p5fcf182881)" d="M 378.299612 1038.04
+L 378.299612 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_146">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="378.299612" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_57">
+ <g id="line2d_147">
+ <path clip-path="url(#p5fcf182881)" d="M 393.146456 1038.04
+L 393.146456 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_148">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="393.146456" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_58">
+ <g id="line2d_149">
+ <path clip-path="url(#p5fcf182881)" d="M 405.699284 1038.04
+L 405.699284 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_150">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="405.699284" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_59">
+ <g id="line2d_151">
+ <path clip-path="url(#p5fcf182881)" d="M 416.573038 1038.04
+L 416.573038 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_152">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="416.573038" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_60">
+ <g id="line2d_153">
+ <path clip-path="url(#p5fcf182881)" d="M 426.164369 1038.04
+L 426.164369 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_154">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="426.164369" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_61">
+ <g id="line2d_155">
+ <path clip-path="url(#p5fcf182881)" d="M 434.744107 1038.04
+L 434.744107 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_156">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="434.744107" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_34">
+ <!-- 1kHz -->
+ <g transform="translate(422.28317 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_62">
+ <g id="line2d_157">
+ <path clip-path="url(#p5fcf182881)" d="M 434.744107 1038.04
+L 434.744107 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_158">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="434.744107" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_63">
+ <g id="line2d_159">
+ <path clip-path="url(#p5fcf182881)" d="M 491.188602 1038.04
+L 491.188602 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_160">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="491.188602" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_64">
+ <g id="line2d_161">
+ <path clip-path="url(#p5fcf182881)" d="M 524.206515 1038.04
+L 524.206515 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_162">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.206515" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_65">
+ <g id="line2d_163">
+ <path clip-path="url(#p5fcf182881)" d="M 547.633097 1038.04
+L 547.633097 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_164">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.633097" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_66">
+ <g id="line2d_165">
+ <path clip-path="url(#p5fcf182881)" d="M 565.804166 1038.04
+L 565.804166 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_166">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="565.804166" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_67">
+ <g id="line2d_167">
+ <path clip-path="url(#p5fcf182881)" d="M 580.65101 1038.04
+L 580.65101 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_168">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="580.65101" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_68">
+ <g id="line2d_169">
+ <path clip-path="url(#p5fcf182881)" d="M 593.203838 1038.04
+L 593.203838 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_170">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.203838" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_69">
+ <g id="line2d_171">
+ <path clip-path="url(#p5fcf182881)" d="M 604.077592 1038.04
+L 604.077592 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_172">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.077592" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_70">
+ <g id="line2d_173">
+ <path clip-path="url(#p5fcf182881)" d="M 613.668923 1038.04
+L 613.668923 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_174">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="613.668923" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_71">
+ <g id="line2d_175">
+ <path clip-path="url(#p5fcf182881)" d="M 622.248661 1038.04
+L 622.248661 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_176">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.248661" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_35">
+ <!-- 10kHz -->
+ <g transform="translate(606.606473 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_72">
+ <g id="line2d_177">
+ <path clip-path="url(#p5fcf182881)" d="M 622.248661 1038.04
+L 622.248661 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_178">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.248661" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_73">
+ <g id="line2d_179">
+ <path clip-path="url(#p5fcf182881)" d="M 678.693156 1038.04
+L 678.693156 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_180">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.693156" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_74">
+ <g id="line2d_181">
+ <path clip-path="url(#p5fcf182881)" d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_182">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#mdc80396e89" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_36">
+ <!-- 24kHz -->
+ <g transform="translate(677.897813 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_37">
+ <!-- Frequency (Hz) -->
+ <g transform="translate(338.464844 1066.316563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_6">
+ <g id="ytick_17">
+ <g id="line2d_183">
+ <path clip-path="url(#p5fcf182881)" d="M 59.735 1007.214737
+L 693.54 1007.214737
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_184">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="1007.214737"/>
+ </g>
+ </g>
+ <g id="text_38">
+ <!-- −150 -->
+ <defs>
+ <path d="M 10.796875 72.90625
+L 49.515625 72.90625
+L 49.515625 64.59375
+L 19.828125 64.59375
+L 19.828125 46.734375
+Q 21.96875 47.46875 24.109375 47.828125
+Q 26.265625 48.1875 28.421875 48.1875
+Q 40.625 48.1875 47.75 41.5
+Q 54.890625 34.8125 54.890625 23.390625
+Q 54.890625 11.625 47.5625 5.09375
+Q 40.234375 -1.421875 26.90625 -1.421875
+Q 22.3125 -1.421875 17.546875 -0.640625
+Q 12.796875 0.140625 7.71875 1.703125
+L 7.71875 11.625
+Q 12.109375 9.234375 16.796875 8.0625
+Q 21.484375 6.890625 26.703125 6.890625
+Q 35.15625 6.890625 40.078125 11.328125
+Q 45.015625 15.765625 45.015625 23.390625
+Q 45.015625 31 40.078125 35.4375
+Q 35.15625 39.890625 26.703125 39.890625
+Q 22.75 39.890625 18.8125 39.015625
+Q 14.890625 38.140625 10.796875 36.28125
+z
+" id="DejaVuSans-53"/>
+ </defs>
+ <g transform="translate(25.267812 1011.013956)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_18">
+ <g id="line2d_185">
+ <path clip-path="url(#p5fcf182881)" d="M 59.735 968.683158
+L 693.54 968.683158
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_186">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="968.683158"/>
+ </g>
+ </g>
+ <g id="text_39">
+ <!-- −100 -->
+ <g transform="translate(25.267812 972.482377)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_19">
+ <g id="line2d_187">
+ <path clip-path="url(#p5fcf182881)" d="M 59.735 930.151579
+L 693.54 930.151579
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_188">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="930.151579"/>
+ </g>
+ </g>
+ <g id="text_40">
+ <!-- −50 -->
+ <g transform="translate(31.630312 933.950798)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-53"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_20">
+ <g id="line2d_189">
+ <path clip-path="url(#p5fcf182881)" d="M 59.735 891.62
+L 693.54 891.62
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_190">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="891.62"/>
+ </g>
+ </g>
+ <g id="text_41">
+ <!-- 0 -->
+ <g transform="translate(46.3725 895.419219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_21">
+ <g id="line2d_191">
+ <path clip-path="url(#p5fcf182881)" d="M 59.735 853.088421
+L 693.54 853.088421
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_192">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="853.088421"/>
+ </g>
+ </g>
+ <g id="text_42">
+ <!-- 50 -->
+ <g transform="translate(40.01 856.88764)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-53"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_22">
+ <g id="line2d_193">
+ <path clip-path="url(#p5fcf182881)" d="M 59.735 814.556842
+L 693.54 814.556842
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_194">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="814.556842"/>
+ </g>
+ </g>
+ <g id="text_43">
+ <!-- 100 -->
+ <g transform="translate(33.6475 818.356061)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_23">
+ <g id="line2d_195">
+ <path clip-path="url(#p5fcf182881)" d="M 59.735 776.025263
+L 693.54 776.025263
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_196">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="59.735" xlink:href="#m4e7416062d" y="776.025263"/>
+ </g>
+ </g>
+ <g id="text_44">
+ <!-- 150 -->
+ <g transform="translate(33.6475 779.824482)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-53"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_45">
+ <!-- Phase (${\circ}$) -->
+ <defs>
+ <path d="M 19.671875 64.796875
+L 19.671875 37.40625
+L 32.078125 37.40625
+Q 38.96875 37.40625 42.71875 40.96875
+Q 46.484375 44.53125 46.484375 51.125
+Q 46.484375 57.671875 42.71875 61.234375
+Q 38.96875 64.796875 32.078125 64.796875
+z
+M 9.8125 72.90625
+L 32.078125 72.90625
+Q 44.34375 72.90625 50.609375 67.359375
+Q 56.890625 61.8125 56.890625 51.125
+Q 56.890625 40.328125 50.609375 34.8125
+Q 44.34375 29.296875 32.078125 29.296875
+L 19.671875 29.296875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-80"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-104"/>
+ <path d="M 31.296875 40.671875
+Q 27.390625 40.671875 24.703125 37.953125
+Q 22.015625 35.25 22.015625 31.34375
+Q 22.015625 27.484375 24.703125 24.828125
+Q 27.390625 22.171875 31.296875 22.171875
+Q 35.203125 22.171875 37.890625 24.828125
+Q 40.578125 27.484375 40.578125 31.34375
+Q 40.578125 35.203125 37.859375 37.9375
+Q 35.15625 40.671875 31.296875 40.671875
+z
+M 31.296875 46.96875
+Q 34.421875 46.96875 37.296875 45.765625
+Q 40.1875 44.578125 42.28125 42.328125
+Q 44.53125 40.140625 45.65625 37.34375
+Q 46.78125 34.5625 46.78125 31.34375
+Q 46.78125 24.90625 42.265625 20.4375
+Q 37.75 15.96875 31.203125 15.96875
+Q 24.609375 15.96875 20.21875 20.359375
+Q 15.828125 24.75 15.828125 31.34375
+Q 15.828125 37.890625 20.3125 42.421875
+Q 24.8125 46.96875 31.296875 46.96875
+z
+" id="DejaVuSans-8728"/>
+ </defs>
+ <g transform="translate(19.188125 915.17)rotate(-90)scale(0.1 -0.1)">
+ <use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-80"/>
+ <use transform="translate(60.302734 0.015625)" xlink:href="#DejaVuSans-104"/>
+ <use transform="translate(123.681641 0.015625)" xlink:href="#DejaVuSans-97"/>
+ <use transform="translate(184.960938 0.015625)" xlink:href="#DejaVuSans-115"/>
+ <use transform="translate(237.060547 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(298.583984 0.015625)" xlink:href="#DejaVuSans-32"/>
+ <use transform="translate(330.371094 0.015625)" xlink:href="#DejaVuSans-40"/>
+ <use transform="translate(369.384766 0.015625)" xlink:href="#DejaVuSans-8728"/>
+ <use transform="translate(431.982422 0.015625)" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_197">
+ <path clip-path="url(#p5fcf182881)" d="M -1 787.570134
+L 16.20606 787.573313
+L 72.650555 822.240326
+L 105.668468 856.907372
+L 129.09505 891.574459
+L 147.266119 926.241603
+L 162.112963 960.908812
+L 174.665791 995.576102
+L 185.539545 752.816118
+L 195.130876 787.483614
+L 203.710614 822.151241
+L 211.471931 856.819017
+L 218.557458 891.486946
+L 225.075511 926.154993
+L 231.110286 960.823072
+L 236.728527 995.491152
+L 241.98404 752.732193
+L 246.920836 787.401999
+L 251.575371 822.074756
+L 255.978184 856.750642
+L 260.155109 891.424929
+L 264.128199 926.085596
+L 267.916426 960.718335
+L 271.53623 995.324124
+L 275.001953 752.517077
+L 278.326178 787.243828
+L 281.520006 822.176464
+L 287.554781 892.347532
+L 295.843169 992.609847
+L 298.428535 1024.855882
+L 300.934339 781.750956
+L 303.365331 822.432425
+L 305.72585 870.134626
+L 308.019866 911.446985
+L 310.251025 941.35671
+L 312.422679 963.813718
+L 314.537919 980.891536
+L 316.599604 992.061399
+L 318.610378 993.706728
+L 322.488834 971.621932
+L 324.360921 971.061967
+L 326.190935 975.525906
+L 327.980725 981.19515
+L 329.732023 986.276159
+L 331.446448 989.910618
+L 333.125522 991.923746
+L 334.770673 992.836844
+L 336.383244 993.571887
+L 337.964501 994.834065
+L 339.515638 996.785272
+L 342.53199 1001.744304
+L 345.440591 1006.334525
+L 350.963534 1014.052134
+L 353.590607 1018.31103
+L 359.809826 1028.82103
+L 360.998638 753.467294
+L 364.464361 759.823093
+L 368.867174 768.332344
+L 373.044099 776.899656
+L 377.017189 785.564424
+L 380.805416 794.306783
+L 384.42522 803.155218
+L 387.890943 812.104499
+L 392.025445 823.461052
+L 395.960133 835.021467
+L 399.713433 846.815251
+L 403.301334 858.875142
+L 406.737802 871.241698
+L 410.035102 883.967814
+L 413.20407 897.121211
+L 416.254321 910.793015
+L 419.194431 925.104734
+L 422.032077 940.215892
+L 424.233081 953.010258
+L 426.376157 966.542046
+L 428.978046 984.592671
+L 431.499368 1003.814833
+L 434.42539 1027.687953
+L 434.902999 754.225485
+L 439.079925 787.949679
+L 441.750072 807.504345
+L 444.335438 824.602412
+L 446.841242 839.611701
+L 449.272234 852.935664
+L 452.019605 866.786973
+L 455.049989 880.848444
+L 457.971637 893.406037
+L 461.137866 906.083082
+L 464.51728 918.697167
+L 468.079495 931.105093
+L 471.795677 943.19705
+L 475.638926 954.89168
+L 479.308935 965.370114
+L 483.084614 975.515454
+L 486.944682 985.281542
+L 490.869885 994.637871
+L 495.070757 1004.06299
+L 499.281795 1012.950001
+L 503.491114 1021.316508
+L 507.88313 1029.537501
+L 508.077248 752.462119
+L 512.41881 760.095985
+L 516.889317 767.503142
+L 521.456805 774.629964
+L 526.09306 781.440735
+L 530.773491 787.914342
+L 535.47692 794.041216
+L 540.315899 799.97615
+L 545.252695 805.672695
+L 550.254489 811.100977
+L 555.293139 816.244455
+L 560.446799 821.191927
+L 565.77235 825.995325
+L 571.218571 830.606495
+L 576.824906 835.059233
+L 582.537555 839.313407
+L 588.455692 843.44354
+L 594.578159 847.444379
+L 600.956892 851.344576
+L 607.560709 855.121266
+L 614.512787 858.839287
+L 621.834084 862.500884
+L 629.647702 866.157908
+L 638.122805 869.875768
+L 647.600629 873.785406
+L 659.027324 878.24732
+L 691.771413 890.871471
+L 693.520117 891.611497
+L 693.520117 891.611497
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_13">
+ <path d="M 59.735 1038.04
+L 59.735 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_14">
+ <path d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_15">
+ <path d="M 59.735 1038.04
+L 693.54 1038.04
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_16">
+ <path d="M 59.735 745.2
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="text_46">
+ <!-- 12th-order Butterworth filter, highpass 1khz -->
+ <defs>
+ <path d="M 4.890625 31.390625
+L 31.203125 31.390625
+L 31.203125 23.390625
+L 4.890625 23.390625
+z
+" id="DejaVuSans-45"/>
+ <path d="M 30.609375 48.390625
+Q 23.390625 48.390625 19.1875 42.75
+Q 14.984375 37.109375 14.984375 27.296875
+Q 14.984375 17.484375 19.15625 11.84375
+Q 23.34375 6.203125 30.609375 6.203125
+Q 37.796875 6.203125 41.984375 11.859375
+Q 46.1875 17.53125 46.1875 27.296875
+Q 46.1875 37.015625 41.984375 42.703125
+Q 37.796875 48.390625 30.609375 48.390625
+z
+M 30.609375 56
+Q 42.328125 56 49.015625 48.375
+Q 55.71875 40.765625 55.71875 27.296875
+Q 55.71875 13.875 49.015625 6.21875
+Q 42.328125 -1.421875 30.609375 -1.421875
+Q 18.84375 -1.421875 12.171875 6.21875
+Q 5.515625 13.875 5.515625 27.296875
+Q 5.515625 40.765625 12.171875 48.375
+Q 18.84375 56 30.609375 56
+z
+" id="DejaVuSans-111"/>
+ <path d="M 4.203125 54.6875
+L 13.1875 54.6875
+L 24.421875 12.015625
+L 35.59375 54.6875
+L 46.1875 54.6875
+L 57.421875 12.015625
+L 68.609375 54.6875
+L 77.59375 54.6875
+L 63.28125 0
+L 52.6875 0
+L 40.921875 44.828125
+L 29.109375 0
+L 18.5 0
+z
+" id="DejaVuSans-119"/>
+ <path d="M 37.109375 75.984375
+L 37.109375 68.5
+L 28.515625 68.5
+Q 23.6875 68.5 21.796875 66.546875
+Q 19.921875 64.59375 19.921875 59.515625
+L 19.921875 54.6875
+L 34.71875 54.6875
+L 34.71875 47.703125
+L 19.921875 47.703125
+L 19.921875 0
+L 10.890625 0
+L 10.890625 47.703125
+L 2.296875 47.703125
+L 2.296875 54.6875
+L 10.890625 54.6875
+L 10.890625 58.5
+Q 10.890625 67.625 15.140625 71.796875
+Q 19.390625 75.984375 28.609375 75.984375
+z
+" id="DejaVuSans-102"/>
+ <path d="M 11.71875 12.40625
+L 22.015625 12.40625
+L 22.015625 4
+L 14.015625 -11.625
+L 7.71875 -11.625
+L 11.71875 4
+z
+" id="DejaVuSans-44"/>
+ <path d="M 45.40625 27.984375
+Q 45.40625 37.75 41.375 43.109375
+Q 37.359375 48.484375 30.078125 48.484375
+Q 22.859375 48.484375 18.828125 43.109375
+Q 14.796875 37.75 14.796875 27.984375
+Q 14.796875 18.265625 18.828125 12.890625
+Q 22.859375 7.515625 30.078125 7.515625
+Q 37.359375 7.515625 41.375 12.890625
+Q 45.40625 18.265625 45.40625 27.984375
+z
+M 54.390625 6.78125
+Q 54.390625 -7.171875 48.1875 -13.984375
+Q 42 -20.796875 29.203125 -20.796875
+Q 24.46875 -20.796875 20.265625 -20.09375
+Q 16.0625 -19.390625 12.109375 -17.921875
+L 12.109375 -9.1875
+Q 16.0625 -11.328125 19.921875 -12.34375
+Q 23.78125 -13.375 27.78125 -13.375
+Q 36.625 -13.375 41.015625 -8.765625
+Q 45.40625 -4.15625 45.40625 5.171875
+L 45.40625 9.625
+Q 42.625 4.78125 38.28125 2.390625
+Q 33.9375 0 27.875 0
+Q 17.828125 0 11.671875 7.65625
+Q 5.515625 15.328125 5.515625 27.984375
+Q 5.515625 40.671875 11.671875 48.328125
+Q 17.828125 56 27.875 56
+Q 33.9375 56 38.28125 53.609375
+Q 42.625 51.21875 45.40625 46.390625
+L 45.40625 54.6875
+L 54.390625 54.6875
+z
+" id="DejaVuSans-103"/>
+ </defs>
+ <g transform="translate(183.20875 33.7575)scale(0.16 -0.16)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-50"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-116"/>
+ <use x="166.455078" xlink:href="#DejaVuSans-104"/>
+ <use x="229.833984" xlink:href="#DejaVuSans-45"/>
+ <use x="265.933594" xlink:href="#DejaVuSans-111"/>
+ <use x="327.115234" xlink:href="#DejaVuSans-114"/>
+ <use x="368.212891" xlink:href="#DejaVuSans-100"/>
+ <use x="431.689453" xlink:href="#DejaVuSans-101"/>
+ <use x="493.212891" xlink:href="#DejaVuSans-114"/>
+ <use x="534.326172" xlink:href="#DejaVuSans-32"/>
+ <use x="566.113281" xlink:href="#DejaVuSans-66"/>
+ <use x="634.716797" xlink:href="#DejaVuSans-117"/>
+ <use x="698.095703" xlink:href="#DejaVuSans-116"/>
+ <use x="737.304688" xlink:href="#DejaVuSans-116"/>
+ <use x="776.513672" xlink:href="#DejaVuSans-101"/>
+ <use x="838.037109" xlink:href="#DejaVuSans-114"/>
+ <use x="879.150391" xlink:href="#DejaVuSans-119"/>
+ <use x="960.9375" xlink:href="#DejaVuSans-111"/>
+ <use x="1022.119141" xlink:href="#DejaVuSans-114"/>
+ <use x="1063.232422" xlink:href="#DejaVuSans-116"/>
+ <use x="1102.441406" xlink:href="#DejaVuSans-104"/>
+ <use x="1165.820312" xlink:href="#DejaVuSans-32"/>
+ <use x="1197.607422" xlink:href="#DejaVuSans-102"/>
+ <use x="1232.8125" xlink:href="#DejaVuSans-105"/>
+ <use x="1260.595703" xlink:href="#DejaVuSans-108"/>
+ <use x="1288.378906" xlink:href="#DejaVuSans-116"/>
+ <use x="1327.587891" xlink:href="#DejaVuSans-101"/>
+ <use x="1389.111328" xlink:href="#DejaVuSans-114"/>
+ <use x="1430.224609" xlink:href="#DejaVuSans-44"/>
+ <use x="1462.011719" xlink:href="#DejaVuSans-32"/>
+ <use x="1493.798828" xlink:href="#DejaVuSans-104"/>
+ <use x="1557.177734" xlink:href="#DejaVuSans-105"/>
+ <use x="1584.960938" xlink:href="#DejaVuSans-103"/>
+ <use x="1648.4375" xlink:href="#DejaVuSans-104"/>
+ <use x="1711.816406" xlink:href="#DejaVuSans-112"/>
+ <use x="1775.292969" xlink:href="#DejaVuSans-97"/>
+ <use x="1836.572266" xlink:href="#DejaVuSans-115"/>
+ <use x="1888.671875" xlink:href="#DejaVuSans-115"/>
+ <use x="1940.771484" xlink:href="#DejaVuSans-32"/>
+ <use x="1972.558594" xlink:href="#DejaVuSans-49"/>
+ <use x="2036.181641" xlink:href="#DejaVuSans-107"/>
+ <use x="2094.091797" xlink:href="#DejaVuSans-104"/>
+ <use x="2157.470703" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="p8eb76c013d">
+ <rect height="292.84" width="633.805" x="59.735" y="75.6"/>
+ </clipPath>
+ <clipPath id="p17d9798417">
+ <rect height="292.84" width="633.805" x="59.735" y="410.4"/>
+ </clipPath>
+ <clipPath id="p5fcf182881">
+ <rect height="292.84" width="633.805" x="59.735" y="745.2"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/docs/docs/img/butterworth_lowpass12.svg b/docs/docs/img/butterworth_lowpass12.svg
@@ -0,0 +1,4700 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Created with matplotlib (https://matplotlib.org/) -->
+<svg height="1080pt" version="1.1" viewBox="0 0 720 1080" width="720pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+ </style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 1080
+L 720 1080
+L 720 0
+L 0 0
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="axes_1">
+ <g id="patch_2">
+ <path d="M 62.57 368.44
+L 693.54 368.44
+L 693.54 75.6
+L 62.57 75.6
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_1">
+ <g id="xtick_1">
+ <g id="line2d_1">
+ <path clip-path="url(#p85394db85d)" d="M 62.57 368.44
+L 62.57 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_2">
+ <defs>
+ <path d="M 0 0
+L 0 3.5
+" id="m706a904f17" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m706a904f17" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- 0 -->
+ <defs>
+ <path d="M 31.78125 66.40625
+Q 24.171875 66.40625 20.328125 58.90625
+Q 16.5 51.421875 16.5 36.375
+Q 16.5 21.390625 20.328125 13.890625
+Q 24.171875 6.390625 31.78125 6.390625
+Q 39.453125 6.390625 43.28125 13.890625
+Q 47.125 21.390625 47.125 36.375
+Q 47.125 51.421875 43.28125 58.90625
+Q 39.453125 66.40625 31.78125 66.40625
+z
+M 31.78125 74.21875
+Q 44.046875 74.21875 50.515625 64.515625
+Q 56.984375 54.828125 56.984375 36.375
+Q 56.984375 17.96875 50.515625 8.265625
+Q 44.046875 -1.421875 31.78125 -1.421875
+Q 19.53125 -1.421875 13.0625 8.265625
+Q 6.59375 17.96875 6.59375 36.375
+Q 6.59375 54.828125 13.0625 64.515625
+Q 19.53125 74.21875 31.78125 74.21875
+z
+" id="DejaVuSans-48"/>
+ </defs>
+ <g transform="translate(59.38875 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_2">
+ <g id="line2d_3">
+ <path clip-path="url(#p85394db85d)" d="M 185.926794 368.44
+L 185.926794 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_4">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="185.926794" xlink:href="#m706a904f17" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- 200 -->
+ <defs>
+ <path d="M 19.1875 8.296875
+L 53.609375 8.296875
+L 53.609375 0
+L 7.328125 0
+L 7.328125 8.296875
+Q 12.9375 14.109375 22.625 23.890625
+Q 32.328125 33.6875 34.8125 36.53125
+Q 39.546875 41.84375 41.421875 45.53125
+Q 43.3125 49.21875 43.3125 52.78125
+Q 43.3125 58.59375 39.234375 62.25
+Q 35.15625 65.921875 28.609375 65.921875
+Q 23.96875 65.921875 18.8125 64.3125
+Q 13.671875 62.703125 7.8125 59.421875
+L 7.8125 69.390625
+Q 13.765625 71.78125 18.9375 73
+Q 24.125 74.21875 28.421875 74.21875
+Q 39.75 74.21875 46.484375 68.546875
+Q 53.21875 62.890625 53.21875 53.421875
+Q 53.21875 48.921875 51.53125 44.890625
+Q 49.859375 40.875 45.40625 35.40625
+Q 44.1875 33.984375 37.640625 27.21875
+Q 31.109375 20.453125 19.1875 8.296875
+z
+" id="DejaVuSans-50"/>
+ </defs>
+ <g transform="translate(176.383044 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_3">
+ <g id="line2d_5">
+ <path clip-path="url(#p85394db85d)" d="M 309.283587 368.44
+L 309.283587 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_6">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="309.283587" xlink:href="#m706a904f17" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- 400 -->
+ <defs>
+ <path d="M 37.796875 64.3125
+L 12.890625 25.390625
+L 37.796875 25.390625
+z
+M 35.203125 72.90625
+L 47.609375 72.90625
+L 47.609375 25.390625
+L 58.015625 25.390625
+L 58.015625 17.1875
+L 47.609375 17.1875
+L 47.609375 0
+L 37.796875 0
+L 37.796875 17.1875
+L 4.890625 17.1875
+L 4.890625 26.703125
+z
+" id="DejaVuSans-52"/>
+ </defs>
+ <g transform="translate(299.739837 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-52"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_4">
+ <g id="line2d_7">
+ <path clip-path="url(#p85394db85d)" d="M 432.640381 368.44
+L 432.640381 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_8">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="432.640381" xlink:href="#m706a904f17" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- 600 -->
+ <defs>
+ <path d="M 33.015625 40.375
+Q 26.375 40.375 22.484375 35.828125
+Q 18.609375 31.296875 18.609375 23.390625
+Q 18.609375 15.53125 22.484375 10.953125
+Q 26.375 6.390625 33.015625 6.390625
+Q 39.65625 6.390625 43.53125 10.953125
+Q 47.40625 15.53125 47.40625 23.390625
+Q 47.40625 31.296875 43.53125 35.828125
+Q 39.65625 40.375 33.015625 40.375
+z
+M 52.59375 71.296875
+L 52.59375 62.3125
+Q 48.875 64.0625 45.09375 64.984375
+Q 41.3125 65.921875 37.59375 65.921875
+Q 27.828125 65.921875 22.671875 59.328125
+Q 17.53125 52.734375 16.796875 39.40625
+Q 19.671875 43.65625 24.015625 45.921875
+Q 28.375 48.1875 33.59375 48.1875
+Q 44.578125 48.1875 50.953125 41.515625
+Q 57.328125 34.859375 57.328125 23.390625
+Q 57.328125 12.15625 50.6875 5.359375
+Q 44.046875 -1.421875 33.015625 -1.421875
+Q 20.359375 -1.421875 13.671875 8.265625
+Q 6.984375 17.96875 6.984375 36.375
+Q 6.984375 53.65625 15.1875 63.9375
+Q 23.390625 74.21875 37.203125 74.21875
+Q 40.921875 74.21875 44.703125 73.484375
+Q 48.484375 72.75 52.59375 71.296875
+z
+" id="DejaVuSans-54"/>
+ </defs>
+ <g transform="translate(423.096631 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-54"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_5">
+ <g id="line2d_9">
+ <path clip-path="url(#p85394db85d)" d="M 555.997175 368.44
+L 555.997175 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_10">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="555.997175" xlink:href="#m706a904f17" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- 800 -->
+ <defs>
+ <path d="M 31.78125 34.625
+Q 24.75 34.625 20.71875 30.859375
+Q 16.703125 27.09375 16.703125 20.515625
+Q 16.703125 13.921875 20.71875 10.15625
+Q 24.75 6.390625 31.78125 6.390625
+Q 38.8125 6.390625 42.859375 10.171875
+Q 46.921875 13.96875 46.921875 20.515625
+Q 46.921875 27.09375 42.890625 30.859375
+Q 38.875 34.625 31.78125 34.625
+z
+M 21.921875 38.8125
+Q 15.578125 40.375 12.03125 44.71875
+Q 8.5 49.078125 8.5 55.328125
+Q 8.5 64.0625 14.71875 69.140625
+Q 20.953125 74.21875 31.78125 74.21875
+Q 42.671875 74.21875 48.875 69.140625
+Q 55.078125 64.0625 55.078125 55.328125
+Q 55.078125 49.078125 51.53125 44.71875
+Q 48 40.375 41.703125 38.8125
+Q 48.828125 37.15625 52.796875 32.3125
+Q 56.78125 27.484375 56.78125 20.515625
+Q 56.78125 9.90625 50.3125 4.234375
+Q 43.84375 -1.421875 31.78125 -1.421875
+Q 19.734375 -1.421875 13.25 4.234375
+Q 6.78125 9.90625 6.78125 20.515625
+Q 6.78125 27.484375 10.78125 32.3125
+Q 14.796875 37.15625 21.921875 38.8125
+z
+M 18.3125 54.390625
+Q 18.3125 48.734375 21.84375 45.5625
+Q 25.390625 42.390625 31.78125 42.390625
+Q 38.140625 42.390625 41.71875 45.5625
+Q 45.3125 48.734375 45.3125 54.390625
+Q 45.3125 60.0625 41.71875 63.234375
+Q 38.140625 66.40625 31.78125 66.40625
+Q 25.390625 66.40625 21.84375 63.234375
+Q 18.3125 60.0625 18.3125 54.390625
+z
+" id="DejaVuSans-56"/>
+ </defs>
+ <g transform="translate(546.453425 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-56"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_6">
+ <g id="line2d_11">
+ <path clip-path="url(#p85394db85d)" d="M 679.353969 368.44
+L 679.353969 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_12">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="679.353969" xlink:href="#m706a904f17" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- 1000 -->
+ <defs>
+ <path d="M 12.40625 8.296875
+L 28.515625 8.296875
+L 28.515625 63.921875
+L 10.984375 60.40625
+L 10.984375 69.390625
+L 28.421875 72.90625
+L 38.28125 72.90625
+L 38.28125 8.296875
+L 54.390625 8.296875
+L 54.390625 0
+L 12.40625 0
+z
+" id="DejaVuSans-49"/>
+ </defs>
+ <g transform="translate(666.628969 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_7">
+ <!-- Samples -->
+ <defs>
+ <path d="M 53.515625 70.515625
+L 53.515625 60.890625
+Q 47.90625 63.578125 42.921875 64.890625
+Q 37.9375 66.21875 33.296875 66.21875
+Q 25.25 66.21875 20.875 63.09375
+Q 16.5 59.96875 16.5 54.203125
+Q 16.5 49.359375 19.40625 46.890625
+Q 22.3125 44.4375 30.421875 42.921875
+L 36.375 41.703125
+Q 47.40625 39.59375 52.65625 34.296875
+Q 57.90625 29 57.90625 20.125
+Q 57.90625 9.515625 50.796875 4.046875
+Q 43.703125 -1.421875 29.984375 -1.421875
+Q 24.8125 -1.421875 18.96875 -0.25
+Q 13.140625 0.921875 6.890625 3.21875
+L 6.890625 13.375
+Q 12.890625 10.015625 18.65625 8.296875
+Q 24.421875 6.59375 29.984375 6.59375
+Q 38.421875 6.59375 43.015625 9.90625
+Q 47.609375 13.234375 47.609375 19.390625
+Q 47.609375 24.75 44.3125 27.78125
+Q 41.015625 30.8125 33.5 32.328125
+L 27.484375 33.5
+Q 16.453125 35.6875 11.515625 40.375
+Q 6.59375 45.0625 6.59375 53.421875
+Q 6.59375 63.09375 13.40625 68.65625
+Q 20.21875 74.21875 32.171875 74.21875
+Q 37.3125 74.21875 42.625 73.28125
+Q 47.953125 72.359375 53.515625 70.515625
+z
+" id="DejaVuSans-83"/>
+ <path d="M 34.28125 27.484375
+Q 23.390625 27.484375 19.1875 25
+Q 14.984375 22.515625 14.984375 16.5
+Q 14.984375 11.71875 18.140625 8.90625
+Q 21.296875 6.109375 26.703125 6.109375
+Q 34.1875 6.109375 38.703125 11.40625
+Q 43.21875 16.703125 43.21875 25.484375
+L 43.21875 27.484375
+z
+M 52.203125 31.203125
+L 52.203125 0
+L 43.21875 0
+L 43.21875 8.296875
+Q 40.140625 3.328125 35.546875 0.953125
+Q 30.953125 -1.421875 24.3125 -1.421875
+Q 15.921875 -1.421875 10.953125 3.296875
+Q 6 8.015625 6 15.921875
+Q 6 25.140625 12.171875 29.828125
+Q 18.359375 34.515625 30.609375 34.515625
+L 43.21875 34.515625
+L 43.21875 35.40625
+Q 43.21875 41.609375 39.140625 45
+Q 35.0625 48.390625 27.6875 48.390625
+Q 23 48.390625 18.546875 47.265625
+Q 14.109375 46.140625 10.015625 43.890625
+L 10.015625 52.203125
+Q 14.9375 54.109375 19.578125 55.046875
+Q 24.21875 56 28.609375 56
+Q 40.484375 56 46.34375 49.84375
+Q 52.203125 43.703125 52.203125 31.203125
+z
+" id="DejaVuSans-97"/>
+ <path d="M 52 44.1875
+Q 55.375 50.25 60.0625 53.125
+Q 64.75 56 71.09375 56
+Q 79.640625 56 84.28125 50.015625
+Q 88.921875 44.046875 88.921875 33.015625
+L 88.921875 0
+L 79.890625 0
+L 79.890625 32.71875
+Q 79.890625 40.578125 77.09375 44.375
+Q 74.3125 48.1875 68.609375 48.1875
+Q 61.625 48.1875 57.5625 43.546875
+Q 53.515625 38.921875 53.515625 30.90625
+L 53.515625 0
+L 44.484375 0
+L 44.484375 32.71875
+Q 44.484375 40.625 41.703125 44.40625
+Q 38.921875 48.1875 33.109375 48.1875
+Q 26.21875 48.1875 22.15625 43.53125
+Q 18.109375 38.875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.1875 51.21875 25.484375 53.609375
+Q 29.78125 56 35.6875 56
+Q 41.65625 56 45.828125 52.96875
+Q 50 49.953125 52 44.1875
+z
+" id="DejaVuSans-109"/>
+ <path d="M 18.109375 8.203125
+L 18.109375 -20.796875
+L 9.078125 -20.796875
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+z
+M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+" id="DejaVuSans-112"/>
+ <path d="M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 0
+L 9.421875 0
+z
+" id="DejaVuSans-108"/>
+ <path d="M 56.203125 29.59375
+L 56.203125 25.203125
+L 14.890625 25.203125
+Q 15.484375 15.921875 20.484375 11.0625
+Q 25.484375 6.203125 34.421875 6.203125
+Q 39.59375 6.203125 44.453125 7.46875
+Q 49.3125 8.734375 54.109375 11.28125
+L 54.109375 2.78125
+Q 49.265625 0.734375 44.1875 -0.34375
+Q 39.109375 -1.421875 33.890625 -1.421875
+Q 20.796875 -1.421875 13.15625 6.1875
+Q 5.515625 13.8125 5.515625 26.8125
+Q 5.515625 40.234375 12.765625 48.109375
+Q 20.015625 56 32.328125 56
+Q 43.359375 56 49.78125 48.890625
+Q 56.203125 41.796875 56.203125 29.59375
+z
+M 47.21875 32.234375
+Q 47.125 39.59375 43.09375 43.984375
+Q 39.0625 48.390625 32.421875 48.390625
+Q 24.90625 48.390625 20.390625 44.140625
+Q 15.875 39.890625 15.1875 32.171875
+z
+" id="DejaVuSans-101"/>
+ <path d="M 44.28125 53.078125
+L 44.28125 44.578125
+Q 40.484375 46.53125 36.375 47.5
+Q 32.28125 48.484375 27.875 48.484375
+Q 21.1875 48.484375 17.84375 46.4375
+Q 14.5 44.390625 14.5 40.28125
+Q 14.5 37.15625 16.890625 35.375
+Q 19.28125 33.59375 26.515625 31.984375
+L 29.59375 31.296875
+Q 39.15625 29.25 43.1875 25.515625
+Q 47.21875 21.78125 47.21875 15.09375
+Q 47.21875 7.46875 41.1875 3.015625
+Q 35.15625 -1.421875 24.609375 -1.421875
+Q 20.21875 -1.421875 15.453125 -0.5625
+Q 10.6875 0.296875 5.421875 2
+L 5.421875 11.28125
+Q 10.40625 8.6875 15.234375 7.390625
+Q 20.0625 6.109375 24.8125 6.109375
+Q 31.15625 6.109375 34.5625 8.28125
+Q 37.984375 10.453125 37.984375 14.40625
+Q 37.984375 18.0625 35.515625 20.015625
+Q 33.0625 21.96875 24.703125 23.78125
+L 21.578125 24.515625
+Q 13.234375 26.265625 9.515625 29.90625
+Q 5.8125 33.546875 5.8125 39.890625
+Q 5.8125 47.609375 11.28125 51.796875
+Q 16.75 56 26.8125 56
+Q 31.78125 56 36.171875 55.265625
+Q 40.578125 54.546875 44.28125 53.078125
+z
+" id="DejaVuSans-115"/>
+ </defs>
+ <g transform="translate(356.701875 396.716563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-83"/>
+ <use x="63.476562" xlink:href="#DejaVuSans-97"/>
+ <use x="124.755859" xlink:href="#DejaVuSans-109"/>
+ <use x="222.167969" xlink:href="#DejaVuSans-112"/>
+ <use x="285.644531" xlink:href="#DejaVuSans-108"/>
+ <use x="313.427734" xlink:href="#DejaVuSans-101"/>
+ <use x="374.951172" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_2">
+ <g id="ytick_1">
+ <g id="line2d_13">
+ <path clip-path="url(#p85394db85d)" d="M 62.57 333.988027
+L 693.54 333.988027
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_14">
+ <defs>
+ <path d="M 0 0
+L -3.5 0
+" id="mae574b6b19" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="333.988027"/>
+ </g>
+ </g>
+ <g id="text_8">
+ <!-- −0.01 -->
+ <defs>
+ <path d="M 10.59375 35.5
+L 73.1875 35.5
+L 73.1875 27.203125
+L 10.59375 27.203125
+z
+" id="DejaVuSans-8722"/>
+ <path d="M 10.6875 12.40625
+L 21 12.40625
+L 21 0
+L 10.6875 0
+z
+" id="DejaVuSans-46"/>
+ </defs>
+ <g transform="translate(24.924688 337.787246)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-48"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-46"/>
+ <use x="179.199219" xlink:href="#DejaVuSans-48"/>
+ <use x="242.822266" xlink:href="#DejaVuSans-49"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_2">
+ <g id="line2d_15">
+ <path clip-path="url(#p85394db85d)" d="M 62.57 285.830348
+L 693.54 285.830348
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_16">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="285.830348"/>
+ </g>
+ </g>
+ <g id="text_9">
+ <!-- 0.00 -->
+ <g transform="translate(33.304375 289.629567)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_3">
+ <g id="line2d_17">
+ <path clip-path="url(#p85394db85d)" d="M 62.57 237.672669
+L 693.54 237.672669
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_18">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="237.672669"/>
+ </g>
+ </g>
+ <g id="text_10">
+ <!-- 0.01 -->
+ <g transform="translate(33.304375 241.471888)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-49"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_4">
+ <g id="line2d_19">
+ <path clip-path="url(#p85394db85d)" d="M 62.57 189.51499
+L 693.54 189.51499
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_20">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="189.51499"/>
+ </g>
+ </g>
+ <g id="text_11">
+ <!-- 0.02 -->
+ <g transform="translate(33.304375 193.314209)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-50"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_5">
+ <g id="line2d_21">
+ <path clip-path="url(#p85394db85d)" d="M 62.57 141.357311
+L 693.54 141.357311
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_22">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="141.357311"/>
+ </g>
+ </g>
+ <g id="text_12">
+ <!-- 0.03 -->
+ <defs>
+ <path d="M 40.578125 39.3125
+Q 47.65625 37.796875 51.625 33
+Q 55.609375 28.21875 55.609375 21.1875
+Q 55.609375 10.40625 48.1875 4.484375
+Q 40.765625 -1.421875 27.09375 -1.421875
+Q 22.515625 -1.421875 17.65625 -0.515625
+Q 12.796875 0.390625 7.625 2.203125
+L 7.625 11.71875
+Q 11.71875 9.328125 16.59375 8.109375
+Q 21.484375 6.890625 26.8125 6.890625
+Q 36.078125 6.890625 40.9375 10.546875
+Q 45.796875 14.203125 45.796875 21.1875
+Q 45.796875 27.640625 41.28125 31.265625
+Q 36.765625 34.90625 28.71875 34.90625
+L 20.21875 34.90625
+L 20.21875 43.015625
+L 29.109375 43.015625
+Q 36.375 43.015625 40.234375 45.921875
+Q 44.09375 48.828125 44.09375 54.296875
+Q 44.09375 59.90625 40.109375 62.90625
+Q 36.140625 65.921875 28.71875 65.921875
+Q 24.65625 65.921875 20.015625 65.03125
+Q 15.375 64.15625 9.8125 62.3125
+L 9.8125 71.09375
+Q 15.4375 72.65625 20.34375 73.4375
+Q 25.25 74.21875 29.59375 74.21875
+Q 40.828125 74.21875 47.359375 69.109375
+Q 53.90625 64.015625 53.90625 55.328125
+Q 53.90625 49.265625 50.4375 45.09375
+Q 46.96875 40.921875 40.578125 39.3125
+z
+" id="DejaVuSans-51"/>
+ </defs>
+ <g transform="translate(33.304375 145.15653)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-51"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_6">
+ <g id="line2d_23">
+ <path clip-path="url(#p85394db85d)" d="M 62.57 93.199632
+L 693.54 93.199632
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_24">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="93.199632"/>
+ </g>
+ </g>
+ <g id="text_13">
+ <!-- 0.04 -->
+ <g transform="translate(33.304375 96.998851)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-52"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_14">
+ <!-- Amplitude -->
+ <defs>
+ <path d="M 34.1875 63.1875
+L 20.796875 26.90625
+L 47.609375 26.90625
+z
+M 28.609375 72.90625
+L 39.796875 72.90625
+L 67.578125 0
+L 57.328125 0
+L 50.6875 18.703125
+L 17.828125 18.703125
+L 11.1875 0
+L 0.78125 0
+z
+" id="DejaVuSans-65"/>
+ <path d="M 9.421875 54.6875
+L 18.40625 54.6875
+L 18.40625 0
+L 9.421875 0
+z
+M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 64.59375
+L 9.421875 64.59375
+z
+" id="DejaVuSans-105"/>
+ <path d="M 18.3125 70.21875
+L 18.3125 54.6875
+L 36.8125 54.6875
+L 36.8125 47.703125
+L 18.3125 47.703125
+L 18.3125 18.015625
+Q 18.3125 11.328125 20.140625 9.421875
+Q 21.96875 7.515625 27.59375 7.515625
+L 36.8125 7.515625
+L 36.8125 0
+L 27.59375 0
+Q 17.1875 0 13.234375 3.875
+Q 9.28125 7.765625 9.28125 18.015625
+L 9.28125 47.703125
+L 2.6875 47.703125
+L 2.6875 54.6875
+L 9.28125 54.6875
+L 9.28125 70.21875
+z
+" id="DejaVuSans-116"/>
+ <path d="M 8.5 21.578125
+L 8.5 54.6875
+L 17.484375 54.6875
+L 17.484375 21.921875
+Q 17.484375 14.15625 20.5 10.265625
+Q 23.53125 6.390625 29.59375 6.390625
+Q 36.859375 6.390625 41.078125 11.03125
+Q 45.3125 15.671875 45.3125 23.6875
+L 45.3125 54.6875
+L 54.296875 54.6875
+L 54.296875 0
+L 45.3125 0
+L 45.3125 8.40625
+Q 42.046875 3.421875 37.71875 1
+Q 33.40625 -1.421875 27.6875 -1.421875
+Q 18.265625 -1.421875 13.375 4.4375
+Q 8.5 10.296875 8.5 21.578125
+z
+M 31.109375 56
+z
+" id="DejaVuSans-117"/>
+ <path d="M 45.40625 46.390625
+L 45.40625 75.984375
+L 54.390625 75.984375
+L 54.390625 0
+L 45.40625 0
+L 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+z
+M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+" id="DejaVuSans-100"/>
+ </defs>
+ <g transform="translate(18.845 247.642656)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-65"/>
+ <use x="68.408203" xlink:href="#DejaVuSans-109"/>
+ <use x="165.820312" xlink:href="#DejaVuSans-112"/>
+ <use x="229.296875" xlink:href="#DejaVuSans-108"/>
+ <use x="257.080078" xlink:href="#DejaVuSans-105"/>
+ <use x="284.863281" xlink:href="#DejaVuSans-116"/>
+ <use x="324.072266" xlink:href="#DejaVuSans-117"/>
+ <use x="387.451172" xlink:href="#DejaVuSans-100"/>
+ <use x="450.927734" xlink:href="#DejaVuSans-101"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_25">
+ <path clip-path="url(#p85394db85d)" d="M 62.57 285.830348
+L 74.288895 285.753018
+L 76.139247 285.554991
+L 77.372815 285.255521
+L 78.606383 284.715937
+L 79.839951 283.804539
+L 81.073519 282.350437
+L 81.690303 281.35615
+L 82.307087 280.145631
+L 83.540655 276.952851
+L 84.774223 272.519678
+L 86.007791 266.598777
+L 87.241359 258.973127
+L 88.474927 249.484354
+L 89.708495 238.06158
+L 90.942063 224.747765
+L 92.792414 201.659726
+L 95.25955 167.146886
+L 97.726686 132.907938
+L 98.960254 117.836179
+L 100.193822 105.242485
+L 101.42739 95.919572
+L 102.044174 92.706694
+L 102.660958 90.560876
+L 103.277742 89.544762
+L 103.894526 89.708668
+L 104.51131 91.089422
+L 105.128094 93.709393
+L 105.744878 97.575749
+L 106.361662 102.679942
+L 106.978446 108.997456
+L 108.212014 125.094797
+L 109.445582 145.358821
+L 110.67915 169.052156
+L 112.529501 208.947972
+L 116.230205 290.545625
+L 117.463773 314.102019
+L 118.697341 334.171084
+L 119.930909 350.012729
+L 120.547693 356.180186
+L 121.164477 361.120858
+L 121.781261 364.812118
+L 122.398045 367.248185
+L 123.014829 368.44
+L 123.631613 368.414854
+L 124.248397 367.215763
+L 124.865181 364.900612
+L 125.481965 361.54108
+L 126.098749 357.221373
+L 127.332317 346.092056
+L 128.565885 332.378434
+L 131.033021 301.077239
+L 132.883372 278.061905
+L 134.11694 264.596311
+L 135.350508 253.45487
+L 136.584076 245.14132
+L 137.20086 242.14758
+L 137.817644 239.957827
+L 138.434428 238.577238
+L 139.051212 237.998279
+L 139.667996 238.201208
+L 140.28478 239.154745
+L 140.901564 240.816918
+L 141.518348 243.136042
+L 142.751916 249.496638
+L 143.985484 257.673545
+L 145.835836 271.938462
+L 148.302972 291.21874
+L 149.53654 299.60794
+L 150.770108 306.514268
+L 152.003675 311.601403
+L 152.620459 313.395265
+L 153.237243 314.671107
+L 153.854027 315.426324
+L 154.470811 315.666888
+L 155.087595 315.406961
+L 155.704379 314.6684
+L 156.321163 313.480141
+L 156.937947 311.877493
+L 158.171515 307.597326
+L 159.405083 302.2063
+L 161.872219 289.804994
+L 163.722571 280.779683
+L 164.956139 275.610993
+L 166.189707 271.464654
+L 166.806491 269.840952
+L 167.423275 268.540672
+L 168.040059 267.574257
+L 168.656843 266.946253
+L 169.273627 266.655428
+L 169.890411 266.694992
+L 170.507195 267.05289
+L 171.123978 267.712187
+L 171.740762 268.65151
+L 172.97433 271.265624
+L 174.207898 274.655807
+L 176.05825 280.592282
+L 178.525386 288.599699
+L 179.758954 292.056529
+L 180.992522 294.87153
+L 182.22609 296.903241
+L 182.842874 297.597704
+L 183.459658 298.070949
+L 184.076442 298.322584
+L 184.693226 298.355938
+L 185.31001 298.177885
+L 185.926794 297.798605
+L 186.543578 297.231303
+L 187.777146 295.598614
+L 189.010714 293.432899
+L 190.861065 289.577498
+L 193.328201 284.291417
+L 194.561769 281.977804
+L 195.795337 280.071952
+L 197.028905 278.672072
+L 197.645689 278.181739
+L 198.262473 277.836597
+L 198.879257 277.637539
+L 199.496041 277.582972
+L 200.112825 277.668931
+L 200.729609 277.889224
+L 201.963177 278.698019
+L 203.196745 279.922767
+L 205.047097 282.299269
+L 208.747801 287.476051
+L 209.981369 288.905947
+L 211.214936 290.03853
+L 212.448504 290.818903
+L 213.682072 291.218986
+L 214.91564 291.237595
+L 216.149208 290.898741
+L 217.382776 290.248384
+L 218.616344 289.349958
+L 220.466696 287.704414
+L 223.550616 284.848032
+L 225.400968 283.473204
+L 226.634536 282.813548
+L 227.868104 282.396222
+L 229.101672 282.23272
+L 230.335239 282.317055
+L 231.568807 282.627314
+L 232.802375 283.128143
+L 234.652727 284.135125
+L 239.586999 287.057724
+L 241.437351 287.789159
+L 242.670919 288.082201
+L 243.904487 288.207544
+L 245.138055 288.16799
+L 246.988407 287.8315
+L 248.838759 287.238084
+L 255.623382 284.701944
+L 257.473734 284.354554
+L 259.324086 284.254541
+L 261.174438 284.392332
+L 263.641574 284.867861
+L 271.042981 286.6537
+L 273.510117 286.866773
+L 275.977253 286.793043
+L 278.444389 286.487534
+L 286.462581 285.241915
+L 288.929717 285.139306
+L 292.013636 285.268465
+L 296.331124 285.740215
+L 300.648612 286.174603
+L 303.732532 286.287495
+L 307.433236 286.174558
+L 319.152131 285.528005
+L 323.469619 285.650708
+L 333.338162 286.029972
+L 338.889218 285.933579
+L 348.757761 285.69758
+L 356.159169 285.815623
+L 364.794145 285.915713
+L 393.782991 285.86881
+L 543.044712 285.830971
+L 693.54 285.830358
+L 693.54 285.830358
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_3">
+ <path d="M 62.57 368.44
+L 62.57 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_4">
+ <path d="M 693.54 368.44
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_5">
+ <path d="M 62.57 368.44
+L 693.54 368.44
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_6">
+ <path d="M 62.57 75.6
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_2">
+ <g id="patch_7">
+ <path d="M 62.57 703.24
+L 693.54 703.24
+L 693.54 410.4
+L 62.57 410.4
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_3">
+ <g id="xtick_7">
+ <g id="line2d_26">
+ <path clip-path="url(#pcf45b32dd3)" d="M 62.57 703.24
+L 62.57 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_27">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_15">
+ <!-- 10Hz -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 19.671875 72.90625
+L 19.671875 43.015625
+L 55.515625 43.015625
+L 55.515625 72.90625
+L 65.375 72.90625
+L 65.375 0
+L 55.515625 0
+L 55.515625 34.71875
+L 19.671875 34.71875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-72"/>
+ <path d="M 5.515625 54.6875
+L 48.1875 54.6875
+L 48.1875 46.484375
+L 14.40625 7.171875
+L 48.1875 7.171875
+L 48.1875 0
+L 4.296875 0
+L 4.296875 8.203125
+L 38.09375 47.515625
+L 5.515625 47.515625
+z
+" id="DejaVuSans-122"/>
+ </defs>
+ <g transform="translate(49.823125 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_8">
+ <g id="line2d_28">
+ <path clip-path="url(#pcf45b32dd3)" d="M 62.57 703.24
+L 62.57 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_29">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_9">
+ <g id="line2d_30">
+ <path clip-path="url(#pcf45b32dd3)" d="M 118.76202 703.24
+L 118.76202 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_31">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="118.76202" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_10">
+ <g id="line2d_32">
+ <path clip-path="url(#pcf45b32dd3)" d="M 151.632244 703.24
+L 151.632244 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_33">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="151.632244" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_11">
+ <g id="line2d_34">
+ <path clip-path="url(#pcf45b32dd3)" d="M 174.954039 703.24
+L 174.954039 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_35">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="174.954039" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_12">
+ <g id="line2d_36">
+ <path clip-path="url(#pcf45b32dd3)" d="M 193.043829 703.24
+L 193.043829 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_37">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="193.043829" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_13">
+ <g id="line2d_38">
+ <path clip-path="url(#pcf45b32dd3)" d="M 207.824264 703.24
+L 207.824264 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_39">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="207.824264" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_14">
+ <g id="line2d_40">
+ <path clip-path="url(#pcf45b32dd3)" d="M 220.320943 703.24
+L 220.320943 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_41">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="220.320943" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_15">
+ <g id="line2d_42">
+ <path clip-path="url(#pcf45b32dd3)" d="M 231.146059 703.24
+L 231.146059 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_43">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="231.146059" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_16">
+ <g id="line2d_44">
+ <path clip-path="url(#pcf45b32dd3)" d="M 240.694488 703.24
+L 240.694488 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_45">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="240.694488" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_17">
+ <g id="line2d_46">
+ <path clip-path="url(#pcf45b32dd3)" d="M 249.235849 703.24
+L 249.235849 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_47">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_16">
+ <!-- 100Hz -->
+ <g transform="translate(233.307724 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_18">
+ <g id="line2d_48">
+ <path clip-path="url(#pcf45b32dd3)" d="M 249.235849 703.24
+L 249.235849 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_49">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_19">
+ <g id="line2d_50">
+ <path clip-path="url(#pcf45b32dd3)" d="M 305.427868 703.24
+L 305.427868 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_51">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="305.427868" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_20">
+ <g id="line2d_52">
+ <path clip-path="url(#pcf45b32dd3)" d="M 338.298093 703.24
+L 338.298093 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_53">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="338.298093" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_21">
+ <g id="line2d_54">
+ <path clip-path="url(#pcf45b32dd3)" d="M 361.619888 703.24
+L 361.619888 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_55">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="361.619888" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_22">
+ <g id="line2d_56">
+ <path clip-path="url(#pcf45b32dd3)" d="M 379.709678 703.24
+L 379.709678 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_57">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="379.709678" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_23">
+ <g id="line2d_58">
+ <path clip-path="url(#pcf45b32dd3)" d="M 394.490112 703.24
+L 394.490112 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_59">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="394.490112" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_24">
+ <g id="line2d_60">
+ <path clip-path="url(#pcf45b32dd3)" d="M 406.986791 703.24
+L 406.986791 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_61">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="406.986791" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_25">
+ <g id="line2d_62">
+ <path clip-path="url(#pcf45b32dd3)" d="M 417.811907 703.24
+L 417.811907 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_63">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="417.811907" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_26">
+ <g id="line2d_64">
+ <path clip-path="url(#pcf45b32dd3)" d="M 427.360336 703.24
+L 427.360336 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_65">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="427.360336" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_27">
+ <g id="line2d_66">
+ <path clip-path="url(#pcf45b32dd3)" d="M 435.901697 703.24
+L 435.901697 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_67">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_17">
+ <!-- 1kHz -->
+ <defs>
+ <path d="M 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 31.109375
+L 44.921875 54.6875
+L 56.390625 54.6875
+L 27.390625 29.109375
+L 57.625 0
+L 45.90625 0
+L 18.109375 26.703125
+L 18.109375 0
+L 9.078125 0
+z
+" id="DejaVuSans-107"/>
+ </defs>
+ <g transform="translate(423.44076 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_28">
+ <g id="line2d_68">
+ <path clip-path="url(#pcf45b32dd3)" d="M 435.901697 703.24
+L 435.901697 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_69">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_29">
+ <g id="line2d_70">
+ <path clip-path="url(#pcf45b32dd3)" d="M 492.093717 703.24
+L 492.093717 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_71">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="492.093717" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_30">
+ <g id="line2d_72">
+ <path clip-path="url(#pcf45b32dd3)" d="M 524.963941 703.24
+L 524.963941 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_73">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.963941" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_31">
+ <g id="line2d_74">
+ <path clip-path="url(#pcf45b32dd3)" d="M 548.285736 703.24
+L 548.285736 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_75">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="548.285736" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_32">
+ <g id="line2d_76">
+ <path clip-path="url(#pcf45b32dd3)" d="M 566.375526 703.24
+L 566.375526 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_77">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="566.375526" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_33">
+ <g id="line2d_78">
+ <path clip-path="url(#pcf45b32dd3)" d="M 581.155961 703.24
+L 581.155961 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_79">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="581.155961" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_34">
+ <g id="line2d_80">
+ <path clip-path="url(#pcf45b32dd3)" d="M 593.65264 703.24
+L 593.65264 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_81">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.65264" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_35">
+ <g id="line2d_82">
+ <path clip-path="url(#pcf45b32dd3)" d="M 604.477756 703.24
+L 604.477756 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_83">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.477756" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_36">
+ <g id="line2d_84">
+ <path clip-path="url(#pcf45b32dd3)" d="M 614.026185 703.24
+L 614.026185 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_85">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="614.026185" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_37">
+ <g id="line2d_86">
+ <path clip-path="url(#pcf45b32dd3)" d="M 622.567546 703.24
+L 622.567546 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_87">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_18">
+ <!-- 10kHz -->
+ <g transform="translate(606.925358 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_38">
+ <g id="line2d_88">
+ <path clip-path="url(#pcf45b32dd3)" d="M 622.567546 703.24
+L 622.567546 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_89">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_39">
+ <g id="line2d_90">
+ <path clip-path="url(#pcf45b32dd3)" d="M 678.759566 703.24
+L 678.759566 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_91">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.759566" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_40">
+ <g id="line2d_92">
+ <path clip-path="url(#pcf45b32dd3)" d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_93">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#m706a904f17" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_19">
+ <!-- 24kHz -->
+ <g transform="translate(677.897812 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_20">
+ <!-- Frequency (Hz) -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 51.703125 72.90625
+L 51.703125 64.59375
+L 19.671875 64.59375
+L 19.671875 43.109375
+L 48.578125 43.109375
+L 48.578125 34.8125
+L 19.671875 34.8125
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-70"/>
+ <path d="M 41.109375 46.296875
+Q 39.59375 47.171875 37.8125 47.578125
+Q 36.03125 48 33.890625 48
+Q 26.265625 48 22.1875 43.046875
+Q 18.109375 38.09375 18.109375 28.8125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 20.953125 51.171875 25.484375 53.578125
+Q 30.03125 56 36.53125 56
+Q 37.453125 56 38.578125 55.875
+Q 39.703125 55.765625 41.0625 55.515625
+z
+" id="DejaVuSans-114"/>
+ <path d="M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+M 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+L 45.40625 54.6875
+L 54.390625 54.6875
+L 54.390625 -20.796875
+L 45.40625 -20.796875
+z
+" id="DejaVuSans-113"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-110"/>
+ <path d="M 48.78125 52.59375
+L 48.78125 44.1875
+Q 44.96875 46.296875 41.140625 47.34375
+Q 37.3125 48.390625 33.40625 48.390625
+Q 24.65625 48.390625 19.8125 42.84375
+Q 14.984375 37.3125 14.984375 27.296875
+Q 14.984375 17.28125 19.8125 11.734375
+Q 24.65625 6.203125 33.40625 6.203125
+Q 37.3125 6.203125 41.140625 7.25
+Q 44.96875 8.296875 48.78125 10.40625
+L 48.78125 2.09375
+Q 45.015625 0.34375 40.984375 -0.53125
+Q 36.96875 -1.421875 32.421875 -1.421875
+Q 20.0625 -1.421875 12.78125 6.34375
+Q 5.515625 14.109375 5.515625 27.296875
+Q 5.515625 40.671875 12.859375 48.328125
+Q 20.21875 56 33.015625 56
+Q 37.15625 56 41.109375 55.140625
+Q 45.0625 54.296875 48.78125 52.59375
+z
+" id="DejaVuSans-99"/>
+ <path d="M 32.171875 -5.078125
+Q 28.375 -14.84375 24.75 -17.8125
+Q 21.140625 -20.796875 15.09375 -20.796875
+L 7.90625 -20.796875
+L 7.90625 -13.28125
+L 13.1875 -13.28125
+Q 16.890625 -13.28125 18.9375 -11.515625
+Q 21 -9.765625 23.484375 -3.21875
+L 25.09375 0.875
+L 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 11.921875
+L 46.6875 54.6875
+L 56.203125 54.6875
+z
+" id="DejaVuSans-121"/>
+ <path id="DejaVuSans-32"/>
+ <path d="M 31 75.875
+Q 24.46875 64.65625 21.28125 53.65625
+Q 18.109375 42.671875 18.109375 31.390625
+Q 18.109375 20.125 21.3125 9.0625
+Q 24.515625 -2 31 -13.1875
+L 23.1875 -13.1875
+Q 15.875 -1.703125 12.234375 9.375
+Q 8.59375 20.453125 8.59375 31.390625
+Q 8.59375 42.28125 12.203125 53.3125
+Q 15.828125 64.359375 23.1875 75.875
+z
+" id="DejaVuSans-40"/>
+ <path d="M 8.015625 75.875
+L 15.828125 75.875
+Q 23.140625 64.359375 26.78125 53.3125
+Q 30.421875 42.28125 30.421875 31.390625
+Q 30.421875 20.453125 26.78125 9.375
+Q 23.140625 -1.703125 15.828125 -13.1875
+L 8.015625 -13.1875
+Q 14.5 -2 17.703125 9.0625
+Q 20.90625 20.125 20.90625 31.390625
+Q 20.90625 42.671875 17.703125 53.65625
+Q 14.5 64.65625 8.015625 75.875
+z
+" id="DejaVuSans-41"/>
+ </defs>
+ <g transform="translate(339.882344 731.516563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_4">
+ <g id="ytick_7">
+ <g id="line2d_94">
+ <path clip-path="url(#pcf45b32dd3)" d="M 62.57 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_95">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_21">
+ <!-- −160 -->
+ <g transform="translate(28.102813 707.039219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-54"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_8">
+ <g id="line2d_96">
+ <path clip-path="url(#pcf45b32dd3)" d="M 62.57 668.788235
+L 693.54 668.788235
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_97">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="668.788235"/>
+ </g>
+ </g>
+ <g id="text_22">
+ <!-- −140 -->
+ <g transform="translate(28.102813 672.587454)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-52"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_9">
+ <g id="line2d_98">
+ <path clip-path="url(#pcf45b32dd3)" d="M 62.57 634.336471
+L 693.54 634.336471
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_99">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="634.336471"/>
+ </g>
+ </g>
+ <g id="text_23">
+ <!-- −120 -->
+ <g transform="translate(28.102813 638.135689)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-50"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_10">
+ <g id="line2d_100">
+ <path clip-path="url(#pcf45b32dd3)" d="M 62.57 599.884706
+L 693.54 599.884706
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_101">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="599.884706"/>
+ </g>
+ </g>
+ <g id="text_24">
+ <!-- −100 -->
+ <g transform="translate(28.102813 603.683925)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_11">
+ <g id="line2d_102">
+ <path clip-path="url(#pcf45b32dd3)" d="M 62.57 565.432941
+L 693.54 565.432941
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_103">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="565.432941"/>
+ </g>
+ </g>
+ <g id="text_25">
+ <!-- −80 -->
+ <g transform="translate(34.465313 569.23216)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-56"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_12">
+ <g id="line2d_104">
+ <path clip-path="url(#pcf45b32dd3)" d="M 62.57 530.981176
+L 693.54 530.981176
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_105">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="530.981176"/>
+ </g>
+ </g>
+ <g id="text_26">
+ <!-- −60 -->
+ <g transform="translate(34.465313 534.780395)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-54"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_13">
+ <g id="line2d_106">
+ <path clip-path="url(#pcf45b32dd3)" d="M 62.57 496.529412
+L 693.54 496.529412
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_107">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="496.529412"/>
+ </g>
+ </g>
+ <g id="text_27">
+ <!-- −40 -->
+ <g transform="translate(34.465313 500.328631)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-52"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_14">
+ <g id="line2d_108">
+ <path clip-path="url(#pcf45b32dd3)" d="M 62.57 462.077647
+L 693.54 462.077647
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_109">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="462.077647"/>
+ </g>
+ </g>
+ <g id="text_28">
+ <!-- −20 -->
+ <g transform="translate(34.465313 465.876866)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_15">
+ <g id="line2d_110">
+ <path clip-path="url(#pcf45b32dd3)" d="M 62.57 427.625882
+L 693.54 427.625882
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_111">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="427.625882"/>
+ </g>
+ </g>
+ <g id="text_29">
+ <!-- 0 -->
+ <g transform="translate(49.2075 431.425101)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_30">
+ <!-- Gain (dB) -->
+ <defs>
+ <path d="M 59.515625 10.40625
+L 59.515625 29.984375
+L 43.40625 29.984375
+L 43.40625 38.09375
+L 69.28125 38.09375
+L 69.28125 6.78125
+Q 63.578125 2.734375 56.6875 0.65625
+Q 49.8125 -1.421875 42 -1.421875
+Q 24.90625 -1.421875 15.25 8.5625
+Q 5.609375 18.5625 5.609375 36.375
+Q 5.609375 54.25 15.25 64.234375
+Q 24.90625 74.21875 42 74.21875
+Q 49.125 74.21875 55.546875 72.453125
+Q 61.96875 70.703125 67.390625 67.28125
+L 67.390625 56.78125
+Q 61.921875 61.421875 55.765625 63.765625
+Q 49.609375 66.109375 42.828125 66.109375
+Q 29.4375 66.109375 22.71875 58.640625
+Q 16.015625 51.171875 16.015625 36.375
+Q 16.015625 21.625 22.71875 14.15625
+Q 29.4375 6.6875 42.828125 6.6875
+Q 48.046875 6.6875 52.140625 7.59375
+Q 56.25 8.5 59.515625 10.40625
+z
+" id="DejaVuSans-71"/>
+ <path d="M 19.671875 34.8125
+L 19.671875 8.109375
+L 35.5 8.109375
+Q 43.453125 8.109375 47.28125 11.40625
+Q 51.125 14.703125 51.125 21.484375
+Q 51.125 28.328125 47.28125 31.5625
+Q 43.453125 34.8125 35.5 34.8125
+z
+M 19.671875 64.796875
+L 19.671875 42.828125
+L 34.28125 42.828125
+Q 41.5 42.828125 45.03125 45.53125
+Q 48.578125 48.25 48.578125 53.8125
+Q 48.578125 59.328125 45.03125 62.0625
+Q 41.5 64.796875 34.28125 64.796875
+z
+M 9.8125 72.90625
+L 35.015625 72.90625
+Q 46.296875 72.90625 52.390625 68.21875
+Q 58.5 63.53125 58.5 54.890625
+Q 58.5 48.1875 55.375 44.234375
+Q 52.25 40.28125 46.1875 39.3125
+Q 53.46875 37.75 57.5 32.78125
+Q 61.53125 27.828125 61.53125 20.40625
+Q 61.53125 10.640625 54.890625 5.3125
+Q 48.25 0 35.984375 0
+L 9.8125 0
+z
+" id="DejaVuSans-66"/>
+ </defs>
+ <g transform="translate(22.023125 580.411406)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-71"/>
+ <use x="77.490234" xlink:href="#DejaVuSans-97"/>
+ <use x="138.769531" xlink:href="#DejaVuSans-105"/>
+ <use x="166.552734" xlink:href="#DejaVuSans-110"/>
+ <use x="229.931641" xlink:href="#DejaVuSans-32"/>
+ <use x="261.71875" xlink:href="#DejaVuSans-40"/>
+ <use x="300.732422" xlink:href="#DejaVuSans-100"/>
+ <use x="364.208984" xlink:href="#DejaVuSans-66"/>
+ <use x="432.8125" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_112">
+ <path clip-path="url(#pcf45b32dd3)" d="M -1 427.625882
+L 421.563395 427.731311
+L 425.437686 427.95371
+L 428.09589 428.32923
+L 430.161427 428.876576
+L 431.67676 429.503633
+L 433.164287 430.37292
+L 434.62501 431.527172
+L 436.059879 432.989121
+L 437.469792 434.753842
+L 439.312324 437.520239
+L 441.113908 440.647816
+L 443.74337 445.743572
+L 447.53425 453.707284
+L 454.622369 469.267338
+L 479.715703 525.165029
+L 509.099609 591.057748
+L 537.551048 655.757739
+L 537.821726 656.60154
+L 538.360385 657.230105
+L 539.028715 659.268517
+L 539.294512 659.380188
+L 539.55944 660.083856
+L 539.955216 661.611638
+L 540.217997 661.730053
+L 540.349069 661.76305
+L 540.479929 661.989865
+L 541.131081 664.19205
+L 541.390084 664.112465
+L 541.519276 664.314481
+L 542.162166 666.623073
+L 542.417901 666.428768
+L 542.545466 666.602077
+L 542.799997 667.811319
+L 543.053731 668.979274
+L 543.180301 669.036225
+L 543.432849 668.712226
+L 543.558829 668.852392
+L 543.810203 670.128103
+L 544.060799 671.40401
+L 544.185808 671.433654
+L 544.435248 670.963038
+L 544.55968 671.065066
+L 544.807975 672.413288
+L 545.05551 673.817017
+L 545.178996 673.817686
+L 545.425403 673.18133
+L 545.548326 673.239635
+L 545.793615 674.666379
+L 546.038164 676.220888
+L 546.160163 676.190857
+L 546.40361 675.367143
+L 546.52506 675.375536
+L 546.767416 676.886657
+L 547.009049 678.618454
+L 547.129597 678.555952
+L 547.370155 677.520428
+L 547.490166 677.472105
+L 547.729658 679.073155
+L 547.968445 681.012827
+L 548.087575 680.916049
+L 548.443918 679.528587
+L 548.562352 680.084393
+L 548.916619 683.407448
+L 549.034364 683.274578
+L 549.386579 681.544132
+L 549.503645 682.106588
+L 549.853831 685.806147
+L 549.970224 685.635388
+L 550.318405 683.517803
+L 550.434134 684.08442
+L 550.780332 688.21321
+L 550.895403 688.00283
+L 551.239641 685.448586
+L 551.354063 686.016335
+L 551.696363 690.633457
+L 551.810143 690.381862
+L 552.150527 687.33539
+L 552.263671 687.900695
+L 552.60216 693.072335
+L 552.714676 692.778179
+L 553.051291 689.177062
+L 553.163186 689.735813
+L 553.497948 695.536018
+L 553.609228 695.198379
+L 553.942157 690.972396
+L 554.05283 691.519981
+L 554.383945 698.03151
+L 554.494017 697.650162
+L 554.823339 692.720143
+L 554.932816 693.251512
+L 555.260364 700.566744
+L 555.369253 700.142604
+L 555.695045 694.419031
+L 555.803353 694.928778
+L 556.019534 700.169577
+L 556.127409 703.15063
+L 556.23514 702.686481
+L 556.557479 696.067773
+L 556.66464 696.550256
+L 556.87854 702.235317
+L 556.985279 705.792996
+L 557.091877 705.29469
+L 557.410833 697.665097
+L 557.516874 698.114569
+L 557.728539 704.248561
+L 557.834165 708.504258
+L 557.939654 707.982753
+L 558.255299 699.209757
+L 558.360241 699.620535
+L 558.569719 706.19713
+L 558.674255 711.294512
+L 558.778657 710.769392
+L 559.091058 700.700564
+L 559.194925 701.067202
+L 559.40226 708.066629
+L 559.505729 714.171389
+L 559.609066 713.677033
+L 559.918289 702.136412
+L 560.021102 702.453884
+L 560.226338 709.840871
+L 560.328761 717.13536
+L 560.431055 716.73186
+L 560.635256 705.388
+L 560.737164 703.516306
+L 560.838945 703.780186
+L 560.940597 706.238127
+L 561.143521 720.169923
+L 561.244792 719.962238
+L 561.446957 706.864149
+L 561.547851 704.839395
+L 561.648619 705.046026
+L 561.749262 707.528056
+L 562.050443 723.392156
+L 562.250611 708.274405
+L 562.35051 706.105003
+L 562.450286 706.251638
+L 562.549939 708.738373
+L 562.848166 727.020513
+L 563.046377 709.614897
+L 563.1453 707.312663
+L 563.244103 707.397577
+L 563.342786 709.869452
+L 563.441349 715.663869
+L 563.638116 730.763064
+L 563.834407 710.882089
+L 563.932374 708.462144
+L 564.030223 708.484704
+L 564.127954 710.92266
+L 564.225568 716.74514
+L 564.420442 734.318413
+L 564.61485 712.073001
+L 564.808793 709.51417
+L 564.90559 711.900287
+L 565.002272 717.672767
+L 565.195291 737.00726
+L 565.387852 713.185425
+L 565.579956 710.487388
+L 565.675838 712.805428
+L 565.771606 718.455718
+L 565.962804 738.041162
+L 566.153553 714.218114
+L 566.343853 711.406007
+L 566.438836 713.641828
+L 566.533708 719.107835
+L 566.723119 737.420091
+L 566.912089 715.170912
+L 567.100619 712.271871
+L 567.19472 714.413704
+L 567.476369 735.933257
+L 567.663593 716.044826
+L 567.850385 713.086992
+L 567.943621 715.125568
+L 568.222684 734.261503
+L 568.408195 716.841999
+L 568.593281 713.853508
+L 568.685667 715.782058
+L 568.962192 732.707687
+L 569.237777 714.919473
+L 569.329431 714.573649
+L 569.420982 716.387794
+L 569.695014 731.357316
+L 569.968124 715.629446
+L 570.058957 715.249708
+L 570.149687 716.947267
+L 570.421272 730.212651
+L 570.69195 716.291907
+L 570.781975 715.884008
+L 570.871901 717.464748
+L 571.141081 729.250812
+L 571.40937 716.909231
+L 571.498603 716.478875
+L 571.587737 717.944236
+L 571.854555 728.444529
+L 572.120497 717.483907
+L 572.208951 717.036619
+L 572.297308 718.389422
+L 572.561804 727.768693
+L 572.913128 717.559509
+L 573.000722 718.803678
+L 573.262937 727.201945
+L 573.611242 718.049761
+L 573.698085 719.190058
+L 573.958057 726.726621
+L 574.303395 718.509518
+L 574.3895 719.551309
+L 574.647268 726.328242
+L 574.989689 718.940848
+L 575.075069 719.889893
+L 575.330669 725.994944
+L 575.670221 719.345729
+L 575.754888 720.208006
+L 576.008357 725.716972
+L 576.345088 719.726045
+L 576.429053 720.507607
+L 576.680427 725.486257
+L 577.014384 720.083584
+L 577.097659 720.790438
+L 577.346971 725.296094
+L 577.678199 720.420035
+L 577.760795 721.058051
+L 578.008079 725.140868
+L 578.336622 720.736985
+L 578.418551 721.311826
+L 578.66384 725.015855
+L 578.826954 722.656964
+L 578.989741 721.035925
+L 579.071012 721.552997
+L 579.314338 724.917054
+L 579.47615 722.830186
+L 579.63764 721.318246
+L 579.718265 721.782663
+L 579.959658 724.841062
+L 580.120189 722.993022
+L 580.280403 721.585245
+L 580.360391 722.001809
+L 580.599883 724.784968
+L 580.759152 723.146937
+L 580.918108 721.838129
+L 580.99747 722.211318
+L 581.23509 724.746271
+L 581.393117 723.293178
+L 581.550837 722.078016
+L 581.629582 722.41198
+L 581.865359 724.722816
+L 582.022164 723.432811
+L 582.178666 722.305939
+L 582.256803 722.604512
+L 582.490766 724.712733
+L 582.646367 723.566743
+L 582.801669 722.522855
+L 582.879209 722.789556
+L 583.111385 724.714403
+L 583.188629 724.427418
+L 583.419922 722.729645
+L 583.496873 722.967695
+L 583.727289 724.726409
+L 583.803949 724.478948
+L 584.033495 722.927118
+L 584.109866 723.139456
+L 584.338548 724.747516
+L 584.414633 724.534271
+L 584.642459 723.116019
+L 584.718258 723.305317
+L 584.945234 724.77664
+L 585.020751 724.593061
+L 585.246882 723.297033
+L 585.322119 723.465713
+L 585.547413 724.812831
+L 585.622371 724.655007
+L 585.846833 723.470786
+L 585.921515 723.621041
+L 586.145151 724.85525
+L 586.21956 724.719811
+L 586.442376 723.637852
+L 586.516512 723.771661
+L 586.738515 724.903157
+L 586.812381 724.787194
+L 587.033576 723.798758
+L 587.107174 723.917903
+L 587.327567 724.955899
+L 587.400899 724.856894
+L 587.620496 723.953982
+L 587.693563 724.060068
+L 587.91237 725.012897
+L 587.985175 724.928668
+L 588.203197 724.103966
+L 588.275741 724.198433
+L 588.492984 725.073639
+L 588.56527 725.00229
+L 588.78174 724.249109
+L 588.853768 724.333249
+L 589.06947 725.137668
+L 589.141243 725.07755
+L 589.356183 724.389779
+L 589.427703 724.464749
+L 589.641885 725.20458
+L 589.713154 725.154259
+L 589.926584 724.526311
+L 589.997603 724.593144
+L 590.210287 725.274013
+L 590.281058 725.232238
+L 590.493 724.659009
+L 590.563525 724.71863
+L 590.774731 725.345646
+L 590.845011 725.311324
+L 591.055486 724.788152
+L 591.125523 724.841387
+L 591.335272 725.419193
+L 591.405068 725.391371
+L 591.614096 724.913996
+L 591.683652 724.96158
+L 591.961282 725.47224
+L 592.168883 725.036772
+L 592.237965 725.07936
+L 592.513707 725.553808
+L 592.719899 725.156691
+L 592.788514 725.194868
+L 593.062392 725.635962
+L 593.335348 725.308233
+L 593.607389 725.718598
+L 593.878519 725.419572
+L 594.148746 725.80162
+L 594.418075 725.528997
+L 594.686512 725.884945
+L 594.954063 725.636609
+L 595.220734 725.968493
+L 595.486531 725.7425
+L 595.751459 726.052193
+L 596.015525 725.846758
+L 596.278732 726.13598
+L 596.541088 725.949461
+L 596.802598 726.219797
+L 597.063267 726.050686
+L 597.3231 726.30359
+L 597.582104 726.1505
+L 597.840282 726.387311
+L 598.097641 726.248966
+L 598.418195 726.428763
+L 598.60992 726.346143
+L 598.928459 726.516856
+L 599.118983 726.442088
+L 599.435531 726.604328
+L 599.624869 726.536849
+L 599.939452 726.69119
+L 600.127617 726.630474
+L 600.440259 726.777448
+L 600.627267 726.723008
+L 600.937992 726.863109
+L 601.123857 726.814491
+L 601.432687 726.94818
+L 601.617422 726.90496
+L 601.924382 727.032666
+L 602.169116 727.031689
+L 602.413113 727.116573
+L 602.656378 727.11786
+L 602.898915 727.199907
+L 603.140728 727.203321
+L 603.381823 727.282671
+L 603.622202 727.288082
+L 603.861871 727.364872
+L 604.100834 727.372154
+L 604.339094 727.446513
+L 604.576656 727.455546
+L 604.872632 727.513023
+L 605.108638 727.572252
+L 605.343959 727.595388
+L 605.578599 727.652415
+L 605.870946 727.67085
+L 607.888383 728.045641
+L 608.455691 728.155133
+L 609.243311 728.275483
+L 609.856831 728.384118
+L 610.520872 728.482228
+L 611.234165 728.607885
+L 612.103535 728.754958
+L 613.123947 728.923285
+L 614.184367 729.109478
+L 615.386944 729.311097
+L 618.54253 729.827113
+L 621.194292 730.25754
+L 629.236503 731.536422
+L 647.527292 734.204819
+L 659.513636 735.709038
+L 669.7418 736.774869
+L 678.609007 737.480757
+L 686.363723 737.879839
+L 693.202836 738.013509
+L 693.520206 738.013829
+L 693.520206 738.013829
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_8">
+ <path d="M 62.57 703.24
+L 62.57 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_9">
+ <path d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_10">
+ <path d="M 62.57 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_11">
+ <path d="M 62.57 410.4
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_3">
+ <g id="patch_12">
+ <path d="M 62.57 1038.04
+L 693.54 1038.04
+L 693.54 745.2
+L 62.57 745.2
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_5">
+ <g id="xtick_41">
+ <g id="line2d_113">
+ <path clip-path="url(#p736961c50d)" d="M 62.57 1038.04
+L 62.57 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_114">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_31">
+ <!-- 10Hz -->
+ <g transform="translate(49.823125 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_42">
+ <g id="line2d_115">
+ <path clip-path="url(#p736961c50d)" d="M 62.57 1038.04
+L 62.57 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_116">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_43">
+ <g id="line2d_117">
+ <path clip-path="url(#p736961c50d)" d="M 118.76202 1038.04
+L 118.76202 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_118">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="118.76202" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_44">
+ <g id="line2d_119">
+ <path clip-path="url(#p736961c50d)" d="M 151.632244 1038.04
+L 151.632244 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_120">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="151.632244" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_45">
+ <g id="line2d_121">
+ <path clip-path="url(#p736961c50d)" d="M 174.954039 1038.04
+L 174.954039 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_122">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="174.954039" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_46">
+ <g id="line2d_123">
+ <path clip-path="url(#p736961c50d)" d="M 193.043829 1038.04
+L 193.043829 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_124">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="193.043829" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_47">
+ <g id="line2d_125">
+ <path clip-path="url(#p736961c50d)" d="M 207.824264 1038.04
+L 207.824264 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_126">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="207.824264" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_48">
+ <g id="line2d_127">
+ <path clip-path="url(#p736961c50d)" d="M 220.320943 1038.04
+L 220.320943 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_128">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="220.320943" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_49">
+ <g id="line2d_129">
+ <path clip-path="url(#p736961c50d)" d="M 231.146059 1038.04
+L 231.146059 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_130">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="231.146059" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_50">
+ <g id="line2d_131">
+ <path clip-path="url(#p736961c50d)" d="M 240.694488 1038.04
+L 240.694488 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_132">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="240.694488" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_51">
+ <g id="line2d_133">
+ <path clip-path="url(#p736961c50d)" d="M 249.235849 1038.04
+L 249.235849 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_134">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_32">
+ <!-- 100Hz -->
+ <g transform="translate(233.307724 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_52">
+ <g id="line2d_135">
+ <path clip-path="url(#p736961c50d)" d="M 249.235849 1038.04
+L 249.235849 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_136">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_53">
+ <g id="line2d_137">
+ <path clip-path="url(#p736961c50d)" d="M 305.427868 1038.04
+L 305.427868 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_138">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="305.427868" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_54">
+ <g id="line2d_139">
+ <path clip-path="url(#p736961c50d)" d="M 338.298093 1038.04
+L 338.298093 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_140">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="338.298093" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_55">
+ <g id="line2d_141">
+ <path clip-path="url(#p736961c50d)" d="M 361.619888 1038.04
+L 361.619888 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_142">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="361.619888" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_56">
+ <g id="line2d_143">
+ <path clip-path="url(#p736961c50d)" d="M 379.709678 1038.04
+L 379.709678 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_144">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="379.709678" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_57">
+ <g id="line2d_145">
+ <path clip-path="url(#p736961c50d)" d="M 394.490112 1038.04
+L 394.490112 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_146">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="394.490112" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_58">
+ <g id="line2d_147">
+ <path clip-path="url(#p736961c50d)" d="M 406.986791 1038.04
+L 406.986791 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_148">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="406.986791" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_59">
+ <g id="line2d_149">
+ <path clip-path="url(#p736961c50d)" d="M 417.811907 1038.04
+L 417.811907 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_150">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="417.811907" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_60">
+ <g id="line2d_151">
+ <path clip-path="url(#p736961c50d)" d="M 427.360336 1038.04
+L 427.360336 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_152">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="427.360336" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_61">
+ <g id="line2d_153">
+ <path clip-path="url(#p736961c50d)" d="M 435.901697 1038.04
+L 435.901697 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_154">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_33">
+ <!-- 1kHz -->
+ <g transform="translate(423.44076 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_62">
+ <g id="line2d_155">
+ <path clip-path="url(#p736961c50d)" d="M 435.901697 1038.04
+L 435.901697 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_156">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_63">
+ <g id="line2d_157">
+ <path clip-path="url(#p736961c50d)" d="M 492.093717 1038.04
+L 492.093717 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_158">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="492.093717" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_64">
+ <g id="line2d_159">
+ <path clip-path="url(#p736961c50d)" d="M 524.963941 1038.04
+L 524.963941 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_160">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.963941" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_65">
+ <g id="line2d_161">
+ <path clip-path="url(#p736961c50d)" d="M 548.285736 1038.04
+L 548.285736 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_162">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="548.285736" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_66">
+ <g id="line2d_163">
+ <path clip-path="url(#p736961c50d)" d="M 566.375526 1038.04
+L 566.375526 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_164">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="566.375526" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_67">
+ <g id="line2d_165">
+ <path clip-path="url(#p736961c50d)" d="M 581.155961 1038.04
+L 581.155961 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_166">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="581.155961" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_68">
+ <g id="line2d_167">
+ <path clip-path="url(#p736961c50d)" d="M 593.65264 1038.04
+L 593.65264 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_168">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.65264" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_69">
+ <g id="line2d_169">
+ <path clip-path="url(#p736961c50d)" d="M 604.477756 1038.04
+L 604.477756 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_170">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.477756" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_70">
+ <g id="line2d_171">
+ <path clip-path="url(#p736961c50d)" d="M 614.026185 1038.04
+L 614.026185 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_172">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="614.026185" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_71">
+ <g id="line2d_173">
+ <path clip-path="url(#p736961c50d)" d="M 622.567546 1038.04
+L 622.567546 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_174">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_34">
+ <!-- 10kHz -->
+ <g transform="translate(606.925358 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_72">
+ <g id="line2d_175">
+ <path clip-path="url(#p736961c50d)" d="M 622.567546 1038.04
+L 622.567546 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_176">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_73">
+ <g id="line2d_177">
+ <path clip-path="url(#p736961c50d)" d="M 678.759566 1038.04
+L 678.759566 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_178">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.759566" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_74">
+ <g id="line2d_179">
+ <path clip-path="url(#p736961c50d)" d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_180">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#m706a904f17" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_35">
+ <!-- 24kHz -->
+ <g transform="translate(677.897812 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_36">
+ <!-- Frequency (Hz) -->
+ <g transform="translate(339.882344 1066.316563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_6">
+ <g id="ytick_16">
+ <g id="line2d_181">
+ <path clip-path="url(#p736961c50d)" d="M 62.57 1007.214737
+L 693.54 1007.214737
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_182">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="1007.214737"/>
+ </g>
+ </g>
+ <g id="text_37">
+ <!-- −150 -->
+ <defs>
+ <path d="M 10.796875 72.90625
+L 49.515625 72.90625
+L 49.515625 64.59375
+L 19.828125 64.59375
+L 19.828125 46.734375
+Q 21.96875 47.46875 24.109375 47.828125
+Q 26.265625 48.1875 28.421875 48.1875
+Q 40.625 48.1875 47.75 41.5
+Q 54.890625 34.8125 54.890625 23.390625
+Q 54.890625 11.625 47.5625 5.09375
+Q 40.234375 -1.421875 26.90625 -1.421875
+Q 22.3125 -1.421875 17.546875 -0.640625
+Q 12.796875 0.140625 7.71875 1.703125
+L 7.71875 11.625
+Q 12.109375 9.234375 16.796875 8.0625
+Q 21.484375 6.890625 26.703125 6.890625
+Q 35.15625 6.890625 40.078125 11.328125
+Q 45.015625 15.765625 45.015625 23.390625
+Q 45.015625 31 40.078125 35.4375
+Q 35.15625 39.890625 26.703125 39.890625
+Q 22.75 39.890625 18.8125 39.015625
+Q 14.890625 38.140625 10.796875 36.28125
+z
+" id="DejaVuSans-53"/>
+ </defs>
+ <g transform="translate(28.102813 1011.013956)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_17">
+ <g id="line2d_183">
+ <path clip-path="url(#p736961c50d)" d="M 62.57 968.683158
+L 693.54 968.683158
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_184">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="968.683158"/>
+ </g>
+ </g>
+ <g id="text_38">
+ <!-- −100 -->
+ <g transform="translate(28.102813 972.482377)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_18">
+ <g id="line2d_185">
+ <path clip-path="url(#p736961c50d)" d="M 62.57 930.151579
+L 693.54 930.151579
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_186">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="930.151579"/>
+ </g>
+ </g>
+ <g id="text_39">
+ <!-- −50 -->
+ <g transform="translate(34.465313 933.950798)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-53"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_19">
+ <g id="line2d_187">
+ <path clip-path="url(#p736961c50d)" d="M 62.57 891.62
+L 693.54 891.62
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_188">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="891.62"/>
+ </g>
+ </g>
+ <g id="text_40">
+ <!-- 0 -->
+ <g transform="translate(49.2075 895.419219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_20">
+ <g id="line2d_189">
+ <path clip-path="url(#p736961c50d)" d="M 62.57 853.088421
+L 693.54 853.088421
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_190">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="853.088421"/>
+ </g>
+ </g>
+ <g id="text_41">
+ <!-- 50 -->
+ <g transform="translate(42.845 856.88764)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-53"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_21">
+ <g id="line2d_191">
+ <path clip-path="url(#p736961c50d)" d="M 62.57 814.556842
+L 693.54 814.556842
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_192">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="814.556842"/>
+ </g>
+ </g>
+ <g id="text_42">
+ <!-- 100 -->
+ <g transform="translate(36.4825 818.356061)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_22">
+ <g id="line2d_193">
+ <path clip-path="url(#p736961c50d)" d="M 62.57 776.025263
+L 693.54 776.025263
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_194">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mae574b6b19" y="776.025263"/>
+ </g>
+ </g>
+ <g id="text_43">
+ <!-- 150 -->
+ <g transform="translate(36.4825 779.824482)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-53"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_44">
+ <!-- Phase (${\circ}$) -->
+ <defs>
+ <path d="M 19.671875 64.796875
+L 19.671875 37.40625
+L 32.078125 37.40625
+Q 38.96875 37.40625 42.71875 40.96875
+Q 46.484375 44.53125 46.484375 51.125
+Q 46.484375 57.671875 42.71875 61.234375
+Q 38.96875 64.796875 32.078125 64.796875
+z
+M 9.8125 72.90625
+L 32.078125 72.90625
+Q 44.34375 72.90625 50.609375 67.359375
+Q 56.890625 61.8125 56.890625 51.125
+Q 56.890625 40.328125 50.609375 34.8125
+Q 44.34375 29.296875 32.078125 29.296875
+L 19.671875 29.296875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-80"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-104"/>
+ <path d="M 31.296875 40.671875
+Q 27.390625 40.671875 24.703125 37.953125
+Q 22.015625 35.25 22.015625 31.34375
+Q 22.015625 27.484375 24.703125 24.828125
+Q 27.390625 22.171875 31.296875 22.171875
+Q 35.203125 22.171875 37.890625 24.828125
+Q 40.578125 27.484375 40.578125 31.34375
+Q 40.578125 35.203125 37.859375 37.9375
+Q 35.15625 40.671875 31.296875 40.671875
+z
+M 31.296875 46.96875
+Q 34.421875 46.96875 37.296875 45.765625
+Q 40.1875 44.578125 42.28125 42.328125
+Q 44.53125 40.140625 45.65625 37.34375
+Q 46.78125 34.5625 46.78125 31.34375
+Q 46.78125 24.90625 42.265625 20.4375
+Q 37.75 15.96875 31.203125 15.96875
+Q 24.609375 15.96875 20.21875 20.359375
+Q 15.828125 24.75 15.828125 31.34375
+Q 15.828125 37.890625 20.3125 42.421875
+Q 24.8125 46.96875 31.296875 46.96875
+z
+" id="DejaVuSans-8728"/>
+ </defs>
+ <g transform="translate(22.023125 915.17)rotate(-90)scale(0.1 -0.1)">
+ <use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-80"/>
+ <use transform="translate(60.302734 0.015625)" xlink:href="#DejaVuSans-104"/>
+ <use transform="translate(123.681641 0.015625)" xlink:href="#DejaVuSans-97"/>
+ <use transform="translate(184.960938 0.015625)" xlink:href="#DejaVuSans-115"/>
+ <use transform="translate(237.060547 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(298.583984 0.015625)" xlink:href="#DejaVuSans-32"/>
+ <use transform="translate(330.371094 0.015625)" xlink:href="#DejaVuSans-40"/>
+ <use transform="translate(369.384766 0.015625)" xlink:href="#DejaVuSans-8728"/>
+ <use transform="translate(431.982422 0.015625)" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_195">
+ <path clip-path="url(#p736961c50d)" d="M -1 893.599051
+L 19.235765 893.599265
+L 75.427784 895.578577
+L 108.298009 897.557983
+L 131.619804 899.53753
+L 149.709594 901.517263
+L 164.490028 903.497231
+L 176.986708 905.47748
+L 187.811824 907.458058
+L 197.360253 909.439011
+L 205.901613 911.420386
+L 213.628214 913.402232
+L 220.682048 915.384595
+L 227.170946 917.367524
+L 233.178727 919.351065
+L 238.771838 921.335268
+L 244.003843 923.320179
+L 253.552272 927.292321
+L 262.093633 931.267881
+L 269.820234 935.247252
+L 276.874067 939.230829
+L 283.362966 943.219013
+L 289.370747 947.212211
+L 294.963857 951.210834
+L 300.195863 955.215299
+L 305.110576 959.226031
+L 309.744292 963.24346
+L 314.12741 967.268025
+L 318.285653 971.300174
+L 324.14854 977.363616
+L 329.615866 983.44673
+L 334.73765 989.551148
+L 339.554985 995.678566
+L 344.102043 1001.830746
+L 348.407548 1008.009522
+L 352.495873 1014.216812
+L 356.387882 1020.454625
+L 361.302596 1028.822848
+L 362.486091 753.497216
+L 367.054508 761.945493
+L 371.379157 770.464339
+L 375.48474 779.060088
+L 379.392386 787.739646
+L 383.120305 796.510601
+L 386.684305 805.381334
+L 390.92967 816.624407
+L 394.963733 828.058921
+L 398.806536 839.709399
+L 402.475395 851.605202
+L 405.985378 863.782267
+L 409.349676 876.285661
+L 412.579902 889.173356
+L 415.686334 902.52172
+L 418.67811 916.432866
+L 421.563395 931.043005
+L 424.34951 946.527011
+L 426.51145 959.678297
+L 428.617229 973.609003
+L 431.17479 992.15821
+L 434.141021 1015.720883
+L 435.584405 1027.687948
+L 436.059879 754.225484
+L 440.218121 787.949678
+L 442.876324 807.504339
+L 445.450126 824.602419
+L 447.944722 839.611706
+L 450.36484 852.935651
+L 453.099922 866.786962
+L 456.116752 880.848434
+L 459.381674 894.884976
+L 462.52018 907.409277
+L 465.870572 919.884337
+L 469.402804 932.166578
+L 473.088345 944.144954
+L 476.90056 955.738356
+L 480.814946 966.887307
+L 484.548998 976.878738
+L 488.367661 986.506582
+L 492.488593 996.282612
+L 496.635017 1005.532052
+L 500.579641 1013.833579
+L 504.545145 1021.712553
+L 508.713571 1029.545119
+L 508.90682 752.478444
+L 513.411754 760.43669
+L 516.63342 765.830047
+L 517.506066 767.229985
+L 518.197481 768.330451
+L 518.883049 769.437058
+L 519.562868 770.503048
+L 520.069017 771.249416
+L 520.905639 772.602748
+L 521.403499 773.305515
+L 522.062592 774.454494
+L 522.716369 775.290019
+L 523.364916 776.440398
+L 524.008316 777.205909
+L 524.646649 778.36624
+L 525.279996 779.055867
+L 525.908433 780.235738
+L 526.376584 780.591745
+L 526.842047 781.549669
+L 527.150878 782.05249
+L 527.611929 782.325157
+L 527.917846 782.919525
+L 528.374568 783.819998
+L 528.828732 783.999999
+L 529.1301 784.598361
+L 529.580062 785.541692
+L 530.02754 785.618206
+L 530.324493 786.221748
+L 530.767892 787.220954
+L 531.208879 787.181505
+L 531.501543 787.79114
+L 531.938568 788.861147
+L 532.37325 788.691418
+L 532.517628 788.885756
+L 533.09258 790.465629
+L 533.235683 790.409565
+L 533.521134 790.149273
+L 533.663483 790.325832
+L 534.230394 792.037786
+L 534.371505 791.94559
+L 534.652991 791.556205
+L 534.793369 791.71147
+L 535.35246 793.581048
+L 535.491633 793.450343
+L 535.769263 792.913154
+L 535.907722 793.042866
+L 536.459207 795.098912
+L 536.596494 794.927333
+L 536.870372 794.220874
+L 537.006965 794.319918
+L 537.551048 796.594966
+L 537.6865 796.380236
+L 537.956726 795.47992
+L 538.091503 795.542214
+L 538.628378 798.072908
+L 538.762044 797.812936
+L 539.028715 796.690651
+L 539.161722 796.70901
+L 539.427084 798.297425
+L 539.69158 799.536564
+L 539.823505 799.229577
+L 540.086713 797.853217
+L 540.217997 797.819216
+L 540.479929 799.568927
+L 540.741018 800.989906
+L 540.871247 800.634611
+L 541.131081 798.967552
+L 541.260686 798.871361
+L 541.519276 800.801711
+L 541.777044 802.437067
+L 541.905621 802.032865
+L 542.162166 800.033352
+L 542.290134 799.863572
+L 542.545466 801.995687
+L 542.799997 803.882348
+L 542.926963 803.429602
+L 543.306673 800.793531
+L 543.558829 803.150507
+L 543.810203 805.330223
+L 543.935598 804.830602
+L 544.310624 801.658434
+L 544.55968 804.265564
+L 544.807975 806.785336
+L 544.931837 806.242241
+L 545.302293 802.45494
+L 545.425403 803.435391
+L 545.793615 808.252488
+L 545.915982 807.671587
+L 546.281978 803.179112
+L 546.40361 804.241534
+L 546.767416 809.736608
+L 546.888323 809.126503
+L 547.249965 803.826342
+L 547.370155 804.979535
+L 547.729658 811.242709
+L 547.849139 810.615757
+L 548.20653 804.39127
+L 548.325311 805.645605
+L 548.680613 812.77583
+L 548.798702 812.149141
+L 549.151939 804.867687
+L 549.269344 806.235573
+L 549.620542 814.340942
+L 549.73727 813.737591
+L 550.086451 805.248415
+L 550.202511 806.7449
+L 550.549697 815.942838
+L 550.665097 815.393303
+L 551.010312 805.525181
+L 551.125058 807.168712
+L 551.468324 817.585982
+L 551.582424 817.129828
+L 551.923763 805.688464
+L 552.037224 807.501839
+L 552.376658 819.274328
+L 552.489487 818.962127
+L 552.827037 805.727331
+L 552.939241 807.738879
+L 553.274927 821.011108
+L 553.386514 820.906556
+L 553.720356 805.629255
+L 553.831332 807.874286
+L 554.273723 822.98073
+L 554.603939 805.379937
+L 554.713713 807.90248
+L 555.151328 825.203189
+L 555.477996 804.963137
+L 555.586593 807.817999
+L 556.019534 827.592801
+L 556.342729 804.360565
+L 556.450175 807.615683
+L 556.87854 830.167767
+L 557.198335 803.551859
+L 557.410833 814.795849
+L 557.728539 832.94413
+L 558.045006 802.514768
+L 558.15022 806.839842
+L 558.569719 835.93371
+L 558.674255 826.921867
+L 558.882925 801.225628
+L 559.091058 815.330229
+L 559.40226 839.141472
+L 559.505729 829.948362
+L 559.712271 799.660345
+L 559.918289 815.49213
+L 560.226338 842.562535
+L 560.328761 833.626908
+L 560.53322 797.79606
+L 560.737164 815.584068
+L 561.042123 846.179285
+L 561.143521 838.190516
+L 561.345938 795.613749
+L 561.648619 828.437556
+L 561.84978 849.959368
+L 561.950174 843.939946
+L 562.150589 793.101877
+L 562.450286 829.349994
+L 562.64947 853.855471
+L 562.748879 851.207346
+L 562.947332 790.26101
+L 563.539792 860.208235
+L 563.736321 787.108777
+L 564.323064 870.732623
+L 564.420442 777.510407
+L 564.517705 783.683965
+L 565.098839 881.889451
+L 565.195291 764.145644
+L 565.291629 780.047999
+L 565.867262 892.407102
+L 565.962804 1026.52599
+L 566.058235 776.282143
+L 566.153553 795.757076
+L 566.628469 901.375194
+L 566.723119 1013.112428
+L 566.817659 772.479915
+L 566.912089 794.193341
+L 567.382595 908.565677
+L 567.476369 1003.068762
+L 567.570035 768.73612
+L 567.663593 792.610608
+L 568.12977 914.186559
+L 568.222684 996.05809
+L 568.315493 765.135506
+L 568.408195 791.02742
+L 568.870122 918.56942
+L 568.962192 991.183148
+L 569.054158 761.744294
+L 569.14602 789.461107
+L 569.603773 922.01681
+L 569.695014 987.718967
+L 569.786153 758.606329
+L 569.87719 787.927147
+L 570.330845 924.763756
+L 570.421272 985.188597
+L 570.511598 755.743773
+L 570.601824 786.438724
+L 571.051454 926.982775
+L 571.141081 983.290806
+L 571.230609 753.160792
+L 571.320039 785.006478
+L 571.765713 928.798562
+L 571.943299 1028.275831
+L 572.031946 783.638449
+L 572.120497 810.835132
+L 572.473735 930.301498
+L 572.649778 1026.216885
+L 572.737657 782.340184
+L 572.82544 810.33746
+L 573.175626 931.557798
+L 573.350153 1024.389585
+L 573.437276 781.114969
+L 573.524306 809.84429
+L 573.871493 932.616678
+L 574.04453 1022.770531
+L 574.13091 779.964131
+L 574.217199 809.358619
+L 574.647268 978.432699
+L 574.733009 1021.336501
+L 574.818659 778.887372
+L 574.904219 808.882914
+L 575.330669 977.925749
+L 575.415691 1020.065557
+L 575.500623 777.883111
+L 575.585467 808.419151
+L 576.008357 977.497786
+L 576.092671 1018.937595
+L 576.176898 776.948793
+L 576.261037 807.968841
+L 576.764045 1017.934574
+L 576.847577 776.081174
+L 576.931024 807.533086
+L 577.429905 1017.040517
+L 577.512754 775.27655
+L 577.595519 807.112625
+L 578.09034 1016.241409
+L 578.172517 774.53096
+L 578.254611 806.707874
+L 578.745438 1015.525025
+L 578.826954 773.840328
+L 578.908389 806.318989
+L 579.395285 1014.880734
+L 579.47615 773.200584
+L 579.556936 805.945902
+L 580.039964 1014.299327
+L 580.120189 772.607754
+L 580.200335 805.588364
+L 580.679556 1013.772815
+L 580.759152 772.058012
+L 580.838669 805.245983
+L 581.314142 1013.294283
+L 581.393117 771.547725
+L 581.472016 804.918259
+L 581.943799 1012.857734
+L 582.022164 771.073477
+L 582.100452 804.604609
+L 582.568604 1012.45797
+L 582.646367 770.632079
+L 582.724055 804.304396
+L 583.188629 1012.090472
+L 583.2658 770.220574
+L 583.342897 804.016946
+L 583.803949 1011.751316
+L 583.880536 769.836237
+L 583.957051 803.741562
+L 584.414633 1011.437085
+L 584.490646 769.476562
+L 584.566588 803.477547
+L 585.020751 1011.144796
+L 585.096198 769.139254
+L 585.171575 803.224206
+L 585.622371 1010.871847
+L 585.697261 768.822221
+L 585.772081 802.980853
+L 586.21956 1010.615962
+L 586.2939 768.523549
+L 586.368172 802.746829
+L 586.812381 1010.375149
+L 586.88618 768.241508
+L 586.959911 802.521494
+L 587.400899 1010.147658
+L 587.474164 767.974518
+L 587.547363 802.304237
+L 587.985175 1009.931955
+L 588.057914 767.721152
+L 588.130588 802.094477
+L 588.56527 1009.726689
+L 588.637491 767.48011
+L 588.709647 801.891666
+L 589.141243 1009.530671
+L 589.212953 767.250222
+L 589.2846 801.695283
+L 589.713154 1009.342854
+L 589.78436 767.030421
+L 589.855503 801.504839
+L 590.281058 1009.162312
+L 590.351767 766.819747
+L 590.422414 801.31988
+L 590.845011 1008.988227
+L 590.91523 766.617334
+L 590.985388 801.13998
+L 591.405068 1008.819878
+L 591.474804 766.422388
+L 591.54448 800.964738
+L 591.961282 1008.656622
+L 592.030542 766.234204
+L 592.099742 800.793787
+L 592.513707 1008.497894
+L 592.582496 766.052133
+L 592.651227 800.626781
+L 593.062392 1008.34319
+L 593.130717 765.875597
+L 593.198985 800.463407
+L 593.607389 1008.192062
+L 593.675256 765.704068
+L 593.743067 800.303363
+L 594.148746 1008.044116
+L 594.216162 765.537071
+L 594.283522 800.146381
+L 594.686512 1007.898995
+L 594.753483 765.374173
+L 594.820398 799.992206
+L 595.220734 1007.756389
+L 595.287265 765.214985
+L 595.353742 799.840608
+L 595.751459 1007.616015
+L 595.817556 765.059154
+L 595.883599 799.691372
+L 596.278732 1007.477625
+L 596.344401 764.906362
+L 596.410017 799.544299
+L 596.802598 1007.340999
+L 596.867844 764.756319
+L 596.933037 799.399208
+L 597.3231 1007.205937
+L 597.387929 764.608762
+L 597.452706 799.255931
+L 597.840282 1007.072262
+L 597.904698 764.463457
+L 597.969064 799.114313
+L 598.354185 1006.939816
+L 598.418195 764.320185
+L 598.482154 798.974212
+L 598.864851 1006.808459
+L 598.928459 764.178754
+L 598.992017 798.835498
+L 599.37232 1006.678065
+L 599.435531 764.038986
+L 599.498693 798.69805
+L 599.876633 1006.548522
+L 599.939452 763.900721
+L 600.002222 798.561758
+L 600.377827 1006.419729
+L 600.440259 763.763815
+L 600.502643 798.42652
+L 600.875942 1006.291595
+L 600.937992 763.628134
+L 600.999994 798.292244
+L 601.371015 1006.164042
+L 601.432687 763.493561
+L 601.494312 798.158844
+L 601.863083 1006.036996
+L 601.924382 763.359987
+L 601.985635 798.02624
+L 602.352182 1005.910395
+L 602.413113 763.227312
+L 602.473997 797.894361
+L 602.838348 1005.784178
+L 602.898915 763.095447
+L 602.959436 797.763141
+L 603.321616 1005.658297
+L 603.381823 762.964313
+L 603.441984 797.632517
+L 603.80202 1005.532705
+L 603.861871 762.833835
+L 603.921678 797.502436
+L 604.279594 1005.40736
+L 604.339094 762.703945
+L 604.398549 797.372844
+L 604.754371 1005.282225
+L 604.813523 762.574584
+L 604.872632 797.243698
+L 605.226384 1005.157268
+L 605.285193 762.445694
+L 605.343959 797.114951
+L 605.695664 1005.032459
+L 605.754134 762.317228
+L 605.812561 796.986565
+L 606.162244 1004.907772
+L 606.220378 762.189137
+L 606.27847 796.858503
+L 606.626153 1004.783183
+L 606.683956 762.061384
+L 606.741717 796.73073
+L 607.087423 1004.658673
+L 607.144898 761.933927
+L 607.202331 796.60322
+L 607.546083 1004.53422
+L 607.603233 761.806734
+L 607.660344 796.475939
+L 608.002163 1004.409812
+L 608.058993 761.679774
+L 608.115783 796.348867
+L 608.455691 1004.285428
+L 608.512204 761.553018
+L 608.568678 796.221977
+L 608.906696 1004.16106
+L 608.962895 761.42644
+L 609.019056 796.09525
+L 609.355206 1004.036694
+L 609.411095 761.300018
+L 609.466947 795.968663
+L 609.801248 1003.912319
+L 609.856831 761.17373
+L 609.912376 795.842199
+L 610.244849 1003.787928
+L 610.300129 761.047555
+L 610.355371 795.715844
+L 610.686036 1003.663511
+L 610.741016 760.921481
+L 610.795959 795.589579
+L 611.124836 1003.539061
+L 611.179519 760.795486
+L 611.234165 795.463392
+L 611.561272 1003.414572
+L 611.615662 760.669558
+L 611.670015 795.337271
+L 611.995372 1003.290038
+L 612.049472 760.543684
+L 612.103535 795.211204
+L 612.42716 1003.165454
+L 612.480972 760.417852
+L 612.534748 795.085178
+L 612.85666 1003.040817
+L 612.910188 760.292052
+L 612.96368 794.959186
+L 613.283897 1002.916123
+L 613.337143 760.166275
+L 613.390355 794.833219
+L 613.708893 1002.791366
+L 613.761862 760.04051
+L 613.814795 794.707267
+L 614.131674 1002.666548
+L 614.184367 759.914749
+L 614.237025 794.581325
+L 614.552261 1002.541662
+L 614.604681 759.788988
+L 614.657067 794.455384
+L 614.970677 1002.416708
+L 615.022827 759.663218
+L 615.074944 794.329439
+L 615.386944 1002.291685
+L 615.438828 759.537433
+L 615.490678 794.203487
+L 615.801086 1002.16659
+L 615.852705 759.411629
+L 615.904291 794.077518
+L 616.213122 1002.041425
+L 616.264479 759.2858
+L 616.315804 793.951529
+L 616.623074 1001.916184
+L 616.674173 759.159943
+L 616.725239 793.825518
+L 617.030964 1001.790871
+L 617.081806 759.034055
+L 617.132617 793.699481
+L 617.436812 1001.665482
+L 617.487401 758.908129
+L 617.537957 793.573412
+L 617.840638 1001.540019
+L 617.890975 758.782164
+L 617.941281 793.447311
+L 618.242463 1001.41448
+L 618.292551 758.656158
+L 618.342609 793.321173
+L 618.642306 1001.288865
+L 618.692148 758.530107
+L 618.741959 793.194997
+L 619.040186 1001.163177
+L 619.089784 758.40401
+L 619.139352 793.068778
+L 619.436123 1001.037412
+L 619.485479 758.277866
+L 619.534806 792.942517
+L 619.830136 1000.911576
+L 619.879253 758.151672
+L 619.92834 792.816212
+L 620.222243 1000.78566
+L 620.271123 758.025428
+L 620.319974 792.689859
+L 620.612462 1000.659674
+L 620.661108 757.899131
+L 620.758312 827.224376
+L 621.000812 1000.533612
+L 621.049226 757.77278
+L 621.145965 827.098067
+L 621.387311 1000.407478
+L 621.435494 757.646377
+L 621.531774 826.971698
+L 621.771976 1000.281272
+L 621.819931 757.519917
+L 621.915756 826.845265
+L 622.154824 1000.154992
+L 622.202553 757.393403
+L 622.297927 826.718771
+L 622.535873 1000.028643
+L 622.583378 757.266833
+L 622.678305 826.592215
+L 622.915138 999.902221
+L 622.962422 757.140206
+L 623.056907 826.465599
+L 623.292638 999.77573
+L 623.339702 757.013523
+L 623.433749 826.338919
+L 623.668388 999.649168
+L 623.715235 756.886781
+L 623.808847 826.212179
+L 624.042405 999.522537
+L 624.089036 756.759981
+L 624.182218 826.085378
+L 624.414704 999.39584
+L 624.461121 756.633127
+L 624.553876 825.958517
+L 624.785301 999.269074
+L 624.831507 756.506214
+L 624.923839 825.831597
+L 625.154211 999.142242
+L 625.200207 756.379244
+L 625.292121 825.704616
+L 625.521451 999.015344
+L 625.567239 756.252217
+L 625.658738 825.577577
+L 625.887034 998.888382
+L 625.932616 756.125133
+L 626.023704 825.450478
+L 626.250976 998.761354
+L 626.296354 755.997992
+L 626.387034 825.323324
+L 626.613292 998.634264
+L 626.658467 755.870794
+L 626.748743 825.196111
+L 626.973995 998.50711
+L 627.01897 755.743542
+L 627.108846 825.068841
+L 627.3331 998.379896
+L 627.377877 755.616233
+L 627.467356 824.941514
+L 627.690622 998.252618
+L 627.735202 755.488869
+L 627.824288 824.814131
+L 628.046574 998.125281
+L 628.090959 755.361449
+L 628.179654 824.686693
+L 628.40097 997.997884
+L 628.445161 755.233975
+L 628.53347 824.559199
+L 628.753824 997.870428
+L 628.797823 755.106448
+L 628.885749 824.431651
+L 629.105148 997.742914
+L 629.148957 754.978866
+L 629.236503 824.304047
+L 629.454956 997.615342
+L 629.498576 754.851231
+L 629.585746 824.176393
+L 629.803262 997.487713
+L 629.846695 754.723541
+L 629.933491 824.048684
+L 630.150077 997.360028
+L 630.193325 754.5958
+L 630.279751 823.920923
+L 630.495415 997.232286
+L 630.538479 754.46801
+L 630.624538 823.79311
+L 630.839288 997.10449
+L 630.88217 754.340163
+L 630.967865 823.665242
+L 631.181708 996.976643
+L 631.22441 754.212269
+L 631.309744 823.537328
+L 631.522689 996.84874
+L 631.565211 754.084322
+L 631.650188 823.40936
+L 631.862241 996.720787
+L 631.904585 753.956326
+L 631.989207 823.281344
+L 632.200377 996.592781
+L 632.242545 753.828279
+L 632.326815 823.153279
+L 632.537108 996.464722
+L 632.579101 753.700187
+L 632.663023 823.025165
+L 632.872446 996.336614
+L 632.914266 753.572044
+L 632.997842 822.897004
+L 633.206403 996.208454
+L 633.248052 753.443852
+L 633.331284 822.768794
+L 633.53899 996.080249
+L 633.580468 753.315611
+L 633.66336 822.640536
+L 633.870218 995.95199
+L 633.911527 753.187328
+L 633.994081 822.512234
+L 634.200099 995.823687
+L 634.241239 753.058993
+L 634.323458 822.383883
+L 634.528642 995.695336
+L 634.569616 752.930617
+L 634.651503 822.25549
+L 634.855859 995.566937
+L 634.896669 752.802195
+L 634.978226 822.127049
+L 635.181761 995.438493
+L 635.222407 752.673726
+L 635.303637 821.998562
+L 635.506358 995.31
+L 635.546841 752.545215
+L 635.627747 821.870034
+L 635.82966 995.181464
+L 635.869982 752.416656
+L 635.950567 821.741459
+L 636.151678 995.052883
+L 636.191841 752.288057
+L 636.272106 821.612844
+L 636.472422 994.924259
+L 636.512426 752.159414
+L 636.592375 821.484184
+L 636.831749 1029.458095
+L 636.871576 786.693167
+L 636.951171 856.017686
+L 637.149819 1029.329368
+L 637.18949 786.564431
+L 637.268774 855.888947
+L 637.466645 1029.200599
+L 637.506162 786.435649
+L 637.585137 855.760167
+L 637.782239 1029.071788
+L 637.821602 786.306828
+L 637.90027 855.631345
+L 638.096608 1028.942938
+L 638.135819 786.177967
+L 638.214183 855.502483
+L 638.409764 1028.814048
+L 638.448823 786.049066
+L 638.526886 855.373581
+L 638.721714 1028.685118
+L 638.760623 785.920127
+L 638.838386 855.244639
+L 639.032468 1028.55615
+L 639.071229 785.791147
+L 639.148695 855.115656
+L 639.342036 1028.42714
+L 639.380649 785.662129
+L 639.45782 854.986636
+L 639.650426 1028.298096
+L 639.688892 785.533073
+L 639.76577 854.857579
+L 639.957647 1028.169011
+L 639.995968 785.403982
+L 640.072556 854.728482
+L 640.263709 1028.039888
+L 640.301885 785.274852
+L 640.378185 854.599348
+L 640.568619 1027.910729
+L 640.606652 785.145685
+L 640.682666 854.470178
+L 640.872387 1027.781534
+L 640.910278 785.01648
+L 640.986007 854.340969
+L 641.175021 1027.652303
+L 641.212771 784.887242
+L 641.288218 854.211726
+L 641.476529 1027.523036
+L 641.514139 784.75797
+L 641.589306 854.082447
+L 641.77692 1027.393733
+L 641.814391 784.628659
+L 641.88928 853.953133
+L 642.076202 1027.264395
+L 642.113535 784.499316
+L 642.188149 853.82378
+L 642.374384 1027.135025
+L 642.411579 784.369938
+L 642.485919 853.694397
+L 642.671472 1027.005619
+L 642.708532 784.240525
+L 642.7826 853.564981
+L 642.967476 1026.876179
+L 643.004401 784.111079
+L 643.078199 853.435529
+L 643.262403 1026.746706
+L 643.299193 783.981602
+L 643.372724 853.306044
+L 643.556261 1026.6172
+L 643.592918 783.852087
+L 643.666183 853.176525
+L 643.849057 1026.487661
+L 643.885583 783.722544
+L 643.958584 853.046974
+L 644.1408 1026.358092
+L 644.177194 783.592967
+L 644.249933 852.917392
+L 644.431497 1026.228489
+L 644.467761 783.463359
+L 644.54024 852.78778
+L 644.721155 1026.098856
+L 644.757289 783.333722
+L 644.82951 852.658134
+L 645.009781 1025.96919
+L 645.045788 783.204051
+L 645.117752 852.528457
+L 645.297384 1025.839497
+L 645.333263 783.074352
+L 645.404973 852.39875
+L 645.58397 1025.709769
+L 645.619722 782.944619
+L 645.691179 852.269013
+L 645.869547 1025.580014
+L 645.905173 782.81486
+L 645.976379 852.139245
+L 646.154121 1025.450228
+L 646.189622 782.685069
+L 646.260579 852.00945
+L 646.437699 1025.320413
+L 646.473077 782.55525
+L 646.543786 851.879623
+L 646.72029 1025.190568
+L 646.755544 782.425401
+L 646.826007 851.749767
+L 647.001898 1025.060695
+L 647.03703 782.295525
+L 647.107249 851.619885
+L 647.282532 1024.930794
+L 647.317543 782.165618
+L 647.387519 851.489973
+L 647.562197 1024.800864
+L 647.597087 782.035686
+L 647.666823 851.360034
+L 647.840901 1024.670907
+L 647.875672 781.905725
+L 647.945169 851.230065
+L 648.11865 1024.540924
+L 648.153302 781.775734
+L 648.222561 851.100071
+L 648.395451 1024.410912
+L 648.429985 781.645721
+L 648.499008 850.970049
+L 648.67131 1024.280873
+L 648.705726 781.515678
+L 648.774515 850.84
+L 648.946233 1024.15081
+L 648.980533 781.385608
+L 649.04909 850.709926
+L 649.220227 1024.020718
+L 649.254412 781.255513
+L 649.322737 850.579824
+L 649.493299 1023.8906
+L 649.527368 781.125394
+L 649.595464 850.449699
+L 649.765453 1023.760459
+L 649.799408 780.995248
+L 649.867276 850.319546
+L 650.036697 1023.63029
+L 650.070539 780.865074
+L 650.13818 850.189367
+L 650.307036 1023.500097
+L 650.340766 780.734881
+L 650.408182 850.059166
+L 650.576477 1023.369879
+L 650.610094 780.604657
+L 650.677287 849.928939
+L 650.845026 1023.239637
+L 650.878532 780.474413
+L 650.945502 849.798687
+L 651.112687 1023.109369
+L 651.146083 780.344141
+L 651.212833 849.668411
+L 651.379468 1022.979079
+L 651.412754 780.213848
+L 651.479285 849.538111
+L 651.645374 1022.848766
+L 651.678551 780.083529
+L 651.744864 849.407788
+L 651.91041 1022.718425
+L 651.943479 779.953188
+L 652.009576 849.277442
+L 652.174583 1022.588066
+L 652.207544 779.822826
+L 652.273426 849.14707
+L 652.437898 1022.457681
+L 652.470752 779.692435
+L 652.536421 849.016677
+L 652.70036 1022.327275
+L 652.733108 779.562028
+L 652.798565 848.886263
+L 652.961975 1022.196846
+L 652.994618 779.431592
+L 653.059864 848.755824
+L 653.222749 1022.066395
+L 653.255287 779.301139
+L 653.320323 848.625363
+L 653.482686 1021.93592
+L 653.51512 779.170663
+L 653.579948 848.494883
+L 653.741793 1021.805425
+L 653.774123 779.040167
+L 653.871037 883.026484
+L 654.000074 1021.674907
+L 654.032302 778.909647
+L 654.128907 882.895957
+L 654.257535 1021.544371
+L 654.28966 778.779106
+L 654.38596 882.765409
+L 654.514181 1021.413811
+L 654.546205 778.648546
+L 654.6422 882.63484
+L 654.770017 1021.283231
+L 654.80194 778.517962
+L 654.897633 882.504249
+L 655.025048 1021.152632
+L 655.056871 778.387359
+L 655.152264 882.373638
+L 655.27928 1021.022007
+L 655.311002 778.256735
+L 655.406097 882.243009
+L 655.532716 1020.891369
+L 655.56434 778.12609
+L 655.659138 882.112357
+L 655.785363 1020.760709
+L 655.816888 777.995426
+L 655.911392 881.981687
+L 656.037225 1020.630028
+L 656.068652 777.864744
+L 656.162863 881.850996
+L 656.288306 1020.499327
+L 656.319637 777.734043
+L 656.413556 881.720286
+L 656.538613 1020.368609
+L 656.569847 777.603319
+L 656.663477 881.589556
+L 656.788149 1020.237871
+L 656.819287 777.47258
+L 656.912629 881.458809
+L 657.036919 1020.107112
+L 657.067962 777.341819
+L 657.161019 881.328042
+L 657.284928 1019.976338
+L 657.315876 777.21104
+L 657.408649 881.197255
+L 657.532181 1019.845542
+L 657.563035 777.080245
+L 657.655525 881.066453
+L 657.778682 1019.714727
+L 657.809442 776.94943
+L 657.901652 880.93563
+L 658.024436 1019.583897
+L 658.055103 776.818598
+L 658.147034 880.804791
+L 658.269447 1019.453049
+L 658.300021 776.687746
+L 658.391675 880.673935
+L 658.51372 1019.322183
+L 658.544202 776.556878
+L 658.63558 880.54306
+L 658.757258 1019.191297
+L 658.787649 776.425989
+L 658.878754 880.412169
+L 659.000068 1019.060398
+L 659.030368 776.295087
+L 659.1212 880.281256
+L 659.242152 1018.929477
+L 659.272362 776.164166
+L 659.362924 880.15033
+L 659.483516 1018.798544
+L 659.513636 776.033227
+L 659.603929 880.019384
+L 659.724163 1018.667594
+L 659.754194 775.902274
+L 659.844219 879.888426
+L 659.964098 1018.536626
+L 659.99404 775.771304
+L 660.0838 879.757447
+L 660.203325 1018.405639
+L 660.233179 775.640317
+L 660.322674 879.626455
+L 660.441848 1018.274639
+L 660.471614 775.509312
+L 660.560847 879.495445
+L 660.679671 1018.14362
+L 660.70935 775.378294
+L 660.798322 879.36442
+L 660.916799 1018.012586
+L 660.946391 775.247258
+L 661.035103 879.233379
+L 661.153235 1017.881536
+L 661.182741 775.116208
+L 661.271195 879.102322
+L 661.388983 1017.750471
+L 661.418404 774.985142
+L 661.506601 878.971251
+L 661.624048 1017.619391
+L 661.653383 774.85406
+L 661.741325 878.840161
+L 661.858433 1017.488294
+L 661.887684 774.722962
+L 661.975372 878.709059
+L 662.092143 1017.357186
+L 662.121309 774.591849
+L 662.208746 878.577942
+L 662.325181 1017.22606
+L 662.354263 774.460723
+L 662.441449 878.446809
+L 662.55755 1017.094921
+L 662.58655 774.32958
+L 662.673486 878.315661
+L 662.789256 1016.963766
+L 662.818173 774.198424
+L 662.904861 878.1845
+L 663.020301 1016.832596
+L 663.049136 774.067253
+L 663.135577 878.053324
+L 663.25069 1016.701414
+L 663.279443 773.936067
+L 663.365639 877.922133
+L 663.480426 1016.570217
+L 663.509097 773.804869
+L 663.59505 877.790929
+L 663.709512 1016.439005
+L 663.738103 773.673654
+L 663.823813 877.659709
+L 663.937953 1016.30778
+L 663.966463 773.542429
+L 664.051933 877.528479
+L 664.165752 1016.176541
+L 664.194182 773.411187
+L 664.279412 877.397233
+L 664.392913 1016.045288
+L 664.421264 773.279935
+L 664.506255 877.265974
+L 664.619439 1015.914024
+L 664.64771 773.148667
+L 664.732465 877.134699
+L 664.845334 1015.782743
+L 664.873527 773.017385
+L 664.958046 877.003414
+L 665.070601 1015.651452
+L 665.098715 772.886092
+L 665.183 876.872116
+L 665.295244 1015.520146
+L 665.323281 772.754786
+L 665.407332 876.740804
+L 665.519266 1015.388827
+L 665.547225 772.623464
+L 665.631045 876.609479
+L 665.742671 1015.2575
+L 665.770553 772.492133
+L 665.854143 876.478142
+L 665.965462 1015.126153
+L 665.993267 772.360789
+L 666.076628 876.346795
+L 666.187642 1014.994799
+L 666.215372 772.229429
+L 666.298504 876.215434
+L 666.409215 1014.863429
+L 666.436869 772.098062
+L 666.519774 876.084058
+L 666.630184 1014.732051
+L 666.657763 771.966677
+L 666.740443 875.952672
+L 666.850552 1014.600658
+L 666.878056 771.835286
+L 666.960512 875.821272
+L 667.070323 1014.469255
+L 667.097752 771.70388
+L 667.179985 875.689864
+L 667.2895 1014.337838
+L 667.316855 771.572464
+L 667.398866 875.558442
+L 667.508085 1014.20641
+L 667.535367 771.441037
+L 667.617158 875.427009
+L 667.726083 1014.074973
+L 667.753292 771.309596
+L 667.834863 875.295568
+L 667.943497 1013.943522
+L 667.970632 771.178144
+L 668.051985 875.164109
+L 668.160329 1013.812061
+L 668.187392 771.046681
+L 668.268527 875.032642
+L 668.376582 1013.680587
+L 668.403573 770.915207
+L 668.484493 874.901163
+L 668.59226 1013.549104
+L 668.61918 770.783721
+L 668.699884 874.769674
+L 668.807366 1013.41761
+L 668.834214 770.652226
+L 668.914705 874.638174
+L 669.021902 1013.286106
+L 669.04868 770.52072
+L 669.128958 874.506664
+L 669.235873 1013.15459
+L 669.262579 770.389201
+L 669.342646 874.375142
+L 669.44928 1013.023063
+L 669.475916 770.257672
+L 669.555773 874.243611
+L 669.662126 1012.891525
+L 669.688693 770.126134
+L 669.768341 874.112068
+L 669.874416 1012.759979
+L 669.900913 769.994586
+L 669.980352 873.980516
+L 670.086151 1012.628421
+L 670.112579 769.863027
+L 670.191811 873.848953
+L 670.297334 1012.496854
+L 670.323693 769.731459
+L 670.40272 873.717381
+L 670.507969 1012.365277
+L 670.534259 769.59988
+L 670.613081 873.5858
+L 670.718057 1012.233688
+L 670.74428 769.468291
+L 670.822898 873.454207
+L 670.927603 1012.102092
+L 670.953758 769.336694
+L 671.032173 873.322605
+L 671.136608 1011.970485
+L 671.162696 769.205085
+L 671.24091 873.190993
+L 671.345076 1011.838869
+L 671.371097 769.07347
+L 671.44911 873.059374
+L 671.55301 1011.707243
+L 671.578964 768.941844
+L 671.656777 872.927743
+L 671.760411 1011.575608
+L 671.786299 768.810207
+L 671.863913 872.796105
+L 671.967283 1011.443964
+L 671.993105 768.678561
+L 672.070522 872.664455
+L 672.173629 1011.312311
+L 672.199385 768.546908
+L 672.276605 872.532796
+L 672.37945 1011.18065
+L 672.405141 768.415245
+L 672.482165 872.401132
+L 672.584751 1011.048978
+L 672.610377 768.283573
+L 672.687206 872.269454
+L 672.789532 1010.917297
+L 672.815094 768.151891
+L 672.89173 872.137772
+L 672.993798 1010.785609
+L 673.019295 768.020201
+L 673.095739 872.006079
+L 673.197551 1010.653913
+L 673.222984 767.888503
+L 673.299235 871.874377
+L 673.400792 1010.522207
+L 673.426162 767.756796
+L 673.502222 871.742669
+L 673.603526 1010.390495
+L 673.628832 767.625081
+L 673.704702 871.61095
+L 673.805753 1010.25877
+L 673.830996 767.493357
+L 673.906678 871.479224
+L 674.007478 1010.127042
+L 674.032658 767.361627
+L 674.108152 871.347487
+L 674.208701 1009.995302
+L 674.233819 767.229887
+L 674.309126 871.215746
+L 674.409427 1009.863558
+L 674.434483 767.098141
+L 674.509603 871.083996
+L 674.609656 1009.731801
+L 674.63465 766.966387
+L 674.709586 870.952238
+L 674.809393 1009.60004
+L 674.834325 766.834624
+L 674.909077 870.820474
+L 675.008638 1009.46827
+L 675.033509 766.702853
+L 675.108078 870.6887
+L 675.207395 1009.336493
+L 675.232206 766.571073
+L 675.306591 870.556917
+L 675.405666 1009.20471
+L 675.430416 766.439289
+L 675.50462 870.425128
+L 675.603453 1009.072916
+L 675.628143 766.307495
+L 675.702166 870.293333
+L 675.800759 1008.941117
+L 675.825388 766.175696
+L 675.899232 870.161529
+L 675.997585 1008.80931
+L 676.022155 766.043888
+L 676.09582 870.02972
+L 676.193935 1008.677498
+L 676.218446 765.912071
+L 676.291932 869.897901
+L 676.389811 1008.545675
+L 676.414262 765.780249
+L 676.487572 869.766076
+L 676.585214 1008.413848
+L 676.609607 765.64842
+L 676.68274 869.634247
+L 676.780148 1008.282012
+L 676.804482 765.516586
+L 676.877439 869.50241
+L 676.974614 1008.150169
+L 676.998889 765.384742
+L 677.095919 904.032504
+L 677.168614 1008.018323
+L 677.192832 765.252894
+L 677.289629 903.900652
+L 677.362152 1007.886466
+L 677.386312 765.121037
+L 677.482879 903.768792
+L 677.555228 1007.754606
+L 677.579331 764.989176
+L 677.675668 903.636926
+L 677.747846 1007.622738
+L 677.771891 764.857308
+L 677.868 903.505054
+L 677.940007 1007.490864
+L 677.963995 764.725434
+L 678.059877 903.373178
+L 678.131714 1007.358983
+L 678.155645 764.593552
+L 678.251301 903.241291
+L 678.322968 1007.227098
+L 678.346844 764.461664
+L 678.442274 903.109401
+L 678.513773 1007.095204
+L 678.537592 764.329771
+L 678.632798 902.977504
+L 678.704129 1006.963307
+L 678.727892 764.197871
+L 678.822875 902.845601
+L 678.894039 1006.831403
+L 678.917747 764.065967
+L 679.012508 902.713695
+L 679.083506 1006.699492
+L 679.107158 763.934056
+L 679.201698 902.58178
+L 679.272531 1006.567576
+L 679.296128 763.802136
+L 679.390448 902.449861
+L 679.461116 1006.435655
+L 679.484658 763.670213
+L 679.578759 902.317933
+L 679.649263 1006.303727
+L 679.672751 763.538284
+L 679.766634 902.186004
+L 679.836975 1006.171793
+L 679.860408 763.406351
+L 679.954074 902.054068
+L 680.024253 1006.039853
+L 680.047632 763.274413
+L 680.141082 901.922125
+L 680.211099 1005.907909
+L 680.234425 763.14247
+L 680.32766 901.790177
+L 680.397516 1005.77596
+L 680.420788 763.010518
+L 680.513809 901.658226
+L 680.583505 1005.644004
+L 680.606724 762.878565
+L 680.699532 901.526266
+L 680.769068 1005.512045
+L 680.792234 762.746604
+L 680.88483 901.394305
+L 680.954208 1005.38008
+L 680.977321 762.614642
+L 681.069706 901.262338
+L 681.138926 1005.248111
+L 681.161986 762.482669
+L 681.254161 901.130365
+L 681.323223 1005.116139
+L 681.346231 762.350695
+L 681.438197 900.998387
+L 681.507103 1004.98416
+L 681.530059 762.218713
+L 681.621816 900.866406
+L 681.690567 1004.852175
+L 681.71347 762.086728
+L 681.805021 900.734419
+L 681.873616 1004.720186
+L 681.896468 761.954739
+L 681.987812 900.602429
+L 682.056253 1004.588192
+L 682.079054 761.822746
+L 682.170192 900.470431
+L 682.238479 1004.456195
+L 682.261229 761.690745
+L 682.352163 900.338431
+L 682.420297 1004.324194
+L 682.442996 761.558744
+L 682.533727 900.206424
+L 682.601708 1004.192187
+L 682.624356 761.426736
+L 682.714884 900.074416
+L 682.782714 1004.060174
+L 682.805311 761.294725
+L 682.895638 899.942402
+L 682.963316 1003.928159
+L 682.985863 761.162711
+L 683.075989 899.810385
+L 683.143518 1003.796139
+L 683.166015 761.03069
+L 683.25594 899.678363
+L 683.323319 1003.664117
+L 683.345766 760.898667
+L 683.435493 899.546336
+L 683.502723 1003.532089
+L 683.52512 760.76664
+L 683.614648 899.414305
+L 683.68173 1003.400058
+L 683.704078 760.634607
+L 683.793409 899.282272
+L 683.860343 1003.268023
+L 683.882642 760.502571
+L 683.971777 899.150235
+L 684.038563 1003.135983
+L 684.060813 760.370531
+L 684.149752 899.018195
+L 684.216393 1003.003942
+L 684.238594 760.23849
+L 684.327338 898.886149
+L 684.393833 1002.871896
+L 684.415986 760.106442
+L 684.504536 898.754101
+L 684.570886 1002.739846
+L 684.59299 759.97439
+L 684.681347 898.622049
+L 684.747552 1002.607791
+L 684.769609 759.842338
+L 684.857774 898.489994
+L 684.923835 1002.475736
+L 684.945843 759.710281
+L 685.033817 898.357935
+L 685.099735 1002.343675
+L 685.121696 759.578219
+L 685.209479 898.225874
+L 685.275254 1002.211614
+L 685.297168 759.446155
+L 685.384761 898.093808
+L 685.450395 1002.079544
+L 685.47226 759.314088
+L 685.559665 897.961739
+L 685.625157 1001.947475
+L 685.646976 759.182018
+L 685.734193 897.829666
+L 685.799544 1001.8154
+L 685.821316 759.049947
+L 685.908345 897.697592
+L 685.973556 1001.683326
+L 685.995281 758.917871
+L 686.082124 897.565513
+L 686.147196 1001.551248
+L 686.168874 758.785789
+L 686.255532 897.433433
+L 686.320464 1001.419166
+L 686.342097 758.653709
+L 686.428569 897.301347
+L 686.493363 1001.28708
+L 686.514949 758.521622
+L 686.601238 897.169262
+L 686.665894 1001.154994
+L 686.687434 758.389534
+L 686.77354 897.037172
+L 686.838058 1001.022903
+L 686.859553 758.257443
+L 686.945476 896.905082
+L 687.009858 1000.89081
+L 687.031308 758.125351
+L 687.117048 896.772988
+L 687.181295 1000.758714
+L 687.202699 757.993253
+L 687.288258 896.64089
+L 687.352369 1000.626617
+L 687.373728 757.861158
+L 687.459108 896.508792
+L 687.523083 1000.494516
+L 687.544398 757.729057
+L 687.629598 896.376689
+L 687.693439 1000.362413
+L 687.714708 757.596955
+L 687.79973 896.244587
+L 687.863437 1000.23031
+L 687.884662 757.46485
+L 687.969506 896.112483
+L 688.03308 1000.098201
+L 688.054261 757.332743
+L 688.138927 895.980372
+L 688.202369 999.966093
+L 688.223505 757.200634
+L 688.307995 895.848262
+L 688.371304 999.833983
+L 688.392396 757.068521
+L 688.47671 895.716148
+L 688.539888 999.701869
+L 688.560937 756.936408
+L 688.645076 895.584033
+L 688.708123 999.569755
+L 688.729128 756.804292
+L 688.813092 895.451917
+L 688.876009 999.437639
+L 688.89697 756.672175
+L 688.980761 895.3198
+L 689.043548 999.305519
+L 689.064466 756.540057
+L 689.148084 895.18768
+L 689.210742 999.173397
+L 689.231617 756.407933
+L 689.315063 895.055557
+L 689.377591 999.041276
+L 689.398423 756.275811
+L 689.481698 894.923434
+L 689.544098 998.90915
+L 689.564887 756.143685
+L 689.647991 894.79131
+L 689.710263 998.777025
+L 689.73101 756.011562
+L 689.813944 894.659183
+L 689.876089 998.644896
+L 689.896793 755.879433
+L 689.979558 894.527054
+L 690.041576 998.51277
+L 690.062238 755.747309
+L 690.144834 894.394925
+L 690.206726 998.380639
+L 690.227346 755.615176
+L 690.309774 894.262791
+L 690.37154 998.248512
+L 690.392118 755.483048
+L 690.474379 894.130661
+L 690.53602 998.116374
+L 690.556556 755.350913
+L 690.63865 893.998527
+L 690.700167 997.984241
+L 690.720662 755.218776
+L 690.80259 893.866394
+L 690.863982 997.852107
+L 690.884435 755.086643
+L 690.966198 893.73426
+L 691.027466 997.719973
+L 691.047879 754.954511
+L 691.129477 893.602124
+L 691.190622 997.587833
+L 691.210993 754.82237
+L 691.292428 893.469988
+L 691.35345 997.455695
+L 691.37378 754.69023
+L 691.455052 893.33785
+L 691.515952 997.32356
+L 691.536241 754.558095
+L 691.61735 893.205708
+L 691.678128 997.19142
+L 691.698377 754.42595
+L 691.779324 893.073571
+L 691.839981 997.059283
+L 691.86019 754.293811
+L 691.940975 892.941433
+L 692.001511 996.927136
+L 692.02168 754.161674
+L 692.102304 892.809285
+L 692.16272 996.794997
+L 692.182849 754.029533
+L 692.263313 892.677146
+L 692.323609 996.662858
+L 692.343698 753.89739
+L 692.424003 892.545003
+L 692.484179 996.530713
+L 692.504228 753.765246
+L 692.584375 892.41286
+L 692.644432 996.398569
+L 692.664442 753.633109
+L 692.74443 892.280716
+L 692.804369 996.266425
+L 692.824339 753.500961
+L 692.90417 892.148572
+L 692.963991 996.134284
+L 692.983922 753.368819
+L 693.063595 892.016432
+L 693.123299 996.002141
+L 693.143191 753.23668
+L 693.222708 891.884285
+L 693.282295 995.869997
+L 693.302148 753.104532
+L 693.381509 891.752145
+L 693.44098 995.737851
+L 693.460793 752.972387
+L 693.520206 856.9581
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_13">
+ <path d="M 62.57 1038.04
+L 62.57 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_14">
+ <path d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_15">
+ <path d="M 62.57 1038.04
+L 693.54 1038.04
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_16">
+ <path d="M 62.57 745.2
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="text_45">
+ <!-- 12th-order Butterworth filter, lowpass 1khz -->
+ <defs>
+ <path d="M 4.890625 31.390625
+L 31.203125 31.390625
+L 31.203125 23.390625
+L 4.890625 23.390625
+z
+" id="DejaVuSans-45"/>
+ <path d="M 30.609375 48.390625
+Q 23.390625 48.390625 19.1875 42.75
+Q 14.984375 37.109375 14.984375 27.296875
+Q 14.984375 17.484375 19.15625 11.84375
+Q 23.34375 6.203125 30.609375 6.203125
+Q 37.796875 6.203125 41.984375 11.859375
+Q 46.1875 17.53125 46.1875 27.296875
+Q 46.1875 37.015625 41.984375 42.703125
+Q 37.796875 48.390625 30.609375 48.390625
+z
+M 30.609375 56
+Q 42.328125 56 49.015625 48.375
+Q 55.71875 40.765625 55.71875 27.296875
+Q 55.71875 13.875 49.015625 6.21875
+Q 42.328125 -1.421875 30.609375 -1.421875
+Q 18.84375 -1.421875 12.171875 6.21875
+Q 5.515625 13.875 5.515625 27.296875
+Q 5.515625 40.765625 12.171875 48.375
+Q 18.84375 56 30.609375 56
+z
+" id="DejaVuSans-111"/>
+ <path d="M 4.203125 54.6875
+L 13.1875 54.6875
+L 24.421875 12.015625
+L 35.59375 54.6875
+L 46.1875 54.6875
+L 57.421875 12.015625
+L 68.609375 54.6875
+L 77.59375 54.6875
+L 63.28125 0
+L 52.6875 0
+L 40.921875 44.828125
+L 29.109375 0
+L 18.5 0
+z
+" id="DejaVuSans-119"/>
+ <path d="M 37.109375 75.984375
+L 37.109375 68.5
+L 28.515625 68.5
+Q 23.6875 68.5 21.796875 66.546875
+Q 19.921875 64.59375 19.921875 59.515625
+L 19.921875 54.6875
+L 34.71875 54.6875
+L 34.71875 47.703125
+L 19.921875 47.703125
+L 19.921875 0
+L 10.890625 0
+L 10.890625 47.703125
+L 2.296875 47.703125
+L 2.296875 54.6875
+L 10.890625 54.6875
+L 10.890625 58.5
+Q 10.890625 67.625 15.140625 71.796875
+Q 19.390625 75.984375 28.609375 75.984375
+z
+" id="DejaVuSans-102"/>
+ <path d="M 11.71875 12.40625
+L 22.015625 12.40625
+L 22.015625 4
+L 14.015625 -11.625
+L 7.71875 -11.625
+L 11.71875 4
+z
+" id="DejaVuSans-44"/>
+ </defs>
+ <g transform="translate(186.99 33.7575)scale(0.16 -0.16)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-50"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-116"/>
+ <use x="166.455078" xlink:href="#DejaVuSans-104"/>
+ <use x="229.833984" xlink:href="#DejaVuSans-45"/>
+ <use x="265.933594" xlink:href="#DejaVuSans-111"/>
+ <use x="327.115234" xlink:href="#DejaVuSans-114"/>
+ <use x="368.212891" xlink:href="#DejaVuSans-100"/>
+ <use x="431.689453" xlink:href="#DejaVuSans-101"/>
+ <use x="493.212891" xlink:href="#DejaVuSans-114"/>
+ <use x="534.326172" xlink:href="#DejaVuSans-32"/>
+ <use x="566.113281" xlink:href="#DejaVuSans-66"/>
+ <use x="634.716797" xlink:href="#DejaVuSans-117"/>
+ <use x="698.095703" xlink:href="#DejaVuSans-116"/>
+ <use x="737.304688" xlink:href="#DejaVuSans-116"/>
+ <use x="776.513672" xlink:href="#DejaVuSans-101"/>
+ <use x="838.037109" xlink:href="#DejaVuSans-114"/>
+ <use x="879.150391" xlink:href="#DejaVuSans-119"/>
+ <use x="960.9375" xlink:href="#DejaVuSans-111"/>
+ <use x="1022.119141" xlink:href="#DejaVuSans-114"/>
+ <use x="1063.232422" xlink:href="#DejaVuSans-116"/>
+ <use x="1102.441406" xlink:href="#DejaVuSans-104"/>
+ <use x="1165.820312" xlink:href="#DejaVuSans-32"/>
+ <use x="1197.607422" xlink:href="#DejaVuSans-102"/>
+ <use x="1232.8125" xlink:href="#DejaVuSans-105"/>
+ <use x="1260.595703" xlink:href="#DejaVuSans-108"/>
+ <use x="1288.378906" xlink:href="#DejaVuSans-116"/>
+ <use x="1327.587891" xlink:href="#DejaVuSans-101"/>
+ <use x="1389.111328" xlink:href="#DejaVuSans-114"/>
+ <use x="1430.224609" xlink:href="#DejaVuSans-44"/>
+ <use x="1462.011719" xlink:href="#DejaVuSans-32"/>
+ <use x="1493.798828" xlink:href="#DejaVuSans-108"/>
+ <use x="1521.582031" xlink:href="#DejaVuSans-111"/>
+ <use x="1582.763672" xlink:href="#DejaVuSans-119"/>
+ <use x="1664.550781" xlink:href="#DejaVuSans-112"/>
+ <use x="1728.027344" xlink:href="#DejaVuSans-97"/>
+ <use x="1789.306641" xlink:href="#DejaVuSans-115"/>
+ <use x="1841.40625" xlink:href="#DejaVuSans-115"/>
+ <use x="1893.505859" xlink:href="#DejaVuSans-32"/>
+ <use x="1925.292969" xlink:href="#DejaVuSans-49"/>
+ <use x="1988.916016" xlink:href="#DejaVuSans-107"/>
+ <use x="2046.826172" xlink:href="#DejaVuSans-104"/>
+ <use x="2110.205078" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="p85394db85d">
+ <rect height="292.84" width="630.97" x="62.57" y="75.6"/>
+ </clipPath>
+ <clipPath id="pcf45b32dd3">
+ <rect height="292.84" width="630.97" x="62.57" y="410.4"/>
+ </clipPath>
+ <clipPath id="p736961c50d">
+ <rect height="292.84" width="630.97" x="62.57" y="745.2"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/docs/docs/img/butterworth_lowpass24.svg b/docs/docs/img/butterworth_lowpass24.svg
@@ -0,0 +1,4527 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Created with matplotlib (https://matplotlib.org/) -->
+<svg height="1080pt" version="1.1" viewBox="0 0 720 1080" width="720pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+ </style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 1080
+L 720 1080
+L 720 0
+L 0 0
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="axes_1">
+ <g id="patch_2">
+ <path d="M 62.57 368.44
+L 693.54 368.44
+L 693.54 75.6
+L 62.57 75.6
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_1">
+ <g id="xtick_1">
+ <g id="line2d_1">
+ <path clip-path="url(#p0d5dc64309)" d="M 62.57 368.44
+L 62.57 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_2">
+ <defs>
+ <path d="M 0 0
+L 0 3.5
+" id="m8942888552" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m8942888552" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- 0 -->
+ <defs>
+ <path d="M 31.78125 66.40625
+Q 24.171875 66.40625 20.328125 58.90625
+Q 16.5 51.421875 16.5 36.375
+Q 16.5 21.390625 20.328125 13.890625
+Q 24.171875 6.390625 31.78125 6.390625
+Q 39.453125 6.390625 43.28125 13.890625
+Q 47.125 21.390625 47.125 36.375
+Q 47.125 51.421875 43.28125 58.90625
+Q 39.453125 66.40625 31.78125 66.40625
+z
+M 31.78125 74.21875
+Q 44.046875 74.21875 50.515625 64.515625
+Q 56.984375 54.828125 56.984375 36.375
+Q 56.984375 17.96875 50.515625 8.265625
+Q 44.046875 -1.421875 31.78125 -1.421875
+Q 19.53125 -1.421875 13.0625 8.265625
+Q 6.59375 17.96875 6.59375 36.375
+Q 6.59375 54.828125 13.0625 64.515625
+Q 19.53125 74.21875 31.78125 74.21875
+z
+" id="DejaVuSans-48"/>
+ </defs>
+ <g transform="translate(59.38875 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_2">
+ <g id="line2d_3">
+ <path clip-path="url(#p0d5dc64309)" d="M 185.926794 368.44
+L 185.926794 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_4">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="185.926794" xlink:href="#m8942888552" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- 200 -->
+ <defs>
+ <path d="M 19.1875 8.296875
+L 53.609375 8.296875
+L 53.609375 0
+L 7.328125 0
+L 7.328125 8.296875
+Q 12.9375 14.109375 22.625 23.890625
+Q 32.328125 33.6875 34.8125 36.53125
+Q 39.546875 41.84375 41.421875 45.53125
+Q 43.3125 49.21875 43.3125 52.78125
+Q 43.3125 58.59375 39.234375 62.25
+Q 35.15625 65.921875 28.609375 65.921875
+Q 23.96875 65.921875 18.8125 64.3125
+Q 13.671875 62.703125 7.8125 59.421875
+L 7.8125 69.390625
+Q 13.765625 71.78125 18.9375 73
+Q 24.125 74.21875 28.421875 74.21875
+Q 39.75 74.21875 46.484375 68.546875
+Q 53.21875 62.890625 53.21875 53.421875
+Q 53.21875 48.921875 51.53125 44.890625
+Q 49.859375 40.875 45.40625 35.40625
+Q 44.1875 33.984375 37.640625 27.21875
+Q 31.109375 20.453125 19.1875 8.296875
+z
+" id="DejaVuSans-50"/>
+ </defs>
+ <g transform="translate(176.383044 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_3">
+ <g id="line2d_5">
+ <path clip-path="url(#p0d5dc64309)" d="M 309.283587 368.44
+L 309.283587 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_6">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="309.283587" xlink:href="#m8942888552" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- 400 -->
+ <defs>
+ <path d="M 37.796875 64.3125
+L 12.890625 25.390625
+L 37.796875 25.390625
+z
+M 35.203125 72.90625
+L 47.609375 72.90625
+L 47.609375 25.390625
+L 58.015625 25.390625
+L 58.015625 17.1875
+L 47.609375 17.1875
+L 47.609375 0
+L 37.796875 0
+L 37.796875 17.1875
+L 4.890625 17.1875
+L 4.890625 26.703125
+z
+" id="DejaVuSans-52"/>
+ </defs>
+ <g transform="translate(299.739837 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-52"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_4">
+ <g id="line2d_7">
+ <path clip-path="url(#p0d5dc64309)" d="M 432.640381 368.44
+L 432.640381 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_8">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="432.640381" xlink:href="#m8942888552" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- 600 -->
+ <defs>
+ <path d="M 33.015625 40.375
+Q 26.375 40.375 22.484375 35.828125
+Q 18.609375 31.296875 18.609375 23.390625
+Q 18.609375 15.53125 22.484375 10.953125
+Q 26.375 6.390625 33.015625 6.390625
+Q 39.65625 6.390625 43.53125 10.953125
+Q 47.40625 15.53125 47.40625 23.390625
+Q 47.40625 31.296875 43.53125 35.828125
+Q 39.65625 40.375 33.015625 40.375
+z
+M 52.59375 71.296875
+L 52.59375 62.3125
+Q 48.875 64.0625 45.09375 64.984375
+Q 41.3125 65.921875 37.59375 65.921875
+Q 27.828125 65.921875 22.671875 59.328125
+Q 17.53125 52.734375 16.796875 39.40625
+Q 19.671875 43.65625 24.015625 45.921875
+Q 28.375 48.1875 33.59375 48.1875
+Q 44.578125 48.1875 50.953125 41.515625
+Q 57.328125 34.859375 57.328125 23.390625
+Q 57.328125 12.15625 50.6875 5.359375
+Q 44.046875 -1.421875 33.015625 -1.421875
+Q 20.359375 -1.421875 13.671875 8.265625
+Q 6.984375 17.96875 6.984375 36.375
+Q 6.984375 53.65625 15.1875 63.9375
+Q 23.390625 74.21875 37.203125 74.21875
+Q 40.921875 74.21875 44.703125 73.484375
+Q 48.484375 72.75 52.59375 71.296875
+z
+" id="DejaVuSans-54"/>
+ </defs>
+ <g transform="translate(423.096631 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-54"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_5">
+ <g id="line2d_9">
+ <path clip-path="url(#p0d5dc64309)" d="M 555.997175 368.44
+L 555.997175 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_10">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="555.997175" xlink:href="#m8942888552" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- 800 -->
+ <defs>
+ <path d="M 31.78125 34.625
+Q 24.75 34.625 20.71875 30.859375
+Q 16.703125 27.09375 16.703125 20.515625
+Q 16.703125 13.921875 20.71875 10.15625
+Q 24.75 6.390625 31.78125 6.390625
+Q 38.8125 6.390625 42.859375 10.171875
+Q 46.921875 13.96875 46.921875 20.515625
+Q 46.921875 27.09375 42.890625 30.859375
+Q 38.875 34.625 31.78125 34.625
+z
+M 21.921875 38.8125
+Q 15.578125 40.375 12.03125 44.71875
+Q 8.5 49.078125 8.5 55.328125
+Q 8.5 64.0625 14.71875 69.140625
+Q 20.953125 74.21875 31.78125 74.21875
+Q 42.671875 74.21875 48.875 69.140625
+Q 55.078125 64.0625 55.078125 55.328125
+Q 55.078125 49.078125 51.53125 44.71875
+Q 48 40.375 41.703125 38.8125
+Q 48.828125 37.15625 52.796875 32.3125
+Q 56.78125 27.484375 56.78125 20.515625
+Q 56.78125 9.90625 50.3125 4.234375
+Q 43.84375 -1.421875 31.78125 -1.421875
+Q 19.734375 -1.421875 13.25 4.234375
+Q 6.78125 9.90625 6.78125 20.515625
+Q 6.78125 27.484375 10.78125 32.3125
+Q 14.796875 37.15625 21.921875 38.8125
+z
+M 18.3125 54.390625
+Q 18.3125 48.734375 21.84375 45.5625
+Q 25.390625 42.390625 31.78125 42.390625
+Q 38.140625 42.390625 41.71875 45.5625
+Q 45.3125 48.734375 45.3125 54.390625
+Q 45.3125 60.0625 41.71875 63.234375
+Q 38.140625 66.40625 31.78125 66.40625
+Q 25.390625 66.40625 21.84375 63.234375
+Q 18.3125 60.0625 18.3125 54.390625
+z
+" id="DejaVuSans-56"/>
+ </defs>
+ <g transform="translate(546.453425 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-56"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_6">
+ <g id="line2d_11">
+ <path clip-path="url(#p0d5dc64309)" d="M 679.353969 368.44
+L 679.353969 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_12">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="679.353969" xlink:href="#m8942888552" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- 1000 -->
+ <defs>
+ <path d="M 12.40625 8.296875
+L 28.515625 8.296875
+L 28.515625 63.921875
+L 10.984375 60.40625
+L 10.984375 69.390625
+L 28.421875 72.90625
+L 38.28125 72.90625
+L 38.28125 8.296875
+L 54.390625 8.296875
+L 54.390625 0
+L 12.40625 0
+z
+" id="DejaVuSans-49"/>
+ </defs>
+ <g transform="translate(666.628969 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_7">
+ <!-- Samples -->
+ <defs>
+ <path d="M 53.515625 70.515625
+L 53.515625 60.890625
+Q 47.90625 63.578125 42.921875 64.890625
+Q 37.9375 66.21875 33.296875 66.21875
+Q 25.25 66.21875 20.875 63.09375
+Q 16.5 59.96875 16.5 54.203125
+Q 16.5 49.359375 19.40625 46.890625
+Q 22.3125 44.4375 30.421875 42.921875
+L 36.375 41.703125
+Q 47.40625 39.59375 52.65625 34.296875
+Q 57.90625 29 57.90625 20.125
+Q 57.90625 9.515625 50.796875 4.046875
+Q 43.703125 -1.421875 29.984375 -1.421875
+Q 24.8125 -1.421875 18.96875 -0.25
+Q 13.140625 0.921875 6.890625 3.21875
+L 6.890625 13.375
+Q 12.890625 10.015625 18.65625 8.296875
+Q 24.421875 6.59375 29.984375 6.59375
+Q 38.421875 6.59375 43.015625 9.90625
+Q 47.609375 13.234375 47.609375 19.390625
+Q 47.609375 24.75 44.3125 27.78125
+Q 41.015625 30.8125 33.5 32.328125
+L 27.484375 33.5
+Q 16.453125 35.6875 11.515625 40.375
+Q 6.59375 45.0625 6.59375 53.421875
+Q 6.59375 63.09375 13.40625 68.65625
+Q 20.21875 74.21875 32.171875 74.21875
+Q 37.3125 74.21875 42.625 73.28125
+Q 47.953125 72.359375 53.515625 70.515625
+z
+" id="DejaVuSans-83"/>
+ <path d="M 34.28125 27.484375
+Q 23.390625 27.484375 19.1875 25
+Q 14.984375 22.515625 14.984375 16.5
+Q 14.984375 11.71875 18.140625 8.90625
+Q 21.296875 6.109375 26.703125 6.109375
+Q 34.1875 6.109375 38.703125 11.40625
+Q 43.21875 16.703125 43.21875 25.484375
+L 43.21875 27.484375
+z
+M 52.203125 31.203125
+L 52.203125 0
+L 43.21875 0
+L 43.21875 8.296875
+Q 40.140625 3.328125 35.546875 0.953125
+Q 30.953125 -1.421875 24.3125 -1.421875
+Q 15.921875 -1.421875 10.953125 3.296875
+Q 6 8.015625 6 15.921875
+Q 6 25.140625 12.171875 29.828125
+Q 18.359375 34.515625 30.609375 34.515625
+L 43.21875 34.515625
+L 43.21875 35.40625
+Q 43.21875 41.609375 39.140625 45
+Q 35.0625 48.390625 27.6875 48.390625
+Q 23 48.390625 18.546875 47.265625
+Q 14.109375 46.140625 10.015625 43.890625
+L 10.015625 52.203125
+Q 14.9375 54.109375 19.578125 55.046875
+Q 24.21875 56 28.609375 56
+Q 40.484375 56 46.34375 49.84375
+Q 52.203125 43.703125 52.203125 31.203125
+z
+" id="DejaVuSans-97"/>
+ <path d="M 52 44.1875
+Q 55.375 50.25 60.0625 53.125
+Q 64.75 56 71.09375 56
+Q 79.640625 56 84.28125 50.015625
+Q 88.921875 44.046875 88.921875 33.015625
+L 88.921875 0
+L 79.890625 0
+L 79.890625 32.71875
+Q 79.890625 40.578125 77.09375 44.375
+Q 74.3125 48.1875 68.609375 48.1875
+Q 61.625 48.1875 57.5625 43.546875
+Q 53.515625 38.921875 53.515625 30.90625
+L 53.515625 0
+L 44.484375 0
+L 44.484375 32.71875
+Q 44.484375 40.625 41.703125 44.40625
+Q 38.921875 48.1875 33.109375 48.1875
+Q 26.21875 48.1875 22.15625 43.53125
+Q 18.109375 38.875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.1875 51.21875 25.484375 53.609375
+Q 29.78125 56 35.6875 56
+Q 41.65625 56 45.828125 52.96875
+Q 50 49.953125 52 44.1875
+z
+" id="DejaVuSans-109"/>
+ <path d="M 18.109375 8.203125
+L 18.109375 -20.796875
+L 9.078125 -20.796875
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+z
+M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+" id="DejaVuSans-112"/>
+ <path d="M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 0
+L 9.421875 0
+z
+" id="DejaVuSans-108"/>
+ <path d="M 56.203125 29.59375
+L 56.203125 25.203125
+L 14.890625 25.203125
+Q 15.484375 15.921875 20.484375 11.0625
+Q 25.484375 6.203125 34.421875 6.203125
+Q 39.59375 6.203125 44.453125 7.46875
+Q 49.3125 8.734375 54.109375 11.28125
+L 54.109375 2.78125
+Q 49.265625 0.734375 44.1875 -0.34375
+Q 39.109375 -1.421875 33.890625 -1.421875
+Q 20.796875 -1.421875 13.15625 6.1875
+Q 5.515625 13.8125 5.515625 26.8125
+Q 5.515625 40.234375 12.765625 48.109375
+Q 20.015625 56 32.328125 56
+Q 43.359375 56 49.78125 48.890625
+Q 56.203125 41.796875 56.203125 29.59375
+z
+M 47.21875 32.234375
+Q 47.125 39.59375 43.09375 43.984375
+Q 39.0625 48.390625 32.421875 48.390625
+Q 24.90625 48.390625 20.390625 44.140625
+Q 15.875 39.890625 15.1875 32.171875
+z
+" id="DejaVuSans-101"/>
+ <path d="M 44.28125 53.078125
+L 44.28125 44.578125
+Q 40.484375 46.53125 36.375 47.5
+Q 32.28125 48.484375 27.875 48.484375
+Q 21.1875 48.484375 17.84375 46.4375
+Q 14.5 44.390625 14.5 40.28125
+Q 14.5 37.15625 16.890625 35.375
+Q 19.28125 33.59375 26.515625 31.984375
+L 29.59375 31.296875
+Q 39.15625 29.25 43.1875 25.515625
+Q 47.21875 21.78125 47.21875 15.09375
+Q 47.21875 7.46875 41.1875 3.015625
+Q 35.15625 -1.421875 24.609375 -1.421875
+Q 20.21875 -1.421875 15.453125 -0.5625
+Q 10.6875 0.296875 5.421875 2
+L 5.421875 11.28125
+Q 10.40625 8.6875 15.234375 7.390625
+Q 20.0625 6.109375 24.8125 6.109375
+Q 31.15625 6.109375 34.5625 8.28125
+Q 37.984375 10.453125 37.984375 14.40625
+Q 37.984375 18.0625 35.515625 20.015625
+Q 33.0625 21.96875 24.703125 23.78125
+L 21.578125 24.515625
+Q 13.234375 26.265625 9.515625 29.90625
+Q 5.8125 33.546875 5.8125 39.890625
+Q 5.8125 47.609375 11.28125 51.796875
+Q 16.75 56 26.8125 56
+Q 31.78125 56 36.171875 55.265625
+Q 40.578125 54.546875 44.28125 53.078125
+z
+" id="DejaVuSans-115"/>
+ </defs>
+ <g transform="translate(356.701875 396.716563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-83"/>
+ <use x="63.476562" xlink:href="#DejaVuSans-97"/>
+ <use x="124.755859" xlink:href="#DejaVuSans-109"/>
+ <use x="222.167969" xlink:href="#DejaVuSans-112"/>
+ <use x="285.644531" xlink:href="#DejaVuSans-108"/>
+ <use x="313.427734" xlink:href="#DejaVuSans-101"/>
+ <use x="374.951172" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_2">
+ <g id="ytick_1">
+ <g id="line2d_13">
+ <path clip-path="url(#p0d5dc64309)" d="M 62.57 322.9554
+L 693.54 322.9554
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_14">
+ <defs>
+ <path d="M 0 0
+L -3.5 0
+" id="mbda76bfd16" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="322.9554"/>
+ </g>
+ </g>
+ <g id="text_8">
+ <!-- −0.01 -->
+ <defs>
+ <path d="M 10.59375 35.5
+L 73.1875 35.5
+L 73.1875 27.203125
+L 10.59375 27.203125
+z
+" id="DejaVuSans-8722"/>
+ <path d="M 10.6875 12.40625
+L 21 12.40625
+L 21 0
+L 10.6875 0
+z
+" id="DejaVuSans-46"/>
+ </defs>
+ <g transform="translate(24.924688 326.754618)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-48"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-46"/>
+ <use x="179.199219" xlink:href="#DejaVuSans-48"/>
+ <use x="242.822266" xlink:href="#DejaVuSans-49"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_2">
+ <g id="line2d_15">
+ <path clip-path="url(#p0d5dc64309)" d="M 62.57 271.011117
+L 693.54 271.011117
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_16">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="271.011117"/>
+ </g>
+ </g>
+ <g id="text_9">
+ <!-- 0.00 -->
+ <g transform="translate(33.304375 274.810335)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_3">
+ <g id="line2d_17">
+ <path clip-path="url(#p0d5dc64309)" d="M 62.57 219.066833
+L 693.54 219.066833
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_18">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="219.066833"/>
+ </g>
+ </g>
+ <g id="text_10">
+ <!-- 0.01 -->
+ <g transform="translate(33.304375 222.866052)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-49"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_4">
+ <g id="line2d_19">
+ <path clip-path="url(#p0d5dc64309)" d="M 62.57 167.12255
+L 693.54 167.12255
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_20">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="167.12255"/>
+ </g>
+ </g>
+ <g id="text_11">
+ <!-- 0.02 -->
+ <g transform="translate(33.304375 170.921769)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-50"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_5">
+ <g id="line2d_21">
+ <path clip-path="url(#p0d5dc64309)" d="M 62.57 115.178267
+L 693.54 115.178267
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_22">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="115.178267"/>
+ </g>
+ </g>
+ <g id="text_12">
+ <!-- 0.03 -->
+ <defs>
+ <path d="M 40.578125 39.3125
+Q 47.65625 37.796875 51.625 33
+Q 55.609375 28.21875 55.609375 21.1875
+Q 55.609375 10.40625 48.1875 4.484375
+Q 40.765625 -1.421875 27.09375 -1.421875
+Q 22.515625 -1.421875 17.65625 -0.515625
+Q 12.796875 0.390625 7.625 2.203125
+L 7.625 11.71875
+Q 11.71875 9.328125 16.59375 8.109375
+Q 21.484375 6.890625 26.8125 6.890625
+Q 36.078125 6.890625 40.9375 10.546875
+Q 45.796875 14.203125 45.796875 21.1875
+Q 45.796875 27.640625 41.28125 31.265625
+Q 36.765625 34.90625 28.71875 34.90625
+L 20.21875 34.90625
+L 20.21875 43.015625
+L 29.109375 43.015625
+Q 36.375 43.015625 40.234375 45.921875
+Q 44.09375 48.828125 44.09375 54.296875
+Q 44.09375 59.90625 40.109375 62.90625
+Q 36.140625 65.921875 28.71875 65.921875
+Q 24.65625 65.921875 20.015625 65.03125
+Q 15.375 64.15625 9.8125 62.3125
+L 9.8125 71.09375
+Q 15.4375 72.65625 20.34375 73.4375
+Q 25.25 74.21875 29.59375 74.21875
+Q 40.828125 74.21875 47.359375 69.109375
+Q 53.90625 64.015625 53.90625 55.328125
+Q 53.90625 49.265625 50.4375 45.09375
+Q 46.96875 40.921875 40.578125 39.3125
+z
+" id="DejaVuSans-51"/>
+ </defs>
+ <g transform="translate(33.304375 118.977486)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-51"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_13">
+ <!-- Amplitude -->
+ <defs>
+ <path d="M 34.1875 63.1875
+L 20.796875 26.90625
+L 47.609375 26.90625
+z
+M 28.609375 72.90625
+L 39.796875 72.90625
+L 67.578125 0
+L 57.328125 0
+L 50.6875 18.703125
+L 17.828125 18.703125
+L 11.1875 0
+L 0.78125 0
+z
+" id="DejaVuSans-65"/>
+ <path d="M 9.421875 54.6875
+L 18.40625 54.6875
+L 18.40625 0
+L 9.421875 0
+z
+M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 64.59375
+L 9.421875 64.59375
+z
+" id="DejaVuSans-105"/>
+ <path d="M 18.3125 70.21875
+L 18.3125 54.6875
+L 36.8125 54.6875
+L 36.8125 47.703125
+L 18.3125 47.703125
+L 18.3125 18.015625
+Q 18.3125 11.328125 20.140625 9.421875
+Q 21.96875 7.515625 27.59375 7.515625
+L 36.8125 7.515625
+L 36.8125 0
+L 27.59375 0
+Q 17.1875 0 13.234375 3.875
+Q 9.28125 7.765625 9.28125 18.015625
+L 9.28125 47.703125
+L 2.6875 47.703125
+L 2.6875 54.6875
+L 9.28125 54.6875
+L 9.28125 70.21875
+z
+" id="DejaVuSans-116"/>
+ <path d="M 8.5 21.578125
+L 8.5 54.6875
+L 17.484375 54.6875
+L 17.484375 21.921875
+Q 17.484375 14.15625 20.5 10.265625
+Q 23.53125 6.390625 29.59375 6.390625
+Q 36.859375 6.390625 41.078125 11.03125
+Q 45.3125 15.671875 45.3125 23.6875
+L 45.3125 54.6875
+L 54.296875 54.6875
+L 54.296875 0
+L 45.3125 0
+L 45.3125 8.40625
+Q 42.046875 3.421875 37.71875 1
+Q 33.40625 -1.421875 27.6875 -1.421875
+Q 18.265625 -1.421875 13.375 4.4375
+Q 8.5 10.296875 8.5 21.578125
+z
+M 31.109375 56
+z
+" id="DejaVuSans-117"/>
+ <path d="M 45.40625 46.390625
+L 45.40625 75.984375
+L 54.390625 75.984375
+L 54.390625 0
+L 45.40625 0
+L 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+z
+M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+" id="DejaVuSans-100"/>
+ </defs>
+ <g transform="translate(18.845 247.642656)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-65"/>
+ <use x="68.408203" xlink:href="#DejaVuSans-109"/>
+ <use x="165.820312" xlink:href="#DejaVuSans-112"/>
+ <use x="229.296875" xlink:href="#DejaVuSans-108"/>
+ <use x="257.080078" xlink:href="#DejaVuSans-105"/>
+ <use x="284.863281" xlink:href="#DejaVuSans-116"/>
+ <use x="324.072266" xlink:href="#DejaVuSans-117"/>
+ <use x="387.451172" xlink:href="#DejaVuSans-100"/>
+ <use x="450.927734" xlink:href="#DejaVuSans-101"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_23">
+ <path clip-path="url(#p0d5dc64309)" d="M 62.57 271.011117
+L 101.42739 270.918106
+L 104.51131 270.704365
+L 106.978446 270.287736
+L 108.828798 269.703595
+L 110.062366 269.115062
+L 111.295934 268.309488
+L 112.529501 267.226227
+L 113.763069 265.794497
+L 114.996637 263.933838
+L 116.230205 261.55536
+L 117.463773 258.563939
+L 118.697341 254.861476
+L 119.930909 250.351277
+L 121.164477 244.943553
+L 122.398045 238.561944
+L 123.631613 231.150864
+L 124.865181 222.683377
+L 126.715533 208.034528
+L 128.565885 191.267495
+L 131.033021 166.516999
+L 134.733724 128.651678
+L 136.584076 112.118976
+L 137.817644 102.991759
+L 139.051212 95.908679
+L 139.667996 93.269285
+L 140.28478 91.298735
+L 140.901564 90.04326
+L 141.518348 89.544762
+L 142.135132 89.840105
+L 142.751916 90.960441
+L 143.3687 92.930563
+L 143.985484 95.768316
+L 144.602268 99.484061
+L 145.219052 104.080211
+L 146.45262 115.881423
+L 147.686188 131.019963
+L 148.919756 149.201951
+L 150.770108 181.197323
+L 153.237243 229.424947
+L 156.321163 289.99804
+L 158.171515 321.517261
+L 159.405083 338.906829
+L 160.638651 352.65822
+L 161.255435 358.015064
+L 161.872219 362.29765
+L 162.489003 365.473933
+L 163.105787 367.523911
+L 163.722571 368.44
+L 164.339355 368.227254
+L 164.956139 366.903423
+L 165.572923 364.498845
+L 166.189707 361.056173
+L 166.806491 356.629932
+L 168.040059 345.100423
+L 169.273627 330.557222
+L 171.123978 304.832181
+L 174.824682 250.561197
+L 176.05825 234.969928
+L 177.291818 221.95242
+L 178.525386 212.10179
+L 179.14217 208.500766
+L 179.758954 205.830998
+L 180.375738 204.11266
+L 180.992522 203.352762
+L 181.609306 203.545151
+L 182.22609 204.670701
+L 182.842874 206.697672
+L 183.459658 209.582266
+L 184.076442 213.269338
+L 185.31001 222.778994
+L 186.543578 234.595332
+L 188.39393 254.999604
+L 191.477849 289.339897
+L 192.711417 300.908299
+L 193.944985 310.255308
+L 194.561769 313.943654
+L 195.178553 316.914844
+L 195.795337 319.137584
+L 196.412121 320.5922
+L 197.028905 321.270781
+L 197.645689 321.177148
+L 198.262473 320.326648
+L 198.879257 318.745763
+L 199.496041 316.471573
+L 200.112825 313.551042
+L 201.346393 306.003076
+L 202.579961 296.640177
+L 205.047097 275.043262
+L 206.897449 259.029468
+L 208.131017 249.660541
+L 209.364585 241.974095
+L 210.598152 236.383338
+L 211.214936 234.464313
+L 211.83172 233.158608
+L 212.448504 232.475642
+L 213.065288 232.414895
+L 213.682072 232.966061
+L 214.298856 234.109368
+L 214.91564 235.816027
+L 215.532424 238.048831
+L 216.765992 243.906369
+L 217.99956 251.24592
+L 219.849912 263.895696
+L 222.317048 280.882832
+L 223.550616 288.2228
+L 224.784184 294.191465
+L 225.400968 296.553676
+L 226.017752 298.458051
+L 226.634536 299.88206
+L 227.25132 300.811313
+L 227.868104 301.239662
+L 228.484888 301.169166
+L 229.101672 300.609924
+L 229.718456 299.57978
+L 230.335239 298.103911
+L 230.952023 296.214293
+L 232.185591 291.351865
+L 233.419159 285.358258
+L 235.886295 271.712535
+L 237.736647 261.819876
+L 238.970215 256.182087
+L 240.203783 251.712108
+L 240.820567 249.996565
+L 241.437351 248.658597
+L 242.054135 247.713497
+L 242.670919 247.169836
+L 243.287703 247.029432
+L 243.904487 247.287431
+L 244.521271 247.932504
+L 245.138055 248.947136
+L 245.754839 250.308022
+L 246.988407 253.949349
+L 248.221975 258.574414
+L 250.072326 266.611141
+L 252.539462 277.439867
+L 253.77303 282.106933
+L 255.006598 285.879161
+L 255.623382 287.359112
+L 256.240166 288.540346
+L 256.85695 289.408477
+L 257.473734 289.954575
+L 258.090518 290.175216
+L 258.707302 290.072454
+L 259.324086 289.653688
+L 259.94087 288.93145
+L 260.557654 287.923111
+L 261.791222 285.139509
+L 263.02479 281.522863
+L 264.875142 275.128918
+L 267.342278 266.362203
+L 268.575846 262.527435
+L 269.809413 259.388231
+L 271.042981 257.127973
+L 271.659765 256.367348
+L 272.276549 255.865691
+L 272.893333 255.626889
+L 273.510117 255.650361
+L 274.126901 255.93114
+L 274.743685 256.460032
+L 275.360469 257.223845
+L 276.594037 259.385245
+L 277.827605 262.242142
+L 279.677957 267.35763
+L 282.761877 276.087149
+L 283.995445 278.975689
+L 285.229013 281.234918
+L 285.845797 282.086327
+L 286.462581 282.736412
+L 287.079365 283.177722
+L 287.696149 283.406447
+L 288.312933 283.422417
+L 288.929717 283.229048
+L 289.5465 282.833217
+L 290.163284 282.245095
+L 291.396852 280.54769
+L 292.63042 278.274198
+L 294.480772 274.164015
+L 297.564692 267.075339
+L 298.79826 264.707174
+L 300.031828 262.840466
+L 301.265396 261.582443
+L 301.88218 261.203209
+L 302.498964 260.99614
+L 303.115748 260.961766
+L 303.732532 261.097696
+L 304.349316 261.398702
+L 304.9661 261.856862
+L 306.199668 263.200586
+L 307.433236 265.019326
+L 309.283587 268.332143
+L 312.367507 274.09276
+L 313.601075 276.031525
+L 314.834643 277.568911
+L 316.068211 278.615944
+L 316.684995 278.937466
+L 317.301779 279.119396
+L 317.918563 279.161052
+L 318.535347 279.064133
+L 319.152131 278.832652
+L 320.385699 277.992954
+L 321.619267 276.71541
+L 322.852835 275.100227
+L 325.319971 271.344944
+L 327.170323 268.582204
+L 328.403891 266.996136
+L 329.637458 265.732355
+L 330.871026 264.864407
+L 332.104594 264.436895
+L 332.721378 264.393791
+L 333.954946 264.642849
+L 335.188514 265.309316
+L 336.422082 266.334493
+L 337.65565 267.637685
+L 340.122786 270.683006
+L 342.589922 273.610295
+L 343.82349 274.786625
+L 345.057058 275.670532
+L 346.290626 276.21277
+L 347.524194 276.388609
+L 348.757761 276.198666
+L 349.991329 275.66801
+L 351.224897 274.843657
+L 353.075249 273.202545
+L 358.009521 268.424038
+L 359.243089 267.572485
+L 360.476657 266.97987
+L 361.710225 266.677123
+L 362.943793 266.674731
+L 364.177361 266.962725
+L 365.410929 267.512033
+L 366.644497 268.277069
+L 368.494848 269.698702
+L 372.195552 272.676633
+L 374.045904 273.790726
+L 375.279472 274.279559
+L 376.51304 274.533051
+L 377.746608 274.542156
+L 378.980176 274.314495
+L 380.213744 273.873289
+L 382.064096 272.894434
+L 385.148016 270.845262
+L 387.615152 269.335772
+L 389.465503 268.538589
+L 390.699071 268.229358
+L 391.932639 268.116851
+L 393.166207 268.201982
+L 394.399775 268.472399
+L 396.250127 269.169387
+L 398.717263 270.443839
+L 401.801183 272.08228
+L 403.651535 272.830107
+L 405.501887 273.270626
+L 406.735455 273.366603
+L 407.969022 273.301568
+L 409.819374 272.926213
+L 411.669726 272.285467
+L 418.45435 269.539062
+L 420.304702 269.175525
+L 422.155054 269.102548
+L 424.005406 269.316433
+L 425.855758 269.771104
+L 428.939677 270.838523
+L 432.023597 271.886871
+L 433.873949 272.327389
+L 435.724301 272.55056
+L 437.574653 272.534126
+L 439.425005 272.292501
+L 441.892141 271.705143
+L 448.05998 270.046773
+L 449.910332 269.799411
+L 451.760684 269.744229
+L 453.611036 269.879814
+L 456.078172 270.302705
+L 463.47958 271.87605
+L 465.946716 272.045241
+L 468.413851 271.935419
+L 470.880987 271.593454
+L 478.899179 270.253692
+L 481.366315 270.17015
+L 483.833451 270.309939
+L 486.91737 270.716822
+L 492.468426 271.522427
+L 495.552346 271.69635
+L 498.019482 271.62806
+L 501.103402 271.331741
+L 508.504809 270.512219
+L 511.588729 270.461977
+L 514.672649 270.633389
+L 525.157977 271.465117
+L 528.85868 271.360436
+L 541.19436 270.646035
+L 545.511848 270.831783
+L 554.146823 271.305642
+L 558.464311 271.245269
+L 571.416774 270.775646
+L 576.96783 270.974075
+L 583.752454 271.205835
+L 588.686725 271.15108
+L 601.639189 270.861435
+L 620.759492 271.049159
+L 630.628035 270.906756
+L 654.065826 270.977362
+L 662.700802 270.959358
+L 679.353969 271.03589
+L 693.54 270.985521
+L 693.54 270.985521
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_3">
+ <path d="M 62.57 368.44
+L 62.57 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_4">
+ <path d="M 693.54 368.44
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_5">
+ <path d="M 62.57 368.44
+L 693.54 368.44
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_6">
+ <path d="M 62.57 75.6
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_2">
+ <g id="patch_7">
+ <path d="M 62.57 703.24
+L 693.54 703.24
+L 693.54 410.4
+L 62.57 410.4
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_3">
+ <g id="xtick_7">
+ <g id="line2d_24">
+ <path clip-path="url(#pdcbd05f3da)" d="M 62.57 703.24
+L 62.57 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_25">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_14">
+ <!-- 10Hz -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 19.671875 72.90625
+L 19.671875 43.015625
+L 55.515625 43.015625
+L 55.515625 72.90625
+L 65.375 72.90625
+L 65.375 0
+L 55.515625 0
+L 55.515625 34.71875
+L 19.671875 34.71875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-72"/>
+ <path d="M 5.515625 54.6875
+L 48.1875 54.6875
+L 48.1875 46.484375
+L 14.40625 7.171875
+L 48.1875 7.171875
+L 48.1875 0
+L 4.296875 0
+L 4.296875 8.203125
+L 38.09375 47.515625
+L 5.515625 47.515625
+z
+" id="DejaVuSans-122"/>
+ </defs>
+ <g transform="translate(49.823125 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_8">
+ <g id="line2d_26">
+ <path clip-path="url(#pdcbd05f3da)" d="M 62.57 703.24
+L 62.57 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_27">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_9">
+ <g id="line2d_28">
+ <path clip-path="url(#pdcbd05f3da)" d="M 118.76202 703.24
+L 118.76202 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_29">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="118.76202" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_10">
+ <g id="line2d_30">
+ <path clip-path="url(#pdcbd05f3da)" d="M 151.632244 703.24
+L 151.632244 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_31">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="151.632244" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_11">
+ <g id="line2d_32">
+ <path clip-path="url(#pdcbd05f3da)" d="M 174.954039 703.24
+L 174.954039 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_33">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="174.954039" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_12">
+ <g id="line2d_34">
+ <path clip-path="url(#pdcbd05f3da)" d="M 193.043829 703.24
+L 193.043829 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_35">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="193.043829" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_13">
+ <g id="line2d_36">
+ <path clip-path="url(#pdcbd05f3da)" d="M 207.824264 703.24
+L 207.824264 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_37">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="207.824264" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_14">
+ <g id="line2d_38">
+ <path clip-path="url(#pdcbd05f3da)" d="M 220.320943 703.24
+L 220.320943 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_39">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="220.320943" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_15">
+ <g id="line2d_40">
+ <path clip-path="url(#pdcbd05f3da)" d="M 231.146059 703.24
+L 231.146059 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_41">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="231.146059" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_16">
+ <g id="line2d_42">
+ <path clip-path="url(#pdcbd05f3da)" d="M 240.694488 703.24
+L 240.694488 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_43">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="240.694488" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_17">
+ <g id="line2d_44">
+ <path clip-path="url(#pdcbd05f3da)" d="M 249.235849 703.24
+L 249.235849 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_45">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_15">
+ <!-- 100Hz -->
+ <g transform="translate(233.307724 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_18">
+ <g id="line2d_46">
+ <path clip-path="url(#pdcbd05f3da)" d="M 249.235849 703.24
+L 249.235849 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_47">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_19">
+ <g id="line2d_48">
+ <path clip-path="url(#pdcbd05f3da)" d="M 305.427868 703.24
+L 305.427868 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_49">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="305.427868" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_20">
+ <g id="line2d_50">
+ <path clip-path="url(#pdcbd05f3da)" d="M 338.298093 703.24
+L 338.298093 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_51">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="338.298093" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_21">
+ <g id="line2d_52">
+ <path clip-path="url(#pdcbd05f3da)" d="M 361.619888 703.24
+L 361.619888 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_53">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="361.619888" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_22">
+ <g id="line2d_54">
+ <path clip-path="url(#pdcbd05f3da)" d="M 379.709678 703.24
+L 379.709678 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_55">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="379.709678" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_23">
+ <g id="line2d_56">
+ <path clip-path="url(#pdcbd05f3da)" d="M 394.490112 703.24
+L 394.490112 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_57">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="394.490112" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_24">
+ <g id="line2d_58">
+ <path clip-path="url(#pdcbd05f3da)" d="M 406.986791 703.24
+L 406.986791 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_59">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="406.986791" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_25">
+ <g id="line2d_60">
+ <path clip-path="url(#pdcbd05f3da)" d="M 417.811907 703.24
+L 417.811907 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_61">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="417.811907" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_26">
+ <g id="line2d_62">
+ <path clip-path="url(#pdcbd05f3da)" d="M 427.360336 703.24
+L 427.360336 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_63">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="427.360336" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_27">
+ <g id="line2d_64">
+ <path clip-path="url(#pdcbd05f3da)" d="M 435.901697 703.24
+L 435.901697 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_65">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_16">
+ <!-- 1kHz -->
+ <defs>
+ <path d="M 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 31.109375
+L 44.921875 54.6875
+L 56.390625 54.6875
+L 27.390625 29.109375
+L 57.625 0
+L 45.90625 0
+L 18.109375 26.703125
+L 18.109375 0
+L 9.078125 0
+z
+" id="DejaVuSans-107"/>
+ </defs>
+ <g transform="translate(423.44076 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_28">
+ <g id="line2d_66">
+ <path clip-path="url(#pdcbd05f3da)" d="M 435.901697 703.24
+L 435.901697 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_67">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_29">
+ <g id="line2d_68">
+ <path clip-path="url(#pdcbd05f3da)" d="M 492.093717 703.24
+L 492.093717 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_69">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="492.093717" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_30">
+ <g id="line2d_70">
+ <path clip-path="url(#pdcbd05f3da)" d="M 524.963941 703.24
+L 524.963941 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_71">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.963941" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_31">
+ <g id="line2d_72">
+ <path clip-path="url(#pdcbd05f3da)" d="M 548.285736 703.24
+L 548.285736 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_73">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="548.285736" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_32">
+ <g id="line2d_74">
+ <path clip-path="url(#pdcbd05f3da)" d="M 566.375526 703.24
+L 566.375526 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_75">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="566.375526" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_33">
+ <g id="line2d_76">
+ <path clip-path="url(#pdcbd05f3da)" d="M 581.155961 703.24
+L 581.155961 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_77">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="581.155961" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_34">
+ <g id="line2d_78">
+ <path clip-path="url(#pdcbd05f3da)" d="M 593.65264 703.24
+L 593.65264 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_79">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.65264" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_35">
+ <g id="line2d_80">
+ <path clip-path="url(#pdcbd05f3da)" d="M 604.477756 703.24
+L 604.477756 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_81">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.477756" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_36">
+ <g id="line2d_82">
+ <path clip-path="url(#pdcbd05f3da)" d="M 614.026185 703.24
+L 614.026185 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_83">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="614.026185" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_37">
+ <g id="line2d_84">
+ <path clip-path="url(#pdcbd05f3da)" d="M 622.567546 703.24
+L 622.567546 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_85">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_17">
+ <!-- 10kHz -->
+ <g transform="translate(606.925358 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_38">
+ <g id="line2d_86">
+ <path clip-path="url(#pdcbd05f3da)" d="M 622.567546 703.24
+L 622.567546 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_87">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_39">
+ <g id="line2d_88">
+ <path clip-path="url(#pdcbd05f3da)" d="M 678.759566 703.24
+L 678.759566 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_89">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.759566" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_40">
+ <g id="line2d_90">
+ <path clip-path="url(#pdcbd05f3da)" d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_91">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#m8942888552" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_18">
+ <!-- 24kHz -->
+ <g transform="translate(677.897812 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_19">
+ <!-- Frequency (Hz) -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 51.703125 72.90625
+L 51.703125 64.59375
+L 19.671875 64.59375
+L 19.671875 43.109375
+L 48.578125 43.109375
+L 48.578125 34.8125
+L 19.671875 34.8125
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-70"/>
+ <path d="M 41.109375 46.296875
+Q 39.59375 47.171875 37.8125 47.578125
+Q 36.03125 48 33.890625 48
+Q 26.265625 48 22.1875 43.046875
+Q 18.109375 38.09375 18.109375 28.8125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 20.953125 51.171875 25.484375 53.578125
+Q 30.03125 56 36.53125 56
+Q 37.453125 56 38.578125 55.875
+Q 39.703125 55.765625 41.0625 55.515625
+z
+" id="DejaVuSans-114"/>
+ <path d="M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+M 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+L 45.40625 54.6875
+L 54.390625 54.6875
+L 54.390625 -20.796875
+L 45.40625 -20.796875
+z
+" id="DejaVuSans-113"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-110"/>
+ <path d="M 48.78125 52.59375
+L 48.78125 44.1875
+Q 44.96875 46.296875 41.140625 47.34375
+Q 37.3125 48.390625 33.40625 48.390625
+Q 24.65625 48.390625 19.8125 42.84375
+Q 14.984375 37.3125 14.984375 27.296875
+Q 14.984375 17.28125 19.8125 11.734375
+Q 24.65625 6.203125 33.40625 6.203125
+Q 37.3125 6.203125 41.140625 7.25
+Q 44.96875 8.296875 48.78125 10.40625
+L 48.78125 2.09375
+Q 45.015625 0.34375 40.984375 -0.53125
+Q 36.96875 -1.421875 32.421875 -1.421875
+Q 20.0625 -1.421875 12.78125 6.34375
+Q 5.515625 14.109375 5.515625 27.296875
+Q 5.515625 40.671875 12.859375 48.328125
+Q 20.21875 56 33.015625 56
+Q 37.15625 56 41.109375 55.140625
+Q 45.0625 54.296875 48.78125 52.59375
+z
+" id="DejaVuSans-99"/>
+ <path d="M 32.171875 -5.078125
+Q 28.375 -14.84375 24.75 -17.8125
+Q 21.140625 -20.796875 15.09375 -20.796875
+L 7.90625 -20.796875
+L 7.90625 -13.28125
+L 13.1875 -13.28125
+Q 16.890625 -13.28125 18.9375 -11.515625
+Q 21 -9.765625 23.484375 -3.21875
+L 25.09375 0.875
+L 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 11.921875
+L 46.6875 54.6875
+L 56.203125 54.6875
+z
+" id="DejaVuSans-121"/>
+ <path id="DejaVuSans-32"/>
+ <path d="M 31 75.875
+Q 24.46875 64.65625 21.28125 53.65625
+Q 18.109375 42.671875 18.109375 31.390625
+Q 18.109375 20.125 21.3125 9.0625
+Q 24.515625 -2 31 -13.1875
+L 23.1875 -13.1875
+Q 15.875 -1.703125 12.234375 9.375
+Q 8.59375 20.453125 8.59375 31.390625
+Q 8.59375 42.28125 12.203125 53.3125
+Q 15.828125 64.359375 23.1875 75.875
+z
+" id="DejaVuSans-40"/>
+ <path d="M 8.015625 75.875
+L 15.828125 75.875
+Q 23.140625 64.359375 26.78125 53.3125
+Q 30.421875 42.28125 30.421875 31.390625
+Q 30.421875 20.453125 26.78125 9.375
+Q 23.140625 -1.703125 15.828125 -13.1875
+L 8.015625 -13.1875
+Q 14.5 -2 17.703125 9.0625
+Q 20.90625 20.125 20.90625 31.390625
+Q 20.90625 42.671875 17.703125 53.65625
+Q 14.5 64.65625 8.015625 75.875
+z
+" id="DejaVuSans-41"/>
+ </defs>
+ <g transform="translate(339.882344 731.516563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_4">
+ <g id="ytick_6">
+ <g id="line2d_92">
+ <path clip-path="url(#pdcbd05f3da)" d="M 62.57 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_93">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_20">
+ <!-- −160 -->
+ <g transform="translate(28.102813 707.039219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-54"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_7">
+ <g id="line2d_94">
+ <path clip-path="url(#pdcbd05f3da)" d="M 62.57 668.788235
+L 693.54 668.788235
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_95">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="668.788235"/>
+ </g>
+ </g>
+ <g id="text_21">
+ <!-- −140 -->
+ <g transform="translate(28.102813 672.587454)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-52"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_8">
+ <g id="line2d_96">
+ <path clip-path="url(#pdcbd05f3da)" d="M 62.57 634.336471
+L 693.54 634.336471
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_97">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="634.336471"/>
+ </g>
+ </g>
+ <g id="text_22">
+ <!-- −120 -->
+ <g transform="translate(28.102813 638.135689)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-50"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_9">
+ <g id="line2d_98">
+ <path clip-path="url(#pdcbd05f3da)" d="M 62.57 599.884706
+L 693.54 599.884706
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_99">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="599.884706"/>
+ </g>
+ </g>
+ <g id="text_23">
+ <!-- −100 -->
+ <g transform="translate(28.102813 603.683925)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_10">
+ <g id="line2d_100">
+ <path clip-path="url(#pdcbd05f3da)" d="M 62.57 565.432941
+L 693.54 565.432941
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_101">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="565.432941"/>
+ </g>
+ </g>
+ <g id="text_24">
+ <!-- −80 -->
+ <g transform="translate(34.465313 569.23216)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-56"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_11">
+ <g id="line2d_102">
+ <path clip-path="url(#pdcbd05f3da)" d="M 62.57 530.981176
+L 693.54 530.981176
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_103">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="530.981176"/>
+ </g>
+ </g>
+ <g id="text_25">
+ <!-- −60 -->
+ <g transform="translate(34.465313 534.780395)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-54"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_12">
+ <g id="line2d_104">
+ <path clip-path="url(#pdcbd05f3da)" d="M 62.57 496.529412
+L 693.54 496.529412
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_105">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="496.529412"/>
+ </g>
+ </g>
+ <g id="text_26">
+ <!-- −40 -->
+ <g transform="translate(34.465313 500.328631)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-52"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_13">
+ <g id="line2d_106">
+ <path clip-path="url(#pdcbd05f3da)" d="M 62.57 462.077647
+L 693.54 462.077647
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_107">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="462.077647"/>
+ </g>
+ </g>
+ <g id="text_27">
+ <!-- −20 -->
+ <g transform="translate(34.465313 465.876866)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_14">
+ <g id="line2d_108">
+ <path clip-path="url(#pdcbd05f3da)" d="M 62.57 427.625882
+L 693.54 427.625882
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_109">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="427.625882"/>
+ </g>
+ </g>
+ <g id="text_28">
+ <!-- 0 -->
+ <g transform="translate(49.2075 431.425101)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_29">
+ <!-- Gain (dB) -->
+ <defs>
+ <path d="M 59.515625 10.40625
+L 59.515625 29.984375
+L 43.40625 29.984375
+L 43.40625 38.09375
+L 69.28125 38.09375
+L 69.28125 6.78125
+Q 63.578125 2.734375 56.6875 0.65625
+Q 49.8125 -1.421875 42 -1.421875
+Q 24.90625 -1.421875 15.25 8.5625
+Q 5.609375 18.5625 5.609375 36.375
+Q 5.609375 54.25 15.25 64.234375
+Q 24.90625 74.21875 42 74.21875
+Q 49.125 74.21875 55.546875 72.453125
+Q 61.96875 70.703125 67.390625 67.28125
+L 67.390625 56.78125
+Q 61.921875 61.421875 55.765625 63.765625
+Q 49.609375 66.109375 42.828125 66.109375
+Q 29.4375 66.109375 22.71875 58.640625
+Q 16.015625 51.171875 16.015625 36.375
+Q 16.015625 21.625 22.71875 14.15625
+Q 29.4375 6.6875 42.828125 6.6875
+Q 48.046875 6.6875 52.140625 7.59375
+Q 56.25 8.5 59.515625 10.40625
+z
+" id="DejaVuSans-71"/>
+ <path d="M 19.671875 34.8125
+L 19.671875 8.109375
+L 35.5 8.109375
+Q 43.453125 8.109375 47.28125 11.40625
+Q 51.125 14.703125 51.125 21.484375
+Q 51.125 28.328125 47.28125 31.5625
+Q 43.453125 34.8125 35.5 34.8125
+z
+M 19.671875 64.796875
+L 19.671875 42.828125
+L 34.28125 42.828125
+Q 41.5 42.828125 45.03125 45.53125
+Q 48.578125 48.25 48.578125 53.8125
+Q 48.578125 59.328125 45.03125 62.0625
+Q 41.5 64.796875 34.28125 64.796875
+z
+M 9.8125 72.90625
+L 35.015625 72.90625
+Q 46.296875 72.90625 52.390625 68.21875
+Q 58.5 63.53125 58.5 54.890625
+Q 58.5 48.1875 55.375 44.234375
+Q 52.25 40.28125 46.1875 39.3125
+Q 53.46875 37.75 57.5 32.78125
+Q 61.53125 27.828125 61.53125 20.40625
+Q 61.53125 10.640625 54.890625 5.3125
+Q 48.25 0 35.984375 0
+L 9.8125 0
+z
+" id="DejaVuSans-66"/>
+ </defs>
+ <g transform="translate(22.023125 580.411406)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-71"/>
+ <use x="77.490234" xlink:href="#DejaVuSans-97"/>
+ <use x="138.769531" xlink:href="#DejaVuSans-105"/>
+ <use x="166.552734" xlink:href="#DejaVuSans-110"/>
+ <use x="229.931641" xlink:href="#DejaVuSans-32"/>
+ <use x="261.71875" xlink:href="#DejaVuSans-40"/>
+ <use x="300.732422" xlink:href="#DejaVuSans-100"/>
+ <use x="364.208984" xlink:href="#DejaVuSans-66"/>
+ <use x="432.8125" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_110">
+ <path clip-path="url(#pdcbd05f3da)" d="M -1 427.62527
+L 428.617229 427.7208
+L 430.669692 427.958947
+L 432.175641 428.399112
+L 433.164287 428.963535
+L 434.141021 429.880804
+L 435.106127 431.260345
+L 436.059879 433.174331
+L 437.00254 435.639055
+L 438.396292 440.238953
+L 440.218121 447.369455
+L 442.876324 458.746428
+L 454.244429 509.530788
+L 454.998555 512.794505
+L 456.116752 516.887238
+L 456.853738 520.647528
+L 457.946806 526.55722
+L 458.667414 528.46009
+L 459.025331 529.372664
+L 459.381674 530.717718
+L 460.089695 535.210691
+L 460.791587 540.445349
+L 461.140267 541.576883
+L 461.487453 541.606275
+L 461.833159 541.488374
+L 462.177398 541.973412
+L 462.52018 543.433173
+L 462.861519 546.057938
+L 463.876997 556.936839
+L 464.212683 555.74493
+L 464.546984 553.58659
+L 464.879913 552.483142
+L 465.211479 552.877773
+L 465.541696 554.932993
+L 465.870572 559.007378
+L 466.19812 565.973159
+L 466.524349 575.991892
+L 466.849271 573.277341
+L 467.172896 565.921415
+L 467.495235 562.196866
+L 467.816296 561.043448
+L 468.136091 561.961457
+L 468.45463 565.028648
+L 468.771922 571.095916
+L 469.402804 594.242345
+L 469.716413 576.758866
+L 470.028814 570.392854
+L 470.340016 567.806309
+L 470.650028 567.530781
+L 470.958858 569.191679
+L 471.266517 572.851154
+L 471.878353 583.504005
+L 472.182549 580.466231
+L 472.485607 575.675288
+L 472.787536 572.835321
+L 473.088345 571.848613
+L 473.388042 572.422878
+L 473.686635 574.348433
+L 474.280542 579.774597
+L 474.575872 579.93217
+L 475.163324 576.072853
+L 475.455461 575.018618
+L 475.746549 575.007947
+L 476.036595 575.923603
+L 476.613594 578.930243
+L 476.90056 579.531453
+L 477.186515 579.010406
+L 477.755415 577.247833
+L 478.038375 577.044623
+L 478.320351 577.435524
+L 479.16044 579.694867
+L 479.438547 579.681741
+L 480.267187 578.640804
+L 480.541529 578.794444
+L 481.629706 580.352352
+L 482.703469 579.985966
+L 483.235064 580.578048
+L 483.763196 581.068177
+L 484.28791 581.032869
+L 484.809249 581.033097
+L 485.327256 581.414274
+L 485.841975 581.811927
+L 486.353447 581.910451
+L 486.861711 581.96763
+L 487.618183 582.413201
+L 488.118604 582.660086
+L 489.356307 583.032783
+L 490.333041 583.475271
+L 491.298147 583.78882
+L 492.488593 584.266013
+L 493.894431 584.799093
+L 503.313709 588.045283
+L 513.228962 591.132551
+L 522.716369 593.829181
+L 533.378534 596.623156
+L 545.302293 599.514182
+L 558.882925 602.572721
+L 574.217199 605.792603
+L 591.125523 609.112317
+L 608.681507 612.333031
+L 625.383931 615.175419
+L 640.225514 617.481494
+L 653.027247 619.251745
+L 664.051933 620.557249
+L 673.578212 621.466869
+L 681.896468 622.042908
+L 689.210742 622.331379
+L 693.520206 622.382314
+L 693.520206 622.382314
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_8">
+ <path d="M 62.57 703.24
+L 62.57 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_9">
+ <path d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_10">
+ <path d="M 62.57 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_11">
+ <path d="M 62.57 410.4
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_3">
+ <g id="patch_12">
+ <path d="M 62.57 1038.04
+L 693.54 1038.04
+L 693.54 745.2
+L 62.57 745.2
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_5">
+ <g id="xtick_41">
+ <g id="line2d_111">
+ <path clip-path="url(#pa6552d3f23)" d="M 62.57 1038.04
+L 62.57 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_112">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_30">
+ <!-- 10Hz -->
+ <g transform="translate(49.823125 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_42">
+ <g id="line2d_113">
+ <path clip-path="url(#pa6552d3f23)" d="M 62.57 1038.04
+L 62.57 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_114">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_43">
+ <g id="line2d_115">
+ <path clip-path="url(#pa6552d3f23)" d="M 118.76202 1038.04
+L 118.76202 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_116">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="118.76202" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_44">
+ <g id="line2d_117">
+ <path clip-path="url(#pa6552d3f23)" d="M 151.632244 1038.04
+L 151.632244 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_118">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="151.632244" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_45">
+ <g id="line2d_119">
+ <path clip-path="url(#pa6552d3f23)" d="M 174.954039 1038.04
+L 174.954039 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_120">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="174.954039" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_46">
+ <g id="line2d_121">
+ <path clip-path="url(#pa6552d3f23)" d="M 193.043829 1038.04
+L 193.043829 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_122">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="193.043829" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_47">
+ <g id="line2d_123">
+ <path clip-path="url(#pa6552d3f23)" d="M 207.824264 1038.04
+L 207.824264 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_124">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="207.824264" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_48">
+ <g id="line2d_125">
+ <path clip-path="url(#pa6552d3f23)" d="M 220.320943 1038.04
+L 220.320943 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_126">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="220.320943" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_49">
+ <g id="line2d_127">
+ <path clip-path="url(#pa6552d3f23)" d="M 231.146059 1038.04
+L 231.146059 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_128">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="231.146059" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_50">
+ <g id="line2d_129">
+ <path clip-path="url(#pa6552d3f23)" d="M 240.694488 1038.04
+L 240.694488 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_130">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="240.694488" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_51">
+ <g id="line2d_131">
+ <path clip-path="url(#pa6552d3f23)" d="M 249.235849 1038.04
+L 249.235849 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_132">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_31">
+ <!-- 100Hz -->
+ <g transform="translate(233.307724 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_52">
+ <g id="line2d_133">
+ <path clip-path="url(#pa6552d3f23)" d="M 249.235849 1038.04
+L 249.235849 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_134">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_53">
+ <g id="line2d_135">
+ <path clip-path="url(#pa6552d3f23)" d="M 305.427868 1038.04
+L 305.427868 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_136">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="305.427868" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_54">
+ <g id="line2d_137">
+ <path clip-path="url(#pa6552d3f23)" d="M 338.298093 1038.04
+L 338.298093 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_138">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="338.298093" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_55">
+ <g id="line2d_139">
+ <path clip-path="url(#pa6552d3f23)" d="M 361.619888 1038.04
+L 361.619888 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_140">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="361.619888" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_56">
+ <g id="line2d_141">
+ <path clip-path="url(#pa6552d3f23)" d="M 379.709678 1038.04
+L 379.709678 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_142">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="379.709678" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_57">
+ <g id="line2d_143">
+ <path clip-path="url(#pa6552d3f23)" d="M 394.490112 1038.04
+L 394.490112 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_144">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="394.490112" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_58">
+ <g id="line2d_145">
+ <path clip-path="url(#pa6552d3f23)" d="M 406.986791 1038.04
+L 406.986791 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_146">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="406.986791" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_59">
+ <g id="line2d_147">
+ <path clip-path="url(#pa6552d3f23)" d="M 417.811907 1038.04
+L 417.811907 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_148">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="417.811907" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_60">
+ <g id="line2d_149">
+ <path clip-path="url(#pa6552d3f23)" d="M 427.360336 1038.04
+L 427.360336 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_150">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="427.360336" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_61">
+ <g id="line2d_151">
+ <path clip-path="url(#pa6552d3f23)" d="M 435.901697 1038.04
+L 435.901697 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_152">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_32">
+ <!-- 1kHz -->
+ <g transform="translate(423.44076 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_62">
+ <g id="line2d_153">
+ <path clip-path="url(#pa6552d3f23)" d="M 435.901697 1038.04
+L 435.901697 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_154">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_63">
+ <g id="line2d_155">
+ <path clip-path="url(#pa6552d3f23)" d="M 492.093717 1038.04
+L 492.093717 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_156">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="492.093717" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_64">
+ <g id="line2d_157">
+ <path clip-path="url(#pa6552d3f23)" d="M 524.963941 1038.04
+L 524.963941 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_158">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.963941" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_65">
+ <g id="line2d_159">
+ <path clip-path="url(#pa6552d3f23)" d="M 548.285736 1038.04
+L 548.285736 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_160">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="548.285736" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_66">
+ <g id="line2d_161">
+ <path clip-path="url(#pa6552d3f23)" d="M 566.375526 1038.04
+L 566.375526 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_162">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="566.375526" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_67">
+ <g id="line2d_163">
+ <path clip-path="url(#pa6552d3f23)" d="M 581.155961 1038.04
+L 581.155961 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_164">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="581.155961" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_68">
+ <g id="line2d_165">
+ <path clip-path="url(#pa6552d3f23)" d="M 593.65264 1038.04
+L 593.65264 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_166">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.65264" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_69">
+ <g id="line2d_167">
+ <path clip-path="url(#pa6552d3f23)" d="M 604.477756 1038.04
+L 604.477756 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_168">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.477756" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_70">
+ <g id="line2d_169">
+ <path clip-path="url(#pa6552d3f23)" d="M 614.026185 1038.04
+L 614.026185 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_170">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="614.026185" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_71">
+ <g id="line2d_171">
+ <path clip-path="url(#pa6552d3f23)" d="M 622.567546 1038.04
+L 622.567546 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_172">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_33">
+ <!-- 10kHz -->
+ <g transform="translate(606.925358 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_72">
+ <g id="line2d_173">
+ <path clip-path="url(#pa6552d3f23)" d="M 622.567546 1038.04
+L 622.567546 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_174">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_73">
+ <g id="line2d_175">
+ <path clip-path="url(#pa6552d3f23)" d="M 678.759566 1038.04
+L 678.759566 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_176">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.759566" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_74">
+ <g id="line2d_177">
+ <path clip-path="url(#pa6552d3f23)" d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_178">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#m8942888552" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_34">
+ <!-- 24kHz -->
+ <g transform="translate(677.897812 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_35">
+ <!-- Frequency (Hz) -->
+ <g transform="translate(339.882344 1066.316563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_6">
+ <g id="ytick_15">
+ <g id="line2d_179">
+ <path clip-path="url(#pa6552d3f23)" d="M 62.57 1007.214737
+L 693.54 1007.214737
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_180">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="1007.214737"/>
+ </g>
+ </g>
+ <g id="text_36">
+ <!-- −150 -->
+ <defs>
+ <path d="M 10.796875 72.90625
+L 49.515625 72.90625
+L 49.515625 64.59375
+L 19.828125 64.59375
+L 19.828125 46.734375
+Q 21.96875 47.46875 24.109375 47.828125
+Q 26.265625 48.1875 28.421875 48.1875
+Q 40.625 48.1875 47.75 41.5
+Q 54.890625 34.8125 54.890625 23.390625
+Q 54.890625 11.625 47.5625 5.09375
+Q 40.234375 -1.421875 26.90625 -1.421875
+Q 22.3125 -1.421875 17.546875 -0.640625
+Q 12.796875 0.140625 7.71875 1.703125
+L 7.71875 11.625
+Q 12.109375 9.234375 16.796875 8.0625
+Q 21.484375 6.890625 26.703125 6.890625
+Q 35.15625 6.890625 40.078125 11.328125
+Q 45.015625 15.765625 45.015625 23.390625
+Q 45.015625 31 40.078125 35.4375
+Q 35.15625 39.890625 26.703125 39.890625
+Q 22.75 39.890625 18.8125 39.015625
+Q 14.890625 38.140625 10.796875 36.28125
+z
+" id="DejaVuSans-53"/>
+ </defs>
+ <g transform="translate(28.102813 1011.013956)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_16">
+ <g id="line2d_181">
+ <path clip-path="url(#pa6552d3f23)" d="M 62.57 968.683158
+L 693.54 968.683158
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_182">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="968.683158"/>
+ </g>
+ </g>
+ <g id="text_37">
+ <!-- −100 -->
+ <g transform="translate(28.102813 972.482377)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_17">
+ <g id="line2d_183">
+ <path clip-path="url(#pa6552d3f23)" d="M 62.57 930.151579
+L 693.54 930.151579
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_184">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="930.151579"/>
+ </g>
+ </g>
+ <g id="text_38">
+ <!-- −50 -->
+ <g transform="translate(34.465313 933.950798)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-53"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_18">
+ <g id="line2d_185">
+ <path clip-path="url(#pa6552d3f23)" d="M 62.57 891.62
+L 693.54 891.62
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_186">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="891.62"/>
+ </g>
+ </g>
+ <g id="text_39">
+ <!-- 0 -->
+ <g transform="translate(49.2075 895.419219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_19">
+ <g id="line2d_187">
+ <path clip-path="url(#pa6552d3f23)" d="M 62.57 853.088421
+L 693.54 853.088421
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_188">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="853.088421"/>
+ </g>
+ </g>
+ <g id="text_40">
+ <!-- 50 -->
+ <g transform="translate(42.845 856.88764)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-53"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_20">
+ <g id="line2d_189">
+ <path clip-path="url(#pa6552d3f23)" d="M 62.57 814.556842
+L 693.54 814.556842
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_190">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="814.556842"/>
+ </g>
+ </g>
+ <g id="text_41">
+ <!-- 100 -->
+ <g transform="translate(36.4825 818.356061)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_21">
+ <g id="line2d_191">
+ <path clip-path="url(#pa6552d3f23)" d="M 62.57 776.025263
+L 693.54 776.025263
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_192">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mbda76bfd16" y="776.025263"/>
+ </g>
+ </g>
+ <g id="text_42">
+ <!-- 150 -->
+ <g transform="translate(36.4825 779.824482)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-53"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_43">
+ <!-- Phase (${\circ}$) -->
+ <defs>
+ <path d="M 19.671875 64.796875
+L 19.671875 37.40625
+L 32.078125 37.40625
+Q 38.96875 37.40625 42.71875 40.96875
+Q 46.484375 44.53125 46.484375 51.125
+Q 46.484375 57.671875 42.71875 61.234375
+Q 38.96875 64.796875 32.078125 64.796875
+z
+M 9.8125 72.90625
+L 32.078125 72.90625
+Q 44.34375 72.90625 50.609375 67.359375
+Q 56.890625 61.8125 56.890625 51.125
+Q 56.890625 40.328125 50.609375 34.8125
+Q 44.34375 29.296875 32.078125 29.296875
+L 19.671875 29.296875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-80"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-104"/>
+ <path d="M 31.296875 40.671875
+Q 27.390625 40.671875 24.703125 37.953125
+Q 22.015625 35.25 22.015625 31.34375
+Q 22.015625 27.484375 24.703125 24.828125
+Q 27.390625 22.171875 31.296875 22.171875
+Q 35.203125 22.171875 37.890625 24.828125
+Q 40.578125 27.484375 40.578125 31.34375
+Q 40.578125 35.203125 37.859375 37.9375
+Q 35.15625 40.671875 31.296875 40.671875
+z
+M 31.296875 46.96875
+Q 34.421875 46.96875 37.296875 45.765625
+Q 40.1875 44.578125 42.28125 42.328125
+Q 44.53125 40.140625 45.65625 37.34375
+Q 46.78125 34.5625 46.78125 31.34375
+Q 46.78125 24.90625 42.265625 20.4375
+Q 37.75 15.96875 31.203125 15.96875
+Q 24.609375 15.96875 20.21875 20.359375
+Q 15.828125 24.75 15.828125 31.34375
+Q 15.828125 37.890625 20.3125 42.421875
+Q 24.8125 46.96875 31.296875 46.96875
+z
+" id="DejaVuSans-8728"/>
+ </defs>
+ <g transform="translate(22.023125 915.17)rotate(-90)scale(0.1 -0.1)">
+ <use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-80"/>
+ <use transform="translate(60.302734 0.015625)" xlink:href="#DejaVuSans-104"/>
+ <use transform="translate(123.681641 0.015625)" xlink:href="#DejaVuSans-97"/>
+ <use transform="translate(184.960938 0.015625)" xlink:href="#DejaVuSans-115"/>
+ <use transform="translate(237.060547 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(298.583984 0.015625)" xlink:href="#DejaVuSans-32"/>
+ <use transform="translate(330.371094 0.015625)" xlink:href="#DejaVuSans-40"/>
+ <use transform="translate(369.384766 0.015625)" xlink:href="#DejaVuSans-8728"/>
+ <use transform="translate(431.982422 0.015625)" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_193">
+ <path clip-path="url(#pa6552d3f23)" d="M -1 895.57115
+L 19.235765 895.571578
+L 75.427784 899.522531
+L 108.298009 903.472573
+L 131.619804 907.42193
+L 149.709594 911.371282
+L 164.490028 915.321482
+L 176.986708 919.273204
+L 187.811824 923.226664
+L 197.360253 927.181565
+L 205.901613 931.137279
+L 213.628214 935.093185
+L 220.682048 939.049002
+L 227.170946 943.004972
+L 233.178727 946.961783
+L 238.771838 950.920297
+L 244.003843 954.881185
+L 248.918557 958.844659
+L 253.552272 962.810411
+L 257.935391 966.777808
+L 262.093633 970.746226
+L 266.048951 974.715396
+L 269.820234 978.685568
+L 273.423847 982.657451
+L 280.183423 990.609646
+L 286.422496 998.575198
+L 292.215528 1006.55082
+L 297.622061 1014.533461
+L 302.690458 1022.526732
+L 305.110576 1026.529323
+L 307.460537 753.10896
+L 311.96547 761.134601
+L 316.23319 769.171846
+L 320.287432 777.220869
+L 324.14854 785.287688
+L 327.834082 793.375724
+L 333.066087 805.539998
+L 337.980801 817.741525
+L 342.614516 829.997263
+L 346.997635 842.303391
+L 351.155877 854.656978
+L 355.111195 867.075987
+L 358.882478 879.556969
+L 362.486091 892.096961
+L 367.054508 908.938897
+L 371.379157 925.910374
+L 375.48474 943.034592
+L 379.392386 960.321338
+L 383.120305 977.779115
+L 386.684305 995.438074
+L 390.098197 1013.293434
+L 392.567462 1026.844306
+L 393.374115 753.963792
+L 397.291203 776.92288
+L 401.027714 800.33618
+L 404.599567 824.227433
+L 408.020663 848.697817
+L 411.303215 873.799257
+L 414.458008 899.662382
+L 417.494616 926.402412
+L 420.421574 954.211216
+L 423.246527 983.351354
+L 425.976346 1014.209818
+L 427.043045 1027.173227
+L 427.571176 756.395959
+L 429.649956 784.29923
+L 431.67676 814.807298
+L 433.654125 848.734185
+L 436.532579 903.909768
+L 438.855602 947.177218
+L 440.667252 976.904215
+L 442.876324 1009.129909
+L 444.173439 1026.054227
+L 444.601239 753.99971
+L 447.12169 784.274984
+L 450.761261 823.280938
+L 452.7148 842.019493
+L 453.864719 853.973635
+L 454.622369 859.589446
+L 455.373004 865.147825
+L 456.116752 873.210974
+L 456.853738 881.822441
+L 457.219734 884.897495
+L 457.584085 886.678777
+L 457.946806 887.644506
+L 458.307911 888.98327
+L 458.667414 891.737031
+L 459.381674 901.513141
+L 460.089695 911.447237
+L 460.441401 913.428061
+L 460.791587 912.409372
+L 461.140267 910.298505
+L 461.487453 910.515298
+L 461.833159 914.366431
+L 462.52018 928.862859
+L 462.861519 936.447138
+L 463.201427 941.47663
+L 463.539916 940.332086
+L 464.212683 924.530471
+L 464.546984 926.694585
+L 464.879913 934.85135
+L 466.19812 976.72915
+L 466.524349 963.894505
+L 466.849271 929.764676
+L 467.172896 929.765858
+L 467.816296 956.884691
+L 468.771922 1012.233673
+L 469.087976 761.084868
+L 469.402804 877.335592
+L 469.716413 916.851692
+L 470.958858 1007.052083
+L 471.266517 756.082271
+L 471.573012 790.1738
+L 472.485607 932.050546
+L 473.388042 1015.555378
+L 473.686635 767.446905
+L 474.280542 841.363931
+L 475.163324 958.747757
+L 475.746549 1019.992846
+L 476.036595 773.676999
+L 476.90056 882.562572
+L 478.038375 1022.154223
+L 478.320351 777.157793
+L 479.991914 989.652275
+L 480.267187 1023.21568
+L 480.541529 779.1561
+L 482.436359 1023.833701
+L 482.703469 780.38286
+L 484.548998 1024.314268
+L 484.809249 781.227188
+L 486.607977 1024.773215
+L 486.861711 781.888994
+L 488.615955 1025.241448
+L 488.863491 782.463757
+L 490.575396 1025.718907
+L 490.81703 782.993764
+L 492.488593 1026.19759
+L 492.724599 783.496249
+L 494.357678 1026.669713
+L 494.588312 783.977542
+L 496.184638 1027.129768
+L 496.41014 784.439682
+L 497.971332 1027.574473
+L 498.191925 784.883269
+L 499.719496 1028.002193
+L 499.935389 785.308585
+L 501.430756 1028.412366
+L 501.642146 785.71597
+L 503.106639 1028.805073
+L 503.313709 786.105901
+L 504.748578 1029.180752
+L 504.951501 786.478968
+L 506.35792 1029.540024
+L 506.55686 786.83583
+L 507.740354 995.162266
+L 507.935934 752.456217
+L 509.291941 995.492968
+L 509.483818 752.784782
+L 510.814389 995.809176
+L 511.0027 753.099052
+L 512.308771 996.111605
+L 512.493647 753.399697
+L 513.776104 996.400922
+L 513.957668 753.687351
+L 515.21735 996.677743
+L 515.395718 753.96261
+L 516.63342 996.942642
+L 516.808703 754.226032
+L 518.025179 997.196154
+L 518.197481 754.478141
+L 519.393447 997.438777
+L 519.562868 754.719427
+L 520.739004 997.670978
+L 520.905639 754.950351
+L 522.062592 997.893194
+L 522.226531 755.171345
+L 523.364916 998.105835
+L 523.526245 755.382815
+L 524.646649 998.309288
+L 524.805451 755.585145
+L 525.908433 998.503918
+L 526.064784 755.778696
+L 527.150878 998.690069
+L 527.304853 755.963811
+L 528.374568 998.868068
+L 528.526239 756.140812
+L 529.580062 999.038221
+L 529.729496 756.310006
+L 530.767892 999.200823
+L 530.915154 756.471684
+L 531.938568 999.356151
+L 532.083721 756.626121
+L 533.09258 999.504468
+L 533.235683 756.77358
+L 534.230394 999.646026
+L 534.371505 756.91431
+L 535.35246 999.781063
+L 535.491633 757.048548
+L 536.459207 999.909808
+L 536.596494 757.176522
+L 537.551048 1000.032477
+L 537.6865 757.298446
+L 538.628378 1000.149277
+L 538.762044 757.414527
+L 539.69158 1000.260406
+L 539.823505 757.524961
+L 540.741018 1000.366054
+L 540.871247 757.629936
+L 541.777044 1000.4664
+L 541.905621 757.729632
+L 542.799997 1000.561618
+L 542.926963 757.824221
+L 543.810203 1000.651873
+L 543.935598 757.913867
+L 544.807975 1000.737324
+L 544.931837 757.998727
+L 545.793615 1000.818121
+L 545.915982 758.078954
+L 546.767416 1000.894412
+L 546.888323 758.154691
+L 547.729658 1000.966335
+L 547.849139 758.226077
+L 548.680613 1001.034024
+L 548.798702 758.293247
+L 549.620542 1001.097608
+L 549.73727 758.356326
+L 550.549697 1001.157211
+L 550.665097 758.41544
+L 551.468324 1001.21295
+L 551.582424 758.470704
+L 552.376658 1001.264941
+L 552.489487 758.522234
+L 553.274927 1001.313292
+L 553.386514 758.570138
+L 554.163352 1001.35811
+L 554.273723 758.614521
+L 555.042146 1001.399495
+L 555.151328 758.655485
+L 555.911515 1001.437546
+L 556.019534 758.693126
+L 556.771661 1001.472357
+L 556.87854 758.727538
+L 557.622776 1001.504018
+L 557.728539 758.758811
+L 558.465048 1001.532617
+L 558.569719 758.787033
+L 559.298659 1001.558237
+L 559.40226 758.812287
+L 560.123785 1001.580961
+L 560.226338 758.834654
+L 560.940597 1001.600866
+L 561.042123 758.854212
+L 561.749262 1001.618028
+L 561.84978 758.871037
+L 562.549939 1001.632521
+L 562.64947 758.885201
+L 563.342786 1001.644413
+L 563.441349 758.896773
+L 564.127954 1001.653775
+L 564.225568 758.905823
+L 564.90559 1001.66067
+L 565.002272 758.912415
+L 565.098839 793.59149
+L 565.675838 1001.665164
+L 565.771606 758.916612
+L 565.867262 793.595392
+L 566.438836 1001.667316
+L 566.533708 758.918476
+L 566.628469 793.596969
+L 567.19472 1001.667187
+L 567.288712 758.918066
+L 567.382595 793.596279
+L 567.943621 1001.664834
+L 568.036749 758.915439
+L 568.12977 793.593378
+L 568.685667 1001.660312
+L 568.777946 758.91065
+L 568.870122 793.588323
+L 569.420982 1001.653676
+L 569.512429 758.903753
+L 569.603773 793.581166
+L 570.149687 1001.644976
+L 570.240317 758.894799
+L 570.330845 793.571959
+L 570.871901 1001.634264
+L 570.961727 758.883839
+L 571.051454 793.560751
+L 571.587737 1001.621589
+L 571.676774 758.870921
+L 571.765713 793.547592
+L 572.297308 1001.606997
+L 572.385569 758.856093
+L 572.473735 793.532528
+L 573.000722 1001.590534
+L 573.088221 758.839399
+L 573.175626 793.515605
+L 573.698085 1001.572244
+L 573.784835 758.820884
+L 573.871493 793.496865
+L 574.3895 1001.552171
+L 574.475514 758.800591
+L 574.561437 793.476353
+L 575.075069 1001.530356
+L 575.160358 758.778562
+L 575.245558 793.454109
+L 575.754888 1001.50684
+L 575.839466 758.754835
+L 575.923955 793.430173
+L 576.429053 1001.481661
+L 576.512931 758.729452
+L 576.596722 793.404585
+L 577.097659 1001.454858
+L 577.180848 758.702448
+L 577.263952 793.377382
+L 577.760795 1001.426468
+L 577.843307 758.673862
+L 577.925735 793.3486
+L 578.418551 1001.396525
+L 578.500396 758.643728
+L 578.582159 793.318275
+L 579.071012 1001.365066
+L 579.152202 758.612081
+L 579.233311 793.286442
+L 579.718265 1001.332124
+L 579.798809 758.578956
+L 579.879274 793.253134
+L 580.360391 1001.297731
+L 580.4403 758.544384
+L 580.52013 793.218383
+L 580.99747 1001.261919
+L 581.076754 758.508397
+L 581.155961 793.182222
+L 581.629582 1001.22472
+L 581.708251 758.471026
+L 581.786843 793.14468
+L 582.256803 1001.186162
+L 582.334866 758.432301
+L 582.412853 793.105788
+L 582.879209 1001.146277
+L 582.956675 758.392252
+L 583.034067 793.065575
+L 583.496873 1001.105091
+L 583.573751 758.350905
+L 583.650556 793.024068
+L 584.109866 1001.062632
+L 584.186165 758.308289
+L 584.262392 792.981295
+L 584.718258 1001.018928
+L 584.793987 758.264431
+L 584.869646 792.937284
+L 585.322119 1000.974003
+L 585.397287 758.219356
+L 585.472384 792.892058
+L 585.921515 1000.927885
+L 585.996129 758.17309
+L 586.070674 792.845645
+L 586.516512 1000.880596
+L 586.590581 758.125657
+L 586.664582 792.798068
+L 587.107174 1000.832163
+L 587.180705 758.077082
+L 587.254169 792.749351
+L 587.693563 1000.782606
+L 587.766564 758.027387
+L 587.8395 792.699518
+L 588.275741 1000.731951
+L 588.34822 757.976595
+L 588.420635 792.648591
+L 588.853768 1000.680217
+L 588.925732 757.924729
+L 588.997633 792.596592
+L 589.427703 1000.627428
+L 589.49916 757.871809
+L 589.570554 792.543542
+L 589.997603 1000.573605
+L 590.068559 757.817858
+L 590.139454 792.489463
+L 590.563525 1000.518767
+L 590.633988 757.762894
+L 590.70439 792.434375
+L 591.125523 1000.462934
+L 591.1955 757.706939
+L 591.265416 792.378297
+L 591.683652 1000.406127
+L 591.753149 757.650011
+L 591.822586 792.321249
+L 592.237965 1000.348364
+L 592.306988 757.59213
+L 592.375953 792.263249
+L 592.788514 1000.289663
+L 592.85707 757.533313
+L 592.925568 792.204317
+L 593.335348 1000.230042
+L 593.403444 757.473579
+L 593.471483 792.144469
+L 593.878519 1000.16952
+L 593.94616 757.412945
+L 594.013745 792.083724
+L 594.418075 1000.108113
+L 594.485268 757.351428
+L 594.552405 792.022098
+L 594.954063 1000.045837
+L 595.020813 757.289045
+L 595.087508 791.959609
+L 595.486531 999.98271
+L 595.552844 757.225813
+L 595.619103 791.896271
+L 596.015525 999.918747
+L 596.081407 757.161746
+L 596.147235 791.832101
+L 596.541088 999.853963
+L 596.606545 757.096861
+L 596.671949 791.767114
+L 597.063267 999.788374
+L 597.128304 757.031172
+L 597.193288 791.701326
+L 597.582104 999.721994
+L 597.646725 756.964694
+L 597.711296 791.63475
+L 598.097641 999.654837
+L 598.161853 756.897442
+L 598.226015 791.567402
+L 598.60992 999.586919
+L 598.673728 756.829429
+L 598.737486 791.499296
+L 599.118983 999.518252
+L 599.182392 756.76067
+L 599.245751 791.430444
+L 599.624869 999.44885
+L 599.687883 756.691177
+L 599.750848 791.36086
+L 600.127617 999.378727
+L 600.190242 756.620964
+L 600.252819 791.290558
+L 600.627267 999.307894
+L 600.689508 756.550043
+L 600.7517 791.21955
+L 601.123857 999.236364
+L 601.185717 756.478427
+L 601.24753 791.147848
+L 601.617422 999.16415
+L 601.678907 756.406129
+L 601.740346 791.075465
+L 602.108002 999.091264
+L 602.169116 756.333159
+L 602.230184 791.002412
+L 602.59563 999.017717
+L 602.656378 756.25953
+L 602.71708 790.928702
+L 603.080342 998.94352
+L 603.140728 756.185253
+L 603.201069 790.854345
+L 603.562174 998.868685
+L 603.622202 756.110339
+L 603.682186 790.779352
+L 604.041159 998.793223
+L 604.100834 756.034799
+L 604.160464 790.703734
+L 604.51733 998.717144
+L 604.576656 755.958644
+L 604.635937 790.627503
+L 604.990721 998.640459
+L 605.049701 755.881884
+L 605.108638 790.550668
+L 605.461364 998.563178
+L 605.520002 755.804529
+L 605.578599 790.473239
+L 605.92929 998.48531
+L 605.987591 755.726589
+L 606.04585 790.395227
+L 606.39453 998.406866
+L 606.452498 755.648073
+L 606.510424 790.31664
+L 606.857116 998.327856
+L 606.914754 755.568993
+L 606.972351 790.237489
+L 607.317077 998.248288
+L 607.374389 755.489355
+L 607.431661 790.157783
+L 607.774444 998.168171
+L 607.831433 755.409171
+L 607.888383 790.077531
+L 608.229244 998.087515
+L 608.285915 755.328448
+L 608.342546 789.996742
+L 608.681507 998.006329
+L 608.737863 755.247196
+L 608.79418 789.915424
+L 609.131261 997.92462
+L 609.187305 755.165423
+L 609.243311 789.833586
+L 609.578534 997.842398
+L 609.63427 755.083137
+L 609.689967 789.751237
+L 610.023352 997.75967
+L 610.078783 755.000347
+L 610.134176 789.668384
+L 610.465743 997.676445
+L 610.520872 754.91706
+L 610.575964 789.585035
+L 610.905733 997.59273
+L 610.960564 754.833284
+L 611.015358 789.501199
+L 611.343348 997.508533
+L 611.397884 754.749028
+L 611.452383 789.416883
+L 611.778613 997.423862
+L 611.832857 754.664298
+L 611.887065 789.332095
+L 612.211554 997.338725
+L 612.265509 754.579103
+L 612.319428 789.246842
+L 612.642194 997.253127
+L 612.695864 754.493448
+L 612.749498 789.161131
+L 613.07056 997.167077
+L 613.123947 754.407342
+L 613.177298 789.074969
+L 613.496673 997.080582
+L 613.549781 754.320792
+L 613.602853 788.988363
+L 613.920559 996.993648
+L 613.973389 754.233803
+L 614.026185 788.90132
+L 614.34224 996.906282
+L 614.394796 754.146383
+L 614.447318 788.813847
+L 614.761739 996.81849
+L 614.814024 754.058539
+L 614.866275 788.72595
+L 615.179078 996.730279
+L 615.231094 753.970276
+L 615.283078 788.637635
+L 615.594279 996.641656
+L 615.64603 753.881602
+L 615.697748 788.54891
+L 616.007365 996.552626
+L 616.058853 753.792521
+L 616.110309 788.459779
+L 616.418357 996.463195
+L 616.469585 753.703041
+L 616.52078 788.37025
+L 616.827276 996.373371
+L 616.878246 753.613168
+L 616.929184 788.280327
+L 617.234142 996.283157
+L 617.284857 753.522906
+L 617.33554 788.190017
+L 617.638977 996.19256
+L 617.689439 753.432262
+L 617.73987 788.099326
+L 618.0418 996.101586
+L 618.092012 753.341241
+L 618.142193 788.008258
+L 618.442631 996.010241
+L 618.492596 753.249849
+L 618.54253 787.91682
+L 618.84149 995.918528
+L 618.89121 753.158091
+L 618.940899 787.825017
+L 619.238396 995.826455
+L 619.287873 753.065973
+L 619.33732 787.732854
+L 619.633369 995.734026
+L 619.682605 752.9735
+L 619.731812 787.640337
+L 620.026426 995.641245
+L 620.075425 752.880676
+L 620.124394 787.54747
+L 620.417587 995.54812
+L 620.46635 752.787507
+L 620.515083 787.454258
+L 620.80687 995.454653
+L 620.855399 752.693998
+L 620.95237 822.02741
+L 621.194292 995.36085
+L 621.24259 752.600154
+L 621.339099 821.933483
+L 621.579872 995.266716
+L 621.62794 752.505978
+L 621.723992 821.839225
+L 621.963626 995.172255
+L 622.011468 752.411477
+L 622.107067 821.744643
+L 622.345572 995.077472
+L 622.393189 752.316654
+L 622.488339 821.649741
+L 622.725727 994.982371
+L 622.773122 752.221514
+L 622.867827 821.554522
+L 623.151282 1029.55343
+L 623.198428 786.792529
+L 623.292638 856.12545
+L 623.527686 1029.457669
+L 623.574614 786.69673
+L 623.668388 856.029575
+L 623.902351 1029.361604
+L 623.949063 786.600627
+L 624.042405 855.933397
+L 624.275292 1029.265239
+L 624.321789 786.504225
+L 624.414704 855.83692
+L 624.646526 1029.168578
+L 624.69281 786.407528
+L 624.785301 855.74015
+L 625.016067 1029.071626
+L 625.062141 786.310539
+L 625.154211 855.643089
+L 625.383931 1028.974385
+L 625.429797 786.213263
+L 625.521451 855.545741
+L 625.750134 1028.876861
+L 625.795793 786.115703
+L 625.887034 855.448112
+L 626.114689 1028.779056
+L 626.160144 786.017864
+L 626.250976 855.350203
+L 626.477613 1028.680976
+L 626.522864 785.919749
+L 626.613292 855.25202
+L 626.838919 1028.582622
+L 626.883969 785.821362
+L 626.973995 855.153565
+L 627.198622 1028.484
+L 627.243473 785.722706
+L 627.3331 855.054842
+L 627.556736 1028.385112
+L 627.60139 785.623785
+L 627.690622 854.955856
+L 627.913275 1028.285962
+L 627.957733 785.524603
+L 628.046574 854.856609
+L 628.268253 1028.186553
+L 628.312517 785.425162
+L 628.40097 854.757104
+L 628.621684 1028.08689
+L 628.665754 785.325467
+L 628.753824 854.657346
+L 628.97358 1027.986974
+L 629.01746 785.22552
+L 629.105148 854.557337
+L 629.323955 1027.886811
+L 629.367646 785.125325
+L 629.454956 854.45708
+L 629.672823 1027.786401
+L 629.716326 785.024886
+L 629.803262 854.35658
+L 630.020195 1027.68575
+L 630.063512 784.924204
+L 630.150077 854.255839
+L 630.366086 1027.58486
+L 630.409218 784.823284
+L 630.495415 854.15486
+L 630.710506 1027.483733
+L 630.753456 784.722129
+L 630.839288 854.053646
+L 631.05347 1027.382374
+L 631.096239 784.620741
+L 631.181708 853.9522
+L 631.394989 1027.280785
+L 631.437578 784.519123
+L 631.522689 853.850525
+L 631.735075 1027.178969
+L 631.777486 784.417279
+L 631.862241 853.748625
+L 632.073741 1027.076929
+L 632.115975 784.315211
+L 632.200377 853.646501
+L 632.410998 1026.974667
+L 632.453056 784.212921
+L 632.537108 853.544157
+L 632.746857 1026.872187
+L 632.788742 784.110414
+L 632.872446 853.441596
+L 633.081331 1026.769491
+L 633.123043 784.007691
+L 633.206403 853.338819
+L 633.41443 1026.666582
+L 633.455972 783.904756
+L 633.53899 853.235831
+L 633.746166 1026.563462
+L 633.787538 783.80161
+L 633.870218 853.132633
+L 634.076551 1026.460135
+L 634.117754 783.698257
+L 634.200099 853.029229
+L 634.405594 1026.356602
+L 634.446631 783.594699
+L 634.528642 852.92562
+L 634.733307 1026.252867
+L 634.774179 783.490938
+L 634.855859 852.821809
+L 635.059701 1026.148931
+L 635.100408 783.386978
+L 635.181761 852.717799
+L 635.384786 1026.044798
+L 635.42533 783.28282
+L 635.506358 852.613592
+L 635.708573 1025.940469
+L 635.748955 783.178467
+L 635.82966 852.509191
+L 636.031071 1025.835947
+L 636.071293 783.073921
+L 636.151678 852.404597
+L 636.352292 1025.731235
+L 636.392355 782.969185
+L 636.472422 852.299814
+L 636.672245 1025.626334
+L 636.71215 782.864261
+L 636.791902 852.194843
+L 636.99094 1025.521248
+L 637.030689 782.759151
+L 637.110128 852.089687
+L 637.308387 1025.415977
+L 637.34798 782.653858
+L 637.42711 851.984348
+L 637.624596 1025.310525
+L 637.664035 782.548383
+L 637.742857 851.878829
+L 637.939576 1025.204893
+L 637.978863 782.442729
+L 638.057379 851.77313
+L 638.253337 1025.099084
+L 638.292472 782.336899
+L 638.370685 851.667256
+L 638.565889 1024.9931
+L 638.604873 782.230893
+L 638.682785 851.561206
+L 638.87724 1024.886943
+L 638.916075 782.124714
+L 638.993689 851.454985
+L 639.1874 1024.780615
+L 639.226086 782.018365
+L 639.303404 851.348593
+L 639.496377 1024.674118
+L 639.534917 781.911847
+L 639.611941 851.242033
+L 639.804182 1024.567454
+L 639.842576 781.805162
+L 639.919308 851.135307
+L 640.110822 1024.460624
+L 640.149071 781.698312
+L 640.225514 851.028416
+L 640.416307 1024.353632
+L 640.454412 781.591299
+L 640.530568 850.921363
+L 640.720645 1024.246478
+L 640.758607 781.484125
+L 640.834478 850.814149
+L 641.023845 1024.139165
+L 641.061665 781.376792
+L 641.137253 850.706777
+L 641.325915 1024.031694
+L 641.363595 781.269302
+L 641.438902 850.599248
+L 641.626864 1023.924068
+L 641.664404 781.161657
+L 641.739432 850.491563
+L 641.926699 1023.816288
+L 641.964101 781.053858
+L 642.038852 850.383726
+L 642.22543 1023.708356
+L 642.262694 780.945906
+L 642.337171 850.275737
+L 642.523064 1023.600273
+L 642.560191 780.837805
+L 642.634396 850.167599
+L 642.819609 1023.492042
+L 642.856601 780.729555
+L 642.930535 850.059312
+L 643.115074 1023.383664
+L 643.151931 780.621159
+L 643.225596 849.950879
+L 643.409465 1023.27514
+L 643.446189 780.512618
+L 643.519587 849.842302
+L 643.702791 1023.166473
+L 643.739382 780.403933
+L 643.812515 849.733581
+L 643.99506 1023.057664
+L 644.031519 780.295106
+L 644.10439 849.62472
+L 644.286279 1022.948715
+L 644.322608 780.186139
+L 644.395217 849.515718
+L 644.576455 1022.839627
+L 644.612654 780.077034
+L 644.685004 849.406578
+L 644.865597 1022.730402
+L 644.901667 779.967792
+L 644.973759 849.297302
+L 645.15371 1022.621041
+L 645.189653 779.858414
+L 645.26149 849.18789
+L 645.440804 1022.511546
+L 645.476619 779.748902
+L 645.548202 849.078345
+L 645.726884 1022.401918
+L 645.762573 779.639258
+L 645.833905 848.968668
+L 646.011959 1022.292159
+L 646.047523 779.529483
+L 646.118604 848.858861
+L 646.296034 1022.18227
+L 646.331474 779.419578
+L 646.402306 848.748924
+L 646.579118 1022.072254
+L 646.614434 779.309545
+L 646.68502 848.638859
+L 646.861216 1021.96211
+L 646.896409 779.199386
+L 646.96675 848.528668
+L 647.142336 1021.851841
+L 647.177408 779.089101
+L 647.247505 848.418353
+L 647.422485 1021.741448
+L 647.457436 778.978693
+L 647.527292 848.307913
+L 647.701669 1021.630932
+L 647.736499 778.868162
+L 647.806115 848.197352
+L 647.979895 1021.520295
+L 648.014606 778.75751
+L 648.083984 848.08667
+L 648.257169 1021.409538
+L 648.291761 778.646738
+L 648.360902 847.975868
+L 648.533498 1021.298663
+L 648.567973 778.535848
+L 648.636879 847.864949
+L 648.808888 1021.18767
+L 648.843246 778.42484
+L 648.911919 847.753912
+L 649.083346 1021.076561
+L 649.117588 778.313717
+L 649.186029 847.64276
+L 649.356878 1020.965337
+L 649.391005 778.202479
+L 649.459215 847.531493
+L 649.62949 1020.854
+L 649.663502 778.091127
+L 649.731484 847.420114
+L 649.901188 1020.74255
+L 649.935087 777.979664
+L 650.002841 847.308623
+L 650.171979 1020.630989
+L 650.205765 777.868089
+L 650.273293 847.197021
+L 650.441869 1020.519319
+L 650.475542 777.756405
+L 650.542846 847.085309
+L 650.710863 1020.40754
+L 650.744424 777.644612
+L 650.811506 846.973489
+L 650.978967 1020.295653
+L 651.012418 777.532712
+L 651.079278 846.861563
+L 651.246187 1020.18366
+L 651.279528 777.420706
+L 651.346168 846.74953
+L 651.51253 1020.071562
+L 651.545761 777.308595
+L 651.612183 846.637393
+L 651.778 1019.959359
+L 651.811123 777.19638
+L 651.877328 846.525152
+L 652.042604 1019.847054
+L 652.075619 777.084062
+L 652.141608 846.412808
+L 652.306347 1019.734647
+L 652.339255 776.971642
+L 652.40503 846.300363
+L 652.569235 1019.622139
+L 652.602036 776.859121
+L 652.667599 846.187818
+L 652.831273 1019.509532
+L 652.863968 776.746502
+L 652.929319 846.075173
+L 653.092467 1019.396826
+L 653.125057 776.633783
+L 653.190198 845.962431
+L 653.352822 1019.284022
+L 653.385307 776.520968
+L 653.45024 845.849591
+L 653.612343 1019.171122
+L 653.644725 776.408056
+L 653.741793 880.400952
+L 653.871037 1019.058127
+L 653.903315 776.295048
+L 654.000074 880.287909
+L 654.128907 1018.945037
+L 654.161083 776.181946
+L 654.257535 880.174772
+L 654.38596 1018.831853
+L 654.418034 776.068751
+L 654.514181 880.061542
+L 654.6422 1018.718577
+L 654.674173 775.955464
+L 654.770017 879.948221
+L 654.897633 1018.60521
+L 654.929506 775.842085
+L 655.025048 879.834808
+L 655.152264 1018.491752
+L 655.184036 775.728616
+L 655.27928 879.721305
+L 655.406097 1018.378205
+L 655.43777 775.615057
+L 655.532716 879.607713
+L 655.659138 1018.264568
+L 655.690713 775.50141
+L 655.785363 879.494033
+L 655.911392 1018.150845
+L 655.942868 775.387676
+L 656.037225 879.380266
+L 656.162863 1018.037034
+L 656.194242 775.273855
+L 656.288306 879.266413
+L 656.413556 1017.923138
+L 656.444838 775.159948
+L 656.538613 879.152474
+L 656.663477 1017.809157
+L 656.694663 775.045956
+L 656.788149 879.038451
+L 656.912629 1017.695092
+L 656.94372 774.93188
+L 657.036919 878.924344
+L 657.161019 1017.580944
+L 657.192014 774.817722
+L 657.284928 878.810154
+L 657.408649 1017.466713
+L 657.43955 774.703481
+L 657.532181 878.695883
+L 657.655525 1017.352401
+L 657.686332 774.589159
+L 657.778682 878.581531
+L 657.901652 1017.238009
+L 657.932365 774.474757
+L 658.024436 878.467098
+L 658.147034 1017.123536
+L 658.177654 774.360275
+L 658.269447 878.352587
+L 658.391675 1017.008985
+L 658.422203 774.245714
+L 658.51372 878.237996
+L 658.63558 1016.894356
+L 658.666017 774.131075
+L 658.757258 878.123329
+L 658.878754 1016.77965
+L 658.9091 774.016359
+L 659.000068 878.008584
+L 659.1212 1016.664868
+L 659.151455 773.901567
+L 659.242152 877.893764
+L 659.362924 1016.550009
+L 659.393089 773.7867
+L 659.483516 877.778868
+L 659.603929 1016.435076
+L 659.634004 773.671757
+L 659.724163 877.663898
+L 659.844219 1016.320069
+L 659.874206 773.556741
+L 659.964098 877.548854
+L 660.0838 1016.204989
+L 660.113697 773.441652
+L 660.203325 877.433738
+L 660.322674 1016.089836
+L 660.352484 773.32649
+L 660.441848 877.318549
+L 660.560847 1015.974612
+L 660.590569 773.211257
+L 660.679671 877.203289
+L 660.798322 1015.859317
+L 660.827957 773.095952
+L 660.916799 877.087958
+L 661.035103 1015.743951
+L 661.064652 772.980578
+L 661.153235 876.972558
+L 661.271195 1015.628516
+L 661.300658 772.865134
+L 661.388983 876.857089
+L 661.506601 1015.513012
+L 661.535979 772.749622
+L 661.624048 876.741551
+L 661.741325 1015.39744
+L 661.770618 772.634042
+L 661.858433 876.625945
+L 661.975372 1015.281801
+L 662.004581 772.518394
+L 662.092143 876.510273
+L 662.208746 1015.166096
+L 662.23787 772.40268
+L 662.325181 876.394534
+L 662.441449 1015.050324
+L 662.47049 772.286901
+L 662.55755 876.278729
+L 662.673486 1014.934487
+L 662.702444 772.171056
+L 662.789256 876.16286
+L 662.904861 1014.818586
+L 662.933736 772.055146
+L 663.020301 876.046927
+L 663.135577 1014.702621
+L 663.164371 771.939173
+L 663.25069 875.93093
+L 663.365639 1014.586592
+L 663.394351 771.823137
+L 663.480426 875.81487
+L 663.59505 1014.470501
+L 663.623681 771.707038
+L 663.709512 875.698748
+L 663.823813 1014.354349
+L 663.852363 771.590878
+L 663.937953 875.582565
+L 664.051933 1014.238135
+L 664.080403 771.474656
+L 664.165752 875.466321
+L 664.279412 1014.12186
+L 664.307802 771.358374
+L 664.392913 875.350016
+L 664.506255 1014.005526
+L 664.534566 771.242032
+L 664.619439 875.233652
+L 664.732465 1013.889132
+L 664.760697 771.125631
+L 664.845334 875.117229
+L 664.958046 1013.77268
+L 664.986199 771.009172
+L 665.070601 875.000748
+L 665.183 1013.656169
+L 665.211076 770.892654
+L 665.295244 874.884208
+L 665.407332 1013.539602
+L 665.43533 770.776079
+L 665.519266 874.767612
+L 665.631045 1013.422977
+L 665.658966 770.659448
+L 665.742671 874.650959
+L 665.854143 1013.306296
+L 665.881987 770.54276
+L 665.965462 874.534251
+L 666.076628 1013.18956
+L 666.104396 770.426017
+L 666.187642 874.417487
+L 666.298504 1013.072769
+L 666.326196 770.309218
+L 666.409215 874.300668
+L 666.519774 1012.955923
+L 666.547391 770.192366
+L 666.630184 874.183795
+L 666.740443 1012.839023
+L 666.767984 770.07546
+L 666.850552 874.066869
+L 666.960512 1012.72207
+L 666.987979 769.9585
+L 667.070323 873.94989
+L 667.179985 1012.605065
+L 667.207378 769.841488
+L 667.2895 873.832858
+L 667.398866 1012.488007
+L 667.426185 769.724424
+L 667.508085 873.715774
+L 667.617158 1012.370898
+L 667.644403 769.607308
+L 667.726083 873.59864
+L 667.834863 1012.253737
+L 667.862035 769.490141
+L 667.943497 873.481454
+L 668.051985 1012.136527
+L 668.079085 769.372924
+L 668.160329 873.364218
+L 668.268527 1012.019266
+L 668.295555 769.255657
+L 668.376582 873.246933
+L 668.484493 1011.901956
+L 668.511448 769.138341
+L 668.59226 873.129598
+L 668.699884 1011.784597
+L 668.726768 769.020976
+L 668.807366 873.012215
+L 668.914705 1011.66719
+L 668.941518 768.903563
+L 669.021902 872.894784
+L 669.128958 1011.549735
+L 669.1557 768.786102
+L 669.235873 872.777305
+L 669.342646 1011.432233
+L 669.369318 768.668594
+L 669.44928 872.65978
+L 669.555773 1011.314684
+L 669.582374 768.55104
+L 669.662126 872.542208
+L 669.768341 1011.197089
+L 669.794872 768.433439
+L 669.874416 872.42459
+L 669.980352 1011.079448
+L 670.006815 768.315792
+L 670.086151 872.306926
+L 670.191811 1010.961762
+L 670.218205 768.1981
+L 670.297334 872.189218
+L 670.40272 1010.844031
+L 670.429045 768.080364
+L 670.507969 872.071465
+L 670.613081 1010.726256
+L 670.639338 767.962584
+L 670.718057 871.953668
+L 670.822898 1010.608437
+L 670.849087 767.84476
+L 670.927603 871.835828
+L 671.032173 1010.490575
+L 671.058295 767.726892
+L 671.136608 871.717944
+L 671.24091 1010.372671
+L 671.266964 767.608982
+L 671.345076 871.600018
+L 671.44911 1010.254724
+L 671.475097 767.49103
+L 671.55301 871.482051
+L 671.656777 1010.136735
+L 671.682698 767.373036
+L 671.760411 871.364041
+L 671.863913 1010.018705
+L 671.889768 767.255001
+L 671.967283 871.245991
+L 672.070522 1009.900634
+L 672.096311 767.136925
+L 672.173629 871.1279
+L 672.276605 1009.782523
+L 672.302328 767.018809
+L 672.37945 871.009768
+L 672.482165 1009.664372
+L 672.507824 766.900653
+L 672.584751 870.891597
+L 672.687206 1009.546181
+L 672.7128 766.782458
+L 672.789532 870.773387
+L 672.89173 1009.427952
+L 672.917259 766.664223
+L 672.993798 870.655138
+L 673.095739 1009.309684
+L 673.121204 766.54595
+L 673.197551 870.536851
+L 673.299235 1009.191378
+L 673.324636 766.427639
+L 673.400792 870.418526
+L 673.502222 1009.073034
+L 673.52756 766.309291
+L 673.603526 870.300164
+L 673.704702 1008.954653
+L 673.729977 766.190905
+L 673.805753 870.181764
+L 673.906678 1008.836235
+L 673.93189 766.072483
+L 674.007478 870.063328
+L 674.108152 1008.717781
+L 674.133301 765.954024
+L 674.208701 869.944856
+L 674.309126 1008.599291
+L 674.334213 765.835529
+L 674.409427 869.826348
+L 674.509603 1008.480765
+L 674.534628 765.716999
+L 674.609656 869.707805
+L 674.709586 1008.362204
+L 674.734549 765.598434
+L 674.809393 869.589227
+L 674.909077 1008.243609
+L 674.933979 765.479835
+L 675.008638 869.470614
+L 675.108078 1008.12498
+L 675.132918 765.361201
+L 675.207395 869.351968
+L 675.306591 1008.006316
+L 675.331371 765.242534
+L 675.405666 869.233288
+L 675.50462 1007.88762
+L 675.529339 765.123833
+L 675.603453 869.114575
+L 675.702166 1007.76889
+L 675.726825 765.005099
+L 675.800759 868.995829
+L 675.899232 1007.650128
+L 675.923831 764.886333
+L 675.997585 868.87705
+L 676.09582 1007.531334
+L 676.12036 764.767535
+L 676.193935 868.75824
+L 676.291932 1007.412507
+L 676.316413 764.648705
+L 676.389811 868.639398
+L 676.487572 1007.29365
+L 676.511993 764.529843
+L 676.585214 868.520525
+L 676.68274 1007.174762
+L 676.707103 764.410951
+L 676.780148 868.401622
+L 676.877439 1007.055843
+L 676.901744 764.292028
+L 676.998889 902.94624
+L 677.071672 1006.936893
+L 677.095919 764.173075
+L 677.192832 902.827272
+L 677.265441 1006.817915
+L 677.289629 764.054093
+L 677.386312 902.708275
+L 677.458748 1006.698906
+L 677.482879 763.935081
+L 677.579331 902.589248
+L 677.651594 1006.579869
+L 677.675668 763.81604
+L 677.771891 902.470193
+L 677.843984 1006.460803
+L 677.868 763.69697
+L 677.963995 902.351109
+L 678.035917 1006.341709
+L 678.059877 763.577873
+L 678.155645 902.231998
+L 678.227398 1006.222587
+L 678.251301 763.458747
+L 678.346844 902.112858
+L 678.418427 1006.103437
+L 678.442274 763.339594
+L 678.537592 901.993692
+L 678.609007 1005.98426
+L 678.632798 763.220414
+L 678.727892 901.874498
+L 678.79914 1005.865057
+L 678.822875 763.101207
+L 678.917747 901.755278
+L 678.988828 1005.745827
+L 679.012508 762.981974
+L 679.107158 901.636032
+L 679.178073 1005.626571
+L 679.201698 762.862715
+L 679.296128 901.51676
+L 679.366878 1005.50729
+L 679.390448 762.74343
+L 679.484658 901.397463
+L 679.555244 1005.387983
+L 679.578759 762.62412
+L 679.672751 901.27814
+L 679.743173 1005.268651
+L 679.766634 762.504785
+L 679.860408 901.158793
+L 679.930668 1005.149295
+L 679.954074 762.385426
+L 680.047632 901.039421
+L 680.11773 1005.029914
+L 680.141082 762.266042
+L 680.234425 900.920026
+L 680.304361 1004.91051
+L 680.32766 762.146635
+L 680.420788 900.800607
+L 680.490564 1004.791082
+L 680.513809 762.027204
+L 680.606724 900.681164
+L 680.67634 1004.67163
+L 680.699532 761.90775
+L 680.792234 900.561699
+L 680.861691 1004.552157
+L 680.88483 761.788273
+L 680.977321 900.442211
+L 681.046619 1004.43266
+L 681.069706 761.668774
+L 681.161986 900.3227
+L 681.231127 1004.313142
+L 681.254161 761.549253
+L 681.346231 900.203168
+L 681.415215 1004.193601
+L 681.438197 761.42971
+L 681.530059 900.083614
+L 681.598887 1004.074039
+L 681.621816 761.310145
+L 681.71347 899.964039
+L 681.782143 1003.954456
+L 681.805021 761.19056
+L 681.896468 899.844443
+L 681.964986 1003.834853
+L 681.987812 761.070954
+L 682.079054 899.724827
+L 682.147417 1003.715229
+L 682.170192 760.951327
+L 682.261229 899.60519
+L 682.329439 1003.595584
+L 682.352163 760.83168
+L 682.442996 899.485534
+L 682.511053 1003.47592
+L 682.533727 760.712014
+L 682.624356 899.365857
+L 682.692261 1003.356237
+L 682.714884 760.592328
+L 682.805311 899.246162
+L 682.873065 1003.236535
+L 682.895638 760.472623
+L 682.985863 899.126448
+L 683.053467 1003.116813
+L 683.075989 760.352899
+L 683.166015 899.006715
+L 683.233468 1002.997074
+L 683.25594 760.233157
+L 683.345766 898.886964
+L 683.41307 1002.877316
+L 683.435493 760.113397
+L 683.52512 898.767195
+L 683.592276 1002.75754
+L 683.614648 759.993619
+L 683.704078 898.647408
+L 683.771086 1002.637747
+L 683.793409 759.873824
+L 683.882642 898.527604
+L 683.949502 1002.517936
+L 683.971777 759.754012
+L 684.060813 898.407783
+L 684.127527 1002.398109
+L 684.149752 759.634182
+L 684.238594 898.287946
+L 684.305161 1002.278266
+L 684.327338 759.514337
+L 684.415986 898.168092
+L 684.482408 1002.158406
+L 684.504536 759.394475
+L 684.59299 898.048222
+L 684.659267 1002.03853
+L 684.681347 759.274597
+L 684.769609 897.928336
+L 684.835742 1001.918639
+L 684.857774 759.154704
+L 684.945843 897.808435
+L 685.011833 1001.798732
+L 685.033817 759.034795
+L 685.121696 897.688519
+L 685.187542 1001.67881
+L 685.209479 758.914872
+L 685.297168 897.568589
+L 685.362872 1001.558874
+L 685.384761 758.794934
+L 685.47226 897.448644
+L 685.537823 1001.438924
+L 685.559665 758.674981
+L 685.646976 897.328684
+L 685.712397 1001.318959
+L 685.734193 758.555015
+L 685.821316 897.208711
+L 685.886597 1001.198981
+L 685.908345 758.435035
+L 685.995281 897.088724
+L 686.060422 1001.078989
+L 686.082124 758.315042
+L 686.168874 896.968724
+L 686.233876 1000.958984
+L 686.255532 758.195035
+L 686.342097 896.848712
+L 686.40696 1000.838967
+L 686.428569 758.075016
+L 686.514949 896.728686
+L 686.579674 1000.718937
+L 686.601238 757.954985
+L 686.687434 896.608648
+L 686.752022 1000.598894
+L 686.77354 757.834941
+L 686.859553 896.488599
+L 686.924004 1000.47884
+L 686.945476 757.714885
+L 687.031308 896.368537
+L 687.095622 1000.358774
+L 687.117048 757.594818
+L 687.202699 896.248464
+L 687.266877 1000.238697
+L 687.288258 757.47474
+L 687.373728 896.12838
+L 687.437771 1000.118609
+L 687.459108 757.35465
+L 687.544398 896.008286
+L 687.608306 999.998511
+L 687.629598 757.23455
+L 687.714708 895.88818
+L 687.778483 999.878401
+L 687.79973 757.11444
+L 687.884662 895.768065
+L 687.948303 999.758282
+L 687.969506 756.994319
+L 688.054261 895.64794
+L 688.117769 999.638153
+L 688.138927 756.874189
+L 688.223505 895.527805
+L 688.28688 999.518015
+L 688.307995 756.754049
+L 688.392396 895.40766
+L 688.45564 999.397867
+L 688.47671 756.633901
+L 688.560937 895.287507
+L 688.624049 999.27771
+L 688.645076 756.513743
+L 688.729128 895.167345
+L 688.792109 999.157545
+L 688.813092 756.393577
+L 688.89697 895.047174
+L 688.959822 999.037372
+L 688.980761 756.273402
+L 689.064466 894.926996
+L 689.127188 998.91719
+L 689.148084 756.153219
+L 689.231617 894.806809
+L 689.294209 998.797001
+L 689.315063 756.033029
+L 689.398423 894.686615
+L 689.460887 998.676804
+L 689.481698 755.912831
+L 689.564887 894.566414
+L 689.627223 998.5566
+L 689.647991 755.792626
+L 689.73101 894.446206
+L 689.793218 998.436389
+L 689.813944 755.672415
+L 689.896793 894.32599
+L 689.958875 998.316171
+L 689.979558 755.552196
+L 690.062238 894.205769
+L 690.124193 998.195948
+L 690.144834 755.431972
+L 690.227346 894.085541
+L 690.289175 998.075718
+L 690.309774 755.311741
+L 690.392118 893.965308
+L 690.453822 997.955482
+L 690.474379 755.191505
+L 690.556556 893.845069
+L 690.618135 997.835241
+L 690.63865 755.071263
+L 690.720662 893.724825
+L 690.782115 997.714995
+L 690.80259 754.951017
+L 690.884435 893.604576
+L 690.945765 997.594744
+L 690.966198 754.830765
+L 691.047879 893.484322
+L 691.109085 997.474489
+L 691.129477 754.710509
+L 691.210993 893.364064
+L 691.272077 997.354229
+L 691.292428 754.590249
+L 691.37378 893.243801
+L 691.434741 997.233965
+L 691.455052 754.469984
+L 691.536241 893.123535
+L 691.59708 997.113697
+L 691.61735 754.349716
+L 691.698377 893.003265
+L 691.759095 996.993426
+L 691.779324 754.229445
+L 691.86019 892.882992
+L 691.920786 996.873152
+L 691.940975 754.10917
+L 692.02168 892.762716
+L 692.082156 996.752875
+L 692.102304 753.988893
+L 692.182849 892.642437
+L 692.243204 996.632595
+L 692.263313 753.868613
+L 692.343698 892.522156
+L 692.403934 996.512314
+L 692.424003 753.748331
+L 692.504228 892.401873
+L 692.564345 996.39203
+L 692.584375 753.628047
+L 692.664442 892.281588
+L 692.72444 996.271744
+L 692.74443 753.507761
+L 692.824339 892.161301
+L 692.884219 996.151457
+L 692.90417 753.387473
+L 692.983922 892.041014
+L 693.043684 996.031169
+L 693.063595 753.267185
+L 693.143191 891.920725
+L 693.202836 995.910879
+L 693.222708 753.146896
+L 693.302148 891.800435
+L 693.361676 995.79059
+L 693.381509 753.026606
+L 693.460793 891.680145
+L 693.520206 995.670299
+L 693.520206 995.670299
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_13">
+ <path d="M 62.57 1038.04
+L 62.57 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_14">
+ <path d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_15">
+ <path d="M 62.57 1038.04
+L 693.54 1038.04
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_16">
+ <path d="M 62.57 745.2
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="text_44">
+ <!-- 24th-order Butterworth filter, lowpass 1khz -->
+ <defs>
+ <path d="M 4.890625 31.390625
+L 31.203125 31.390625
+L 31.203125 23.390625
+L 4.890625 23.390625
+z
+" id="DejaVuSans-45"/>
+ <path d="M 30.609375 48.390625
+Q 23.390625 48.390625 19.1875 42.75
+Q 14.984375 37.109375 14.984375 27.296875
+Q 14.984375 17.484375 19.15625 11.84375
+Q 23.34375 6.203125 30.609375 6.203125
+Q 37.796875 6.203125 41.984375 11.859375
+Q 46.1875 17.53125 46.1875 27.296875
+Q 46.1875 37.015625 41.984375 42.703125
+Q 37.796875 48.390625 30.609375 48.390625
+z
+M 30.609375 56
+Q 42.328125 56 49.015625 48.375
+Q 55.71875 40.765625 55.71875 27.296875
+Q 55.71875 13.875 49.015625 6.21875
+Q 42.328125 -1.421875 30.609375 -1.421875
+Q 18.84375 -1.421875 12.171875 6.21875
+Q 5.515625 13.875 5.515625 27.296875
+Q 5.515625 40.765625 12.171875 48.375
+Q 18.84375 56 30.609375 56
+z
+" id="DejaVuSans-111"/>
+ <path d="M 4.203125 54.6875
+L 13.1875 54.6875
+L 24.421875 12.015625
+L 35.59375 54.6875
+L 46.1875 54.6875
+L 57.421875 12.015625
+L 68.609375 54.6875
+L 77.59375 54.6875
+L 63.28125 0
+L 52.6875 0
+L 40.921875 44.828125
+L 29.109375 0
+L 18.5 0
+z
+" id="DejaVuSans-119"/>
+ <path d="M 37.109375 75.984375
+L 37.109375 68.5
+L 28.515625 68.5
+Q 23.6875 68.5 21.796875 66.546875
+Q 19.921875 64.59375 19.921875 59.515625
+L 19.921875 54.6875
+L 34.71875 54.6875
+L 34.71875 47.703125
+L 19.921875 47.703125
+L 19.921875 0
+L 10.890625 0
+L 10.890625 47.703125
+L 2.296875 47.703125
+L 2.296875 54.6875
+L 10.890625 54.6875
+L 10.890625 58.5
+Q 10.890625 67.625 15.140625 71.796875
+Q 19.390625 75.984375 28.609375 75.984375
+z
+" id="DejaVuSans-102"/>
+ <path d="M 11.71875 12.40625
+L 22.015625 12.40625
+L 22.015625 4
+L 14.015625 -11.625
+L 7.71875 -11.625
+L 11.71875 4
+z
+" id="DejaVuSans-44"/>
+ </defs>
+ <g transform="translate(186.99 33.7575)scale(0.16 -0.16)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-116"/>
+ <use x="166.455078" xlink:href="#DejaVuSans-104"/>
+ <use x="229.833984" xlink:href="#DejaVuSans-45"/>
+ <use x="265.933594" xlink:href="#DejaVuSans-111"/>
+ <use x="327.115234" xlink:href="#DejaVuSans-114"/>
+ <use x="368.212891" xlink:href="#DejaVuSans-100"/>
+ <use x="431.689453" xlink:href="#DejaVuSans-101"/>
+ <use x="493.212891" xlink:href="#DejaVuSans-114"/>
+ <use x="534.326172" xlink:href="#DejaVuSans-32"/>
+ <use x="566.113281" xlink:href="#DejaVuSans-66"/>
+ <use x="634.716797" xlink:href="#DejaVuSans-117"/>
+ <use x="698.095703" xlink:href="#DejaVuSans-116"/>
+ <use x="737.304688" xlink:href="#DejaVuSans-116"/>
+ <use x="776.513672" xlink:href="#DejaVuSans-101"/>
+ <use x="838.037109" xlink:href="#DejaVuSans-114"/>
+ <use x="879.150391" xlink:href="#DejaVuSans-119"/>
+ <use x="960.9375" xlink:href="#DejaVuSans-111"/>
+ <use x="1022.119141" xlink:href="#DejaVuSans-114"/>
+ <use x="1063.232422" xlink:href="#DejaVuSans-116"/>
+ <use x="1102.441406" xlink:href="#DejaVuSans-104"/>
+ <use x="1165.820312" xlink:href="#DejaVuSans-32"/>
+ <use x="1197.607422" xlink:href="#DejaVuSans-102"/>
+ <use x="1232.8125" xlink:href="#DejaVuSans-105"/>
+ <use x="1260.595703" xlink:href="#DejaVuSans-108"/>
+ <use x="1288.378906" xlink:href="#DejaVuSans-116"/>
+ <use x="1327.587891" xlink:href="#DejaVuSans-101"/>
+ <use x="1389.111328" xlink:href="#DejaVuSans-114"/>
+ <use x="1430.224609" xlink:href="#DejaVuSans-44"/>
+ <use x="1462.011719" xlink:href="#DejaVuSans-32"/>
+ <use x="1493.798828" xlink:href="#DejaVuSans-108"/>
+ <use x="1521.582031" xlink:href="#DejaVuSans-111"/>
+ <use x="1582.763672" xlink:href="#DejaVuSans-119"/>
+ <use x="1664.550781" xlink:href="#DejaVuSans-112"/>
+ <use x="1728.027344" xlink:href="#DejaVuSans-97"/>
+ <use x="1789.306641" xlink:href="#DejaVuSans-115"/>
+ <use x="1841.40625" xlink:href="#DejaVuSans-115"/>
+ <use x="1893.505859" xlink:href="#DejaVuSans-32"/>
+ <use x="1925.292969" xlink:href="#DejaVuSans-49"/>
+ <use x="1988.916016" xlink:href="#DejaVuSans-107"/>
+ <use x="2046.826172" xlink:href="#DejaVuSans-104"/>
+ <use x="2110.205078" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="p0d5dc64309">
+ <rect height="292.84" width="630.97" x="62.57" y="75.6"/>
+ </clipPath>
+ <clipPath id="pdcbd05f3da">
+ <rect height="292.84" width="630.97" x="62.57" y="410.4"/>
+ </clipPath>
+ <clipPath id="pa6552d3f23">
+ <rect height="292.84" width="630.97" x="62.57" y="745.2"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/docs/docs/img/chebyshev1_lowpass8.svg b/docs/docs/img/chebyshev1_lowpass8.svg
@@ -0,0 +1,5196 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Created with matplotlib (https://matplotlib.org/) -->
+<svg height="1080pt" version="1.1" viewBox="0 0 720 1080" width="720pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+ </style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 1080
+L 720 1080
+L 720 0
+L 0 0
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="axes_1">
+ <g id="patch_2">
+ <path d="M 62.57 368.44
+L 693.54 368.44
+L 693.54 75.6
+L 62.57 75.6
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_1">
+ <g id="xtick_1">
+ <g id="line2d_1">
+ <path clip-path="url(#p105bbe0688)" d="M 62.57 368.44
+L 62.57 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_2">
+ <defs>
+ <path d="M 0 0
+L 0 3.5
+" id="m118d1132db" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m118d1132db" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- 0 -->
+ <defs>
+ <path d="M 31.78125 66.40625
+Q 24.171875 66.40625 20.328125 58.90625
+Q 16.5 51.421875 16.5 36.375
+Q 16.5 21.390625 20.328125 13.890625
+Q 24.171875 6.390625 31.78125 6.390625
+Q 39.453125 6.390625 43.28125 13.890625
+Q 47.125 21.390625 47.125 36.375
+Q 47.125 51.421875 43.28125 58.90625
+Q 39.453125 66.40625 31.78125 66.40625
+z
+M 31.78125 74.21875
+Q 44.046875 74.21875 50.515625 64.515625
+Q 56.984375 54.828125 56.984375 36.375
+Q 56.984375 17.96875 50.515625 8.265625
+Q 44.046875 -1.421875 31.78125 -1.421875
+Q 19.53125 -1.421875 13.0625 8.265625
+Q 6.59375 17.96875 6.59375 36.375
+Q 6.59375 54.828125 13.0625 64.515625
+Q 19.53125 74.21875 31.78125 74.21875
+z
+" id="DejaVuSans-48"/>
+ </defs>
+ <g transform="translate(59.38875 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_2">
+ <g id="line2d_3">
+ <path clip-path="url(#p105bbe0688)" d="M 185.926794 368.44
+L 185.926794 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_4">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="185.926794" xlink:href="#m118d1132db" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- 200 -->
+ <defs>
+ <path d="M 19.1875 8.296875
+L 53.609375 8.296875
+L 53.609375 0
+L 7.328125 0
+L 7.328125 8.296875
+Q 12.9375 14.109375 22.625 23.890625
+Q 32.328125 33.6875 34.8125 36.53125
+Q 39.546875 41.84375 41.421875 45.53125
+Q 43.3125 49.21875 43.3125 52.78125
+Q 43.3125 58.59375 39.234375 62.25
+Q 35.15625 65.921875 28.609375 65.921875
+Q 23.96875 65.921875 18.8125 64.3125
+Q 13.671875 62.703125 7.8125 59.421875
+L 7.8125 69.390625
+Q 13.765625 71.78125 18.9375 73
+Q 24.125 74.21875 28.421875 74.21875
+Q 39.75 74.21875 46.484375 68.546875
+Q 53.21875 62.890625 53.21875 53.421875
+Q 53.21875 48.921875 51.53125 44.890625
+Q 49.859375 40.875 45.40625 35.40625
+Q 44.1875 33.984375 37.640625 27.21875
+Q 31.109375 20.453125 19.1875 8.296875
+z
+" id="DejaVuSans-50"/>
+ </defs>
+ <g transform="translate(176.383044 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_3">
+ <g id="line2d_5">
+ <path clip-path="url(#p105bbe0688)" d="M 309.283587 368.44
+L 309.283587 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_6">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="309.283587" xlink:href="#m118d1132db" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- 400 -->
+ <defs>
+ <path d="M 37.796875 64.3125
+L 12.890625 25.390625
+L 37.796875 25.390625
+z
+M 35.203125 72.90625
+L 47.609375 72.90625
+L 47.609375 25.390625
+L 58.015625 25.390625
+L 58.015625 17.1875
+L 47.609375 17.1875
+L 47.609375 0
+L 37.796875 0
+L 37.796875 17.1875
+L 4.890625 17.1875
+L 4.890625 26.703125
+z
+" id="DejaVuSans-52"/>
+ </defs>
+ <g transform="translate(299.739837 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-52"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_4">
+ <g id="line2d_7">
+ <path clip-path="url(#p105bbe0688)" d="M 432.640381 368.44
+L 432.640381 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_8">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="432.640381" xlink:href="#m118d1132db" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- 600 -->
+ <defs>
+ <path d="M 33.015625 40.375
+Q 26.375 40.375 22.484375 35.828125
+Q 18.609375 31.296875 18.609375 23.390625
+Q 18.609375 15.53125 22.484375 10.953125
+Q 26.375 6.390625 33.015625 6.390625
+Q 39.65625 6.390625 43.53125 10.953125
+Q 47.40625 15.53125 47.40625 23.390625
+Q 47.40625 31.296875 43.53125 35.828125
+Q 39.65625 40.375 33.015625 40.375
+z
+M 52.59375 71.296875
+L 52.59375 62.3125
+Q 48.875 64.0625 45.09375 64.984375
+Q 41.3125 65.921875 37.59375 65.921875
+Q 27.828125 65.921875 22.671875 59.328125
+Q 17.53125 52.734375 16.796875 39.40625
+Q 19.671875 43.65625 24.015625 45.921875
+Q 28.375 48.1875 33.59375 48.1875
+Q 44.578125 48.1875 50.953125 41.515625
+Q 57.328125 34.859375 57.328125 23.390625
+Q 57.328125 12.15625 50.6875 5.359375
+Q 44.046875 -1.421875 33.015625 -1.421875
+Q 20.359375 -1.421875 13.671875 8.265625
+Q 6.984375 17.96875 6.984375 36.375
+Q 6.984375 53.65625 15.1875 63.9375
+Q 23.390625 74.21875 37.203125 74.21875
+Q 40.921875 74.21875 44.703125 73.484375
+Q 48.484375 72.75 52.59375 71.296875
+z
+" id="DejaVuSans-54"/>
+ </defs>
+ <g transform="translate(423.096631 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-54"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_5">
+ <g id="line2d_9">
+ <path clip-path="url(#p105bbe0688)" d="M 555.997175 368.44
+L 555.997175 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_10">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="555.997175" xlink:href="#m118d1132db" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- 800 -->
+ <defs>
+ <path d="M 31.78125 34.625
+Q 24.75 34.625 20.71875 30.859375
+Q 16.703125 27.09375 16.703125 20.515625
+Q 16.703125 13.921875 20.71875 10.15625
+Q 24.75 6.390625 31.78125 6.390625
+Q 38.8125 6.390625 42.859375 10.171875
+Q 46.921875 13.96875 46.921875 20.515625
+Q 46.921875 27.09375 42.890625 30.859375
+Q 38.875 34.625 31.78125 34.625
+z
+M 21.921875 38.8125
+Q 15.578125 40.375 12.03125 44.71875
+Q 8.5 49.078125 8.5 55.328125
+Q 8.5 64.0625 14.71875 69.140625
+Q 20.953125 74.21875 31.78125 74.21875
+Q 42.671875 74.21875 48.875 69.140625
+Q 55.078125 64.0625 55.078125 55.328125
+Q 55.078125 49.078125 51.53125 44.71875
+Q 48 40.375 41.703125 38.8125
+Q 48.828125 37.15625 52.796875 32.3125
+Q 56.78125 27.484375 56.78125 20.515625
+Q 56.78125 9.90625 50.3125 4.234375
+Q 43.84375 -1.421875 31.78125 -1.421875
+Q 19.734375 -1.421875 13.25 4.234375
+Q 6.78125 9.90625 6.78125 20.515625
+Q 6.78125 27.484375 10.78125 32.3125
+Q 14.796875 37.15625 21.921875 38.8125
+z
+M 18.3125 54.390625
+Q 18.3125 48.734375 21.84375 45.5625
+Q 25.390625 42.390625 31.78125 42.390625
+Q 38.140625 42.390625 41.71875 45.5625
+Q 45.3125 48.734375 45.3125 54.390625
+Q 45.3125 60.0625 41.71875 63.234375
+Q 38.140625 66.40625 31.78125 66.40625
+Q 25.390625 66.40625 21.84375 63.234375
+Q 18.3125 60.0625 18.3125 54.390625
+z
+" id="DejaVuSans-56"/>
+ </defs>
+ <g transform="translate(546.453425 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-56"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_6">
+ <g id="line2d_11">
+ <path clip-path="url(#p105bbe0688)" d="M 679.353969 368.44
+L 679.353969 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_12">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="679.353969" xlink:href="#m118d1132db" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- 1000 -->
+ <defs>
+ <path d="M 12.40625 8.296875
+L 28.515625 8.296875
+L 28.515625 63.921875
+L 10.984375 60.40625
+L 10.984375 69.390625
+L 28.421875 72.90625
+L 38.28125 72.90625
+L 38.28125 8.296875
+L 54.390625 8.296875
+L 54.390625 0
+L 12.40625 0
+z
+" id="DejaVuSans-49"/>
+ </defs>
+ <g transform="translate(666.628969 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_7">
+ <!-- Samples -->
+ <defs>
+ <path d="M 53.515625 70.515625
+L 53.515625 60.890625
+Q 47.90625 63.578125 42.921875 64.890625
+Q 37.9375 66.21875 33.296875 66.21875
+Q 25.25 66.21875 20.875 63.09375
+Q 16.5 59.96875 16.5 54.203125
+Q 16.5 49.359375 19.40625 46.890625
+Q 22.3125 44.4375 30.421875 42.921875
+L 36.375 41.703125
+Q 47.40625 39.59375 52.65625 34.296875
+Q 57.90625 29 57.90625 20.125
+Q 57.90625 9.515625 50.796875 4.046875
+Q 43.703125 -1.421875 29.984375 -1.421875
+Q 24.8125 -1.421875 18.96875 -0.25
+Q 13.140625 0.921875 6.890625 3.21875
+L 6.890625 13.375
+Q 12.890625 10.015625 18.65625 8.296875
+Q 24.421875 6.59375 29.984375 6.59375
+Q 38.421875 6.59375 43.015625 9.90625
+Q 47.609375 13.234375 47.609375 19.390625
+Q 47.609375 24.75 44.3125 27.78125
+Q 41.015625 30.8125 33.5 32.328125
+L 27.484375 33.5
+Q 16.453125 35.6875 11.515625 40.375
+Q 6.59375 45.0625 6.59375 53.421875
+Q 6.59375 63.09375 13.40625 68.65625
+Q 20.21875 74.21875 32.171875 74.21875
+Q 37.3125 74.21875 42.625 73.28125
+Q 47.953125 72.359375 53.515625 70.515625
+z
+" id="DejaVuSans-83"/>
+ <path d="M 34.28125 27.484375
+Q 23.390625 27.484375 19.1875 25
+Q 14.984375 22.515625 14.984375 16.5
+Q 14.984375 11.71875 18.140625 8.90625
+Q 21.296875 6.109375 26.703125 6.109375
+Q 34.1875 6.109375 38.703125 11.40625
+Q 43.21875 16.703125 43.21875 25.484375
+L 43.21875 27.484375
+z
+M 52.203125 31.203125
+L 52.203125 0
+L 43.21875 0
+L 43.21875 8.296875
+Q 40.140625 3.328125 35.546875 0.953125
+Q 30.953125 -1.421875 24.3125 -1.421875
+Q 15.921875 -1.421875 10.953125 3.296875
+Q 6 8.015625 6 15.921875
+Q 6 25.140625 12.171875 29.828125
+Q 18.359375 34.515625 30.609375 34.515625
+L 43.21875 34.515625
+L 43.21875 35.40625
+Q 43.21875 41.609375 39.140625 45
+Q 35.0625 48.390625 27.6875 48.390625
+Q 23 48.390625 18.546875 47.265625
+Q 14.109375 46.140625 10.015625 43.890625
+L 10.015625 52.203125
+Q 14.9375 54.109375 19.578125 55.046875
+Q 24.21875 56 28.609375 56
+Q 40.484375 56 46.34375 49.84375
+Q 52.203125 43.703125 52.203125 31.203125
+z
+" id="DejaVuSans-97"/>
+ <path d="M 52 44.1875
+Q 55.375 50.25 60.0625 53.125
+Q 64.75 56 71.09375 56
+Q 79.640625 56 84.28125 50.015625
+Q 88.921875 44.046875 88.921875 33.015625
+L 88.921875 0
+L 79.890625 0
+L 79.890625 32.71875
+Q 79.890625 40.578125 77.09375 44.375
+Q 74.3125 48.1875 68.609375 48.1875
+Q 61.625 48.1875 57.5625 43.546875
+Q 53.515625 38.921875 53.515625 30.90625
+L 53.515625 0
+L 44.484375 0
+L 44.484375 32.71875
+Q 44.484375 40.625 41.703125 44.40625
+Q 38.921875 48.1875 33.109375 48.1875
+Q 26.21875 48.1875 22.15625 43.53125
+Q 18.109375 38.875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.1875 51.21875 25.484375 53.609375
+Q 29.78125 56 35.6875 56
+Q 41.65625 56 45.828125 52.96875
+Q 50 49.953125 52 44.1875
+z
+" id="DejaVuSans-109"/>
+ <path d="M 18.109375 8.203125
+L 18.109375 -20.796875
+L 9.078125 -20.796875
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+z
+M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+" id="DejaVuSans-112"/>
+ <path d="M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 0
+L 9.421875 0
+z
+" id="DejaVuSans-108"/>
+ <path d="M 56.203125 29.59375
+L 56.203125 25.203125
+L 14.890625 25.203125
+Q 15.484375 15.921875 20.484375 11.0625
+Q 25.484375 6.203125 34.421875 6.203125
+Q 39.59375 6.203125 44.453125 7.46875
+Q 49.3125 8.734375 54.109375 11.28125
+L 54.109375 2.78125
+Q 49.265625 0.734375 44.1875 -0.34375
+Q 39.109375 -1.421875 33.890625 -1.421875
+Q 20.796875 -1.421875 13.15625 6.1875
+Q 5.515625 13.8125 5.515625 26.8125
+Q 5.515625 40.234375 12.765625 48.109375
+Q 20.015625 56 32.328125 56
+Q 43.359375 56 49.78125 48.890625
+Q 56.203125 41.796875 56.203125 29.59375
+z
+M 47.21875 32.234375
+Q 47.125 39.59375 43.09375 43.984375
+Q 39.0625 48.390625 32.421875 48.390625
+Q 24.90625 48.390625 20.390625 44.140625
+Q 15.875 39.890625 15.1875 32.171875
+z
+" id="DejaVuSans-101"/>
+ <path d="M 44.28125 53.078125
+L 44.28125 44.578125
+Q 40.484375 46.53125 36.375 47.5
+Q 32.28125 48.484375 27.875 48.484375
+Q 21.1875 48.484375 17.84375 46.4375
+Q 14.5 44.390625 14.5 40.28125
+Q 14.5 37.15625 16.890625 35.375
+Q 19.28125 33.59375 26.515625 31.984375
+L 29.59375 31.296875
+Q 39.15625 29.25 43.1875 25.515625
+Q 47.21875 21.78125 47.21875 15.09375
+Q 47.21875 7.46875 41.1875 3.015625
+Q 35.15625 -1.421875 24.609375 -1.421875
+Q 20.21875 -1.421875 15.453125 -0.5625
+Q 10.6875 0.296875 5.421875 2
+L 5.421875 11.28125
+Q 10.40625 8.6875 15.234375 7.390625
+Q 20.0625 6.109375 24.8125 6.109375
+Q 31.15625 6.109375 34.5625 8.28125
+Q 37.984375 10.453125 37.984375 14.40625
+Q 37.984375 18.0625 35.515625 20.015625
+Q 33.0625 21.96875 24.703125 23.78125
+L 21.578125 24.515625
+Q 13.234375 26.265625 9.515625 29.90625
+Q 5.8125 33.546875 5.8125 39.890625
+Q 5.8125 47.609375 11.28125 51.796875
+Q 16.75 56 26.8125 56
+Q 31.78125 56 36.171875 55.265625
+Q 40.578125 54.546875 44.28125 53.078125
+z
+" id="DejaVuSans-115"/>
+ </defs>
+ <g transform="translate(356.701875 396.716563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-83"/>
+ <use x="63.476562" xlink:href="#DejaVuSans-97"/>
+ <use x="124.755859" xlink:href="#DejaVuSans-109"/>
+ <use x="222.167969" xlink:href="#DejaVuSans-112"/>
+ <use x="285.644531" xlink:href="#DejaVuSans-108"/>
+ <use x="313.427734" xlink:href="#DejaVuSans-101"/>
+ <use x="374.951172" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_2">
+ <g id="ytick_1">
+ <g id="line2d_13">
+ <path clip-path="url(#p105bbe0688)" d="M 62.57 332.253316
+L 693.54 332.253316
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_14">
+ <defs>
+ <path d="M 0 0
+L -3.5 0
+" id="mf11cb8975f" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="332.253316"/>
+ </g>
+ </g>
+ <g id="text_8">
+ <!-- −0.02 -->
+ <defs>
+ <path d="M 10.59375 35.5
+L 73.1875 35.5
+L 73.1875 27.203125
+L 10.59375 27.203125
+z
+" id="DejaVuSans-8722"/>
+ <path d="M 10.6875 12.40625
+L 21 12.40625
+L 21 0
+L 10.6875 0
+z
+" id="DejaVuSans-46"/>
+ </defs>
+ <g transform="translate(24.924688 336.052534)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-48"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-46"/>
+ <use x="179.199219" xlink:href="#DejaVuSans-48"/>
+ <use x="242.822266" xlink:href="#DejaVuSans-50"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_2">
+ <g id="line2d_15">
+ <path clip-path="url(#p105bbe0688)" d="M 62.57 279.457862
+L 693.54 279.457862
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_16">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="279.457862"/>
+ </g>
+ </g>
+ <g id="text_9">
+ <!-- 0.00 -->
+ <g transform="translate(33.304375 283.25708)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_3">
+ <g id="line2d_17">
+ <path clip-path="url(#p105bbe0688)" d="M 62.57 226.662407
+L 693.54 226.662407
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_18">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="226.662407"/>
+ </g>
+ </g>
+ <g id="text_10">
+ <!-- 0.02 -->
+ <g transform="translate(33.304375 230.461626)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-50"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_4">
+ <g id="line2d_19">
+ <path clip-path="url(#p105bbe0688)" d="M 62.57 173.866953
+L 693.54 173.866953
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_20">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="173.866953"/>
+ </g>
+ </g>
+ <g id="text_11">
+ <!-- 0.04 -->
+ <g transform="translate(33.304375 177.666172)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-52"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_5">
+ <g id="line2d_21">
+ <path clip-path="url(#p105bbe0688)" d="M 62.57 121.071499
+L 693.54 121.071499
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_22">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="121.071499"/>
+ </g>
+ </g>
+ <g id="text_12">
+ <!-- 0.06 -->
+ <g transform="translate(33.304375 124.870718)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-54"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_13">
+ <!-- Amplitude -->
+ <defs>
+ <path d="M 34.1875 63.1875
+L 20.796875 26.90625
+L 47.609375 26.90625
+z
+M 28.609375 72.90625
+L 39.796875 72.90625
+L 67.578125 0
+L 57.328125 0
+L 50.6875 18.703125
+L 17.828125 18.703125
+L 11.1875 0
+L 0.78125 0
+z
+" id="DejaVuSans-65"/>
+ <path d="M 9.421875 54.6875
+L 18.40625 54.6875
+L 18.40625 0
+L 9.421875 0
+z
+M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 64.59375
+L 9.421875 64.59375
+z
+" id="DejaVuSans-105"/>
+ <path d="M 18.3125 70.21875
+L 18.3125 54.6875
+L 36.8125 54.6875
+L 36.8125 47.703125
+L 18.3125 47.703125
+L 18.3125 18.015625
+Q 18.3125 11.328125 20.140625 9.421875
+Q 21.96875 7.515625 27.59375 7.515625
+L 36.8125 7.515625
+L 36.8125 0
+L 27.59375 0
+Q 17.1875 0 13.234375 3.875
+Q 9.28125 7.765625 9.28125 18.015625
+L 9.28125 47.703125
+L 2.6875 47.703125
+L 2.6875 54.6875
+L 9.28125 54.6875
+L 9.28125 70.21875
+z
+" id="DejaVuSans-116"/>
+ <path d="M 8.5 21.578125
+L 8.5 54.6875
+L 17.484375 54.6875
+L 17.484375 21.921875
+Q 17.484375 14.15625 20.5 10.265625
+Q 23.53125 6.390625 29.59375 6.390625
+Q 36.859375 6.390625 41.078125 11.03125
+Q 45.3125 15.671875 45.3125 23.6875
+L 45.3125 54.6875
+L 54.296875 54.6875
+L 54.296875 0
+L 45.3125 0
+L 45.3125 8.40625
+Q 42.046875 3.421875 37.71875 1
+Q 33.40625 -1.421875 27.6875 -1.421875
+Q 18.265625 -1.421875 13.375 4.4375
+Q 8.5 10.296875 8.5 21.578125
+z
+M 31.109375 56
+z
+" id="DejaVuSans-117"/>
+ <path d="M 45.40625 46.390625
+L 45.40625 75.984375
+L 54.390625 75.984375
+L 54.390625 0
+L 45.40625 0
+L 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+z
+M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+" id="DejaVuSans-100"/>
+ </defs>
+ <g transform="translate(18.845 247.642656)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-65"/>
+ <use x="68.408203" xlink:href="#DejaVuSans-109"/>
+ <use x="165.820312" xlink:href="#DejaVuSans-112"/>
+ <use x="229.296875" xlink:href="#DejaVuSans-108"/>
+ <use x="257.080078" xlink:href="#DejaVuSans-105"/>
+ <use x="284.863281" xlink:href="#DejaVuSans-116"/>
+ <use x="324.072266" xlink:href="#DejaVuSans-117"/>
+ <use x="387.451172" xlink:href="#DejaVuSans-100"/>
+ <use x="450.927734" xlink:href="#DejaVuSans-101"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_23">
+ <path clip-path="url(#p105bbe0688)" d="M 62.57 279.457858
+L 66.270704 279.370686
+L 66.887488 279.247904
+L 67.504272 279.002289
+L 68.121056 278.55137
+L 68.73784 277.781204
+L 69.354624 276.544556
+L 69.971408 274.662635
+L 70.588192 271.931143
+L 71.204976 268.130988
+L 71.82176 263.043529
+L 72.438543 256.469695
+L 73.055327 248.2518
+L 74.288895 226.596513
+L 75.522463 198.474887
+L 78.606383 119.231836
+L 79.223167 106.855472
+L 79.839951 97.35125
+L 80.456735 91.393747
+L 81.073519 89.544762
+L 81.690303 92.20992
+L 82.307087 99.601937
+L 82.923871 111.713575
+L 83.540655 128.302803
+L 84.774223 172.781375
+L 88.474927 328.019256
+L 89.091711 345.613794
+L 89.708495 358.459626
+L 90.325279 366.120757
+L 90.942063 368.44
+L 91.558847 365.548894
+L 92.17563 357.859872
+L 92.792414 346.040969
+L 94.025982 313.702835
+L 95.876334 260.084191
+L 96.493118 245.264352
+L 97.109902 233.488381
+L 97.726686 225.365357
+L 98.34347 221.251025
+L 98.960254 221.232176
+L 99.577038 225.128866
+L 100.193822 232.514097
+L 100.810606 242.749387
+L 102.044174 268.461377
+L 103.277742 294.991447
+L 103.894526 306.340121
+L 104.51131 315.441156
+L 105.128094 321.786365
+L 105.744878 325.080773
+L 106.361662 325.256104
+L 106.978446 322.468057
+L 107.59523 317.077948
+L 108.212014 309.620357
+L 111.295934 266.120333
+L 111.912717 261.001347
+L 112.529501 258.223474
+L 113.146285 257.951682
+L 113.763069 260.158709
+L 114.379853 264.632022
+L 114.996637 270.994034
+L 116.230205 287.247415
+L 117.463773 303.9967
+L 118.080557 310.984266
+L 118.697341 316.339028
+L 119.314125 319.678692
+L 119.930909 320.771505
+L 120.547693 319.549292
+L 121.164477 316.10831
+L 121.781261 310.698154
+L 123.014829 295.595301
+L 124.865181 270.170144
+L 125.481965 263.11964
+L 126.098749 257.523432
+L 126.715533 253.669894
+L 127.332317 251.715855
+L 127.949101 251.680469
+L 128.565885 253.449342
+L 129.182669 256.788268
+L 129.799453 261.365228
+L 132.883372 288.167977
+L 133.500156 291.584367
+L 134.11694 293.743158
+L 134.733724 294.576358
+L 135.350508 294.121893
+L 135.967292 292.515129
+L 136.584076 289.973244
+L 137.817644 283.230269
+L 139.051212 276.378916
+L 139.667996 273.637573
+L 140.28478 271.641314
+L 140.901564 270.51676
+L 141.518348 270.308631
+L 142.135132 270.979577
+L 142.751916 272.416747
+L 143.985484 276.841082
+L 145.219052 281.753395
+L 145.835836 283.788963
+L 146.45262 285.274651
+L 147.069404 286.071732
+L 147.686188 286.106176
+L 148.302972 285.373799
+L 148.919756 283.93941
+L 149.53654 281.930168
+L 152.620459 270.301175
+L 153.237243 269.129415
+L 153.854027 268.702088
+L 154.470811 269.066828
+L 155.087595 270.205316
+L 155.704379 272.034973
+L 156.937947 277.16275
+L 158.788299 285.395782
+L 159.405083 287.41452
+L 160.021867 288.776127
+L 160.638651 289.375284
+L 161.255435 289.167875
+L 161.872219 288.174395
+L 162.489003 286.478156
+L 163.722571 281.579307
+L 165.572923 273.569797
+L 166.189707 271.589429
+L 166.806491 270.249666
+L 167.423275 269.659083
+L 168.040059 269.866577
+L 168.656843 270.857627
+L 169.273627 272.555589
+L 170.507195 277.496472
+L 172.357546 285.730639
+L 172.97433 287.830843
+L 173.591114 289.305624
+L 174.207898 290.037927
+L 174.824682 289.968243
+L 175.441466 289.099101
+L 176.05825 287.494729
+L 176.675034 285.275944
+L 177.908602 279.700959
+L 179.14217 274.031445
+L 179.758954 271.700076
+L 180.375738 269.948397
+L 180.992522 268.907276
+L 181.609306 268.653424
+L 182.22609 269.203856
+L 182.842874 270.514931
+L 183.459658 272.486031
+L 184.693226 277.772483
+L 186.543578 286.010338
+L 187.160362 288.021398
+L 187.777146 289.395241
+L 188.39393 290.036812
+L 189.010714 289.906624
+L 189.627498 289.023127
+L 190.244282 287.460679
+L 191.477849 282.834842
+L 193.328201 274.916778
+L 193.944985 272.79823
+L 194.561769 271.214824
+L 195.178553 270.274671
+L 195.795337 270.036052
+L 196.412121 270.503784
+L 197.028905 271.629689
+L 197.645689 273.317052
+L 198.879257 277.797929
+L 200.112825 282.57462
+L 200.729609 284.623004
+L 201.346393 286.237842
+L 201.963177 287.305617
+L 202.579961 287.75629
+L 203.196745 287.567838
+L 203.813529 286.767074
+L 204.430313 285.42674
+L 205.663881 281.60699
+L 207.514233 275.37742
+L 208.131017 273.801976
+L 208.747801 272.688422
+L 209.364585 272.112587
+L 209.981369 272.107814
+L 210.598152 272.663204
+L 211.214936 273.725267
+L 211.83172 275.202807
+L 214.91564 284.111489
+L 215.532424 285.226103
+L 216.149208 285.874482
+L 216.765992 286.016226
+L 217.382776 285.650663
+L 217.99956 284.816147
+L 218.616344 283.586375
+L 219.849912 280.372388
+L 221.08348 277.016811
+L 221.700264 275.610707
+L 222.317048 274.531202
+L 222.933832 273.855235
+L 223.550616 273.627025
+L 224.1674 273.855272
+L 224.784184 274.513136
+L 225.400968 275.540974
+L 226.634536 278.337422
+L 227.868104 281.356317
+L 228.484888 282.654227
+L 229.101672 283.675289
+L 229.718456 284.345017
+L 230.335239 284.617679
+L 230.952023 284.479348
+L 231.568807 283.948429
+L 232.185591 283.073663
+L 233.419159 280.611362
+L 235.269511 276.682766
+L 235.886295 275.723796
+L 236.503079 275.074949
+L 237.119863 274.782295
+L 237.736647 274.863269
+L 238.353431 275.305763
+L 238.970215 276.069535
+L 240.203783 278.282602
+L 242.054135 281.919736
+L 242.670919 282.834647
+L 243.287703 283.47245
+L 243.904487 283.786879
+L 244.521271 283.75761
+L 245.138055 283.391479
+L 245.754839 282.721566
+L 246.988407 280.714463
+L 248.838759 277.30457
+L 249.455543 276.417537
+L 250.072326 275.778503
+L 250.68911 275.434219
+L 251.305894 275.407859
+L 251.922678 275.697531
+L 252.539462 276.276759
+L 253.77303 278.091054
+L 255.623382 281.298268
+L 256.240166 282.164124
+L 256.85695 282.809606
+L 257.473734 283.187316
+L 258.090518 283.271241
+L 258.707302 283.058498
+L 259.324086 282.569252
+L 259.94087 281.844855
+L 261.174438 279.939735
+L 262.408006 277.935412
+L 263.02479 277.09051
+L 263.641574 276.439122
+L 264.258358 276.029208
+L 264.875142 275.889433
+L 265.491926 276.027195
+L 266.10871 276.428335
+L 266.725494 277.058514
+L 267.959062 278.78656
+L 269.809413 281.494484
+L 270.426197 282.147959
+L 271.042981 282.585786
+L 271.659765 282.777005
+L 272.276549 282.710096
+L 272.893333 282.393602
+L 273.510117 281.855201
+L 274.743685 280.303439
+L 276.594037 277.746649
+L 277.210821 277.09661
+L 277.827605 276.63689
+L 278.444389 276.40025
+L 279.061173 276.401821
+L 279.677957 276.638174
+L 280.294741 277.087852
+L 281.528309 278.463849
+L 283.378661 280.85542
+L 283.995445 281.494223
+L 284.612229 281.967247
+L 285.229013 282.240524
+L 285.845797 282.295952
+L 286.462581 282.132466
+L 287.079365 281.765868
+L 288.312933 280.560933
+L 290.780068 277.726807
+L 291.396852 277.250064
+L 292.013636 276.950498
+L 292.63042 276.848477
+L 293.247204 276.948849
+L 293.863988 277.240792
+L 295.097556 278.285305
+L 297.564692 280.912995
+L 298.181476 281.385122
+L 298.79826 281.701273
+L 299.415044 281.839486
+L 300.031828 281.791857
+L 300.648612 281.564943
+L 301.88218 280.666363
+L 304.9661 277.783789
+L 305.582884 277.458903
+L 306.199668 277.293511
+L 306.816452 277.297913
+L 307.433236 277.469136
+L 308.666804 278.237368
+L 311.750723 280.905664
+L 312.367507 281.233462
+L 312.984291 281.418834
+L 313.601075 281.449635
+L 314.217859 281.32586
+L 315.451427 280.673223
+L 319.152131 277.884931
+L 319.768915 277.685261
+L 320.385699 277.625907
+L 321.002483 277.709336
+L 322.236051 278.259817
+L 324.086403 279.645887
+L 325.319971 280.525822
+L 326.553539 281.057544
+L 327.170323 281.14008
+L 327.787107 281.091046
+L 329.020674 280.630926
+L 330.254242 279.830441
+L 332.104594 278.549033
+L 333.338162 278.016998
+L 333.954946 277.915512
+L 334.57173 277.934993
+L 335.805298 278.314696
+L 337.038866 279.028263
+L 338.889218 280.223533
+L 340.122786 280.751877
+L 341.356354 280.874988
+L 342.589922 280.56737
+L 343.82349 279.934067
+L 346.290626 278.523161
+L 347.524194 278.171238
+L 348.757761 278.21694
+L 349.991329 278.635158
+L 353.692033 280.486492
+L 354.925601 280.673121
+L 356.159169 280.48856
+L 357.392737 279.998982
+L 360.476657 278.549399
+L 361.710225 278.339549
+L 362.943793 278.472229
+L 364.177361 278.897674
+L 367.261281 280.254286
+L 368.494848 280.48209
+L 369.728416 280.395212
+L 370.961984 280.028883
+L 374.662688 278.610982
+L 375.896256 278.511191
+L 377.129824 278.699043
+L 378.980176 279.359369
+L 380.830528 280.055005
+L 382.064096 280.30445
+L 383.297664 280.29194
+L 384.531232 280.028901
+L 388.848719 278.693697
+L 390.082287 278.676983
+L 391.315855 278.895703
+L 395.633343 280.144492
+L 396.866911 280.185696
+L 398.100479 280.006652
+L 400.567615 279.275575
+L 402.417967 278.843668
+L 403.651535 278.782209
+L 404.885103 278.925932
+L 406.735455 279.405232
+L 408.585806 279.897834
+L 409.819374 280.067765
+L 411.052942 280.049105
+L 412.903294 279.706877
+L 415.987214 278.973316
+L 417.220782 278.882112
+L 418.45435 278.96692
+L 420.304702 279.344754
+L 422.771838 279.88488
+L 424.005406 279.986448
+L 425.238974 279.925906
+L 427.089326 279.593121
+L 429.556461 279.083803
+L 431.406813 278.975396
+L 433.257165 279.185606
+L 436.957869 279.856786
+L 438.808221 279.877484
+L 440.658573 279.624275
+L 443.742493 279.103323
+L 445.592845 279.063131
+L 447.443196 279.281474
+L 451.1439 279.81896
+L 452.994252 279.788646
+L 455.461388 279.442605
+L 457.928524 279.13312
+L 459.778876 279.143175
+L 462.246012 279.450794
+L 464.713148 279.748505
+L 466.5635 279.75578
+L 469.030635 279.483838
+L 471.497771 279.199052
+L 473.348123 279.177121
+L 475.815259 279.416077
+L 478.899179 279.719359
+L 480.749531 279.691333
+L 487.534154 279.235316
+L 491.234858 279.585448
+L 493.701994 279.686806
+L 496.16913 279.531447
+L 499.869834 279.249275
+L 502.33697 279.327571
+L 507.271241 279.65372
+L 509.738377 279.542353
+L 514.055865 279.277764
+L 516.523001 279.370289
+L 520.840489 279.622818
+L 523.924409 279.506166
+L 528.241896 279.306049
+L 531.325816 279.444864
+L 535.02652 279.598271
+L 538.11044 279.47827
+L 541.811144 279.328508
+L 545.511848 279.466005
+L 549.212551 279.574547
+L 553.530039 279.397829
+L 556.613959 279.357643
+L 565.248935 279.496141
+L 570.183206 279.368958
+L 580.05175 279.455243
+L 584.369238 279.3869
+L 593.620997 279.464353
+L 598.555269 279.40283
+L 607.190244 279.470699
+L 612.7413 279.416617
+L 620.759492 279.474823
+L 626.927331 279.428266
+L 634.945523 279.465861
+L 641.113363 279.437875
+L 648.51477 279.469034
+L 655.916178 279.454632
+L 663.317586 279.454279
+L 670.718993 279.46697
+L 678.120401 279.444584
+L 686.755376 279.479985
+L 693.54 279.43782
+L 693.54 279.43782
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_3">
+ <path d="M 62.57 368.44
+L 62.57 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_4">
+ <path d="M 693.54 368.44
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_5">
+ <path d="M 62.57 368.44
+L 693.54 368.44
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_6">
+ <path d="M 62.57 75.6
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_2">
+ <g id="patch_7">
+ <path d="M 62.57 703.24
+L 693.54 703.24
+L 693.54 410.4
+L 62.57 410.4
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_3">
+ <g id="xtick_7">
+ <g id="line2d_24">
+ <path clip-path="url(#p971d5f79aa)" d="M 62.57 703.24
+L 62.57 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_25">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_14">
+ <!-- 10Hz -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 19.671875 72.90625
+L 19.671875 43.015625
+L 55.515625 43.015625
+L 55.515625 72.90625
+L 65.375 72.90625
+L 65.375 0
+L 55.515625 0
+L 55.515625 34.71875
+L 19.671875 34.71875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-72"/>
+ <path d="M 5.515625 54.6875
+L 48.1875 54.6875
+L 48.1875 46.484375
+L 14.40625 7.171875
+L 48.1875 7.171875
+L 48.1875 0
+L 4.296875 0
+L 4.296875 8.203125
+L 38.09375 47.515625
+L 5.515625 47.515625
+z
+" id="DejaVuSans-122"/>
+ </defs>
+ <g transform="translate(49.823125 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_8">
+ <g id="line2d_26">
+ <path clip-path="url(#p971d5f79aa)" d="M 62.57 703.24
+L 62.57 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_27">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_9">
+ <g id="line2d_28">
+ <path clip-path="url(#p971d5f79aa)" d="M 118.76202 703.24
+L 118.76202 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_29">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="118.76202" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_10">
+ <g id="line2d_30">
+ <path clip-path="url(#p971d5f79aa)" d="M 151.632244 703.24
+L 151.632244 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_31">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="151.632244" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_11">
+ <g id="line2d_32">
+ <path clip-path="url(#p971d5f79aa)" d="M 174.954039 703.24
+L 174.954039 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_33">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="174.954039" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_12">
+ <g id="line2d_34">
+ <path clip-path="url(#p971d5f79aa)" d="M 193.043829 703.24
+L 193.043829 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_35">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="193.043829" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_13">
+ <g id="line2d_36">
+ <path clip-path="url(#p971d5f79aa)" d="M 207.824264 703.24
+L 207.824264 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_37">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="207.824264" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_14">
+ <g id="line2d_38">
+ <path clip-path="url(#p971d5f79aa)" d="M 220.320943 703.24
+L 220.320943 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_39">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="220.320943" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_15">
+ <g id="line2d_40">
+ <path clip-path="url(#p971d5f79aa)" d="M 231.146059 703.24
+L 231.146059 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_41">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="231.146059" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_16">
+ <g id="line2d_42">
+ <path clip-path="url(#p971d5f79aa)" d="M 240.694488 703.24
+L 240.694488 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_43">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="240.694488" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_17">
+ <g id="line2d_44">
+ <path clip-path="url(#p971d5f79aa)" d="M 249.235849 703.24
+L 249.235849 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_45">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_15">
+ <!-- 100Hz -->
+ <g transform="translate(233.307724 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_18">
+ <g id="line2d_46">
+ <path clip-path="url(#p971d5f79aa)" d="M 249.235849 703.24
+L 249.235849 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_47">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_19">
+ <g id="line2d_48">
+ <path clip-path="url(#p971d5f79aa)" d="M 305.427868 703.24
+L 305.427868 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_49">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="305.427868" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_20">
+ <g id="line2d_50">
+ <path clip-path="url(#p971d5f79aa)" d="M 338.298093 703.24
+L 338.298093 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_51">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="338.298093" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_21">
+ <g id="line2d_52">
+ <path clip-path="url(#p971d5f79aa)" d="M 361.619888 703.24
+L 361.619888 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_53">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="361.619888" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_22">
+ <g id="line2d_54">
+ <path clip-path="url(#p971d5f79aa)" d="M 379.709678 703.24
+L 379.709678 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_55">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="379.709678" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_23">
+ <g id="line2d_56">
+ <path clip-path="url(#p971d5f79aa)" d="M 394.490112 703.24
+L 394.490112 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_57">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="394.490112" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_24">
+ <g id="line2d_58">
+ <path clip-path="url(#p971d5f79aa)" d="M 406.986791 703.24
+L 406.986791 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_59">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="406.986791" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_25">
+ <g id="line2d_60">
+ <path clip-path="url(#p971d5f79aa)" d="M 417.811907 703.24
+L 417.811907 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_61">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="417.811907" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_26">
+ <g id="line2d_62">
+ <path clip-path="url(#p971d5f79aa)" d="M 427.360336 703.24
+L 427.360336 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_63">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="427.360336" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_27">
+ <g id="line2d_64">
+ <path clip-path="url(#p971d5f79aa)" d="M 435.901697 703.24
+L 435.901697 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_65">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_16">
+ <!-- 1kHz -->
+ <defs>
+ <path d="M 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 31.109375
+L 44.921875 54.6875
+L 56.390625 54.6875
+L 27.390625 29.109375
+L 57.625 0
+L 45.90625 0
+L 18.109375 26.703125
+L 18.109375 0
+L 9.078125 0
+z
+" id="DejaVuSans-107"/>
+ </defs>
+ <g transform="translate(423.44076 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_28">
+ <g id="line2d_66">
+ <path clip-path="url(#p971d5f79aa)" d="M 435.901697 703.24
+L 435.901697 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_67">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_29">
+ <g id="line2d_68">
+ <path clip-path="url(#p971d5f79aa)" d="M 492.093717 703.24
+L 492.093717 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_69">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="492.093717" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_30">
+ <g id="line2d_70">
+ <path clip-path="url(#p971d5f79aa)" d="M 524.963941 703.24
+L 524.963941 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_71">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.963941" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_31">
+ <g id="line2d_72">
+ <path clip-path="url(#p971d5f79aa)" d="M 548.285736 703.24
+L 548.285736 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_73">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="548.285736" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_32">
+ <g id="line2d_74">
+ <path clip-path="url(#p971d5f79aa)" d="M 566.375526 703.24
+L 566.375526 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_75">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="566.375526" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_33">
+ <g id="line2d_76">
+ <path clip-path="url(#p971d5f79aa)" d="M 581.155961 703.24
+L 581.155961 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_77">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="581.155961" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_34">
+ <g id="line2d_78">
+ <path clip-path="url(#p971d5f79aa)" d="M 593.65264 703.24
+L 593.65264 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_79">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.65264" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_35">
+ <g id="line2d_80">
+ <path clip-path="url(#p971d5f79aa)" d="M 604.477756 703.24
+L 604.477756 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_81">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.477756" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_36">
+ <g id="line2d_82">
+ <path clip-path="url(#p971d5f79aa)" d="M 614.026185 703.24
+L 614.026185 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_83">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="614.026185" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_37">
+ <g id="line2d_84">
+ <path clip-path="url(#p971d5f79aa)" d="M 622.567546 703.24
+L 622.567546 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_85">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_17">
+ <!-- 10kHz -->
+ <g transform="translate(606.925358 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_38">
+ <g id="line2d_86">
+ <path clip-path="url(#p971d5f79aa)" d="M 622.567546 703.24
+L 622.567546 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_87">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_39">
+ <g id="line2d_88">
+ <path clip-path="url(#p971d5f79aa)" d="M 678.759566 703.24
+L 678.759566 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_89">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.759566" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_40">
+ <g id="line2d_90">
+ <path clip-path="url(#p971d5f79aa)" d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_91">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#m118d1132db" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_18">
+ <!-- 24kHz -->
+ <g transform="translate(677.897812 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_19">
+ <!-- Frequency (Hz) -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 51.703125 72.90625
+L 51.703125 64.59375
+L 19.671875 64.59375
+L 19.671875 43.109375
+L 48.578125 43.109375
+L 48.578125 34.8125
+L 19.671875 34.8125
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-70"/>
+ <path d="M 41.109375 46.296875
+Q 39.59375 47.171875 37.8125 47.578125
+Q 36.03125 48 33.890625 48
+Q 26.265625 48 22.1875 43.046875
+Q 18.109375 38.09375 18.109375 28.8125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 20.953125 51.171875 25.484375 53.578125
+Q 30.03125 56 36.53125 56
+Q 37.453125 56 38.578125 55.875
+Q 39.703125 55.765625 41.0625 55.515625
+z
+" id="DejaVuSans-114"/>
+ <path d="M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+M 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+L 45.40625 54.6875
+L 54.390625 54.6875
+L 54.390625 -20.796875
+L 45.40625 -20.796875
+z
+" id="DejaVuSans-113"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-110"/>
+ <path d="M 48.78125 52.59375
+L 48.78125 44.1875
+Q 44.96875 46.296875 41.140625 47.34375
+Q 37.3125 48.390625 33.40625 48.390625
+Q 24.65625 48.390625 19.8125 42.84375
+Q 14.984375 37.3125 14.984375 27.296875
+Q 14.984375 17.28125 19.8125 11.734375
+Q 24.65625 6.203125 33.40625 6.203125
+Q 37.3125 6.203125 41.140625 7.25
+Q 44.96875 8.296875 48.78125 10.40625
+L 48.78125 2.09375
+Q 45.015625 0.34375 40.984375 -0.53125
+Q 36.96875 -1.421875 32.421875 -1.421875
+Q 20.0625 -1.421875 12.78125 6.34375
+Q 5.515625 14.109375 5.515625 27.296875
+Q 5.515625 40.671875 12.859375 48.328125
+Q 20.21875 56 33.015625 56
+Q 37.15625 56 41.109375 55.140625
+Q 45.0625 54.296875 48.78125 52.59375
+z
+" id="DejaVuSans-99"/>
+ <path d="M 32.171875 -5.078125
+Q 28.375 -14.84375 24.75 -17.8125
+Q 21.140625 -20.796875 15.09375 -20.796875
+L 7.90625 -20.796875
+L 7.90625 -13.28125
+L 13.1875 -13.28125
+Q 16.890625 -13.28125 18.9375 -11.515625
+Q 21 -9.765625 23.484375 -3.21875
+L 25.09375 0.875
+L 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 11.921875
+L 46.6875 54.6875
+L 56.203125 54.6875
+z
+" id="DejaVuSans-121"/>
+ <path id="DejaVuSans-32"/>
+ <path d="M 31 75.875
+Q 24.46875 64.65625 21.28125 53.65625
+Q 18.109375 42.671875 18.109375 31.390625
+Q 18.109375 20.125 21.3125 9.0625
+Q 24.515625 -2 31 -13.1875
+L 23.1875 -13.1875
+Q 15.875 -1.703125 12.234375 9.375
+Q 8.59375 20.453125 8.59375 31.390625
+Q 8.59375 42.28125 12.203125 53.3125
+Q 15.828125 64.359375 23.1875 75.875
+z
+" id="DejaVuSans-40"/>
+ <path d="M 8.015625 75.875
+L 15.828125 75.875
+Q 23.140625 64.359375 26.78125 53.3125
+Q 30.421875 42.28125 30.421875 31.390625
+Q 30.421875 20.453125 26.78125 9.375
+Q 23.140625 -1.703125 15.828125 -13.1875
+L 8.015625 -13.1875
+Q 14.5 -2 17.703125 9.0625
+Q 20.90625 20.125 20.90625 31.390625
+Q 20.90625 42.671875 17.703125 53.65625
+Q 14.5 64.65625 8.015625 75.875
+z
+" id="DejaVuSans-41"/>
+ </defs>
+ <g transform="translate(339.882344 731.516563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_4">
+ <g id="ytick_6">
+ <g id="line2d_92">
+ <path clip-path="url(#p971d5f79aa)" d="M 62.57 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_93">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_20">
+ <!-- −160 -->
+ <g transform="translate(28.102813 707.039219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-54"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_7">
+ <g id="line2d_94">
+ <path clip-path="url(#p971d5f79aa)" d="M 62.57 668.788235
+L 693.54 668.788235
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_95">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="668.788235"/>
+ </g>
+ </g>
+ <g id="text_21">
+ <!-- −140 -->
+ <g transform="translate(28.102813 672.587454)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-52"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_8">
+ <g id="line2d_96">
+ <path clip-path="url(#p971d5f79aa)" d="M 62.57 634.336471
+L 693.54 634.336471
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_97">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="634.336471"/>
+ </g>
+ </g>
+ <g id="text_22">
+ <!-- −120 -->
+ <g transform="translate(28.102813 638.135689)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-50"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_9">
+ <g id="line2d_98">
+ <path clip-path="url(#p971d5f79aa)" d="M 62.57 599.884706
+L 693.54 599.884706
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_99">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="599.884706"/>
+ </g>
+ </g>
+ <g id="text_23">
+ <!-- −100 -->
+ <g transform="translate(28.102813 603.683925)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_10">
+ <g id="line2d_100">
+ <path clip-path="url(#p971d5f79aa)" d="M 62.57 565.432941
+L 693.54 565.432941
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_101">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="565.432941"/>
+ </g>
+ </g>
+ <g id="text_24">
+ <!-- −80 -->
+ <g transform="translate(34.465313 569.23216)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-56"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_11">
+ <g id="line2d_102">
+ <path clip-path="url(#p971d5f79aa)" d="M 62.57 530.981176
+L 693.54 530.981176
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_103">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="530.981176"/>
+ </g>
+ </g>
+ <g id="text_25">
+ <!-- −60 -->
+ <g transform="translate(34.465313 534.780395)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-54"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_12">
+ <g id="line2d_104">
+ <path clip-path="url(#p971d5f79aa)" d="M 62.57 496.529412
+L 693.54 496.529412
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_105">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="496.529412"/>
+ </g>
+ </g>
+ <g id="text_26">
+ <!-- −40 -->
+ <g transform="translate(34.465313 500.328631)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-52"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_13">
+ <g id="line2d_106">
+ <path clip-path="url(#p971d5f79aa)" d="M 62.57 462.077647
+L 693.54 462.077647
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_107">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="462.077647"/>
+ </g>
+ </g>
+ <g id="text_27">
+ <!-- −20 -->
+ <g transform="translate(34.465313 465.876866)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_14">
+ <g id="line2d_108">
+ <path clip-path="url(#p971d5f79aa)" d="M 62.57 427.625882
+L 693.54 427.625882
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_109">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="427.625882"/>
+ </g>
+ </g>
+ <g id="text_28">
+ <!-- 0 -->
+ <g transform="translate(49.2075 431.425101)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_29">
+ <!-- Gain (dB) -->
+ <defs>
+ <path d="M 59.515625 10.40625
+L 59.515625 29.984375
+L 43.40625 29.984375
+L 43.40625 38.09375
+L 69.28125 38.09375
+L 69.28125 6.78125
+Q 63.578125 2.734375 56.6875 0.65625
+Q 49.8125 -1.421875 42 -1.421875
+Q 24.90625 -1.421875 15.25 8.5625
+Q 5.609375 18.5625 5.609375 36.375
+Q 5.609375 54.25 15.25 64.234375
+Q 24.90625 74.21875 42 74.21875
+Q 49.125 74.21875 55.546875 72.453125
+Q 61.96875 70.703125 67.390625 67.28125
+L 67.390625 56.78125
+Q 61.921875 61.421875 55.765625 63.765625
+Q 49.609375 66.109375 42.828125 66.109375
+Q 29.4375 66.109375 22.71875 58.640625
+Q 16.015625 51.171875 16.015625 36.375
+Q 16.015625 21.625 22.71875 14.15625
+Q 29.4375 6.6875 42.828125 6.6875
+Q 48.046875 6.6875 52.140625 7.59375
+Q 56.25 8.5 59.515625 10.40625
+z
+" id="DejaVuSans-71"/>
+ <path d="M 19.671875 34.8125
+L 19.671875 8.109375
+L 35.5 8.109375
+Q 43.453125 8.109375 47.28125 11.40625
+Q 51.125 14.703125 51.125 21.484375
+Q 51.125 28.328125 47.28125 31.5625
+Q 43.453125 34.8125 35.5 34.8125
+z
+M 19.671875 64.796875
+L 19.671875 42.828125
+L 34.28125 42.828125
+Q 41.5 42.828125 45.03125 45.53125
+Q 48.578125 48.25 48.578125 53.8125
+Q 48.578125 59.328125 45.03125 62.0625
+Q 41.5 64.796875 34.28125 64.796875
+z
+M 9.8125 72.90625
+L 35.015625 72.90625
+Q 46.296875 72.90625 52.390625 68.21875
+Q 58.5 63.53125 58.5 54.890625
+Q 58.5 48.1875 55.375 44.234375
+Q 52.25 40.28125 46.1875 39.3125
+Q 53.46875 37.75 57.5 32.78125
+Q 61.53125 27.828125 61.53125 20.40625
+Q 61.53125 10.640625 54.890625 5.3125
+Q 48.25 0 35.984375 0
+L 9.8125 0
+z
+" id="DejaVuSans-66"/>
+ </defs>
+ <g transform="translate(22.023125 580.411406)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-71"/>
+ <use x="77.490234" xlink:href="#DejaVuSans-97"/>
+ <use x="138.769531" xlink:href="#DejaVuSans-105"/>
+ <use x="166.552734" xlink:href="#DejaVuSans-110"/>
+ <use x="229.931641" xlink:href="#DejaVuSans-32"/>
+ <use x="261.71875" xlink:href="#DejaVuSans-40"/>
+ <use x="300.732422" xlink:href="#DejaVuSans-100"/>
+ <use x="364.208984" xlink:href="#DejaVuSans-66"/>
+ <use x="432.8125" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_110">
+ <path clip-path="url(#p971d5f79aa)" d="M -1 431.069849
+L 197.360253 430.967795
+L 244.003843 430.748482
+L 273.423847 430.417737
+L 297.622061 429.925511
+L 318.285653 429.275237
+L 364.802475 427.629806
+L 372.425209 427.692189
+L 379.392386 427.949731
+L 386.684305 428.431097
+L 395.747005 429.26108
+L 410.657252 430.658962
+L 416.896326 431.000358
+L 422.128331 431.064078
+L 427.043045 430.883054
+L 431.67676 430.464349
+L 436.059879 429.842266
+L 441.999906 428.750871
+L 446.707019 427.946443
+L 449.566135 427.666967
+L 451.939024 427.641261
+L 454.244429 427.826557
+L 456.853738 428.275828
+L 460.089695 429.083103
+L 465.870572 430.562419
+L 468.45463 430.962702
+L 470.650028 431.069956
+L 472.485607 430.958975
+L 474.280542 430.653891
+L 476.325608 430.062103
+L 478.601349 429.154672
+L 481.629706 427.939772
+L 482.969703 427.656792
+L 484.025977 427.649238
+L 485.068666 427.860878
+L 486.353447 428.398498
+L 488.118604 429.452543
+L 490.089958 430.585864
+L 491.298147 430.99823
+L 492.251898 431.060379
+L 492.95992 430.905624
+L 493.661811 430.568203
+L 494.357678 430.00904
+L 495.504344 428.719561
+L 496.41014 427.751979
+L 496.859271 427.630109
+L 497.082907 427.739752
+L 497.528337 428.38277
+L 497.971332 429.627634
+L 498.631319 432.47114
+L 500.365459 441.929151
+L 502.063279 450.551765
+L 503.520252 457.010809
+L 505.355831 464.226867
+L 507.150767 470.562886
+L 508.90682 476.256971
+L 510.814389 481.986454
+L 516.808703 497.940854
+L 517.506066 499.620963
+L 518.197481 501.336446
+L 518.7122 502.450439
+L 519.562868 504.589992
+L 520.069017 505.630381
+L 520.905639 507.716669
+L 521.403499 508.684814
+L 522.226531 510.7292
+L 522.553418 511.245328
+L 523.041291 512.604321
+L 523.526245 513.638389
+L 523.847944 514.094431
+L 524.328111 515.452747
+L 524.646649 516.244468
+L 525.279996 517.201787
+L 525.908433 519.002017
+L 526.532035 519.853282
+L 527.150878 521.681717
+L 527.765032 522.422143
+L 528.374568 524.290077
+L 528.828732 524.594554
+L 529.1301 525.420551
+L 529.580062 526.832924
+L 530.02754 527.025528
+L 530.324493 527.853167
+L 530.767892 529.315524
+L 531.208879 529.388347
+L 531.501543 530.219544
+L 531.938568 531.742677
+L 532.37325 531.686774
+L 532.517628 531.968792
+L 533.09258 534.118795
+L 533.235683 534.095481
+L 533.521134 533.924142
+L 533.663483 534.192665
+L 534.230394 536.447968
+L 534.371505 536.382268
+L 534.652991 536.10341
+L 534.793369 536.357623
+L 535.35246 538.734021
+L 535.491633 538.622599
+L 535.769263 538.227206
+L 535.907722 538.466143
+L 536.459207 540.980565
+L 536.596494 540.819657
+L 536.870372 540.297872
+L 537.006965 540.520417
+L 537.551048 543.191037
+L 537.6865 542.976404
+L 537.956726 542.317492
+L 538.091503 542.522384
+L 538.628378 545.368742
+L 538.895489 544.584693
+L 539.028715 544.287921
+L 539.161722 544.473758
+L 539.69158 547.516887
+L 540.086713 546.210811
+L 540.217997 546.376056
+L 540.479929 548.243028
+L 540.741018 549.638618
+L 541.131081 548.087628
+L 541.260686 548.230618
+L 541.519276 550.219875
+L 541.777044 551.737051
+L 542.162166 549.919671
+L 542.290134 550.038626
+L 542.545466 552.159201
+L 542.799997 553.815309
+L 543.180301 551.708087
+L 543.306673 551.801128
+L 543.558829 554.062063
+L 543.810203 555.876554
+L 544.185808 553.453887
+L 544.310624 553.519044
+L 544.55968 555.929306
+L 544.807975 557.92403
+L 545.178996 555.157953
+L 545.302293 555.193193
+L 545.548326 557.761556
+L 545.793615 559.961097
+L 546.281978 556.824297
+L 546.52506 559.559222
+L 546.767416 561.991284
+L 547.249965 558.412998
+L 547.490166 561.322481
+L 547.729658 564.018345
+L 548.20653 559.959872
+L 548.443918 563.051278
+L 548.680613 566.046318
+L 549.151939 561.465438
+L 549.269344 562.575334
+L 549.620542 568.079606
+L 550.086451 562.93017
+L 550.202511 564.083128
+L 550.549697 570.123077
+L 551.010312 564.354507
+L 551.125058 565.5497
+L 551.468324 572.182182
+L 551.923763 565.738863
+L 552.037224 566.975034
+L 552.376658 574.263112
+L 552.827037 567.083637
+L 552.939241 568.359084
+L 553.274927 576.372999
+L 553.720356 568.389219
+L 553.831332 569.701796
+L 554.163352 578.520188
+L 554.603939 569.656003
+L 554.713713 571.00312
+L 555.042146 580.714597
+L 555.477996 570.884387
+L 555.586593 572.263032
+L 555.911515 582.96822
+L 556.23514 572.544099
+L 556.342729 572.074788
+L 556.450175 573.481542
+L 556.771661 585.295838
+L 557.091877 573.746227
+L 557.198335 573.227638
+L 557.304654 574.658719
+L 557.622776 587.716052
+L 557.939654 574.911046
+L 558.045006 574.343399
+L 558.15022 575.794697
+L 558.465048 590.252834
+L 558.778657 576.038667
+L 558.882925 575.422559
+L 558.987058 576.889694
+L 559.194925 587.706533
+L 559.298659 592.937937
+L 559.609066 577.129223
+L 559.712271 576.465639
+L 559.815346 577.944017
+L 560.021102 589.420594
+L 560.123785 595.814815
+L 560.431055 578.182883
+L 560.53322 577.473196
+L 560.635256 578.958072
+L 560.838945 591.064614
+L 560.940597 598.945341
+L 561.244792 579.19986
+L 561.345938 578.44582
+L 561.446957 579.932369
+L 561.648619 592.617782
+L 561.749262 602.422084
+L 562.050443 580.180416
+L 562.150589 579.384141
+L 562.250611 580.867526
+L 562.35051 585.102363
+L 562.549939 606.392721
+L 562.748879 584.577606
+L 562.947332 580.288824
+L 563.046377 581.764263
+L 563.1453 586.04409
+L 563.342786 611.11412
+L 563.539792 585.577312
+L 563.736321 581.160568
+L 563.834407 582.623404
+L 563.932374 586.927845
+L 564.030223 596.504579
+L 564.127954 617.090795
+L 564.323064 586.527038
+L 564.517705 582.00011
+L 564.61485 583.445869
+L 564.711879 587.754482
+L 564.808793 597.478039
+L 564.90559 625.494242
+L 565.098839 587.426292
+L 565.291629 582.808216
+L 565.387852 584.232664
+L 565.483961 588.525416
+L 565.579956 598.274329
+L 565.675838 638.62949
+L 565.867262 588.274958
+L 566.058235 583.585683
+L 566.153553 584.984873
+L 566.248759 589.242581
+L 566.343853 598.897856
+L 566.438836 635.72124
+L 566.628469 589.073326
+L 566.817659 584.333333
+L 566.912089 585.703646
+L 567.006408 589.908358
+L 567.100619 599.362195
+L 567.19472 625.601878
+L 567.382595 589.822104
+L 567.570035 585.052012
+L 567.663593 586.390186
+L 567.757043 590.525491
+L 567.943621 619.71402
+L 568.12977 590.522405
+L 568.315493 585.742586
+L 568.408195 587.045735
+L 568.593281 599.897908
+L 568.685667 615.82547
+L 568.870122 591.175723
+L 569.054158 586.405935
+L 569.14602 587.671567
+L 569.329431 600.01721
+L 569.420982 613.020202
+L 569.695014 588.08825
+L 569.786153 587.042951
+L 569.87719 588.268968
+L 570.058957 600.067896
+L 570.149687 610.884639
+L 570.421272 588.704821
+L 570.511598 587.654534
+L 570.601824 588.83923
+L 570.781975 600.06926
+L 570.871901 609.200689
+L 571.141081 589.293364
+L 571.230609 588.241589
+L 571.320039 589.383637
+L 571.498603 600.037097
+L 571.587737 607.840043
+L 571.854555 589.854944
+L 571.943299 588.805018
+L 572.031946 589.903459
+L 572.208951 599.983812
+L 572.297308 606.721071
+L 572.561804 590.390646
+L 572.649778 589.345724
+L 572.737657 590.39994
+L 572.913128 599.918832
+L 573.000722 605.788731
+L 573.350153 589.864599
+L 573.437276 590.874294
+L 573.611242 599.849115
+L 573.698085 605.00421
+L 574.04453 590.362528
+L 574.13091 591.327699
+L 574.3895 604.339151
+L 574.475514 600.355577
+L 574.733009 590.84038
+L 574.818659 591.76129
+L 575.075069 603.772235
+L 575.160358 600.324466
+L 575.415691 591.299012
+L 575.500623 592.176159
+L 575.754888 603.28705
+L 575.839466 600.288476
+L 576.092671 591.739261
+L 576.176898 592.57335
+L 576.429053 602.870707
+L 576.512931 600.251175
+L 576.764045 592.161944
+L 576.847577 592.95386
+L 577.097659 602.512911
+L 577.180848 600.215172
+L 577.429905 592.567858
+L 577.512754 593.318637
+L 577.760795 602.205323
+L 577.843307 600.182327
+L 578.09034 592.957776
+L 578.172517 593.668578
+L 578.418551 601.941098
+L 578.500396 600.153919
+L 578.745438 593.332448
+L 578.826954 594.004535
+L 579.071012 601.71456
+L 579.152202 600.13079
+L 579.395285 593.692596
+L 579.47615 594.327311
+L 579.718265 601.520954
+L 579.798809 600.113451
+L 580.039964 594.038919
+L 580.120189 594.637662
+L 580.360391 601.356262
+L 580.4403 600.102166
+L 580.679556 594.37209
+L 580.759152 594.936302
+L 580.99747 601.217065
+L 581.076754 600.097017
+L 581.314142 594.692754
+L 581.393117 595.2239
+L 581.629582 601.100432
+L 581.708251 600.097955
+L 581.943799 595.00153
+L 582.022164 595.501086
+L 582.256803 601.003835
+L 582.334866 600.10484
+L 582.568604 595.299012
+L 582.646367 595.768451
+L 582.879209 600.925083
+L 582.956675 600.117463
+L 583.188629 595.585765
+L 583.2658 596.026549
+L 583.496873 600.862266
+L 583.573751 600.135577
+L 583.803949 595.862332
+L 583.880536 596.275898
+L 584.109866 600.813712
+L 584.186165 600.158905
+L 584.414633 596.129227
+L 584.490646 596.516987
+L 584.718258 600.77795
+L 584.793987 600.187156
+L 585.020751 596.386943
+L 585.096198 596.75027
+L 585.322119 600.753682
+L 585.397287 600.220034
+L 585.622371 596.635947
+L 585.697261 596.976175
+L 585.921515 600.739759
+L 585.996129 600.257242
+L 586.21956 596.876682
+L 586.2939 597.195102
+L 586.516512 600.735161
+L 586.590581 600.29849
+L 586.812381 597.10957
+L 586.88618 597.407425
+L 587.107174 600.738977
+L 587.180705 600.343494
+L 587.400899 597.335011
+L 587.474164 597.613497
+L 587.693563 600.750394
+L 587.766564 600.391984
+L 587.985175 597.553385
+L 588.057914 597.813644
+L 588.275741 600.768683
+L 588.34822 600.443699
+L 588.56527 597.765049
+L 588.637491 598.008176
+L 588.853768 600.793191
+L 588.925732 600.498391
+L 589.141243 597.970345
+L 589.212953 598.197382
+L 589.427703 600.823329
+L 589.49916 600.555827
+L 589.713154 598.169592
+L 589.78436 598.381532
+L 589.997603 600.858565
+L 590.068559 600.615785
+L 590.281058 598.363096
+L 590.351767 598.56088
+L 590.563525 600.898421
+L 590.633988 600.678058
+L 590.845011 598.551144
+L 590.91523 598.735665
+L 591.125523 600.942463
+L 591.1955 600.742451
+L 591.405068 598.734007
+L 591.474804 598.90611
+L 591.683652 600.990296
+L 591.753149 600.808781
+L 591.961282 598.911942
+L 592.030542 599.072425
+L 592.237965 601.041564
+L 592.306988 600.876876
+L 592.513707 599.08519
+L 592.582496 599.234808
+L 592.788514 601.095942
+L 592.85707 600.946578
+L 593.062392 599.25398
+L 593.130717 599.393444
+L 593.335348 601.153135
+L 593.403444 601.017736
+L 593.607389 599.418529
+L 593.675256 599.548506
+L 593.878519 601.212872
+L 593.94616 601.090212
+L 594.148746 599.579039
+L 594.216162 599.70016
+L 594.418075 601.274909
+L 594.485268 601.163876
+L 594.686512 599.735703
+L 594.753483 599.848559
+L 594.954063 601.33902
+L 595.020813 601.238608
+L 595.220734 599.888701
+L 595.287265 599.993848
+L 595.486531 601.405
+L 595.552844 601.314295
+L 595.751459 600.038206
+L 595.817556 600.136165
+L 596.015525 601.472662
+L 596.081407 601.390833
+L 596.278732 600.184378
+L 596.344401 600.275637
+L 596.541088 601.541833
+L 596.606545 601.468124
+L 596.802598 600.32737
+L 596.867844 600.412387
+L 597.063267 601.612356
+L 597.128304 601.546078
+L 597.3231 600.467325
+L 597.387929 600.546528
+L 597.582104 601.684085
+L 597.646725 601.624612
+L 597.840282 600.604379
+L 597.904698 600.67817
+L 598.097641 601.756888
+L 598.161853 601.703647
+L 598.354185 600.73866
+L 598.418195 600.807414
+L 598.60992 601.830643
+L 598.673728 601.783111
+L 598.864851 600.870289
+L 598.928459 600.934356
+L 599.118983 601.905237
+L 599.182392 601.862937
+L 599.37232 600.99938
+L 599.435531 601.059088
+L 599.624869 601.980568
+L 599.687883 601.943062
+L 599.876633 601.12604
+L 599.939452 601.181695
+L 600.127617 602.056541
+L 600.190242 602.023429
+L 600.377827 601.250372
+L 600.440259 601.302259
+L 600.627267 602.133068
+L 600.689508 602.103984
+L 600.875942 601.372471
+L 600.937992 601.420857
+L 601.123857 602.210069
+L 601.185717 602.184677
+L 601.371015 601.492429
+L 601.432687 601.537562
+L 601.617422 602.28747
+L 601.678907 602.265462
+L 601.863083 601.61033
+L 601.924382 601.652443
+L 602.108002 602.365203
+L 602.169116 602.346296
+L 602.352182 601.726257
+L 602.413113 601.765565
+L 602.656378 602.42714
+L 602.838348 601.840286
+L 602.898915 601.876991
+L 603.140728 602.507957
+L 603.321616 601.952489
+L 603.381823 601.986779
+L 603.622202 602.588712
+L 603.80202 602.062936
+L 603.861871 602.094986
+L 604.100834 602.669375
+L 604.279594 602.171692
+L 604.339094 602.201664
+L 604.576656 602.749916
+L 604.754371 602.278818
+L 604.813523 602.306864
+L 605.049701 602.830308
+L 605.226384 602.384372
+L 605.285193 602.410633
+L 605.520002 602.910528
+L 605.754134 602.513017
+L 605.987591 602.990551
+L 606.220378 602.61406
+L 606.452498 603.070356
+L 606.683956 602.713802
+L 606.914754 603.149924
+L 607.144898 602.812283
+L 607.374389 603.229238
+L 607.603233 602.909541
+L 607.831433 603.30828
+L 608.058993 603.00561
+L 608.285915 603.387035
+L 608.512204 603.100525
+L 608.737863 603.46549
+L 608.962895 603.194318
+L 609.187305 603.543631
+L 609.411095 603.28702
+L 609.63427 603.621448
+L 609.856831 603.378661
+L 610.078783 603.698928
+L 610.300129 603.469269
+L 610.520872 603.776063
+L 610.741016 603.55887
+L 610.960564 603.852843
+L 611.015358 603.787563
+L 611.179519 603.647491
+L 611.397884 603.929262
+L 611.452383 603.867923
+L 611.615662 603.735157
+L 611.832857 604.00531
+L 611.887065 603.947691
+L 612.049472 603.82189
+L 612.265509 604.080981
+L 612.319428 604.026874
+L 612.480972 603.907713
+L 612.695864 604.156271
+L 612.749498 604.105478
+L 612.910188 603.992648
+L 613.123947 604.231173
+L 613.177298 604.183508
+L 613.337143 604.076716
+L 613.549781 604.305682
+L 613.602853 604.260972
+L 613.761862 604.159937
+L 614.026185 604.337874
+L 614.184367 604.242329
+L 614.447318 604.414222
+L 614.604681 604.323912
+L 614.866275 604.490019
+L 615.022827 604.404702
+L 615.283078 604.565272
+L 615.438828 604.484716
+L 615.697748 604.639986
+L 615.852705 604.563971
+L 616.110309 604.714167
+L 616.264479 604.642483
+L 616.52078 604.787819
+L 616.674173 604.720265
+L 616.929184 604.860948
+L 617.081806 604.797334
+L 617.33554 604.933559
+L 617.487401 604.873702
+L 617.73987 605.005656
+L 617.941281 604.989222
+L 618.142193 605.077245
+L 618.342609 605.062586
+L 618.54253 605.14833
+L 618.741959 605.135372
+L 618.940899 605.218917
+L 619.139352 605.207586
+L 619.33732 605.289009
+L 619.534806 605.279236
+L 619.731812 605.358611
+L 619.92834 605.350329
+L 620.124394 605.427727
+L 620.319974 605.420873
+L 620.515083 605.496363
+L 620.709724 605.490874
+L 620.903899 605.564523
+L 621.09761 605.560339
+L 621.290859 605.63221
+L 621.483648 605.629275
+L 621.723992 605.678888
+L 621.915756 605.734404
+L 622.107067 605.746935
+L 622.297927 605.800921
+L 622.488339 605.814458
+L 622.678305 605.866991
+L 622.867827 605.881465
+L 623.056907 605.932616
+L 623.245547 605.947962
+L 623.433749 605.9978
+L 623.668388 606.00431
+L 624.923839 606.254185
+L 625.200207 606.27155
+L 625.795793 606.409097
+L 626.069209 606.463218
+L 627.646018 606.708486
+L 628.090959 606.771299
+L 628.753824 606.886214
+L 630.967865 607.270084
+L 631.565211 607.355855
+L 632.788742 607.571633
+L 633.53899 607.681704
+L 636.911383 608.227474
+L 638.292472 608.445631
+L 639.72734 608.665235
+L 641.664404 608.961515
+L 644.1408 609.327431
+L 650.036697 610.169511
+L 658.878754 611.318873
+L 669.128958 612.445155
+L 677.868 613.184028
+L 685.581502 613.617473
+L 692.403934 613.782343
+L 693.520206 613.786061
+L 693.520206 613.786061
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_8">
+ <path d="M 62.57 703.24
+L 62.57 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_9">
+ <path d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_10">
+ <path d="M 62.57 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_11">
+ <path d="M 62.57 410.4
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_3">
+ <g id="patch_12">
+ <path d="M 62.57 1038.04
+L 693.54 1038.04
+L 693.54 745.2
+L 62.57 745.2
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_5">
+ <g id="xtick_41">
+ <g id="line2d_111">
+ <path clip-path="url(#pc2a9b52a40)" d="M 62.57 1038.04
+L 62.57 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_112">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_30">
+ <!-- 10Hz -->
+ <g transform="translate(49.823125 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_42">
+ <g id="line2d_113">
+ <path clip-path="url(#pc2a9b52a40)" d="M 62.57 1038.04
+L 62.57 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_114">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_43">
+ <g id="line2d_115">
+ <path clip-path="url(#pc2a9b52a40)" d="M 118.76202 1038.04
+L 118.76202 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_116">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="118.76202" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_44">
+ <g id="line2d_117">
+ <path clip-path="url(#pc2a9b52a40)" d="M 151.632244 1038.04
+L 151.632244 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_118">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="151.632244" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_45">
+ <g id="line2d_119">
+ <path clip-path="url(#pc2a9b52a40)" d="M 174.954039 1038.04
+L 174.954039 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_120">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="174.954039" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_46">
+ <g id="line2d_121">
+ <path clip-path="url(#pc2a9b52a40)" d="M 193.043829 1038.04
+L 193.043829 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_122">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="193.043829" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_47">
+ <g id="line2d_123">
+ <path clip-path="url(#pc2a9b52a40)" d="M 207.824264 1038.04
+L 207.824264 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_124">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="207.824264" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_48">
+ <g id="line2d_125">
+ <path clip-path="url(#pc2a9b52a40)" d="M 220.320943 1038.04
+L 220.320943 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_126">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="220.320943" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_49">
+ <g id="line2d_127">
+ <path clip-path="url(#pc2a9b52a40)" d="M 231.146059 1038.04
+L 231.146059 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_128">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="231.146059" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_50">
+ <g id="line2d_129">
+ <path clip-path="url(#pc2a9b52a40)" d="M 240.694488 1038.04
+L 240.694488 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_130">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="240.694488" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_51">
+ <g id="line2d_131">
+ <path clip-path="url(#pc2a9b52a40)" d="M 249.235849 1038.04
+L 249.235849 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_132">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_31">
+ <!-- 100Hz -->
+ <g transform="translate(233.307724 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_52">
+ <g id="line2d_133">
+ <path clip-path="url(#pc2a9b52a40)" d="M 249.235849 1038.04
+L 249.235849 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_134">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_53">
+ <g id="line2d_135">
+ <path clip-path="url(#pc2a9b52a40)" d="M 305.427868 1038.04
+L 305.427868 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_136">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="305.427868" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_54">
+ <g id="line2d_137">
+ <path clip-path="url(#pc2a9b52a40)" d="M 338.298093 1038.04
+L 338.298093 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_138">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="338.298093" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_55">
+ <g id="line2d_139">
+ <path clip-path="url(#pc2a9b52a40)" d="M 361.619888 1038.04
+L 361.619888 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_140">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="361.619888" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_56">
+ <g id="line2d_141">
+ <path clip-path="url(#pc2a9b52a40)" d="M 379.709678 1038.04
+L 379.709678 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_142">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="379.709678" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_57">
+ <g id="line2d_143">
+ <path clip-path="url(#pc2a9b52a40)" d="M 394.490112 1038.04
+L 394.490112 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_144">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="394.490112" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_58">
+ <g id="line2d_145">
+ <path clip-path="url(#pc2a9b52a40)" d="M 406.986791 1038.04
+L 406.986791 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_146">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="406.986791" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_59">
+ <g id="line2d_147">
+ <path clip-path="url(#pc2a9b52a40)" d="M 417.811907 1038.04
+L 417.811907 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_148">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="417.811907" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_60">
+ <g id="line2d_149">
+ <path clip-path="url(#pc2a9b52a40)" d="M 427.360336 1038.04
+L 427.360336 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_150">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="427.360336" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_61">
+ <g id="line2d_151">
+ <path clip-path="url(#pc2a9b52a40)" d="M 435.901697 1038.04
+L 435.901697 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_152">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_32">
+ <!-- 1kHz -->
+ <g transform="translate(423.44076 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_62">
+ <g id="line2d_153">
+ <path clip-path="url(#pc2a9b52a40)" d="M 435.901697 1038.04
+L 435.901697 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_154">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_63">
+ <g id="line2d_155">
+ <path clip-path="url(#pc2a9b52a40)" d="M 492.093717 1038.04
+L 492.093717 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_156">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="492.093717" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_64">
+ <g id="line2d_157">
+ <path clip-path="url(#pc2a9b52a40)" d="M 524.963941 1038.04
+L 524.963941 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_158">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.963941" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_65">
+ <g id="line2d_159">
+ <path clip-path="url(#pc2a9b52a40)" d="M 548.285736 1038.04
+L 548.285736 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_160">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="548.285736" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_66">
+ <g id="line2d_161">
+ <path clip-path="url(#pc2a9b52a40)" d="M 566.375526 1038.04
+L 566.375526 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_162">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="566.375526" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_67">
+ <g id="line2d_163">
+ <path clip-path="url(#pc2a9b52a40)" d="M 581.155961 1038.04
+L 581.155961 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_164">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="581.155961" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_68">
+ <g id="line2d_165">
+ <path clip-path="url(#pc2a9b52a40)" d="M 593.65264 1038.04
+L 593.65264 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_166">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.65264" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_69">
+ <g id="line2d_167">
+ <path clip-path="url(#pc2a9b52a40)" d="M 604.477756 1038.04
+L 604.477756 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_168">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.477756" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_70">
+ <g id="line2d_169">
+ <path clip-path="url(#pc2a9b52a40)" d="M 614.026185 1038.04
+L 614.026185 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_170">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="614.026185" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_71">
+ <g id="line2d_171">
+ <path clip-path="url(#pc2a9b52a40)" d="M 622.567546 1038.04
+L 622.567546 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_172">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_33">
+ <!-- 10kHz -->
+ <g transform="translate(606.925358 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_72">
+ <g id="line2d_173">
+ <path clip-path="url(#pc2a9b52a40)" d="M 622.567546 1038.04
+L 622.567546 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_174">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_73">
+ <g id="line2d_175">
+ <path clip-path="url(#pc2a9b52a40)" d="M 678.759566 1038.04
+L 678.759566 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_176">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.759566" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_74">
+ <g id="line2d_177">
+ <path clip-path="url(#pc2a9b52a40)" d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_178">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#m118d1132db" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_34">
+ <!-- 24kHz -->
+ <g transform="translate(677.897812 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_35">
+ <!-- Frequency (Hz) -->
+ <g transform="translate(339.882344 1066.316563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_6">
+ <g id="ytick_15">
+ <g id="line2d_179">
+ <path clip-path="url(#pc2a9b52a40)" d="M 62.57 1007.214737
+L 693.54 1007.214737
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_180">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="1007.214737"/>
+ </g>
+ </g>
+ <g id="text_36">
+ <!-- −150 -->
+ <defs>
+ <path d="M 10.796875 72.90625
+L 49.515625 72.90625
+L 49.515625 64.59375
+L 19.828125 64.59375
+L 19.828125 46.734375
+Q 21.96875 47.46875 24.109375 47.828125
+Q 26.265625 48.1875 28.421875 48.1875
+Q 40.625 48.1875 47.75 41.5
+Q 54.890625 34.8125 54.890625 23.390625
+Q 54.890625 11.625 47.5625 5.09375
+Q 40.234375 -1.421875 26.90625 -1.421875
+Q 22.3125 -1.421875 17.546875 -0.640625
+Q 12.796875 0.140625 7.71875 1.703125
+L 7.71875 11.625
+Q 12.109375 9.234375 16.796875 8.0625
+Q 21.484375 6.890625 26.703125 6.890625
+Q 35.15625 6.890625 40.078125 11.328125
+Q 45.015625 15.765625 45.015625 23.390625
+Q 45.015625 31 40.078125 35.4375
+Q 35.15625 39.890625 26.703125 39.890625
+Q 22.75 39.890625 18.8125 39.015625
+Q 14.890625 38.140625 10.796875 36.28125
+z
+" id="DejaVuSans-53"/>
+ </defs>
+ <g transform="translate(28.102813 1011.013956)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_16">
+ <g id="line2d_181">
+ <path clip-path="url(#pc2a9b52a40)" d="M 62.57 968.683158
+L 693.54 968.683158
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_182">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="968.683158"/>
+ </g>
+ </g>
+ <g id="text_37">
+ <!-- −100 -->
+ <g transform="translate(28.102813 972.482377)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_17">
+ <g id="line2d_183">
+ <path clip-path="url(#pc2a9b52a40)" d="M 62.57 930.151579
+L 693.54 930.151579
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_184">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="930.151579"/>
+ </g>
+ </g>
+ <g id="text_38">
+ <!-- −50 -->
+ <g transform="translate(34.465313 933.950798)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-53"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_18">
+ <g id="line2d_185">
+ <path clip-path="url(#pc2a9b52a40)" d="M 62.57 891.62
+L 693.54 891.62
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_186">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="891.62"/>
+ </g>
+ </g>
+ <g id="text_39">
+ <!-- 0 -->
+ <g transform="translate(49.2075 895.419219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_19">
+ <g id="line2d_187">
+ <path clip-path="url(#pc2a9b52a40)" d="M 62.57 853.088421
+L 693.54 853.088421
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_188">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="853.088421"/>
+ </g>
+ </g>
+ <g id="text_40">
+ <!-- 50 -->
+ <g transform="translate(42.845 856.88764)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-53"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_20">
+ <g id="line2d_189">
+ <path clip-path="url(#pc2a9b52a40)" d="M 62.57 814.556842
+L 693.54 814.556842
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_190">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="814.556842"/>
+ </g>
+ </g>
+ <g id="text_41">
+ <!-- 100 -->
+ <g transform="translate(36.4825 818.356061)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_21">
+ <g id="line2d_191">
+ <path clip-path="url(#pc2a9b52a40)" d="M 62.57 776.025263
+L 693.54 776.025263
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_192">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#mf11cb8975f" y="776.025263"/>
+ </g>
+ </g>
+ <g id="text_42">
+ <!-- 150 -->
+ <g transform="translate(36.4825 779.824482)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-53"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_43">
+ <!-- Phase (${\circ}$) -->
+ <defs>
+ <path d="M 19.671875 64.796875
+L 19.671875 37.40625
+L 32.078125 37.40625
+Q 38.96875 37.40625 42.71875 40.96875
+Q 46.484375 44.53125 46.484375 51.125
+Q 46.484375 57.671875 42.71875 61.234375
+Q 38.96875 64.796875 32.078125 64.796875
+z
+M 9.8125 72.90625
+L 32.078125 72.90625
+Q 44.34375 72.90625 50.609375 67.359375
+Q 56.890625 61.8125 56.890625 51.125
+Q 56.890625 40.328125 50.609375 34.8125
+Q 44.34375 29.296875 32.078125 29.296875
+L 19.671875 29.296875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-80"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-104"/>
+ <path d="M 31.296875 40.671875
+Q 27.390625 40.671875 24.703125 37.953125
+Q 22.015625 35.25 22.015625 31.34375
+Q 22.015625 27.484375 24.703125 24.828125
+Q 27.390625 22.171875 31.296875 22.171875
+Q 35.203125 22.171875 37.890625 24.828125
+Q 40.578125 27.484375 40.578125 31.34375
+Q 40.578125 35.203125 37.859375 37.9375
+Q 35.15625 40.671875 31.296875 40.671875
+z
+M 31.296875 46.96875
+Q 34.421875 46.96875 37.296875 45.765625
+Q 40.1875 44.578125 42.28125 42.328125
+Q 44.53125 40.140625 45.65625 37.34375
+Q 46.78125 34.5625 46.78125 31.34375
+Q 46.78125 24.90625 42.265625 20.4375
+Q 37.75 15.96875 31.203125 15.96875
+Q 24.609375 15.96875 20.21875 20.359375
+Q 15.828125 24.75 15.828125 31.34375
+Q 15.828125 37.890625 20.3125 42.421875
+Q 24.8125 46.96875 31.296875 46.96875
+z
+" id="DejaVuSans-8728"/>
+ </defs>
+ <g transform="translate(22.023125 915.17)rotate(-90)scale(0.1 -0.1)">
+ <use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-80"/>
+ <use transform="translate(60.302734 0.015625)" xlink:href="#DejaVuSans-104"/>
+ <use transform="translate(123.681641 0.015625)" xlink:href="#DejaVuSans-97"/>
+ <use transform="translate(184.960938 0.015625)" xlink:href="#DejaVuSans-115"/>
+ <use transform="translate(237.060547 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(298.583984 0.015625)" xlink:href="#DejaVuSans-32"/>
+ <use transform="translate(330.371094 0.015625)" xlink:href="#DejaVuSans-40"/>
+ <use transform="translate(369.384766 0.015625)" xlink:href="#DejaVuSans-8728"/>
+ <use transform="translate(431.982422 0.015625)" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_193">
+ <path clip-path="url(#pc2a9b52a40)" d="M -1 892.294541
+L 19.235765 892.294614
+L 75.427784 892.969603
+L 108.298009 893.645281
+L 131.619804 894.321875
+L 149.709594 894.999544
+L 176.986708 896.358759
+L 197.360253 897.724907
+L 213.628214 899.100863
+L 227.170946 900.488989
+L 238.771838 901.890705
+L 248.918557 903.307849
+L 257.935391 904.743257
+L 266.048951 906.199481
+L 276.874067 908.426149
+L 286.422496 910.709781
+L 294.963857 913.059048
+L 302.690458 915.479101
+L 309.744292 917.976685
+L 316.23319 920.558578
+L 322.240971 923.22777
+L 327.834082 925.989117
+L 333.066087 928.844976
+L 337.980801 931.794015
+L 342.614516 934.836013
+L 346.997635 937.965822
+L 351.155877 941.175269
+L 355.111195 944.456224
+L 360.101567 948.917333
+L 364.802475 953.444812
+L 370.31943 959.133075
+L 375.48474 964.776471
+L 382.204273 972.454116
+L 397.291203 990.201164
+L 419.263441 1016.097581
+L 423.799894 1021.918257
+L 427.571176 1027.14074
+L 429.135237 1029.44881
+L 429.649956 752.802246
+L 432.671471 757.64654
+L 435.106127 761.927195
+L 437.469792 766.48661
+L 439.766488 771.369118
+L 441.999906 776.609097
+L 444.173439 782.231131
+L 446.707019 789.459669
+L 449.566135 798.442966
+L 453.099922 810.419715
+L 459.381674 831.880357
+L 462.861519 842.857146
+L 466.849271 854.583009
+L 471.878353 869.313919
+L 473.984133 876.118467
+L 475.746549 882.473401
+L 477.471464 889.56432
+L 478.881377 896.234703
+L 480.267187 903.73508
+L 481.899483 913.88576
+L 483.763196 927.029525
+L 488.118604 958.586275
+L 490.333041 972.579677
+L 492.95992 989.050426
+L 494.126385 997.947354
+L 495.047622 1007.029845
+L 495.731744 1015.722989
+L 496.41014 1026.787393
+L 496.635017 753.645012
+L 499.285976 806.516125
+L 500.150709 816.758368
+L 501.006316 823.927726
+L 502.063279 830.365278
+L 502.899038 834.110112
+L 504.136741 838.615316
+L 505.758154 843.016995
+L 508.51986 848.459623
+L 509.099609 849.309992
+L 509.675242 850.086119
+L 510.436449 851.347825
+L 511.190575 852.13048
+L 511.93775 853.285254
+L 512.493647 853.641256
+L 513.045758 854.550606
+L 513.411754 854.979632
+L 513.957668 855.199422
+L 514.319579 855.746517
+L 514.679881 856.350329
+L 515.03859 856.507738
+L 515.395718 856.575656
+L 515.75128 857.108835
+L 516.105289 857.725092
+L 516.281715 857.840262
+L 516.808703 857.803141
+L 517.158134 858.331764
+L 517.506066 858.974334
+L 517.679473 859.073417
+L 518.197481 858.906314
+L 518.369417 859.09006
+L 518.883049 860.120251
+L 519.053539 860.206226
+L 519.562868 859.903624
+L 519.731936 860.07762
+L 520.237034 861.180096
+L 520.404703 861.25561
+L 520.905639 860.809281
+L 521.071932 860.974625
+L 521.568775 862.167598
+L 521.733715 862.235134
+L 522.226531 861.634405
+L 522.390139 861.791764
+L 522.878993 863.093901
+L 523.041291 863.155906
+L 523.526245 862.387799
+L 523.687254 862.537483
+L 524.168371 863.968221
+L 524.328111 864.027208
+L 524.805451 863.076493
+L 524.963941 863.218506
+L 525.594823 864.856942
+L 526.064784 863.706131
+L 526.220834 863.840205
+L 526.842047 865.651955
+L 527.304853 864.281247
+L 527.458536 864.406868
+L 528.070373 866.418281
+L 528.526239 864.805476
+L 528.677626 864.921908
+L 529.280365 867.161324
+L 529.729496 865.281703
+L 529.878655 865.388008
+L 530.472562 867.886002
+L 530.915154 865.712182
+L 531.06215 865.80724
+L 531.64748 868.596854
+L 532.083721 866.098621
+L 532.228615 866.181156
+L 532.805614 869.298137
+L 533.235683 866.442252
+L 533.378534 866.510854
+L 533.947434 869.993886
+L 534.371505 866.743875
+L 534.51237 866.797039
+L 535.073396 870.687983
+L 535.491633 867.003893
+L 535.630567 867.040063
+L 536.183933 871.384199
+L 536.459207 868.51959
+L 536.596494 867.222345
+L 536.733549 867.239963
+L 537.279463 872.086235
+L 537.551048 868.87783
+L 537.6865 867.398909
+L 537.821726 867.396488
+L 538.360385 872.797752
+L 538.628378 869.213618
+L 538.762044 867.532918
+L 538.895489 867.509127
+L 539.427084 873.522403
+L 539.69158 869.528018
+L 539.823505 867.623356
+L 539.955216 867.577124
+L 540.479929 874.263846
+L 540.741018 869.821951
+L 540.871247 867.668851
+L 541.001268 867.599502
+L 541.519276 875.025765
+L 541.648263 873.313474
+L 541.905621 867.667659
+L 542.033995 867.575077
+L 542.545466 875.811874
+L 542.672832 873.953495
+L 542.926963 867.617643
+L 543.053731 867.502471
+L 543.558829 876.625922
+L 543.684613 874.616867
+L 543.935598 867.516246
+L 544.060799 867.380133
+L 544.55968 877.471691
+L 544.683923 875.308804
+L 544.931837 867.360453
+L 545.05551 867.20635
+L 545.548326 878.35298
+L 545.671063 876.035042
+L 545.915982 867.146746
+L 546.038164 866.979273
+L 546.52506 879.273585
+L 546.646329 876.801942
+L 546.888323 866.87105
+L 547.009049 866.69693
+L 547.490166 880.237271
+L 547.610001 877.616599
+L 547.849139 866.528675
+L 547.968445 866.357256
+L 548.443918 881.247723
+L 548.562352 878.486973
+L 548.798702 866.114235
+L 548.916619 865.958122
+L 549.386579 882.308493
+L 549.503645 879.422035
+L 549.73727 865.621575
+L 549.853831 865.497367
+L 550.318405 883.422928
+L 550.434134 880.431929
+L 550.665097 865.04367
+L 550.780332 864.972846
+L 551.239641 884.59408
+L 551.354063 881.528157
+L 551.582424 864.372534
+L 551.696363 864.382472
+L 552.150527 885.824601
+L 552.263671 882.723766
+L 552.489487 863.59911
+L 552.60216 863.724282
+L 553.051291 887.116626
+L 553.163186 884.033551
+L 553.386514 862.713169
+L 553.497948 862.996497
+L 553.942157 888.471635
+L 554.05283 885.474232
+L 554.273723 861.703221
+L 554.383945 862.197606
+L 554.823339 889.890308
+L 554.932816 887.064585
+L 555.151328 860.556449
+L 555.260364 861.326449
+L 555.695045 891.372378
+L 555.803353 888.825479
+L 556.019534 859.25871
+L 556.127409 860.382311
+L 556.557479 892.916483
+L 556.66464 890.779714
+L 556.87854 857.794614
+L 556.985279 859.365022
+L 557.410833 894.520042
+L 557.516874 892.951553
+L 557.728539 856.147769
+L 557.834165 858.275063
+L 558.255299 896.179153
+L 558.360241 895.365764
+L 558.569719 854.301235
+L 558.674255 857.113664
+L 559.194925 898.045949
+L 559.40226 852.238307
+L 559.505729 855.882897
+L 560.021102 901.011938
+L 560.226338 849.943712
+L 560.328761 854.585754
+L 560.838945 904.276089
+L 561.042123 847.405326
+L 561.244792 864.947253
+L 561.648619 907.838613
+L 561.84978 844.616426
+L 562.050443 864.384264
+L 562.450286 911.682501
+L 562.64947 841.578395
+L 562.848166 863.799818
+L 563.244103 915.769307
+L 563.441349 838.303552
+L 563.736321 878.508861
+L 564.030223 920.037589
+L 564.225568 834.81753
+L 564.711879 910.56259
+L 564.808793 924.405709
+L 565.002272 831.160385
+L 565.579956 928.779547
+L 565.771606 827.385657
+L 566.343853 933.063687
+L 566.438836 766.7096
+L 566.628469 842.490466
+L 567.100619 937.172994
+L 567.19472 1027.25935
+L 567.288712 819.742275
+L 567.382595 840.879272
+L 567.850385 941.041256
+L 567.943621 1022.181037
+L 568.036749 816.007566
+L 568.12977 839.275184
+L 568.593281 944.625046
+L 568.685667 1019.807535
+L 568.777946 812.410418
+L 568.870122 837.686608
+L 569.329431 947.902973
+L 569.420982 1018.436141
+L 569.512429 808.995888
+L 569.603773 836.121316
+L 570.058957 950.871871
+L 570.149687 1017.539915
+L 570.240317 805.794667
+L 570.330845 834.586291
+L 570.781975 953.54178
+L 570.871901 1016.904346
+L 570.961727 802.823553
+L 571.051454 833.087622
+L 571.498603 955.931116
+L 571.587737 1016.426082
+L 571.676774 800.087476
+L 571.765713 831.630432
+L 572.208951 958.062739
+L 572.297308 1016.049313
+L 572.385569 797.58225
+L 572.473735 830.218865
+L 572.913128 959.961123
+L 573.000722 1015.741308
+L 573.088221 795.297365
+L 573.175626 828.856101
+L 573.698085 1015.481636
+L 573.784835 793.218425
+L 573.871493 827.544405
+L 574.3895 1015.25691
+L 574.475514 791.329054
+L 574.561437 826.285207
+L 575.075069 1015.058008
+L 575.160358 789.612263
+L 575.245558 825.079185
+L 575.754888 1014.878516
+L 575.839466 788.051369
+L 575.923955 823.926366
+L 576.429053 1014.713801
+L 576.512931 786.630551
+L 576.596722 822.826224
+L 577.097659 1014.560445
+L 577.180848 785.335158
+L 577.263952 821.777781
+L 577.760795 1014.415879
+L 577.843307 784.151838
+L 577.925735 820.779693
+L 578.418551 1014.278139
+L 578.500396 783.068559
+L 578.582159 819.830336
+L 579.071012 1014.145707
+L 579.152202 782.074557
+L 579.233311 818.927878
+L 579.718265 1014.017394
+L 579.798809 781.160257
+L 579.879274 818.070343
+L 580.360391 1013.892262
+L 580.4403 780.317162
+L 580.52013 817.255664
+L 580.99747 1013.769561
+L 581.076754 779.537751
+L 581.155961 816.481727
+L 581.629582 1013.648692
+L 581.708251 778.815371
+L 581.786843 815.746411
+L 582.256803 1013.529171
+L 582.334866 778.144138
+L 582.412853 815.047608
+L 582.879209 1013.410606
+L 582.956675 777.518846
+L 583.034067 814.383257
+L 583.496873 1013.29268
+L 583.573751 776.934883
+L 583.650556 813.751352
+L 584.109866 1013.175133
+L 584.186165 776.388162
+L 584.262392 813.149956
+L 584.718258 1013.057755
+L 584.793987 775.875054
+L 584.869646 812.577214
+L 585.322119 1012.940374
+L 585.397287 775.392332
+L 585.472384 812.031355
+L 585.921515 1012.822849
+L 585.996129 774.937124
+L 586.070674 811.510695
+L 586.516512 1012.705069
+L 586.590581 774.506866
+L 586.664582 811.013639
+L 587.107174 1012.586941
+L 587.180705 774.09927
+L 587.254169 810.538681
+L 587.693563 1012.468393
+L 587.766564 773.712287
+L 587.8395 810.084402
+L 588.275741 1012.349367
+L 588.34822 773.344079
+L 588.420635 809.649467
+L 588.853768 1012.229817
+L 588.925732 772.992996
+L 588.997633 809.232625
+L 589.427703 1012.109709
+L 589.49916 772.657555
+L 589.570554 808.832702
+L 589.997603 1011.989017
+L 590.068559 772.336419
+L 590.139454 808.448599
+L 590.563525 1011.867723
+L 590.633988 772.028381
+L 590.70439 808.079288
+L 591.125523 1011.745815
+L 591.1955 771.732351
+L 591.265416 807.723808
+L 591.683652 1011.623285
+L 591.753149 771.447343
+L 591.822586 807.381262
+L 592.237965 1011.500131
+L 592.306988 771.172461
+L 592.375953 807.050814
+L 592.788514 1011.376355
+L 592.85707 770.906894
+L 592.925568 806.731681
+L 593.335348 1011.25196
+L 593.403444 770.649904
+L 593.471483 806.423134
+L 593.878519 1011.126953
+L 593.94616 770.400818
+L 594.013745 806.124493
+L 594.418075 1011.001343
+L 594.485268 770.159026
+L 594.552405 805.835124
+L 594.954063 1010.87514
+L 595.020813 769.923968
+L 595.087508 805.554436
+L 595.486531 1010.748356
+L 595.552844 769.695134
+L 595.619103 805.281877
+L 596.015525 1010.621004
+L 596.081407 769.472058
+L 596.147235 805.016933
+L 596.541088 1010.493098
+L 596.606545 769.254313
+L 596.671949 804.759123
+L 597.063267 1010.364651
+L 597.128304 769.041507
+L 597.193288 804.508001
+L 597.582104 1010.235681
+L 597.646725 768.833281
+L 597.711296 804.263149
+L 598.097641 1010.1062
+L 598.161853 768.629304
+L 598.226015 804.024177
+L 598.60992 1009.976226
+L 598.673728 768.429275
+L 598.737486 803.790722
+L 599.118983 1009.845773
+L 599.182392 768.232914
+L 599.245751 803.562445
+L 599.624869 1009.714858
+L 599.687883 768.039965
+L 599.750848 803.339028
+L 600.127617 1009.583495
+L 600.190242 767.85019
+L 600.252819 803.120176
+L 600.627267 1009.451701
+L 600.689508 767.663371
+L 600.7517 802.905612
+L 601.123857 1009.319491
+L 601.185717 767.479306
+L 601.24753 802.695077
+L 601.617422 1009.186881
+L 601.678907 767.29781
+L 601.740346 802.48833
+L 602.108002 1009.053884
+L 602.169116 767.118711
+L 602.230184 802.285146
+L 602.59563 1008.920515
+L 602.656378 766.941848
+L 602.71708 802.085313
+L 603.080342 1008.78679
+L 603.140728 766.767075
+L 603.201069 801.888633
+L 603.562174 1008.652722
+L 603.622202 766.594255
+L 603.682186 801.694921
+L 604.041159 1008.518324
+L 604.100834 766.423261
+L 604.160464 801.504005
+L 604.51733 1008.38361
+L 604.576656 766.253976
+L 604.635937 801.315721
+L 604.990721 1008.248593
+L 605.049701 766.08629
+L 605.108638 801.129919
+L 605.461364 1008.113286
+L 605.520002 765.920103
+L 605.578599 800.946455
+L 605.92929 1007.9777
+L 605.987591 765.75532
+L 606.04585 800.765196
+L 606.39453 1007.841848
+L 606.452498 765.591853
+L 606.510424 800.586018
+L 606.857116 1007.705741
+L 606.914754 765.429622
+L 606.972351 800.408803
+L 607.317077 1007.56939
+L 607.374389 765.268549
+L 607.431661 800.23344
+L 607.774444 1007.432807
+L 607.831433 765.108566
+L 607.888383 800.059826
+L 608.229244 1007.296
+L 608.285915 764.949605
+L 608.342546 799.887864
+L 608.681507 1007.158981
+L 608.737863 764.791606
+L 608.79418 799.717464
+L 609.131261 1007.02176
+L 609.187305 764.634511
+L 609.243311 799.548539
+L 609.578534 1006.884344
+L 609.63427 764.478267
+L 609.689967 799.381009
+L 610.023352 1006.746745
+L 610.078783 764.322824
+L 610.134176 799.214798
+L 610.465743 1006.608969
+L 610.520872 764.168135
+L 610.575964 799.049836
+L 610.905733 1006.471026
+L 610.960564 764.014157
+L 611.015358 798.886055
+L 611.343348 1006.332924
+L 611.397884 763.860849
+L 611.452383 798.723392
+L 611.778613 1006.19467
+L 611.832857 763.708173
+L 611.887065 798.561788
+L 612.211554 1006.056272
+L 612.265509 763.556094
+L 612.319428 798.401187
+L 612.642194 1005.917737
+L 612.695864 763.404577
+L 612.749498 798.241538
+L 613.07056 1005.779072
+L 613.123947 763.253593
+L 613.177298 798.082789
+L 613.496673 1005.640283
+L 613.549781 763.103111
+L 613.602853 797.924895
+L 613.920559 1005.501378
+L 613.973389 762.953104
+L 614.026185 797.767812
+L 614.34224 1005.362361
+L 614.394796 762.803547
+L 614.447318 797.611498
+L 614.761739 1005.22324
+L 614.814024 762.654415
+L 614.866275 797.455915
+L 615.179078 1005.084019
+L 615.231094 762.505686
+L 615.283078 797.301024
+L 615.594279 1004.944704
+L 615.64603 762.357339
+L 615.697748 797.146792
+L 616.007365 1004.805301
+L 616.058853 762.209353
+L 616.110309 796.993186
+L 616.418357 1004.665813
+L 616.469585 762.06171
+L 616.52078 796.840175
+L 616.827276 1004.526247
+L 616.878246 761.914392
+L 616.929184 796.687728
+L 617.234142 1004.386606
+L 617.284857 761.767383
+L 617.33554 796.53582
+L 617.638977 1004.246895
+L 617.689439 761.620667
+L 617.73987 796.384423
+L 618.0418 1004.107118
+L 618.092012 761.474229
+L 618.142193 796.233513
+L 618.442631 1003.967279
+L 618.492596 761.328057
+L 618.54253 796.083066
+L 618.84149 1003.827383
+L 618.89121 761.182136
+L 618.940899 795.933061
+L 619.238396 1003.687432
+L 619.287873 761.036454
+L 619.33732 795.783477
+L 619.633369 1003.54743
+L 619.682605 760.891001
+L 619.731812 795.634293
+L 620.026426 1003.407381
+L 620.075425 760.745766
+L 620.124394 795.485491
+L 620.417587 1003.267287
+L 620.46635 760.600737
+L 620.515083 795.337053
+L 620.80687 1003.127153
+L 620.855399 760.455906
+L 620.95237 829.85704
+L 621.194292 1002.98698
+L 621.24259 760.311263
+L 621.339099 829.709322
+L 621.579872 1002.846773
+L 621.62794 760.1668
+L 621.723992 829.561901
+L 621.963626 1002.706532
+L 622.011468 760.022509
+L 622.107067 829.414763
+L 622.345572 1002.566262
+L 622.393189 759.878382
+L 622.488339 829.267898
+L 622.725727 1002.425964
+L 622.773122 759.734412
+L 622.867827 829.121294
+L 623.104108 1002.285641
+L 623.151282 759.590593
+L 623.245547 828.974941
+L 623.480731 1002.145296
+L 623.527686 759.446916
+L 623.621515 828.828828
+L 623.855612 1002.004929
+L 623.902351 759.303378
+L 623.995747 828.682945
+L 624.228768 1001.864544
+L 624.275292 759.159971
+L 624.36826 828.537285
+L 624.600214 1001.724142
+L 624.646526 759.016691
+L 624.739069 828.391836
+L 624.969966 1001.583725
+L 625.016067 758.873532
+L 625.108189 828.246592
+L 625.338039 1001.443295
+L 625.383931 758.73049
+L 625.475637 828.101545
+L 625.704449 1001.302854
+L 625.750134 758.587559
+L 625.841426 827.956686
+L 626.069209 1001.162403
+L 626.114689 758.444736
+L 626.205573 827.812009
+L 626.432336 1001.021944
+L 626.477613 758.302016
+L 626.568091 827.667506
+L 626.793844 1000.881478
+L 626.838919 758.159396
+L 626.928995 827.523171
+L 627.153747 1000.741006
+L 627.198622 758.016871
+L 627.288299 827.378998
+L 627.512059 1000.600531
+L 627.556736 757.874439
+L 627.646018 827.23498
+L 627.868794 1000.460053
+L 627.913275 757.732095
+L 628.002166 827.091112
+L 628.223966 1000.319574
+L 628.268253 757.589837
+L 628.356755 826.947389
+L 628.577589 1000.179094
+L 628.621684 757.447661
+L 628.709801 826.803805
+L 628.929676 1000.038615
+L 628.97358 757.305565
+L 629.061316 826.660355
+L 629.280241 999.898138
+L 629.323955 757.163546
+L 629.411313 826.517034
+L 629.629296 999.757663
+L 629.672823 757.021602
+L 629.759805 826.373838
+L 629.976855 999.617193
+L 630.020195 756.879729
+L 630.106806 826.230762
+L 630.32293 999.476727
+L 630.366086 756.737926
+L 630.452328 826.087803
+L 630.667534 999.336266
+L 630.710506 756.596191
+L 630.796383 825.944956
+L 631.010679 999.195811
+L 631.05347 756.454521
+L 631.138985 825.802217
+L 631.352378 999.055364
+L 631.394989 756.312914
+L 631.480145 825.659583
+L 631.692643 998.914924
+L 631.735075 756.171368
+L 631.819875 825.51705
+L 632.031485 998.774493
+L 632.073741 756.029882
+L 632.158187 825.374615
+L 632.368917 998.63407
+L 632.410998 755.888453
+L 632.495093 825.232275
+L 632.704951 998.493658
+L 632.746857 755.747081
+L 632.830605 825.090026
+L 633.039597 998.353255
+L 633.081331 755.605763
+L 633.164734 824.947866
+L 633.372868 998.212864
+L 633.41443 755.464497
+L 633.497492 824.805792
+L 633.704774 998.072483
+L 633.746166 755.323284
+L 633.828889 824.6638
+L 634.035326 997.932115
+L 634.076551 755.18212
+L 634.158937 824.52189
+L 634.364537 997.791758
+L 634.405594 755.041005
+L 634.487647 824.380057
+L 634.692416 997.651414
+L 634.733307 754.899938
+L 634.815029 824.238299
+L 635.018974 997.511084
+L 635.059701 754.758917
+L 635.141095 824.096616
+L 635.344222 997.370766
+L 635.384786 754.617941
+L 635.465854 823.955003
+L 635.66817 997.230462
+L 635.708573 754.477009
+L 635.789318 823.813459
+L 635.990829 997.090173
+L 636.031071 754.33612
+L 636.111496 823.671982
+L 636.312209 996.949898
+L 636.352292 754.195273
+L 636.432398 823.53057
+L 636.63232 996.809637
+L 636.672245 754.054467
+L 636.752036 823.389222
+L 636.951171 996.669392
+L 636.99094 753.913701
+L 637.070418 823.247934
+L 637.268774 996.529161
+L 637.308387 753.772974
+L 637.387555 823.106707
+L 637.585137 996.388946
+L 637.624596 753.632285
+L 637.703456 822.965537
+L 637.90027 996.248747
+L 637.939576 753.491633
+L 638.01813 822.824424
+L 638.214183 996.108564
+L 638.253337 753.351018
+L 638.331588 822.683366
+L 638.526886 995.968396
+L 638.565889 753.210439
+L 638.643839 822.542361
+L 638.838386 995.828245
+L 638.87724 753.069895
+L 638.954891 822.401408
+L 639.148695 995.68811
+L 639.1874 752.929386
+L 639.264755 822.260506
+L 639.45782 995.547991
+L 639.496377 752.788909
+L 639.573438 822.119653
+L 639.76577 995.407889
+L 639.804182 752.648466
+L 639.880951 821.978848
+L 640.072556 995.267804
+L 640.110822 752.508056
+L 640.187302 821.838089
+L 640.378185 995.127736
+L 640.416307 752.367677
+L 640.492499 821.697377
+L 640.682666 994.987684
+L 640.720645 752.227329
+L 640.796552 821.556709
+L 641.023845 1029.51438
+L 641.061665 786.753331
+L 641.137253 856.074231
+L 641.325915 1029.374093
+L 641.363595 786.61281
+L 641.438902 855.933796
+L 641.626864 1029.233835
+L 641.664404 786.472328
+L 641.739432 855.793395
+L 641.926699 1029.093607
+L 641.964101 786.331885
+L 642.038852 855.653028
+L 642.22543 1028.953407
+L 642.262694 786.19148
+L 642.337171 855.512694
+L 642.523064 1028.813234
+L 642.560191 786.051111
+L 642.634396 855.372391
+L 642.819609 1028.67309
+L 642.856601 785.910778
+L 642.930535 855.232121
+L 643.115074 1028.532972
+L 643.151931 785.770481
+L 643.225596 855.091881
+L 643.409465 1028.392881
+L 643.446189 785.630218
+L 643.519587 854.951672
+L 643.702791 1028.252816
+L 643.739382 785.489989
+L 643.812515 854.811493
+L 643.99506 1028.112777
+L 644.031519 785.349792
+L 644.10439 854.671344
+L 644.286279 1027.972763
+L 644.322608 785.209628
+L 644.395217 854.531223
+L 644.576455 1027.832775
+L 644.612654 785.069495
+L 644.685004 854.391131
+L 644.865597 1027.692811
+L 644.901667 784.929393
+L 644.973759 854.251068
+L 645.15371 1027.552871
+L 645.189653 784.789321
+L 645.26149 854.111032
+L 645.440804 1027.412955
+L 645.476619 784.649279
+L 645.548202 853.971023
+L 645.726884 1027.273063
+L 645.762573 784.509266
+L 645.833905 853.831041
+L 646.011959 1027.133193
+L 646.047523 784.369282
+L 646.118604 853.691085
+L 646.296034 1026.993347
+L 646.331474 784.229325
+L 646.402306 853.551155
+L 646.579118 1026.853523
+L 646.614434 784.089396
+L 646.68502 853.41125
+L 646.861216 1026.713722
+L 646.896409 783.949494
+L 646.96675 853.271371
+L 647.142336 1026.573942
+L 647.177408 783.809618
+L 647.247505 853.131517
+L 647.422485 1026.434184
+L 647.457436 783.669768
+L 647.527292 852.991686
+L 647.701669 1026.294447
+L 647.736499 783.529943
+L 647.806115 852.85188
+L 647.979895 1026.154732
+L 648.014606 783.390143
+L 648.083984 852.712097
+L 648.257169 1026.015037
+L 648.291761 783.250368
+L 648.360902 852.572338
+L 648.533498 1025.875362
+L 648.567973 783.110617
+L 648.636879 852.432601
+L 648.808888 1025.735708
+L 648.843246 782.970889
+L 648.911919 852.292887
+L 649.083346 1025.596074
+L 649.117588 782.831185
+L 649.186029 852.153196
+L 649.356878 1025.45646
+L 649.391005 782.691503
+L 649.459215 852.013526
+L 649.62949 1025.316865
+L 649.663502 782.551844
+L 649.731484 851.873878
+L 649.901188 1025.177289
+L 649.935087 782.412208
+L 650.002841 851.734251
+L 650.171979 1025.037732
+L 650.205765 782.272593
+L 650.273293 851.594645
+L 650.441869 1024.898194
+L 650.475542 782.132999
+L 650.542846 851.45506
+L 650.710863 1024.758675
+L 650.744424 781.993426
+L 650.811506 851.315495
+L 650.978967 1024.619174
+L 651.012418 781.853874
+L 651.079278 851.17595
+L 651.246187 1024.47969
+L 651.279528 781.714343
+L 651.346168 851.036425
+L 651.51253 1024.340225
+L 651.545761 781.574831
+L 651.612183 850.89692
+L 651.778 1024.200778
+L 651.811123 781.43534
+L 651.877328 850.757434
+L 652.042604 1024.061348
+L 652.075619 781.295868
+L 652.141608 850.617967
+L 652.306347 1023.921935
+L 652.339255 781.156415
+L 652.40503 850.478519
+L 652.569235 1023.782539
+L 652.602036 781.016981
+L 652.667599 850.339089
+L 652.831273 1023.64316
+L 652.863968 780.877565
+L 652.929319 850.199678
+L 653.092467 1023.503798
+L 653.125057 780.738168
+L 653.190198 850.060284
+L 653.352822 1023.364452
+L 653.385307 780.598789
+L 653.45024 849.920909
+L 653.612343 1023.225122
+L 653.644725 780.459428
+L 653.741793 884.441946
+L 653.871037 1023.085809
+L 653.903315 780.320084
+L 654.000074 884.302639
+L 654.128907 1022.946511
+L 654.161083 780.180758
+L 654.257535 884.163347
+L 654.38596 1022.807229
+L 654.418034 780.041449
+L 654.514181 884.02407
+L 654.6422 1022.667963
+L 654.674173 779.902157
+L 654.770017 883.884809
+L 654.897633 1022.528712
+L 654.929506 779.762881
+L 655.025048 883.745563
+L 655.152264 1022.389477
+L 655.184036 779.623622
+L 655.27928 883.606332
+L 655.406097 1022.250256
+L 655.43777 779.484379
+L 655.532716 883.467116
+L 655.659138 1022.11105
+L 655.690713 779.345152
+L 655.785363 883.327914
+L 655.911392 1021.971859
+L 655.942868 779.205941
+L 656.037225 883.188727
+L 656.162863 1021.832683
+L 656.194242 779.066745
+L 656.288306 883.049555
+L 656.413556 1021.693521
+L 656.444838 778.927565
+L 656.538613 882.910396
+L 656.663477 1021.554373
+L 656.694663 778.7884
+L 656.788149 882.771252
+L 656.912629 1021.415239
+L 656.94372 778.64925
+L 657.036919 882.632122
+L 657.161019 1021.27612
+L 657.192014 778.510114
+L 657.284928 882.493006
+L 657.408649 1021.137014
+L 657.43955 778.370993
+L 657.532181 882.353904
+L 657.655525 1020.997922
+L 657.686332 778.231887
+L 657.778682 882.214815
+L 657.901652 1020.858843
+L 657.932365 778.092795
+L 658.024436 882.075739
+L 658.147034 1020.719777
+L 658.177654 777.953717
+L 658.269447 881.936677
+L 658.391675 1020.580725
+L 658.422203 777.814653
+L 658.51372 881.797628
+L 658.63558 1020.441686
+L 658.666017 777.675602
+L 658.757258 881.658592
+L 658.878754 1020.30266
+L 658.9091 777.536565
+L 659.000068 881.519569
+L 659.1212 1020.163647
+L 659.151455 777.397542
+L 659.242152 881.380559
+L 659.362924 1020.024646
+L 659.393089 777.258531
+L 659.483516 881.241561
+L 659.603929 1019.885658
+L 659.634004 777.119534
+L 659.724163 881.102576
+L 659.844219 1019.746682
+L 659.874206 776.98055
+L 659.964098 880.963603
+L 660.0838 1019.607719
+L 660.113697 776.841578
+L 660.203325 880.824643
+L 660.322674 1019.468768
+L 660.352484 776.702619
+L 660.441848 880.685695
+L 660.560847 1019.329828
+L 660.590569 776.563672
+L 660.679671 880.546758
+L 660.798322 1019.190901
+L 660.827957 776.424738
+L 660.916799 880.407834
+L 661.035103 1019.051985
+L 661.064652 776.285816
+L 661.153235 880.268921
+L 661.271195 1018.913081
+L 661.300658 776.146906
+L 661.388983 880.13002
+L 661.506601 1018.774189
+L 661.535979 776.008008
+L 661.624048 879.991131
+L 661.741325 1018.635308
+L 661.770618 775.869122
+L 661.858433 879.852253
+L 661.975372 1018.496438
+L 662.004581 775.730247
+L 662.092143 879.713386
+L 662.208746 1018.35758
+L 662.23787 775.591383
+L 662.325181 879.574531
+L 662.441449 1018.218732
+L 662.47049 775.452532
+L 662.55755 879.435687
+L 662.673486 1018.079896
+L 662.702444 775.313691
+L 662.789256 879.296853
+L 662.904861 1017.94107
+L 662.933736 775.174861
+L 663.020301 879.158031
+L 663.135577 1017.802255
+L 663.164371 775.036043
+L 663.25069 879.019219
+L 663.365639 1017.663451
+L 663.394351 774.897235
+L 663.480426 878.880417
+L 663.59505 1017.524657
+L 663.623681 774.758438
+L 663.709512 878.741627
+L 663.823813 1017.385873
+L 663.852363 774.619651
+L 663.937953 878.602846
+L 664.051933 1017.2471
+L 664.080403 774.480875
+L 664.165752 878.464076
+L 664.279412 1017.108337
+L 664.307802 774.34211
+L 664.392913 878.325316
+L 664.506255 1016.969584
+L 664.534566 774.203354
+L 664.619439 878.186567
+L 664.732465 1016.830841
+L 664.760697 774.064609
+L 664.845334 878.047827
+L 664.958046 1016.692108
+L 664.986199 773.925874
+L 665.070601 877.909097
+L 665.183 1016.553385
+L 665.211076 773.787148
+L 665.295244 877.770377
+L 665.407332 1016.414671
+L 665.43533 773.648433
+L 665.519266 877.631666
+L 665.631045 1016.275967
+L 665.658966 773.509727
+L 665.742671 877.492965
+L 665.854143 1016.137272
+L 665.881987 773.371031
+L 665.965462 877.354274
+L 666.076628 1015.998587
+L 666.104396 773.232344
+L 666.187642 877.215592
+L 666.298504 1015.859911
+L 666.326196 773.093667
+L 666.409215 877.076919
+L 666.519774 1015.721244
+L 666.547391 772.954999
+L 666.630184 876.938255
+L 666.740443 1015.582586
+L 666.767984 772.81634
+L 666.850552 876.7996
+L 666.960512 1015.443937
+L 666.987979 772.67769
+L 667.070323 876.660955
+L 667.179985 1015.305297
+L 667.207378 772.539049
+L 667.2895 876.522318
+L 667.398866 1015.166665
+L 667.426185 772.400417
+L 667.508085 876.38369
+L 667.617158 1015.028043
+L 667.644403 772.261794
+L 667.726083 876.24507
+L 667.834863 1014.889429
+L 667.862035 772.12318
+L 667.943497 876.10646
+L 668.051985 1014.750823
+L 668.079085 771.984574
+L 668.160329 875.967857
+L 668.268527 1014.612226
+L 668.295555 771.845976
+L 668.376582 875.829263
+L 668.484493 1014.473637
+L 668.511448 771.707387
+L 668.59226 875.690678
+L 668.699884 1014.335057
+L 668.726768 771.568806
+L 668.807366 875.552101
+L 668.914705 1014.196484
+L 668.941518 771.430234
+L 669.021902 875.413531
+L 669.128958 1014.05792
+L 669.1557 771.291669
+L 669.235873 875.27497
+L 669.342646 1013.919364
+L 669.369318 771.153113
+L 669.44928 875.136417
+L 669.555773 1013.780815
+L 669.582374 771.014564
+L 669.662126 874.997872
+L 669.768341 1013.642275
+L 669.794872 770.876024
+L 669.874416 874.859334
+L 669.980352 1013.503742
+L 670.006815 770.737491
+L 670.086151 874.720804
+L 670.191811 1013.365216
+L 670.218205 770.598965
+L 670.297334 874.582282
+L 670.40272 1013.226698
+L 670.429045 770.460448
+L 670.507969 874.443768
+L 670.613081 1013.088188
+L 670.639338 770.321938
+L 670.718057 874.30526
+L 670.822898 1012.949685
+L 670.849087 770.183435
+L 670.927603 874.166761
+L 671.032173 1012.811189
+L 671.058295 770.044939
+L 671.136608 874.028268
+L 671.24091 1012.672701
+L 671.266964 769.906451
+L 671.345076 873.889783
+L 671.44911 1012.53422
+L 671.475097 769.76797
+L 671.55301 873.751304
+L 671.656777 1012.395745
+L 671.682698 769.629496
+L 671.760411 873.612833
+L 671.863913 1012.257278
+L 671.889768 769.491029
+L 671.967283 873.474369
+L 672.070522 1012.118818
+L 672.096311 769.352569
+L 672.173629 873.335912
+L 672.276605 1011.980364
+L 672.302328 769.214116
+L 672.37945 873.197461
+L 672.482165 1011.841917
+L 672.507824 769.07567
+L 672.584751 873.059017
+L 672.687206 1011.703477
+L 672.7128 768.93723
+L 672.789532 872.92058
+L 672.89173 1011.565044
+L 672.917259 768.798797
+L 672.993798 872.78215
+L 673.095739 1011.426617
+L 673.121204 768.660371
+L 673.197551 872.643725
+L 673.299235 1011.288196
+L 673.324636 768.52195
+L 673.400792 872.505308
+L 673.502222 1011.149782
+L 673.52756 768.383537
+L 673.603526 872.366896
+L 673.704702 1011.011374
+L 673.729977 768.245129
+L 673.805753 872.228491
+L 673.906678 1010.872972
+L 673.93189 768.106728
+L 674.007478 872.090093
+L 674.108152 1010.734577
+L 674.133301 767.968333
+L 674.208701 871.9517
+L 674.309126 1010.596187
+L 674.334213 767.829944
+L 674.409427 871.813313
+L 674.509603 1010.457804
+L 674.534628 767.691561
+L 674.609656 871.674932
+L 674.709586 1010.319426
+L 674.734549 767.553184
+L 674.809393 871.536558
+L 674.909077 1010.181054
+L 674.933979 767.414813
+L 675.008638 871.398189
+L 675.108078 1010.042688
+L 675.132918 767.276448
+L 675.207395 871.259826
+L 675.306591 1009.904328
+L 675.331371 767.138088
+L 675.405666 871.121468
+L 675.50462 1009.765974
+L 675.529339 766.999734
+L 675.603453 870.983116
+L 675.702166 1009.627625
+L 675.726825 766.861386
+L 675.800759 870.84477
+L 675.899232 1009.489281
+L 675.923831 766.723043
+L 675.997585 870.706429
+L 676.09582 1009.350943
+L 676.12036 766.584706
+L 676.193935 870.568094
+L 676.291932 1009.212611
+L 676.316413 766.446374
+L 676.389811 870.429764
+L 676.487572 1009.074284
+L 676.511993 766.308047
+L 676.585214 870.291439
+L 676.68274 1008.935962
+L 676.707103 766.169725
+L 676.780148 870.153119
+L 676.877439 1008.797645
+L 676.901744 766.031409
+L 676.998889 904.675936
+L 677.071672 1008.659333
+L 677.095919 765.893098
+L 677.192832 904.537628
+L 677.265441 1008.521026
+L 677.289629 765.754792
+L 677.386312 904.399324
+L 677.458748 1008.382725
+L 677.482879 765.616491
+L 677.579331 904.261026
+L 677.651594 1008.244428
+L 677.675668 765.478194
+L 677.771891 904.122732
+L 677.843984 1008.106136
+L 677.868 765.339903
+L 677.963995 903.984443
+L 678.035917 1007.967849
+L 678.059877 765.201616
+L 678.155645 903.846159
+L 678.227398 1007.829566
+L 678.251301 765.063335
+L 678.346844 903.707879
+L 678.418427 1007.691289
+L 678.442274 764.925057
+L 678.537592 903.569604
+L 678.609007 1007.553016
+L 678.632798 764.786785
+L 678.727892 903.431334
+L 678.79914 1007.414747
+L 678.822875 764.648517
+L 678.917747 903.293068
+L 678.988828 1007.276483
+L 679.012508 764.510253
+L 679.107158 903.154807
+L 679.178073 1007.138223
+L 679.201698 764.371994
+L 679.296128 903.01655
+L 679.366878 1006.999968
+L 679.390448 764.233739
+L 679.484658 902.878297
+L 679.555244 1006.861717
+L 679.578759 764.095488
+L 679.672751 902.740049
+L 679.743173 1006.72347
+L 679.766634 763.957242
+L 679.860408 902.601805
+L 679.930668 1006.585227
+L 679.954074 763.819
+L 680.047632 902.463564
+L 680.11773 1006.446989
+L 680.141082 763.680762
+L 680.234425 902.325328
+L 680.304361 1006.308754
+L 680.32766 763.542528
+L 680.420788 902.187096
+L 680.490564 1006.170524
+L 680.513809 763.404298
+L 680.606724 902.048868
+L 680.67634 1006.032297
+L 680.699532 763.266072
+L 680.792234 901.910644
+L 680.861691 1005.894074
+L 680.88483 763.127849
+L 680.977321 901.772424
+L 681.046619 1005.755855
+L 681.069706 762.989631
+L 681.161986 901.634207
+L 681.231127 1005.61764
+L 681.254161 762.851416
+L 681.346231 901.495995
+L 681.415215 1005.479429
+L 681.438197 762.713205
+L 681.530059 901.357785
+L 681.598887 1005.341221
+L 681.621816 762.574998
+L 681.71347 901.21958
+L 681.782143 1005.203017
+L 681.805021 762.436794
+L 681.896468 901.081378
+L 681.964986 1005.064816
+L 681.987812 762.298594
+L 682.079054 900.943179
+L 682.147417 1004.926619
+L 682.170192 762.160397
+L 682.261229 900.804984
+L 682.329439 1004.788425
+L 682.352163 762.022204
+L 682.442996 900.666793
+L 682.511053 1004.650235
+L 682.533727 761.884014
+L 682.624356 900.528604
+L 682.692261 1004.512048
+L 682.714884 761.745827
+L 682.805311 900.390419
+L 682.873065 1004.373864
+L 682.895638 761.607644
+L 682.985863 900.252237
+L 683.053467 1004.235683
+L 683.075989 761.469463
+L 683.166015 900.114058
+L 683.233468 1004.097505
+L 683.25594 761.331286
+L 683.345766 899.975883
+L 683.41307 1003.959331
+L 683.435493 761.193112
+L 683.52512 899.83771
+L 683.592276 1003.821159
+L 683.614648 761.054941
+L 683.704078 899.699541
+L 683.771086 1003.682991
+L 683.793409 760.916773
+L 683.882642 899.561374
+L 683.949502 1003.544825
+L 683.971777 760.778608
+L 684.060813 899.42321
+L 684.127527 1003.406663
+L 684.149752 760.640445
+L 684.238594 899.285049
+L 684.305161 1003.268503
+L 684.327338 760.502286
+L 684.415986 899.146891
+L 684.482408 1003.130346
+L 684.504536 760.364129
+L 684.59299 899.008736
+L 684.659267 1002.992191
+L 684.681347 760.225975
+L 684.769609 898.870583
+L 684.835742 1002.854039
+L 684.857774 760.087823
+L 684.945843 898.732433
+L 685.011833 1002.71589
+L 685.033817 759.949674
+L 685.121696 898.594285
+L 685.187542 1002.577743
+L 685.209479 759.811528
+L 685.297168 898.45614
+L 685.362872 1002.439599
+L 685.384761 759.673384
+L 685.47226 898.317997
+L 685.537823 1002.301458
+L 685.559665 759.535243
+L 685.646976 898.179857
+L 685.712397 1002.163318
+L 685.734193 759.397104
+L 685.821316 898.041719
+L 685.886597 1002.025181
+L 685.908345 759.258967
+L 685.995281 897.903583
+L 686.060422 1001.887046
+L 686.082124 759.120832
+L 686.168874 897.76545
+L 686.233876 1001.748914
+L 686.255532 758.9827
+L 686.342097 897.627319
+L 686.40696 1001.610784
+L 686.428569 758.84457
+L 686.514949 897.48919
+L 686.579674 1001.472655
+L 686.601238 758.706442
+L 686.687434 897.351063
+L 686.752022 1001.334529
+L 686.77354 758.568316
+L 686.859553 897.212938
+L 686.924004 1001.196405
+L 686.945476 758.430192
+L 687.031308 897.074815
+L 687.095622 1001.058283
+L 687.117048 758.29207
+L 687.202699 896.936694
+L 687.266877 1000.920163
+L 687.288258 758.15395
+L 687.373728 896.798575
+L 687.437771 1000.782044
+L 687.459108 758.015832
+L 687.544398 896.660458
+L 687.608306 1000.643928
+L 687.629598 757.877716
+L 687.714708 896.522343
+L 687.778483 1000.505813
+L 687.79973 757.739601
+L 687.884662 896.384229
+L 687.948303 1000.3677
+L 687.969506 757.601488
+L 688.054261 896.246117
+L 688.117769 1000.229588
+L 688.138927 757.463377
+L 688.223505 896.108006
+L 688.28688 1000.091479
+L 688.307995 757.325268
+L 688.392396 895.969898
+L 688.45564 999.95337
+L 688.47671 757.18716
+L 688.560937 895.83179
+L 688.624049 999.815264
+L 688.645076 757.049053
+L 688.729128 895.693685
+L 688.792109 999.677158
+L 688.813092 756.910948
+L 688.89697 895.55558
+L 688.959822 999.539055
+L 688.980761 756.772844
+L 689.064466 895.417477
+L 689.127188 999.400952
+L 689.148084 756.634742
+L 689.231617 895.279376
+L 689.294209 999.262851
+L 689.315063 756.496641
+L 689.398423 895.141275
+L 689.460887 999.124751
+L 689.481698 756.358541
+L 689.564887 895.003176
+L 689.627223 998.986652
+L 689.647991 756.220443
+L 689.73101 894.865078
+L 689.793218 998.848555
+L 689.813944 756.082346
+L 689.896793 894.726981
+L 689.958875 998.710459
+L 689.979558 755.944249
+L 690.062238 894.588886
+L 690.124193 998.572363
+L 690.144834 755.806154
+L 690.227346 894.450791
+L 690.289175 998.434269
+L 690.309774 755.66806
+L 690.392118 894.312698
+L 690.453822 998.296176
+L 690.474379 755.529967
+L 690.556556 894.174605
+L 690.618135 998.158083
+L 690.63865 755.391875
+L 690.720662 894.036513
+L 690.782115 998.019992
+L 690.80259 755.253783
+L 690.884435 893.898422
+L 690.945765 997.881901
+L 690.966198 755.115693
+L 691.047879 893.760332
+L 691.109085 997.743811
+L 691.129477 754.977603
+L 691.210993 893.622242
+L 691.272077 997.605722
+L 691.292428 754.839514
+L 691.37378 893.484154
+L 691.434741 997.467634
+L 691.455052 754.701425
+L 691.536241 893.346066
+L 691.59708 997.329546
+L 691.61735 754.563338
+L 691.698377 893.207978
+L 691.759095 997.191459
+L 691.779324 754.42525
+L 691.86019 893.069891
+L 691.920786 997.053372
+L 691.940975 754.287164
+L 692.02168 892.931805
+L 692.082156 996.915286
+L 692.102304 754.149078
+L 692.182849 892.793719
+L 692.243204 996.7772
+L 692.263313 754.010992
+L 692.343698 892.655633
+L 692.403934 996.639115
+L 692.424003 753.872907
+L 692.504228 892.517548
+L 692.564345 996.501029
+L 692.584375 753.734821
+L 692.664442 892.379463
+L 692.72444 996.362945
+L 692.74443 753.596737
+L 692.824339 892.241379
+L 692.884219 996.22486
+L 692.90417 753.458652
+L 692.983922 892.103294
+L 693.043684 996.086776
+L 693.063595 753.320568
+L 693.143191 891.96521
+L 693.202836 995.948692
+L 693.222708 753.182484
+L 693.302148 891.827126
+L 693.361676 995.810608
+L 693.381509 753.0444
+L 693.460793 891.689042
+L 693.520206 995.672524
+L 693.520206 995.672524
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_13">
+ <path d="M 62.57 1038.04
+L 62.57 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_14">
+ <path d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_15">
+ <path d="M 62.57 1038.04
+L 693.54 1038.04
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_16">
+ <path d="M 62.57 745.2
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="text_44">
+ <!-- 8th-order Chebyshev type I filter, lowpass -->
+ <defs>
+ <path d="M 4.890625 31.390625
+L 31.203125 31.390625
+L 31.203125 23.390625
+L 4.890625 23.390625
+z
+" id="DejaVuSans-45"/>
+ <path d="M 30.609375 48.390625
+Q 23.390625 48.390625 19.1875 42.75
+Q 14.984375 37.109375 14.984375 27.296875
+Q 14.984375 17.484375 19.15625 11.84375
+Q 23.34375 6.203125 30.609375 6.203125
+Q 37.796875 6.203125 41.984375 11.859375
+Q 46.1875 17.53125 46.1875 27.296875
+Q 46.1875 37.015625 41.984375 42.703125
+Q 37.796875 48.390625 30.609375 48.390625
+z
+M 30.609375 56
+Q 42.328125 56 49.015625 48.375
+Q 55.71875 40.765625 55.71875 27.296875
+Q 55.71875 13.875 49.015625 6.21875
+Q 42.328125 -1.421875 30.609375 -1.421875
+Q 18.84375 -1.421875 12.171875 6.21875
+Q 5.515625 13.875 5.515625 27.296875
+Q 5.515625 40.765625 12.171875 48.375
+Q 18.84375 56 30.609375 56
+z
+" id="DejaVuSans-111"/>
+ <path d="M 64.40625 67.28125
+L 64.40625 56.890625
+Q 59.421875 61.53125 53.78125 63.8125
+Q 48.140625 66.109375 41.796875 66.109375
+Q 29.296875 66.109375 22.65625 58.46875
+Q 16.015625 50.828125 16.015625 36.375
+Q 16.015625 21.96875 22.65625 14.328125
+Q 29.296875 6.6875 41.796875 6.6875
+Q 48.140625 6.6875 53.78125 8.984375
+Q 59.421875 11.28125 64.40625 15.921875
+L 64.40625 5.609375
+Q 59.234375 2.09375 53.4375 0.328125
+Q 47.65625 -1.421875 41.21875 -1.421875
+Q 24.65625 -1.421875 15.125 8.703125
+Q 5.609375 18.84375 5.609375 36.375
+Q 5.609375 53.953125 15.125 64.078125
+Q 24.65625 74.21875 41.21875 74.21875
+Q 47.75 74.21875 53.53125 72.484375
+Q 59.328125 70.75 64.40625 67.28125
+z
+" id="DejaVuSans-67"/>
+ <path d="M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+M 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+z
+" id="DejaVuSans-98"/>
+ <path d="M 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 8.796875
+L 46.6875 54.6875
+L 56.203125 54.6875
+L 35.6875 0
+L 23.484375 0
+z
+" id="DejaVuSans-118"/>
+ <path d="M 9.8125 72.90625
+L 19.671875 72.90625
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-73"/>
+ <path d="M 37.109375 75.984375
+L 37.109375 68.5
+L 28.515625 68.5
+Q 23.6875 68.5 21.796875 66.546875
+Q 19.921875 64.59375 19.921875 59.515625
+L 19.921875 54.6875
+L 34.71875 54.6875
+L 34.71875 47.703125
+L 19.921875 47.703125
+L 19.921875 0
+L 10.890625 0
+L 10.890625 47.703125
+L 2.296875 47.703125
+L 2.296875 54.6875
+L 10.890625 54.6875
+L 10.890625 58.5
+Q 10.890625 67.625 15.140625 71.796875
+Q 19.390625 75.984375 28.609375 75.984375
+z
+" id="DejaVuSans-102"/>
+ <path d="M 11.71875 12.40625
+L 22.015625 12.40625
+L 22.015625 4
+L 14.015625 -11.625
+L 7.71875 -11.625
+L 11.71875 4
+z
+" id="DejaVuSans-44"/>
+ <path d="M 4.203125 54.6875
+L 13.1875 54.6875
+L 24.421875 12.015625
+L 35.59375 54.6875
+L 46.1875 54.6875
+L 57.421875 12.015625
+L 68.609375 54.6875
+L 77.59375 54.6875
+L 63.28125 0
+L 52.6875 0
+L 40.921875 44.828125
+L 29.109375 0
+L 18.5 0
+z
+" id="DejaVuSans-119"/>
+ </defs>
+ <g transform="translate(191.98375 33.7575)scale(0.16 -0.16)">
+ <use xlink:href="#DejaVuSans-56"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-116"/>
+ <use x="102.832031" xlink:href="#DejaVuSans-104"/>
+ <use x="166.210938" xlink:href="#DejaVuSans-45"/>
+ <use x="202.310547" xlink:href="#DejaVuSans-111"/>
+ <use x="263.492188" xlink:href="#DejaVuSans-114"/>
+ <use x="304.589844" xlink:href="#DejaVuSans-100"/>
+ <use x="368.066406" xlink:href="#DejaVuSans-101"/>
+ <use x="429.589844" xlink:href="#DejaVuSans-114"/>
+ <use x="470.703125" xlink:href="#DejaVuSans-32"/>
+ <use x="502.490234" xlink:href="#DejaVuSans-67"/>
+ <use x="572.314453" xlink:href="#DejaVuSans-104"/>
+ <use x="635.693359" xlink:href="#DejaVuSans-101"/>
+ <use x="697.216797" xlink:href="#DejaVuSans-98"/>
+ <use x="760.693359" xlink:href="#DejaVuSans-121"/>
+ <use x="819.873047" xlink:href="#DejaVuSans-115"/>
+ <use x="871.972656" xlink:href="#DejaVuSans-104"/>
+ <use x="935.351562" xlink:href="#DejaVuSans-101"/>
+ <use x="996.875" xlink:href="#DejaVuSans-118"/>
+ <use x="1056.054688" xlink:href="#DejaVuSans-32"/>
+ <use x="1087.841797" xlink:href="#DejaVuSans-116"/>
+ <use x="1127.050781" xlink:href="#DejaVuSans-121"/>
+ <use x="1186.230469" xlink:href="#DejaVuSans-112"/>
+ <use x="1249.707031" xlink:href="#DejaVuSans-101"/>
+ <use x="1311.230469" xlink:href="#DejaVuSans-32"/>
+ <use x="1343.017578" xlink:href="#DejaVuSans-73"/>
+ <use x="1372.509766" xlink:href="#DejaVuSans-32"/>
+ <use x="1404.296875" xlink:href="#DejaVuSans-102"/>
+ <use x="1439.501953" xlink:href="#DejaVuSans-105"/>
+ <use x="1467.285156" xlink:href="#DejaVuSans-108"/>
+ <use x="1495.068359" xlink:href="#DejaVuSans-116"/>
+ <use x="1534.277344" xlink:href="#DejaVuSans-101"/>
+ <use x="1595.800781" xlink:href="#DejaVuSans-114"/>
+ <use x="1636.914062" xlink:href="#DejaVuSans-44"/>
+ <use x="1668.701172" xlink:href="#DejaVuSans-32"/>
+ <use x="1700.488281" xlink:href="#DejaVuSans-108"/>
+ <use x="1728.271484" xlink:href="#DejaVuSans-111"/>
+ <use x="1789.453125" xlink:href="#DejaVuSans-119"/>
+ <use x="1871.240234" xlink:href="#DejaVuSans-112"/>
+ <use x="1934.716797" xlink:href="#DejaVuSans-97"/>
+ <use x="1995.996094" xlink:href="#DejaVuSans-115"/>
+ <use x="2048.095703" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="p105bbe0688">
+ <rect height="292.84" width="630.97" x="62.57" y="75.6"/>
+ </clipPath>
+ <clipPath id="p971d5f79aa">
+ <rect height="292.84" width="630.97" x="62.57" y="410.4"/>
+ </clipPath>
+ <clipPath id="pc2a9b52a40">
+ <rect height="292.84" width="630.97" x="62.57" y="745.2"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/docs/docs/img/chebyshev2_lowpass8.svg b/docs/docs/img/chebyshev2_lowpass8.svg
@@ -0,0 +1,3153 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Created with matplotlib (https://matplotlib.org/) -->
+<svg height="1080pt" version="1.1" viewBox="0 0 720 1080" width="720pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+ </style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 1080
+L 720 1080
+L 720 0
+L 0 0
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="axes_1">
+ <g id="patch_2">
+ <path d="M 62.57 368.44
+L 693.54 368.44
+L 693.54 75.6
+L 62.57 75.6
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_1">
+ <g id="xtick_1">
+ <g id="line2d_1">
+ <path clip-path="url(#p093e4a304d)" d="M 62.57 368.44
+L 62.57 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_2">
+ <defs>
+ <path d="M 0 0
+L 0 3.5
+" id="m1a58169807" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m1a58169807" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- 0 -->
+ <defs>
+ <path d="M 31.78125 66.40625
+Q 24.171875 66.40625 20.328125 58.90625
+Q 16.5 51.421875 16.5 36.375
+Q 16.5 21.390625 20.328125 13.890625
+Q 24.171875 6.390625 31.78125 6.390625
+Q 39.453125 6.390625 43.28125 13.890625
+Q 47.125 21.390625 47.125 36.375
+Q 47.125 51.421875 43.28125 58.90625
+Q 39.453125 66.40625 31.78125 66.40625
+z
+M 31.78125 74.21875
+Q 44.046875 74.21875 50.515625 64.515625
+Q 56.984375 54.828125 56.984375 36.375
+Q 56.984375 17.96875 50.515625 8.265625
+Q 44.046875 -1.421875 31.78125 -1.421875
+Q 19.53125 -1.421875 13.0625 8.265625
+Q 6.59375 17.96875 6.59375 36.375
+Q 6.59375 54.828125 13.0625 64.515625
+Q 19.53125 74.21875 31.78125 74.21875
+z
+" id="DejaVuSans-48"/>
+ </defs>
+ <g transform="translate(59.38875 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_2">
+ <g id="line2d_3">
+ <path clip-path="url(#p093e4a304d)" d="M 185.926794 368.44
+L 185.926794 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_4">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="185.926794" xlink:href="#m1a58169807" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- 200 -->
+ <defs>
+ <path d="M 19.1875 8.296875
+L 53.609375 8.296875
+L 53.609375 0
+L 7.328125 0
+L 7.328125 8.296875
+Q 12.9375 14.109375 22.625 23.890625
+Q 32.328125 33.6875 34.8125 36.53125
+Q 39.546875 41.84375 41.421875 45.53125
+Q 43.3125 49.21875 43.3125 52.78125
+Q 43.3125 58.59375 39.234375 62.25
+Q 35.15625 65.921875 28.609375 65.921875
+Q 23.96875 65.921875 18.8125 64.3125
+Q 13.671875 62.703125 7.8125 59.421875
+L 7.8125 69.390625
+Q 13.765625 71.78125 18.9375 73
+Q 24.125 74.21875 28.421875 74.21875
+Q 39.75 74.21875 46.484375 68.546875
+Q 53.21875 62.890625 53.21875 53.421875
+Q 53.21875 48.921875 51.53125 44.890625
+Q 49.859375 40.875 45.40625 35.40625
+Q 44.1875 33.984375 37.640625 27.21875
+Q 31.109375 20.453125 19.1875 8.296875
+z
+" id="DejaVuSans-50"/>
+ </defs>
+ <g transform="translate(176.383044 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_3">
+ <g id="line2d_5">
+ <path clip-path="url(#p093e4a304d)" d="M 309.283587 368.44
+L 309.283587 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_6">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="309.283587" xlink:href="#m1a58169807" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- 400 -->
+ <defs>
+ <path d="M 37.796875 64.3125
+L 12.890625 25.390625
+L 37.796875 25.390625
+z
+M 35.203125 72.90625
+L 47.609375 72.90625
+L 47.609375 25.390625
+L 58.015625 25.390625
+L 58.015625 17.1875
+L 47.609375 17.1875
+L 47.609375 0
+L 37.796875 0
+L 37.796875 17.1875
+L 4.890625 17.1875
+L 4.890625 26.703125
+z
+" id="DejaVuSans-52"/>
+ </defs>
+ <g transform="translate(299.739837 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-52"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_4">
+ <g id="line2d_7">
+ <path clip-path="url(#p093e4a304d)" d="M 432.640381 368.44
+L 432.640381 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_8">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="432.640381" xlink:href="#m1a58169807" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- 600 -->
+ <defs>
+ <path d="M 33.015625 40.375
+Q 26.375 40.375 22.484375 35.828125
+Q 18.609375 31.296875 18.609375 23.390625
+Q 18.609375 15.53125 22.484375 10.953125
+Q 26.375 6.390625 33.015625 6.390625
+Q 39.65625 6.390625 43.53125 10.953125
+Q 47.40625 15.53125 47.40625 23.390625
+Q 47.40625 31.296875 43.53125 35.828125
+Q 39.65625 40.375 33.015625 40.375
+z
+M 52.59375 71.296875
+L 52.59375 62.3125
+Q 48.875 64.0625 45.09375 64.984375
+Q 41.3125 65.921875 37.59375 65.921875
+Q 27.828125 65.921875 22.671875 59.328125
+Q 17.53125 52.734375 16.796875 39.40625
+Q 19.671875 43.65625 24.015625 45.921875
+Q 28.375 48.1875 33.59375 48.1875
+Q 44.578125 48.1875 50.953125 41.515625
+Q 57.328125 34.859375 57.328125 23.390625
+Q 57.328125 12.15625 50.6875 5.359375
+Q 44.046875 -1.421875 33.015625 -1.421875
+Q 20.359375 -1.421875 13.671875 8.265625
+Q 6.984375 17.96875 6.984375 36.375
+Q 6.984375 53.65625 15.1875 63.9375
+Q 23.390625 74.21875 37.203125 74.21875
+Q 40.921875 74.21875 44.703125 73.484375
+Q 48.484375 72.75 52.59375 71.296875
+z
+" id="DejaVuSans-54"/>
+ </defs>
+ <g transform="translate(423.096631 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-54"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_5">
+ <g id="line2d_9">
+ <path clip-path="url(#p093e4a304d)" d="M 555.997175 368.44
+L 555.997175 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_10">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="555.997175" xlink:href="#m1a58169807" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- 800 -->
+ <defs>
+ <path d="M 31.78125 34.625
+Q 24.75 34.625 20.71875 30.859375
+Q 16.703125 27.09375 16.703125 20.515625
+Q 16.703125 13.921875 20.71875 10.15625
+Q 24.75 6.390625 31.78125 6.390625
+Q 38.8125 6.390625 42.859375 10.171875
+Q 46.921875 13.96875 46.921875 20.515625
+Q 46.921875 27.09375 42.890625 30.859375
+Q 38.875 34.625 31.78125 34.625
+z
+M 21.921875 38.8125
+Q 15.578125 40.375 12.03125 44.71875
+Q 8.5 49.078125 8.5 55.328125
+Q 8.5 64.0625 14.71875 69.140625
+Q 20.953125 74.21875 31.78125 74.21875
+Q 42.671875 74.21875 48.875 69.140625
+Q 55.078125 64.0625 55.078125 55.328125
+Q 55.078125 49.078125 51.53125 44.71875
+Q 48 40.375 41.703125 38.8125
+Q 48.828125 37.15625 52.796875 32.3125
+Q 56.78125 27.484375 56.78125 20.515625
+Q 56.78125 9.90625 50.3125 4.234375
+Q 43.84375 -1.421875 31.78125 -1.421875
+Q 19.734375 -1.421875 13.25 4.234375
+Q 6.78125 9.90625 6.78125 20.515625
+Q 6.78125 27.484375 10.78125 32.3125
+Q 14.796875 37.15625 21.921875 38.8125
+z
+M 18.3125 54.390625
+Q 18.3125 48.734375 21.84375 45.5625
+Q 25.390625 42.390625 31.78125 42.390625
+Q 38.140625 42.390625 41.71875 45.5625
+Q 45.3125 48.734375 45.3125 54.390625
+Q 45.3125 60.0625 41.71875 63.234375
+Q 38.140625 66.40625 31.78125 66.40625
+Q 25.390625 66.40625 21.84375 63.234375
+Q 18.3125 60.0625 18.3125 54.390625
+z
+" id="DejaVuSans-56"/>
+ </defs>
+ <g transform="translate(546.453425 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-56"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_6">
+ <g id="line2d_11">
+ <path clip-path="url(#p093e4a304d)" d="M 679.353969 368.44
+L 679.353969 75.6
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_12">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="679.353969" xlink:href="#m1a58169807" y="368.44"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- 1000 -->
+ <defs>
+ <path d="M 12.40625 8.296875
+L 28.515625 8.296875
+L 28.515625 63.921875
+L 10.984375 60.40625
+L 10.984375 69.390625
+L 28.421875 72.90625
+L 38.28125 72.90625
+L 38.28125 8.296875
+L 54.390625 8.296875
+L 54.390625 0
+L 12.40625 0
+z
+" id="DejaVuSans-49"/>
+ </defs>
+ <g transform="translate(666.628969 383.038438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_7">
+ <!-- Samples -->
+ <defs>
+ <path d="M 53.515625 70.515625
+L 53.515625 60.890625
+Q 47.90625 63.578125 42.921875 64.890625
+Q 37.9375 66.21875 33.296875 66.21875
+Q 25.25 66.21875 20.875 63.09375
+Q 16.5 59.96875 16.5 54.203125
+Q 16.5 49.359375 19.40625 46.890625
+Q 22.3125 44.4375 30.421875 42.921875
+L 36.375 41.703125
+Q 47.40625 39.59375 52.65625 34.296875
+Q 57.90625 29 57.90625 20.125
+Q 57.90625 9.515625 50.796875 4.046875
+Q 43.703125 -1.421875 29.984375 -1.421875
+Q 24.8125 -1.421875 18.96875 -0.25
+Q 13.140625 0.921875 6.890625 3.21875
+L 6.890625 13.375
+Q 12.890625 10.015625 18.65625 8.296875
+Q 24.421875 6.59375 29.984375 6.59375
+Q 38.421875 6.59375 43.015625 9.90625
+Q 47.609375 13.234375 47.609375 19.390625
+Q 47.609375 24.75 44.3125 27.78125
+Q 41.015625 30.8125 33.5 32.328125
+L 27.484375 33.5
+Q 16.453125 35.6875 11.515625 40.375
+Q 6.59375 45.0625 6.59375 53.421875
+Q 6.59375 63.09375 13.40625 68.65625
+Q 20.21875 74.21875 32.171875 74.21875
+Q 37.3125 74.21875 42.625 73.28125
+Q 47.953125 72.359375 53.515625 70.515625
+z
+" id="DejaVuSans-83"/>
+ <path d="M 34.28125 27.484375
+Q 23.390625 27.484375 19.1875 25
+Q 14.984375 22.515625 14.984375 16.5
+Q 14.984375 11.71875 18.140625 8.90625
+Q 21.296875 6.109375 26.703125 6.109375
+Q 34.1875 6.109375 38.703125 11.40625
+Q 43.21875 16.703125 43.21875 25.484375
+L 43.21875 27.484375
+z
+M 52.203125 31.203125
+L 52.203125 0
+L 43.21875 0
+L 43.21875 8.296875
+Q 40.140625 3.328125 35.546875 0.953125
+Q 30.953125 -1.421875 24.3125 -1.421875
+Q 15.921875 -1.421875 10.953125 3.296875
+Q 6 8.015625 6 15.921875
+Q 6 25.140625 12.171875 29.828125
+Q 18.359375 34.515625 30.609375 34.515625
+L 43.21875 34.515625
+L 43.21875 35.40625
+Q 43.21875 41.609375 39.140625 45
+Q 35.0625 48.390625 27.6875 48.390625
+Q 23 48.390625 18.546875 47.265625
+Q 14.109375 46.140625 10.015625 43.890625
+L 10.015625 52.203125
+Q 14.9375 54.109375 19.578125 55.046875
+Q 24.21875 56 28.609375 56
+Q 40.484375 56 46.34375 49.84375
+Q 52.203125 43.703125 52.203125 31.203125
+z
+" id="DejaVuSans-97"/>
+ <path d="M 52 44.1875
+Q 55.375 50.25 60.0625 53.125
+Q 64.75 56 71.09375 56
+Q 79.640625 56 84.28125 50.015625
+Q 88.921875 44.046875 88.921875 33.015625
+L 88.921875 0
+L 79.890625 0
+L 79.890625 32.71875
+Q 79.890625 40.578125 77.09375 44.375
+Q 74.3125 48.1875 68.609375 48.1875
+Q 61.625 48.1875 57.5625 43.546875
+Q 53.515625 38.921875 53.515625 30.90625
+L 53.515625 0
+L 44.484375 0
+L 44.484375 32.71875
+Q 44.484375 40.625 41.703125 44.40625
+Q 38.921875 48.1875 33.109375 48.1875
+Q 26.21875 48.1875 22.15625 43.53125
+Q 18.109375 38.875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.1875 51.21875 25.484375 53.609375
+Q 29.78125 56 35.6875 56
+Q 41.65625 56 45.828125 52.96875
+Q 50 49.953125 52 44.1875
+z
+" id="DejaVuSans-109"/>
+ <path d="M 18.109375 8.203125
+L 18.109375 -20.796875
+L 9.078125 -20.796875
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+z
+M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+" id="DejaVuSans-112"/>
+ <path d="M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 0
+L 9.421875 0
+z
+" id="DejaVuSans-108"/>
+ <path d="M 56.203125 29.59375
+L 56.203125 25.203125
+L 14.890625 25.203125
+Q 15.484375 15.921875 20.484375 11.0625
+Q 25.484375 6.203125 34.421875 6.203125
+Q 39.59375 6.203125 44.453125 7.46875
+Q 49.3125 8.734375 54.109375 11.28125
+L 54.109375 2.78125
+Q 49.265625 0.734375 44.1875 -0.34375
+Q 39.109375 -1.421875 33.890625 -1.421875
+Q 20.796875 -1.421875 13.15625 6.1875
+Q 5.515625 13.8125 5.515625 26.8125
+Q 5.515625 40.234375 12.765625 48.109375
+Q 20.015625 56 32.328125 56
+Q 43.359375 56 49.78125 48.890625
+Q 56.203125 41.796875 56.203125 29.59375
+z
+M 47.21875 32.234375
+Q 47.125 39.59375 43.09375 43.984375
+Q 39.0625 48.390625 32.421875 48.390625
+Q 24.90625 48.390625 20.390625 44.140625
+Q 15.875 39.890625 15.1875 32.171875
+z
+" id="DejaVuSans-101"/>
+ <path d="M 44.28125 53.078125
+L 44.28125 44.578125
+Q 40.484375 46.53125 36.375 47.5
+Q 32.28125 48.484375 27.875 48.484375
+Q 21.1875 48.484375 17.84375 46.4375
+Q 14.5 44.390625 14.5 40.28125
+Q 14.5 37.15625 16.890625 35.375
+Q 19.28125 33.59375 26.515625 31.984375
+L 29.59375 31.296875
+Q 39.15625 29.25 43.1875 25.515625
+Q 47.21875 21.78125 47.21875 15.09375
+Q 47.21875 7.46875 41.1875 3.015625
+Q 35.15625 -1.421875 24.609375 -1.421875
+Q 20.21875 -1.421875 15.453125 -0.5625
+Q 10.6875 0.296875 5.421875 2
+L 5.421875 11.28125
+Q 10.40625 8.6875 15.234375 7.390625
+Q 20.0625 6.109375 24.8125 6.109375
+Q 31.15625 6.109375 34.5625 8.28125
+Q 37.984375 10.453125 37.984375 14.40625
+Q 37.984375 18.0625 35.515625 20.015625
+Q 33.0625 21.96875 24.703125 23.78125
+L 21.578125 24.515625
+Q 13.234375 26.265625 9.515625 29.90625
+Q 5.8125 33.546875 5.8125 39.890625
+Q 5.8125 47.609375 11.28125 51.796875
+Q 16.75 56 26.8125 56
+Q 31.78125 56 36.171875 55.265625
+Q 40.578125 54.546875 44.28125 53.078125
+z
+" id="DejaVuSans-115"/>
+ </defs>
+ <g transform="translate(356.701875 396.716563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-83"/>
+ <use x="63.476562" xlink:href="#DejaVuSans-97"/>
+ <use x="124.755859" xlink:href="#DejaVuSans-109"/>
+ <use x="222.167969" xlink:href="#DejaVuSans-112"/>
+ <use x="285.644531" xlink:href="#DejaVuSans-108"/>
+ <use x="313.427734" xlink:href="#DejaVuSans-101"/>
+ <use x="374.951172" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_2">
+ <g id="ytick_1">
+ <g id="line2d_13">
+ <path clip-path="url(#p093e4a304d)" d="M 62.57 329.445351
+L 693.54 329.445351
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_14">
+ <defs>
+ <path d="M 0 0
+L -3.5 0
+" id="m0747facce7" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="329.445351"/>
+ </g>
+ </g>
+ <g id="text_8">
+ <!-- −0.01 -->
+ <defs>
+ <path d="M 10.59375 35.5
+L 73.1875 35.5
+L 73.1875 27.203125
+L 10.59375 27.203125
+z
+" id="DejaVuSans-8722"/>
+ <path d="M 10.6875 12.40625
+L 21 12.40625
+L 21 0
+L 10.6875 0
+z
+" id="DejaVuSans-46"/>
+ </defs>
+ <g transform="translate(24.924688 333.24457)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-48"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-46"/>
+ <use x="179.199219" xlink:href="#DejaVuSans-48"/>
+ <use x="242.822266" xlink:href="#DejaVuSans-49"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_2">
+ <g id="line2d_15">
+ <path clip-path="url(#p093e4a304d)" d="M 62.57 288.431442
+L 693.54 288.431442
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_16">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="288.431442"/>
+ </g>
+ </g>
+ <g id="text_9">
+ <!-- 0.00 -->
+ <g transform="translate(33.304375 292.23066)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_3">
+ <g id="line2d_17">
+ <path clip-path="url(#p093e4a304d)" d="M 62.57 247.417532
+L 693.54 247.417532
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_18">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="247.417532"/>
+ </g>
+ </g>
+ <g id="text_10">
+ <!-- 0.01 -->
+ <g transform="translate(33.304375 251.216751)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-49"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_4">
+ <g id="line2d_19">
+ <path clip-path="url(#p093e4a304d)" d="M 62.57 206.403623
+L 693.54 206.403623
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_20">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="206.403623"/>
+ </g>
+ </g>
+ <g id="text_11">
+ <!-- 0.02 -->
+ <g transform="translate(33.304375 210.202842)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-50"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_5">
+ <g id="line2d_21">
+ <path clip-path="url(#p093e4a304d)" d="M 62.57 165.389713
+L 693.54 165.389713
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_22">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="165.389713"/>
+ </g>
+ </g>
+ <g id="text_12">
+ <!-- 0.03 -->
+ <defs>
+ <path d="M 40.578125 39.3125
+Q 47.65625 37.796875 51.625 33
+Q 55.609375 28.21875 55.609375 21.1875
+Q 55.609375 10.40625 48.1875 4.484375
+Q 40.765625 -1.421875 27.09375 -1.421875
+Q 22.515625 -1.421875 17.65625 -0.515625
+Q 12.796875 0.390625 7.625 2.203125
+L 7.625 11.71875
+Q 11.71875 9.328125 16.59375 8.109375
+Q 21.484375 6.890625 26.8125 6.890625
+Q 36.078125 6.890625 40.9375 10.546875
+Q 45.796875 14.203125 45.796875 21.1875
+Q 45.796875 27.640625 41.28125 31.265625
+Q 36.765625 34.90625 28.71875 34.90625
+L 20.21875 34.90625
+L 20.21875 43.015625
+L 29.109375 43.015625
+Q 36.375 43.015625 40.234375 45.921875
+Q 44.09375 48.828125 44.09375 54.296875
+Q 44.09375 59.90625 40.109375 62.90625
+Q 36.140625 65.921875 28.71875 65.921875
+Q 24.65625 65.921875 20.015625 65.03125
+Q 15.375 64.15625 9.8125 62.3125
+L 9.8125 71.09375
+Q 15.4375 72.65625 20.34375 73.4375
+Q 25.25 74.21875 29.59375 74.21875
+Q 40.828125 74.21875 47.359375 69.109375
+Q 53.90625 64.015625 53.90625 55.328125
+Q 53.90625 49.265625 50.4375 45.09375
+Q 46.96875 40.921875 40.578125 39.3125
+z
+" id="DejaVuSans-51"/>
+ </defs>
+ <g transform="translate(33.304375 169.188932)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-51"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_6">
+ <g id="line2d_23">
+ <path clip-path="url(#p093e4a304d)" d="M 62.57 124.375804
+L 693.54 124.375804
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_24">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="124.375804"/>
+ </g>
+ </g>
+ <g id="text_13">
+ <!-- 0.04 -->
+ <g transform="translate(33.304375 128.175023)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-52"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_7">
+ <g id="line2d_25">
+ <path clip-path="url(#p093e4a304d)" d="M 62.57 83.361895
+L 693.54 83.361895
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_26">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="83.361895"/>
+ </g>
+ </g>
+ <g id="text_14">
+ <!-- 0.05 -->
+ <defs>
+ <path d="M 10.796875 72.90625
+L 49.515625 72.90625
+L 49.515625 64.59375
+L 19.828125 64.59375
+L 19.828125 46.734375
+Q 21.96875 47.46875 24.109375 47.828125
+Q 26.265625 48.1875 28.421875 48.1875
+Q 40.625 48.1875 47.75 41.5
+Q 54.890625 34.8125 54.890625 23.390625
+Q 54.890625 11.625 47.5625 5.09375
+Q 40.234375 -1.421875 26.90625 -1.421875
+Q 22.3125 -1.421875 17.546875 -0.640625
+Q 12.796875 0.140625 7.71875 1.703125
+L 7.71875 11.625
+Q 12.109375 9.234375 16.796875 8.0625
+Q 21.484375 6.890625 26.703125 6.890625
+Q 35.15625 6.890625 40.078125 11.328125
+Q 45.015625 15.765625 45.015625 23.390625
+Q 45.015625 31 40.078125 35.4375
+Q 35.15625 39.890625 26.703125 39.890625
+Q 22.75 39.890625 18.8125 39.015625
+Q 14.890625 38.140625 10.796875 36.28125
+z
+" id="DejaVuSans-53"/>
+ </defs>
+ <g transform="translate(33.304375 87.161113)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="159.033203" xlink:href="#DejaVuSans-53"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_15">
+ <!-- Amplitude -->
+ <defs>
+ <path d="M 34.1875 63.1875
+L 20.796875 26.90625
+L 47.609375 26.90625
+z
+M 28.609375 72.90625
+L 39.796875 72.90625
+L 67.578125 0
+L 57.328125 0
+L 50.6875 18.703125
+L 17.828125 18.703125
+L 11.1875 0
+L 0.78125 0
+z
+" id="DejaVuSans-65"/>
+ <path d="M 9.421875 54.6875
+L 18.40625 54.6875
+L 18.40625 0
+L 9.421875 0
+z
+M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 64.59375
+L 9.421875 64.59375
+z
+" id="DejaVuSans-105"/>
+ <path d="M 18.3125 70.21875
+L 18.3125 54.6875
+L 36.8125 54.6875
+L 36.8125 47.703125
+L 18.3125 47.703125
+L 18.3125 18.015625
+Q 18.3125 11.328125 20.140625 9.421875
+Q 21.96875 7.515625 27.59375 7.515625
+L 36.8125 7.515625
+L 36.8125 0
+L 27.59375 0
+Q 17.1875 0 13.234375 3.875
+Q 9.28125 7.765625 9.28125 18.015625
+L 9.28125 47.703125
+L 2.6875 47.703125
+L 2.6875 54.6875
+L 9.28125 54.6875
+L 9.28125 70.21875
+z
+" id="DejaVuSans-116"/>
+ <path d="M 8.5 21.578125
+L 8.5 54.6875
+L 17.484375 54.6875
+L 17.484375 21.921875
+Q 17.484375 14.15625 20.5 10.265625
+Q 23.53125 6.390625 29.59375 6.390625
+Q 36.859375 6.390625 41.078125 11.03125
+Q 45.3125 15.671875 45.3125 23.6875
+L 45.3125 54.6875
+L 54.296875 54.6875
+L 54.296875 0
+L 45.3125 0
+L 45.3125 8.40625
+Q 42.046875 3.421875 37.71875 1
+Q 33.40625 -1.421875 27.6875 -1.421875
+Q 18.265625 -1.421875 13.375 4.4375
+Q 8.5 10.296875 8.5 21.578125
+z
+M 31.109375 56
+z
+" id="DejaVuSans-117"/>
+ <path d="M 45.40625 46.390625
+L 45.40625 75.984375
+L 54.390625 75.984375
+L 54.390625 0
+L 45.40625 0
+L 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+z
+M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+" id="DejaVuSans-100"/>
+ </defs>
+ <g transform="translate(18.845 247.642656)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-65"/>
+ <use x="68.408203" xlink:href="#DejaVuSans-109"/>
+ <use x="165.820312" xlink:href="#DejaVuSans-112"/>
+ <use x="229.296875" xlink:href="#DejaVuSans-108"/>
+ <use x="257.080078" xlink:href="#DejaVuSans-105"/>
+ <use x="284.863281" xlink:href="#DejaVuSans-116"/>
+ <use x="324.072266" xlink:href="#DejaVuSans-117"/>
+ <use x="387.451172" xlink:href="#DejaVuSans-100"/>
+ <use x="450.927734" xlink:href="#DejaVuSans-101"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_27">
+ <path clip-path="url(#p093e4a304d)" d="M 62.57 287.964827
+L 63.186784 287.95958
+L 65.037136 286.006833
+L 65.65392 284.983496
+L 66.270704 283.61939
+L 66.887488 281.869245
+L 67.504272 279.691296
+L 68.121056 277.041377
+L 69.354624 270.13573
+L 70.588192 260.78314
+L 71.82176 248.708753
+L 73.055327 233.830817
+L 74.288895 216.328818
+L 76.139247 186.279305
+L 79.223167 133.928118
+L 80.456735 115.898682
+L 81.690303 101.653867
+L 82.307087 96.370304
+L 82.923871 92.510993
+L 83.540655 90.201596
+L 84.157439 89.544762
+L 84.774223 90.616825
+L 85.391007 93.465051
+L 86.007791 98.105525
+L 86.624575 104.521747
+L 87.241359 112.664018
+L 88.474927 133.76383
+L 89.708495 160.370735
+L 91.558847 207.297596
+L 94.642766 288.499475
+L 95.876334 316.392111
+L 97.109902 339.198375
+L 97.726686 348.325921
+L 98.34347 355.80026
+L 98.960254 361.560034
+L 99.577038 365.577417
+L 100.193822 367.858011
+L 100.810606 368.44
+L 101.42739 367.392602
+L 102.044174 364.813869
+L 102.660958 360.827906
+L 103.277742 355.581587
+L 104.51131 341.986752
+L 106.361662 316.690803
+L 108.828798 282.032159
+L 110.062366 267.465067
+L 111.295934 256.146501
+L 111.912717 251.915121
+L 112.529501 248.700253
+L 113.146285 246.520536
+L 113.763069 245.371443
+L 114.379853 245.226407
+L 114.996637 246.038377
+L 115.613421 247.741768
+L 116.230205 250.254728
+L 116.846989 253.481667
+L 118.080557 261.642888
+L 119.930909 276.369625
+L 121.781261 291.212533
+L 123.014829 299.758767
+L 124.248397 306.474687
+L 124.865181 309.011236
+L 125.481965 310.957077
+L 126.098749 312.298145
+L 126.715533 313.034582
+L 127.332317 313.180049
+L 127.949101 312.760766
+L 128.565885 311.814318
+L 129.182669 310.388263
+L 129.799453 308.538578
+L 131.033021 303.824271
+L 132.883372 295.270061
+L 134.733724 286.634221
+L 135.967292 281.668773
+L 137.20086 277.780375
+L 137.817644 276.319437
+L 138.434428 275.205779
+L 139.051212 274.447377
+L 139.667996 274.043779
+L 140.28478 273.98653
+L 140.901564 274.259757
+L 141.518348 274.840888
+L 142.135132 275.701498
+L 143.3687 278.123826
+L 144.602268 281.219036
+L 148.302972 291.213787
+L 149.53654 293.797928
+L 150.770108 295.659921
+L 151.386891 296.287414
+L 152.003675 296.705398
+L 152.620459 296.914727
+L 153.237243 296.920952
+L 153.854027 296.733959
+L 154.470811 296.367534
+L 155.704379 295.16795
+L 156.937947 293.490101
+L 159.405083 289.48154
+L 161.255435 286.659456
+L 162.489003 285.164276
+L 163.722571 284.100964
+L 164.956139 283.521723
+L 165.572923 283.416818
+L 166.189707 283.431078
+L 167.423275 283.790048
+L 168.656843 284.523771
+L 169.890411 285.53154
+L 174.824682 290.017732
+L 176.05825 290.758707
+L 177.291818 291.223283
+L 178.525386 291.397046
+L 179.758954 291.292607
+L 180.992522 290.945897
+L 182.842874 290.092669
+L 187.777146 287.453935
+L 189.010714 287.028301
+L 190.244282 286.767269
+L 191.477849 286.678052
+L 192.711417 286.752018
+L 194.561769 287.117473
+L 197.028905 287.89311
+L 200.112825 288.877272
+L 201.963177 289.276558
+L 203.813529 289.457745
+L 205.663881 289.416745
+L 208.131017 289.088586
+L 214.91564 287.922958
+L 217.382776 287.819444
+L 219.849912 287.935596
+L 224.784184 288.481802
+L 228.484888 288.764261
+L 231.568807 288.770021
+L 235.886295 288.521838
+L 241.437351 288.232678
+L 245.754839 288.264028
+L 257.473734 288.547515
+L 274.743685 288.417054
+L 285.229013 288.459688
+L 301.88218 288.433441
+L 325.319971 288.428183
+L 389.465503 288.431693
+L 693.54 288.431442
+L 693.54 288.431442
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_3">
+ <path d="M 62.57 368.44
+L 62.57 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_4">
+ <path d="M 693.54 368.44
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_5">
+ <path d="M 62.57 368.44
+L 693.54 368.44
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_6">
+ <path d="M 62.57 75.6
+L 693.54 75.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_2">
+ <g id="patch_7">
+ <path d="M 62.57 703.24
+L 693.54 703.24
+L 693.54 410.4
+L 62.57 410.4
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_3">
+ <g id="xtick_7">
+ <g id="line2d_28">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 62.57 703.24
+L 62.57 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_29">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_16">
+ <!-- 10Hz -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 19.671875 72.90625
+L 19.671875 43.015625
+L 55.515625 43.015625
+L 55.515625 72.90625
+L 65.375 72.90625
+L 65.375 0
+L 55.515625 0
+L 55.515625 34.71875
+L 19.671875 34.71875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-72"/>
+ <path d="M 5.515625 54.6875
+L 48.1875 54.6875
+L 48.1875 46.484375
+L 14.40625 7.171875
+L 48.1875 7.171875
+L 48.1875 0
+L 4.296875 0
+L 4.296875 8.203125
+L 38.09375 47.515625
+L 5.515625 47.515625
+z
+" id="DejaVuSans-122"/>
+ </defs>
+ <g transform="translate(49.823125 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_8">
+ <g id="line2d_30">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 62.57 703.24
+L 62.57 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_31">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_9">
+ <g id="line2d_32">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 118.76202 703.24
+L 118.76202 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_33">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="118.76202" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_10">
+ <g id="line2d_34">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 151.632244 703.24
+L 151.632244 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_35">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="151.632244" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_11">
+ <g id="line2d_36">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 174.954039 703.24
+L 174.954039 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_37">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="174.954039" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_12">
+ <g id="line2d_38">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 193.043829 703.24
+L 193.043829 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_39">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="193.043829" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_13">
+ <g id="line2d_40">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 207.824264 703.24
+L 207.824264 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_41">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="207.824264" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_14">
+ <g id="line2d_42">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 220.320943 703.24
+L 220.320943 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_43">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="220.320943" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_15">
+ <g id="line2d_44">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 231.146059 703.24
+L 231.146059 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_45">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="231.146059" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_16">
+ <g id="line2d_46">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 240.694488 703.24
+L 240.694488 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_47">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="240.694488" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_17">
+ <g id="line2d_48">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 249.235849 703.24
+L 249.235849 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_49">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_17">
+ <!-- 100Hz -->
+ <g transform="translate(233.307724 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_18">
+ <g id="line2d_50">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 249.235849 703.24
+L 249.235849 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_51">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_19">
+ <g id="line2d_52">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 305.427868 703.24
+L 305.427868 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_53">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="305.427868" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_20">
+ <g id="line2d_54">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 338.298093 703.24
+L 338.298093 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_55">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="338.298093" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_21">
+ <g id="line2d_56">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 361.619888 703.24
+L 361.619888 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_57">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="361.619888" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_22">
+ <g id="line2d_58">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 379.709678 703.24
+L 379.709678 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_59">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="379.709678" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_23">
+ <g id="line2d_60">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 394.490112 703.24
+L 394.490112 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_61">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="394.490112" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_24">
+ <g id="line2d_62">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 406.986791 703.24
+L 406.986791 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_63">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="406.986791" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_25">
+ <g id="line2d_64">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 417.811907 703.24
+L 417.811907 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_65">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="417.811907" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_26">
+ <g id="line2d_66">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 427.360336 703.24
+L 427.360336 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_67">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="427.360336" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_27">
+ <g id="line2d_68">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 435.901697 703.24
+L 435.901697 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_69">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_18">
+ <!-- 1kHz -->
+ <defs>
+ <path d="M 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 31.109375
+L 44.921875 54.6875
+L 56.390625 54.6875
+L 27.390625 29.109375
+L 57.625 0
+L 45.90625 0
+L 18.109375 26.703125
+L 18.109375 0
+L 9.078125 0
+z
+" id="DejaVuSans-107"/>
+ </defs>
+ <g transform="translate(423.44076 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_28">
+ <g id="line2d_70">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 435.901697 703.24
+L 435.901697 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_71">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_29">
+ <g id="line2d_72">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 492.093717 703.24
+L 492.093717 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_73">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="492.093717" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_30">
+ <g id="line2d_74">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 524.963941 703.24
+L 524.963941 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_75">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.963941" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_31">
+ <g id="line2d_76">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 548.285736 703.24
+L 548.285736 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_77">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="548.285736" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_32">
+ <g id="line2d_78">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 566.375526 703.24
+L 566.375526 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_79">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="566.375526" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_33">
+ <g id="line2d_80">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 581.155961 703.24
+L 581.155961 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_81">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="581.155961" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_34">
+ <g id="line2d_82">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 593.65264 703.24
+L 593.65264 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_83">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.65264" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_35">
+ <g id="line2d_84">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 604.477756 703.24
+L 604.477756 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_85">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.477756" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_36">
+ <g id="line2d_86">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 614.026185 703.24
+L 614.026185 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_87">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="614.026185" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_37">
+ <g id="line2d_88">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 622.567546 703.24
+L 622.567546 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_89">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_19">
+ <!-- 10kHz -->
+ <g transform="translate(606.925358 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_38">
+ <g id="line2d_90">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 622.567546 703.24
+L 622.567546 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_91">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_39">
+ <g id="line2d_92">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 678.759566 703.24
+L 678.759566 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_93">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.759566" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_40">
+ <g id="line2d_94">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_95">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#m1a58169807" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_20">
+ <!-- 24kHz -->
+ <g transform="translate(677.897812 717.838438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_21">
+ <!-- Frequency (Hz) -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 51.703125 72.90625
+L 51.703125 64.59375
+L 19.671875 64.59375
+L 19.671875 43.109375
+L 48.578125 43.109375
+L 48.578125 34.8125
+L 19.671875 34.8125
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-70"/>
+ <path d="M 41.109375 46.296875
+Q 39.59375 47.171875 37.8125 47.578125
+Q 36.03125 48 33.890625 48
+Q 26.265625 48 22.1875 43.046875
+Q 18.109375 38.09375 18.109375 28.8125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 20.953125 51.171875 25.484375 53.578125
+Q 30.03125 56 36.53125 56
+Q 37.453125 56 38.578125 55.875
+Q 39.703125 55.765625 41.0625 55.515625
+z
+" id="DejaVuSans-114"/>
+ <path d="M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+M 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+L 45.40625 54.6875
+L 54.390625 54.6875
+L 54.390625 -20.796875
+L 45.40625 -20.796875
+z
+" id="DejaVuSans-113"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-110"/>
+ <path d="M 48.78125 52.59375
+L 48.78125 44.1875
+Q 44.96875 46.296875 41.140625 47.34375
+Q 37.3125 48.390625 33.40625 48.390625
+Q 24.65625 48.390625 19.8125 42.84375
+Q 14.984375 37.3125 14.984375 27.296875
+Q 14.984375 17.28125 19.8125 11.734375
+Q 24.65625 6.203125 33.40625 6.203125
+Q 37.3125 6.203125 41.140625 7.25
+Q 44.96875 8.296875 48.78125 10.40625
+L 48.78125 2.09375
+Q 45.015625 0.34375 40.984375 -0.53125
+Q 36.96875 -1.421875 32.421875 -1.421875
+Q 20.0625 -1.421875 12.78125 6.34375
+Q 5.515625 14.109375 5.515625 27.296875
+Q 5.515625 40.671875 12.859375 48.328125
+Q 20.21875 56 33.015625 56
+Q 37.15625 56 41.109375 55.140625
+Q 45.0625 54.296875 48.78125 52.59375
+z
+" id="DejaVuSans-99"/>
+ <path d="M 32.171875 -5.078125
+Q 28.375 -14.84375 24.75 -17.8125
+Q 21.140625 -20.796875 15.09375 -20.796875
+L 7.90625 -20.796875
+L 7.90625 -13.28125
+L 13.1875 -13.28125
+Q 16.890625 -13.28125 18.9375 -11.515625
+Q 21 -9.765625 23.484375 -3.21875
+L 25.09375 0.875
+L 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 11.921875
+L 46.6875 54.6875
+L 56.203125 54.6875
+z
+" id="DejaVuSans-121"/>
+ <path id="DejaVuSans-32"/>
+ <path d="M 31 75.875
+Q 24.46875 64.65625 21.28125 53.65625
+Q 18.109375 42.671875 18.109375 31.390625
+Q 18.109375 20.125 21.3125 9.0625
+Q 24.515625 -2 31 -13.1875
+L 23.1875 -13.1875
+Q 15.875 -1.703125 12.234375 9.375
+Q 8.59375 20.453125 8.59375 31.390625
+Q 8.59375 42.28125 12.203125 53.3125
+Q 15.828125 64.359375 23.1875 75.875
+z
+" id="DejaVuSans-40"/>
+ <path d="M 8.015625 75.875
+L 15.828125 75.875
+Q 23.140625 64.359375 26.78125 53.3125
+Q 30.421875 42.28125 30.421875 31.390625
+Q 30.421875 20.453125 26.78125 9.375
+Q 23.140625 -1.703125 15.828125 -13.1875
+L 8.015625 -13.1875
+Q 14.5 -2 17.703125 9.0625
+Q 20.90625 20.125 20.90625 31.390625
+Q 20.90625 42.671875 17.703125 53.65625
+Q 14.5 64.65625 8.015625 75.875
+z
+" id="DejaVuSans-41"/>
+ </defs>
+ <g transform="translate(339.882344 731.516563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_4">
+ <g id="ytick_8">
+ <g id="line2d_96">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 62.57 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_97">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="703.24"/>
+ </g>
+ </g>
+ <g id="text_22">
+ <!-- −160 -->
+ <g transform="translate(28.102813 707.039219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-54"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_9">
+ <g id="line2d_98">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 62.57 668.788235
+L 693.54 668.788235
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_99">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="668.788235"/>
+ </g>
+ </g>
+ <g id="text_23">
+ <!-- −140 -->
+ <g transform="translate(28.102813 672.587454)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-52"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_10">
+ <g id="line2d_100">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 62.57 634.336471
+L 693.54 634.336471
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_101">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="634.336471"/>
+ </g>
+ </g>
+ <g id="text_24">
+ <!-- −120 -->
+ <g transform="translate(28.102813 638.135689)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-50"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_11">
+ <g id="line2d_102">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 62.57 599.884706
+L 693.54 599.884706
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_103">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="599.884706"/>
+ </g>
+ </g>
+ <g id="text_25">
+ <!-- −100 -->
+ <g transform="translate(28.102813 603.683925)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_12">
+ <g id="line2d_104">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 62.57 565.432941
+L 693.54 565.432941
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_105">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="565.432941"/>
+ </g>
+ </g>
+ <g id="text_26">
+ <!-- −80 -->
+ <g transform="translate(34.465313 569.23216)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-56"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_13">
+ <g id="line2d_106">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 62.57 530.981176
+L 693.54 530.981176
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_107">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="530.981176"/>
+ </g>
+ </g>
+ <g id="text_27">
+ <!-- −60 -->
+ <g transform="translate(34.465313 534.780395)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-54"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_14">
+ <g id="line2d_108">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 62.57 496.529412
+L 693.54 496.529412
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_109">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="496.529412"/>
+ </g>
+ </g>
+ <g id="text_28">
+ <!-- −40 -->
+ <g transform="translate(34.465313 500.328631)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-52"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_15">
+ <g id="line2d_110">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 62.57 462.077647
+L 693.54 462.077647
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_111">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="462.077647"/>
+ </g>
+ </g>
+ <g id="text_29">
+ <!-- −20 -->
+ <g transform="translate(34.465313 465.876866)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_16">
+ <g id="line2d_112">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M 62.57 427.625882
+L 693.54 427.625882
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_113">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="427.625882"/>
+ </g>
+ </g>
+ <g id="text_30">
+ <!-- 0 -->
+ <g transform="translate(49.2075 431.425101)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_31">
+ <!-- Gain (dB) -->
+ <defs>
+ <path d="M 59.515625 10.40625
+L 59.515625 29.984375
+L 43.40625 29.984375
+L 43.40625 38.09375
+L 69.28125 38.09375
+L 69.28125 6.78125
+Q 63.578125 2.734375 56.6875 0.65625
+Q 49.8125 -1.421875 42 -1.421875
+Q 24.90625 -1.421875 15.25 8.5625
+Q 5.609375 18.5625 5.609375 36.375
+Q 5.609375 54.25 15.25 64.234375
+Q 24.90625 74.21875 42 74.21875
+Q 49.125 74.21875 55.546875 72.453125
+Q 61.96875 70.703125 67.390625 67.28125
+L 67.390625 56.78125
+Q 61.921875 61.421875 55.765625 63.765625
+Q 49.609375 66.109375 42.828125 66.109375
+Q 29.4375 66.109375 22.71875 58.640625
+Q 16.015625 51.171875 16.015625 36.375
+Q 16.015625 21.625 22.71875 14.15625
+Q 29.4375 6.6875 42.828125 6.6875
+Q 48.046875 6.6875 52.140625 7.59375
+Q 56.25 8.5 59.515625 10.40625
+z
+" id="DejaVuSans-71"/>
+ <path d="M 19.671875 34.8125
+L 19.671875 8.109375
+L 35.5 8.109375
+Q 43.453125 8.109375 47.28125 11.40625
+Q 51.125 14.703125 51.125 21.484375
+Q 51.125 28.328125 47.28125 31.5625
+Q 43.453125 34.8125 35.5 34.8125
+z
+M 19.671875 64.796875
+L 19.671875 42.828125
+L 34.28125 42.828125
+Q 41.5 42.828125 45.03125 45.53125
+Q 48.578125 48.25 48.578125 53.8125
+Q 48.578125 59.328125 45.03125 62.0625
+Q 41.5 64.796875 34.28125 64.796875
+z
+M 9.8125 72.90625
+L 35.015625 72.90625
+Q 46.296875 72.90625 52.390625 68.21875
+Q 58.5 63.53125 58.5 54.890625
+Q 58.5 48.1875 55.375 44.234375
+Q 52.25 40.28125 46.1875 39.3125
+Q 53.46875 37.75 57.5 32.78125
+Q 61.53125 27.828125 61.53125 20.40625
+Q 61.53125 10.640625 54.890625 5.3125
+Q 48.25 0 35.984375 0
+L 9.8125 0
+z
+" id="DejaVuSans-66"/>
+ </defs>
+ <g transform="translate(22.023125 580.411406)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-71"/>
+ <use x="77.490234" xlink:href="#DejaVuSans-97"/>
+ <use x="138.769531" xlink:href="#DejaVuSans-105"/>
+ <use x="166.552734" xlink:href="#DejaVuSans-110"/>
+ <use x="229.931641" xlink:href="#DejaVuSans-32"/>
+ <use x="261.71875" xlink:href="#DejaVuSans-40"/>
+ <use x="300.732422" xlink:href="#DejaVuSans-100"/>
+ <use x="364.208984" xlink:href="#DejaVuSans-66"/>
+ <use x="432.8125" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_114">
+ <path clip-path="url(#pc1f1bd4bb6)" d="M -1 427.625882
+L 429.135237 427.731111
+L 434.62501 427.972617
+L 437.934366 428.334297
+L 440.218121 428.776372
+L 442.439299 429.446695
+L 444.173439 430.197391
+L 445.871259 431.176397
+L 447.53425 432.407203
+L 449.163811 433.896405
+L 450.761261 435.631805
+L 452.7148 438.103765
+L 454.998555 441.41659
+L 457.584085 445.600117
+L 460.791587 451.249943
+L 464.546984 458.320246
+L 468.771922 466.737014
+L 473.088345 475.837232
+L 476.90056 484.374726
+L 480.267187 492.415601
+L 483.49956 500.723528
+L 486.353447 508.710943
+L 488.863491 516.445752
+L 491.057945 523.993089
+L 492.95992 531.419383
+L 494.588312 538.796731
+L 495.958507 546.206539
+L 497.082907 553.737866
+L 497.971332 561.462963
+L 498.631319 569.328493
+L 499.068344 576.780315
+L 499.503026 589.207344
+L 499.935389 620.35998
+L 500.150709 596.165383
+L 500.579641 582.881745
+L 501.006316 576.808185
+L 501.642146 571.746265
+L 502.273028 568.849122
+L 502.899038 567.098291
+L 503.520252 566.072363
+L 504.136741 565.558426
+L 504.748578 565.436424
+L 505.355831 565.634712
+L 505.958569 566.110199
+L 506.55686 566.838721
+L 507.347773 568.188366
+L 508.131044 569.982827
+L 508.90682 572.277106
+L 509.675242 575.189387
+L 510.436449 578.953086
+L 511.190575 584.064249
+L 511.751601 589.489149
+L 512.123473 594.580241
+L 512.493647 602.235617
+L 512.678102 608.236464
+L 512.862138 618.292701
+L 513.045758 663.067489
+L 513.228962 620.026297
+L 513.594134 603.196152
+L 514.138825 592.94734
+L 514.679881 587.116809
+L 515.395718 581.996178
+L 516.105289 578.4126
+L 516.983606 575.14599
+L 517.85251 572.723078
+L 518.883049 570.548007
+L 519.900652 568.932424
+L 520.905639 567.726643
+L 521.89832 566.836945
+L 523.041291 566.116178
+L 524.168371 565.673506
+L 525.279996 565.462503
+L 526.532035 565.463606
+L 527.765032 565.691018
+L 529.1301 566.189535
+L 530.472562 566.926592
+L 531.793155 567.893801
+L 533.235683 569.240982
+L 534.652991 570.893137
+L 536.045945 572.889416
+L 537.279463 575.036875
+L 538.494492 577.603403
+L 539.55944 580.349848
+L 540.610579 583.712125
+L 541.519276 587.407011
+L 542.290134 591.463374
+L 542.926963 595.895054
+L 543.558829 602.116135
+L 544.060799 609.932388
+L 544.435248 620.564718
+L 544.683923 637.808684
+L 544.807975 676.136692
+L 545.05551 625.879523
+L 545.425403 612.570396
+L 545.915982 603.989241
+L 546.52506 597.575606
+L 547.249965 592.455981
+L 548.087575 588.216785
+L 549.034364 584.627025
+L 550.086451 581.543971
+L 551.239641 578.873121
+L 552.489487 576.548618
+L 553.831332 574.522672
+L 555.260364 572.759415
+L 556.771661 571.231132
+L 558.465048 569.838035
+L 560.226338 568.672993
+L 562.150589 567.666668
+L 564.225568 566.836945
+L 566.438836 566.194637
+L 568.777946 565.745713
+L 571.320039 565.487665
+L 574.04453 565.443065
+L 576.847577 565.620378
+L 579.798809 566.030572
+L 582.879209 566.688809
+L 585.996129 567.587722
+L 589.06947 568.706125
+L 592.099742 570.046675
+L 595.020813 571.584438
+L 597.775815 573.287068
+L 600.315347 575.113039
+L 602.71708 577.116142
+L 604.872632 579.200218
+L 606.857116 581.426222
+L 608.681507 583.813823
+L 610.300129 586.299306
+L 611.778613 588.98411
+L 613.07056 591.784859
+L 614.237025 594.838932
+L 615.283078 598.208967
+L 616.213122 601.985363
+L 617.030964 606.305697
+L 617.689439 610.971863
+L 618.242463 616.432504
+L 618.692148 623.029901
+L 619.040186 631.37082
+L 619.287873 642.654926
+L 619.436123 659.361297
+L 619.485479 676.565298
+L 619.534806 674.405036
+L 619.731812 642.487326
+L 620.026426 629.92692
+L 620.46635 620.761665
+L 621.000812 614.168567
+L 621.675981 608.636411
+L 622.440778 604.175039
+L 623.339702 600.246891
+L 624.36826 596.774232
+L 625.521451 593.687098
+L 626.793844 590.927414
+L 628.179654 588.448114
+L 629.716326 586.151412
+L 631.394989 584.036364
+L 633.248052 582.054441
+L 635.303637 580.181232
+L 637.585137 578.406708
+L 640.110822 576.729209
+L 642.893576 575.151544
+L 645.976379 573.662593
+L 649.391005 572.263394
+L 653.190198 570.951321
+L 657.377736 569.74344
+L 662.004581 568.642792
+L 667.097752 567.66279
+L 672.635995 566.826353
+L 678.537592 566.161433
+L 684.637181 565.698063
+L 690.659161 565.462185
+L 693.520206 565.432943
+L 693.520206 565.432943
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_8">
+ <path d="M 62.57 703.24
+L 62.57 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_9">
+ <path d="M 693.54 703.24
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_10">
+ <path d="M 62.57 703.24
+L 693.54 703.24
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_11">
+ <path d="M 62.57 410.4
+L 693.54 410.4
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_3">
+ <g id="patch_12">
+ <path d="M 62.57 1038.04
+L 693.54 1038.04
+L 693.54 745.2
+L 62.57 745.2
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_5">
+ <g id="xtick_41">
+ <g id="line2d_115">
+ <path clip-path="url(#pa737ddefca)" d="M 62.57 1038.04
+L 62.57 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_116">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_32">
+ <!-- 10Hz -->
+ <g transform="translate(49.823125 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-72"/>
+ <use x="202.441406" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_42">
+ <g id="line2d_117">
+ <path clip-path="url(#pa737ddefca)" d="M 62.57 1038.04
+L 62.57 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_118">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_43">
+ <g id="line2d_119">
+ <path clip-path="url(#pa737ddefca)" d="M 118.76202 1038.04
+L 118.76202 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_120">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="118.76202" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_44">
+ <g id="line2d_121">
+ <path clip-path="url(#pa737ddefca)" d="M 151.632244 1038.04
+L 151.632244 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_122">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="151.632244" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_45">
+ <g id="line2d_123">
+ <path clip-path="url(#pa737ddefca)" d="M 174.954039 1038.04
+L 174.954039 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_124">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="174.954039" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_46">
+ <g id="line2d_125">
+ <path clip-path="url(#pa737ddefca)" d="M 193.043829 1038.04
+L 193.043829 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_126">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="193.043829" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_47">
+ <g id="line2d_127">
+ <path clip-path="url(#pa737ddefca)" d="M 207.824264 1038.04
+L 207.824264 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_128">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="207.824264" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_48">
+ <g id="line2d_129">
+ <path clip-path="url(#pa737ddefca)" d="M 220.320943 1038.04
+L 220.320943 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_130">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="220.320943" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_49">
+ <g id="line2d_131">
+ <path clip-path="url(#pa737ddefca)" d="M 231.146059 1038.04
+L 231.146059 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_132">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="231.146059" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_50">
+ <g id="line2d_133">
+ <path clip-path="url(#pa737ddefca)" d="M 240.694488 1038.04
+L 240.694488 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_134">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="240.694488" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_51">
+ <g id="line2d_135">
+ <path clip-path="url(#pa737ddefca)" d="M 249.235849 1038.04
+L 249.235849 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_136">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_33">
+ <!-- 100Hz -->
+ <g transform="translate(233.307724 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ <use x="190.869141" xlink:href="#DejaVuSans-72"/>
+ <use x="266.064453" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_52">
+ <g id="line2d_137">
+ <path clip-path="url(#pa737ddefca)" d="M 249.235849 1038.04
+L 249.235849 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_138">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="249.235849" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_53">
+ <g id="line2d_139">
+ <path clip-path="url(#pa737ddefca)" d="M 305.427868 1038.04
+L 305.427868 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_140">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="305.427868" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_54">
+ <g id="line2d_141">
+ <path clip-path="url(#pa737ddefca)" d="M 338.298093 1038.04
+L 338.298093 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_142">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="338.298093" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_55">
+ <g id="line2d_143">
+ <path clip-path="url(#pa737ddefca)" d="M 361.619888 1038.04
+L 361.619888 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_144">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="361.619888" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_56">
+ <g id="line2d_145">
+ <path clip-path="url(#pa737ddefca)" d="M 379.709678 1038.04
+L 379.709678 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_146">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="379.709678" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_57">
+ <g id="line2d_147">
+ <path clip-path="url(#pa737ddefca)" d="M 394.490112 1038.04
+L 394.490112 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_148">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="394.490112" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_58">
+ <g id="line2d_149">
+ <path clip-path="url(#pa737ddefca)" d="M 406.986791 1038.04
+L 406.986791 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_150">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="406.986791" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_59">
+ <g id="line2d_151">
+ <path clip-path="url(#pa737ddefca)" d="M 417.811907 1038.04
+L 417.811907 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_152">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="417.811907" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_60">
+ <g id="line2d_153">
+ <path clip-path="url(#pa737ddefca)" d="M 427.360336 1038.04
+L 427.360336 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_154">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="427.360336" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_61">
+ <g id="line2d_155">
+ <path clip-path="url(#pa737ddefca)" d="M 435.901697 1038.04
+L 435.901697 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_156">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_34">
+ <!-- 1kHz -->
+ <g transform="translate(423.44076 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-107"/>
+ <use x="121.533203" xlink:href="#DejaVuSans-72"/>
+ <use x="196.728516" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_62">
+ <g id="line2d_157">
+ <path clip-path="url(#pa737ddefca)" d="M 435.901697 1038.04
+L 435.901697 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_158">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="435.901697" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_63">
+ <g id="line2d_159">
+ <path clip-path="url(#pa737ddefca)" d="M 492.093717 1038.04
+L 492.093717 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_160">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="492.093717" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_64">
+ <g id="line2d_161">
+ <path clip-path="url(#pa737ddefca)" d="M 524.963941 1038.04
+L 524.963941 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_162">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="524.963941" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_65">
+ <g id="line2d_163">
+ <path clip-path="url(#pa737ddefca)" d="M 548.285736 1038.04
+L 548.285736 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_164">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="548.285736" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_66">
+ <g id="line2d_165">
+ <path clip-path="url(#pa737ddefca)" d="M 566.375526 1038.04
+L 566.375526 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_166">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="566.375526" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_67">
+ <g id="line2d_167">
+ <path clip-path="url(#pa737ddefca)" d="M 581.155961 1038.04
+L 581.155961 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_168">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="581.155961" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_68">
+ <g id="line2d_169">
+ <path clip-path="url(#pa737ddefca)" d="M 593.65264 1038.04
+L 593.65264 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_170">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="593.65264" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_69">
+ <g id="line2d_171">
+ <path clip-path="url(#pa737ddefca)" d="M 604.477756 1038.04
+L 604.477756 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_172">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="604.477756" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_70">
+ <g id="line2d_173">
+ <path clip-path="url(#pa737ddefca)" d="M 614.026185 1038.04
+L 614.026185 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_174">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="614.026185" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_71">
+ <g id="line2d_175">
+ <path clip-path="url(#pa737ddefca)" d="M 622.567546 1038.04
+L 622.567546 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_176">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_35">
+ <!-- 10kHz -->
+ <g transform="translate(606.925358 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_72">
+ <g id="line2d_177">
+ <path clip-path="url(#pa737ddefca)" d="M 622.567546 1038.04
+L 622.567546 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_178">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="622.567546" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_73">
+ <g id="line2d_179">
+ <path clip-path="url(#pa737ddefca)" d="M 678.759566 1038.04
+L 678.759566 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_180">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="678.759566" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_74">
+ <g id="line2d_181">
+ <path clip-path="url(#pa737ddefca)" d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_182">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="693.54" xlink:href="#m1a58169807" y="1038.04"/>
+ </g>
+ </g>
+ <g id="text_36">
+ <!-- 24kHz -->
+ <g transform="translate(677.897812 1052.638438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-52"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-107"/>
+ <use x="185.15625" xlink:href="#DejaVuSans-72"/>
+ <use x="260.351562" xlink:href="#DejaVuSans-122"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_37">
+ <!-- Frequency (Hz) -->
+ <g transform="translate(339.882344 1066.316563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="57.410156" xlink:href="#DejaVuSans-114"/>
+ <use x="98.492188" xlink:href="#DejaVuSans-101"/>
+ <use x="160.015625" xlink:href="#DejaVuSans-113"/>
+ <use x="223.492188" xlink:href="#DejaVuSans-117"/>
+ <use x="286.871094" xlink:href="#DejaVuSans-101"/>
+ <use x="348.394531" xlink:href="#DejaVuSans-110"/>
+ <use x="411.773438" xlink:href="#DejaVuSans-99"/>
+ <use x="466.753906" xlink:href="#DejaVuSans-121"/>
+ <use x="525.933594" xlink:href="#DejaVuSans-32"/>
+ <use x="557.720703" xlink:href="#DejaVuSans-40"/>
+ <use x="596.734375" xlink:href="#DejaVuSans-72"/>
+ <use x="671.929688" xlink:href="#DejaVuSans-122"/>
+ <use x="724.419922" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_6">
+ <g id="ytick_17">
+ <g id="line2d_183">
+ <path clip-path="url(#pa737ddefca)" d="M 62.57 1007.214737
+L 693.54 1007.214737
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_184">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="1007.214737"/>
+ </g>
+ </g>
+ <g id="text_38">
+ <!-- −150 -->
+ <g transform="translate(28.102813 1011.013956)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_18">
+ <g id="line2d_185">
+ <path clip-path="url(#pa737ddefca)" d="M 62.57 968.683158
+L 693.54 968.683158
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_186">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="968.683158"/>
+ </g>
+ </g>
+ <g id="text_39">
+ <!-- −100 -->
+ <g transform="translate(28.102813 972.482377)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_19">
+ <g id="line2d_187">
+ <path clip-path="url(#pa737ddefca)" d="M 62.57 930.151579
+L 693.54 930.151579
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_188">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="930.151579"/>
+ </g>
+ </g>
+ <g id="text_40">
+ <!-- −50 -->
+ <g transform="translate(34.465313 933.950798)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-53"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_20">
+ <g id="line2d_189">
+ <path clip-path="url(#pa737ddefca)" d="M 62.57 891.62
+L 693.54 891.62
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_190">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="891.62"/>
+ </g>
+ </g>
+ <g id="text_41">
+ <!-- 0 -->
+ <g transform="translate(49.2075 895.419219)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_21">
+ <g id="line2d_191">
+ <path clip-path="url(#pa737ddefca)" d="M 62.57 853.088421
+L 693.54 853.088421
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_192">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="853.088421"/>
+ </g>
+ </g>
+ <g id="text_42">
+ <!-- 50 -->
+ <g transform="translate(42.845 856.88764)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-53"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_22">
+ <g id="line2d_193">
+ <path clip-path="url(#pa737ddefca)" d="M 62.57 814.556842
+L 693.54 814.556842
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_194">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="814.556842"/>
+ </g>
+ </g>
+ <g id="text_43">
+ <!-- 100 -->
+ <g transform="translate(36.4825 818.356061)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_23">
+ <g id="line2d_195">
+ <path clip-path="url(#pa737ddefca)" d="M 62.57 776.025263
+L 693.54 776.025263
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_196">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="62.57" xlink:href="#m0747facce7" y="776.025263"/>
+ </g>
+ </g>
+ <g id="text_44">
+ <!-- 150 -->
+ <g transform="translate(36.4825 779.824482)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-53"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_45">
+ <!-- Phase (${\circ}$) -->
+ <defs>
+ <path d="M 19.671875 64.796875
+L 19.671875 37.40625
+L 32.078125 37.40625
+Q 38.96875 37.40625 42.71875 40.96875
+Q 46.484375 44.53125 46.484375 51.125
+Q 46.484375 57.671875 42.71875 61.234375
+Q 38.96875 64.796875 32.078125 64.796875
+z
+M 9.8125 72.90625
+L 32.078125 72.90625
+Q 44.34375 72.90625 50.609375 67.359375
+Q 56.890625 61.8125 56.890625 51.125
+Q 56.890625 40.328125 50.609375 34.8125
+Q 44.34375 29.296875 32.078125 29.296875
+L 19.671875 29.296875
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-80"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-104"/>
+ <path d="M 31.296875 40.671875
+Q 27.390625 40.671875 24.703125 37.953125
+Q 22.015625 35.25 22.015625 31.34375
+Q 22.015625 27.484375 24.703125 24.828125
+Q 27.390625 22.171875 31.296875 22.171875
+Q 35.203125 22.171875 37.890625 24.828125
+Q 40.578125 27.484375 40.578125 31.34375
+Q 40.578125 35.203125 37.859375 37.9375
+Q 35.15625 40.671875 31.296875 40.671875
+z
+M 31.296875 46.96875
+Q 34.421875 46.96875 37.296875 45.765625
+Q 40.1875 44.578125 42.28125 42.328125
+Q 44.53125 40.140625 45.65625 37.34375
+Q 46.78125 34.5625 46.78125 31.34375
+Q 46.78125 24.90625 42.265625 20.4375
+Q 37.75 15.96875 31.203125 15.96875
+Q 24.609375 15.96875 20.21875 20.359375
+Q 15.828125 24.75 15.828125 31.34375
+Q 15.828125 37.890625 20.3125 42.421875
+Q 24.8125 46.96875 31.296875 46.96875
+z
+" id="DejaVuSans-8728"/>
+ </defs>
+ <g transform="translate(22.023125 915.17)rotate(-90)scale(0.1 -0.1)">
+ <use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-80"/>
+ <use transform="translate(60.302734 0.015625)" xlink:href="#DejaVuSans-104"/>
+ <use transform="translate(123.681641 0.015625)" xlink:href="#DejaVuSans-97"/>
+ <use transform="translate(184.960938 0.015625)" xlink:href="#DejaVuSans-115"/>
+ <use transform="translate(237.060547 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(298.583984 0.015625)" xlink:href="#DejaVuSans-32"/>
+ <use transform="translate(330.371094 0.015625)" xlink:href="#DejaVuSans-40"/>
+ <use transform="translate(369.384766 0.015625)" xlink:href="#DejaVuSans-8728"/>
+ <use transform="translate(431.982422 0.015625)" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_197">
+ <path clip-path="url(#pa737ddefca)" d="M -1 892.583011
+L 19.235765 892.583115
+L 75.427784 893.546257
+L 108.298009 894.509452
+L 131.619804 895.472727
+L 149.709594 896.436109
+L 164.490028 897.399625
+L 176.986708 898.363301
+L 187.811824 899.327165
+L 205.901613 901.255561
+L 220.682048 903.185029
+L 233.178727 905.115785
+L 244.003843 907.048046
+L 253.552272 908.982031
+L 262.093633 910.91796
+L 269.820234 912.856055
+L 276.874067 914.796538
+L 286.422496 917.712234
+L 294.963857 920.634582
+L 302.690458 923.564363
+L 309.744292 926.502374
+L 316.23319 929.449426
+L 322.240971 932.406351
+L 327.834082 935.373998
+L 333.066087 938.353237
+L 339.554985 942.345142
+L 345.562766 946.361448
+L 351.155877 950.404445
+L 356.387882 954.476529
+L 361.302596 958.580218
+L 365.936311 962.718163
+L 370.31943 966.893168
+L 374.477672 971.10821
+L 379.392386 976.438171
+L 384.026101 981.842365
+L 388.40922 987.328137
+L 392.567462 992.903606
+L 396.522781 998.577821
+L 400.294063 1004.360962
+L 403.897676 1010.264599
+L 407.347896 1016.302027
+L 410.657252 1022.4887
+L 413.836795 1028.842794
+L 414.458008 752.708167
+L 417.494616 759.292065
+L 420.421574 766.096774
+L 423.246527 773.154931
+L 425.976346 780.506087
+L 428.617229 788.197834
+L 431.17479 796.286312
+L 433.654125 804.835039
+L 436.059879 813.910204
+L 438.396292 823.5696
+L 440.667252 833.84225
+L 443.311006 846.931201
+L 446.290216 862.946222
+L 454.622369 908.742416
+L 457.219734 921.433574
+L 459.736458 932.693036
+L 462.52018 944.043917
+L 465.211479 954.061613
+L 468.136091 964.052749
+L 471.266517 973.887411
+L 474.575872 983.480164
+L 478.038375 992.773599
+L 481.629706 1001.728294
+L 485.327256 1010.317497
+L 489.110273 1018.524343
+L 492.95992 1026.340139
+L 494.588312 1029.497482
+L 494.818292 752.509264
+L 498.850126 759.949472
+L 499.719496 761.492297
+L 499.935389 900.585913
+L 504.136741 907.732109
+L 508.325685 914.419048
+L 512.678102 920.943644
+L 513.045758 921.476662
+L 513.228962 783.026826
+L 517.679473 789.240957
+L 522.226531 795.201991
+L 526.842047 800.883719
+L 531.501543 806.271789
+L 536.321687 811.506113
+L 541.260686 816.538644
+L 544.683923 819.843693
+L 544.807975 958.673639
+L 549.503645 962.973588
+L 554.713713 967.456617
+L 560.123785 971.81608
+L 565.675838 976.00123
+L 571.40937 980.04074
+L 577.263952 983.893553
+L 583.342897 987.627611
+L 589.641885 991.2354
+L 596.213011 994.741352
+L 603.080342 998.151289
+L 610.300129 1001.485302
+L 617.941281 1004.765528
+L 619.485479 1005.400458
+L 619.534806 866.706409
+L 619.633369 866.746877
+L 627.690622 869.916601
+L 636.672245 873.209935
+L 646.72029 876.652226
+L 658.878754 880.571805
+L 692.72444 891.334465
+L 693.520206 891.613036
+L 693.520206 891.613036
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_13">
+ <path d="M 62.57 1038.04
+L 62.57 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_14">
+ <path d="M 693.54 1038.04
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_15">
+ <path d="M 62.57 1038.04
+L 693.54 1038.04
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_16">
+ <path d="M 62.57 745.2
+L 693.54 745.2
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="text_46">
+ <!-- 8th-order Chebyshev type II filter, lowpass -->
+ <defs>
+ <path d="M 4.890625 31.390625
+L 31.203125 31.390625
+L 31.203125 23.390625
+L 4.890625 23.390625
+z
+" id="DejaVuSans-45"/>
+ <path d="M 30.609375 48.390625
+Q 23.390625 48.390625 19.1875 42.75
+Q 14.984375 37.109375 14.984375 27.296875
+Q 14.984375 17.484375 19.15625 11.84375
+Q 23.34375 6.203125 30.609375 6.203125
+Q 37.796875 6.203125 41.984375 11.859375
+Q 46.1875 17.53125 46.1875 27.296875
+Q 46.1875 37.015625 41.984375 42.703125
+Q 37.796875 48.390625 30.609375 48.390625
+z
+M 30.609375 56
+Q 42.328125 56 49.015625 48.375
+Q 55.71875 40.765625 55.71875 27.296875
+Q 55.71875 13.875 49.015625 6.21875
+Q 42.328125 -1.421875 30.609375 -1.421875
+Q 18.84375 -1.421875 12.171875 6.21875
+Q 5.515625 13.875 5.515625 27.296875
+Q 5.515625 40.765625 12.171875 48.375
+Q 18.84375 56 30.609375 56
+z
+" id="DejaVuSans-111"/>
+ <path d="M 64.40625 67.28125
+L 64.40625 56.890625
+Q 59.421875 61.53125 53.78125 63.8125
+Q 48.140625 66.109375 41.796875 66.109375
+Q 29.296875 66.109375 22.65625 58.46875
+Q 16.015625 50.828125 16.015625 36.375
+Q 16.015625 21.96875 22.65625 14.328125
+Q 29.296875 6.6875 41.796875 6.6875
+Q 48.140625 6.6875 53.78125 8.984375
+Q 59.421875 11.28125 64.40625 15.921875
+L 64.40625 5.609375
+Q 59.234375 2.09375 53.4375 0.328125
+Q 47.65625 -1.421875 41.21875 -1.421875
+Q 24.65625 -1.421875 15.125 8.703125
+Q 5.609375 18.84375 5.609375 36.375
+Q 5.609375 53.953125 15.125 64.078125
+Q 24.65625 74.21875 41.21875 74.21875
+Q 47.75 74.21875 53.53125 72.484375
+Q 59.328125 70.75 64.40625 67.28125
+z
+" id="DejaVuSans-67"/>
+ <path d="M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+M 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+z
+" id="DejaVuSans-98"/>
+ <path d="M 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 8.796875
+L 46.6875 54.6875
+L 56.203125 54.6875
+L 35.6875 0
+L 23.484375 0
+z
+" id="DejaVuSans-118"/>
+ <path d="M 9.8125 72.90625
+L 19.671875 72.90625
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-73"/>
+ <path d="M 37.109375 75.984375
+L 37.109375 68.5
+L 28.515625 68.5
+Q 23.6875 68.5 21.796875 66.546875
+Q 19.921875 64.59375 19.921875 59.515625
+L 19.921875 54.6875
+L 34.71875 54.6875
+L 34.71875 47.703125
+L 19.921875 47.703125
+L 19.921875 0
+L 10.890625 0
+L 10.890625 47.703125
+L 2.296875 47.703125
+L 2.296875 54.6875
+L 10.890625 54.6875
+L 10.890625 58.5
+Q 10.890625 67.625 15.140625 71.796875
+Q 19.390625 75.984375 28.609375 75.984375
+z
+" id="DejaVuSans-102"/>
+ <path d="M 11.71875 12.40625
+L 22.015625 12.40625
+L 22.015625 4
+L 14.015625 -11.625
+L 7.71875 -11.625
+L 11.71875 4
+z
+" id="DejaVuSans-44"/>
+ <path d="M 4.203125 54.6875
+L 13.1875 54.6875
+L 24.421875 12.015625
+L 35.59375 54.6875
+L 46.1875 54.6875
+L 57.421875 12.015625
+L 68.609375 54.6875
+L 77.59375 54.6875
+L 63.28125 0
+L 52.6875 0
+L 40.921875 44.828125
+L 29.109375 0
+L 18.5 0
+z
+" id="DejaVuSans-119"/>
+ </defs>
+ <g transform="translate(189.62375 33.7575)scale(0.16 -0.16)">
+ <use xlink:href="#DejaVuSans-56"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-116"/>
+ <use x="102.832031" xlink:href="#DejaVuSans-104"/>
+ <use x="166.210938" xlink:href="#DejaVuSans-45"/>
+ <use x="202.310547" xlink:href="#DejaVuSans-111"/>
+ <use x="263.492188" xlink:href="#DejaVuSans-114"/>
+ <use x="304.589844" xlink:href="#DejaVuSans-100"/>
+ <use x="368.066406" xlink:href="#DejaVuSans-101"/>
+ <use x="429.589844" xlink:href="#DejaVuSans-114"/>
+ <use x="470.703125" xlink:href="#DejaVuSans-32"/>
+ <use x="502.490234" xlink:href="#DejaVuSans-67"/>
+ <use x="572.314453" xlink:href="#DejaVuSans-104"/>
+ <use x="635.693359" xlink:href="#DejaVuSans-101"/>
+ <use x="697.216797" xlink:href="#DejaVuSans-98"/>
+ <use x="760.693359" xlink:href="#DejaVuSans-121"/>
+ <use x="819.873047" xlink:href="#DejaVuSans-115"/>
+ <use x="871.972656" xlink:href="#DejaVuSans-104"/>
+ <use x="935.351562" xlink:href="#DejaVuSans-101"/>
+ <use x="996.875" xlink:href="#DejaVuSans-118"/>
+ <use x="1056.054688" xlink:href="#DejaVuSans-32"/>
+ <use x="1087.841797" xlink:href="#DejaVuSans-116"/>
+ <use x="1127.050781" xlink:href="#DejaVuSans-121"/>
+ <use x="1186.230469" xlink:href="#DejaVuSans-112"/>
+ <use x="1249.707031" xlink:href="#DejaVuSans-101"/>
+ <use x="1311.230469" xlink:href="#DejaVuSans-32"/>
+ <use x="1343.017578" xlink:href="#DejaVuSans-73"/>
+ <use x="1372.509766" xlink:href="#DejaVuSans-73"/>
+ <use x="1402.001953" xlink:href="#DejaVuSans-32"/>
+ <use x="1433.789062" xlink:href="#DejaVuSans-102"/>
+ <use x="1468.994141" xlink:href="#DejaVuSans-105"/>
+ <use x="1496.777344" xlink:href="#DejaVuSans-108"/>
+ <use x="1524.560547" xlink:href="#DejaVuSans-116"/>
+ <use x="1563.769531" xlink:href="#DejaVuSans-101"/>
+ <use x="1625.292969" xlink:href="#DejaVuSans-114"/>
+ <use x="1666.40625" xlink:href="#DejaVuSans-44"/>
+ <use x="1698.193359" xlink:href="#DejaVuSans-32"/>
+ <use x="1729.980469" xlink:href="#DejaVuSans-108"/>
+ <use x="1757.763672" xlink:href="#DejaVuSans-111"/>
+ <use x="1818.945312" xlink:href="#DejaVuSans-119"/>
+ <use x="1900.732422" xlink:href="#DejaVuSans-112"/>
+ <use x="1964.208984" xlink:href="#DejaVuSans-97"/>
+ <use x="2025.488281" xlink:href="#DejaVuSans-115"/>
+ <use x="2077.587891" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="p093e4a304d">
+ <rect height="292.84" width="630.97" x="62.57" y="75.6"/>
+ </clipPath>
+ <clipPath id="pc1f1bd4bb6">
+ <rect height="292.84" width="630.97" x="62.57" y="410.4"/>
+ </clipPath>
+ <clipPath id="pa737ddefca">
+ <rect height="292.84" width="630.97" x="62.57" y="745.2"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/docs/docs/img/src-kfr1.png b/docs/docs/img/src-kfr1.png
Binary files differ.
diff --git a/docs/docs/img/src-kfr2.png b/docs/docs/img/src-kfr2.png
Binary files differ.
diff --git a/docs/docs/img/window_bartlett.svg b/docs/docs/img/window_bartlett.svg
@@ -19,28 +19,28 @@ z
</g>
<g id="axes_1">
<g id="patch_2">
- <path d="M 47.72 387.16
-L 415.575 387.16
-L 415.575 39.24
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 416.835 388.6
+L 416.835 36.72
+L 47.855 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
- <path clip-path="url(#p454853742e)" d="M 47.72 387.16
-L 47.72 39.24
+ <path clip-path="url(#p63898e0c13)" d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
-" id="mae056e8810" style="stroke:#000000;stroke-width:0.8;"/>
+" id="m55447c0352" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mae056e8810" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m55447c0352" y="388.6"/>
</g>
</g>
<g id="text_1">
@@ -68,20 +68,20 @@ Q 19.53125 74.21875 31.78125 74.21875
z
" id="DejaVuSans-48"/>
</defs>
- <g transform="translate(44.53875 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(44.67375 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
- <path clip-path="url(#p454853742e)" d="M 106.109683 387.16
-L 106.109683 39.24
+ <path clip-path="url(#p63898e0c13)" d="M 106.423254 388.6
+L 106.423254 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="106.109683" xlink:href="#mae056e8810" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="106.423254" xlink:href="#m55447c0352" y="388.6"/>
</g>
</g>
<g id="text_2">
@@ -101,7 +101,7 @@ L 12.40625 0
z
" id="DejaVuSans-49"/>
</defs>
- <g transform="translate(99.747183 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(100.060754 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -109,13 +109,13 @@ z
</g>
<g id="xtick_3">
<g id="line2d_5">
- <path clip-path="url(#p454853742e)" d="M 164.499365 387.16
-L 164.499365 39.24
+ <path clip-path="url(#p63898e0c13)" d="M 164.991508 388.6
+L 164.991508 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="164.499365" xlink:href="#mae056e8810" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="164.991508" xlink:href="#m55447c0352" y="388.6"/>
</g>
</g>
<g id="text_3">
@@ -146,7 +146,7 @@ Q 31.109375 20.453125 19.1875 8.296875
z
" id="DejaVuSans-50"/>
</defs>
- <g transform="translate(158.136865 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(158.629008 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -154,13 +154,13 @@ z
</g>
<g id="xtick_4">
<g id="line2d_7">
- <path clip-path="url(#p454853742e)" d="M 222.889048 387.16
-L 222.889048 39.24
+ <path clip-path="url(#p63898e0c13)" d="M 223.559762 388.6
+L 223.559762 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_8">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="222.889048" xlink:href="#mae056e8810" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="223.559762" xlink:href="#m55447c0352" y="388.6"/>
</g>
</g>
<g id="text_4">
@@ -199,7 +199,7 @@ Q 46.96875 40.921875 40.578125 39.3125
z
" id="DejaVuSans-51"/>
</defs>
- <g transform="translate(216.526548 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(217.197262 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-51"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -207,13 +207,13 @@ z
</g>
<g id="xtick_5">
<g id="line2d_9">
- <path clip-path="url(#p454853742e)" d="M 281.27873 387.16
-L 281.27873 39.24
+ <path clip-path="url(#p63898e0c13)" d="M 282.128016 388.6
+L 282.128016 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_10">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="281.27873" xlink:href="#mae056e8810" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="282.128016" xlink:href="#m55447c0352" y="388.6"/>
</g>
</g>
<g id="text_5">
@@ -237,7 +237,7 @@ L 4.890625 26.703125
z
" id="DejaVuSans-52"/>
</defs>
- <g transform="translate(274.91623 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(275.765516 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-52"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -245,13 +245,13 @@ z
</g>
<g id="xtick_6">
<g id="line2d_11">
- <path clip-path="url(#p454853742e)" d="M 339.668413 387.16
-L 339.668413 39.24
+ <path clip-path="url(#p63898e0c13)" d="M 340.69627 388.6
+L 340.69627 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_12">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="339.668413" xlink:href="#mae056e8810" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="340.69627" xlink:href="#m55447c0352" y="388.6"/>
</g>
</g>
<g id="text_6">
@@ -282,7 +282,7 @@ Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-53"/>
</defs>
- <g transform="translate(333.305913 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(334.33377 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-53"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -290,13 +290,13 @@ z
</g>
<g id="xtick_7">
<g id="line2d_13">
- <path clip-path="url(#p454853742e)" d="M 398.058095 387.16
-L 398.058095 39.24
+ <path clip-path="url(#p63898e0c13)" d="M 399.264524 388.6
+L 399.264524 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_14">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="398.058095" xlink:href="#mae056e8810" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="399.264524" xlink:href="#m55447c0352" y="388.6"/>
</g>
</g>
<g id="text_7">
@@ -333,7 +333,7 @@ Q 48.484375 72.75 52.59375 71.296875
z
" id="DejaVuSans-54"/>
</defs>
- <g transform="translate(391.695595 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(392.902024 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-54"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -523,7 +523,7 @@ Q 40.578125 54.546875 44.28125 53.078125
z
" id="DejaVuSans-115"/>
</defs>
- <g transform="translate(210.294375 415.436563)scale(0.1 -0.1)">
+ <g transform="translate(210.991875 416.876562)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-83"/>
<use x="63.476562" xlink:href="#DejaVuSans-97"/>
<use x="124.755859" xlink:href="#DejaVuSans-109"/>
@@ -537,18 +537,18 @@ z
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_15">
- <path clip-path="url(#p454853742e)" d="M 47.72 387.16
-L 415.575 387.16
+ <path clip-path="url(#p63898e0c13)" d="M 47.855 388.6
+L 416.835 388.6
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_16">
<defs>
<path d="M 0 0
L -3.5 0
-" id="m79c5b0aa28" style="stroke:#000000;stroke-width:0.8;"/>
+" id="mdeed6be457" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m79c5b0aa28" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mdeed6be457" y="388.6"/>
</g>
</g>
<g id="text_9">
@@ -561,7 +561,7 @@ L 10.6875 0
z
" id="DejaVuSans-46"/>
</defs>
- <g transform="translate(24.816875 390.959219)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 392.399219)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -570,18 +570,18 @@ z
</g>
<g id="ytick_2">
<g id="line2d_17">
- <path clip-path="url(#p454853742e)" d="M 47.72 319.820645
-L 415.575 319.820645
+ <path clip-path="url(#p63898e0c13)" d="M 47.855 320.494194
+L 416.835 320.494194
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_18">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m79c5b0aa28" y="319.820645"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mdeed6be457" y="320.494194"/>
</g>
</g>
<g id="text_10">
<!-- 0.2 -->
- <g transform="translate(24.816875 323.619864)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 324.293412)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -590,18 +590,18 @@ L 415.575 319.820645
</g>
<g id="ytick_3">
<g id="line2d_19">
- <path clip-path="url(#p454853742e)" d="M 47.72 252.48129
-L 415.575 252.48129
+ <path clip-path="url(#p63898e0c13)" d="M 47.855 252.388387
+L 416.835 252.388387
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_20">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m79c5b0aa28" y="252.48129"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mdeed6be457" y="252.388387"/>
</g>
</g>
<g id="text_11">
<!-- 0.4 -->
- <g transform="translate(24.816875 256.280509)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 256.187606)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -610,18 +610,18 @@ L 415.575 252.48129
</g>
<g id="ytick_4">
<g id="line2d_21">
- <path clip-path="url(#p454853742e)" d="M 47.72 185.141935
-L 415.575 185.141935
+ <path clip-path="url(#p63898e0c13)" d="M 47.855 184.282581
+L 416.835 184.282581
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_22">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m79c5b0aa28" y="185.141935"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mdeed6be457" y="184.282581"/>
</g>
</g>
<g id="text_12">
<!-- 0.6 -->
- <g transform="translate(24.816875 188.941154)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 188.081799)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -630,13 +630,13 @@ L 415.575 185.141935
</g>
<g id="ytick_5">
<g id="line2d_23">
- <path clip-path="url(#p454853742e)" d="M 47.72 117.802581
-L 415.575 117.802581
+ <path clip-path="url(#p63898e0c13)" d="M 47.855 116.176774
+L 416.835 116.176774
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_24">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m79c5b0aa28" y="117.802581"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mdeed6be457" y="116.176774"/>
</g>
</g>
<g id="text_13">
@@ -682,7 +682,7 @@ Q 18.3125 60.0625 18.3125 54.390625
z
" id="DejaVuSans-56"/>
</defs>
- <g transform="translate(24.816875 121.601799)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 119.975993)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -691,18 +691,18 @@ z
</g>
<g id="ytick_6">
<g id="line2d_25">
- <path clip-path="url(#p454853742e)" d="M 47.72 50.463226
-L 415.575 50.463226
+ <path clip-path="url(#p63898e0c13)" d="M 47.855 48.070968
+L 416.835 48.070968
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_26">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m79c5b0aa28" y="50.463226"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mdeed6be457" y="48.070968"/>
</g>
</g>
<g id="text_14">
<!-- 1.0 -->
- <g transform="translate(24.816875 54.262445)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 51.870186)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -805,7 +805,7 @@ Q 14.796875 37.203125 14.796875 27.296875
z
" id="DejaVuSans-100"/>
</defs>
- <g transform="translate(18.737188 238.822656)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(18.872187 238.282656)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-65"/>
<use x="68.408203" xlink:href="#DejaVuSans-109"/>
<use x="165.820312" xlink:href="#DejaVuSans-112"/>
@@ -819,70 +819,70 @@ z
</g>
</g>
<g id="line2d_27">
- <path clip-path="url(#p454853742e)" d="M 47.72 387.16
-L 53.558968 376.471214
-L 59.397937 365.782427
-L 65.236905 355.093641
-L 71.075873 344.404854
-L 76.914841 333.716068
-L 82.75381 323.027281
-L 88.592778 312.338495
-L 94.431746 301.649708
-L 100.270714 290.960922
-L 106.109683 280.272135
-L 111.948651 269.583349
-L 117.787619 258.894562
-L 123.626587 248.205776
-L 129.465556 237.516989
-L 135.304524 226.828203
-L 141.143492 216.139416
-L 146.98246 205.45063
-L 152.821429 194.761843
-L 158.660397 184.073057
-L 164.499365 173.38427
-L 170.338333 162.695484
-L 176.177302 152.006697
-L 182.01627 141.317911
-L 187.855238 130.629124
-L 193.694206 119.940338
-L 199.533175 109.251551
-L 205.372143 98.562765
-L 211.211111 87.873978
-L 217.050079 77.185192
-L 222.889048 66.496406
-L 228.728016 55.807619
-L 234.566984 55.807619
-L 240.405952 66.496406
-L 246.244921 77.185192
-L 252.083889 87.873978
-L 257.922857 98.562765
-L 263.761825 109.251551
-L 269.600794 119.940338
-L 275.439762 130.629124
-L 281.27873 141.317911
-L 287.117698 152.006697
-L 292.956667 162.695484
-L 298.795635 173.38427
-L 304.634603 184.073057
-L 310.473571 194.761843
-L 316.31254 205.45063
-L 322.151508 216.139416
-L 327.990476 226.828203
-L 333.829444 237.516989
-L 339.668413 248.205776
-L 345.507381 258.894562
-L 351.346349 269.583349
-L 357.185317 280.272135
-L 363.024286 290.960922
-L 368.863254 301.649708
-L 374.702222 312.338495
-L 380.54119 323.027281
-L 386.380159 333.716068
-L 392.219127 344.404854
-L 398.058095 355.093641
-L 403.897063 365.782427
-L 409.736032 376.471214
-L 415.575 387.16
+ <path clip-path="url(#p63898e0c13)" d="M 47.855 388.6
+L 53.711825 377.789555
+L 59.568651 366.979109
+L 65.425476 356.168664
+L 71.282302 345.358218
+L 77.139127 334.547773
+L 82.995952 323.737327
+L 88.852778 312.926882
+L 94.709603 302.116436
+L 100.566429 291.305991
+L 106.423254 280.495545
+L 112.280079 269.6851
+L 118.136905 258.874654
+L 123.99373 248.064209
+L 129.850556 237.253763
+L 135.707381 226.443318
+L 141.564206 215.632873
+L 147.421032 204.822427
+L 153.277857 194.011982
+L 159.134683 183.201536
+L 164.991508 172.391091
+L 170.848333 161.580645
+L 176.705159 150.7702
+L 182.561984 139.959754
+L 188.41881 129.149309
+L 194.275635 118.338863
+L 200.13246 107.528418
+L 205.989286 96.717972
+L 211.846111 85.907527
+L 217.702937 75.097081
+L 223.559762 64.286636
+L 229.416587 53.47619
+L 235.273413 53.47619
+L 241.130238 64.286636
+L 246.987063 75.097081
+L 252.843889 85.907527
+L 258.700714 96.717972
+L 264.55754 107.528418
+L 270.414365 118.338863
+L 276.27119 129.149309
+L 282.128016 139.959754
+L 287.984841 150.7702
+L 293.841667 161.580645
+L 299.698492 172.391091
+L 305.555317 183.201536
+L 311.412143 194.011982
+L 317.268968 204.822427
+L 323.125794 215.632873
+L 328.982619 226.443318
+L 334.839444 237.253763
+L 340.69627 248.064209
+L 346.553095 258.874654
+L 352.409921 269.6851
+L 358.266746 280.495545
+L 364.123571 291.305991
+L 369.980397 302.116436
+L 375.837222 312.926882
+L 381.694048 323.737327
+L 387.550873 334.547773
+L 393.407698 345.358218
+L 399.264524 356.168664
+L 405.121349 366.979109
+L 410.978175 377.789555
+L 416.835 388.6
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
<defs>
<path d="M 0 1.5
@@ -895,120 +895,120 @@ C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0
C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066
C -0.77937 1.341951 -0.397805 1.5 0 1.5
z
-" id="m8814a56a7f" style="stroke:#0072bd;"/>
+" id="m08e9ec2d33" style="stroke:#0072bd;"/>
</defs>
- <g clip-path="url(#p454853742e)">
- <use style="fill:#0072bd;stroke:#0072bd;" x="47.72" xlink:href="#m8814a56a7f" y="387.16"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="53.558968" xlink:href="#m8814a56a7f" y="376.471214"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="59.397937" xlink:href="#m8814a56a7f" y="365.782427"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="65.236905" xlink:href="#m8814a56a7f" y="355.093641"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="71.075873" xlink:href="#m8814a56a7f" y="344.404854"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="76.914841" xlink:href="#m8814a56a7f" y="333.716068"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="82.75381" xlink:href="#m8814a56a7f" y="323.027281"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="88.592778" xlink:href="#m8814a56a7f" y="312.338495"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="94.431746" xlink:href="#m8814a56a7f" y="301.649708"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="100.270714" xlink:href="#m8814a56a7f" y="290.960922"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="106.109683" xlink:href="#m8814a56a7f" y="280.272135"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="111.948651" xlink:href="#m8814a56a7f" y="269.583349"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="117.787619" xlink:href="#m8814a56a7f" y="258.894562"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="123.626587" xlink:href="#m8814a56a7f" y="248.205776"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="129.465556" xlink:href="#m8814a56a7f" y="237.516989"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="135.304524" xlink:href="#m8814a56a7f" y="226.828203"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="141.143492" xlink:href="#m8814a56a7f" y="216.139416"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="146.98246" xlink:href="#m8814a56a7f" y="205.45063"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="152.821429" xlink:href="#m8814a56a7f" y="194.761843"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="158.660397" xlink:href="#m8814a56a7f" y="184.073057"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="164.499365" xlink:href="#m8814a56a7f" y="173.38427"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="170.338333" xlink:href="#m8814a56a7f" y="162.695484"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="176.177302" xlink:href="#m8814a56a7f" y="152.006697"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="182.01627" xlink:href="#m8814a56a7f" y="141.317911"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="187.855238" xlink:href="#m8814a56a7f" y="130.629124"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="193.694206" xlink:href="#m8814a56a7f" y="119.940338"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="199.533175" xlink:href="#m8814a56a7f" y="109.251551"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="205.372143" xlink:href="#m8814a56a7f" y="98.562765"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="211.211111" xlink:href="#m8814a56a7f" y="87.873978"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="217.050079" xlink:href="#m8814a56a7f" y="77.185192"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="222.889048" xlink:href="#m8814a56a7f" y="66.496406"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="228.728016" xlink:href="#m8814a56a7f" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="234.566984" xlink:href="#m8814a56a7f" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="240.405952" xlink:href="#m8814a56a7f" y="66.496406"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="246.244921" xlink:href="#m8814a56a7f" y="77.185192"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="252.083889" xlink:href="#m8814a56a7f" y="87.873978"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="257.922857" xlink:href="#m8814a56a7f" y="98.562765"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="263.761825" xlink:href="#m8814a56a7f" y="109.251551"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="269.600794" xlink:href="#m8814a56a7f" y="119.940338"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="275.439762" xlink:href="#m8814a56a7f" y="130.629124"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="281.27873" xlink:href="#m8814a56a7f" y="141.317911"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="287.117698" xlink:href="#m8814a56a7f" y="152.006697"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="292.956667" xlink:href="#m8814a56a7f" y="162.695484"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="298.795635" xlink:href="#m8814a56a7f" y="173.38427"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="304.634603" xlink:href="#m8814a56a7f" y="184.073057"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="310.473571" xlink:href="#m8814a56a7f" y="194.761843"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="316.31254" xlink:href="#m8814a56a7f" y="205.45063"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="322.151508" xlink:href="#m8814a56a7f" y="216.139416"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="327.990476" xlink:href="#m8814a56a7f" y="226.828203"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="333.829444" xlink:href="#m8814a56a7f" y="237.516989"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="339.668413" xlink:href="#m8814a56a7f" y="248.205776"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="345.507381" xlink:href="#m8814a56a7f" y="258.894562"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="351.346349" xlink:href="#m8814a56a7f" y="269.583349"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="357.185317" xlink:href="#m8814a56a7f" y="280.272135"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="363.024286" xlink:href="#m8814a56a7f" y="290.960922"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="368.863254" xlink:href="#m8814a56a7f" y="301.649708"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="374.702222" xlink:href="#m8814a56a7f" y="312.338495"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="380.54119" xlink:href="#m8814a56a7f" y="323.027281"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="386.380159" xlink:href="#m8814a56a7f" y="333.716068"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="392.219127" xlink:href="#m8814a56a7f" y="344.404854"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="398.058095" xlink:href="#m8814a56a7f" y="355.093641"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="403.897063" xlink:href="#m8814a56a7f" y="365.782427"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="409.736032" xlink:href="#m8814a56a7f" y="376.471214"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="415.575" xlink:href="#m8814a56a7f" y="387.16"/>
+ <g clip-path="url(#p63898e0c13)">
+ <use style="fill:#0072bd;stroke:#0072bd;" x="47.855" xlink:href="#m08e9ec2d33" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="53.711825" xlink:href="#m08e9ec2d33" y="377.789555"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="59.568651" xlink:href="#m08e9ec2d33" y="366.979109"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="65.425476" xlink:href="#m08e9ec2d33" y="356.168664"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="71.282302" xlink:href="#m08e9ec2d33" y="345.358218"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="77.139127" xlink:href="#m08e9ec2d33" y="334.547773"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="82.995952" xlink:href="#m08e9ec2d33" y="323.737327"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="88.852778" xlink:href="#m08e9ec2d33" y="312.926882"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="94.709603" xlink:href="#m08e9ec2d33" y="302.116436"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="100.566429" xlink:href="#m08e9ec2d33" y="291.305991"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="106.423254" xlink:href="#m08e9ec2d33" y="280.495545"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="112.280079" xlink:href="#m08e9ec2d33" y="269.6851"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="118.136905" xlink:href="#m08e9ec2d33" y="258.874654"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="123.99373" xlink:href="#m08e9ec2d33" y="248.064209"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="129.850556" xlink:href="#m08e9ec2d33" y="237.253763"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="135.707381" xlink:href="#m08e9ec2d33" y="226.443318"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="141.564206" xlink:href="#m08e9ec2d33" y="215.632873"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="147.421032" xlink:href="#m08e9ec2d33" y="204.822427"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="153.277857" xlink:href="#m08e9ec2d33" y="194.011982"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="159.134683" xlink:href="#m08e9ec2d33" y="183.201536"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="164.991508" xlink:href="#m08e9ec2d33" y="172.391091"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="170.848333" xlink:href="#m08e9ec2d33" y="161.580645"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="176.705159" xlink:href="#m08e9ec2d33" y="150.7702"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="182.561984" xlink:href="#m08e9ec2d33" y="139.959754"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="188.41881" xlink:href="#m08e9ec2d33" y="129.149309"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="194.275635" xlink:href="#m08e9ec2d33" y="118.338863"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="200.13246" xlink:href="#m08e9ec2d33" y="107.528418"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="205.989286" xlink:href="#m08e9ec2d33" y="96.717972"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="211.846111" xlink:href="#m08e9ec2d33" y="85.907527"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="217.702937" xlink:href="#m08e9ec2d33" y="75.097081"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="223.559762" xlink:href="#m08e9ec2d33" y="64.286636"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="229.416587" xlink:href="#m08e9ec2d33" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="235.273413" xlink:href="#m08e9ec2d33" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="241.130238" xlink:href="#m08e9ec2d33" y="64.286636"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="246.987063" xlink:href="#m08e9ec2d33" y="75.097081"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="252.843889" xlink:href="#m08e9ec2d33" y="85.907527"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="258.700714" xlink:href="#m08e9ec2d33" y="96.717972"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="264.55754" xlink:href="#m08e9ec2d33" y="107.528418"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="270.414365" xlink:href="#m08e9ec2d33" y="118.338863"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="276.27119" xlink:href="#m08e9ec2d33" y="129.149309"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="282.128016" xlink:href="#m08e9ec2d33" y="139.959754"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="287.984841" xlink:href="#m08e9ec2d33" y="150.7702"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="293.841667" xlink:href="#m08e9ec2d33" y="161.580645"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="299.698492" xlink:href="#m08e9ec2d33" y="172.391091"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="305.555317" xlink:href="#m08e9ec2d33" y="183.201536"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="311.412143" xlink:href="#m08e9ec2d33" y="194.011982"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="317.268968" xlink:href="#m08e9ec2d33" y="204.822427"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="323.125794" xlink:href="#m08e9ec2d33" y="215.632873"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="328.982619" xlink:href="#m08e9ec2d33" y="226.443318"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="334.839444" xlink:href="#m08e9ec2d33" y="237.253763"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="340.69627" xlink:href="#m08e9ec2d33" y="248.064209"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="346.553095" xlink:href="#m08e9ec2d33" y="258.874654"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="352.409921" xlink:href="#m08e9ec2d33" y="269.6851"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="358.266746" xlink:href="#m08e9ec2d33" y="280.495545"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="364.123571" xlink:href="#m08e9ec2d33" y="291.305991"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="369.980397" xlink:href="#m08e9ec2d33" y="302.116436"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="375.837222" xlink:href="#m08e9ec2d33" y="312.926882"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="381.694048" xlink:href="#m08e9ec2d33" y="323.737327"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="387.550873" xlink:href="#m08e9ec2d33" y="334.547773"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="393.407698" xlink:href="#m08e9ec2d33" y="345.358218"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="399.264524" xlink:href="#m08e9ec2d33" y="356.168664"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="405.121349" xlink:href="#m08e9ec2d33" y="366.979109"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="410.978175" xlink:href="#m08e9ec2d33" y="377.789555"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="416.835" xlink:href="#m08e9ec2d33" y="388.6"/>
</g>
</g>
<g id="patch_3">
- <path d="M 47.72 387.16
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
- <path d="M 415.575 387.16
-L 415.575 39.24
+ <path d="M 416.835 388.6
+L 416.835 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
- <path d="M 47.72 387.16
-L 415.575 387.16
+ <path d="M 47.855 388.6
+L 416.835 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
- <path d="M 47.72 39.24
-L 415.575 39.24
+ <path d="M 47.855 36.72
+L 416.835 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
<g id="axes_2">
<g id="patch_7">
- <path d="M 477.425 387.16
-L 845.28 387.16
-L 845.28 39.24
-L 477.425 39.24
+ <path d="M 476.255 388.6
+L 845.235 388.6
+L 845.235 36.72
+L 476.255 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_3">
<g id="xtick_8">
<g id="line2d_28">
- <path clip-path="url(#p6ef83378bf)" d="M 477.425 387.16
-L 477.425 39.24
+ <path clip-path="url(#p64a8fa4541)" d="M 476.255 388.6
+L 476.255 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_29">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#mae056e8810" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#m55447c0352" y="388.6"/>
</g>
</g>
<g id="text_16">
<!-- 0.0 -->
- <g transform="translate(469.473437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(468.303437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1017,18 +1017,18 @@ L 477.425 39.24
</g>
<g id="xtick_9">
<g id="line2d_30">
- <path clip-path="url(#p6ef83378bf)" d="M 550.996 387.16
-L 550.996 39.24
+ <path clip-path="url(#p64a8fa4541)" d="M 550.051 388.6
+L 550.051 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_31">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="550.996" xlink:href="#mae056e8810" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="550.051" xlink:href="#m55447c0352" y="388.6"/>
</g>
</g>
<g id="text_17">
<!-- 0.2 -->
- <g transform="translate(543.044437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(542.099437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -1037,18 +1037,18 @@ L 550.996 39.24
</g>
<g id="xtick_10">
<g id="line2d_32">
- <path clip-path="url(#p6ef83378bf)" d="M 624.567 387.16
-L 624.567 39.24
+ <path clip-path="url(#p64a8fa4541)" d="M 623.847 388.6
+L 623.847 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_33">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="624.567" xlink:href="#mae056e8810" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.847" xlink:href="#m55447c0352" y="388.6"/>
</g>
</g>
<g id="text_18">
<!-- 0.4 -->
- <g transform="translate(616.615437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(615.895437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -1057,18 +1057,18 @@ L 624.567 39.24
</g>
<g id="xtick_11">
<g id="line2d_34">
- <path clip-path="url(#p6ef83378bf)" d="M 698.138 387.16
-L 698.138 39.24
+ <path clip-path="url(#p64a8fa4541)" d="M 697.643 388.6
+L 697.643 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_35">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="698.138" xlink:href="#mae056e8810" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="697.643" xlink:href="#m55447c0352" y="388.6"/>
</g>
</g>
<g id="text_19">
<!-- 0.6 -->
- <g transform="translate(690.186438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(689.691437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -1077,18 +1077,18 @@ L 698.138 39.24
</g>
<g id="xtick_12">
<g id="line2d_36">
- <path clip-path="url(#p6ef83378bf)" d="M 771.709 387.16
-L 771.709 39.24
+ <path clip-path="url(#p64a8fa4541)" d="M 771.439 388.6
+L 771.439 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_37">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="771.709" xlink:href="#mae056e8810" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="771.439" xlink:href="#m55447c0352" y="388.6"/>
</g>
</g>
<g id="text_20">
<!-- 0.8 -->
- <g transform="translate(763.757438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(763.487437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -1097,18 +1097,18 @@ L 771.709 39.24
</g>
<g id="xtick_13">
<g id="line2d_38">
- <path clip-path="url(#p6ef83378bf)" d="M 845.28 387.16
-L 845.28 39.24
+ <path clip-path="url(#p64a8fa4541)" d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_39">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="845.28" xlink:href="#mae056e8810" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="845.235" xlink:href="#m55447c0352" y="388.6"/>
</g>
</g>
<g id="text_21">
<!-- 1.0 -->
- <g transform="translate(837.328438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(837.283437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1341,7 +1341,7 @@ Q 14.5 64.65625 8.015625 75.875
z
" id="DejaVuSans-41"/>
</defs>
- <g transform="translate(562.5525 415.438125)scale(0.1 -0.1)">
+ <g transform="translate(561.945 416.878125)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-78"/>
<use transform="translate(74.804688 0.015625)" xlink:href="#DejaVuSans-111"/>
<use transform="translate(135.986328 0.015625)" xlink:href="#DejaVuSans-114"/>
@@ -1384,13 +1384,13 @@ z
<g id="matplotlib.axis_4">
<g id="ytick_7">
<g id="line2d_40">
- <path clip-path="url(#p6ef83378bf)" d="M 477.425 371.345455
-L 845.28 371.345455
+ <path clip-path="url(#p64a8fa4541)" d="M 476.255 372.605455
+L 845.235 372.605455
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_41">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m79c5b0aa28" y="371.345455"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mdeed6be457" y="372.605455"/>
</g>
</g>
<g id="text_23">
@@ -1403,7 +1403,7 @@ L 10.59375 27.203125
z
" id="DejaVuSans-8722"/>
</defs>
- <g transform="translate(442.957812 375.144673)scale(0.1 -0.1)">
+ <g transform="translate(441.787812 376.404673)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-51"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1413,18 +1413,18 @@ z
</g>
<g id="ytick_8">
<g id="line2d_42">
- <path clip-path="url(#p6ef83378bf)" d="M 477.425 323.417364
-L 845.28 323.417364
+ <path clip-path="url(#p64a8fa4541)" d="M 476.255 324.13185
+L 845.235 324.13185
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_43">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m79c5b0aa28" y="323.417364"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mdeed6be457" y="324.13185"/>
</g>
</g>
<g id="text_24">
<!-- −250 -->
- <g transform="translate(442.957812 327.216583)scale(0.1 -0.1)">
+ <g transform="translate(441.787812 327.931069)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-50"/>
<use x="147.412109" xlink:href="#DejaVuSans-53"/>
@@ -1434,18 +1434,18 @@ L 845.28 323.417364
</g>
<g id="ytick_9">
<g id="line2d_44">
- <path clip-path="url(#p6ef83378bf)" d="M 477.425 275.489274
-L 845.28 275.489274
+ <path clip-path="url(#p64a8fa4541)" d="M 476.255 275.658246
+L 845.235 275.658246
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_45">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m79c5b0aa28" y="275.489274"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mdeed6be457" y="275.658246"/>
</g>
</g>
<g id="text_25">
<!-- −200 -->
- <g transform="translate(442.957812 279.288493)scale(0.1 -0.1)">
+ <g transform="translate(441.787812 279.457465)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-50"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1455,18 +1455,18 @@ L 845.28 275.489274
</g>
<g id="ytick_10">
<g id="line2d_46">
- <path clip-path="url(#p6ef83378bf)" d="M 477.425 227.561184
-L 845.28 227.561184
+ <path clip-path="url(#p64a8fa4541)" d="M 476.255 227.184642
+L 845.235 227.184642
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_47">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m79c5b0aa28" y="227.561184"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mdeed6be457" y="227.184642"/>
</g>
</g>
<g id="text_26">
<!-- −150 -->
- <g transform="translate(442.957812 231.360402)scale(0.1 -0.1)">
+ <g transform="translate(441.787812 230.98386)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-49"/>
<use x="147.412109" xlink:href="#DejaVuSans-53"/>
@@ -1476,18 +1476,18 @@ L 845.28 227.561184
</g>
<g id="ytick_11">
<g id="line2d_48">
- <path clip-path="url(#p6ef83378bf)" d="M 477.425 179.633093
-L 845.28 179.633093
+ <path clip-path="url(#p64a8fa4541)" d="M 476.255 178.711037
+L 845.235 178.711037
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_49">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m79c5b0aa28" y="179.633093"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mdeed6be457" y="178.711037"/>
</g>
</g>
<g id="text_27">
<!-- −100 -->
- <g transform="translate(442.957812 183.432312)scale(0.1 -0.1)">
+ <g transform="translate(441.787812 182.510256)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-49"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1497,18 +1497,18 @@ L 845.28 179.633093
</g>
<g id="ytick_12">
<g id="line2d_50">
- <path clip-path="url(#p6ef83378bf)" d="M 477.425 131.705003
-L 845.28 131.705003
+ <path clip-path="url(#p64a8fa4541)" d="M 476.255 130.237433
+L 845.235 130.237433
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_51">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m79c5b0aa28" y="131.705003"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mdeed6be457" y="130.237433"/>
</g>
</g>
<g id="text_28">
<!-- −50 -->
- <g transform="translate(449.320312 135.504222)scale(0.1 -0.1)">
+ <g transform="translate(448.150312 134.036652)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-53"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1517,18 +1517,18 @@ L 845.28 131.705003
</g>
<g id="ytick_13">
<g id="line2d_52">
- <path clip-path="url(#p6ef83378bf)" d="M 477.425 83.776913
-L 845.28 83.776913
+ <path clip-path="url(#p64a8fa4541)" d="M 476.255 81.763829
+L 845.235 81.763829
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_53">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m79c5b0aa28" y="83.776913"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mdeed6be457" y="81.763829"/>
</g>
</g>
<g id="text_29">
<!-- 0 -->
- <g transform="translate(464.0625 87.576132)scale(0.1 -0.1)">
+ <g transform="translate(462.8925 85.563047)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
@@ -1591,7 +1591,7 @@ L 9.8125 0
z
" id="DejaVuSans-66"/>
</defs>
- <g transform="translate(436.878125 236.791406)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(435.708125 236.251406)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-71"/>
<use x="77.490234" xlink:href="#DejaVuSans-97"/>
<use x="138.769531" xlink:href="#DejaVuSans-105"/>
@@ -1605,523 +1605,524 @@ z
</g>
</g>
<g id="line2d_54">
- <path clip-path="url(#p6ef83378bf)" d="M 477.425 55.054545
-L 478.861934 55.158276
-L 480.298867 55.47104
-L 481.735801 55.997662
-L 483.172734 56.746588
-L 484.609668 57.730564
-L 486.046602 58.967746
-L 487.483535 60.483495
-L 488.920469 62.313275
-L 490.357402 64.507505
-L 491.794336 67.140097
-L 493.23127 70.324601
-L 494.668203 74.247796
-L 496.105137 79.249914
-L 496.823604 82.353589
-L 497.54207 86.061206
-L 498.260537 90.674224
-L 498.979004 96.829637
-L 499.697471 106.372877
-L 500.415938 371.345455
-L 501.134404 141.854306
-L 501.852871 108.312241
-L 502.571338 99.612562
-L 503.289805 94.419886
-L 504.008271 90.808207
-L 504.726738 88.124546
-L 505.445205 86.06325
-L 506.163672 84.456064
-L 506.882139 83.200721
-L 507.600605 82.230848
-L 508.319072 81.501413
-L 509.037539 80.980994
-L 509.756006 80.647366
-L 510.474473 80.484867
-L 511.192939 80.482778
-L 511.911406 80.634314
-L 512.629873 80.936038
-L 513.34834 81.387564
-L 514.066807 81.991514
-L 514.785273 82.753708
-L 516.222207 84.795284
-L 517.659141 87.651254
-L 518.377607 89.463265
-L 519.096074 91.602558
-L 519.814541 94.157508
-L 520.533008 97.27168
-L 521.251475 101.202517
-L 521.969941 106.494138
-L 522.688408 114.749334
-L 523.406875 371.345455
-L 524.125342 123.962677
-L 524.843809 141.809046
-L 525.562275 116.493314
-L 526.280742 108.418336
-L 526.999209 103.51543
-L 527.717676 100.029499
-L 528.436143 97.384937
-L 529.154609 95.313461
-L 529.873076 93.666806
-L 530.591543 92.354305
-L 531.31001 91.31676
-L 532.028477 90.51383
-L 532.746943 89.917313
-L 533.46541 89.507313
-L 534.183877 89.269955
-L 534.902344 89.19598
-L 535.620811 89.279906
-L 536.339277 89.519566
-L 537.057744 89.915926
-L 537.776211 90.473174
-L 538.494678 91.199077
-L 539.213145 92.10569
-L 539.931611 93.210556
-L 540.650078 94.538695
-L 541.368545 96.125944
-L 542.087012 98.024807
-L 542.805479 100.315437
-L 543.523945 103.128365
-L 544.242412 106.69878
-L 544.960879 111.52906
-L 545.679346 119.132781
-L 546.397812 371.345455
-L 547.116279 124.889863
-L 547.834746 124.679894
-L 548.553213 141.733393
-L 549.27168 121.007994
-L 549.990146 113.262165
-L 550.708613 108.597702
-L 551.42708 105.271855
-L 552.145547 102.736629
-L 552.864014 100.741314
-L 553.58248 99.148585
-L 554.300947 97.874846
-L 555.019414 96.865689
-L 555.737881 96.084175
-L 556.456348 95.504638
-L 557.174814 95.109182
-L 557.893281 94.885604
-L 558.611748 94.826153
-L 559.330215 94.92681
-L 560.048682 95.186941
-L 560.767148 95.609255
-L 561.485615 96.200051
-L 562.204082 96.969821
-L 562.922549 97.934325
-L 563.641016 99.116421
-L 564.359482 100.549171
-L 565.077949 102.281325
-L 565.796416 104.387698
-L 566.514883 106.990817
-L 567.23335 110.313137
-L 567.951816 114.835282
-L 568.670283 122.030082
-L 569.38875 371.345455
-L 570.107217 126.181791
-L 570.825684 123.71229
-L 571.54415 125.764514
-L 572.262617 141.627015
-L 572.981084 124.12033
-L 573.699551 116.538476
-L 574.418018 112.045145
-L 575.136484 108.854368
-L 575.854951 106.425034
-L 576.573418 104.514466
-L 577.291885 102.991371
-L 578.010352 101.776513
-L 578.728818 100.818688
-L 579.447285 100.083402
-L 580.165752 99.546953
-L 580.884219 99.193106
-L 581.602686 99.011171
-L 582.321152 98.994869
-L 583.039619 99.141736
-L 583.758086 99.452901
-L 584.476553 99.933208
-L 585.19502 100.591706
-L 585.913486 101.442621
-L 586.631953 102.507061
-L 587.35042 103.815961
-L 588.068887 105.415342
-L 588.787354 107.376326
-L 589.50582 109.816183
-L 590.224287 112.949492
-L 590.942754 117.244365
-L 591.661221 124.152293
-L 592.379688 371.345455
-L 593.098154 127.347503
-L 593.816621 123.906775
-L 594.535088 123.79093
-L 595.253555 126.71333
-L 595.972021 141.489434
-L 596.690488 126.495173
-L 597.408955 118.979837
-L 598.127422 114.609939
-L 598.845889 111.529597
-L 599.564355 109.194472
-L 600.282822 107.364871
-L 601.001289 105.912756
-L 601.719756 104.761618
-L 602.438223 103.86247
-L 603.156689 103.18266
-L 603.875156 102.700083
-L 604.593623 102.399979
-L 605.31209 102.27311
-L 606.030557 102.314744
-L 606.749023 102.524176
-L 607.46749 102.90467
-L 608.185957 103.463825
-L 608.904424 104.214433
-L 609.622891 105.176077
-L 610.341357 106.377957
-L 611.059824 107.863991
-L 611.778291 109.702598
-L 612.496758 112.007401
-L 613.215225 114.987793
-L 613.933691 119.104121
-L 614.652158 125.795567
-L 615.370625 371.345455
-L 616.089092 128.342201
-L 616.807559 124.348207
-L 617.526025 123.289283
-L 618.244492 124.122552
-L 618.962959 127.485376
-L 619.681426 141.320022
-L 620.399893 128.414213
-L 621.118359 120.901665
-L 621.836826 116.622074
-L 622.555293 113.632939
-L 623.27376 111.381068
-L 623.992227 109.626852
-L 624.710693 108.243836
-L 625.42916 107.157234
-L 626.147627 106.319659
-L 626.866094 105.69993
-L 627.584561 105.277341
-L 628.303027 105.038546
-L 629.021494 104.975826
-L 629.739961 105.086191
-L 630.458428 105.371065
-L 631.176895 105.836463
-L 631.895361 106.493727
-L 632.613828 107.361008
-L 633.332295 108.465991
-L 634.050762 109.850867
-L 634.769229 111.581971
-L 635.487695 113.77025
-L 636.206162 116.621486
-L 636.924629 120.590907
-L 637.643096 127.11004
-L 638.361562 371.345455
-L 639.080029 129.178928
-L 639.798496 124.820807
-L 640.516963 123.221503
-L 641.23543 123.135459
-L 641.953896 124.480805
-L 642.672363 128.096239
-L 643.39083 141.11798
-L 644.109297 130.02202
-L 644.827764 122.466602
-L 645.54623 118.253754
-L 646.264697 115.341392
-L 646.983164 113.163961
-L 647.701631 111.480144
-L 648.420098 110.164028
-L 649.138564 109.141919
-L 649.857031 108.367652
-L 650.575498 107.811313
-L 651.293965 107.453535
-L 652.012432 107.282444
-L 652.730898 107.292038
-L 653.449365 107.48144
-L 654.167832 107.854812
-L 654.886299 108.421908
-L 655.604766 109.199429
-L 656.323232 110.213628
-L 657.041699 111.505187
-L 657.760166 113.138725
-L 658.478633 115.223118
-L 659.1971 117.961498
-L 659.915566 121.805522
-L 660.634033 128.181657
-L 661.3525 366.561652
-L 662.070967 129.877182
-L 662.789434 125.256587
-L 663.5079 123.300233
-L 664.226367 122.684609
-L 664.944834 123.131944
-L 665.663301 124.796363
-L 666.381768 128.566725
-L 667.100234 140.882327
-L 667.818701 131.402303
-L 668.537168 123.768602
-L 669.255635 119.605279
-L 669.974102 116.758953
-L 670.692568 114.649267
-L 671.411035 113.032032
-L 672.129502 111.781208
-L 672.847969 110.823799
-L 673.566436 110.114655
-L 674.284902 109.625065
-L 675.003369 109.337057
-L 675.721836 109.240429
-L 676.440303 109.33126
-L 677.15877 109.611395
-L 677.877236 110.088725
-L 678.595703 110.778358
-L 679.31417 111.705091
-L 680.032637 112.90818
-L 680.751104 114.450737
-L 681.46957 116.439932
-L 682.188037 119.076841
-L 682.906504 122.810495
-L 683.624971 129.063826
-L 684.343438 371.345455
-L 685.061904 130.454004
-L 685.780371 125.631685
-L 686.498838 123.417174
-L 687.217305 122.450436
-L 687.935771 122.37776
-L 688.654238 123.163863
-L 689.372705 125.04552
-L 690.091172 128.914447
-L 690.809639 140.611868
-L 692.246572 124.866327
-L 692.965039 120.73967
-L 693.683506 117.951461
-L 694.401973 115.904685
-L 695.120439 114.351478
-L 695.838906 113.165248
-L 696.557373 112.273477
-L 697.27584 111.631956
-L 697.994307 111.213231
-L 698.712773 111.000923
-L 699.43124 110.986864
-L 700.149707 111.169828
-L 700.868174 111.555368
-L 701.586641 112.156718
-L 702.305107 112.997077
-L 703.023574 114.114242
-L 703.742041 115.5699
-L 704.460508 117.469718
-L 705.178975 120.013078
-L 705.897441 123.646964
-L 706.615908 129.79171
-L 707.334375 371.345455
-L 708.052842 130.922827
-L 708.771309 125.937751
-L 709.489775 123.524332
-L 710.208242 122.303069
-L 710.926709 121.884501
-L 711.645176 122.159353
-L 712.363643 123.181214
-L 713.082109 125.22021
-L 713.800576 129.152965
-L 714.519043 140.305169
-L 715.23751 133.67362
-L 715.955977 125.798485
-L 716.674443 121.698753
-L 717.39291 118.962944
-L 718.111377 116.975853
-L 718.829844 115.485379
-L 719.548311 114.364113
-L 720.266777 113.539929
-L 720.985244 112.969612
-L 721.703711 112.627156
-L 722.422178 112.498139
-L 723.140645 112.577037
-L 723.859111 112.866304
-L 724.577578 113.376818
-L 725.296045 114.129891
-L 726.014512 115.161716
-L 726.732979 116.532518
-L 727.451445 118.346541
-L 728.169912 120.801666
-L 728.888379 124.343193
-L 729.606846 130.389425
-L 730.325313 371.345455
-L 731.043779 131.293848
-L 731.762246 126.172252
-L 732.480713 123.597993
-L 733.19918 122.180196
-L 733.917646 121.510285
-L 734.636113 121.443985
-L 735.35458 121.962779
-L 736.073047 123.159566
-L 736.791514 125.318037
-L 737.50998 129.292317
-L 738.228447 139.960515
-L 738.946914 134.624641
-L 739.665381 126.59164
-L 740.383848 122.511425
-L 741.102314 119.824094
-L 741.820781 117.894908
-L 742.539248 116.467122
-L 743.257715 115.412387
-L 743.976182 114.659006
-L 744.694648 114.16494
-L 745.413115 113.905997
-L 746.131582 113.870316
-L 746.850049 114.056004
-L 747.568516 114.470809
-L 748.286982 115.13367
-L 749.005449 116.078881
-L 749.723916 117.365056
-L 750.442383 119.094973
-L 751.16085 121.465092
-L 751.879316 124.919217
-L 752.597783 130.873972
-L 753.31625 371.345455
-L 754.034717 131.574617
-L 754.753184 126.334734
-L 755.47165 123.625293
-L 756.190117 122.048273
-L 756.908584 121.183898
-L 757.627051 120.869117
-L 758.345518 121.051148
-L 759.063984 121.752609
-L 759.782451 123.085676
-L 760.500918 125.338492
-L 761.219385 129.339675
-L 761.937852 139.57586
-L 762.656318 135.478811
-L 763.374785 127.264506
-L 764.093252 123.198233
-L 764.811719 120.557005
-L 765.530186 118.685305
-L 766.248652 117.321469
-L 766.967119 116.336205
-L 767.685586 115.658414
-L 768.404053 115.24759
-L 769.12252 115.081959
-L 769.840986 115.153204
-L 770.559453 115.46468
-L 771.27792 116.032163
-L 771.996387 116.887554
-L 772.714854 118.087557
-L 773.43332 119.733332
-L 774.151787 122.019872
-L 774.870254 125.389556
-L 775.588721 131.25752
-L 776.307188 371.345455
-L 777.025654 131.770517
-L 777.744121 126.42524
-L 778.462588 123.598454
-L 779.181055 121.887373
-L 779.899521 120.865172
-L 780.617988 120.357773
-L 781.336455 120.29395
-L 782.054922 120.662766
-L 782.773389 121.507887
-L 783.491855 122.951419
-L 784.210322 125.281368
-L 784.928789 129.299861
-L 785.647256 139.14876
-L 786.365723 136.249622
-L 787.084189 127.830448
-L 787.802656 123.774077
-L 788.521123 121.17799
-L 789.23959 119.364727
-L 789.958057 118.067543
-L 790.676523 117.156326
-L 791.39499 116.560919
-L 792.113457 116.242948
-L 792.831924 116.184035
-L 793.550391 116.381024
-L 794.268857 116.84525
-L 794.987324 117.605417
-L 795.705791 118.715819
-L 796.424258 120.275693
-L 797.142725 122.478405
-L 797.861191 125.764867
-L 798.579658 131.54879
-L 799.298125 371.345455
-L 800.016592 131.885125
-L 800.735059 126.443577
-L 801.453525 123.512051
-L 802.171992 121.684403
-L 802.890459 120.529097
-L 803.608926 119.865101
-L 804.327393 119.610329
-L 805.045859 119.735729
-L 805.764326 120.252102
-L 806.482793 121.214758
-L 807.20126 122.750922
-L 807.919727 125.146016
-L 808.638193 129.175701
-L 809.35666 138.676288
-L 810.075127 136.947436
-L 810.793594 128.299
-L 811.512061 124.249862
-L 812.230527 121.699355
-L 812.948994 119.946954
-L 813.667461 118.720796
-L 814.385928 117.89025
-L 815.104395 117.386679
-L 815.822861 117.174818
-L 816.541328 117.241294
-L 817.259795 117.590847
-L 817.978262 118.247688
-L 818.696729 119.262882
-L 819.415195 120.733236
-L 820.133662 122.85018
-L 820.852129 126.052995
-L 821.570596 131.753916
-L 822.289062 371.345455
-L 823.007529 131.920438
-L 823.725996 126.388941
-L 824.444463 123.361577
-L 825.16293 121.429709
-L 825.881396 120.158479
-L 826.599863 119.362198
-L 827.31833 118.95192
-L 828.036797 118.887896
-L 828.755264 119.163131
-L 829.47373 119.800746
-L 830.192197 120.862826
-L 830.910664 122.479062
-L 831.629131 124.930951
-L 832.347598 128.968239
-L 833.066064 138.154918
-L 833.784531 137.580377
-L 834.502998 128.676811
-L 835.221465 124.633569
-L 835.939932 122.130563
-L 836.658398 120.443146
-L 837.376865 119.294459
-L 838.095332 118.553886
-L 838.813799 118.155273
-L 839.532266 118.068065
-L 840.250732 118.286627
-L 840.969199 118.828488
-L 841.687666 119.740166
-L 842.406133 121.11521
-L 843.1246 123.142598
-L 843.843066 126.259662
-L 844.561533 131.876999
-L 844.561533 131.876999
+ <path clip-path="url(#p64a8fa4541)" d="M 476.255 52.714545
+L 477.696328 52.819457
+L 479.137656 53.13578
+L 480.578984 53.668396
+L 482.020312 54.425847
+L 483.461641 55.421022
+L 484.902969 56.672285
+L 486.344297 58.205287
+L 487.785625 60.055893
+L 489.226953 62.275098
+L 490.668281 64.937654
+L 492.109609 68.158403
+L 493.550937 72.126252
+L 494.992266 77.185304
+L 495.71293 80.324305
+L 496.433594 84.074122
+L 497.154258 88.739645
+L 497.874922 94.965118
+L 498.595586 104.616978
+L 499.31625 372.605455
+L 500.036914 140.502255
+L 500.757578 106.578416
+L 501.478242 97.779718
+L 502.198906 92.527939
+L 502.91957 88.875152
+L 503.640234 86.160946
+L 504.360898 84.076189
+L 505.081562 82.45071
+L 505.802227 81.181079
+L 506.522891 80.200166
+L 507.243555 79.462429
+L 507.964219 78.936087
+L 508.684883 78.598661
+L 509.405547 78.434313
+L 510.126211 78.4322
+L 510.846875 78.585461
+L 511.567539 78.890619
+L 512.288203 79.347285
+L 513.008867 79.958109
+L 513.729531 80.728978
+L 514.450195 81.66949
+L 515.891523 84.121963
+L 516.612187 85.682267
+L 517.332852 87.514902
+L 518.053516 89.678545
+L 518.77418 92.262575
+L 519.494844 95.412192
+L 520.215508 99.38777
+L 520.936172 104.73962
+L 521.656836 113.088776
+L 522.3775 372.605455
+L 523.098164 122.406984
+L 523.818828 140.456479
+L 524.539492 114.852605
+L 525.260156 106.685719
+L 525.98082 101.727008
+L 526.701484 98.201401
+L 527.422148 95.526738
+L 528.142812 93.431685
+L 528.863477 91.766288
+L 529.584141 90.438848
+L 530.304805 89.389494
+L 531.025469 88.577425
+L 531.746133 87.974118
+L 532.466797 87.559452
+L 533.187461 87.319392
+L 533.908125 87.244575
+L 534.628789 87.329457
+L 535.349453 87.571845
+L 536.070117 87.972716
+L 536.790781 88.536306
+L 537.511445 89.270471
+L 538.232109 90.187403
+L 538.952773 91.304844
+L 539.673437 92.648101
+L 540.394102 94.253416
+L 541.114766 96.173891
+L 541.83543 98.490593
+L 542.556094 101.335538
+L 543.276758 104.946591
+L 543.997422 109.831849
+L 544.718086 117.522115
+L 545.43875 372.605455
+L 546.159414 123.344724
+L 546.880078 123.132365
+L 547.600742 140.379965
+L 548.321406 119.418671
+L 549.04207 111.58468
+L 549.762734 106.867126
+L 550.483398 103.503424
+L 551.204062 100.939343
+L 551.924727 98.921318
+L 552.645391 97.31046
+L 553.366055 96.022223
+L 554.086719 95.001581
+L 554.807383 94.211171
+L 555.528047 93.625038
+L 556.248711 93.225081
+L 556.969375 92.998959
+L 557.690039 92.938831
+L 558.410703 93.040633
+L 559.131367 93.303725
+L 559.852031 93.730846
+L 560.572695 94.328367
+L 561.293359 95.106898
+L 562.014023 96.082379
+L 562.734687 97.27793
+L 563.455352 98.726987
+L 564.176016 100.478856
+L 564.89668 102.609204
+L 565.617344 105.241952
+L 566.338008 108.602086
+L 567.058672 113.175702
+L 567.779336 120.452392
+L 568.5 372.605455
+L 569.220664 124.651356
+L 569.941328 122.153748
+L 570.661992 124.22933
+L 571.382656 140.272376
+L 572.10332 122.566432
+L 572.823984 114.898281
+L 573.544648 110.353808
+L 574.265312 107.126714
+L 574.985977 104.669729
+L 575.706641 102.737415
+L 576.427305 101.196985
+L 577.147969 99.968299
+L 577.868633 98.999572
+L 578.589297 98.255918
+L 579.309961 97.713362
+L 580.030625 97.355488
+L 580.751289 97.171482
+L 581.471953 97.154994
+L 582.192617 97.303533
+L 582.913281 97.618239
+L 583.633945 98.104013
+L 584.354609 98.770006
+L 585.075273 99.630606
+L 585.795937 100.707162
+L 586.516602 102.03096
+L 587.237266 103.648545
+L 587.95793 105.631848
+L 588.678594 108.099476
+L 589.399258 111.268449
+L 590.119922 115.612205
+L 590.840586 122.598758
+L 591.56125 372.605455
+L 592.281914 125.830336
+L 593.002578 122.350446
+L 593.723242 122.233283
+L 594.443906 125.188945
+L 595.16457 140.13323
+L 595.885234 124.968305
+L 596.605898 117.36743
+L 597.326562 112.947794
+L 598.047227 109.832392
+L 598.767891 107.470688
+L 599.488555 105.620264
+L 600.209219 104.151621
+L 600.929883 102.98738
+L 601.650547 102.077998
+L 602.371211 101.390451
+L 603.091875 100.902381
+L 603.812539 100.598861
+L 604.533203 100.470548
+L 605.253867 100.512657
+L 605.974531 100.724472
+L 606.695195 101.109297
+L 607.415859 101.674816
+L 608.136523 102.433967
+L 608.857187 103.406556
+L 609.577852 104.622116
+L 610.298516 106.125064
+L 611.01918 107.984598
+L 611.739844 110.315635
+L 612.460508 113.329949
+L 613.181172 117.493129
+L 613.901836 124.260736
+L 614.6225 372.605455
+L 615.343164 126.836355
+L 616.063828 122.796902
+L 616.784492 121.725926
+L 617.505156 122.568679
+L 618.22582 125.969778
+L 618.946484 139.961889
+L 619.667148 126.909188
+L 620.387812 119.311132
+L 621.108477 114.982831
+L 621.829141 111.959674
+L 622.549805 109.682172
+L 623.270469 107.90799
+L 623.991133 106.509233
+L 624.711797 105.410263
+L 625.432461 104.563155
+L 626.153125 103.936372
+L 626.873789 103.508973
+L 627.594453 103.26746
+L 628.315117 103.204026
+L 629.035781 103.315648
+L 629.756445 103.603764
+L 630.477109 104.074459
+L 631.197773 104.739204
+L 631.918437 105.616356
+L 632.639102 106.733916
+L 633.359766 108.134555
+L 634.08043 109.885362
+L 634.801094 112.098548
+L 635.521758 114.982237
+L 636.242422 118.996837
+L 636.963086 125.59017
+L 637.68375 372.605455
+L 638.404414 127.682606
+L 639.125078 123.274881
+L 639.845742 121.657374
+L 640.566406 121.570351
+L 641.28707 122.931009
+L 642.007734 126.587595
+L 642.728398 139.757548
+L 643.449062 128.535295
+L 644.169727 120.893882
+L 644.890391 116.633082
+L 645.611055 113.687573
+L 646.331719 111.485358
+L 647.052383 109.782376
+L 647.773047 108.451281
+L 648.493711 107.417538
+L 649.214375 106.634458
+L 649.935039 106.071787
+L 650.655703 105.709936
+L 651.376367 105.536898
+L 652.097031 105.546601
+L 652.817695 105.738159
+L 653.538359 106.115781
+L 654.259023 106.689332
+L 654.979687 107.475702
+L 655.700352 108.501445
+L 656.421016 109.807704
+L 657.14168 111.459835
+L 657.862344 113.567952
+L 658.583008 116.337501
+L 659.303672 120.225277
+L 660.024336 126.673985
+L 660.745 367.767203
+L 661.465664 128.388807
+L 662.186328 123.715621
+L 662.906992 121.737
+L 663.627656 121.114369
+L 664.34832 121.566796
+L 665.068984 123.250159
+L 665.789648 127.063436
+L 666.510312 139.519212
+L 667.230977 129.931288
+L 667.951641 122.210701
+L 668.672305 117.999991
+L 669.392969 115.121268
+L 670.113633 112.98757
+L 670.834297 111.351927
+L 671.554961 110.086867
+L 672.275625 109.11856
+L 672.996289 108.401345
+L 673.716953 107.906183
+L 674.437617 107.614897
+L 675.158281 107.517168
+L 675.878945 107.609033
+L 676.599609 107.892357
+L 677.320273 108.37512
+L 678.040937 109.072602
+L 678.761602 110.009884
+L 679.482266 111.226666
+L 680.20293 112.78678
+L 680.923594 114.798616
+L 681.644258 117.465538
+L 682.364922 121.241688
+L 683.085586 127.566195
+L 683.80625 372.605455
+L 684.526914 128.972195
+L 685.247578 124.094989
+L 685.968242 121.855273
+L 686.688906 120.877531
+L 687.40957 120.804028
+L 688.130234 121.599078
+L 688.850898 123.502153
+L 689.571562 127.415115
+L 690.292227 139.245675
+L 691.733555 123.32092
+L 692.454219 119.147293
+L 693.174883 116.327349
+L 693.895547 114.257277
+L 694.616211 112.686392
+L 695.336875 111.48666
+L 696.057539 110.584739
+L 696.778203 109.935916
+L 697.498867 109.512425
+L 698.219531 109.2977
+L 698.940195 109.283481
+L 699.660859 109.468528
+L 700.381523 109.858456
+L 701.102187 110.466651
+L 701.822852 111.316575
+L 702.543516 112.446456
+L 703.26418 113.918682
+L 703.984844 115.840123
+L 704.705508 118.412431
+L 705.426172 122.087678
+L 706.146836 128.302363
+L 706.8675 372.605455
+L 707.588164 129.446354
+L 708.308828 124.404539
+L 709.029492 121.96365
+L 709.750156 120.728486
+L 710.47082 120.305154
+L 711.191484 120.583135
+L 711.912148 121.616626
+L 712.632812 123.67883
+L 713.353477 127.656347
+L 714.074141 138.935485
+L 714.794805 132.228456
+L 715.515469 124.263688
+L 716.236133 120.117293
+L 716.956797 117.350345
+L 717.677461 115.340637
+L 718.398125 113.833198
+L 719.118789 112.69917
+L 719.839453 111.865605
+L 720.560117 111.288797
+L 721.280781 110.942444
+L 722.001445 110.811958
+L 722.722109 110.891754
+L 723.442773 111.184313
+L 724.163437 111.700637
+L 724.884102 112.462282
+L 725.604766 113.505851
+L 726.32543 114.892256
+L 727.046094 116.726926
+L 727.766758 119.209995
+L 728.487422 122.791831
+L 729.208086 128.906881
+L 729.92875 372.605455
+L 730.649414 129.821599
+L 731.370078 124.641709
+L 732.090742 122.03815
+L 732.811406 120.604216
+L 733.53207 119.92668
+L 734.252734 119.859624
+L 734.973398 120.384324
+L 735.694062 121.594732
+L 736.414727 123.777771
+L 737.135391 127.797286
+L 737.856055 138.586909
+L 738.576719 133.190303
+L 739.297383 125.06587
+L 740.018047 120.939214
+L 740.738711 118.221296
+L 741.459375 116.270153
+L 742.180039 114.826115
+L 742.900703 113.759375
+L 743.621367 112.997419
+L 744.342031 112.49773
+L 745.062695 112.23584
+L 745.783359 112.199752
+L 746.504023 112.387554
+L 747.224687 112.80708
+L 747.945352 113.477487
+L 748.666016 114.433456
+L 749.38668 115.734269
+L 750.107344 117.483877
+L 750.828008 119.880972
+L 751.548672 123.374412
+L 752.269336 129.396943
+L 752.99 372.605455
+L 753.710664 130.105563
+L 754.431328 124.80604
+L 755.151992 122.06576
+L 755.872656 120.47079
+L 756.59332 119.596577
+L 757.313984 119.278214
+L 758.034648 119.462316
+L 758.755312 120.171762
+L 759.475977 121.520002
+L 760.196641 123.798459
+L 760.917305 127.845183
+L 761.637969 138.197876
+L 762.358633 134.054195
+L 763.079297 125.746395
+L 763.799961 121.63384
+L 764.520625 118.962549
+L 765.241289 117.069545
+L 765.961953 115.690187
+L 766.682617 114.693709
+L 767.403281 114.008203
+L 768.123945 113.592703
+L 768.844609 113.425186
+L 769.565273 113.497243
+L 770.285937 113.812263
+L 771.006602 114.386206
+L 771.727266 115.251333
+L 772.44793 116.464994
+L 773.168594 118.129501
+L 773.889258 120.442066
+L 774.609922 123.850104
+L 775.330586 129.784857
+L 776.05125 372.605455
+L 776.771914 130.303692
+L 777.492578 124.897576
+L 778.213242 122.038616
+L 778.933906 120.308059
+L 779.65457 119.274224
+L 780.375234 118.76105
+L 781.095898 118.6965
+L 781.816562 119.069514
+L 782.537227 119.924254
+L 783.257891 121.384217
+L 783.978555 123.740684
+L 784.699219 127.804915
+L 785.419883 137.765915
+L 786.140547 134.833778
+L 786.861211 126.318778
+L 787.581875 122.216237
+L 788.302539 119.590602
+L 789.023203 117.756701
+L 789.743867 116.444752
+L 790.464531 115.523164
+L 791.185195 114.92098
+L 791.905859 114.59939
+L 792.626523 114.539806
+L 793.347187 114.739038
+L 794.067852 115.208547
+L 794.788516 115.977367
+L 795.50918 117.100407
+L 796.229844 118.678035
+L 796.950508 120.905819
+L 797.671172 124.229687
+L 798.391836 130.079442
+L 799.1125 372.605455
+L 799.833164 130.419605
+L 800.553828 124.916122
+L 801.274492 121.951229
+L 801.995156 120.102779
+L 802.71582 118.934323
+L 803.436484 118.26277
+L 804.157148 118.005098
+L 804.877812 118.131925
+L 805.598477 118.654176
+L 806.319141 119.627788
+L 807.039805 121.181438
+L 807.760469 123.603792
+L 808.481133 127.679342
+L 809.201797 137.288064
+L 809.922461 135.539535
+L 810.643125 126.792663
+L 811.363789 122.697438
+L 812.084453 120.117902
+L 812.805117 118.345555
+L 813.525781 117.105441
+L 814.246445 116.265441
+L 814.967109 115.756139
+L 815.687773 115.541866
+L 816.408437 115.609099
+L 817.129102 115.962631
+L 817.849766 116.626947
+L 818.57043 117.653696
+L 819.291094 119.140786
+L 820.011758 121.281825
+L 820.732422 124.521094
+L 821.453086 130.286903
+L 822.17375 372.605455
+L 822.894414 130.45532
+L 823.615078 124.860864
+L 824.335742 121.799042
+L 825.056406 119.845186
+L 825.77707 118.559487
+L 826.497734 117.754143
+L 827.218398 117.339195
+L 827.939062 117.274443
+L 828.659727 117.55281
+L 829.380391 118.197682
+L 830.101055 119.271851
+L 830.821719 120.906483
+L 831.542383 123.38628
+L 832.263047 127.469519
+L 832.983711 136.76076
+L 833.704375 136.17968
+L 834.425039 127.174774
+L 835.145703 123.085513
+L 835.866367 120.554018
+L 836.587031 118.847394
+L 837.307695 117.685633
+L 838.028359 116.936631
+L 838.749023 116.533481
+L 839.469687 116.44528
+L 840.190352 116.66633
+L 840.911016 117.214358
+L 841.63168 118.136413
+L 842.352344 119.527107
+L 843.073008 121.577571
+L 843.793672 124.730114
+L 844.514336 130.411387
+L 844.514336 130.411387
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
</g>
<g id="patch_8">
- <path d="M 477.425 387.16
-L 477.425 39.24
+ <path d="M 476.255 388.6
+L 476.255 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_9">
- <path d="M 845.28 387.16
-L 845.28 39.24
+ <path d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_10">
- <path d="M 477.425 387.16
-L 845.28 387.16
+ <path d="M 476.255 388.6
+L 845.235 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_11">
- <path d="M 477.425 39.24
-L 845.28 39.24
+ <path d="M 476.255 36.72
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
@@ -2164,11 +2165,11 @@ z
</g>
</g>
<defs>
- <clipPath id="p454853742e">
- <rect height="347.92" width="367.855" x="47.72" y="39.24"/>
+ <clipPath id="p63898e0c13">
+ <rect height="351.88" width="368.98" x="47.855" y="36.72"/>
</clipPath>
- <clipPath id="p6ef83378bf">
- <rect height="347.92" width="367.855" x="477.425" y="39.24"/>
+ <clipPath id="p64a8fa4541">
+ <rect height="351.88" width="368.98" x="476.255" y="36.72"/>
</clipPath>
</defs>
</svg>
diff --git a/docs/docs/img/window_bartlett_hann.svg b/docs/docs/img/window_bartlett_hann.svg
@@ -19,28 +19,28 @@ z
</g>
<g id="axes_1">
<g id="patch_2">
- <path d="M 47.72 387.16
-L 415.62 387.16
-L 415.62 39.24
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 416.8575 388.6
+L 416.8575 36.72
+L 47.855 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
- <path clip-path="url(#p6449f8ecf9)" d="M 47.72 387.16
-L 47.72 39.24
+ <path clip-path="url(#p557c9d483f)" d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
-" id="mf2365f7846" style="stroke:#000000;stroke-width:0.8;"/>
+" id="m6160f97e38" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mf2365f7846" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m6160f97e38" y="388.6"/>
</g>
</g>
<g id="text_1">
@@ -68,20 +68,20 @@ Q 19.53125 74.21875 31.78125 74.21875
z
" id="DejaVuSans-48"/>
</defs>
- <g transform="translate(44.53875 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(44.67375 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
- <path clip-path="url(#p6449f8ecf9)" d="M 106.116825 387.16
-L 106.116825 39.24
+ <path clip-path="url(#p557c9d483f)" d="M 106.426825 388.6
+L 106.426825 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="106.116825" xlink:href="#mf2365f7846" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="106.426825" xlink:href="#m6160f97e38" y="388.6"/>
</g>
</g>
<g id="text_2">
@@ -101,7 +101,7 @@ L 12.40625 0
z
" id="DejaVuSans-49"/>
</defs>
- <g transform="translate(99.754325 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(100.064325 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -109,13 +109,13 @@ z
</g>
<g id="xtick_3">
<g id="line2d_5">
- <path clip-path="url(#p6449f8ecf9)" d="M 164.513651 387.16
-L 164.513651 39.24
+ <path clip-path="url(#p557c9d483f)" d="M 164.998651 388.6
+L 164.998651 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="164.513651" xlink:href="#mf2365f7846" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="164.998651" xlink:href="#m6160f97e38" y="388.6"/>
</g>
</g>
<g id="text_3">
@@ -146,7 +146,7 @@ Q 31.109375 20.453125 19.1875 8.296875
z
" id="DejaVuSans-50"/>
</defs>
- <g transform="translate(158.151151 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(158.636151 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -154,13 +154,13 @@ z
</g>
<g id="xtick_4">
<g id="line2d_7">
- <path clip-path="url(#p6449f8ecf9)" d="M 222.910476 387.16
-L 222.910476 39.24
+ <path clip-path="url(#p557c9d483f)" d="M 223.570476 388.6
+L 223.570476 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_8">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="222.910476" xlink:href="#mf2365f7846" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="223.570476" xlink:href="#m6160f97e38" y="388.6"/>
</g>
</g>
<g id="text_4">
@@ -199,7 +199,7 @@ Q 46.96875 40.921875 40.578125 39.3125
z
" id="DejaVuSans-51"/>
</defs>
- <g transform="translate(216.547976 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(217.207976 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-51"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -207,13 +207,13 @@ z
</g>
<g id="xtick_5">
<g id="line2d_9">
- <path clip-path="url(#p6449f8ecf9)" d="M 281.307302 387.16
-L 281.307302 39.24
+ <path clip-path="url(#p557c9d483f)" d="M 282.142302 388.6
+L 282.142302 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_10">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="281.307302" xlink:href="#mf2365f7846" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="282.142302" xlink:href="#m6160f97e38" y="388.6"/>
</g>
</g>
<g id="text_5">
@@ -237,7 +237,7 @@ L 4.890625 26.703125
z
" id="DejaVuSans-52"/>
</defs>
- <g transform="translate(274.944802 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(275.779802 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-52"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -245,13 +245,13 @@ z
</g>
<g id="xtick_6">
<g id="line2d_11">
- <path clip-path="url(#p6449f8ecf9)" d="M 339.704127 387.16
-L 339.704127 39.24
+ <path clip-path="url(#p557c9d483f)" d="M 340.714127 388.6
+L 340.714127 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_12">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="339.704127" xlink:href="#mf2365f7846" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="340.714127" xlink:href="#m6160f97e38" y="388.6"/>
</g>
</g>
<g id="text_6">
@@ -282,7 +282,7 @@ Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-53"/>
</defs>
- <g transform="translate(333.341627 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(334.351627 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-53"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -290,13 +290,13 @@ z
</g>
<g id="xtick_7">
<g id="line2d_13">
- <path clip-path="url(#p6449f8ecf9)" d="M 398.100952 387.16
-L 398.100952 39.24
+ <path clip-path="url(#p557c9d483f)" d="M 399.285952 388.6
+L 399.285952 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_14">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="398.100952" xlink:href="#mf2365f7846" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="399.285952" xlink:href="#m6160f97e38" y="388.6"/>
</g>
</g>
<g id="text_7">
@@ -333,7 +333,7 @@ Q 48.484375 72.75 52.59375 71.296875
z
" id="DejaVuSans-54"/>
</defs>
- <g transform="translate(391.738452 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(392.923452 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-54"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -523,7 +523,7 @@ Q 40.578125 54.546875 44.28125 53.078125
z
" id="DejaVuSans-115"/>
</defs>
- <g transform="translate(210.316875 415.436563)scale(0.1 -0.1)">
+ <g transform="translate(211.003125 416.876562)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-83"/>
<use x="63.476562" xlink:href="#DejaVuSans-97"/>
<use x="124.755859" xlink:href="#DejaVuSans-109"/>
@@ -537,18 +537,18 @@ z
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_15">
- <path clip-path="url(#p6449f8ecf9)" d="M 47.72 387.16
-L 415.62 387.16
+ <path clip-path="url(#p557c9d483f)" d="M 47.855 388.6
+L 416.8575 388.6
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_16">
<defs>
<path d="M 0 0
L -3.5 0
-" id="m1f9c7e72e5" style="stroke:#000000;stroke-width:0.8;"/>
+" id="m27aa06dd23" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m1f9c7e72e5" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m27aa06dd23" y="388.6"/>
</g>
</g>
<g id="text_9">
@@ -561,7 +561,7 @@ L 10.6875 0
z
" id="DejaVuSans-46"/>
</defs>
- <g transform="translate(24.816875 390.959219)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 392.399219)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -570,18 +570,18 @@ z
</g>
<g id="ytick_2">
<g id="line2d_17">
- <path clip-path="url(#p6449f8ecf9)" d="M 47.72 320.60454
-L 415.62 320.60454
+ <path clip-path="url(#p557c9d483f)" d="M 47.855 321.287011
+L 416.8575 321.287011
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_18">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m1f9c7e72e5" y="320.60454"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m27aa06dd23" y="321.287011"/>
</g>
</g>
<g id="text_10">
<!-- 0.2 -->
- <g transform="translate(24.816875 324.403759)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 325.08623)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -590,18 +590,18 @@ L 415.62 320.60454
</g>
<g id="ytick_3">
<g id="line2d_19">
- <path clip-path="url(#p6449f8ecf9)" d="M 47.72 254.049081
-L 415.62 254.049081
+ <path clip-path="url(#p557c9d483f)" d="M 47.855 253.974022
+L 416.8575 253.974022
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_20">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m1f9c7e72e5" y="254.049081"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m27aa06dd23" y="253.974022"/>
</g>
</g>
<g id="text_11">
<!-- 0.4 -->
- <g transform="translate(24.816875 257.8483)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 257.773241)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -610,18 +610,18 @@ L 415.62 254.049081
</g>
<g id="ytick_4">
<g id="line2d_21">
- <path clip-path="url(#p6449f8ecf9)" d="M 47.72 187.493621
-L 415.62 187.493621
+ <path clip-path="url(#p557c9d483f)" d="M 47.855 186.661033
+L 416.8575 186.661033
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_22">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m1f9c7e72e5" y="187.493621"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m27aa06dd23" y="186.661033"/>
</g>
</g>
<g id="text_12">
<!-- 0.6 -->
- <g transform="translate(24.816875 191.29284)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 190.460252)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -630,13 +630,13 @@ L 415.62 187.493621
</g>
<g id="ytick_5">
<g id="line2d_23">
- <path clip-path="url(#p6449f8ecf9)" d="M 47.72 120.938162
-L 415.62 120.938162
+ <path clip-path="url(#p557c9d483f)" d="M 47.855 119.348044
+L 416.8575 119.348044
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_24">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m1f9c7e72e5" y="120.938162"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m27aa06dd23" y="119.348044"/>
</g>
</g>
<g id="text_13">
@@ -682,7 +682,7 @@ Q 18.3125 60.0625 18.3125 54.390625
z
" id="DejaVuSans-56"/>
</defs>
- <g transform="translate(24.816875 124.73738)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 123.147263)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -691,18 +691,18 @@ z
</g>
<g id="ytick_6">
<g id="line2d_25">
- <path clip-path="url(#p6449f8ecf9)" d="M 47.72 54.382702
-L 415.62 54.382702
+ <path clip-path="url(#p557c9d483f)" d="M 47.855 52.035055
+L 416.8575 52.035055
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_26">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m1f9c7e72e5" y="54.382702"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m27aa06dd23" y="52.035055"/>
</g>
</g>
<g id="text_14">
<!-- 1.0 -->
- <g transform="translate(24.816875 58.181921)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 55.834274)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -805,7 +805,7 @@ Q 14.796875 37.203125 14.796875 27.296875
z
" id="DejaVuSans-100"/>
</defs>
- <g transform="translate(18.737188 238.822656)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(18.872187 238.282656)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-65"/>
<use x="68.408203" xlink:href="#DejaVuSans-109"/>
<use x="165.820312" xlink:href="#DejaVuSans-112"/>
@@ -819,70 +819,70 @@ z
</g>
</g>
<g id="line2d_27">
- <path clip-path="url(#p6449f8ecf9)" d="M 47.72 387.16
-L 53.559683 383.996169
-L 59.399365 379.581812
-L 65.239048 373.935604
-L 71.07873 367.088461
-L 76.918413 359.083233
-L 82.758095 349.974283
-L 88.597778 339.82694
-L 94.43746 328.716856
-L 100.277143 316.729248
-L 106.116825 303.958056
-L 111.956508 290.505009
-L 117.79619 276.478609
-L 123.635873 261.99306
-L 129.475556 247.167127
-L 135.315238 232.122957
-L 141.154921 216.98487
-L 146.994603 201.878114
-L 152.834286 186.92763
-L 158.673968 172.256803
-L 164.513651 157.986241
-L 170.353333 144.232572
-L 176.193016 131.107289
-L 182.032698 118.715637
-L 187.872381 107.155573
-L 193.712063 96.516786
-L 199.551746 86.879812
-L 205.391429 78.315228
-L 211.231111 70.882955
-L 217.070794 64.631661
-L 222.910476 59.598273
-L 228.750159 55.807619
-L 234.589841 55.807619
-L 240.429524 59.598273
-L 246.269206 64.631661
-L 252.108889 70.882955
-L 257.948571 78.315228
-L 263.788254 86.879812
-L 269.627937 96.516786
-L 275.467619 107.155573
-L 281.307302 118.715637
-L 287.146984 131.107289
-L 292.986667 144.232572
-L 298.826349 157.986241
-L 304.666032 172.256803
-L 310.505714 186.92763
-L 316.345397 201.878114
-L 322.185079 216.98487
-L 328.024762 232.122957
-L 333.864444 247.167127
-L 339.704127 261.99306
-L 345.54381 276.478609
-L 351.383492 290.505009
-L 357.223175 303.958056
-L 363.062857 316.729248
-L 368.90254 328.716856
-L 374.742222 339.82694
-L 380.581905 349.974283
-L 386.421587 359.083233
-L 392.26127 367.088461
-L 398.100952 373.935604
-L 403.940635 379.581812
-L 409.780317 383.996169
-L 415.62 387.16
+ <path clip-path="url(#p557c9d483f)" d="M 47.855 388.6
+L 53.712183 385.400158
+L 59.569365 380.935558
+L 65.426548 375.225085
+L 71.28373 368.300008
+L 77.140913 360.203666
+L 82.998095 350.991038
+L 88.855278 340.728199
+L 94.71246 329.49166
+L 100.569643 317.36761
+L 106.426825 304.451058
+L 112.284008 290.844889
+L 118.14119 276.658842
+L 123.998373 262.008419
+L 129.855556 247.013738
+L 135.712738 231.798337
+L 141.569921 216.487949
+L 147.427103 201.209249
+L 153.284286 186.088599
+L 159.141468 171.250791
+L 164.998651 156.817802
+L 170.855833 142.90759
+L 176.713016 129.632916
+L 182.570198 117.100223
+L 188.427381 105.408583
+L 194.284563 94.648706
+L 200.141746 84.902045
+L 205.998929 76.23998
+L 211.856111 68.723113
+L 217.713294 62.400667
+L 223.570476 57.30999
+L 229.427659 53.47619
+L 235.284841 53.47619
+L 241.142024 57.30999
+L 246.999206 62.400667
+L 252.856389 68.723113
+L 258.713571 76.23998
+L 264.570754 84.902045
+L 270.427937 94.648706
+L 276.285119 105.408583
+L 282.142302 117.100223
+L 287.999484 129.632916
+L 293.856667 142.90759
+L 299.713849 156.817802
+L 305.571032 171.250791
+L 311.428214 186.088599
+L 317.285397 201.209249
+L 323.142579 216.487949
+L 328.999762 231.798337
+L 334.856944 247.013738
+L 340.714127 262.008419
+L 346.57131 276.658842
+L 352.428492 290.844889
+L 358.285675 304.451058
+L 364.142857 317.36761
+L 370.00004 329.49166
+L 375.857222 340.728199
+L 381.714405 350.991038
+L 387.571587 360.203666
+L 393.42877 368.300008
+L 399.285952 375.225085
+L 405.143135 380.935558
+L 411.000317 385.400158
+L 416.8575 388.6
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
<defs>
<path d="M 0 1.5
@@ -895,120 +895,120 @@ C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0
C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066
C -0.77937 1.341951 -0.397805 1.5 0 1.5
z
-" id="m17566b54c1" style="stroke:#0072bd;"/>
+" id="m06e05fc0d3" style="stroke:#0072bd;"/>
</defs>
- <g clip-path="url(#p6449f8ecf9)">
- <use style="fill:#0072bd;stroke:#0072bd;" x="47.72" xlink:href="#m17566b54c1" y="387.16"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="53.559683" xlink:href="#m17566b54c1" y="383.996169"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="59.399365" xlink:href="#m17566b54c1" y="379.581812"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="65.239048" xlink:href="#m17566b54c1" y="373.935604"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="71.07873" xlink:href="#m17566b54c1" y="367.088461"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="76.918413" xlink:href="#m17566b54c1" y="359.083233"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="82.758095" xlink:href="#m17566b54c1" y="349.974283"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="88.597778" xlink:href="#m17566b54c1" y="339.82694"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="94.43746" xlink:href="#m17566b54c1" y="328.716856"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="100.277143" xlink:href="#m17566b54c1" y="316.729248"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="106.116825" xlink:href="#m17566b54c1" y="303.958056"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="111.956508" xlink:href="#m17566b54c1" y="290.505009"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="117.79619" xlink:href="#m17566b54c1" y="276.478609"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="123.635873" xlink:href="#m17566b54c1" y="261.99306"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="129.475556" xlink:href="#m17566b54c1" y="247.167127"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="135.315238" xlink:href="#m17566b54c1" y="232.122957"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="141.154921" xlink:href="#m17566b54c1" y="216.98487"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="146.994603" xlink:href="#m17566b54c1" y="201.878114"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="152.834286" xlink:href="#m17566b54c1" y="186.92763"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="158.673968" xlink:href="#m17566b54c1" y="172.256803"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="164.513651" xlink:href="#m17566b54c1" y="157.986241"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="170.353333" xlink:href="#m17566b54c1" y="144.232572"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="176.193016" xlink:href="#m17566b54c1" y="131.107289"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="182.032698" xlink:href="#m17566b54c1" y="118.715637"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="187.872381" xlink:href="#m17566b54c1" y="107.155573"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="193.712063" xlink:href="#m17566b54c1" y="96.516786"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="199.551746" xlink:href="#m17566b54c1" y="86.879812"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="205.391429" xlink:href="#m17566b54c1" y="78.315228"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="211.231111" xlink:href="#m17566b54c1" y="70.882955"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="217.070794" xlink:href="#m17566b54c1" y="64.631661"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="222.910476" xlink:href="#m17566b54c1" y="59.598273"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="228.750159" xlink:href="#m17566b54c1" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="234.589841" xlink:href="#m17566b54c1" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="240.429524" xlink:href="#m17566b54c1" y="59.598273"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="246.269206" xlink:href="#m17566b54c1" y="64.631661"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="252.108889" xlink:href="#m17566b54c1" y="70.882955"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="257.948571" xlink:href="#m17566b54c1" y="78.315228"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="263.788254" xlink:href="#m17566b54c1" y="86.879812"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="269.627937" xlink:href="#m17566b54c1" y="96.516786"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="275.467619" xlink:href="#m17566b54c1" y="107.155573"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="281.307302" xlink:href="#m17566b54c1" y="118.715637"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="287.146984" xlink:href="#m17566b54c1" y="131.107289"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="292.986667" xlink:href="#m17566b54c1" y="144.232572"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="298.826349" xlink:href="#m17566b54c1" y="157.986241"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="304.666032" xlink:href="#m17566b54c1" y="172.256803"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="310.505714" xlink:href="#m17566b54c1" y="186.92763"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="316.345397" xlink:href="#m17566b54c1" y="201.878114"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="322.185079" xlink:href="#m17566b54c1" y="216.98487"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="328.024762" xlink:href="#m17566b54c1" y="232.122957"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="333.864444" xlink:href="#m17566b54c1" y="247.167127"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="339.704127" xlink:href="#m17566b54c1" y="261.99306"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="345.54381" xlink:href="#m17566b54c1" y="276.478609"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="351.383492" xlink:href="#m17566b54c1" y="290.505009"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="357.223175" xlink:href="#m17566b54c1" y="303.958056"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="363.062857" xlink:href="#m17566b54c1" y="316.729248"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="368.90254" xlink:href="#m17566b54c1" y="328.716856"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="374.742222" xlink:href="#m17566b54c1" y="339.82694"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="380.581905" xlink:href="#m17566b54c1" y="349.974283"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="386.421587" xlink:href="#m17566b54c1" y="359.083233"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="392.26127" xlink:href="#m17566b54c1" y="367.088461"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="398.100952" xlink:href="#m17566b54c1" y="373.935604"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="403.940635" xlink:href="#m17566b54c1" y="379.581812"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="409.780317" xlink:href="#m17566b54c1" y="383.996169"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="415.62" xlink:href="#m17566b54c1" y="387.16"/>
+ <g clip-path="url(#p557c9d483f)">
+ <use style="fill:#0072bd;stroke:#0072bd;" x="47.855" xlink:href="#m06e05fc0d3" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="53.712183" xlink:href="#m06e05fc0d3" y="385.400158"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="59.569365" xlink:href="#m06e05fc0d3" y="380.935558"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="65.426548" xlink:href="#m06e05fc0d3" y="375.225085"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="71.28373" xlink:href="#m06e05fc0d3" y="368.300008"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="77.140913" xlink:href="#m06e05fc0d3" y="360.203666"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="82.998095" xlink:href="#m06e05fc0d3" y="350.991038"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="88.855278" xlink:href="#m06e05fc0d3" y="340.728199"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="94.71246" xlink:href="#m06e05fc0d3" y="329.49166"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="100.569643" xlink:href="#m06e05fc0d3" y="317.36761"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="106.426825" xlink:href="#m06e05fc0d3" y="304.451058"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="112.284008" xlink:href="#m06e05fc0d3" y="290.844889"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="118.14119" xlink:href="#m06e05fc0d3" y="276.658842"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="123.998373" xlink:href="#m06e05fc0d3" y="262.008419"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="129.855556" xlink:href="#m06e05fc0d3" y="247.013738"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="135.712738" xlink:href="#m06e05fc0d3" y="231.798337"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="141.569921" xlink:href="#m06e05fc0d3" y="216.487949"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="147.427103" xlink:href="#m06e05fc0d3" y="201.209249"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="153.284286" xlink:href="#m06e05fc0d3" y="186.088599"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="159.141468" xlink:href="#m06e05fc0d3" y="171.250791"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="164.998651" xlink:href="#m06e05fc0d3" y="156.817802"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="170.855833" xlink:href="#m06e05fc0d3" y="142.90759"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="176.713016" xlink:href="#m06e05fc0d3" y="129.632916"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="182.570198" xlink:href="#m06e05fc0d3" y="117.100223"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="188.427381" xlink:href="#m06e05fc0d3" y="105.408583"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="194.284563" xlink:href="#m06e05fc0d3" y="94.648706"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="200.141746" xlink:href="#m06e05fc0d3" y="84.902045"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="205.998929" xlink:href="#m06e05fc0d3" y="76.23998"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="211.856111" xlink:href="#m06e05fc0d3" y="68.723113"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="217.713294" xlink:href="#m06e05fc0d3" y="62.400667"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="223.570476" xlink:href="#m06e05fc0d3" y="57.30999"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="229.427659" xlink:href="#m06e05fc0d3" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="235.284841" xlink:href="#m06e05fc0d3" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="241.142024" xlink:href="#m06e05fc0d3" y="57.30999"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="246.999206" xlink:href="#m06e05fc0d3" y="62.400667"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="252.856389" xlink:href="#m06e05fc0d3" y="68.723113"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="258.713571" xlink:href="#m06e05fc0d3" y="76.23998"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="264.570754" xlink:href="#m06e05fc0d3" y="84.902045"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="270.427937" xlink:href="#m06e05fc0d3" y="94.648706"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="276.285119" xlink:href="#m06e05fc0d3" y="105.408583"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="282.142302" xlink:href="#m06e05fc0d3" y="117.100223"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="287.999484" xlink:href="#m06e05fc0d3" y="129.632916"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="293.856667" xlink:href="#m06e05fc0d3" y="142.90759"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="299.713849" xlink:href="#m06e05fc0d3" y="156.817802"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="305.571032" xlink:href="#m06e05fc0d3" y="171.250791"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="311.428214" xlink:href="#m06e05fc0d3" y="186.088599"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="317.285397" xlink:href="#m06e05fc0d3" y="201.209249"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="323.142579" xlink:href="#m06e05fc0d3" y="216.487949"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="328.999762" xlink:href="#m06e05fc0d3" y="231.798337"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="334.856944" xlink:href="#m06e05fc0d3" y="247.013738"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="340.714127" xlink:href="#m06e05fc0d3" y="262.008419"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="346.57131" xlink:href="#m06e05fc0d3" y="276.658842"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="352.428492" xlink:href="#m06e05fc0d3" y="290.844889"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="358.285675" xlink:href="#m06e05fc0d3" y="304.451058"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="364.142857" xlink:href="#m06e05fc0d3" y="317.36761"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="370.00004" xlink:href="#m06e05fc0d3" y="329.49166"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="375.857222" xlink:href="#m06e05fc0d3" y="340.728199"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="381.714405" xlink:href="#m06e05fc0d3" y="350.991038"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="387.571587" xlink:href="#m06e05fc0d3" y="360.203666"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="393.42877" xlink:href="#m06e05fc0d3" y="368.300008"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="399.285952" xlink:href="#m06e05fc0d3" y="375.225085"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="405.143135" xlink:href="#m06e05fc0d3" y="380.935558"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="411.000317" xlink:href="#m06e05fc0d3" y="385.400158"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="416.8575" xlink:href="#m06e05fc0d3" y="388.6"/>
</g>
</g>
<g id="patch_3">
- <path d="M 47.72 387.16
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
- <path d="M 415.62 387.16
-L 415.62 39.24
+ <path d="M 416.8575 388.6
+L 416.8575 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
- <path d="M 47.72 387.16
-L 415.62 387.16
+ <path d="M 47.855 388.6
+L 416.8575 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
- <path d="M 47.72 39.24
-L 415.62 39.24
+ <path d="M 47.855 36.72
+L 416.8575 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
<g id="axes_2">
<g id="patch_7">
- <path d="M 477.38 387.16
-L 845.28 387.16
-L 845.28 39.24
-L 477.38 39.24
+ <path d="M 476.2325 388.6
+L 845.235 388.6
+L 845.235 36.72
+L 476.2325 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_3">
<g id="xtick_8">
<g id="line2d_28">
- <path clip-path="url(#p64200067ee)" d="M 477.38 387.16
-L 477.38 39.24
+ <path clip-path="url(#p06afb221db)" d="M 476.2325 388.6
+L 476.2325 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_29">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#mf2365f7846" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m6160f97e38" y="388.6"/>
</g>
</g>
<g id="text_16">
<!-- 0.0 -->
- <g transform="translate(469.428437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(468.280937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1017,18 +1017,18 @@ L 477.38 39.24
</g>
<g id="xtick_9">
<g id="line2d_30">
- <path clip-path="url(#p64200067ee)" d="M 550.96 387.16
-L 550.96 39.24
+ <path clip-path="url(#p06afb221db)" d="M 550.033 388.6
+L 550.033 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_31">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="550.96" xlink:href="#mf2365f7846" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="550.033" xlink:href="#m6160f97e38" y="388.6"/>
</g>
</g>
<g id="text_17">
<!-- 0.2 -->
- <g transform="translate(543.008437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(542.081437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -1037,18 +1037,18 @@ L 550.96 39.24
</g>
<g id="xtick_10">
<g id="line2d_32">
- <path clip-path="url(#p64200067ee)" d="M 624.54 387.16
-L 624.54 39.24
+ <path clip-path="url(#p06afb221db)" d="M 623.8335 388.6
+L 623.8335 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_33">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="624.54" xlink:href="#mf2365f7846" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.8335" xlink:href="#m6160f97e38" y="388.6"/>
</g>
</g>
<g id="text_18">
<!-- 0.4 -->
- <g transform="translate(616.588437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(615.881937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -1057,18 +1057,18 @@ L 624.54 39.24
</g>
<g id="xtick_11">
<g id="line2d_34">
- <path clip-path="url(#p64200067ee)" d="M 698.12 387.16
-L 698.12 39.24
+ <path clip-path="url(#p06afb221db)" d="M 697.634 388.6
+L 697.634 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_35">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="698.12" xlink:href="#mf2365f7846" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="697.634" xlink:href="#m6160f97e38" y="388.6"/>
</g>
</g>
<g id="text_19">
<!-- 0.6 -->
- <g transform="translate(690.168438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(689.682437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -1077,18 +1077,18 @@ L 698.12 39.24
</g>
<g id="xtick_12">
<g id="line2d_36">
- <path clip-path="url(#p64200067ee)" d="M 771.7 387.16
-L 771.7 39.24
+ <path clip-path="url(#p06afb221db)" d="M 771.4345 388.6
+L 771.4345 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_37">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="771.7" xlink:href="#mf2365f7846" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="771.4345" xlink:href="#m6160f97e38" y="388.6"/>
</g>
</g>
<g id="text_20">
<!-- 0.8 -->
- <g transform="translate(763.748438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(763.482937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -1097,18 +1097,18 @@ L 771.7 39.24
</g>
<g id="xtick_13">
<g id="line2d_38">
- <path clip-path="url(#p64200067ee)" d="M 845.28 387.16
-L 845.28 39.24
+ <path clip-path="url(#p06afb221db)" d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_39">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="845.28" xlink:href="#mf2365f7846" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="845.235" xlink:href="#m6160f97e38" y="388.6"/>
</g>
</g>
<g id="text_21">
<!-- 1.0 -->
- <g transform="translate(837.328438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(837.283437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1341,7 +1341,7 @@ Q 14.5 64.65625 8.015625 75.875
z
" id="DejaVuSans-41"/>
</defs>
- <g transform="translate(562.53 415.438125)scale(0.1 -0.1)">
+ <g transform="translate(561.93375 416.878125)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-78"/>
<use transform="translate(74.804688 0.015625)" xlink:href="#DejaVuSans-111"/>
<use transform="translate(135.986328 0.015625)" xlink:href="#DejaVuSans-114"/>
@@ -1384,13 +1384,13 @@ z
<g id="matplotlib.axis_4">
<g id="ytick_7">
<g id="line2d_40">
- <path clip-path="url(#p64200067ee)" d="M 477.38 363.24819
-L 845.28 363.24819
+ <path clip-path="url(#p06afb221db)" d="M 476.2325 364.416028
+L 845.235 364.416028
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_41">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1f9c7e72e5" y="363.24819"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m27aa06dd23" y="364.416028"/>
</g>
</g>
<g id="text_23">
@@ -1403,7 +1403,7 @@ L 10.59375 27.203125
z
" id="DejaVuSans-8722"/>
</defs>
- <g transform="translate(442.912812 367.047409)scale(0.1 -0.1)">
+ <g transform="translate(441.765312 368.215246)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-49"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1413,18 +1413,18 @@ z
</g>
<g id="ytick_8">
<g id="line2d_42">
- <path clip-path="url(#p64200067ee)" d="M 477.38 315.821265
-L 845.28 315.821265
+ <path clip-path="url(#p06afb221db)" d="M 476.2325 316.449292
+L 845.235 316.449292
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_43">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1f9c7e72e5" y="315.821265"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m27aa06dd23" y="316.449292"/>
</g>
</g>
<g id="text_24">
<!-- −80 -->
- <g transform="translate(449.275312 319.620483)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 320.248511)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-56"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1433,18 +1433,18 @@ L 845.28 315.821265
</g>
<g id="ytick_9">
<g id="line2d_44">
- <path clip-path="url(#p64200067ee)" d="M 477.38 268.394339
-L 845.28 268.394339
+ <path clip-path="url(#p06afb221db)" d="M 476.2325 268.482557
+L 845.235 268.482557
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_45">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1f9c7e72e5" y="268.394339"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m27aa06dd23" y="268.482557"/>
</g>
</g>
<g id="text_25">
<!-- −60 -->
- <g transform="translate(449.275312 272.193558)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 272.281776)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-54"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1453,18 +1453,18 @@ L 845.28 268.394339
</g>
<g id="ytick_10">
<g id="line2d_46">
- <path clip-path="url(#p64200067ee)" d="M 477.38 220.967414
-L 845.28 220.967414
+ <path clip-path="url(#p06afb221db)" d="M 476.2325 220.515822
+L 845.235 220.515822
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_47">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1f9c7e72e5" y="220.967414"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m27aa06dd23" y="220.515822"/>
</g>
</g>
<g id="text_26">
<!-- −40 -->
- <g transform="translate(449.275312 224.766633)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 224.315041)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-52"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1473,18 +1473,18 @@ L 845.28 220.967414
</g>
<g id="ytick_11">
<g id="line2d_48">
- <path clip-path="url(#p64200067ee)" d="M 477.38 173.540488
-L 845.28 173.540488
+ <path clip-path="url(#p06afb221db)" d="M 476.2325 172.549087
+L 845.235 172.549087
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_49">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1f9c7e72e5" y="173.540488"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m27aa06dd23" y="172.549087"/>
</g>
</g>
<g id="text_27">
<!-- −20 -->
- <g transform="translate(449.275312 177.339707)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 176.348305)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-50"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1493,36 +1493,36 @@ L 845.28 173.540488
</g>
<g id="ytick_12">
<g id="line2d_50">
- <path clip-path="url(#p64200067ee)" d="M 477.38 126.113563
-L 845.28 126.113563
+ <path clip-path="url(#p06afb221db)" d="M 476.2325 124.582351
+L 845.235 124.582351
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_51">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1f9c7e72e5" y="126.113563"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m27aa06dd23" y="124.582351"/>
</g>
</g>
<g id="text_28">
<!-- 0 -->
- <g transform="translate(464.0175 129.912782)scale(0.1 -0.1)">
+ <g transform="translate(462.87 128.38157)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_13">
<g id="line2d_52">
- <path clip-path="url(#p64200067ee)" d="M 477.38 78.686637
-L 845.28 78.686637
+ <path clip-path="url(#p06afb221db)" d="M 476.2325 76.615616
+L 845.235 76.615616
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_53">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1f9c7e72e5" y="78.686637"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m27aa06dd23" y="76.615616"/>
</g>
</g>
<g id="text_29">
<!-- 20 -->
- <g transform="translate(457.655 82.485856)scale(0.1 -0.1)">
+ <g transform="translate(456.5075 80.414835)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -1586,7 +1586,7 @@ L 9.8125 0
z
" id="DejaVuSans-66"/>
</defs>
- <g transform="translate(436.833125 236.791406)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(435.685625 236.251406)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-71"/>
<use x="77.490234" xlink:href="#DejaVuSans-97"/>
<use x="138.769531" xlink:href="#DejaVuSans-105"/>
@@ -1600,526 +1600,526 @@ z
</g>
</g>
<g id="line2d_54">
- <path clip-path="url(#p64200067ee)" d="M 477.38 55.054545
-L 478.817109 55.26912
-L 480.254219 55.915402
-L 481.691328 57.001234
-L 483.128437 58.540259
-L 484.565547 60.552882
-L 486.002656 63.067839
-L 487.439766 66.124668
-L 488.876875 69.777665
-L 490.313984 74.102387
-L 491.751094 79.206882
-L 493.188203 85.252518
-L 494.625312 92.496413
-L 496.062422 101.390381
-L 496.780977 106.710418
-L 497.499531 112.863637
-L 498.218086 120.210692
-L 498.936641 129.474309
-L 499.655195 142.505741
-L 500.37375 167.835106
-L 501.092305 170.771127
-L 501.810859 151.30514
-L 502.529414 144.230425
-L 503.247969 141.076479
-L 503.966523 140.072255
-L 504.685078 140.602399
-L 505.403633 142.461485
-L 506.122187 145.688209
-L 506.840742 150.590825
-L 507.559297 158.012805
-L 508.277852 170.582808
-L 508.996406 208.582931
-L 509.714961 179.466239
-L 510.433516 163.740139
-L 511.15207 155.774707
-L 511.870625 150.842502
-L 512.58918 147.621318
-L 513.307734 145.552916
-L 514.026289 144.352754
-L 514.744844 143.86095
-L 515.463398 143.984467
-L 516.181953 144.671383
-L 516.900508 145.898875
-L 517.619062 147.668278
-L 518.337617 150.004894
-L 519.056172 152.962448
-L 519.774727 156.634174
-L 520.493281 161.176399
-L 521.211836 166.860674
-L 521.930391 174.204717
-L 522.648945 184.385268
-L 523.3675 201.263249
-L 524.086055 259.588451
-L 524.804609 203.693528
-L 525.523164 193.183364
-L 526.241719 188.769213
-L 526.960273 187.412738
-L 527.678828 188.355093
-L 528.397383 191.656606
-L 529.115937 198.284649
-L 529.834492 212.227531
-L 530.553047 254.173708
-L 531.271602 205.83674
-L 531.990156 192.22661
-L 532.708711 184.170507
-L 533.427266 178.654937
-L 534.14582 174.674464
-L 534.864375 171.767611
-L 535.58293 169.685256
-L 536.301484 168.279924
-L 537.020039 167.460113
-L 537.738594 167.168802
-L 538.457148 167.372576
-L 539.175703 168.056083
-L 539.894258 169.219642
-L 540.612813 170.879152
-L 541.331367 173.068259
-L 542.049922 175.843497
-L 542.768477 179.294373
-L 543.487031 183.563028
-L 544.205586 188.885261
-L 544.924141 195.687327
-L 545.642695 204.864192
-L 546.36125 218.914924
-L 547.079805 254.057559
-L 547.798359 235.044829
-L 548.516914 221.014275
-L 549.235469 216.000213
-L 549.954023 215.048493
-L 550.672578 217.398841
-L 551.391133 224.087676
-L 552.109687 241.576538
-L 552.828242 248.933485
-L 553.546797 221.32448
-L 554.265352 209.156215
-L 554.983906 201.315932
-L 555.702461 195.679081
-L 556.421016 191.443767
-L 557.13957 188.217662
-L 557.858125 185.779854
-L 558.57668 183.995201
-L 559.295234 182.777212
-L 560.013789 182.069907
-L 560.732344 181.838285
-L 561.450898 182.063211
-L 562.169453 182.738862
-L 562.888008 183.87197
-L 563.606562 185.482599
-L 564.325117 187.606705
-L 565.043672 190.301243
-L 565.762227 193.65364
-L 566.480781 197.79973
-L 567.199336 202.96026
-L 567.917891 209.524536
-L 568.636445 218.280893
-L 569.355 231.287052
-L 570.073555 258.844524
-L 570.792109 255.28905
-L 571.510664 238.376442
-L 572.229219 232.966117
-L 572.947773 232.324134
-L 573.666328 235.793869
-L 574.384883 245.85668
-L 575.103437 298.41681
-L 575.821992 244.122825
-L 576.540547 227.472207
-L 577.259102 217.710053
-L 577.977656 210.875417
-L 578.696211 205.755918
-L 579.414766 201.811701
-L 580.13332 198.753972
-L 580.851875 196.410877
-L 581.57043 194.673476
-L 582.288984 193.47051
-L 583.007539 192.755435
-L 583.726094 192.499386
-L 584.444648 192.687364
-L 585.163203 193.316415
-L 585.881758 194.395283
-L 586.600312 195.945438
-L 587.318867 198.003775
-L 588.037422 200.627769
-L 588.755977 203.904917
-L 589.474531 207.970486
-L 590.193086 213.043502
-L 590.911641 219.50888
-L 591.630195 228.142553
-L 592.34875 240.953967
-L 593.067305 267.743916
-L 593.785859 265.871366
-L 594.504414 248.410378
-L 595.222969 242.831308
-L 595.941523 242.090283
-L 596.660078 245.506389
-L 597.378633 255.620683
-L 598.097188 312.739854
-L 598.815742 253.059962
-L 599.534297 236.502804
-L 600.252852 226.713581
-L 600.971406 219.823892
-L 601.689961 214.638702
-L 602.408516 210.623716
-L 603.12707 207.492438
-L 603.845625 205.074123
-L 604.56418 203.260421
-L 605.282734 201.980413
-L 606.001289 201.18777
-L 606.719844 200.853777
-L 607.438398 200.963561
-L 608.156953 201.514308
-L 608.875508 202.514952
-L 609.594062 203.987264
-L 610.312617 205.968646
-L 611.031172 208.517477
-L 611.749727 211.722921
-L 612.468281 215.723505
-L 613.186836 220.745111
-L 613.905391 227.188798
-L 614.623945 235.876233
-L 615.3425 249.000484
-L 616.061055 278.421725
-L 616.779609 269.731885
-L 617.498164 253.660324
-L 618.216719 248.089373
-L 618.935273 246.953517
-L 619.653828 249.451897
-L 620.372383 257.047009
-L 621.090937 280.604974
-L 621.809492 268.773947
-L 622.528047 247.183072
-L 623.246602 235.97302
-L 623.965156 228.387356
-L 624.683711 222.773358
-L 625.402266 218.456963
-L 626.12082 215.09468
-L 626.839375 212.488207
-L 627.55793 210.514263
-L 628.276484 209.093153
-L 628.995039 208.173074
-L 629.713594 207.721748
-L 630.432148 207.721933
-L 631.150703 208.16925
-L 631.869258 209.071687
-L 632.587813 210.450628
-L 633.306367 212.343725
-L 634.024922 214.810522
-L 634.743477 217.942899
-L 635.462031 221.885136
-L 636.180586 226.875611
-L 636.899141 233.345333
-L 637.617695 242.202619
-L 638.33625 256.00643
-L 639.054805 292.051391
-L 639.773359 270.422214
-L 640.491914 256.212354
-L 641.210469 250.726358
-L 641.929023 249.132027
-L 642.647578 250.560513
-L 643.366133 255.60813
-L 644.084687 267.884867
-L 644.803242 317.927956
-L 645.521797 260.925878
-L 646.240352 246.050405
-L 646.958906 236.990533
-L 647.677461 230.563069
-L 648.396016 225.719571
-L 649.11457 221.979728
-L 649.833125 219.083367
-L 650.55168 216.875182
-L 651.270234 215.257273
-L 651.988789 214.166751
-L 652.707344 213.564252
-L 653.425898 213.42786
-L 654.144453 213.750095
-L 654.863008 214.536973
-L 655.581563 215.808854
-L 656.300117 217.603347
-L 657.018672 219.981241
-L 657.737227 223.037768
-L 658.455781 226.924597
-L 659.174336 231.896464
-L 659.892891 238.424346
-L 660.611445 247.536044
-L 661.33 262.336938
-L 662.048555 315.623098
-L 662.767109 269.94646
-L 663.485664 257.352745
-L 664.204219 251.965078
-L 664.922773 249.966171
-L 665.641328 250.491191
-L 666.359883 253.676682
-L 667.078438 260.892688
-L 667.796992 278.883685
-L 668.515547 285.490538
-L 669.234102 258.34849
-L 669.952656 246.262446
-L 670.671211 238.426611
-L 671.389766 232.754183
-L 672.10832 228.458575
-L 672.826875 225.15663
-L 673.54543 222.634081
-L 674.263984 220.761261
-L 674.982539 219.456698
-L 675.701094 218.669489
-L 676.419648 218.370262
-L 677.138203 218.546634
-L 677.856758 219.20147
-L 678.575312 220.353351
-L 679.293867 222.039423
-L 680.012422 224.321633
-L 680.730977 227.298897
-L 681.449531 231.131363
-L 682.168086 236.092952
-L 682.886641 242.702577
-L 683.605195 252.137328
-L 684.32375 268.259663
-L 685.042305 325.613152
-L 685.760859 269.085406
-L 686.479414 257.743977
-L 687.197969 252.44425
-L 687.916523 250.118859
-L 688.635078 249.94685
-L 689.353633 251.844971
-L 690.072188 256.36244
-L 690.790742 265.526657
-L 691.509297 291.328052
-L 692.227852 277.725916
-L 692.946406 257.413472
-L 693.664961 246.930944
-L 694.383516 239.923521
-L 695.10207 234.810102
-L 695.820625 230.947062
-L 696.53918 228.009315
-L 697.257734 225.81205
-L 697.976289 224.243311
-L 698.694844 223.234047
-L 699.413398 222.743508
-L 700.131953 222.751969
-L 700.850508 223.257577
-L 701.569062 224.276132
-L 702.287617 225.843708
-L 703.006172 228.023137
-L 703.724727 230.917136
-L 704.443281 234.69508
-L 705.161836 239.65231
-L 705.880391 246.362704
-L 706.598945 256.18277
-L 707.3175 274.007218
-L 708.036055 302.48321
-L 708.754609 268.09485
-L 709.473164 257.702922
-L 710.191719 252.475752
-L 710.910273 249.892403
-L 711.628828 249.190234
-L 712.347383 250.184111
-L 713.065938 253.078811
-L 713.784492 258.678155
-L 714.503047 269.670247
-L 715.221602 308.596928
-L 715.940156 274.069839
-L 716.658711 257.126922
-L 717.377266 247.729747
-L 718.09582 241.347288
-L 718.814375 236.685344
-L 719.53293 233.190415
-L 720.251484 230.576609
-L 720.970039 228.680373
-L 721.688594 227.40364
-L 722.407148 226.688207
-L 723.125703 226.503398
-L 723.844258 226.840409
-L 724.562813 227.710838
-L 725.281367 229.148803
-L 725.999922 231.217543
-L 726.718477 234.023499
-L 727.437031 237.745804
-L 728.155586 242.703174
-L 728.874141 249.531288
-L 729.592695 259.799275
-L 730.31125 279.826185
-L 731.029805 293.310811
-L 731.748359 267.042726
-L 732.466914 257.377639
-L 733.185469 252.208882
-L 733.904023 249.420476
-L 734.622578 248.30985
-L 735.341133 248.646672
-L 736.059688 250.475791
-L 736.778242 254.151652
-L 737.496797 260.676973
-L 738.215352 273.45092
-L 738.933906 371.345455
-L 739.652461 271.941924
-L 740.371016 257.100346
-L 741.08957 248.518233
-L 741.808125 242.645191
-L 742.52668 238.372511
-L 743.245234 235.209638
-L 743.963789 232.89982
-L 744.682344 231.296529
-L 745.400898 230.314004
-L 746.119453 229.904937
-L 746.838008 230.050193
-L 747.556563 230.755082
-L 748.275117 232.050474
-L 748.993672 233.999262
-L 749.712227 236.711339
-L 750.430781 240.375983
-L 751.149336 245.337159
-L 751.867891 252.299594
-L 752.586445 263.0841
-L 753.305 286.041081
-L 754.023555 287.665181
-L 754.742109 265.933395
-L 755.460664 256.835863
-L 756.179219 251.71398
-L 756.897773 248.759829
-L 757.616328 247.327551
-L 758.334883 247.169387
-L 759.053437 248.250507
-L 759.771992 250.727068
-L 760.490547 255.051746
-L 761.209102 262.404864
-L 761.927656 276.98165
-L 762.646211 316.356684
-L 763.364766 270.501089
-L 764.08332 257.152409
-L 764.801875 249.230144
-L 765.52043 243.798092
-L 766.238984 239.879243
-L 766.957539 237.030763
-L 767.676094 235.019511
-L 768.394648 233.714083
-L 769.113203 233.041056
-L 769.831758 232.965609
-L 770.550313 233.483585
-L 771.268867 234.620672
-L 771.987422 236.438274
-L 772.705977 239.04923
-L 773.424531 242.653222
-L 774.143086 247.621424
-L 774.861641 254.735801
-L 775.580195 266.117174
-L 776.29875 293.185504
-L 777.017305 283.53225
-L 777.735859 264.750611
-L 778.454414 256.106247
-L 779.172969 251.022152
-L 779.891523 247.931293
-L 780.610078 246.239571
-L 781.328633 245.695775
-L 782.047188 246.223648
-L 782.765742 247.881031
-L 783.484297 250.890206
-L 784.202852 255.77992
-L 784.921406 263.90256
-L 785.639961 280.376144
-L 786.358516 303.385473
-L 787.07707 269.378264
-L 787.795625 257.18825
-L 788.51418 249.832795
-L 789.232734 244.80206
-L 789.951289 241.219731
-L 790.669844 238.681865
-L 791.388398 236.976172
-L 792.106953 235.98621
-L 792.825508 235.652544
-L 793.544063 235.956505
-L 794.262617 236.915623
-L 794.981172 238.588081
-L 795.699727 241.088817
-L 796.418281 244.628052
-L 797.136836 249.606333
-L 797.855391 256.892565
-L 798.573945 268.969855
-L 799.2925 302.387433
-L 800.011055 280.162936
-L 800.729609 263.471932
-L 801.448164 255.197339
-L 802.166719 250.143907
-L 802.885273 246.937909
-L 803.603828 245.031965
-L 804.322383 244.178567
-L 805.040938 244.279659
-L 805.759492 245.340353
-L 806.478047 247.471049
-L 807.196602 250.94017
-L 807.915156 256.34283
-L 808.633711 265.208076
-L 809.352266 283.766329
-L 810.07082 296.312317
-L 810.789375 268.381973
-L 811.50793 257.153692
-L 812.226484 250.309992
-L 812.945039 245.660806
-L 813.663594 242.411855
-L 814.382148 240.193209
-L 815.100703 238.812747
-L 815.819258 238.170601
-L 816.537813 238.225194
-L 817.256367 238.981174
-L 817.974922 240.490813
-L 818.693477 242.869787
-L 819.412031 246.338813
-L 820.130586 251.330278
-L 820.849141 258.811946
-L 821.567695 271.712426
-L 822.28625 317.166874
-L 823.004805 277.194902
-L 823.723359 262.073097
-L 824.441914 254.106299
-L 825.160469 249.077871
-L 825.879023 245.772914
-L 826.597578 243.686171
-L 827.316133 242.577529
-L 828.034688 242.337801
-L 828.753242 242.942305
-L 829.471797 244.441496
-L 830.190352 246.980241
-L 830.908906 250.86372
-L 831.627461 256.750379
-L 832.346016 266.359733
-L 833.06457 287.329599
-L 833.783125 291.342645
-L 834.50168 267.400113
-L 835.220234 257.015224
-L 835.938789 250.654331
-L 836.657344 246.382712
-L 837.375898 243.476977
-L 838.094453 241.599218
-L 838.813008 240.578873
-L 839.531563 240.336686
-L 840.250117 240.856595
-L 840.968672 242.18065
-L 841.687227 244.42308
-L 842.405781 247.814744
-L 843.124336 252.822764
-L 843.842891 260.528779
-L 844.561445 274.422241
-L 844.561445 274.422241
+ <path clip-path="url(#p06afb221db)" d="M 476.2325 52.714545
+L 477.673916 52.931562
+L 479.115332 53.585201
+L 480.556748 54.683391
+L 481.998164 56.239933
+L 483.43958 58.275464
+L 484.880996 60.819046
+L 486.322412 63.910667
+L 487.763828 67.605243
+L 489.205244 71.979188
+L 490.64666 77.141782
+L 492.088076 83.256229
+L 493.529492 90.582574
+L 494.970908 99.577772
+L 495.691616 104.958361
+L 496.412324 111.181615
+L 497.133032 118.612294
+L 497.85374 127.981349
+L 498.574448 141.161104
+L 499.295156 166.778766
+L 500.015864 169.748205
+L 500.736572 150.060657
+L 501.45728 142.905419
+L 502.177988 139.715575
+L 502.898696 138.699921
+L 503.619404 139.236098
+L 504.340112 141.116344
+L 505.06082 144.379794
+L 505.781528 149.338212
+L 506.502236 156.844668
+L 507.222944 169.557742
+L 507.943652 207.99038
+L 508.66436 178.542284
+L 509.385068 162.637191
+L 510.105776 154.581096
+L 510.826484 149.592753
+L 511.547192 146.334906
+L 512.2679 144.242962
+L 512.988608 143.02914
+L 513.709316 142.531738
+L 514.430024 142.656661
+L 515.150732 143.351395
+L 515.87144 144.592859
+L 516.592148 146.382401
+L 517.312856 148.745612
+L 518.033564 151.736829
+L 518.754272 155.450346
+L 519.47498 160.044271
+L 520.195688 165.793243
+L 520.916396 173.220875
+L 521.637104 183.517301
+L 522.357812 200.587386
+L 523.078521 259.576441
+L 523.799229 203.045326
+L 524.519937 192.415536
+L 525.240645 187.951143
+L 525.961353 186.579229
+L 526.682061 187.532311
+L 527.402769 190.871401
+L 528.123477 197.574883
+L 528.844185 211.676462
+L 529.564893 254.100068
+L 530.285601 205.212932
+L 531.006309 191.447893
+L 531.727017 183.300095
+L 532.447725 177.721748
+L 533.168433 173.695969
+L 533.889141 170.756031
+L 534.609849 168.649974
+L 535.330557 167.228647
+L 536.051265 166.399505
+L 536.771973 166.104879
+L 537.492681 166.310972
+L 538.213389 167.002258
+L 538.934097 168.179061
+L 539.654805 169.85746
+L 540.375513 172.071482
+L 541.096221 174.878308
+L 541.816929 178.368462
+L 542.537637 182.685702
+L 543.258345 188.068512
+L 543.979053 194.947999
+L 544.699761 204.229315
+L 545.420469 218.43997
+L 546.141177 253.982597
+L 546.861885 234.753465
+L 547.582593 220.563216
+L 548.303301 215.492085
+L 549.024009 214.529532
+L 549.744717 216.906632
+L 550.465425 223.671599
+L 551.186133 241.359518
+L 551.906841 248.800201
+L 552.627549 220.876953
+L 553.348257 208.570189
+L 554.068965 200.640668
+L 554.789673 194.939659
+L 555.510381 190.656139
+L 556.231089 187.393315
+L 556.951797 184.92776
+L 557.672505 183.122795
+L 558.393213 181.890942
+L 559.113921 181.175586
+L 559.834629 180.941329
+L 560.555337 181.168814
+L 561.276045 181.852156
+L 561.996753 182.99816
+L 562.717461 184.627121
+L 563.438169 186.775404
+L 564.158877 189.500611
+L 564.879585 192.891165
+L 565.600293 197.084445
+L 566.321001 202.303712
+L 567.041709 208.942702
+L 567.762417 217.798723
+L 568.483125 230.952918
+L 569.203833 258.824047
+L 569.924541 255.228104
+L 570.645249 238.122999
+L 571.365957 232.651093
+L 572.086665 232.001804
+L 572.807373 235.511031
+L 573.528081 245.688375
+L 574.248789 298.846741
+L 574.969497 243.934786
+L 575.690205 227.094653
+L 576.410913 217.221386
+L 577.131621 210.308959
+L 577.852329 205.13119
+L 578.573037 201.14208
+L 579.293745 198.049548
+L 580.014453 195.679784
+L 580.735161 193.922608
+L 581.455869 192.70595
+L 582.176577 191.982737
+L 582.897285 191.723773
+L 583.617993 191.913891
+L 584.338701 192.550102
+L 585.059409 193.641249
+L 585.780117 195.209048
+L 586.500825 197.290812
+L 587.221533 199.944673
+L 587.942241 203.259121
+L 588.662949 207.370964
+L 589.383657 212.501721
+L 590.104365 219.040687
+L 590.825073 227.772628
+L 591.545781 240.72986
+L 592.266489 267.82473
+L 592.987197 265.930868
+L 593.707905 248.27114
+L 594.428613 242.628569
+L 595.149321 241.87911
+L 595.870029 245.334098
+L 596.590737 255.563512
+L 597.311445 313.332809
+L 598.032153 252.973646
+L 598.752861 236.228035
+L 599.473569 226.327391
+L 600.194277 219.359284
+L 600.914985 214.115077
+L 601.635693 210.054393
+L 602.356401 206.887475
+L 603.077109 204.441635
+L 603.797817 202.607289
+L 604.518525 201.312713
+L 605.239233 200.511048
+L 605.959941 200.173253
+L 606.680649 200.284287
+L 607.401357 200.841302
+L 608.122065 201.853335
+L 608.842773 203.342406
+L 609.563481 205.34634
+L 610.284189 207.92418
+L 611.004897 211.166109
+L 611.725605 215.212228
+L 612.446313 220.290989
+L 613.167021 226.808018
+L 613.887729 235.594332
+L 614.608437 248.867963
+L 615.329146 278.624074
+L 616.049854 269.835326
+L 616.770562 253.58084
+L 617.49127 247.946482
+L 618.211978 246.797697
+L 618.932686 249.324513
+L 619.653394 257.006072
+L 620.374102 280.832172
+L 621.09481 268.866485
+L 621.815518 247.029864
+L 622.536226 235.69222
+L 623.256934 228.020217
+L 623.977642 222.342321
+L 624.69835 217.976797
+L 625.419058 214.576245
+L 626.139766 211.940106
+L 626.860474 209.943694
+L 627.581182 208.50641
+L 628.30189 207.575858
+L 629.022598 207.119395
+L 629.743306 207.119582
+L 630.464014 207.57199
+L 631.184722 208.484698
+L 631.90543 209.879334
+L 632.626138 211.793979
+L 633.346846 214.288852
+L 634.067554 217.456882
+L 634.788262 221.44399
+L 635.50897 226.491266
+L 636.229678 233.034625
+L 636.950386 241.992724
+L 637.671094 255.953649
+L 638.391802 292.408872
+L 639.11251 270.533513
+L 639.833218 256.161917
+L 640.553926 250.61348
+L 641.274634 249.001002
+L 641.995342 250.445748
+L 642.71605 255.550816
+L 643.436758 267.967286
+L 644.157466 318.579962
+L 644.878174 260.929091
+L 645.598882 245.884306
+L 646.31959 236.721315
+L 647.040298 230.220695
+L 647.761006 225.322068
+L 648.481714 221.539658
+L 649.202422 218.610331
+L 649.92313 216.377013
+L 650.643838 214.740689
+L 651.364546 213.637754
+L 652.085254 213.028398
+L 652.805962 212.890454
+L 653.52667 213.216356
+L 654.247378 214.01219
+L 654.968086 215.298547
+L 655.688794 217.113465
+L 656.409502 219.518424
+L 657.13021 222.609741
+L 657.850918 226.540809
+L 658.571626 231.569266
+L 659.292334 238.171448
+L 660.013042 247.386855
+L 660.73375 262.356211
+L 661.454458 316.248871
+L 662.175166 270.052344
+L 662.895874 257.315288
+L 663.616582 251.866299
+L 664.33729 249.844641
+L 665.057998 250.375637
+L 665.778706 253.597384
+L 666.499414 260.895523
+L 667.220122 279.091292
+L 667.94083 285.773344
+L 668.661538 258.322367
+L 669.382246 246.09876
+L 670.102954 238.173738
+L 670.823662 232.436747
+L 671.54437 228.092247
+L 672.265078 224.752719
+L 672.985786 222.201459
+L 673.706494 220.307323
+L 674.427202 218.987911
+L 675.14791 218.191742
+L 675.868618 217.889109
+L 676.589326 218.067489
+L 677.310034 218.729778
+L 678.030742 219.89477
+L 678.75145 221.600033
+L 679.472158 223.908218
+L 680.192866 226.91937
+L 680.913574 230.795456
+L 681.634282 235.813518
+L 682.35499 242.498373
+L 683.075698 252.04051
+L 683.796406 268.346349
+L 684.517114 326.35263
+L 685.237822 269.18149
+L 685.95853 257.710973
+L 686.679238 252.350925
+L 687.399946 249.999067
+L 688.120654 249.8251
+L 688.841362 251.744825
+L 689.56207 256.313712
+L 690.282778 265.582235
+L 691.003486 291.677299
+L 691.724194 277.920345
+L 692.444902 257.376707
+L 693.16561 246.774867
+L 693.886318 239.687687
+L 694.607026 234.516067
+L 695.327734 230.609058
+L 696.048442 227.637874
+L 696.76915 225.415599
+L 697.489858 223.829005
+L 698.210566 222.808254
+L 698.931274 222.312132
+L 699.651982 222.320688
+L 700.37269 222.832051
+L 701.093398 223.862199
+L 701.814106 225.447618
+L 702.534814 227.651853
+L 703.255522 230.578791
+L 703.97623 234.399735
+L 704.696938 239.413388
+L 705.417646 246.20016
+L 706.138354 256.131997
+L 706.859062 274.159322
+L 707.579771 302.959425
+L 708.300479 268.179659
+L 709.021187 257.669451
+L 709.741895 252.382786
+L 710.462603 249.770033
+L 711.183311 249.059872
+L 711.904019 250.065062
+L 712.624727 252.992708
+L 713.345435 258.655784
+L 714.066143 269.772987
+L 714.786851 309.142729
+L 715.507559 274.222655
+L 716.228267 257.086895
+L 716.948975 247.582762
+L 717.669683 241.127659
+L 718.390391 236.412653
+L 719.111099 232.877944
+L 719.831807 230.234388
+L 720.552515 228.31657
+L 721.273223 227.025304
+L 721.993931 226.301729
+L 722.714639 226.114816
+L 723.435347 226.455664
+L 724.156055 227.335999
+L 724.876763 228.790332
+L 725.597471 230.882618
+L 726.318179 233.72051
+L 727.038887 237.485183
+L 727.759595 242.498977
+L 728.480303 249.404808
+L 729.201011 259.789664
+L 729.921719 280.04452
+L 730.642427 293.682626
+L 731.363135 267.11556
+L 732.083843 257.340466
+L 732.804551 252.112878
+L 733.525259 249.292734
+L 734.245967 248.169468
+L 734.966675 248.510123
+L 735.687383 250.360061
+L 736.408091 254.077761
+L 737.128799 260.677352
+L 737.849507 273.596692
+L 738.570215 372.605455
+L 739.290923 272.07052
+L 740.011631 257.060016
+L 740.732339 248.380223
+L 741.453047 242.440334
+L 742.173755 238.119022
+L 742.894463 234.92015
+L 743.615171 232.584042
+L 744.335879 230.962502
+L 745.056587 229.968794
+L 745.777295 229.555071
+L 746.498003 229.701981
+L 747.218711 230.414892
+L 747.939419 231.725029
+L 748.660127 233.695998
+L 749.380835 236.438944
+L 750.101543 240.145298
+L 750.822251 245.162941
+L 751.542959 252.204622
+L 752.263667 263.111877
+L 752.984375 286.330153
+L 753.705083 287.972738
+L 754.425791 265.993602
+L 755.146499 256.792523
+L 755.867207 251.612343
+L 756.587915 248.624568
+L 757.308623 247.175988
+L 758.029331 247.016024
+L 758.750039 248.109449
+L 759.470747 250.614198
+L 760.191455 254.9881
+L 760.912163 262.42491
+L 761.632871 277.167608
+L 762.353579 316.990806
+L 763.074287 270.613286
+L 763.794995 257.112672
+L 764.515703 249.100237
+L 765.236411 243.606357
+L 765.957119 239.642904
+L 766.677827 236.762003
+L 767.398535 234.727859
+L 768.119243 233.407573
+L 768.839951 232.726885
+L 769.560659 232.650579
+L 770.281367 233.174452
+L 771.002075 234.32448
+L 771.722783 236.162771
+L 772.443491 238.803444
+L 773.164199 242.448456
+L 773.884907 247.473206
+L 774.605615 254.668558
+L 775.326323 266.179474
+L 776.047031 293.555894
+L 776.767739 283.792767
+L 777.488447 264.797356
+L 778.209155 256.054603
+L 778.929863 250.912641
+L 779.650571 247.786602
+L 780.371279 246.075625
+L 781.091987 245.52564
+L 781.812695 246.05952
+L 782.533403 247.735768
+L 783.254111 250.779194
+L 783.974819 255.724562
+L 784.695527 263.939652
+L 785.416235 280.600738
+L 786.136943 303.871957
+L 786.857651 269.477681
+L 787.578359 257.148921
+L 788.299067 249.709747
+L 789.019775 244.621753
+L 789.740483 240.998649
+L 790.461191 238.431897
+L 791.181899 236.706791
+L 791.902607 235.705561
+L 792.623315 235.368097
+L 793.344023 235.675518
+L 794.064731 236.645552
+L 794.785439 238.337046
+L 795.506147 240.866245
+L 796.226855 244.445764
+L 796.947563 249.480707
+L 797.668271 256.849871
+L 798.388979 269.064623
+L 799.109687 302.862558
+L 799.830396 280.385103
+L 800.551104 263.504124
+L 801.271812 255.13535
+L 801.99252 250.024399
+L 802.713228 246.781911
+L 803.433936 244.854274
+L 804.154644 243.991163
+L 804.875352 244.093405
+L 805.59606 245.166172
+L 806.316768 247.32112
+L 807.037476 250.829726
+L 807.758184 256.293878
+L 808.478892 265.260028
+L 809.1996 284.02951
+L 809.920308 296.718295
+L 810.641016 268.47005
+L 811.361724 257.113969
+L 812.082432 250.192375
+L 812.80314 245.490273
+L 813.523848 242.204343
+L 814.244556 239.960444
+L 814.965264 238.56427
+L 815.685972 237.914815
+L 816.40668 237.970029
+L 817.127388 238.734614
+L 817.848096 240.261435
+L 818.568804 242.667487
+L 819.289512 246.175996
+L 820.01022 251.224274
+L 820.730928 258.791098
+L 821.451636 271.83841
+L 822.172344 317.810217
+L 822.893052 277.383287
+L 823.61376 262.089367
+L 824.334468 254.031892
+L 825.055176 248.94623
+L 825.775884 245.603656
+L 826.496592 243.493163
+L 827.2173 242.371902
+L 827.938008 242.129445
+L 828.658716 242.740829
+L 829.379424 244.257085
+L 830.100132 246.824725
+L 830.82084 250.752405
+L 831.541548 256.706067
+L 832.262256 266.424794
+L 832.982964 287.633337
+L 833.703672 291.692059
+L 834.42438 267.477015
+L 835.145088 256.973926
+L 835.865796 250.540633
+L 836.586504 246.220395
+L 837.307212 243.281587
+L 838.02792 241.382456
+L 838.748628 240.350498
+L 839.469336 240.105554
+L 840.190044 240.631381
+L 840.910752 241.970506
+L 841.63146 244.238459
+L 842.352168 247.668727
+L 843.072876 252.733748
+L 843.793584 260.527472
+L 844.514292 274.579068
+L 844.514292 274.579068
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
</g>
<g id="patch_8">
- <path d="M 477.38 387.16
-L 477.38 39.24
+ <path d="M 476.2325 388.6
+L 476.2325 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_9">
- <path d="M 845.28 387.16
-L 845.28 39.24
+ <path d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_10">
- <path d="M 477.38 387.16
-L 845.28 387.16
+ <path d="M 476.2325 388.6
+L 845.235 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_11">
- <path d="M 477.38 39.24
-L 845.28 39.24
+ <path d="M 476.2325 36.72
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
@@ -2187,11 +2187,11 @@ z
</g>
</g>
<defs>
- <clipPath id="p6449f8ecf9">
- <rect height="347.92" width="367.9" x="47.72" y="39.24"/>
+ <clipPath id="p557c9d483f">
+ <rect height="351.88" width="369.0025" x="47.855" y="36.72"/>
</clipPath>
- <clipPath id="p64200067ee">
- <rect height="347.92" width="367.9" x="477.38" y="39.24"/>
+ <clipPath id="p06afb221db">
+ <rect height="351.88" width="369.0025" x="476.2325" y="36.72"/>
</clipPath>
</defs>
</svg>
diff --git a/docs/docs/img/window_blackman.svg b/docs/docs/img/window_blackman.svg
@@ -19,28 +19,28 @@ z
</g>
<g id="axes_1">
<g id="patch_2">
- <path d="M 47.72 387.16
-L 415.62 387.16
-L 415.62 39.24
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 416.8575 388.6
+L 416.8575 36.72
+L 47.855 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
- <path clip-path="url(#p8943548382)" d="M 47.72 387.16
-L 47.72 39.24
+ <path clip-path="url(#p88c468b5a2)" d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
-" id="m6b085097ab" style="stroke:#000000;stroke-width:0.8;"/>
+" id="m41228d2211" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m6b085097ab" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m41228d2211" y="388.6"/>
</g>
</g>
<g id="text_1">
@@ -68,20 +68,20 @@ Q 19.53125 74.21875 31.78125 74.21875
z
" id="DejaVuSans-48"/>
</defs>
- <g transform="translate(44.53875 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(44.67375 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
- <path clip-path="url(#p8943548382)" d="M 106.116825 387.16
-L 106.116825 39.24
+ <path clip-path="url(#p88c468b5a2)" d="M 106.426825 388.6
+L 106.426825 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="106.116825" xlink:href="#m6b085097ab" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="106.426825" xlink:href="#m41228d2211" y="388.6"/>
</g>
</g>
<g id="text_2">
@@ -101,7 +101,7 @@ L 12.40625 0
z
" id="DejaVuSans-49"/>
</defs>
- <g transform="translate(99.754325 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(100.064325 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -109,13 +109,13 @@ z
</g>
<g id="xtick_3">
<g id="line2d_5">
- <path clip-path="url(#p8943548382)" d="M 164.513651 387.16
-L 164.513651 39.24
+ <path clip-path="url(#p88c468b5a2)" d="M 164.998651 388.6
+L 164.998651 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="164.513651" xlink:href="#m6b085097ab" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="164.998651" xlink:href="#m41228d2211" y="388.6"/>
</g>
</g>
<g id="text_3">
@@ -146,7 +146,7 @@ Q 31.109375 20.453125 19.1875 8.296875
z
" id="DejaVuSans-50"/>
</defs>
- <g transform="translate(158.151151 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(158.636151 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -154,13 +154,13 @@ z
</g>
<g id="xtick_4">
<g id="line2d_7">
- <path clip-path="url(#p8943548382)" d="M 222.910476 387.16
-L 222.910476 39.24
+ <path clip-path="url(#p88c468b5a2)" d="M 223.570476 388.6
+L 223.570476 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_8">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="222.910476" xlink:href="#m6b085097ab" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="223.570476" xlink:href="#m41228d2211" y="388.6"/>
</g>
</g>
<g id="text_4">
@@ -199,7 +199,7 @@ Q 46.96875 40.921875 40.578125 39.3125
z
" id="DejaVuSans-51"/>
</defs>
- <g transform="translate(216.547976 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(217.207976 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-51"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -207,13 +207,13 @@ z
</g>
<g id="xtick_5">
<g id="line2d_9">
- <path clip-path="url(#p8943548382)" d="M 281.307302 387.16
-L 281.307302 39.24
+ <path clip-path="url(#p88c468b5a2)" d="M 282.142302 388.6
+L 282.142302 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_10">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="281.307302" xlink:href="#m6b085097ab" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="282.142302" xlink:href="#m41228d2211" y="388.6"/>
</g>
</g>
<g id="text_5">
@@ -237,7 +237,7 @@ L 4.890625 26.703125
z
" id="DejaVuSans-52"/>
</defs>
- <g transform="translate(274.944802 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(275.779802 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-52"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -245,13 +245,13 @@ z
</g>
<g id="xtick_6">
<g id="line2d_11">
- <path clip-path="url(#p8943548382)" d="M 339.704127 387.16
-L 339.704127 39.24
+ <path clip-path="url(#p88c468b5a2)" d="M 340.714127 388.6
+L 340.714127 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_12">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="339.704127" xlink:href="#m6b085097ab" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="340.714127" xlink:href="#m41228d2211" y="388.6"/>
</g>
</g>
<g id="text_6">
@@ -282,7 +282,7 @@ Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-53"/>
</defs>
- <g transform="translate(333.341627 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(334.351627 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-53"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -290,13 +290,13 @@ z
</g>
<g id="xtick_7">
<g id="line2d_13">
- <path clip-path="url(#p8943548382)" d="M 398.100952 387.16
-L 398.100952 39.24
+ <path clip-path="url(#p88c468b5a2)" d="M 399.285952 388.6
+L 399.285952 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_14">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="398.100952" xlink:href="#m6b085097ab" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="399.285952" xlink:href="#m41228d2211" y="388.6"/>
</g>
</g>
<g id="text_7">
@@ -333,7 +333,7 @@ Q 48.484375 72.75 52.59375 71.296875
z
" id="DejaVuSans-54"/>
</defs>
- <g transform="translate(391.738452 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(392.923452 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-54"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -523,7 +523,7 @@ Q 40.578125 54.546875 44.28125 53.078125
z
" id="DejaVuSans-115"/>
</defs>
- <g transform="translate(210.316875 415.436563)scale(0.1 -0.1)">
+ <g transform="translate(211.003125 416.876562)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-83"/>
<use x="63.476562" xlink:href="#DejaVuSans-97"/>
<use x="124.755859" xlink:href="#DejaVuSans-109"/>
@@ -537,18 +537,18 @@ z
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_15">
- <path clip-path="url(#p8943548382)" d="M 47.72 387.16
-L 415.62 387.16
+ <path clip-path="url(#p88c468b5a2)" d="M 47.855 388.6
+L 416.8575 388.6
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_16">
<defs>
<path d="M 0 0
L -3.5 0
-" id="m1a334da98e" style="stroke:#000000;stroke-width:0.8;"/>
+" id="m1ee6f1366e" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m1a334da98e" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m1ee6f1366e" y="388.6"/>
</g>
</g>
<g id="text_9">
@@ -561,7 +561,7 @@ L 10.6875 0
z
" id="DejaVuSans-46"/>
</defs>
- <g transform="translate(24.816875 390.959219)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 392.399219)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -570,18 +570,18 @@ z
</g>
<g id="ytick_2">
<g id="line2d_17">
- <path clip-path="url(#p8943548382)" d="M 47.72 320.82192
-L 415.62 320.82192
+ <path clip-path="url(#p88c468b5a2)" d="M 47.855 321.506865
+L 416.8575 321.506865
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_18">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m1a334da98e" y="320.82192"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m1ee6f1366e" y="321.506865"/>
</g>
</g>
<g id="text_10">
<!-- 0.2 -->
- <g transform="translate(24.816875 324.621139)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 325.306084)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -590,18 +590,18 @@ L 415.62 320.82192
</g>
<g id="ytick_3">
<g id="line2d_19">
- <path clip-path="url(#p8943548382)" d="M 47.72 254.48384
-L 415.62 254.48384
+ <path clip-path="url(#p88c468b5a2)" d="M 47.855 254.41373
+L 416.8575 254.41373
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_20">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m1a334da98e" y="254.48384"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m1ee6f1366e" y="254.41373"/>
</g>
</g>
<g id="text_11">
<!-- 0.4 -->
- <g transform="translate(24.816875 258.283059)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 258.212949)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -610,18 +610,18 @@ L 415.62 254.48384
</g>
<g id="ytick_4">
<g id="line2d_21">
- <path clip-path="url(#p8943548382)" d="M 47.72 188.145761
-L 415.62 188.145761
+ <path clip-path="url(#p88c468b5a2)" d="M 47.855 187.320595
+L 416.8575 187.320595
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_22">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m1a334da98e" y="188.145761"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m1ee6f1366e" y="187.320595"/>
</g>
</g>
<g id="text_12">
<!-- 0.6 -->
- <g transform="translate(24.816875 191.944979)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 191.119814)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -630,13 +630,13 @@ L 415.62 188.145761
</g>
<g id="ytick_5">
<g id="line2d_23">
- <path clip-path="url(#p8943548382)" d="M 47.72 121.807681
-L 415.62 121.807681
+ <path clip-path="url(#p88c468b5a2)" d="M 47.855 120.22746
+L 416.8575 120.22746
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_24">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m1a334da98e" y="121.807681"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m1ee6f1366e" y="120.22746"/>
</g>
</g>
<g id="text_13">
@@ -682,7 +682,7 @@ Q 18.3125 60.0625 18.3125 54.390625
z
" id="DejaVuSans-56"/>
</defs>
- <g transform="translate(24.816875 125.606899)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 124.026679)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -691,18 +691,18 @@ z
</g>
<g id="ytick_6">
<g id="line2d_25">
- <path clip-path="url(#p8943548382)" d="M 47.72 55.469601
-L 415.62 55.469601
+ <path clip-path="url(#p88c468b5a2)" d="M 47.855 53.134325
+L 416.8575 53.134325
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_26">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m1a334da98e" y="55.469601"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m1ee6f1366e" y="53.134325"/>
</g>
</g>
<g id="text_14">
<!-- 1.0 -->
- <g transform="translate(24.816875 59.26882)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 56.933544)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -805,7 +805,7 @@ Q 14.796875 37.203125 14.796875 27.296875
z
" id="DejaVuSans-100"/>
</defs>
- <g transform="translate(18.737188 238.822656)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(18.872187 238.282656)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-65"/>
<use x="68.408203" xlink:href="#DejaVuSans-109"/>
<use x="165.820312" xlink:href="#DejaVuSans-112"/>
@@ -819,70 +819,70 @@ z
</g>
</g>
<g id="line2d_27">
- <path clip-path="url(#p8943548382)" d="M 47.72 387.16
-L 53.559683 386.862006
-L 59.399365 385.955349
-L 65.239048 384.402758
-L 71.07873 382.144563
-L 76.918413 379.102274
-L 82.758095 375.183358
-L 88.597778 370.287031
-L 94.43746 364.310798
-L 100.277143 357.157468
-L 106.116825 348.742324
-L 111.956508 339.000154
-L 117.79619 327.891789
-L 123.635873 315.409895
-L 129.475556 301.583711
-L 135.315238 286.482515
-L 141.154921 270.217643
-L 146.994603 252.942916
-L 152.834286 234.853422
-L 158.673968 216.182646
-L 164.513651 197.198028
-L 170.353333 178.195049
-L 176.193016 159.490064
-L 182.032698 141.412102
-L 187.872381 124.293918
-L 193.712063 108.462618
-L 199.551746 94.23018
-L 205.391429 81.884224
-L 211.231111 71.679355
-L 217.070794 63.829403
-L 222.910476 58.500841
-L 228.750159 55.807619
-L 234.589841 55.807619
-L 240.429524 58.500841
-L 246.269206 63.829403
-L 252.108889 71.679355
-L 257.948571 81.884224
-L 263.788254 94.23018
-L 269.627937 108.462618
-L 275.467619 124.293918
-L 281.307302 141.412102
-L 287.146984 159.490064
-L 292.986667 178.195049
-L 298.826349 197.198028
-L 304.666032 216.182646
-L 310.505714 234.853422
-L 316.345397 252.942916
-L 322.185079 270.217643
-L 328.024762 286.482515
-L 333.864444 301.583711
-L 339.704127 315.409895
-L 345.54381 327.891789
-L 351.383492 339.000154
-L 357.223175 348.742324
-L 363.062857 357.157468
-L 368.90254 364.310798
-L 374.742222 370.287031
-L 380.581905 375.183358
-L 386.421587 379.102274
-L 392.26127 382.144563
-L 398.100952 384.402758
-L 403.940635 385.955349
-L 409.780317 386.862006
-L 415.62 387.16
+ <path clip-path="url(#p88c468b5a2)" d="M 47.855 388.6
+L 53.712183 388.298614
+L 59.569365 387.381638
+L 65.426548 385.811375
+L 71.28373 383.527477
+L 77.140913 380.450561
+L 82.998095 376.487041
+L 88.855278 371.534984
+L 94.71246 365.490731
+L 100.569643 358.255981
+L 106.426825 349.745057
+L 112.284008 339.892002
+L 118.14119 328.657202
+L 123.998373 316.033241
+L 129.855556 302.049688
+L 135.712738 286.776611
+L 141.569921 270.326614
+L 147.427103 252.855267
+L 153.284286 234.559879
+L 159.141468 215.676595
+L 164.998651 196.475895
+L 170.855833 177.256625
+L 176.713016 158.338741
+L 182.570198 140.055017
+L 188.427381 122.741996
+L 194.284563 106.730505
+L 200.141746 92.336074
+L 205.998929 79.849598
+L 211.856111 69.528578
+L 217.713294 61.589278
+L 223.570476 56.200066
+L 229.427659 53.47619
+L 235.284841 53.47619
+L 241.142024 56.200066
+L 246.999206 61.589278
+L 252.856389 69.528578
+L 258.713571 79.849598
+L 264.570754 92.336074
+L 270.427937 106.730505
+L 276.285119 122.741996
+L 282.142302 140.055017
+L 287.999484 158.338741
+L 293.856667 177.256625
+L 299.713849 196.475895
+L 305.571032 215.676595
+L 311.428214 234.559879
+L 317.285397 252.855267
+L 323.142579 270.326614
+L 328.999762 286.776611
+L 334.856944 302.049688
+L 340.714127 316.033241
+L 346.57131 328.657202
+L 352.428492 339.892002
+L 358.285675 349.745057
+L 364.142857 358.255981
+L 370.00004 365.490731
+L 375.857222 371.534984
+L 381.714405 376.487041
+L 387.571587 380.450561
+L 393.42877 383.527477
+L 399.285952 385.811375
+L 405.143135 387.381638
+L 411.000317 388.298614
+L 416.8575 388.6
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
<defs>
<path d="M 0 1.5
@@ -895,120 +895,120 @@ C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0
C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066
C -0.77937 1.341951 -0.397805 1.5 0 1.5
z
-" id="m2b26f7eddd" style="stroke:#0072bd;"/>
+" id="mf2142ee195" style="stroke:#0072bd;"/>
</defs>
- <g clip-path="url(#p8943548382)">
- <use style="fill:#0072bd;stroke:#0072bd;" x="47.72" xlink:href="#m2b26f7eddd" y="387.16"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="53.559683" xlink:href="#m2b26f7eddd" y="386.862006"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="59.399365" xlink:href="#m2b26f7eddd" y="385.955349"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="65.239048" xlink:href="#m2b26f7eddd" y="384.402758"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="71.07873" xlink:href="#m2b26f7eddd" y="382.144563"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="76.918413" xlink:href="#m2b26f7eddd" y="379.102274"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="82.758095" xlink:href="#m2b26f7eddd" y="375.183358"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="88.597778" xlink:href="#m2b26f7eddd" y="370.287031"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="94.43746" xlink:href="#m2b26f7eddd" y="364.310798"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="100.277143" xlink:href="#m2b26f7eddd" y="357.157468"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="106.116825" xlink:href="#m2b26f7eddd" y="348.742324"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="111.956508" xlink:href="#m2b26f7eddd" y="339.000154"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="117.79619" xlink:href="#m2b26f7eddd" y="327.891789"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="123.635873" xlink:href="#m2b26f7eddd" y="315.409895"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="129.475556" xlink:href="#m2b26f7eddd" y="301.583711"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="135.315238" xlink:href="#m2b26f7eddd" y="286.482515"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="141.154921" xlink:href="#m2b26f7eddd" y="270.217643"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="146.994603" xlink:href="#m2b26f7eddd" y="252.942916"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="152.834286" xlink:href="#m2b26f7eddd" y="234.853422"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="158.673968" xlink:href="#m2b26f7eddd" y="216.182646"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="164.513651" xlink:href="#m2b26f7eddd" y="197.198028"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="170.353333" xlink:href="#m2b26f7eddd" y="178.195049"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="176.193016" xlink:href="#m2b26f7eddd" y="159.490064"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="182.032698" xlink:href="#m2b26f7eddd" y="141.412102"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="187.872381" xlink:href="#m2b26f7eddd" y="124.293918"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="193.712063" xlink:href="#m2b26f7eddd" y="108.462618"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="199.551746" xlink:href="#m2b26f7eddd" y="94.23018"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="205.391429" xlink:href="#m2b26f7eddd" y="81.884224"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="211.231111" xlink:href="#m2b26f7eddd" y="71.679355"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="217.070794" xlink:href="#m2b26f7eddd" y="63.829403"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="222.910476" xlink:href="#m2b26f7eddd" y="58.500841"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="228.750159" xlink:href="#m2b26f7eddd" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="234.589841" xlink:href="#m2b26f7eddd" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="240.429524" xlink:href="#m2b26f7eddd" y="58.500841"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="246.269206" xlink:href="#m2b26f7eddd" y="63.829403"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="252.108889" xlink:href="#m2b26f7eddd" y="71.679355"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="257.948571" xlink:href="#m2b26f7eddd" y="81.884224"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="263.788254" xlink:href="#m2b26f7eddd" y="94.23018"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="269.627937" xlink:href="#m2b26f7eddd" y="108.462618"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="275.467619" xlink:href="#m2b26f7eddd" y="124.293918"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="281.307302" xlink:href="#m2b26f7eddd" y="141.412102"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="287.146984" xlink:href="#m2b26f7eddd" y="159.490064"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="292.986667" xlink:href="#m2b26f7eddd" y="178.195049"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="298.826349" xlink:href="#m2b26f7eddd" y="197.198028"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="304.666032" xlink:href="#m2b26f7eddd" y="216.182646"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="310.505714" xlink:href="#m2b26f7eddd" y="234.853422"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="316.345397" xlink:href="#m2b26f7eddd" y="252.942916"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="322.185079" xlink:href="#m2b26f7eddd" y="270.217643"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="328.024762" xlink:href="#m2b26f7eddd" y="286.482515"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="333.864444" xlink:href="#m2b26f7eddd" y="301.583711"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="339.704127" xlink:href="#m2b26f7eddd" y="315.409895"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="345.54381" xlink:href="#m2b26f7eddd" y="327.891789"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="351.383492" xlink:href="#m2b26f7eddd" y="339.000154"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="357.223175" xlink:href="#m2b26f7eddd" y="348.742324"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="363.062857" xlink:href="#m2b26f7eddd" y="357.157468"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="368.90254" xlink:href="#m2b26f7eddd" y="364.310798"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="374.742222" xlink:href="#m2b26f7eddd" y="370.287031"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="380.581905" xlink:href="#m2b26f7eddd" y="375.183358"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="386.421587" xlink:href="#m2b26f7eddd" y="379.102274"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="392.26127" xlink:href="#m2b26f7eddd" y="382.144563"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="398.100952" xlink:href="#m2b26f7eddd" y="384.402758"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="403.940635" xlink:href="#m2b26f7eddd" y="385.955349"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="409.780317" xlink:href="#m2b26f7eddd" y="386.862006"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="415.62" xlink:href="#m2b26f7eddd" y="387.16"/>
+ <g clip-path="url(#p88c468b5a2)">
+ <use style="fill:#0072bd;stroke:#0072bd;" x="47.855" xlink:href="#mf2142ee195" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="53.712183" xlink:href="#mf2142ee195" y="388.298614"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="59.569365" xlink:href="#mf2142ee195" y="387.381638"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="65.426548" xlink:href="#mf2142ee195" y="385.811375"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="71.28373" xlink:href="#mf2142ee195" y="383.527477"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="77.140913" xlink:href="#mf2142ee195" y="380.450561"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="82.998095" xlink:href="#mf2142ee195" y="376.487041"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="88.855278" xlink:href="#mf2142ee195" y="371.534984"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="94.71246" xlink:href="#mf2142ee195" y="365.490731"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="100.569643" xlink:href="#mf2142ee195" y="358.255981"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="106.426825" xlink:href="#mf2142ee195" y="349.745057"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="112.284008" xlink:href="#mf2142ee195" y="339.892002"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="118.14119" xlink:href="#mf2142ee195" y="328.657202"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="123.998373" xlink:href="#mf2142ee195" y="316.033241"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="129.855556" xlink:href="#mf2142ee195" y="302.049688"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="135.712738" xlink:href="#mf2142ee195" y="286.776611"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="141.569921" xlink:href="#mf2142ee195" y="270.326614"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="147.427103" xlink:href="#mf2142ee195" y="252.855267"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="153.284286" xlink:href="#mf2142ee195" y="234.559879"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="159.141468" xlink:href="#mf2142ee195" y="215.676595"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="164.998651" xlink:href="#mf2142ee195" y="196.475895"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="170.855833" xlink:href="#mf2142ee195" y="177.256625"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="176.713016" xlink:href="#mf2142ee195" y="158.338741"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="182.570198" xlink:href="#mf2142ee195" y="140.055017"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="188.427381" xlink:href="#mf2142ee195" y="122.741996"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="194.284563" xlink:href="#mf2142ee195" y="106.730505"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="200.141746" xlink:href="#mf2142ee195" y="92.336074"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="205.998929" xlink:href="#mf2142ee195" y="79.849598"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="211.856111" xlink:href="#mf2142ee195" y="69.528578"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="217.713294" xlink:href="#mf2142ee195" y="61.589278"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="223.570476" xlink:href="#mf2142ee195" y="56.200066"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="229.427659" xlink:href="#mf2142ee195" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="235.284841" xlink:href="#mf2142ee195" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="241.142024" xlink:href="#mf2142ee195" y="56.200066"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="246.999206" xlink:href="#mf2142ee195" y="61.589278"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="252.856389" xlink:href="#mf2142ee195" y="69.528578"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="258.713571" xlink:href="#mf2142ee195" y="79.849598"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="264.570754" xlink:href="#mf2142ee195" y="92.336074"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="270.427937" xlink:href="#mf2142ee195" y="106.730505"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="276.285119" xlink:href="#mf2142ee195" y="122.741996"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="282.142302" xlink:href="#mf2142ee195" y="140.055017"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="287.999484" xlink:href="#mf2142ee195" y="158.338741"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="293.856667" xlink:href="#mf2142ee195" y="177.256625"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="299.713849" xlink:href="#mf2142ee195" y="196.475895"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="305.571032" xlink:href="#mf2142ee195" y="215.676595"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="311.428214" xlink:href="#mf2142ee195" y="234.559879"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="317.285397" xlink:href="#mf2142ee195" y="252.855267"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="323.142579" xlink:href="#mf2142ee195" y="270.326614"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="328.999762" xlink:href="#mf2142ee195" y="286.776611"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="334.856944" xlink:href="#mf2142ee195" y="302.049688"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="340.714127" xlink:href="#mf2142ee195" y="316.033241"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="346.57131" xlink:href="#mf2142ee195" y="328.657202"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="352.428492" xlink:href="#mf2142ee195" y="339.892002"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="358.285675" xlink:href="#mf2142ee195" y="349.745057"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="364.142857" xlink:href="#mf2142ee195" y="358.255981"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="370.00004" xlink:href="#mf2142ee195" y="365.490731"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="375.857222" xlink:href="#mf2142ee195" y="371.534984"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="381.714405" xlink:href="#mf2142ee195" y="376.487041"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="387.571587" xlink:href="#mf2142ee195" y="380.450561"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="393.42877" xlink:href="#mf2142ee195" y="383.527477"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="399.285952" xlink:href="#mf2142ee195" y="385.811375"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="405.143135" xlink:href="#mf2142ee195" y="387.381638"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="411.000317" xlink:href="#mf2142ee195" y="388.298614"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="416.8575" xlink:href="#mf2142ee195" y="388.6"/>
</g>
</g>
<g id="patch_3">
- <path d="M 47.72 387.16
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
- <path d="M 415.62 387.16
-L 415.62 39.24
+ <path d="M 416.8575 388.6
+L 416.8575 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
- <path d="M 47.72 387.16
-L 415.62 387.16
+ <path d="M 47.855 388.6
+L 416.8575 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
- <path d="M 47.72 39.24
-L 415.62 39.24
+ <path d="M 47.855 36.72
+L 416.8575 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
<g id="axes_2">
<g id="patch_7">
- <path d="M 477.38 387.16
-L 845.28 387.16
-L 845.28 39.24
-L 477.38 39.24
+ <path d="M 476.2325 388.6
+L 845.235 388.6
+L 845.235 36.72
+L 476.2325 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_3">
<g id="xtick_8">
<g id="line2d_28">
- <path clip-path="url(#pa6dc066b5b)" d="M 477.38 387.16
-L 477.38 39.24
+ <path clip-path="url(#pc90e977743)" d="M 476.2325 388.6
+L 476.2325 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_29">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m6b085097ab" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m41228d2211" y="388.6"/>
</g>
</g>
<g id="text_16">
<!-- 0.0 -->
- <g transform="translate(469.428437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(468.280937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1017,18 +1017,18 @@ L 477.38 39.24
</g>
<g id="xtick_9">
<g id="line2d_30">
- <path clip-path="url(#pa6dc066b5b)" d="M 550.96 387.16
-L 550.96 39.24
+ <path clip-path="url(#pc90e977743)" d="M 550.033 388.6
+L 550.033 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_31">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="550.96" xlink:href="#m6b085097ab" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="550.033" xlink:href="#m41228d2211" y="388.6"/>
</g>
</g>
<g id="text_17">
<!-- 0.2 -->
- <g transform="translate(543.008437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(542.081437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -1037,18 +1037,18 @@ L 550.96 39.24
</g>
<g id="xtick_10">
<g id="line2d_32">
- <path clip-path="url(#pa6dc066b5b)" d="M 624.54 387.16
-L 624.54 39.24
+ <path clip-path="url(#pc90e977743)" d="M 623.8335 388.6
+L 623.8335 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_33">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="624.54" xlink:href="#m6b085097ab" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.8335" xlink:href="#m41228d2211" y="388.6"/>
</g>
</g>
<g id="text_18">
<!-- 0.4 -->
- <g transform="translate(616.588437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(615.881937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -1057,18 +1057,18 @@ L 624.54 39.24
</g>
<g id="xtick_11">
<g id="line2d_34">
- <path clip-path="url(#pa6dc066b5b)" d="M 698.12 387.16
-L 698.12 39.24
+ <path clip-path="url(#pc90e977743)" d="M 697.634 388.6
+L 697.634 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_35">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="698.12" xlink:href="#m6b085097ab" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="697.634" xlink:href="#m41228d2211" y="388.6"/>
</g>
</g>
<g id="text_19">
<!-- 0.6 -->
- <g transform="translate(690.168438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(689.682437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -1077,18 +1077,18 @@ L 698.12 39.24
</g>
<g id="xtick_12">
<g id="line2d_36">
- <path clip-path="url(#pa6dc066b5b)" d="M 771.7 387.16
-L 771.7 39.24
+ <path clip-path="url(#pc90e977743)" d="M 771.4345 388.6
+L 771.4345 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_37">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="771.7" xlink:href="#m6b085097ab" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="771.4345" xlink:href="#m41228d2211" y="388.6"/>
</g>
</g>
<g id="text_20">
<!-- 0.8 -->
- <g transform="translate(763.748438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(763.482937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -1097,18 +1097,18 @@ L 771.7 39.24
</g>
<g id="xtick_13">
<g id="line2d_38">
- <path clip-path="url(#pa6dc066b5b)" d="M 845.28 387.16
-L 845.28 39.24
+ <path clip-path="url(#pc90e977743)" d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_39">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="845.28" xlink:href="#m6b085097ab" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="845.235" xlink:href="#m41228d2211" y="388.6"/>
</g>
</g>
<g id="text_21">
<!-- 1.0 -->
- <g transform="translate(837.328438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(837.283437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1341,7 +1341,7 @@ Q 14.5 64.65625 8.015625 75.875
z
" id="DejaVuSans-41"/>
</defs>
- <g transform="translate(562.53 415.438125)scale(0.1 -0.1)">
+ <g transform="translate(561.93375 416.878125)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-78"/>
<use transform="translate(74.804688 0.015625)" xlink:href="#DejaVuSans-111"/>
<use transform="translate(135.986328 0.015625)" xlink:href="#DejaVuSans-114"/>
@@ -1384,13 +1384,13 @@ z
<g id="matplotlib.axis_4">
<g id="ytick_7">
<g id="line2d_40">
- <path clip-path="url(#pa6dc066b5b)" d="M 477.38 348.712259
-L 845.28 348.712259
+ <path clip-path="url(#pc90e977743)" d="M 476.2325 349.714649
+L 845.235 349.714649
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_41">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1a334da98e" y="348.712259"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m1ee6f1366e" y="349.714649"/>
</g>
</g>
<g id="text_23">
@@ -1403,7 +1403,7 @@ L 10.59375 27.203125
z
" id="DejaVuSans-8722"/>
</defs>
- <g transform="translate(442.912812 352.511477)scale(0.1 -0.1)">
+ <g transform="translate(441.765312 353.513868)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-49"/>
<use x="147.412109" xlink:href="#DejaVuSans-50"/>
@@ -1413,18 +1413,18 @@ z
</g>
<g id="ytick_8">
<g id="line2d_42">
- <path clip-path="url(#pa6dc066b5b)" d="M 477.38 309.149556
-L 845.28 309.149556
+ <path clip-path="url(#pc90e977743)" d="M 476.2325 309.701647
+L 845.235 309.701647
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_43">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1a334da98e" y="309.149556"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m1ee6f1366e" y="309.701647"/>
</g>
</g>
<g id="text_24">
<!-- −100 -->
- <g transform="translate(442.912812 312.948775)scale(0.1 -0.1)">
+ <g transform="translate(441.765312 313.500866)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-49"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1434,18 +1434,18 @@ L 845.28 309.149556
</g>
<g id="ytick_9">
<g id="line2d_44">
- <path clip-path="url(#pa6dc066b5b)" d="M 477.38 269.586854
-L 845.28 269.586854
+ <path clip-path="url(#pc90e977743)" d="M 476.2325 269.688645
+L 845.235 269.688645
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_45">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1a334da98e" y="269.586854"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m1ee6f1366e" y="269.688645"/>
</g>
</g>
<g id="text_25">
<!-- −80 -->
- <g transform="translate(449.275312 273.386073)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 273.487864)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-56"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1454,18 +1454,18 @@ L 845.28 269.586854
</g>
<g id="ytick_10">
<g id="line2d_46">
- <path clip-path="url(#pa6dc066b5b)" d="M 477.38 230.024151
-L 845.28 230.024151
+ <path clip-path="url(#pc90e977743)" d="M 476.2325 229.675643
+L 845.235 229.675643
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_47">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1a334da98e" y="230.024151"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m1ee6f1366e" y="229.675643"/>
</g>
</g>
<g id="text_26">
<!-- −60 -->
- <g transform="translate(449.275312 233.82337)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 233.474861)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-54"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1474,18 +1474,18 @@ L 845.28 230.024151
</g>
<g id="ytick_11">
<g id="line2d_48">
- <path clip-path="url(#pa6dc066b5b)" d="M 477.38 190.461449
-L 845.28 190.461449
+ <path clip-path="url(#pc90e977743)" d="M 476.2325 189.66264
+L 845.235 189.66264
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_49">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1a334da98e" y="190.461449"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m1ee6f1366e" y="189.66264"/>
</g>
</g>
<g id="text_27">
<!-- −40 -->
- <g transform="translate(449.275312 194.260668)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 193.461859)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-52"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1494,18 +1494,18 @@ L 845.28 190.461449
</g>
<g id="ytick_12">
<g id="line2d_50">
- <path clip-path="url(#pa6dc066b5b)" d="M 477.38 150.898746
-L 845.28 150.898746
+ <path clip-path="url(#pc90e977743)" d="M 476.2325 149.649638
+L 845.235 149.649638
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_51">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1a334da98e" y="150.898746"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m1ee6f1366e" y="149.649638"/>
</g>
</g>
<g id="text_28">
<!-- −20 -->
- <g transform="translate(449.275312 154.697965)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 153.448857)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-50"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1514,36 +1514,36 @@ L 845.28 150.898746
</g>
<g id="ytick_13">
<g id="line2d_52">
- <path clip-path="url(#pa6dc066b5b)" d="M 477.38 111.336044
-L 845.28 111.336044
+ <path clip-path="url(#pc90e977743)" d="M 476.2325 109.636636
+L 845.235 109.636636
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_53">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1a334da98e" y="111.336044"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m1ee6f1366e" y="109.636636"/>
</g>
</g>
<g id="text_29">
<!-- 0 -->
- <g transform="translate(464.0175 115.135263)scale(0.1 -0.1)">
+ <g transform="translate(462.87 113.435855)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_14">
<g id="line2d_54">
- <path clip-path="url(#pa6dc066b5b)" d="M 477.38 71.773342
-L 845.28 71.773342
+ <path clip-path="url(#pc90e977743)" d="M 476.2325 69.623634
+L 845.235 69.623634
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_55">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m1a334da98e" y="71.773342"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m1ee6f1366e" y="69.623634"/>
</g>
</g>
<g id="text_30">
<!-- 20 -->
- <g transform="translate(457.655 75.57256)scale(0.1 -0.1)">
+ <g transform="translate(456.5075 73.422852)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -1607,7 +1607,7 @@ L 9.8125 0
z
" id="DejaVuSans-66"/>
</defs>
- <g transform="translate(436.833125 236.791406)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(435.685625 236.251406)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-71"/>
<use x="77.490234" xlink:href="#DejaVuSans-97"/>
<use x="138.769531" xlink:href="#DejaVuSans-105"/>
@@ -1621,514 +1621,514 @@ z
</g>
</g>
<g id="line2d_56">
- <path clip-path="url(#pa6dc066b5b)" d="M 477.38 55.054545
-L 478.817109 55.185219
-L 480.254219 55.577982
-L 481.691328 56.235086
-L 483.128437 57.160356
-L 484.565547 58.359306
-L 486.002656 59.83931
-L 487.439766 61.60984
-L 488.876875 63.682802
-L 490.313984 66.072975
-L 491.751094 68.798622
-L 493.188203 71.882312
-L 494.625312 75.352067
-L 496.062422 79.242977
-L 497.499531 83.599539
-L 498.936641 88.479139
-L 500.37375 93.957421
-L 501.810859 100.136945
-L 503.247969 107.161914
-L 504.685078 115.244984
-L 506.122187 124.720645
-L 507.559297 136.165192
-L 508.996406 150.719249
-L 509.714961 159.906446
-L 510.433516 171.2576
-L 511.15207 186.4579
-L 511.870625 211.068844
-L 512.58918 249.154449
-L 513.307734 234.337604
-L 514.026289 203.172453
-L 514.744844 189.875046
-L 515.463398 181.918078
-L 516.181953 176.738561
-L 516.900508 173.340422
-L 517.619062 171.242139
-L 518.337617 170.190605
-L 519.056172 170.058808
-L 519.774727 170.807756
-L 520.493281 172.481575
-L 521.211836 175.235295
-L 521.930391 179.428011
-L 522.648945 185.928972
-L 523.3675 197.567003
-L 524.086055 269.154972
-L 524.804609 198.630412
-L 525.523164 187.221152
-L 526.241719 181.097091
-L 526.960273 177.27352
-L 527.678828 174.830867
-L 528.397383 173.372313
-L 529.115937 172.701689
-L 529.834492 172.722177
-L 530.553047 173.399046
-L 531.271602 174.748492
-L 531.990156 176.843547
-L 532.708711 179.841778
-L 533.427266 184.060771
-L 534.14582 190.20303
-L 534.864375 200.278344
-L 535.58293 227.204423
-L 537.020039 196.554614
-L 537.738594 189.682758
-L 538.457148 185.512722
-L 539.175703 182.862317
-L 539.894258 181.252407
-L 540.612813 180.452386
-L 541.331367 180.347466
-L 542.049922 180.890838
-L 542.768477 182.087459
-L 543.487031 183.995741
-L 544.205586 186.748495
-L 544.924141 190.611549
-L 545.642695 196.15076
-L 546.36125 204.846883
-L 547.079805 223.436888
-L 547.798359 225.529198
-L 548.516914 206.756358
-L 549.235469 198.750872
-L 549.954023 194.02629
-L 550.672578 191.018375
-L 551.391133 189.138199
-L 552.109687 188.110717
-L 552.828242 187.7984
-L 553.546797 188.139781
-L 554.265352 189.12733
-L 554.983906 190.804972
-L 555.702461 193.283283
-L 556.421016 196.785134
-L 557.13957 201.771705
-L 557.858125 209.367645
-L 558.57668 223.716091
-L 559.295234 245.597939
-L 560.013789 216.87583
-L 560.732344 207.386468
-L 561.450898 202.004632
-L 562.169453 198.592211
-L 562.888008 196.415295
-L 563.606562 195.14403
-L 564.325117 194.614289
-L 565.043672 194.748431
-L 565.762227 195.52614
-L 566.480781 196.977642
-L 567.199336 199.193908
-L 567.917891 202.362103
-L 568.636445 206.861892
-L 569.355 213.56813
-L 570.073555 225.25921
-L 570.792109 285.33485
-L 571.510664 227.085224
-L 572.229219 215.582941
-L 572.947773 209.429092
-L 573.666328 205.572081
-L 574.384883 203.082223
-L 575.103437 201.561311
-L 575.821992 200.813883
-L 576.540547 200.744327
-L 577.259102 201.319103
-L 577.977656 202.555336
-L 578.696211 204.52651
-L 579.414766 207.389743
-L 580.13332 211.4601
-L 580.851875 217.431259
-L 581.57043 227.273685
-L 582.288984 253.288003
-L 583.726094 223.482886
-L 584.444648 216.401171
-L 585.163203 212.050515
-L 585.881758 209.229182
-L 586.600312 207.452305
-L 587.318867 206.487032
-L 588.037422 206.217494
-L 588.755977 206.596222
-L 589.474531 207.627587
-L 590.193086 209.369237
-L 590.911641 211.952651
-L 591.630195 215.640855
-L 592.34875 220.992444
-L 593.067305 229.46185
-L 593.785859 247.561362
-L 594.504414 250.594283
-L 595.222969 231.270727
-L 595.941523 223.036856
-L 596.660078 218.128136
-L 597.378633 214.951175
-L 598.097188 212.909182
-L 598.815742 211.724048
-L 599.534297 211.256731
-L 600.252852 211.444823
-L 600.971406 212.280028
-L 601.689961 213.805407
-L 602.408516 216.130253
-L 603.12707 219.475027
-L 603.845625 224.295217
-L 604.56418 231.697253
-L 605.282734 245.713613
-L 606.001289 269.079534
-L 606.719844 239.173642
-L 607.438398 229.449008
-L 608.156953 223.896192
-L 608.875508 220.332087
-L 609.594062 218.012232
-L 610.312617 216.602936
-L 611.031172 215.938257
-L 611.749727 215.93948
-L 612.468281 216.585472
-L 613.186836 217.905617
-L 613.905391 219.989726
-L 614.623945 223.022927
-L 615.3425 227.380395
-L 616.061055 233.923933
-L 616.779609 245.369016
-L 617.498164 298.624206
-L 618.216719 247.5103
-L 618.935273 235.749343
-L 619.653828 229.435769
-L 620.372383 225.44376
-L 621.090937 222.82919
-L 621.809492 221.189018
-L 622.528047 220.325627
-L 623.246602 220.142202
-L 623.965156 220.604343
-L 624.683711 221.728359
-L 625.402266 223.58669
-L 626.12082 226.334721
-L 626.839375 230.283922
-L 627.55793 236.118348
-L 628.276484 245.769386
-L 628.995039 270.96717
-L 630.432148 242.057118
-L 631.150703 234.820855
-L 631.869258 230.348348
-L 632.587813 227.417461
-L 633.306367 225.537152
-L 634.024922 224.471978
-L 634.743477 224.104708
-L 635.462031 224.386961
-L 636.180586 225.322304
-L 636.899141 226.967433
-L 637.617695 229.452337
-L 638.33625 233.037122
-L 639.054805 238.273107
-L 639.773359 246.588916
-L 640.491914 264.283107
-L 641.210469 268.33441
-L 641.929023 248.513902
-L 642.647578 240.122413
-L 643.366133 235.101115
-L 644.084687 231.826654
-L 644.803242 229.694178
-L 645.521797 228.422429
-L 646.240352 227.870795
-L 646.958906 227.975885
-L 647.677461 228.728598
-L 648.396016 230.171112
-L 649.11457 232.411421
-L 649.833125 235.667576
-L 650.55168 240.389449
-L 651.270234 247.665624
-L 651.988789 261.422113
-L 652.707344 286.433309
-L 653.425898 255.310153
-L 654.144453 245.413076
-L 654.863008 239.753124
-L 655.581563 236.100859
-L 656.300117 233.701071
-L 657.018672 232.216173
-L 657.737227 231.478389
-L 658.455781 231.407923
-L 659.174336 231.982824
-L 659.892891 233.231636
-L 660.611445 235.243025
-L 661.33 238.200103
-L 662.048555 242.473624
-L 662.767109 248.9126
-L 663.485664 260.171572
-L 664.204219 308.682483
-L 664.922773 262.741135
-L 665.641328 250.77308
-L 666.359883 244.353783
-L 667.078438 240.28063
-L 667.796992 237.594756
-L 668.515547 235.888226
-L 669.234102 234.961249
-L 669.952656 234.715803
-L 670.671211 235.116634
-L 671.389766 236.179244
-L 672.10832 237.975043
-L 672.826875 240.657705
-L 673.54543 244.535164
-L 674.263984 250.28203
-L 674.982539 259.791679
-L 675.701094 284.265815
-L 676.419648 271.350048
-L 677.138203 256.29881
-L 677.856758 248.95347
-L 678.575312 244.404759
-L 679.293867 241.40968
-L 680.012422 239.470921
-L 680.730977 238.350428
-L 681.449531 237.929601
-L 682.168086 238.159149
-L 682.886641 239.041849
-L 683.605195 240.633453
-L 684.32375 243.06248
-L 685.042305 246.586161
-L 685.760859 251.748666
-L 686.479414 259.953439
-L 687.197969 277.295623
-L 687.916523 282.413921
-L 688.635078 262.116973
-L 689.353633 253.606538
-L 690.072188 248.511994
-L 690.790742 245.179249
-L 691.509297 242.995259
-L 692.227852 241.675583
-L 692.946406 241.07803
-L 693.664961 241.138226
-L 694.383516 241.846276
-L 695.10207 243.243478
-L 695.820625 245.436549
-L 696.53918 248.641165
-L 697.257734 253.30167
-L 697.976289 260.489198
-L 698.694844 274.027283
-L 699.413398 300.832817
-L 700.131953 268.411409
-L 700.850508 258.375193
-L 701.569062 252.642854
-L 702.287617 248.937254
-L 703.006172 246.492232
-L 703.724727 244.966258
-L 704.443281 244.18971
-L 705.161836 244.081711
-L 705.880391 244.619493
-L 706.598945 245.830772
-L 707.3175 247.803078
-L 708.036055 250.717539
-L 708.754609 254.940556
-L 709.473164 261.308603
-L 710.191719 272.417196
-L 710.910273 317.321659
-L 711.628828 275.481534
-L 712.347383 263.335079
-L 713.065938 256.841749
-L 713.784492 252.719443
-L 714.503047 249.994256
-L 715.221602 248.253285
-L 715.940156 247.294551
-L 716.658711 247.018821
-L 717.377266 247.38999
-L 718.09582 248.422759
-L 718.814375 250.187518
-L 719.53293 252.836257
-L 720.251484 256.673423
-L 720.970039 262.364356
-L 721.688594 271.765453
-L 722.407148 295.587543
-L 723.125703 283.895363
-L 723.844258 268.584119
-L 724.562813 261.159712
-L 725.281367 256.565416
-L 725.999922 253.536892
-L 726.718477 251.570462
-L 727.437031 250.425438
-L 728.155586 249.981841
-L 728.874141 250.189479
-L 729.592695 251.050337
-L 730.31125 252.619237
-L 731.029805 255.02325
-L 731.748359 258.51677
-L 732.466914 263.636943
-L 733.185469 271.762642
-L 733.904023 288.795226
-L 734.622578 295.02178
-L 735.341133 274.257916
-L 736.059688 265.658189
-L 736.778242 260.521137
-L 737.496797 257.161131
-L 738.215352 254.9568
-L 738.933906 253.620484
-L 739.652461 253.008407
-L 740.371016 253.055213
-L 741.08957 253.750216
-L 741.808125 255.133852
-L 742.52668 257.311571
-L 743.245234 260.496711
-L 743.963789 265.128185
-L 744.682344 272.260051
-L 745.400898 285.617168
-L 746.119453 314.385808
-L 746.838008 280.559399
-L 747.556563 270.414697
-L 748.275117 264.642542
-L 748.993672 260.916674
-L 749.712227 258.459781
-L 750.430781 256.926344
-L 751.149336 256.144882
-L 751.867891 256.033442
-L 752.586445 256.568447
-L 753.305 257.776796
-L 754.023555 259.744904
-L 754.742109 262.651942
-L 755.460664 266.860031
-L 756.179219 273.193367
-L 756.897773 284.190267
-L 757.616328 326.222249
-L 758.334883 287.823666
-L 759.053437 275.531822
-L 759.771992 269.001088
-L 760.490547 264.867059
-L 761.209102 262.140486
-L 761.927656 260.403439
-L 762.646211 259.451737
-L 763.364766 259.184942
-L 764.08332 259.56611
-L 764.801875 260.609158
-L 765.52043 262.383476
-L 766.238984 265.039402
-L 766.957539 268.87796
-L 767.676094 274.555401
-L 768.394648 283.89215
-L 769.113203 307.14187
-L 769.831758 296.687685
-L 770.550313 281.152505
-L 771.268867 273.692939
-L 771.987422 269.098248
-L 772.705977 266.082278
-L 773.424531 264.134902
-L 774.143086 263.012786
-L 774.861641 262.594587
-L 775.580195 262.829228
-L 776.29875 263.71793
-L 777.017305 265.314615
-L 777.735859 267.744945
-L 778.454414 271.260539
-L 779.172969 276.391665
-L 779.891523 284.493233
-L 780.610078 301.281857
-L 781.328633 308.685312
-L 782.047188 287.488023
-L 782.765742 278.855369
-L 783.484297 273.73429
-L 784.202852 270.406833
-L 784.921406 268.243189
-L 785.639961 266.952477
-L 786.358516 266.389362
-L 787.07707 266.487547
-L 787.795625 267.235601
-L 788.51418 268.673144
-L 789.232734 270.904426
-L 789.951289 274.140522
-L 790.669844 278.815049
-L 791.388398 285.965417
-L 792.106953 299.221465
-L 792.825508 330.196535
-L 793.544063 294.874189
-L 794.262617 284.699063
-L 794.981172 278.96886
-L 795.699727 275.306786
-L 796.418281 272.92424
-L 797.136836 271.471739
-L 797.855391 270.776016
-L 798.573945 270.754122
-L 799.2925 271.381768
-L 800.011055 272.685139
-L 800.729609 274.749648
-L 801.448164 277.752647
-L 802.166719 282.052156
-L 802.885273 288.460453
-L 803.603828 299.460542
-L 804.322383 339.21598
-L 805.040938 303.899128
-L 805.759492 291.580293
-L 806.478047 285.137705
-L 807.196602 281.121866
-L 807.915156 278.528047
-L 808.633711 276.933418
-L 809.352266 276.131785
-L 810.07082 276.021724
-L 810.789375 276.565692
-L 811.50793 277.777082
-L 812.226484 279.724574
-L 812.945039 282.557168
-L 813.663594 286.572828
-L 814.382148 292.419226
-L 815.100703 301.882137
-L 815.819258 324.78883
-L 816.537813 315.75121
-L 817.256367 300.195504
-L 817.974922 292.920521
-L 818.693477 288.555079
-L 819.412031 285.791289
-L 820.130586 284.113117
-L 820.849141 283.275261
-L 821.567695 283.155778
-L 822.28625 283.703552
-L 823.004805 284.91998
-L 823.723359 286.859119
-L 824.441914 289.646376
-L 825.160469 293.5319
-L 825.879023 299.040608
-L 826.597578 307.505584
-L 827.316133 324.468903
-L 828.034688 333.497241
-L 828.753242 312.299798
-L 829.471797 304.120073
-L 830.190352 299.533604
-L 830.908906 296.792622
-L 831.627461 295.262636
-L 832.346016 294.654051
-L 833.06457 294.825299
-L 833.783125 295.71547
-L 834.50168 297.319962
-L 835.220234 299.68675
-L 835.938789 302.930119
-L 836.657344 307.272863
-L 837.375898 313.161012
-L 838.094453 321.638393
-L 838.813008 336.273203
-L 839.531563 371.345455
-L 840.250117 336.265242
-L 840.968672 328.354036
-L 841.687227 325.440092
-L 842.405781 325.31172
-L 843.124336 327.576114
-L 843.842891 332.794412
-L 844.561445 343.710511
-L 844.561445 343.710511
+ <path clip-path="url(#pc90e977743)" d="M 476.2325 52.714545
+L 477.673916 52.846706
+L 479.115332 53.243939
+L 480.556748 53.908523
+L 481.998164 54.844324
+L 483.43958 56.056921
+L 484.880996 57.55377
+L 486.322412 59.344452
+L 487.763828 61.441008
+L 489.205244 63.858386
+L 490.64666 66.615057
+L 492.088076 69.733845
+L 493.529492 73.243092
+L 494.970908 77.178288
+L 496.412324 81.584436
+L 497.85374 86.519576
+L 499.295156 92.060211
+L 500.736572 98.31007
+L 502.177988 105.414996
+L 503.619404 113.590067
+L 505.06082 123.17358
+L 506.502236 134.748387
+L 507.943652 149.468097
+L 508.66436 158.759863
+L 509.385068 170.240215
+L 510.105776 185.613523
+L 510.826484 210.504587
+L 511.547192 249.02368
+L 512.2679 234.038191
+L 512.988608 202.518321
+L 513.709316 189.069563
+L 514.430024 181.022029
+L 515.150732 175.78356
+L 515.87144 172.346744
+L 516.592148 170.224578
+L 517.312856 169.161075
+L 518.033564 169.027778
+L 518.754272 169.78525
+L 519.47498 171.478121
+L 520.195688 174.263183
+L 520.916396 178.503621
+L 521.637104 185.078575
+L 522.357812 196.849069
+L 523.078521 269.251847
+L 523.799229 197.924582
+L 524.519937 186.385463
+L 525.240645 180.191698
+L 525.961353 176.324608
+L 526.682061 173.854153
+L 527.402769 172.378997
+L 528.123477 171.70074
+L 528.844185 171.721461
+L 529.564893 172.406035
+L 530.285601 173.77084
+L 531.006309 175.88974
+L 531.727017 178.922097
+L 532.447725 183.18911
+L 533.168433 189.40128
+L 533.889141 199.591271
+L 534.609849 226.823821
+L 536.051265 195.825157
+L 536.771973 188.875087
+L 537.492681 184.657588
+L 538.213389 181.977015
+L 538.934097 180.348782
+L 539.654805 179.539655
+L 540.375513 179.43354
+L 541.096221 179.983098
+L 541.816929 181.193338
+L 542.537637 183.123341
+L 543.258345 185.907426
+L 543.979053 189.814449
+L 544.699761 195.416707
+L 545.420469 204.211808
+L 546.141177 223.013404
+L 546.861885 225.129528
+L 547.582593 206.143017
+L 548.303301 198.046414
+L 549.024009 193.268056
+L 549.744717 190.225905
+L 550.465425 188.32433
+L 551.186133 187.285153
+L 551.906841 186.969281
+L 552.627549 187.314547
+L 553.348257 188.313337
+L 554.068965 190.010074
+L 554.789673 192.516592
+L 555.510381 196.058302
+L 556.231089 201.101629
+L 556.951797 208.784026
+L 557.672505 223.295785
+L 558.393213 245.42669
+L 559.113921 216.377668
+L 559.834629 206.780299
+L 560.555337 201.337207
+L 561.276045 197.885946
+L 561.996753 195.684252
+L 562.717461 194.398519
+L 563.438169 193.862748
+L 564.158877 193.998416
+L 564.879585 194.784978
+L 565.600293 196.253001
+L 566.321001 198.494492
+L 567.041709 201.698747
+L 567.762417 206.249753
+L 568.483125 213.03232
+L 569.203833 224.856467
+L 569.924541 285.615883
+L 570.645249 226.703264
+L 571.365957 215.070064
+L 572.086665 208.846172
+L 572.807373 204.945261
+L 573.528081 202.427063
+L 574.248789 200.88884
+L 574.969497 200.132905
+L 575.690205 200.062558
+L 576.410913 200.643876
+L 577.131621 201.894179
+L 577.852329 203.88779
+L 578.573037 206.783611
+L 579.293745 210.900296
+L 580.014453 216.939419
+L 580.735161 226.893871
+L 581.455869 253.204281
+L 582.897285 223.059925
+L 583.617993 215.897607
+L 584.338701 211.497432
+L 585.059409 208.643986
+L 585.780117 206.846886
+L 586.500825 205.870625
+L 587.221533 205.59802
+L 587.942241 205.981058
+L 588.662949 207.024162
+L 589.383657 208.785635
+L 590.104365 211.398453
+L 590.825073 215.128637
+L 591.545781 220.541137
+L 592.266489 229.106941
+L 592.987197 247.41246
+L 593.707905 250.479902
+L 594.428613 230.936406
+L 595.149321 222.608819
+L 595.870029 217.644227
+L 596.590737 214.431107
+L 597.311445 212.365872
+L 598.032153 211.167249
+L 598.752861 210.694613
+L 599.473569 210.884846
+L 600.194277 211.729557
+L 600.914985 213.272297
+L 601.635693 215.623605
+L 602.356401 219.006449
+L 603.077109 223.881502
+L 603.797817 231.367787
+L 604.518525 245.54368
+L 605.239233 269.175551
+L 605.959941 238.929272
+L 606.680649 229.093953
+L 607.401357 223.477935
+L 608.122065 219.873263
+L 608.842773 217.527004
+L 609.563481 216.101668
+L 610.284189 215.429423
+L 611.004897 215.430661
+L 611.725605 216.084005
+L 612.446313 217.419176
+L 613.167021 219.527006
+L 613.887729 222.594731
+L 614.608437 227.001795
+L 615.329146 233.619811
+L 616.049854 245.195161
+L 616.770562 299.056498
+L 617.49127 247.360818
+L 618.211978 235.465998
+L 618.932686 229.080563
+L 619.653394 225.043118
+L 620.374102 222.398789
+L 621.09481 220.739948
+L 621.815518 219.866731
+L 622.536226 219.681218
+L 623.256934 220.148618
+L 623.977642 221.285428
+L 624.69835 223.164911
+L 625.419058 225.944219
+L 626.139766 229.93837
+L 626.860474 235.839204
+L 627.581182 245.600088
+L 628.30189 271.084672
+L 629.743306 241.845568
+L 630.464014 234.526942
+L 631.184722 230.00353
+L 631.90543 227.039284
+L 632.626138 225.137573
+L 633.346846 224.060275
+L 634.067554 223.688825
+L 634.788262 223.97429
+L 635.50897 224.920279
+L 636.229678 226.584133
+L 636.950386 229.09732
+L 637.671094 232.722907
+L 638.391802 238.018487
+L 639.11251 246.428947
+L 639.833218 264.324532
+L 640.553926 268.421946
+L 641.274634 248.375843
+L 641.995342 239.888842
+L 642.71605 234.810392
+L 643.436758 231.498662
+L 644.157466 229.341914
+L 644.878174 228.05569
+L 645.598882 227.497777
+L 646.31959 227.604063
+L 647.040298 228.365344
+L 647.761006 229.824276
+L 648.481714 232.090084
+L 649.202422 235.3833
+L 649.92313 240.158917
+L 650.643838 247.517909
+L 651.364546 261.430973
+L 652.085254 286.726845
+L 652.805962 255.249447
+L 653.52667 245.239723
+L 654.247378 239.51535
+L 654.968086 235.821515
+L 655.688794 233.394413
+L 656.409502 231.892614
+L 657.13021 231.146432
+L 657.850918 231.075164
+L 658.571626 231.656609
+L 659.292334 232.919635
+L 660.013042 234.953917
+L 660.73375 237.944652
+L 661.454458 242.266815
+L 662.175166 248.779078
+L 662.895874 260.166199
+L 663.616582 309.229257
+L 664.33729 262.765008
+L 665.057998 250.660734
+L 665.778706 244.168373
+L 666.499414 240.04886
+L 667.220122 237.332416
+L 667.94083 235.606461
+L 668.661538 234.668934
+L 669.382246 234.420694
+L 670.102954 234.826088
+L 670.823662 235.900793
+L 671.54437 237.71703
+L 672.265078 240.430227
+L 672.985786 244.351819
+L 673.706494 250.164095
+L 674.427202 259.781982
+L 675.14791 284.534681
+L 675.868618 271.471908
+L 676.589326 256.249357
+L 677.310034 248.820413
+L 678.030742 244.219929
+L 678.75145 241.190761
+L 679.472158 239.229934
+L 680.192866 238.096688
+L 680.913574 237.671071
+L 681.634282 237.903233
+L 682.35499 238.79598
+L 683.075698 240.405698
+L 683.796406 242.862373
+L 684.517114 246.42616
+L 685.237822 251.647424
+L 685.95853 259.945583
+L 686.679238 277.485155
+L 687.399946 282.661709
+L 688.120654 262.133743
+L 688.841362 253.526442
+L 689.56207 248.373913
+L 690.282778 245.003234
+L 691.003486 242.794386
+L 691.724194 241.45969
+L 692.444902 240.855335
+L 693.16561 240.916217
+L 693.886318 241.632325
+L 694.607026 243.045431
+L 695.327734 245.263463
+L 696.048442 248.504554
+L 696.76915 253.218105
+L 697.489858 260.487441
+L 698.210566 274.179615
+L 698.931274 301.290247
+L 699.651982 268.499821
+L 700.37269 258.349374
+L 701.093398 252.55179
+L 701.814106 248.804013
+L 702.534814 246.331162
+L 703.255522 244.78782
+L 703.97623 244.002432
+L 704.696938 243.893204
+L 705.417646 244.437107
+L 706.138354 245.662173
+L 706.859062 247.656928
+L 707.579771 250.604561
+L 708.300479 254.875644
+L 709.021187 261.316172
+L 709.741895 272.551201
+L 710.462603 317.966764
+L 711.183311 275.650418
+L 711.904019 263.365713
+L 712.624727 256.798477
+L 713.345435 252.629251
+L 714.066143 249.873045
+L 714.786851 248.112259
+L 715.507559 247.142613
+L 716.228267 246.863745
+L 716.948975 247.239138
+L 717.669683 248.283662
+L 718.390391 250.068507
+L 719.111099 252.747394
+L 719.831807 256.628235
+L 720.552515 262.383941
+L 721.273223 271.892041
+L 721.993931 295.985272
+L 722.714639 284.160012
+L 723.435347 268.674497
+L 724.156055 261.165586
+L 724.876763 256.518998
+L 725.597471 253.456004
+L 726.318179 251.467192
+L 727.038887 250.309135
+L 727.759595 249.860489
+L 728.480303 250.07049
+L 729.201011 250.941147
+L 729.921719 252.527904
+L 730.642427 254.959279
+L 731.363135 258.492562
+L 732.083843 263.671013
+L 732.804551 271.889198
+L 733.525259 289.115646
+L 734.245967 295.41307
+L 734.966675 274.412873
+L 735.687383 265.715265
+L 736.408091 260.519743
+L 737.128799 257.121493
+L 737.849507 254.892073
+L 738.570215 253.540548
+L 739.290923 252.921503
+L 740.011631 252.968842
+L 740.732339 253.671756
+L 741.453047 255.07114
+L 742.173755 257.273646
+L 742.894463 260.495039
+L 743.615171 265.179227
+L 744.335879 272.392269
+L 745.056587 285.901415
+L 745.777295 314.997497
+L 746.498003 280.786079
+L 747.218711 270.52591
+L 747.939419 264.688057
+L 748.660127 260.919782
+L 749.380835 258.434925
+L 750.101543 256.884034
+L 750.822251 256.093678
+L 751.542959 255.980969
+L 752.263667 256.522064
+L 752.984375 257.744166
+L 753.705083 259.734675
+L 754.425791 262.6748
+L 755.146499 266.930786
+L 755.867207 273.336207
+L 756.587915 284.458273
+L 757.308623 326.96866
+L 758.029331 288.133027
+L 758.750039 275.701278
+L 759.470747 269.096212
+L 760.191455 264.91513
+L 760.912163 262.157523
+L 761.632871 260.400705
+L 762.353579 259.438171
+L 763.074287 259.16834
+L 763.794995 259.553846
+L 764.515703 260.608765
+L 765.236411 262.403278
+L 765.957119 265.089435
+L 766.677827 268.971682
+L 767.398535 274.713743
+L 768.119243 284.156763
+L 768.839951 307.67111
+L 769.560659 297.097936
+L 770.281367 281.385936
+L 771.002075 273.841465
+L 771.722783 269.194478
+L 772.443491 266.144181
+L 773.164199 264.174639
+L 773.884907 263.039751
+L 774.605615 262.616793
+L 775.326323 262.854104
+L 776.047031 263.752922
+L 776.767739 265.36778
+L 777.488447 267.825772
+L 778.209155 271.381379
+L 778.929863 276.570908
+L 779.650571 284.764687
+L 780.371279 301.744398
+L 781.091987 309.232119
+L 781.812695 287.793564
+L 782.533403 279.062653
+L 783.254111 273.883287
+L 783.974819 270.517957
+L 784.695527 268.329686
+L 785.416235 267.024284
+L 786.136943 266.454759
+L 786.857651 266.554062
+L 787.578359 267.31063
+L 788.299067 268.764536
+L 789.019775 271.021213
+L 789.740483 274.294143
+L 790.461191 279.021875
+L 791.181899 286.253628
+L 791.902607 299.660555
+L 792.623315 330.988181
+L 793.344023 295.263799
+L 794.064731 284.97286
+L 794.785439 279.177436
+L 795.506147 275.473681
+L 796.226855 273.064017
+L 796.947563 271.594984
+L 797.668271 270.891342
+L 798.388979 270.869199
+L 799.109687 271.503989
+L 799.830396 272.822195
+L 800.551104 274.910202
+L 801.271812 277.947381
+L 801.99252 282.295826
+L 802.713228 288.777062
+L 803.433936 299.902354
+L 804.154644 340.110285
+L 804.875352 304.391459
+L 805.59606 291.932412
+L 806.316768 285.416495
+L 807.037476 281.354948
+L 807.758184 278.731606
+L 808.478892 277.118828
+L 809.1996 276.30807
+L 809.920308 276.196757
+L 810.641016 276.746916
+L 811.361724 277.972094
+L 812.082432 279.941752
+L 812.80314 282.806586
+L 813.523848 286.867952
+L 814.244556 292.780893
+L 814.965264 302.35151
+L 815.685972 325.518926
+L 816.40668 316.37844
+L 817.127388 300.645681
+L 817.848096 293.287894
+L 818.568804 288.872766
+L 819.289512 286.077518
+L 820.01022 284.380245
+L 820.730928 283.532852
+L 821.451636 283.41201
+L 822.172344 283.966019
+L 822.893052 285.196292
+L 823.61376 287.157502
+L 824.334468 289.976483
+L 825.055176 293.906232
+L 825.775884 299.477639
+L 826.496592 308.038963
+L 827.2173 325.195357
+L 827.938008 334.326455
+L 828.658716 312.887745
+L 829.379424 304.614919
+L 830.100132 299.976247
+L 830.82084 297.204067
+L 831.541548 295.656667
+L 832.262256 295.041155
+L 832.982964 295.214352
+L 833.703672 296.114655
+L 834.42438 297.737409
+L 835.145088 300.131136
+L 835.865796 303.411421
+L 836.586504 307.803593
+L 837.307212 313.758761
+L 838.02792 322.332631
+L 838.748628 337.134013
+L 839.469336 372.605455
+L 840.190044 337.125962
+L 840.910752 329.12471
+L 841.63146 326.177601
+L 842.352168 326.047768
+L 843.072876 328.337935
+L 843.793584 333.615627
+L 844.514292 344.655972
+L 844.514292 344.655972
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
</g>
<g id="patch_8">
- <path d="M 477.38 387.16
-L 477.38 39.24
+ <path d="M 476.2325 388.6
+L 476.2325 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_9">
- <path d="M 845.28 387.16
-L 845.28 39.24
+ <path d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_10">
- <path d="M 477.38 387.16
-L 845.28 387.16
+ <path d="M 476.2325 388.6
+L 845.235 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_11">
- <path d="M 477.38 39.24
-L 845.28 39.24
+ <path d="M 476.2325 36.72
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
@@ -2184,11 +2184,11 @@ z
</g>
</g>
<defs>
- <clipPath id="p8943548382">
- <rect height="347.92" width="367.9" x="47.72" y="39.24"/>
+ <clipPath id="p88c468b5a2">
+ <rect height="351.88" width="369.0025" x="47.855" y="36.72"/>
</clipPath>
- <clipPath id="pa6dc066b5b">
- <rect height="347.92" width="367.9" x="477.38" y="39.24"/>
+ <clipPath id="pc90e977743">
+ <rect height="351.88" width="369.0025" x="476.2325" y="36.72"/>
</clipPath>
</defs>
</svg>
diff --git a/docs/docs/img/window_blackman_harris.svg b/docs/docs/img/window_blackman_harris.svg
@@ -19,28 +19,28 @@ z
</g>
<g id="axes_1">
<g id="patch_2">
- <path d="M 47.72 387.16
-L 415.62 387.16
-L 415.62 39.24
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 416.8575 388.6
+L 416.8575 36.72
+L 47.855 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
- <path clip-path="url(#pb03e30ffcd)" d="M 47.72 387.16
-L 47.72 39.24
+ <path clip-path="url(#p2646ca345d)" d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
-" id="m051ce10a63" style="stroke:#000000;stroke-width:0.8;"/>
+" id="mbfa1238104" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m051ce10a63" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mbfa1238104" y="388.6"/>
</g>
</g>
<g id="text_1">
@@ -68,20 +68,20 @@ Q 19.53125 74.21875 31.78125 74.21875
z
" id="DejaVuSans-48"/>
</defs>
- <g transform="translate(44.53875 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(44.67375 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
- <path clip-path="url(#pb03e30ffcd)" d="M 106.116825 387.16
-L 106.116825 39.24
+ <path clip-path="url(#p2646ca345d)" d="M 106.426825 388.6
+L 106.426825 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="106.116825" xlink:href="#m051ce10a63" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="106.426825" xlink:href="#mbfa1238104" y="388.6"/>
</g>
</g>
<g id="text_2">
@@ -101,7 +101,7 @@ L 12.40625 0
z
" id="DejaVuSans-49"/>
</defs>
- <g transform="translate(99.754325 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(100.064325 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -109,13 +109,13 @@ z
</g>
<g id="xtick_3">
<g id="line2d_5">
- <path clip-path="url(#pb03e30ffcd)" d="M 164.513651 387.16
-L 164.513651 39.24
+ <path clip-path="url(#p2646ca345d)" d="M 164.998651 388.6
+L 164.998651 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="164.513651" xlink:href="#m051ce10a63" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="164.998651" xlink:href="#mbfa1238104" y="388.6"/>
</g>
</g>
<g id="text_3">
@@ -146,7 +146,7 @@ Q 31.109375 20.453125 19.1875 8.296875
z
" id="DejaVuSans-50"/>
</defs>
- <g transform="translate(158.151151 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(158.636151 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -154,13 +154,13 @@ z
</g>
<g id="xtick_4">
<g id="line2d_7">
- <path clip-path="url(#pb03e30ffcd)" d="M 222.910476 387.16
-L 222.910476 39.24
+ <path clip-path="url(#p2646ca345d)" d="M 223.570476 388.6
+L 223.570476 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_8">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="222.910476" xlink:href="#m051ce10a63" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="223.570476" xlink:href="#mbfa1238104" y="388.6"/>
</g>
</g>
<g id="text_4">
@@ -199,7 +199,7 @@ Q 46.96875 40.921875 40.578125 39.3125
z
" id="DejaVuSans-51"/>
</defs>
- <g transform="translate(216.547976 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(217.207976 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-51"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -207,13 +207,13 @@ z
</g>
<g id="xtick_5">
<g id="line2d_9">
- <path clip-path="url(#pb03e30ffcd)" d="M 281.307302 387.16
-L 281.307302 39.24
+ <path clip-path="url(#p2646ca345d)" d="M 282.142302 388.6
+L 282.142302 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_10">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="281.307302" xlink:href="#m051ce10a63" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="282.142302" xlink:href="#mbfa1238104" y="388.6"/>
</g>
</g>
<g id="text_5">
@@ -237,7 +237,7 @@ L 4.890625 26.703125
z
" id="DejaVuSans-52"/>
</defs>
- <g transform="translate(274.944802 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(275.779802 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-52"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -245,13 +245,13 @@ z
</g>
<g id="xtick_6">
<g id="line2d_11">
- <path clip-path="url(#pb03e30ffcd)" d="M 339.704127 387.16
-L 339.704127 39.24
+ <path clip-path="url(#p2646ca345d)" d="M 340.714127 388.6
+L 340.714127 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_12">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="339.704127" xlink:href="#m051ce10a63" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="340.714127" xlink:href="#mbfa1238104" y="388.6"/>
</g>
</g>
<g id="text_6">
@@ -282,7 +282,7 @@ Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-53"/>
</defs>
- <g transform="translate(333.341627 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(334.351627 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-53"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -290,13 +290,13 @@ z
</g>
<g id="xtick_7">
<g id="line2d_13">
- <path clip-path="url(#pb03e30ffcd)" d="M 398.100952 387.16
-L 398.100952 39.24
+ <path clip-path="url(#p2646ca345d)" d="M 399.285952 388.6
+L 399.285952 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_14">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="398.100952" xlink:href="#m051ce10a63" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="399.285952" xlink:href="#mbfa1238104" y="388.6"/>
</g>
</g>
<g id="text_7">
@@ -333,7 +333,7 @@ Q 48.484375 72.75 52.59375 71.296875
z
" id="DejaVuSans-54"/>
</defs>
- <g transform="translate(391.738452 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(392.923452 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-54"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -523,7 +523,7 @@ Q 40.578125 54.546875 44.28125 53.078125
z
" id="DejaVuSans-115"/>
</defs>
- <g transform="translate(210.316875 415.436563)scale(0.1 -0.1)">
+ <g transform="translate(211.003125 416.876562)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-83"/>
<use x="63.476562" xlink:href="#DejaVuSans-97"/>
<use x="124.755859" xlink:href="#DejaVuSans-109"/>
@@ -537,22 +537,22 @@ z
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_15">
- <path clip-path="url(#pb03e30ffcd)" d="M 47.72 387.179911
-L 415.62 387.179911
+ <path clip-path="url(#p2646ca345d)" d="M 47.855 321.494722
+L 416.8575 321.494722
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_16">
<defs>
<path d="M 0 0
L -3.5 0
-" id="mddde905191" style="stroke:#000000;stroke-width:0.8;"/>
+" id="m2a6fb6471c" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mddde905191" y="387.179911"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m2a6fb6471c" y="321.494722"/>
</g>
</g>
<g id="text_9">
- <!-- 0.0 -->
+ <!-- 0.2 -->
<defs>
<path d="M 10.6875 12.40625
L 21 12.40625
@@ -561,85 +561,65 @@ L 10.6875 0
z
" id="DejaVuSans-46"/>
</defs>
- <g transform="translate(24.816875 390.97913)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 325.293941)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
- <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-50"/>
</g>
</g>
</g>
<g id="ytick_2">
<g id="line2d_17">
- <path clip-path="url(#pb03e30ffcd)" d="M 47.72 320.809914
-L 415.62 320.809914
+ <path clip-path="url(#p2646ca345d)" d="M 47.855 254.369306
+L 416.8575 254.369306
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_18">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mddde905191" y="320.809914"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m2a6fb6471c" y="254.369306"/>
</g>
</g>
<g id="text_10">
- <!-- 0.2 -->
- <g transform="translate(24.816875 324.609132)scale(0.1 -0.1)">
+ <!-- 0.4 -->
+ <g transform="translate(24.951875 258.168525)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
- <use x="95.410156" xlink:href="#DejaVuSans-50"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-52"/>
</g>
</g>
</g>
<g id="ytick_3">
<g id="line2d_19">
- <path clip-path="url(#pb03e30ffcd)" d="M 47.72 254.439916
-L 415.62 254.439916
+ <path clip-path="url(#p2646ca345d)" d="M 47.855 187.24389
+L 416.8575 187.24389
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_20">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mddde905191" y="254.439916"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m2a6fb6471c" y="187.24389"/>
</g>
</g>
<g id="text_11">
- <!-- 0.4 -->
- <g transform="translate(24.816875 258.239135)scale(0.1 -0.1)">
+ <!-- 0.6 -->
+ <g transform="translate(24.951875 191.043109)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
- <use x="95.410156" xlink:href="#DejaVuSans-52"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-54"/>
</g>
</g>
</g>
<g id="ytick_4">
<g id="line2d_21">
- <path clip-path="url(#pb03e30ffcd)" d="M 47.72 188.069919
-L 415.62 188.069919
+ <path clip-path="url(#p2646ca345d)" d="M 47.855 120.118474
+L 416.8575 120.118474
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_22">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mddde905191" y="188.069919"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m2a6fb6471c" y="120.118474"/>
</g>
</g>
<g id="text_12">
- <!-- 0.6 -->
- <g transform="translate(24.816875 191.869138)scale(0.1 -0.1)">
- <use xlink:href="#DejaVuSans-48"/>
- <use x="63.623047" xlink:href="#DejaVuSans-46"/>
- <use x="95.410156" xlink:href="#DejaVuSans-54"/>
- </g>
- </g>
- </g>
- <g id="ytick_5">
- <g id="line2d_23">
- <path clip-path="url(#pb03e30ffcd)" d="M 47.72 121.699921
-L 415.62 121.699921
-" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
- </g>
- <g id="line2d_24">
- <g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mddde905191" y="121.699921"/>
- </g>
- </g>
- <g id="text_13">
<!-- 0.8 -->
<defs>
<path d="M 31.78125 34.625
@@ -682,34 +662,34 @@ Q 18.3125 60.0625 18.3125 54.390625
z
" id="DejaVuSans-56"/>
</defs>
- <g transform="translate(24.816875 125.49914)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 123.917693)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
</g>
</g>
</g>
- <g id="ytick_6">
- <g id="line2d_25">
- <path clip-path="url(#pb03e30ffcd)" d="M 47.72 55.329924
-L 415.62 55.329924
+ <g id="ytick_5">
+ <g id="line2d_23">
+ <path clip-path="url(#p2646ca345d)" d="M 47.855 52.993058
+L 416.8575 52.993058
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_26">
+ <g id="line2d_24">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mddde905191" y="55.329924"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m2a6fb6471c" y="52.993058"/>
</g>
</g>
- <g id="text_14">
+ <g id="text_13">
<!-- 1.0 -->
- <g transform="translate(24.816875 59.129143)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 56.792277)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
- <g id="text_15">
+ <g id="text_14">
<!-- Amplitude -->
<defs>
<path d="M 34.1875 63.1875
@@ -805,7 +785,7 @@ Q 14.796875 37.203125 14.796875 27.296875
z
" id="DejaVuSans-100"/>
</defs>
- <g transform="translate(18.737188 238.822656)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(18.872187 238.282656)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-65"/>
<use x="68.408203" xlink:href="#DejaVuSans-109"/>
<use x="165.820312" xlink:href="#DejaVuSans-112"/>
@@ -818,71 +798,71 @@ z
</g>
</g>
</g>
- <g id="line2d_27">
- <path clip-path="url(#pb03e30ffcd)" d="M 47.72 387.16
-L 53.559683 387.11218
-L 59.399365 386.95516
-L 65.239048 386.648285
-L 71.07873 386.123933
-L 76.918413 385.287942
-L 82.758095 384.020602
-L 88.597778 382.178542
-L 94.43746 379.597875
-L 100.277143 376.098868
-L 106.116825 371.492371
-L 111.956508 365.588046
-L 117.79619 358.204304
-L 123.635873 349.17963
-L 129.475556 338.384836
-L 135.315238 325.73554
-L 141.154921 311.204123
-L 146.994603 294.830252
-L 152.834286 276.729117
-L 158.673968 257.096542
-L 164.513651 236.210297
-L 170.353333 214.427104
-L 176.193016 192.175131
-L 182.032698 169.942006
-L 187.872381 148.258737
-L 193.712063 127.680193
-L 199.551746 108.763082
-L 205.391429 92.042564
-L 211.231111 78.008795
-L 217.070794 67.084735
-L 222.910476 59.606526
-L 228.750159 55.807619
-L 234.589841 55.807619
-L 240.429524 59.606526
-L 246.269206 67.084735
-L 252.108889 78.008795
-L 257.948571 92.042564
-L 263.788254 108.763082
-L 269.627937 127.680193
-L 275.467619 148.258737
-L 281.307302 169.942006
-L 287.146984 192.175131
-L 292.986667 214.427104
-L 298.826349 236.210297
-L 304.666032 257.096542
-L 310.505714 276.729117
-L 316.345397 294.830252
-L 322.185079 311.204123
-L 328.024762 325.73554
-L 333.864444 338.384836
-L 339.704127 349.17963
-L 345.54381 358.204304
-L 351.383492 365.588046
-L 357.223175 371.492371
-L 363.062857 376.098868
-L 368.90254 379.597875
-L 374.742222 382.178542
-L 380.581905 384.020602
-L 386.421587 385.287942
-L 392.26127 386.123933
-L 398.100952 386.648285
-L 403.940635 386.95516
-L 409.780317 387.11218
-L 415.62 387.16
+ <g id="line2d_25">
+ <path clip-path="url(#p2646ca345d)" d="M 47.855 388.6
+L 53.712183 388.551636
+L 59.569365 388.392829
+L 65.426548 388.08246
+L 71.28373 387.55214
+L 77.140913 386.706635
+L 82.998095 385.424869
+L 88.855278 383.561844
+L 94.71246 380.951803
+L 100.569643 377.412971
+L 106.426825 372.754043
+L 112.284008 366.782516
+L 118.14119 359.314732
+L 123.998373 350.187341
+L 129.855556 339.26968
+L 135.712738 326.476412
+L 141.569921 311.779599
+L 147.427103 295.219362
+L 153.284286 276.912201
+L 159.141468 257.05617
+L 164.998651 235.932198
+L 170.855833 213.901071
+L 176.713016 191.395827
+L 182.570198 168.909647
+L 188.427381 146.97958
+L 194.284563 126.166813
+L 200.141746 107.034389
+L 205.998929 90.123559
+L 211.856111 75.930058
+L 217.713294 64.881662
+L 223.570476 57.318336
+L 229.427659 53.47619
+L 235.284841 53.47619
+L 241.142024 57.318336
+L 246.999206 64.881662
+L 252.856389 75.930058
+L 258.713571 90.123559
+L 264.570754 107.034389
+L 270.427937 126.166813
+L 276.285119 146.97958
+L 282.142302 168.909647
+L 287.999484 191.395827
+L 293.856667 213.901071
+L 299.713849 235.932198
+L 305.571032 257.05617
+L 311.428214 276.912201
+L 317.285397 295.219362
+L 323.142579 311.779599
+L 328.999762 326.476412
+L 334.856944 339.26968
+L 340.714127 350.187341
+L 346.57131 359.314732
+L 352.428492 366.782516
+L 358.285675 372.754043
+L 364.142857 377.412971
+L 370.00004 380.951803
+L 375.857222 383.561844
+L 381.714405 385.424869
+L 387.571587 386.706635
+L 393.42877 387.55214
+L 399.285952 388.08246
+L 405.143135 388.392829
+L 411.000317 388.551636
+L 416.8575 388.6
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
<defs>
<path d="M 0 1.5
@@ -895,120 +875,120 @@ C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0
C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066
C -0.77937 1.341951 -0.397805 1.5 0 1.5
z
-" id="m89e56f0368" style="stroke:#0072bd;"/>
+" id="mf207dd0848" style="stroke:#0072bd;"/>
</defs>
- <g clip-path="url(#pb03e30ffcd)">
- <use style="fill:#0072bd;stroke:#0072bd;" x="47.72" xlink:href="#m89e56f0368" y="387.16"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="53.559683" xlink:href="#m89e56f0368" y="387.11218"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="59.399365" xlink:href="#m89e56f0368" y="386.95516"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="65.239048" xlink:href="#m89e56f0368" y="386.648285"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="71.07873" xlink:href="#m89e56f0368" y="386.123933"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="76.918413" xlink:href="#m89e56f0368" y="385.287942"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="82.758095" xlink:href="#m89e56f0368" y="384.020602"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="88.597778" xlink:href="#m89e56f0368" y="382.178542"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="94.43746" xlink:href="#m89e56f0368" y="379.597875"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="100.277143" xlink:href="#m89e56f0368" y="376.098868"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="106.116825" xlink:href="#m89e56f0368" y="371.492371"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="111.956508" xlink:href="#m89e56f0368" y="365.588046"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="117.79619" xlink:href="#m89e56f0368" y="358.204304"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="123.635873" xlink:href="#m89e56f0368" y="349.17963"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="129.475556" xlink:href="#m89e56f0368" y="338.384836"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="135.315238" xlink:href="#m89e56f0368" y="325.73554"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="141.154921" xlink:href="#m89e56f0368" y="311.204123"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="146.994603" xlink:href="#m89e56f0368" y="294.830252"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="152.834286" xlink:href="#m89e56f0368" y="276.729117"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="158.673968" xlink:href="#m89e56f0368" y="257.096542"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="164.513651" xlink:href="#m89e56f0368" y="236.210297"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="170.353333" xlink:href="#m89e56f0368" y="214.427104"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="176.193016" xlink:href="#m89e56f0368" y="192.175131"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="182.032698" xlink:href="#m89e56f0368" y="169.942006"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="187.872381" xlink:href="#m89e56f0368" y="148.258737"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="193.712063" xlink:href="#m89e56f0368" y="127.680193"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="199.551746" xlink:href="#m89e56f0368" y="108.763082"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="205.391429" xlink:href="#m89e56f0368" y="92.042564"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="211.231111" xlink:href="#m89e56f0368" y="78.008795"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="217.070794" xlink:href="#m89e56f0368" y="67.084735"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="222.910476" xlink:href="#m89e56f0368" y="59.606526"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="228.750159" xlink:href="#m89e56f0368" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="234.589841" xlink:href="#m89e56f0368" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="240.429524" xlink:href="#m89e56f0368" y="59.606526"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="246.269206" xlink:href="#m89e56f0368" y="67.084735"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="252.108889" xlink:href="#m89e56f0368" y="78.008795"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="257.948571" xlink:href="#m89e56f0368" y="92.042564"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="263.788254" xlink:href="#m89e56f0368" y="108.763082"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="269.627937" xlink:href="#m89e56f0368" y="127.680193"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="275.467619" xlink:href="#m89e56f0368" y="148.258737"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="281.307302" xlink:href="#m89e56f0368" y="169.942006"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="287.146984" xlink:href="#m89e56f0368" y="192.175131"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="292.986667" xlink:href="#m89e56f0368" y="214.427104"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="298.826349" xlink:href="#m89e56f0368" y="236.210297"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="304.666032" xlink:href="#m89e56f0368" y="257.096542"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="310.505714" xlink:href="#m89e56f0368" y="276.729117"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="316.345397" xlink:href="#m89e56f0368" y="294.830252"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="322.185079" xlink:href="#m89e56f0368" y="311.204123"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="328.024762" xlink:href="#m89e56f0368" y="325.73554"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="333.864444" xlink:href="#m89e56f0368" y="338.384836"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="339.704127" xlink:href="#m89e56f0368" y="349.17963"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="345.54381" xlink:href="#m89e56f0368" y="358.204304"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="351.383492" xlink:href="#m89e56f0368" y="365.588046"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="357.223175" xlink:href="#m89e56f0368" y="371.492371"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="363.062857" xlink:href="#m89e56f0368" y="376.098868"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="368.90254" xlink:href="#m89e56f0368" y="379.597875"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="374.742222" xlink:href="#m89e56f0368" y="382.178542"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="380.581905" xlink:href="#m89e56f0368" y="384.020602"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="386.421587" xlink:href="#m89e56f0368" y="385.287942"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="392.26127" xlink:href="#m89e56f0368" y="386.123933"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="398.100952" xlink:href="#m89e56f0368" y="386.648285"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="403.940635" xlink:href="#m89e56f0368" y="386.95516"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="409.780317" xlink:href="#m89e56f0368" y="387.11218"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="415.62" xlink:href="#m89e56f0368" y="387.16"/>
+ <g clip-path="url(#p2646ca345d)">
+ <use style="fill:#0072bd;stroke:#0072bd;" x="47.855" xlink:href="#mf207dd0848" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="53.712183" xlink:href="#mf207dd0848" y="388.551636"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="59.569365" xlink:href="#mf207dd0848" y="388.392829"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="65.426548" xlink:href="#mf207dd0848" y="388.08246"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="71.28373" xlink:href="#mf207dd0848" y="387.55214"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="77.140913" xlink:href="#mf207dd0848" y="386.706635"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="82.998095" xlink:href="#mf207dd0848" y="385.424869"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="88.855278" xlink:href="#mf207dd0848" y="383.561844"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="94.71246" xlink:href="#mf207dd0848" y="380.951803"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="100.569643" xlink:href="#mf207dd0848" y="377.412971"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="106.426825" xlink:href="#mf207dd0848" y="372.754043"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="112.284008" xlink:href="#mf207dd0848" y="366.782516"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="118.14119" xlink:href="#mf207dd0848" y="359.314732"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="123.998373" xlink:href="#mf207dd0848" y="350.187341"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="129.855556" xlink:href="#mf207dd0848" y="339.26968"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="135.712738" xlink:href="#mf207dd0848" y="326.476412"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="141.569921" xlink:href="#mf207dd0848" y="311.779599"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="147.427103" xlink:href="#mf207dd0848" y="295.219362"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="153.284286" xlink:href="#mf207dd0848" y="276.912201"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="159.141468" xlink:href="#mf207dd0848" y="257.05617"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="164.998651" xlink:href="#mf207dd0848" y="235.932198"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="170.855833" xlink:href="#mf207dd0848" y="213.901071"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="176.713016" xlink:href="#mf207dd0848" y="191.395827"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="182.570198" xlink:href="#mf207dd0848" y="168.909647"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="188.427381" xlink:href="#mf207dd0848" y="146.97958"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="194.284563" xlink:href="#mf207dd0848" y="126.166813"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="200.141746" xlink:href="#mf207dd0848" y="107.034389"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="205.998929" xlink:href="#mf207dd0848" y="90.123559"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="211.856111" xlink:href="#mf207dd0848" y="75.930058"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="217.713294" xlink:href="#mf207dd0848" y="64.881662"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="223.570476" xlink:href="#mf207dd0848" y="57.318336"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="229.427659" xlink:href="#mf207dd0848" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="235.284841" xlink:href="#mf207dd0848" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="241.142024" xlink:href="#mf207dd0848" y="57.318336"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="246.999206" xlink:href="#mf207dd0848" y="64.881662"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="252.856389" xlink:href="#mf207dd0848" y="75.930058"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="258.713571" xlink:href="#mf207dd0848" y="90.123559"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="264.570754" xlink:href="#mf207dd0848" y="107.034389"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="270.427937" xlink:href="#mf207dd0848" y="126.166813"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="276.285119" xlink:href="#mf207dd0848" y="146.97958"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="282.142302" xlink:href="#mf207dd0848" y="168.909647"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="287.999484" xlink:href="#mf207dd0848" y="191.395827"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="293.856667" xlink:href="#mf207dd0848" y="213.901071"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="299.713849" xlink:href="#mf207dd0848" y="235.932198"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="305.571032" xlink:href="#mf207dd0848" y="257.05617"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="311.428214" xlink:href="#mf207dd0848" y="276.912201"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="317.285397" xlink:href="#mf207dd0848" y="295.219362"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="323.142579" xlink:href="#mf207dd0848" y="311.779599"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="328.999762" xlink:href="#mf207dd0848" y="326.476412"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="334.856944" xlink:href="#mf207dd0848" y="339.26968"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="340.714127" xlink:href="#mf207dd0848" y="350.187341"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="346.57131" xlink:href="#mf207dd0848" y="359.314732"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="352.428492" xlink:href="#mf207dd0848" y="366.782516"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="358.285675" xlink:href="#mf207dd0848" y="372.754043"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="364.142857" xlink:href="#mf207dd0848" y="377.412971"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="370.00004" xlink:href="#mf207dd0848" y="380.951803"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="375.857222" xlink:href="#mf207dd0848" y="383.561844"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="381.714405" xlink:href="#mf207dd0848" y="385.424869"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="387.571587" xlink:href="#mf207dd0848" y="386.706635"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="393.42877" xlink:href="#mf207dd0848" y="387.55214"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="399.285952" xlink:href="#mf207dd0848" y="388.08246"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="405.143135" xlink:href="#mf207dd0848" y="388.392829"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="411.000317" xlink:href="#mf207dd0848" y="388.551636"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="416.8575" xlink:href="#mf207dd0848" y="388.6"/>
</g>
</g>
<g id="patch_3">
- <path d="M 47.72 387.16
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
- <path d="M 415.62 387.16
-L 415.62 39.24
+ <path d="M 416.8575 388.6
+L 416.8575 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
- <path d="M 47.72 387.16
-L 415.62 387.16
+ <path d="M 47.855 388.6
+L 416.8575 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
- <path d="M 47.72 39.24
-L 415.62 39.24
+ <path d="M 47.855 36.72
+L 416.8575 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
<g id="axes_2">
<g id="patch_7">
- <path d="M 477.38 387.16
-L 845.28 387.16
-L 845.28 39.24
-L 477.38 39.24
+ <path d="M 476.2325 388.6
+L 845.235 388.6
+L 845.235 36.72
+L 476.2325 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_3">
<g id="xtick_8">
- <g id="line2d_28">
- <path clip-path="url(#p0caa7f17ed)" d="M 477.38 387.16
-L 477.38 39.24
+ <g id="line2d_26">
+ <path clip-path="url(#pf820e89ecb)" d="M 476.2325 388.6
+L 476.2325 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_29">
+ <g id="line2d_27">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m051ce10a63" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#mbfa1238104" y="388.6"/>
</g>
</g>
- <g id="text_16">
+ <g id="text_15">
<!-- 0.0 -->
- <g transform="translate(469.428437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(468.280937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1016,19 +996,19 @@ L 477.38 39.24
</g>
</g>
<g id="xtick_9">
- <g id="line2d_30">
- <path clip-path="url(#p0caa7f17ed)" d="M 550.96 387.16
-L 550.96 39.24
+ <g id="line2d_28">
+ <path clip-path="url(#pf820e89ecb)" d="M 550.033 388.6
+L 550.033 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_31">
+ <g id="line2d_29">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="550.96" xlink:href="#m051ce10a63" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="550.033" xlink:href="#mbfa1238104" y="388.6"/>
</g>
</g>
- <g id="text_17">
+ <g id="text_16">
<!-- 0.2 -->
- <g transform="translate(543.008437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(542.081437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -1036,19 +1016,19 @@ L 550.96 39.24
</g>
</g>
<g id="xtick_10">
- <g id="line2d_32">
- <path clip-path="url(#p0caa7f17ed)" d="M 624.54 387.16
-L 624.54 39.24
+ <g id="line2d_30">
+ <path clip-path="url(#pf820e89ecb)" d="M 623.8335 388.6
+L 623.8335 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_33">
+ <g id="line2d_31">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="624.54" xlink:href="#m051ce10a63" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.8335" xlink:href="#mbfa1238104" y="388.6"/>
</g>
</g>
- <g id="text_18">
+ <g id="text_17">
<!-- 0.4 -->
- <g transform="translate(616.588437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(615.881937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -1056,19 +1036,19 @@ L 624.54 39.24
</g>
</g>
<g id="xtick_11">
- <g id="line2d_34">
- <path clip-path="url(#p0caa7f17ed)" d="M 698.12 387.16
-L 698.12 39.24
+ <g id="line2d_32">
+ <path clip-path="url(#pf820e89ecb)" d="M 697.634 388.6
+L 697.634 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_35">
+ <g id="line2d_33">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="698.12" xlink:href="#m051ce10a63" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="697.634" xlink:href="#mbfa1238104" y="388.6"/>
</g>
</g>
- <g id="text_19">
+ <g id="text_18">
<!-- 0.6 -->
- <g transform="translate(690.168438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(689.682437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -1076,19 +1056,19 @@ L 698.12 39.24
</g>
</g>
<g id="xtick_12">
- <g id="line2d_36">
- <path clip-path="url(#p0caa7f17ed)" d="M 771.7 387.16
-L 771.7 39.24
+ <g id="line2d_34">
+ <path clip-path="url(#pf820e89ecb)" d="M 771.4345 388.6
+L 771.4345 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_37">
+ <g id="line2d_35">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="771.7" xlink:href="#m051ce10a63" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="771.4345" xlink:href="#mbfa1238104" y="388.6"/>
</g>
</g>
- <g id="text_20">
+ <g id="text_19">
<!-- 0.8 -->
- <g transform="translate(763.748438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(763.482937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -1096,26 +1076,26 @@ L 771.7 39.24
</g>
</g>
<g id="xtick_13">
- <g id="line2d_38">
- <path clip-path="url(#p0caa7f17ed)" d="M 845.28 387.16
-L 845.28 39.24
+ <g id="line2d_36">
+ <path clip-path="url(#pf820e89ecb)" d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_39">
+ <g id="line2d_37">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="845.28" xlink:href="#m051ce10a63" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="845.235" xlink:href="#mbfa1238104" y="388.6"/>
</g>
</g>
- <g id="text_21">
+ <g id="text_20">
<!-- 1.0 -->
- <g transform="translate(837.328438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(837.283437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
- <g id="text_22">
+ <g id="text_21">
<!-- Normalized Frequency ($\times \pi$ rad/sample) -->
<defs>
<path d="M 9.8125 72.90625
@@ -1341,7 +1321,7 @@ Q 14.5 64.65625 8.015625 75.875
z
" id="DejaVuSans-41"/>
</defs>
- <g transform="translate(562.53 415.438125)scale(0.1 -0.1)">
+ <g transform="translate(561.93375 416.878125)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-78"/>
<use transform="translate(74.804688 0.015625)" xlink:href="#DejaVuSans-111"/>
<use transform="translate(135.986328 0.015625)" xlink:href="#DejaVuSans-114"/>
@@ -1382,18 +1362,18 @@ z
</g>
</g>
<g id="matplotlib.axis_4">
- <g id="ytick_7">
- <g id="line2d_40">
- <path clip-path="url(#p0caa7f17ed)" d="M 477.38 360.16109
-L 845.28 360.16109
+ <g id="ytick_6">
+ <g id="line2d_38">
+ <path clip-path="url(#pf820e89ecb)" d="M 476.2325 361.29379
+L 845.235 361.29379
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_41">
+ <g id="line2d_39">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#mddde905191" y="360.16109"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m2a6fb6471c" y="361.29379"/>
</g>
</g>
- <g id="text_23">
+ <g id="text_22">
<!-- −120 -->
<defs>
<path d="M 10.59375 35.5
@@ -1403,7 +1383,7 @@ L 10.59375 27.203125
z
" id="DejaVuSans-8722"/>
</defs>
- <g transform="translate(442.912812 363.960308)scale(0.1 -0.1)">
+ <g transform="translate(441.765312 365.093009)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-49"/>
<use x="147.412109" xlink:href="#DejaVuSans-50"/>
@@ -1411,145 +1391,145 @@ z
</g>
</g>
</g>
+ <g id="ytick_7">
+ <g id="line2d_40">
+ <path clip-path="url(#pf820e89ecb)" d="M 476.2325 319.333817
+L 845.235 319.333817
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_41">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m2a6fb6471c" y="319.333817"/>
+ </g>
+ </g>
+ <g id="text_23">
+ <!-- −100 -->
+ <g transform="translate(441.765312 323.133036)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
<g id="ytick_8">
<g id="line2d_42">
- <path clip-path="url(#p0caa7f17ed)" d="M 477.38 318.673328
-L 845.28 318.673328
+ <path clip-path="url(#pf820e89ecb)" d="M 476.2325 277.373845
+L 845.235 277.373845
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_43">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#mddde905191" y="318.673328"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m2a6fb6471c" y="277.373845"/>
</g>
</g>
<g id="text_24">
- <!-- −100 -->
- <g transform="translate(442.912812 322.472546)scale(0.1 -0.1)">
+ <!-- −80 -->
+ <g transform="translate(448.127812 281.173064)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
- <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-56"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
- <use x="211.035156" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_9">
<g id="line2d_44">
- <path clip-path="url(#p0caa7f17ed)" d="M 477.38 277.185566
-L 845.28 277.185566
+ <path clip-path="url(#pf820e89ecb)" d="M 476.2325 235.413872
+L 845.235 235.413872
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_45">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#mddde905191" y="277.185566"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m2a6fb6471c" y="235.413872"/>
</g>
</g>
<g id="text_25">
- <!-- −80 -->
- <g transform="translate(449.275312 280.984785)scale(0.1 -0.1)">
+ <!-- −60 -->
+ <g transform="translate(448.127812 239.213091)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
- <use x="83.789062" xlink:href="#DejaVuSans-56"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-54"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_10">
<g id="line2d_46">
- <path clip-path="url(#p0caa7f17ed)" d="M 477.38 235.697804
-L 845.28 235.697804
+ <path clip-path="url(#pf820e89ecb)" d="M 476.2325 193.4539
+L 845.235 193.4539
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_47">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#mddde905191" y="235.697804"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m2a6fb6471c" y="193.4539"/>
</g>
</g>
<g id="text_26">
- <!-- −60 -->
- <g transform="translate(449.275312 239.497023)scale(0.1 -0.1)">
+ <!-- −40 -->
+ <g transform="translate(448.127812 197.253119)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
- <use x="83.789062" xlink:href="#DejaVuSans-54"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-52"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_11">
<g id="line2d_48">
- <path clip-path="url(#p0caa7f17ed)" d="M 477.38 194.210042
-L 845.28 194.210042
+ <path clip-path="url(#pf820e89ecb)" d="M 476.2325 151.493927
+L 845.235 151.493927
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_49">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#mddde905191" y="194.210042"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m2a6fb6471c" y="151.493927"/>
</g>
</g>
<g id="text_27">
- <!-- −40 -->
- <g transform="translate(449.275312 198.009261)scale(0.1 -0.1)">
+ <!-- −20 -->
+ <g transform="translate(448.127812 155.293146)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
- <use x="83.789062" xlink:href="#DejaVuSans-52"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_12">
<g id="line2d_50">
- <path clip-path="url(#p0caa7f17ed)" d="M 477.38 152.72228
-L 845.28 152.72228
+ <path clip-path="url(#pf820e89ecb)" d="M 476.2325 109.533955
+L 845.235 109.533955
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_51">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#mddde905191" y="152.72228"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m2a6fb6471c" y="109.533955"/>
</g>
</g>
<g id="text_28">
- <!-- −20 -->
- <g transform="translate(449.275312 156.521499)scale(0.1 -0.1)">
- <use xlink:href="#DejaVuSans-8722"/>
- <use x="83.789062" xlink:href="#DejaVuSans-50"/>
- <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <!-- 0 -->
+ <g transform="translate(462.87 113.333173)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_13">
<g id="line2d_52">
- <path clip-path="url(#p0caa7f17ed)" d="M 477.38 111.234518
-L 845.28 111.234518
+ <path clip-path="url(#pf820e89ecb)" d="M 476.2325 67.573982
+L 845.235 67.573982
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_53">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#mddde905191" y="111.234518"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m2a6fb6471c" y="67.573982"/>
</g>
</g>
<g id="text_29">
- <!-- 0 -->
- <g transform="translate(464.0175 115.033737)scale(0.1 -0.1)">
- <use xlink:href="#DejaVuSans-48"/>
- </g>
- </g>
- </g>
- <g id="ytick_14">
- <g id="line2d_54">
- <path clip-path="url(#p0caa7f17ed)" d="M 477.38 69.746756
-L 845.28 69.746756
-" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
- </g>
- <g id="line2d_55">
- <g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#mddde905191" y="69.746756"/>
- </g>
- </g>
- <g id="text_30">
<!-- 20 -->
- <g transform="translate(457.655 73.545975)scale(0.1 -0.1)">
+ <g transform="translate(456.5075 71.373201)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
- <g id="text_31">
+ <g id="text_30">
<!-- Gain (dB) -->
<defs>
<path d="M 59.515625 10.40625
@@ -1607,7 +1587,7 @@ L 9.8125 0
z
" id="DejaVuSans-66"/>
</defs>
- <g transform="translate(436.833125 236.791406)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(435.685625 236.251406)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-71"/>
<use x="77.490234" xlink:href="#DejaVuSans-97"/>
<use x="138.769531" xlink:href="#DejaVuSans-105"/>
@@ -1620,504 +1600,504 @@ z
</g>
</g>
</g>
- <g id="line2d_56">
- <path clip-path="url(#p0caa7f17ed)" d="M 477.38 55.054545
-L 478.817109 55.157878
-L 480.254219 55.468174
-L 481.691328 55.986327
-L 483.128437 56.713845
-L 484.565547 57.652867
-L 486.002656 58.8062
-L 487.439766 60.177361
-L 488.876875 61.770634
-L 491.032539 64.588457
-L 493.188203 67.939095
-L 495.343867 71.849501
-L 497.499531 76.353521
-L 499.655195 81.493672
-L 501.810859 87.323674
-L 503.966523 93.912163
-L 506.122187 101.348317
-L 508.277852 109.750705
-L 510.433516 119.281974
-L 512.58918 130.174848
-L 514.026289 138.359995
-L 515.463398 147.456231
-L 516.900508 157.687123
-L 518.337617 169.401326
-L 519.774727 183.198916
-L 521.211836 200.289317
-L 521.930391 210.897604
-L 522.648945 223.979366
-L 523.3675 242.129071
-L 524.086055 284.54618
-L 524.804609 266.862947
-L 525.523164 266.53774
-L 526.241719 288.237012
-L 527.678828 257.5454
-L 528.397383 250.594073
-L 529.115937 247.244066
-L 529.834492 246.098669
-L 530.553047 246.622422
-L 531.271602 248.623329
-L 531.990156 252.130309
-L 532.708711 257.421441
-L 533.427266 265.261483
-L 534.14582 278.011272
-L 534.864375 313.874696
-L 535.58293 290.499087
-L 536.301484 280.363792
-L 537.020039 278.182303
-L 537.738594 280.790899
-L 538.457148 289.987393
-L 539.175703 354.587618
-L 539.894258 287.727779
-L 540.612813 274.517011
-L 541.331367 267.264241
-L 542.049922 262.761762
-L 542.768477 260.033589
-L 543.487031 258.689254
-L 544.205586 258.593418
-L 544.924141 259.789174
-L 545.642695 262.537404
-L 546.36125 267.542814
-L 547.079805 276.967989
-L 547.798359 305.904867
-L 548.516914 284.196801
-L 549.235469 268.890492
-L 549.954023 260.884583
-L 550.672578 255.718367
-L 551.391133 252.186793
-L 552.109687 249.794059
-L 552.828242 248.298813
-L 553.546797 247.57994
-L 554.265352 247.588165
-L 554.983906 248.330266
-L 555.702461 249.872607
-L 556.421016 252.366876
-L 557.13957 256.12184
-L 557.858125 261.813981
-L 558.57668 271.315845
-L 559.295234 294.965391
-L 560.013789 284.976611
-L 560.732344 268.280617
-L 561.450898 260.25417
-L 562.169453 255.276506
-L 562.888008 251.975771
-L 563.606562 249.809078
-L 564.325117 248.51697
-L 565.043672 247.968978
-L 565.762227 248.108401
-L 566.480781 248.932779
-L 567.199336 250.493349
-L 567.917891 252.913067
-L 568.636445 256.438452
-L 569.355 261.583471
-L 570.073555 269.626917
-L 571.510664 301.007473
-L 572.229219 274.971197
-L 572.947773 265.313297
-L 573.666328 259.665666
-L 574.384883 255.997428
-L 575.103437 253.589034
-L 575.821992 252.112071
-L 576.540547 251.401568
-L 577.259102 251.378864
-L 577.977656 252.022904
-L 578.696211 253.363466
-L 579.414766 255.491085
-L 580.13332 258.591485
-L 580.851875 263.037978
-L 581.57043 269.67509
-L 582.288984 281.07256
-L 583.007539 321.360816
-L 583.726094 285.918746
-L 584.444648 272.805406
-L 585.163203 265.915389
-L 585.881758 261.575167
-L 586.600312 258.719829
-L 587.318867 256.901054
-L 588.037422 255.898953
-L 588.755977 255.60325
-L 589.474531 255.969426
-L 590.193086 257.003847
-L 590.911641 258.765864
-L 591.630195 261.388442
-L 592.34875 265.134906
-L 593.067305 270.557473
-L 593.785859 279.061211
-L 594.504414 296.518362
-L 595.222969 305.107724
-L 595.941523 282.559452
-L 596.660078 273.466498
-L 597.378633 268.07885
-L 598.097188 264.571033
-L 598.815742 262.275131
-L 599.534297 260.881695
-L 600.252852 260.234129
-L 600.971406 260.257683
-L 601.689961 260.932779
-L 602.408516 262.288803
-L 603.12707 264.41366
-L 603.845625 267.486455
-L 604.56418 271.864277
-L 605.282734 278.344155
-L 606.001289 289.28214
-L 606.719844 322.88487
-L 607.438398 296.494358
-L 608.156953 282.629228
-L 608.875508 275.500558
-L 609.594062 271.028812
-L 610.312617 268.07751
-L 611.031172 266.174874
-L 611.749727 265.090132
-L 612.468281 264.706109
-L 613.186836 264.972212
-L 613.905391 265.88762
-L 614.623945 267.501072
-L 615.3425 269.927093
-L 616.061055 273.391732
-L 616.779609 278.356148
-L 617.498164 285.924049
-L 618.216719 299.986388
-L 618.935273 330.561053
-L 619.653828 294.901614
-L 620.372383 284.288616
-L 621.090937 278.257326
-L 621.809492 274.358765
-L 622.528047 271.77397
-L 623.246602 270.137102
-L 623.965156 269.263905
-L 624.683711 269.062144
-L 625.402266 269.497544
-L 626.12082 270.582918
-L 626.839375 272.382176
-L 627.55793 275.032186
-L 628.276484 278.800879
-L 628.995039 284.248957
-L 629.713594 292.80778
-L 630.432148 310.544047
-L 631.150703 317.86469
-L 631.869258 295.810859
-L 632.587813 286.755501
-L 633.306367 281.344234
-L 634.024922 277.786531
-L 634.743477 275.422741
-L 635.462031 273.945476
-L 636.180586 273.197669
-L 636.899141 273.1023
-L 637.617695 273.63544
-L 638.33625 274.818864
-L 639.054805 276.726834
-L 639.773359 279.511982
-L 640.491914 283.472883
-L 641.210469 289.246741
-L 641.929023 298.539919
-L 642.647578 319.830145
-L 643.366133 315.938347
-L 644.084687 297.84354
-L 644.803242 289.543821
-L 645.521797 284.45071
-L 646.240352 281.066312
-L 646.958906 278.810248
-L 647.677461 277.405859
-L 648.396016 276.710866
-L 649.11457 276.656706
-L 649.833125 277.225273
-L 650.55168 278.443416
-L 651.270234 280.391255
-L 651.988789 283.230388
-L 652.707344 287.277047
-L 653.425898 293.213732
-L 654.144453 302.919195
-L 654.863008 326.758392
-L 655.581563 316.822204
-L 656.300117 300.224726
-L 657.018672 292.250023
-L 657.737227 287.287031
-L 658.455781 283.964725
-L 659.174336 281.739154
-L 659.892891 280.348246
-L 660.611445 279.656923
-L 661.33 279.600852
-L 662.048555 280.164933
-L 662.767109 281.378731
-L 663.485664 283.325602
-L 664.204219 286.172209
-L 664.922773 290.244916
-L 665.641328 296.252677
-L 666.359883 306.178328
-L 667.078438 331.710191
-L 667.796992 318.236309
-L 668.515547 302.327409
-L 669.234102 294.4993
-L 669.952656 289.585661
-L 670.671211 286.278587
-L 671.389766 284.052887
-L 672.10832 282.654274
-L 672.826875 281.951744
-L 673.54543 281.883634
-L 674.263984 282.437101
-L 674.982539 283.644213
-L 675.701094 285.591886
-L 676.419648 288.452989
-L 677.138203 292.567039
-L 677.856758 298.67845
-L 678.575312 308.914458
-L 679.293867 337.095486
-L 680.012422 318.723305
-L 680.730977 303.618283
-L 681.449531 295.983078
-L 682.168086 291.147409
-L 682.886641 287.878349
-L 683.605195 285.673581
-L 684.32375 284.288577
-L 685.042305 283.597705
-L 685.760859 283.543148
-L 686.479414 284.115725
-L 687.197969 285.352059
-L 687.916523 287.346092
-L 688.635078 290.283571
-L 689.353633 294.532203
-L 690.072188 300.914877
-L 690.790742 311.896452
-L 691.509297 348.362974
-L 692.227852 317.46405
-L 692.946406 303.777701
-L 693.664961 296.543282
-L 694.383516 291.899281
-L 695.10207 288.746756
-L 695.820625 286.625566
-L 696.53918 285.309431
-L 697.257734 284.682813
-L 697.976289 284.695111
-L 698.694844 285.344019
-L 699.413398 286.674769
-L 700.131953 288.794746
-L 700.850508 291.914855
-L 701.569062 296.459543
-L 702.287617 303.41766
-L 703.006172 316.051879
-L 703.724727 371.345455
-L 704.443281 314.552967
-L 705.161836 302.816044
-L 705.880391 296.224047
-L 706.598945 291.914842
-L 707.3175 288.980432
-L 708.036055 287.024214
-L 708.754609 285.848275
-L 709.473164 285.353093
-L 710.191719 285.499703
-L 710.910273 286.297051
-L 711.628828 287.804743
-L 712.347383 290.153181
-L 713.065938 293.597833
-L 713.784492 298.668857
-L 714.503047 306.692872
-L 715.221602 322.968364
-L 715.940156 335.488749
-L 716.658711 310.690011
-L 717.377266 301.020831
-L 718.09582 295.232084
-L 718.814375 291.374968
-L 719.53293 288.750143
-L 720.251484 287.036208
-L 720.970039 286.070644
-L 721.688594 285.774864
-L 722.407148 286.125906
-L 723.125703 287.14907
-L 723.844258 288.925974
-L 724.562813 291.624097
-L 725.281367 295.574945
-L 725.999922 301.504472
-L 726.718477 311.467755
-L 727.437031 338.181468
-L 728.874141 306.576469
-L 729.592695 298.773333
-L 730.31125 293.836266
-L 731.029805 290.497947
-L 731.748359 288.246744
-L 732.466914 286.835752
-L 733.185469 286.140123
-L 733.904023 286.105261
-L 734.622578 286.728186
-L 735.341133 288.056557
-L 736.059688 290.20462
-L 736.778242 293.399051
-L 737.496797 298.103378
-L 738.215352 305.429455
-L 738.933906 319.315408
-L 739.652461 348.649512
-L 740.371016 313.452273
-L 741.08957 302.647849
-L 741.808125 296.398839
-L 742.52668 292.281293
-L 743.245234 289.482915
-L 743.963789 287.641468
-L 744.682344 286.575901
-L 745.400898 286.197822
-L 746.119453 286.47834
-L 746.838008 287.438601
-L 747.556563 289.156605
-L 748.275117 291.79556
-L 748.993672 295.679728
-L 749.712227 301.5173
-L 750.430781 311.293507
-L 751.149336 336.742479
-L 751.867891 323.026207
-L 752.586445 307.027024
-L 753.305 299.108137
-L 754.023555 294.117438
-L 754.742109 290.750439
-L 755.460664 288.484719
-L 756.179219 287.069422
-L 756.897773 286.378378
-L 757.616328 286.357129
-L 758.334883 287.004123
-L 759.053437 288.370183
-L 759.771992 290.575888
-L 760.490547 293.861305
-L 761.209102 298.722838
-L 761.927656 306.378856
-L 762.646211 321.413421
-L 763.364766 340.863024
-L 764.08332 312.206851
-L 764.801875 302.026513
-L 765.52043 296.028346
-L 766.238984 292.057789
-L 766.957539 289.365634
-L 767.676094 287.612886
-L 768.394648 286.62992
-L 769.113203 286.335714
-L 769.831758 286.707836
-L 770.550313 287.775053
-L 771.268867 289.62684
-L 771.987422 292.447255
-L 772.705977 296.606009
-L 773.424531 302.937238
-L 774.143086 313.963002
-L 774.861641 352.262229
-L 775.580195 318.775265
-L 776.29875 305.24386
-L 777.017305 298.042477
-L 777.735859 293.416549
-L 778.454414 290.287224
-L 779.172969 288.202375
-L 779.891523 286.941302
-L 780.610078 286.394353
-L 781.328633 286.51879
-L 782.047188 287.324263
-L 782.765742 288.875942
-L 783.484297 291.317747
-L 784.202852 294.936179
-L 784.921406 300.34266
-L 785.639961 309.153576
-L 786.358516 328.994977
-L 787.07707 328.208437
-L 787.795625 308.898074
-L 788.51418 300.197657
-L 789.232734 294.8421
-L 789.951289 291.255346
-L 790.669844 288.837216
-L 791.388398 287.305816
-L 792.106953 286.51973
-L 792.825508 286.415604
-L 793.544063 286.985574
-L 794.262617 288.27468
-L 794.981172 290.396277
-L 795.699727 293.578186
-L 796.418281 298.289248
-L 797.136836 305.660781
-L 797.855391 319.748069
-L 798.573945 346.827996
-L 799.2925 313.218636
-L 800.011055 302.54584
-L 800.729609 296.354766
-L 801.448164 292.278955
-L 802.166719 289.519708
-L 802.885273 287.720341
-L 803.603828 286.703333
-L 804.322383 286.383626
-L 805.040938 286.736549
-L 805.759492 287.789604
-L 806.478047 289.631638
-L 807.196602 292.446673
-L 807.915156 296.605329
-L 808.633711 302.945277
-L 809.352266 314.005763
-L 810.07082 352.910442
-L 810.789375 318.634111
-L 811.50793 305.161363
-L 812.226484 297.981643
-L 812.945039 293.370655
-L 813.663594 290.255112
-L 814.382148 288.184892
-L 815.100703 286.94046
-L 815.819258 286.413196
-L 816.537813 286.561632
-L 817.256367 287.397282
-L 817.974922 288.988435
-L 818.693477 291.48484
-L 819.412031 295.185482
-L 820.130586 300.734483
-L 820.849141 309.870483
-L 821.567695 331.411963
-L 822.28625 326.104812
-L 823.004805 308.156292
-L 823.723359 299.759545
-L 824.441914 294.547661
-L 825.160469 291.05194
-L 825.879023 288.70248
-L 826.597578 287.229675
-L 827.316133 286.498594
-L 828.034688 286.450358
-L 828.753242 287.081296
-L 829.471797 288.441734
-L 830.190352 290.65348
-L 830.908906 293.960809
-L 831.627461 298.871913
-L 832.346016 306.645623
-L 833.783125 338.692643
-L 834.50168 311.711596
-L 835.220234 301.739905
-L 835.938789 295.833357
-L 836.657344 291.922558
-L 837.375898 289.279242
-L 838.094453 287.572582
-L 838.813008 286.637435
-L 839.531563 286.396265
-L 840.250117 286.830408
-L 840.968672 287.973884
-L 841.687227 289.924882
-L 842.405781 292.884229
-L 843.124336 297.259812
-L 843.842891 303.997335
-L 844.561445 316.148971
-L 844.561445 316.148971
+ <g id="line2d_54">
+ <path clip-path="url(#pf820e89ecb)" d="M 476.2325 52.714545
+L 477.673916 52.819054
+L 479.115332 53.132882
+L 480.556748 53.656933
+L 481.998164 54.392731
+L 483.43958 55.342441
+L 484.880996 56.508901
+L 486.322412 57.895669
+L 487.763828 59.507076
+L 489.925952 62.356972
+L 492.088076 65.745746
+L 494.2502 69.70066
+L 496.412324 74.255945
+L 498.574448 79.454601
+L 500.736572 85.350958
+L 502.898696 92.014437
+L 505.06082 99.535229
+L 507.222944 108.033252
+L 509.385068 117.673005
+L 511.547192 128.689861
+L 512.988608 136.968172
+L 514.430024 146.16794
+L 515.87144 156.515279
+L 517.312856 168.362813
+L 518.754272 182.317446
+L 520.195688 199.602368
+L 520.916396 210.331398
+L 521.637104 223.562056
+L 522.357812 241.918339
+L 523.078521 284.818237
+L 523.799229 266.933735
+L 524.519937 266.604827
+L 525.240645 288.551077
+L 526.682061 257.510136
+L 527.402769 250.479689
+L 528.123477 247.091553
+L 528.844185 245.93312
+L 529.564893 246.462834
+L 530.285601 248.486514
+L 531.006309 252.033411
+L 531.727017 257.384766
+L 532.447725 265.314043
+L 533.168433 278.208949
+L 533.889141 314.480568
+L 534.609849 290.8389
+L 535.330557 280.588246
+L 536.051265 278.381927
+L 536.771973 281.020214
+L 537.492681 290.321382
+L 538.213389 355.656881
+L 538.934097 288.036049
+L 539.654805 274.674917
+L 540.375513 267.339596
+L 541.096221 262.785871
+L 541.816929 260.026645
+L 542.537637 258.667009
+L 543.258345 258.570082
+L 543.979053 259.779449
+L 544.699761 262.558959
+L 545.420469 267.62134
+L 546.141177 277.153792
+L 546.861885 306.420027
+L 547.582593 284.464881
+L 548.303301 268.984357
+L 549.024009 260.887326
+L 549.744717 255.662308
+L 550.465425 252.090538
+L 551.186133 249.67057
+L 551.906841 248.158305
+L 552.627549 247.43125
+L 553.348257 247.439568
+L 554.068965 248.190116
+L 554.789673 249.750012
+L 555.510381 252.27267
+L 556.231089 256.070373
+L 556.951797 261.827302
+L 557.672505 271.437315
+L 558.393213 295.356038
+L 559.113921 285.253567
+L 559.834629 268.36754
+L 560.555337 260.249737
+L 561.276045 255.215418
+L 561.996753 251.877114
+L 562.717461 249.68576
+L 563.438169 248.378945
+L 564.158877 247.824716
+L 564.879585 247.965726
+L 565.600293 248.799487
+L 566.321001 250.377819
+L 567.041709 252.825078
+L 567.762417 256.390589
+L 568.483125 261.594168
+L 569.203833 269.729164
+L 570.645249 301.466891
+L 571.365957 275.134273
+L 572.086665 265.366447
+L 572.807373 259.654535
+L 573.528081 255.944545
+L 574.248789 253.508739
+L 574.969497 252.014966
+L 575.690205 251.296375
+L 576.410913 251.273413
+L 577.131621 251.924783
+L 577.852329 253.280604
+L 578.573037 255.432439
+L 579.293745 258.568127
+L 580.014453 263.06523
+L 580.735161 269.777885
+L 581.455869 281.305081
+L 582.176577 322.051895
+L 582.897285 286.206426
+L 583.617993 272.94383
+L 584.338701 265.975392
+L 585.059409 261.585769
+L 585.780117 258.697932
+L 586.500825 256.858456
+L 587.221533 255.844949
+L 587.942241 255.545881
+L 588.662949 255.916224
+L 589.383657 256.962419
+L 590.104365 258.744491
+L 590.825073 261.396919
+L 591.545781 265.186025
+L 592.266489 270.670311
+L 592.987197 279.270838
+L 593.707905 296.926685
+L 594.428613 305.613811
+L 595.149321 282.808896
+L 595.870029 273.612447
+L 596.590737 268.163477
+L 597.311445 264.615734
+L 598.032153 262.293701
+L 598.752861 260.884405
+L 599.473569 260.229468
+L 600.194277 260.25329
+L 600.914985 260.93607
+L 601.635693 262.307528
+L 602.356401 264.45657
+L 603.077109 267.564339
+L 603.797817 271.99199
+L 604.518525 278.545621
+L 605.239233 289.608101
+L 605.959941 323.593296
+L 606.680649 296.902408
+L 607.401357 282.879467
+L 608.122065 275.669658
+L 608.842773 271.147015
+L 609.563481 268.162122
+L 610.284189 266.23783
+L 611.004897 265.140741
+L 611.725605 264.752347
+L 612.446313 265.021479
+L 613.167021 265.947307
+L 613.887729 267.579123
+L 614.608437 270.032757
+L 615.329146 273.53683
+L 616.049854 278.557751
+L 616.770562 286.211789
+L 617.49127 300.434185
+L 618.211978 331.356848
+L 618.932686 295.291536
+L 619.653394 284.557742
+L 620.374102 278.457804
+L 621.09481 274.51487
+L 621.815518 271.900655
+L 622.536226 270.245156
+L 623.256934 269.362021
+L 623.977642 269.157962
+L 624.69835 269.598319
+L 625.419058 270.696046
+L 626.139766 272.515783
+L 626.860474 275.195956
+L 627.581182 279.007544
+L 628.30189 284.517631
+L 629.022598 293.17387
+L 629.743306 311.112009
+L 630.464014 318.515976
+L 631.184722 296.21113
+L 631.90543 287.052705
+L 632.626138 281.579847
+L 633.346846 277.98165
+L 634.067554 275.590956
+L 634.788262 274.096876
+L 635.50897 273.340558
+L 636.229678 273.244104
+L 636.950386 273.783311
+L 637.671094 274.980205
+L 638.391802 276.909892
+L 639.11251 279.726741
+L 639.833218 283.732724
+L 640.553926 289.5723
+L 641.274634 298.971252
+L 641.995342 320.503802
+L 642.71605 316.567707
+L 643.436758 298.266947
+L 644.157466 289.87276
+L 644.878174 284.721681
+L 645.598882 281.298761
+L 646.31959 279.017019
+L 647.040298 277.596646
+L 647.761006 276.893742
+L 648.481714 276.838966
+L 649.202422 277.414004
+L 649.92313 278.646012
+L 650.643838 280.616021
+L 651.364546 283.487469
+L 652.085254 287.580187
+L 652.805962 293.584443
+L 653.52667 303.400372
+L 654.247378 327.510905
+L 654.968086 317.461624
+L 655.688794 300.675235
+L 656.409502 292.609765
+L 657.13021 287.590284
+L 657.850918 284.230164
+L 658.571626 281.979261
+L 659.292334 280.572523
+L 660.013042 279.873331
+L 660.73375 279.816622
+L 661.454458 280.387123
+L 662.175166 281.614736
+L 662.895874 283.583766
+L 663.616582 286.462773
+L 664.33729 290.581836
+L 665.057998 296.657977
+L 665.778706 306.6966
+L 666.499414 332.519066
+L 667.220122 318.891824
+L 667.94083 302.80185
+L 668.661538 294.884643
+L 669.382246 289.915077
+L 670.102954 286.570362
+L 670.823662 284.319329
+L 671.54437 282.904797
+L 672.265078 282.194271
+L 672.985786 282.125386
+L 673.706494 282.685153
+L 674.427202 283.906004
+L 675.14791 285.875845
+L 675.868618 288.769513
+L 676.589326 292.930389
+L 677.310034 299.11136
+L 678.030742 309.463873
+L 678.75145 337.965655
+L 679.472158 319.384363
+L 680.192866 304.107417
+L 680.913574 296.385309
+L 681.634282 291.494601
+L 682.35499 288.188332
+L 683.075698 285.95847
+L 683.796406 284.557702
+L 684.517114 283.858967
+L 685.237822 283.803789
+L 685.95853 284.382882
+L 686.679238 285.633289
+L 687.399946 287.650018
+L 688.120654 290.620931
+L 688.841362 294.91792
+L 689.56207 301.373242
+L 690.282778 312.479807
+L 691.003486 349.361389
+L 691.724194 318.110775
+L 692.444902 304.26865
+L 693.16561 296.951889
+L 693.886318 292.25503
+L 694.607026 289.066624
+L 695.327734 286.92129
+L 696.048442 285.590175
+L 696.76915 284.956425
+L 697.489858 284.968864
+L 698.210566 285.625157
+L 698.931274 286.971053
+L 699.651982 289.115159
+L 700.37269 292.270781
+L 701.093398 296.867198
+L 701.814106 303.904511
+L 702.534814 316.682531
+L 703.255522 372.605455
+L 703.97623 315.166559
+L 704.696938 303.296048
+L 705.417646 296.629021
+L 706.138354 292.270769
+L 706.859062 289.30296
+L 707.579771 287.324476
+L 708.300479 286.135152
+L 709.021187 285.634335
+L 709.741895 285.782613
+L 710.462603 286.589036
+L 711.183311 288.113889
+L 711.904019 290.489057
+L 712.624727 293.972916
+L 713.345435 299.101658
+L 714.066143 307.217001
+L 714.786851 323.677739
+L 715.507559 336.340631
+L 716.228267 311.259635
+L 716.948975 301.480401
+L 717.669683 295.625767
+L 718.390391 291.72475
+L 719.111099 289.070049
+L 719.831807 287.336606
+L 720.552515 286.360052
+L 721.273223 286.060906
+L 721.993931 286.415943
+L 722.714639 287.450753
+L 723.435347 289.247881
+L 724.156055 291.976715
+L 724.876763 295.972531
+L 725.597471 301.969547
+L 726.318179 312.046231
+L 727.038887 339.063998
+L 728.480303 307.099274
+L 729.201011 299.207322
+L 729.921719 294.214062
+L 730.642427 290.837747
+L 731.363135 288.560921
+L 732.083843 287.133869
+L 732.804551 286.430322
+L 733.525259 286.395063
+L 734.245967 287.025079
+L 734.966675 288.368569
+L 735.687383 290.541081
+L 736.408091 293.771871
+L 737.128799 298.529742
+L 737.849507 305.939204
+L 738.570215 319.983206
+L 739.290923 349.651188
+L 740.011631 314.053337
+L 740.732339 303.125938
+L 741.453047 296.805802
+L 742.173755 292.64139
+L 742.894463 289.811162
+L 743.615171 287.948755
+L 744.335879 286.87106
+L 745.056587 286.488677
+L 745.777295 286.772389
+L 746.498003 287.743579
+L 747.218711 289.481138
+L 747.939419 292.150129
+L 748.660127 296.078506
+L 749.380835 301.982522
+L 750.101543 311.87
+L 750.822251 337.608631
+L 751.542959 323.736241
+L 752.263667 307.554956
+L 752.984375 299.545937
+L 753.705083 294.498434
+L 754.425791 291.093113
+L 755.146499 288.801604
+L 755.867207 287.370198
+L 756.587915 286.671289
+L 757.308623 286.649799
+L 758.029331 287.304156
+L 758.750039 288.685764
+L 759.470747 290.916575
+L 760.191455 294.239386
+L 760.912163 299.156253
+L 761.632871 306.899411
+L 762.353579 322.105099
+L 763.074287 341.776075
+L 763.794995 312.79374
+L 764.515703 302.497529
+L 765.236411 296.431092
+L 765.957119 292.415343
+L 766.677827 289.692546
+L 767.398535 287.919849
+L 768.119243 286.925694
+L 768.839951 286.62814
+L 769.560659 287.004497
+L 770.281367 288.083861
+L 771.002075 289.956725
+L 771.722783 292.809241
+L 772.443491 297.015331
+L 773.164199 303.41862
+L 773.884907 314.569879
+L 774.605615 353.305025
+L 775.326323 319.436915
+L 776.047031 305.751497
+L 776.767739 298.468147
+L 777.488447 293.789568
+L 778.209155 290.624625
+L 778.929863 288.516046
+L 779.650571 287.24062
+L 780.371279 286.687445
+L 781.091987 286.813299
+L 781.812695 287.62794
+L 782.533403 289.19728
+L 783.254111 291.666878
+L 783.974819 295.326494
+L 784.695527 300.794511
+L 785.416235 309.705712
+L 786.136943 329.772947
+L 786.857651 328.977455
+L 787.578359 309.447303
+L 788.299067 300.647858
+L 789.019775 295.231344
+L 789.740483 291.603766
+L 790.461191 289.158114
+L 791.181899 287.609283
+L 791.902607 286.81425
+L 792.623315 286.708939
+L 793.344023 287.285396
+L 794.064731 288.589175
+L 794.785439 290.73492
+L 795.506147 293.953045
+L 796.226855 298.717728
+L 796.947563 306.173163
+L 797.668271 320.420792
+L 798.388979 347.808941
+L 799.109687 313.817041
+L 799.830396 303.022768
+L 800.551104 296.761228
+L 801.271812 292.639026
+L 801.99252 289.848373
+L 802.713228 288.028526
+L 803.433936 286.999942
+L 804.154644 286.676597
+L 804.875352 287.033537
+L 805.59606 288.098578
+L 806.316768 289.961577
+L 807.037476 292.808653
+L 807.758184 297.014642
+L 808.478892 303.426751
+L 809.1996 314.613126
+L 809.920308 353.960616
+L 810.641016 319.294155
+L 811.361724 305.668061
+L 812.082432 298.406622
+L 812.80314 293.743152
+L 813.523848 290.592147
+L 814.244556 288.498365
+L 814.965264 287.239768
+L 815.685972 286.706504
+L 816.40668 286.856629
+L 817.127388 287.70179
+L 817.848096 289.311054
+L 818.568804 291.835872
+L 819.289512 295.578635
+L 820.01022 301.190794
+L 820.730928 310.43078
+L 821.451636 332.217443
+L 822.172344 326.849886
+L 822.893052 308.697077
+L 823.61376 300.204759
+L 824.334468 294.933554
+L 825.055176 291.398045
+L 825.775884 289.021843
+L 826.496592 287.532275
+L 827.2173 286.792873
+L 827.938008 286.744088
+L 828.658716 287.382208
+L 829.379424 288.758129
+L 830.100132 290.99505
+L 830.82084 294.340022
+L 831.541548 299.307025
+L 832.262256 307.169214
+L 833.703672 339.580991
+L 834.42438 312.292848
+L 835.145088 302.207659
+L 835.865796 296.233884
+L 836.586504 292.278572
+L 837.307212 289.60517
+L 838.02792 287.879085
+L 838.748628 286.933294
+L 839.469336 286.689379
+L 840.190044 287.128464
+L 840.910752 288.284955
+L 841.63146 290.258159
+L 842.352168 293.25119
+L 843.072876 297.676575
+L 843.793584 304.490784
+L 844.514292 316.780728
+L 844.514292 316.780728
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
</g>
<g id="patch_8">
- <path d="M 477.38 387.16
-L 477.38 39.24
+ <path d="M 476.2325 388.6
+L 476.2325 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_9">
- <path d="M 845.28 387.16
-L 845.28 39.24
+ <path d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_10">
- <path d="M 477.38 387.16
-L 845.28 387.16
+ <path d="M 476.2325 388.6
+L 845.235 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_11">
- <path d="M 477.38 39.24
-L 845.28 39.24
+ <path d="M 476.2325 36.72
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
- <g id="text_32">
+ <g id="text_31">
<!-- Blackman-Harris window -->
<defs>
<path d="M 9.078125 75.984375
@@ -2196,11 +2176,11 @@ z
</g>
</g>
<defs>
- <clipPath id="pb03e30ffcd">
- <rect height="347.92" width="367.9" x="47.72" y="39.24"/>
+ <clipPath id="p2646ca345d">
+ <rect height="351.88" width="369.0025" x="47.855" y="36.72"/>
</clipPath>
- <clipPath id="p0caa7f17ed">
- <rect height="347.92" width="367.9" x="477.38" y="39.24"/>
+ <clipPath id="pf820e89ecb">
+ <rect height="351.88" width="369.0025" x="476.2325" y="36.72"/>
</clipPath>
</defs>
</svg>
diff --git a/docs/docs/img/window_bohman.svg b/docs/docs/img/window_bohman.svg
@@ -19,28 +19,28 @@ z
</g>
<g id="axes_1">
<g id="patch_2">
- <path d="M 47.72 387.16
-L 415.575 387.16
-L 415.575 39.24
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 416.8575 388.6
+L 416.8575 36.72
+L 47.855 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
- <path clip-path="url(#p97ec8ec411)" d="M 47.72 387.16
-L 47.72 39.24
+ <path clip-path="url(#p29883769eb)" d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
-" id="me300e42347" style="stroke:#000000;stroke-width:0.8;"/>
+" id="m4d0c9e832b" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#me300e42347" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m4d0c9e832b" y="388.6"/>
</g>
</g>
<g id="text_1">
@@ -68,20 +68,20 @@ Q 19.53125 74.21875 31.78125 74.21875
z
" id="DejaVuSans-48"/>
</defs>
- <g transform="translate(44.53875 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(44.67375 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
- <path clip-path="url(#p97ec8ec411)" d="M 106.109683 387.16
-L 106.109683 39.24
+ <path clip-path="url(#p29883769eb)" d="M 106.426825 388.6
+L 106.426825 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="106.109683" xlink:href="#me300e42347" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="106.426825" xlink:href="#m4d0c9e832b" y="388.6"/>
</g>
</g>
<g id="text_2">
@@ -101,7 +101,7 @@ L 12.40625 0
z
" id="DejaVuSans-49"/>
</defs>
- <g transform="translate(99.747183 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(100.064325 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -109,13 +109,13 @@ z
</g>
<g id="xtick_3">
<g id="line2d_5">
- <path clip-path="url(#p97ec8ec411)" d="M 164.499365 387.16
-L 164.499365 39.24
+ <path clip-path="url(#p29883769eb)" d="M 164.998651 388.6
+L 164.998651 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="164.499365" xlink:href="#me300e42347" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="164.998651" xlink:href="#m4d0c9e832b" y="388.6"/>
</g>
</g>
<g id="text_3">
@@ -146,7 +146,7 @@ Q 31.109375 20.453125 19.1875 8.296875
z
" id="DejaVuSans-50"/>
</defs>
- <g transform="translate(158.136865 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(158.636151 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -154,13 +154,13 @@ z
</g>
<g id="xtick_4">
<g id="line2d_7">
- <path clip-path="url(#p97ec8ec411)" d="M 222.889048 387.16
-L 222.889048 39.24
+ <path clip-path="url(#p29883769eb)" d="M 223.570476 388.6
+L 223.570476 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_8">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="222.889048" xlink:href="#me300e42347" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="223.570476" xlink:href="#m4d0c9e832b" y="388.6"/>
</g>
</g>
<g id="text_4">
@@ -199,7 +199,7 @@ Q 46.96875 40.921875 40.578125 39.3125
z
" id="DejaVuSans-51"/>
</defs>
- <g transform="translate(216.526548 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(217.207976 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-51"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -207,13 +207,13 @@ z
</g>
<g id="xtick_5">
<g id="line2d_9">
- <path clip-path="url(#p97ec8ec411)" d="M 281.27873 387.16
-L 281.27873 39.24
+ <path clip-path="url(#p29883769eb)" d="M 282.142302 388.6
+L 282.142302 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_10">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="281.27873" xlink:href="#me300e42347" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="282.142302" xlink:href="#m4d0c9e832b" y="388.6"/>
</g>
</g>
<g id="text_5">
@@ -237,7 +237,7 @@ L 4.890625 26.703125
z
" id="DejaVuSans-52"/>
</defs>
- <g transform="translate(274.91623 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(275.779802 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-52"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -245,13 +245,13 @@ z
</g>
<g id="xtick_6">
<g id="line2d_11">
- <path clip-path="url(#p97ec8ec411)" d="M 339.668413 387.16
-L 339.668413 39.24
+ <path clip-path="url(#p29883769eb)" d="M 340.714127 388.6
+L 340.714127 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_12">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="339.668413" xlink:href="#me300e42347" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="340.714127" xlink:href="#m4d0c9e832b" y="388.6"/>
</g>
</g>
<g id="text_6">
@@ -282,7 +282,7 @@ Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-53"/>
</defs>
- <g transform="translate(333.305913 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(334.351627 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-53"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -290,13 +290,13 @@ z
</g>
<g id="xtick_7">
<g id="line2d_13">
- <path clip-path="url(#p97ec8ec411)" d="M 398.058095 387.16
-L 398.058095 39.24
+ <path clip-path="url(#p29883769eb)" d="M 399.285952 388.6
+L 399.285952 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_14">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="398.058095" xlink:href="#me300e42347" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="399.285952" xlink:href="#m4d0c9e832b" y="388.6"/>
</g>
</g>
<g id="text_7">
@@ -333,7 +333,7 @@ Q 48.484375 72.75 52.59375 71.296875
z
" id="DejaVuSans-54"/>
</defs>
- <g transform="translate(391.695595 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(392.923452 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-54"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -523,7 +523,7 @@ Q 40.578125 54.546875 44.28125 53.078125
z
" id="DejaVuSans-115"/>
</defs>
- <g transform="translate(210.294375 415.436563)scale(0.1 -0.1)">
+ <g transform="translate(211.003125 416.876562)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-83"/>
<use x="63.476562" xlink:href="#DejaVuSans-97"/>
<use x="124.755859" xlink:href="#DejaVuSans-109"/>
@@ -537,18 +537,18 @@ z
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_15">
- <path clip-path="url(#p97ec8ec411)" d="M 47.72 387.16
-L 415.575 387.16
+ <path clip-path="url(#p29883769eb)" d="M 47.855 388.6
+L 416.8575 388.6
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_16">
<defs>
<path d="M 0 0
L -3.5 0
-" id="m3dd7fb2a9f" style="stroke:#000000;stroke-width:0.8;"/>
+" id="mba8e81eeee" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m3dd7fb2a9f" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mba8e81eeee" y="388.6"/>
</g>
</g>
<g id="text_9">
@@ -561,7 +561,7 @@ L 10.6875 0
z
" id="DejaVuSans-46"/>
</defs>
- <g transform="translate(24.816875 390.959219)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 392.399219)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -570,18 +570,18 @@ z
</g>
<g id="ytick_2">
<g id="line2d_17">
- <path clip-path="url(#p97ec8ec411)" d="M 47.72 320.807916
-L 415.575 320.807916
+ <path clip-path="url(#p29883769eb)" d="M 47.855 321.492701
+L 416.8575 321.492701
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_18">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m3dd7fb2a9f" y="320.807916"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mba8e81eeee" y="321.492701"/>
</g>
</g>
<g id="text_10">
<!-- 0.2 -->
- <g transform="translate(24.816875 324.607134)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 325.29192)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -590,18 +590,18 @@ L 415.575 320.807916
</g>
<g id="ytick_3">
<g id="line2d_19">
- <path clip-path="url(#p97ec8ec411)" d="M 47.72 254.455831
-L 415.575 254.455831
+ <path clip-path="url(#p29883769eb)" d="M 47.855 254.385402
+L 416.8575 254.385402
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_20">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m3dd7fb2a9f" y="254.455831"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mba8e81eeee" y="254.385402"/>
</g>
</g>
<g id="text_11">
<!-- 0.4 -->
- <g transform="translate(24.816875 258.25505)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 258.184621)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -610,18 +610,18 @@ L 415.575 254.455831
</g>
<g id="ytick_4">
<g id="line2d_21">
- <path clip-path="url(#p97ec8ec411)" d="M 47.72 188.103747
-L 415.575 188.103747
+ <path clip-path="url(#p29883769eb)" d="M 47.855 187.278103
+L 416.8575 187.278103
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_22">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m3dd7fb2a9f" y="188.103747"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mba8e81eeee" y="187.278103"/>
</g>
</g>
<g id="text_12">
<!-- 0.6 -->
- <g transform="translate(24.816875 191.902966)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 191.077322)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -630,13 +630,13 @@ L 415.575 188.103747
</g>
<g id="ytick_5">
<g id="line2d_23">
- <path clip-path="url(#p97ec8ec411)" d="M 47.72 121.751663
-L 415.575 121.751663
+ <path clip-path="url(#p29883769eb)" d="M 47.855 120.170805
+L 416.8575 120.170805
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_24">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m3dd7fb2a9f" y="121.751663"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mba8e81eeee" y="120.170805"/>
</g>
</g>
<g id="text_13">
@@ -682,7 +682,7 @@ Q 18.3125 60.0625 18.3125 54.390625
z
" id="DejaVuSans-56"/>
</defs>
- <g transform="translate(24.816875 125.550882)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 123.970023)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -691,18 +691,18 @@ z
</g>
<g id="ytick_6">
<g id="line2d_25">
- <path clip-path="url(#p97ec8ec411)" d="M 47.72 55.399579
-L 415.575 55.399579
+ <path clip-path="url(#p29883769eb)" d="M 47.855 53.063506
+L 416.8575 53.063506
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_26">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m3dd7fb2a9f" y="55.399579"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mba8e81eeee" y="53.063506"/>
</g>
</g>
<g id="text_14">
<!-- 1.0 -->
- <g transform="translate(24.816875 59.198797)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 56.862724)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -805,7 +805,7 @@ Q 14.796875 37.203125 14.796875 27.296875
z
" id="DejaVuSans-100"/>
</defs>
- <g transform="translate(18.737188 238.822656)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(18.872187 238.282656)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-65"/>
<use x="68.408203" xlink:href="#DejaVuSans-109"/>
<use x="165.820312" xlink:href="#DejaVuSans-112"/>
@@ -819,70 +819,70 @@ z
</g>
</g>
<g id="line2d_27">
- <path clip-path="url(#p97ec8ec411)" d="M 47.72 387.16
-L 53.558968 387.125115
-L 59.397937 386.881752
-L 65.236905 386.225579
-L 71.075873 384.9605
-L 76.914841 382.902611
-L 82.75381 379.883987
-L 88.592778 375.756216
-L 94.431746 370.393654
-L 100.270714 363.696328
-L 106.109683 355.59245
-L 111.948651 346.040507
-L 117.787619 335.030888
-L 123.626587 322.58702
-L 129.465556 308.765983
-L 135.304524 293.658611
-L 141.143492 277.38905
-L 146.98246 260.113781
-L 152.821429 242.02012
-L 158.660397 223.324195
-L 164.499365 204.268444
-L 170.338333 185.11864
-L 176.177302 166.160487
-L 182.01627 147.695839
-L 187.855238 130.038568
-L 193.694206 113.51015
-L 199.533175 98.435021
-L 205.372143 85.135758
-L 211.211111 73.928158
-L 217.050079 65.116274
-L 222.889048 58.987478
-L 228.728016 55.807619
-L 234.566984 55.807619
-L 240.405952 58.987478
-L 246.244921 65.116274
-L 252.083889 73.928158
-L 257.922857 85.135758
-L 263.761825 98.435021
-L 269.600794 113.51015
-L 275.439762 130.038568
-L 281.27873 147.695839
-L 287.117698 166.160487
-L 292.956667 185.11864
-L 298.795635 204.268444
-L 304.634603 223.324195
-L 310.473571 242.02012
-L 316.31254 260.113781
-L 322.151508 277.38905
-L 327.990476 293.658611
-L 333.829444 308.765983
-L 339.668413 322.58702
-L 345.507381 335.030888
-L 351.346349 346.040507
-L 357.185317 355.59245
-L 363.024286 363.696328
-L 368.863254 370.393654
-L 374.702222 375.756216
-L 380.54119 379.883987
-L 386.380159 382.902611
-L 392.219127 384.9605
-L 398.058095 386.225579
-L 403.897063 386.881752
-L 409.736032 387.125115
-L 415.575 387.16
+ <path clip-path="url(#p29883769eb)" d="M 47.855 388.6
+L 53.712183 388.564718
+L 59.569365 388.318585
+L 65.426548 387.654944
+L 71.28373 386.375466
+L 77.140913 384.294154
+L 82.998095 381.241172
+L 88.855278 377.066419
+L 94.71246 371.642821
+L 100.569643 364.869266
+L 106.426825 356.67315
+L 112.284008 347.012488
+L 118.14119 335.877559
+L 123.998373 323.292055
+L 129.855556 309.313708
+L 135.712738 294.034385
+L 141.569921 277.579645
+L 147.427103 260.107751
+L 153.284286 241.808148
+L 159.141468 222.899428
+L 164.998651 203.626786
+L 170.855833 184.25902
+L 176.713016 165.085086
+L 182.570198 146.410275
+L 188.427381 128.55203
+L 194.284563 111.835487
+L 200.141746 96.588775
+L 205.998929 83.138141
+L 211.856111 71.802977
+L 217.713294 62.890796
+L 223.570476 56.692242
+L 229.427659 53.47619
+L 235.284841 53.47619
+L 241.142024 56.692242
+L 246.999206 62.890796
+L 252.856389 71.802977
+L 258.713571 83.138141
+L 264.570754 96.588775
+L 270.427937 111.835487
+L 276.285119 128.55203
+L 282.142302 146.410275
+L 287.999484 165.085086
+L 293.856667 184.25902
+L 299.713849 203.626786
+L 305.571032 222.899428
+L 311.428214 241.808148
+L 317.285397 260.107751
+L 323.142579 277.579645
+L 328.999762 294.034385
+L 334.856944 309.313708
+L 340.714127 323.292055
+L 346.57131 335.877559
+L 352.428492 347.012488
+L 358.285675 356.67315
+L 364.142857 364.869266
+L 370.00004 371.642821
+L 375.857222 377.066419
+L 381.714405 381.241172
+L 387.571587 384.294154
+L 393.42877 386.375466
+L 399.285952 387.654944
+L 405.143135 388.318585
+L 411.000317 388.564718
+L 416.8575 388.6
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
<defs>
<path d="M 0 1.5
@@ -895,120 +895,120 @@ C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0
C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066
C -0.77937 1.341951 -0.397805 1.5 0 1.5
z
-" id="m9246c89fba" style="stroke:#0072bd;"/>
+" id="m52d6644334" style="stroke:#0072bd;"/>
</defs>
- <g clip-path="url(#p97ec8ec411)">
- <use style="fill:#0072bd;stroke:#0072bd;" x="47.72" xlink:href="#m9246c89fba" y="387.16"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="53.558968" xlink:href="#m9246c89fba" y="387.125115"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="59.397937" xlink:href="#m9246c89fba" y="386.881752"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="65.236905" xlink:href="#m9246c89fba" y="386.225579"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="71.075873" xlink:href="#m9246c89fba" y="384.9605"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="76.914841" xlink:href="#m9246c89fba" y="382.902611"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="82.75381" xlink:href="#m9246c89fba" y="379.883987"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="88.592778" xlink:href="#m9246c89fba" y="375.756216"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="94.431746" xlink:href="#m9246c89fba" y="370.393654"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="100.270714" xlink:href="#m9246c89fba" y="363.696328"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="106.109683" xlink:href="#m9246c89fba" y="355.59245"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="111.948651" xlink:href="#m9246c89fba" y="346.040507"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="117.787619" xlink:href="#m9246c89fba" y="335.030888"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="123.626587" xlink:href="#m9246c89fba" y="322.58702"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="129.465556" xlink:href="#m9246c89fba" y="308.765983"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="135.304524" xlink:href="#m9246c89fba" y="293.658611"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="141.143492" xlink:href="#m9246c89fba" y="277.38905"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="146.98246" xlink:href="#m9246c89fba" y="260.113781"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="152.821429" xlink:href="#m9246c89fba" y="242.02012"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="158.660397" xlink:href="#m9246c89fba" y="223.324195"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="164.499365" xlink:href="#m9246c89fba" y="204.268444"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="170.338333" xlink:href="#m9246c89fba" y="185.11864"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="176.177302" xlink:href="#m9246c89fba" y="166.160487"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="182.01627" xlink:href="#m9246c89fba" y="147.695839"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="187.855238" xlink:href="#m9246c89fba" y="130.038568"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="193.694206" xlink:href="#m9246c89fba" y="113.51015"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="199.533175" xlink:href="#m9246c89fba" y="98.435021"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="205.372143" xlink:href="#m9246c89fba" y="85.135758"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="211.211111" xlink:href="#m9246c89fba" y="73.928158"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="217.050079" xlink:href="#m9246c89fba" y="65.116274"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="222.889048" xlink:href="#m9246c89fba" y="58.987478"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="228.728016" xlink:href="#m9246c89fba" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="234.566984" xlink:href="#m9246c89fba" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="240.405952" xlink:href="#m9246c89fba" y="58.987478"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="246.244921" xlink:href="#m9246c89fba" y="65.116274"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="252.083889" xlink:href="#m9246c89fba" y="73.928158"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="257.922857" xlink:href="#m9246c89fba" y="85.135758"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="263.761825" xlink:href="#m9246c89fba" y="98.435021"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="269.600794" xlink:href="#m9246c89fba" y="113.51015"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="275.439762" xlink:href="#m9246c89fba" y="130.038568"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="281.27873" xlink:href="#m9246c89fba" y="147.695839"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="287.117698" xlink:href="#m9246c89fba" y="166.160487"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="292.956667" xlink:href="#m9246c89fba" y="185.11864"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="298.795635" xlink:href="#m9246c89fba" y="204.268444"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="304.634603" xlink:href="#m9246c89fba" y="223.324195"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="310.473571" xlink:href="#m9246c89fba" y="242.02012"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="316.31254" xlink:href="#m9246c89fba" y="260.113781"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="322.151508" xlink:href="#m9246c89fba" y="277.38905"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="327.990476" xlink:href="#m9246c89fba" y="293.658611"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="333.829444" xlink:href="#m9246c89fba" y="308.765983"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="339.668413" xlink:href="#m9246c89fba" y="322.58702"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="345.507381" xlink:href="#m9246c89fba" y="335.030888"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="351.346349" xlink:href="#m9246c89fba" y="346.040507"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="357.185317" xlink:href="#m9246c89fba" y="355.59245"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="363.024286" xlink:href="#m9246c89fba" y="363.696328"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="368.863254" xlink:href="#m9246c89fba" y="370.393654"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="374.702222" xlink:href="#m9246c89fba" y="375.756216"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="380.54119" xlink:href="#m9246c89fba" y="379.883987"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="386.380159" xlink:href="#m9246c89fba" y="382.902611"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="392.219127" xlink:href="#m9246c89fba" y="384.9605"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="398.058095" xlink:href="#m9246c89fba" y="386.225579"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="403.897063" xlink:href="#m9246c89fba" y="386.881752"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="409.736032" xlink:href="#m9246c89fba" y="387.125115"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="415.575" xlink:href="#m9246c89fba" y="387.16"/>
+ <g clip-path="url(#p29883769eb)">
+ <use style="fill:#0072bd;stroke:#0072bd;" x="47.855" xlink:href="#m52d6644334" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="53.712183" xlink:href="#m52d6644334" y="388.564718"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="59.569365" xlink:href="#m52d6644334" y="388.318585"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="65.426548" xlink:href="#m52d6644334" y="387.654944"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="71.28373" xlink:href="#m52d6644334" y="386.375466"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="77.140913" xlink:href="#m52d6644334" y="384.294154"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="82.998095" xlink:href="#m52d6644334" y="381.241172"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="88.855278" xlink:href="#m52d6644334" y="377.066419"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="94.71246" xlink:href="#m52d6644334" y="371.642821"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="100.569643" xlink:href="#m52d6644334" y="364.869266"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="106.426825" xlink:href="#m52d6644334" y="356.67315"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="112.284008" xlink:href="#m52d6644334" y="347.012488"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="118.14119" xlink:href="#m52d6644334" y="335.877559"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="123.998373" xlink:href="#m52d6644334" y="323.292055"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="129.855556" xlink:href="#m52d6644334" y="309.313708"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="135.712738" xlink:href="#m52d6644334" y="294.034385"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="141.569921" xlink:href="#m52d6644334" y="277.579645"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="147.427103" xlink:href="#m52d6644334" y="260.107751"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="153.284286" xlink:href="#m52d6644334" y="241.808148"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="159.141468" xlink:href="#m52d6644334" y="222.899428"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="164.998651" xlink:href="#m52d6644334" y="203.626786"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="170.855833" xlink:href="#m52d6644334" y="184.25902"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="176.713016" xlink:href="#m52d6644334" y="165.085086"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="182.570198" xlink:href="#m52d6644334" y="146.410275"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="188.427381" xlink:href="#m52d6644334" y="128.55203"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="194.284563" xlink:href="#m52d6644334" y="111.835487"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="200.141746" xlink:href="#m52d6644334" y="96.588775"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="205.998929" xlink:href="#m52d6644334" y="83.138141"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="211.856111" xlink:href="#m52d6644334" y="71.802977"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="217.713294" xlink:href="#m52d6644334" y="62.890796"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="223.570476" xlink:href="#m52d6644334" y="56.692242"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="229.427659" xlink:href="#m52d6644334" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="235.284841" xlink:href="#m52d6644334" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="241.142024" xlink:href="#m52d6644334" y="56.692242"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="246.999206" xlink:href="#m52d6644334" y="62.890796"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="252.856389" xlink:href="#m52d6644334" y="71.802977"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="258.713571" xlink:href="#m52d6644334" y="83.138141"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="264.570754" xlink:href="#m52d6644334" y="96.588775"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="270.427937" xlink:href="#m52d6644334" y="111.835487"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="276.285119" xlink:href="#m52d6644334" y="128.55203"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="282.142302" xlink:href="#m52d6644334" y="146.410275"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="287.999484" xlink:href="#m52d6644334" y="165.085086"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="293.856667" xlink:href="#m52d6644334" y="184.25902"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="299.713849" xlink:href="#m52d6644334" y="203.626786"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="305.571032" xlink:href="#m52d6644334" y="222.899428"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="311.428214" xlink:href="#m52d6644334" y="241.808148"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="317.285397" xlink:href="#m52d6644334" y="260.107751"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="323.142579" xlink:href="#m52d6644334" y="277.579645"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="328.999762" xlink:href="#m52d6644334" y="294.034385"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="334.856944" xlink:href="#m52d6644334" y="309.313708"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="340.714127" xlink:href="#m52d6644334" y="323.292055"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="346.57131" xlink:href="#m52d6644334" y="335.877559"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="352.428492" xlink:href="#m52d6644334" y="347.012488"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="358.285675" xlink:href="#m52d6644334" y="356.67315"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="364.142857" xlink:href="#m52d6644334" y="364.869266"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="370.00004" xlink:href="#m52d6644334" y="371.642821"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="375.857222" xlink:href="#m52d6644334" y="377.066419"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="381.714405" xlink:href="#m52d6644334" y="381.241172"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="387.571587" xlink:href="#m52d6644334" y="384.294154"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="393.42877" xlink:href="#m52d6644334" y="386.375466"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="399.285952" xlink:href="#m52d6644334" y="387.654944"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="405.143135" xlink:href="#m52d6644334" y="388.318585"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="411.000317" xlink:href="#m52d6644334" y="388.564718"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="416.8575" xlink:href="#m52d6644334" y="388.6"/>
</g>
</g>
<g id="patch_3">
- <path d="M 47.72 387.16
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
- <path d="M 415.575 387.16
-L 415.575 39.24
+ <path d="M 416.8575 388.6
+L 416.8575 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
- <path d="M 47.72 387.16
-L 415.575 387.16
+ <path d="M 47.855 388.6
+L 416.8575 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
- <path d="M 47.72 39.24
-L 415.575 39.24
+ <path d="M 47.855 36.72
+L 416.8575 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
<g id="axes_2">
<g id="patch_7">
- <path d="M 477.425 387.16
-L 845.28 387.16
-L 845.28 39.24
-L 477.425 39.24
+ <path d="M 476.2325 388.6
+L 845.235 388.6
+L 845.235 36.72
+L 476.2325 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_3">
<g id="xtick_8">
<g id="line2d_28">
- <path clip-path="url(#p88d3f29b79)" d="M 477.425 387.16
-L 477.425 39.24
+ <path clip-path="url(#p9bfbf75de8)" d="M 476.2325 388.6
+L 476.2325 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_29">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#me300e42347" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m4d0c9e832b" y="388.6"/>
</g>
</g>
<g id="text_16">
<!-- 0.0 -->
- <g transform="translate(469.473437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(468.280937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1017,18 +1017,18 @@ L 477.425 39.24
</g>
<g id="xtick_9">
<g id="line2d_30">
- <path clip-path="url(#p88d3f29b79)" d="M 550.996 387.16
-L 550.996 39.24
+ <path clip-path="url(#p9bfbf75de8)" d="M 550.033 388.6
+L 550.033 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_31">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="550.996" xlink:href="#me300e42347" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="550.033" xlink:href="#m4d0c9e832b" y="388.6"/>
</g>
</g>
<g id="text_17">
<!-- 0.2 -->
- <g transform="translate(543.044437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(542.081437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -1037,18 +1037,18 @@ L 550.996 39.24
</g>
<g id="xtick_10">
<g id="line2d_32">
- <path clip-path="url(#p88d3f29b79)" d="M 624.567 387.16
-L 624.567 39.24
+ <path clip-path="url(#p9bfbf75de8)" d="M 623.8335 388.6
+L 623.8335 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_33">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="624.567" xlink:href="#me300e42347" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.8335" xlink:href="#m4d0c9e832b" y="388.6"/>
</g>
</g>
<g id="text_18">
<!-- 0.4 -->
- <g transform="translate(616.615437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(615.881937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -1057,18 +1057,18 @@ L 624.567 39.24
</g>
<g id="xtick_11">
<g id="line2d_34">
- <path clip-path="url(#p88d3f29b79)" d="M 698.138 387.16
-L 698.138 39.24
+ <path clip-path="url(#p9bfbf75de8)" d="M 697.634 388.6
+L 697.634 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_35">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="698.138" xlink:href="#me300e42347" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="697.634" xlink:href="#m4d0c9e832b" y="388.6"/>
</g>
</g>
<g id="text_19">
<!-- 0.6 -->
- <g transform="translate(690.186438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(689.682437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -1077,18 +1077,18 @@ L 698.138 39.24
</g>
<g id="xtick_12">
<g id="line2d_36">
- <path clip-path="url(#p88d3f29b79)" d="M 771.709 387.16
-L 771.709 39.24
+ <path clip-path="url(#p9bfbf75de8)" d="M 771.4345 388.6
+L 771.4345 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_37">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="771.709" xlink:href="#me300e42347" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="771.4345" xlink:href="#m4d0c9e832b" y="388.6"/>
</g>
</g>
<g id="text_20">
<!-- 0.8 -->
- <g transform="translate(763.757438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(763.482937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -1097,18 +1097,18 @@ L 771.709 39.24
</g>
<g id="xtick_13">
<g id="line2d_38">
- <path clip-path="url(#p88d3f29b79)" d="M 845.28 387.16
-L 845.28 39.24
+ <path clip-path="url(#p9bfbf75de8)" d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_39">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="845.28" xlink:href="#me300e42347" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="845.235" xlink:href="#m4d0c9e832b" y="388.6"/>
</g>
</g>
<g id="text_21">
<!-- 1.0 -->
- <g transform="translate(837.328438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(837.283437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1341,7 +1341,7 @@ Q 14.5 64.65625 8.015625 75.875
z
" id="DejaVuSans-41"/>
</defs>
- <g transform="translate(562.5525 415.438125)scale(0.1 -0.1)">
+ <g transform="translate(561.93375 416.878125)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-78"/>
<use transform="translate(74.804688 0.015625)" xlink:href="#DejaVuSans-111"/>
<use transform="translate(135.986328 0.015625)" xlink:href="#DejaVuSans-114"/>
@@ -1384,13 +1384,13 @@ z
<g id="matplotlib.axis_4">
<g id="ytick_7">
<g id="line2d_40">
- <path clip-path="url(#p88d3f29b79)" d="M 477.425 347.599927
-L 845.28 347.599927
+ <path clip-path="url(#p9bfbf75de8)" d="M 476.2325 348.589657
+L 845.235 348.589657
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_41">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m3dd7fb2a9f" y="347.599927"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#mba8e81eeee" y="348.589657"/>
</g>
</g>
<g id="text_23">
@@ -1403,7 +1403,7 @@ L 10.59375 27.203125
z
" id="DejaVuSans-8722"/>
</defs>
- <g transform="translate(442.957812 351.399146)scale(0.1 -0.1)">
+ <g transform="translate(441.765312 352.388876)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-49"/>
<use x="147.412109" xlink:href="#DejaVuSans-53"/>
@@ -1413,18 +1413,18 @@ z
</g>
<g id="ytick_8">
<g id="line2d_42">
- <path clip-path="url(#p88d3f29b79)" d="M 477.425 306.544848
-L 845.28 306.544848
+ <path clip-path="url(#p9bfbf75de8)" d="M 476.2325 307.067292
+L 845.235 307.067292
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_43">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m3dd7fb2a9f" y="306.544848"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#mba8e81eeee" y="307.067292"/>
</g>
</g>
<g id="text_24">
<!-- −125 -->
- <g transform="translate(442.957812 310.344067)scale(0.1 -0.1)">
+ <g transform="translate(441.765312 310.866511)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-49"/>
<use x="147.412109" xlink:href="#DejaVuSans-50"/>
@@ -1434,18 +1434,18 @@ L 845.28 306.544848
</g>
<g id="ytick_9">
<g id="line2d_44">
- <path clip-path="url(#p88d3f29b79)" d="M 477.425 265.489769
-L 845.28 265.489769
+ <path clip-path="url(#p9bfbf75de8)" d="M 476.2325 265.544927
+L 845.235 265.544927
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_45">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m3dd7fb2a9f" y="265.489769"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#mba8e81eeee" y="265.544927"/>
</g>
</g>
<g id="text_25">
<!-- −100 -->
- <g transform="translate(442.957812 269.288988)scale(0.1 -0.1)">
+ <g transform="translate(441.765312 269.344146)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-49"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1455,13 +1455,13 @@ L 845.28 265.489769
</g>
<g id="ytick_10">
<g id="line2d_46">
- <path clip-path="url(#p88d3f29b79)" d="M 477.425 224.43469
-L 845.28 224.43469
+ <path clip-path="url(#p9bfbf75de8)" d="M 476.2325 224.022562
+L 845.235 224.022562
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_47">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m3dd7fb2a9f" y="224.43469"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#mba8e81eeee" y="224.022562"/>
</g>
</g>
<g id="text_26">
@@ -1477,7 +1477,7 @@ L 8.203125 64.59375
z
" id="DejaVuSans-55"/>
</defs>
- <g transform="translate(449.320312 228.233909)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 227.821781)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-55"/>
<use x="147.412109" xlink:href="#DejaVuSans-53"/>
@@ -1486,18 +1486,18 @@ z
</g>
<g id="ytick_11">
<g id="line2d_48">
- <path clip-path="url(#p88d3f29b79)" d="M 477.425 183.379611
-L 845.28 183.379611
+ <path clip-path="url(#p9bfbf75de8)" d="M 476.2325 182.500198
+L 845.235 182.500198
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_49">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m3dd7fb2a9f" y="183.379611"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#mba8e81eeee" y="182.500198"/>
</g>
</g>
<g id="text_27">
<!-- −50 -->
- <g transform="translate(449.320312 187.17883)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 186.299416)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-53"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1506,18 +1506,18 @@ L 845.28 183.379611
</g>
<g id="ytick_12">
<g id="line2d_50">
- <path clip-path="url(#p88d3f29b79)" d="M 477.425 142.324532
-L 845.28 142.324532
+ <path clip-path="url(#p9bfbf75de8)" d="M 476.2325 140.977833
+L 845.235 140.977833
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_51">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m3dd7fb2a9f" y="142.324532"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#mba8e81eeee" y="140.977833"/>
</g>
</g>
<g id="text_28">
<!-- −25 -->
- <g transform="translate(449.320312 146.123751)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 144.777051)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-50"/>
<use x="147.412109" xlink:href="#DejaVuSans-53"/>
@@ -1526,36 +1526,36 @@ L 845.28 142.324532
</g>
<g id="ytick_13">
<g id="line2d_52">
- <path clip-path="url(#p88d3f29b79)" d="M 477.425 101.269453
-L 845.28 101.269453
+ <path clip-path="url(#p9bfbf75de8)" d="M 476.2325 99.455468
+L 845.235 99.455468
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_53">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m3dd7fb2a9f" y="101.269453"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#mba8e81eeee" y="99.455468"/>
</g>
</g>
<g id="text_29">
<!-- 0 -->
- <g transform="translate(464.0625 105.068672)scale(0.1 -0.1)">
+ <g transform="translate(462.87 103.254686)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_14">
<g id="line2d_54">
- <path clip-path="url(#p88d3f29b79)" d="M 477.425 60.214374
-L 845.28 60.214374
+ <path clip-path="url(#p9bfbf75de8)" d="M 476.2325 57.933103
+L 845.235 57.933103
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_55">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m3dd7fb2a9f" y="60.214374"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#mba8e81eeee" y="57.933103"/>
</g>
</g>
<g id="text_30">
<!-- 25 -->
- <g transform="translate(457.7 64.013593)scale(0.1 -0.1)">
+ <g transform="translate(456.5075 61.732322)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-53"/>
</g>
@@ -1619,7 +1619,7 @@ L 9.8125 0
z
" id="DejaVuSans-66"/>
</defs>
- <g transform="translate(436.878125 236.791406)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(435.685625 236.251406)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-71"/>
<use x="77.490234" xlink:href="#DejaVuSans-97"/>
<use x="138.769531" xlink:href="#DejaVuSans-105"/>
@@ -1633,513 +1633,513 @@ z
</g>
</g>
<g id="line2d_56">
- <path clip-path="url(#p88d3f29b79)" d="M 477.425 55.054545
-L 478.861934 55.155536
-L 480.298867 55.459085
-L 481.735801 55.966947
-L 483.172734 56.682105
-L 484.609668 57.608864
-L 486.046602 58.752993
-L 487.483535 60.121921
-L 488.920469 61.725012
-L 490.357402 63.573936
-L 491.794336 65.683174
-L 493.23127 68.070717
-L 494.668203 70.759041
-L 496.105137 73.776491
-L 497.54207 77.159318
-L 498.979004 80.954731
-L 500.415938 85.225678
-L 501.852871 90.05866
-L 503.289805 95.577248
-L 504.726738 101.96717
-L 506.163672 109.527411
-L 507.600605 118.788502
-L 508.319072 124.356433
-L 509.037539 130.843526
-L 509.756006 138.665223
-L 510.474473 148.627003
-L 511.192939 162.649594
-L 511.911406 187.830965
-L 512.629873 222.528959
-L 513.34834 176.628809
-L 514.066807 161.147642
-L 514.785273 152.08389
-L 515.50374 145.942599
-L 516.222207 141.500642
-L 516.940674 138.185751
-L 517.659141 135.684685
-L 518.377607 133.80819
-L 519.096074 132.434056
-L 519.814541 131.479679
-L 520.533008 130.887519
-L 521.251475 130.616859
-L 521.969941 130.638871
-L 522.688408 130.933586
-L 523.406875 131.487998
-L 524.125342 132.294922
-L 524.843809 133.352377
-L 525.562275 134.663386
-L 526.280742 136.236168
-L 527.717676 140.230091
-L 529.154609 145.541935
-L 530.591543 152.583944
-L 531.31001 156.991129
-L 532.028477 162.21792
-L 532.746943 168.574124
-L 533.46541 176.622797
-L 534.183877 187.559835
-L 534.902344 204.770182
-L 535.620811 251.288991
-L 536.339277 222.144011
-L 537.057744 198.168754
-L 537.776211 186.039195
-L 538.494678 178.117654
-L 539.213145 172.410703
-L 539.931611 168.09393
-L 540.650078 164.746474
-L 541.368545 162.125046
-L 542.087012 160.077068
-L 542.805479 158.501343
-L 543.523945 157.328149
-L 544.242412 156.508291
-L 544.960879 156.006723
-L 545.679346 155.798671
-L 546.397812 155.867214
-L 547.116279 156.201799
-L 547.834746 156.797367
-L 548.553213 157.653949
-L 549.27168 158.776659
-L 549.990146 160.176082
-L 550.708613 161.869117
-L 551.42708 163.880444
-L 552.145547 166.244886
-L 552.864014 169.011215
-L 553.58248 172.248401
-L 554.300947 176.056311
-L 555.019414 180.585153
-L 555.737881 186.073758
-L 556.456348 192.933919
-L 557.174814 201.969027
-L 557.893281 215.112656
-L 558.611748 239.793323
-L 559.330215 293.948754
-L 560.048682 227.478171
-L 560.767148 210.830244
-L 561.485615 200.91524
-L 562.204082 194.010807
-L 562.922549 188.852036
-L 563.641016 184.852987
-L 564.359482 181.694264
-L 565.077949 179.183173
-L 565.796416 177.195255
-L 566.514883 175.646256
-L 567.23335 174.477339
-L 567.951816 173.646699
-L 568.670283 173.124572
-L 569.38875 172.890158
-L 570.107217 172.929701
-L 570.825684 173.235332
-L 571.54415 173.804438
-L 572.262617 174.639456
-L 572.981084 175.74806
-L 573.699551 177.143763
-L 574.418018 178.847051
-L 575.136484 180.887253
-L 575.854951 183.305547
-L 576.573418 186.159846
-L 577.291885 189.532985
-L 578.010352 193.547155
-L 578.728818 198.391231
-L 579.447285 204.377752
-L 580.165752 212.079335
-L 580.884219 222.733287
-L 581.602686 240.031931
-L 582.321152 299.328566
-L 583.039619 260.074124
-L 583.758086 232.703722
-L 584.476553 219.847777
-L 585.19502 211.470335
-L 585.913486 205.385756
-L 586.631953 200.725901
-L 587.35042 197.05504
-L 588.068887 194.123517
-L 588.787354 191.77556
-L 589.50582 189.908175
-L 590.224287 188.450528
-L 590.942754 187.35268
-L 591.661221 186.579058
-L 592.379688 186.10449
-L 593.098154 185.911747
-L 593.816621 185.990024
-L 594.535088 186.334058
-L 595.253555 186.943713
-L 595.972021 187.823968
-L 596.690488 188.985312
-L 597.408955 190.444593
-L 598.127422 192.226508
-L 598.845889 194.365999
-L 599.564355 196.912143
-L 600.282822 199.934549
-L 601.001289 203.534416
-L 601.719756 207.8648
-L 602.438223 213.171164
-L 603.156689 219.88298
-L 603.875156 228.862361
-L 604.593623 242.334367
-L 605.31209 272.213674
-L 606.030557 279.692047
-L 606.749023 256.334962
-L 607.46749 237.460813
-L 608.185957 226.913722
-L 608.904424 219.651282
-L 609.622891 214.223893
-L 610.341357 209.995704
-L 611.059824 206.628952
-L 611.778291 203.922789
-L 612.496758 201.748638
-L 613.215225 200.019959
-L 613.933691 198.676551
-L 614.652158 197.675748
-L 615.370625 196.987221
-L 616.089092 196.589783
-L 616.807559 196.469418
-L 617.526025 196.618083
-L 618.244492 197.033064
-L 618.962959 197.716764
-L 619.681426 198.676895
-L 620.399893 199.927102
-L 621.118359 201.488133
-L 621.836826 203.389784
-L 622.555293 205.674046
-L 623.27376 208.400253
-L 623.992227 211.653832
-L 624.710693 215.561996
-L 625.42916 220.324237
-L 626.147627 226.2785
-L 626.866094 234.07068
-L 627.584561 245.227704
-L 628.303027 265.783007
-L 629.021494 278.133362
-L 629.739961 300.958147
-L 630.458428 256.643665
-L 631.176895 241.826346
-L 631.895361 232.799095
-L 632.613828 226.364871
-L 633.332295 221.464303
-L 634.050762 217.60289
-L 634.769229 214.507738
-L 635.487695 212.012302
-L 636.206162 210.008008
-L 636.924629 208.420887
-L 637.643096 207.199131
-L 638.361562 206.306004
-L 639.080029 205.715592
-L 639.798496 205.410195
-L 640.516963 205.378728
-L 641.23543 205.615791
-L 641.953896 206.121239
-L 642.672363 206.900184
-L 643.39083 207.963405
-L 644.109297 209.328272
-L 644.827764 211.02034
-L 645.54623 213.075962
-L 646.264697 215.546575
-L 646.983164 218.505898
-L 647.701631 222.062714
-L 648.420098 226.385237
-L 649.138564 231.752798
-L 649.857031 238.683849
-L 650.575498 248.344711
-L 651.293965 264.75012
-L 652.012432 286.140801
-L 652.730898 274.319089
-L 653.449365 297.350996
-L 654.167832 258.497659
-L 654.886299 245.934074
-L 655.604766 237.932364
-L 656.323232 232.113401
-L 657.041699 227.630649
-L 657.760166 224.075307
-L 658.478633 221.216776
-L 659.1971 218.912143
-L 659.915566 217.067253
-L 660.634033 215.617553
-L 661.3525 214.51777
-L 662.070967 213.735955
-L 662.789434 213.249919
-L 663.5079 213.045045
-L 664.226367 213.112989
-L 664.944834 213.450979
-L 665.663301 214.061607
-L 666.381768 214.953047
-L 667.100234 216.139768
-L 667.818701 217.643869
-L 668.537168 219.49732
-L 669.255635 221.745671
-L 669.974102 224.454292
-L 670.692568 227.719401
-L 671.411035 231.688985
-L 672.129502 236.606783
-L 672.847969 242.919906
-L 673.566436 251.614623
-L 674.284902 265.904032
-L 675.003369 295.982678
-L 675.721836 272.595985
-L 676.440303 275.237588
-L 677.15877 291.474688
-L 677.877236 261.271438
-L 678.595703 249.931084
-L 679.31417 242.59304
-L 680.032637 237.213483
-L 680.751104 233.050347
-L 681.46957 229.741993
-L 682.188037 227.083137
-L 682.906504 224.945982
-L 683.624971 223.246123
-L 684.343438 221.925717
-L 685.061904 220.944385
-L 685.780371 220.273972
-L 686.498838 219.895426
-L 687.217305 219.796922
-L 687.935771 219.972795
-L 688.654238 220.423069
-L 689.372705 221.153475
-L 690.091172 222.17598
-L 690.809639 223.509929
-L 691.528105 225.18405
-L 692.246572 227.239837
-L 692.965039 229.737302
-L 693.683506 232.765195
-L 694.401973 236.460504
-L 695.120439 241.049729
-L 695.838906 246.950582
-L 696.557373 255.091751
-L 697.27584 268.524019
-L 697.994307 299.506703
-L 698.712773 272.556724
-L 699.43124 269.814818
-L 700.149707 275.693346
-L 700.868174 296.234635
-L 701.586641 264.920513
-L 702.305107 253.990915
-L 703.023574 246.997041
-L 703.742041 241.89078
-L 704.460508 237.94934
-L 705.178975 234.826109
-L 705.897441 232.326315
-L 706.615908 230.329593
-L 707.334375 228.756972
-L 708.052842 227.554771
-L 708.771309 226.685969
-L 709.489775 226.125298
-L 710.208242 225.856366
-L 710.926709 225.869992
-L 711.645176 226.163352
-L 712.363643 226.739744
-L 713.082109 227.608935
-L 713.800576 228.788158
-L 714.519043 230.304012
-L 715.23751 232.195748
-L 715.955977 234.520979
-L 716.674443 237.365992
-L 717.39291 240.865767
-L 718.111377 245.247245
-L 718.829844 250.938989
-L 719.548311 258.930571
-L 720.266777 272.740012
-L 720.985244 293.052197
-L 721.703711 271.949202
-L 722.422178 267.610431
-L 723.140645 268.265123
-L 723.859111 274.552183
-L 724.577578 371.345455
-L 725.296045 269.841935
-L 726.014512 258.356626
-L 726.732979 251.348969
-L 727.451445 246.330732
-L 728.169912 242.500494
-L 728.888379 239.491334
-L 729.606846 237.103015
-L 730.325313 235.214362
-L 731.043779 233.747233
-L 731.762246 232.649417
-L 732.480713 231.885673
-L 733.19918 231.432761
-L 733.917646 231.27661
-L 734.636113 231.410795
-L 735.35458 231.835898
-L 736.073047 232.559624
-L 736.791514 233.597681
-L 737.50998 234.975691
-L 738.228447 236.732642
-L 738.946914 238.927079
-L 739.665381 241.648574
-L 740.383848 245.040691
-L 741.102314 249.352533
-L 741.820781 255.076621
-L 742.539248 263.442421
-L 743.257715 279.775309
-L 743.976182 284.627775
-L 744.694648 270.303864
-L 745.413115 265.812264
-L 746.131582 264.803549
-L 746.850049 266.506486
-L 747.568516 272.01189
-L 748.286982 290.697636
-L 749.723916 263.448165
-L 750.442383 255.895279
-L 751.16085 250.715386
-L 751.879316 246.853437
-L 752.597783 243.868143
-L 753.31625 241.531429
-L 754.034717 239.710401
-L 754.753184 238.321899
-L 755.47165 237.311899
-L 756.190117 236.645139
-L 756.908584 236.299566
-L 757.627051 236.263345
-L 758.345518 236.533424
-L 759.063984 237.115227
-L 759.782451 238.023404
-L 760.500918 239.283861
-L 761.219385 240.937726
-L 761.937852 243.048746
-L 762.656318 245.717556
-L 763.374785 249.111564
-L 764.093252 253.536245
-L 764.811719 259.644111
-L 765.530186 269.3191
-L 766.248652 296.872042
-L 766.967119 277.416777
-L 767.685586 267.793035
-L 768.404053 263.75139
-L 769.12252 262.163291
-L 769.840986 262.323479
-L 770.559453 264.243896
-L 771.27792 268.67298
-L 771.996387 278.971647
-L 772.714854 295.185418
-L 773.43332 270.208575
-L 774.151787 261.019737
-L 774.870254 255.26554
-L 775.588721 251.159054
-L 776.307188 248.071082
-L 777.025654 245.705271
-L 777.744121 243.899178
-L 778.462588 242.555747
-L 779.181055 241.614498
-L 779.899521 241.037833
-L 780.617988 240.804102
-L 781.336455 240.904163
-L 782.054922 241.340093
-L 782.773389 242.12559
-L 783.491855 243.288237
-L 784.210322 244.874475
-L 784.928789 246.959438
-L 785.647256 249.667003
-L 786.365723 253.214685
-L 787.084189 258.031374
-L 787.802656 265.160222
-L 789.23959 290.765625
-L 789.958057 271.438092
-L 790.676523 264.743554
-L 791.39499 261.29832
-L 792.113457 259.572014
-L 792.831924 259.079504
-L 793.550391 259.692344
-L 794.268857 261.517784
-L 794.987324 264.997704
-L 795.705791 271.501994
-L 796.424258 288.455567
-L 797.142725 281.971459
-L 797.861191 267.512812
-L 798.579658 260.318303
-L 799.298125 255.599301
-L 800.016592 252.212783
-L 800.735059 249.702024
-L 801.453525 247.839897
-L 802.171992 246.499702
-L 802.890459 245.606988
-L 803.608926 245.11855
-L 804.327393 245.012612
-L 805.045859 245.284555
-L 805.764326 245.94616
-L 806.482793 247.028036
-L 807.20126 248.586358
-L 807.919727 250.717446
-L 808.638193 253.589872
-L 809.35666 257.523721
-L 810.075127 263.232018
-L 810.793594 272.915191
-L 811.512061 312.705195
-L 812.230527 275.90244
-L 812.948994 266.325955
-L 813.667461 261.409684
-L 814.385928 258.493113
-L 815.104395 256.797393
-L 815.822861 256.011808
-L 816.541328 256.01381
-L 817.259795 256.79242
-L 817.978262 258.442049
-L 818.696729 261.218199
-L 819.415195 265.743718
-L 820.133662 273.928563
-L 820.852129 301.633181
-L 821.570596 277.818047
-L 822.289062 266.536643
-L 823.007529 260.440698
-L 823.725996 256.419058
-L 824.444463 253.587151
-L 825.16293 251.571353
-L 825.881396 250.183618
-L 826.599863 249.322104
-L 827.31833 248.933149
-L 828.036797 248.995423
-L 828.755264 249.514485
-L 829.47373 250.524356
-L 830.192197 252.097069
-L 830.910664 254.366571
-L 831.629131 257.587424
-L 832.347598 262.302369
-L 833.066064 269.996762
-L 833.784531 288.817392
-L 834.502998 281.165319
-L 835.221465 268.037474
-L 835.939932 261.780629
-L 836.658398 257.932099
-L 837.376865 255.407854
-L 838.095332 253.782409
-L 838.813799 252.856216
-L 839.532266 252.533977
-L 840.250732 252.78234
-L 840.969199 253.61727
-L 841.687666 255.109678
-L 842.406133 257.414147
-L 843.1246 260.850689
-L 843.843066 266.166077
-L 844.561533 275.77539
-L 844.561533 275.77539
+ <path clip-path="url(#p9bfbf75de8)" d="M 476.2325 52.714545
+L 477.673916 52.816685
+L 479.115332 53.123689
+L 480.556748 53.637332
+L 481.998164 54.36063
+L 483.43958 55.297938
+L 484.880996 56.455088
+L 486.322412 57.839597
+L 487.763828 59.460935
+L 489.205244 61.330903
+L 490.64666 63.464148
+L 492.088076 65.878867
+L 493.529492 68.597788
+L 494.970908 71.649583
+L 496.412324 75.070913
+L 497.85374 78.909525
+L 499.295156 83.229084
+L 500.736572 88.117074
+L 502.177988 93.698475
+L 503.619404 100.161126
+L 505.06082 107.807417
+L 506.502236 117.173918
+L 507.222944 122.805222
+L 507.943652 129.366151
+L 508.66436 137.276874
+L 509.385068 147.352038
+L 510.105776 161.534233
+L 510.826484 187.002217
+L 511.547192 222.09514
+L 512.2679 175.672558
+L 512.988608 160.015186
+L 513.709316 150.848271
+L 514.430024 144.63708
+L 515.150732 140.144565
+L 515.87144 136.791945
+L 516.592148 134.262411
+L 517.312856 132.364558
+L 518.033564 130.974784
+L 518.754272 130.009544
+L 519.47498 129.410645
+L 520.195688 129.136904
+L 520.916396 129.159166
+L 521.637104 129.457235
+L 522.357812 130.017958
+L 523.078521 130.834067
+L 523.799229 131.903557
+L 524.519937 133.229488
+L 525.240645 134.820171
+L 526.682061 138.859553
+L 528.123477 144.231855
+L 529.564893 151.354017
+L 530.285601 155.811364
+L 531.006309 161.097645
+L 531.727017 167.526195
+L 532.447725 175.666478
+L 533.168433 186.728
+L 533.889141 204.134234
+L 534.609849 251.182517
+L 535.330557 221.705811
+L 536.051265 197.457669
+L 536.771973 185.190053
+L 537.492681 177.178349
+L 538.213389 171.406442
+L 538.934097 167.040536
+L 539.654805 163.654979
+L 540.375513 161.003715
+L 541.096221 158.932426
+L 541.816929 157.338767
+L 542.537637 156.152219
+L 543.258345 155.32303
+L 543.979053 154.815754
+L 544.699761 154.605333
+L 545.420469 154.674656
+L 546.141177 155.01305
+L 546.861885 155.615396
+L 547.582593 156.481728
+L 548.303301 157.617217
+L 549.024009 159.032567
+L 549.744717 160.744872
+L 550.465425 162.779092
+L 551.186133 165.170446
+L 551.906841 167.968262
+L 552.627549 171.242293
+L 553.348257 175.093544
+L 554.068965 179.673933
+L 554.789673 185.225009
+L 555.510381 192.163252
+L 556.231089 201.301197
+L 556.951797 214.594426
+L 557.672505 239.556006
+L 558.393213 294.32783
+L 559.113921 227.100684
+L 559.834629 210.263272
+L 560.555337 200.235415
+L 561.276045 193.252397
+L 561.996753 188.034909
+L 562.717461 183.990343
+L 563.438169 180.795668
+L 564.158877 178.255996
+L 564.879585 176.245452
+L 565.600293 174.678822
+L 566.321001 173.4966
+L 567.041709 172.656506
+L 567.762417 172.128437
+L 568.483125 171.891354
+L 569.203833 171.931348
+L 569.924541 172.240457
+L 570.645249 172.816041
+L 571.365957 173.660563
+L 572.086665 174.781785
+L 572.807373 176.193374
+L 573.528081 177.916049
+L 574.248789 179.979471
+L 574.969497 182.42529
+L 575.690205 185.312077
+L 576.410913 188.723609
+L 577.131621 192.783468
+L 577.852329 197.682678
+L 578.573037 203.737338
+L 579.293745 211.52658
+L 580.014453 222.301794
+L 580.735161 239.79733
+L 581.455869 299.768875
+L 582.176577 260.067641
+L 582.897285 232.385712
+L 583.617993 219.383442
+L 584.338701 210.910648
+L 585.059409 204.756815
+L 585.780117 200.043922
+L 586.500825 196.33128
+L 587.221533 193.36639
+L 587.942241 190.991709
+L 588.662949 189.10307
+L 589.383657 187.628831
+L 590.104365 186.518488
+L 590.825073 185.736061
+L 591.545781 185.256091
+L 592.266489 185.061154
+L 592.987197 185.140322
+L 593.707905 185.488272
+L 594.428613 186.104866
+L 595.149321 186.99514
+L 595.870029 188.169702
+L 596.590737 189.645593
+L 597.311445 191.447789
+L 598.032153 193.611632
+L 598.752861 196.186756
+L 599.473569 199.243563
+L 600.194277 202.884403
+L 600.914985 207.264075
+L 601.635693 212.630835
+L 602.356401 219.419045
+L 603.077109 228.500629
+L 603.797817 242.125972
+L 604.518525 272.345363
+L 605.239233 279.908855
+L 605.959941 256.285921
+L 606.680649 237.196948
+L 607.401357 226.52981
+L 608.122065 219.18471
+L 608.842773 213.695547
+L 609.563481 209.419233
+L 610.284189 206.014161
+L 611.004897 203.277197
+L 611.725605 201.078299
+L 612.446313 199.329944
+L 613.167021 197.971246
+L 613.887729 196.959052
+L 614.608437 196.262688
+L 615.329146 195.860726
+L 616.049854 195.738991
+L 616.770562 195.889349
+L 617.49127 196.309053
+L 618.211978 197.000535
+L 618.932686 197.971594
+L 619.653394 199.23603
+L 620.374102 200.814829
+L 621.09481 202.738125
+L 621.815518 205.048386
+L 622.536226 207.805622
+L 623.256934 211.096233
+L 623.977642 215.04888
+L 624.69835 219.865325
+L 625.419058 225.887358
+L 626.139766 233.768229
+L 626.860474 245.052241
+L 627.581182 265.841503
+L 628.30189 278.332429
+L 629.022598 301.417004
+L 629.743306 256.598138
+L 630.464014 241.612169
+L 631.184722 232.48217
+L 631.90543 225.974712
+L 632.626138 221.018367
+L 633.346846 217.113004
+L 634.067554 213.982623
+L 634.788262 211.458784
+L 635.50897 209.431677
+L 636.229678 207.826491
+L 636.950386 206.590829
+L 637.671094 205.687537
+L 638.391802 205.090405
+L 639.11251 204.781532
+L 639.833218 204.749707
+L 640.553926 204.989468
+L 641.274634 205.500669
+L 641.995342 206.28848
+L 642.71605 207.363802
+L 643.436758 208.744204
+L 644.157466 210.455531
+L 644.878174 212.534551
+L 645.598882 215.033283
+L 646.31959 218.02629
+L 647.040298 221.623588
+L 647.761006 225.99531
+L 648.481714 231.423965
+L 649.202422 238.433904
+L 649.92313 248.204725
+L 650.643838 264.79686
+L 651.364546 286.431007
+L 652.085254 274.474742
+L 652.805962 297.768796
+L 653.52667 258.473234
+L 654.247378 245.766651
+L 654.968086 237.673866
+L 655.688794 231.788672
+L 656.409502 227.254898
+L 657.13021 223.659089
+L 657.850918 220.768022
+L 658.571626 218.437158
+L 659.292334 216.571269
+L 660.013042 215.10507
+L 660.73375 213.992769
+L 661.454458 213.202056
+L 662.175166 212.710487
+L 662.895874 212.503282
+L 663.616582 212.571998
+L 664.33729 212.913836
+L 665.057998 213.531414
+L 665.778706 214.433
+L 666.499414 215.633228
+L 667.220122 217.154448
+L 667.94083 219.028995
+L 668.661538 221.302937
+L 669.382246 224.042387
+L 670.102954 227.34466
+L 670.823662 231.359425
+L 671.54437 236.333197
+L 672.265078 242.718175
+L 672.985786 251.511855
+L 673.706494 265.963905
+L 674.427202 296.384905
+L 675.14791 272.732026
+L 675.868618 275.403696
+L 676.589326 291.825604
+L 677.310034 261.278583
+L 678.030742 249.809154
+L 678.75145 242.387589
+L 679.472158 236.946803
+L 680.192866 232.736282
+L 680.913574 229.390272
+L 681.634282 226.701153
+L 682.35499 224.539674
+L 683.075698 222.820467
+L 683.796406 221.485033
+L 684.517114 220.492531
+L 685.237822 219.814487
+L 685.95853 219.431633
+L 686.679238 219.332007
+L 687.399946 219.509882
+L 688.120654 219.965281
+L 688.841362 220.704001
+L 689.56207 221.738144
+L 690.282778 223.087276
+L 691.003486 224.780451
+L 691.724194 226.859638
+L 692.444902 229.385529
+L 693.16561 232.447884
+L 693.886318 236.185253
+L 694.607026 240.826713
+L 695.327734 246.794729
+L 696.048442 255.028559
+L 696.76915 268.613713
+L 697.489858 299.949039
+L 698.210566 272.692318
+L 698.931274 269.919204
+L 699.651982 275.86464
+L 700.37269 296.639729
+L 701.093398 264.969192
+L 701.814106 253.915194
+L 702.534814 246.841716
+L 703.255522 241.677336
+L 703.97623 237.691035
+L 704.696938 234.532255
+L 705.417646 232.004009
+L 706.138354 229.98456
+L 706.859062 228.39404
+L 707.579771 227.178156
+L 708.300479 226.299465
+L 709.021187 225.732412
+L 709.741895 225.46042
+L 710.462603 225.474201
+L 711.183311 225.7709
+L 711.904019 226.353853
+L 712.624727 227.232936
+L 713.345435 228.425581
+L 714.066143 229.958689
+L 714.786851 231.871956
+L 715.507559 234.223652
+L 716.228267 237.101047
+L 716.948975 240.640657
+L 717.669683 245.072004
+L 718.390391 250.828531
+L 719.111099 258.911073
+L 719.831807 272.877691
+L 720.552515 293.421068
+L 721.273223 272.077881
+L 721.993931 267.689727
+L 722.714639 268.35187
+L 723.435347 274.710489
+L 724.156055 372.605455
+L 724.876763 269.946629
+L 725.597471 258.330595
+L 726.318179 251.243178
+L 727.038887 246.167823
+L 727.759595 242.29399
+L 728.480303 239.25058
+L 729.201011 236.835078
+L 729.921719 234.924927
+L 730.642427 233.4411
+L 731.363135 232.330789
+L 732.083843 231.558352
+L 732.804551 231.100285
+L 733.525259 230.942356
+L 734.245967 231.078069
+L 734.966675 231.508011
+L 735.687383 232.239973
+L 736.408091 233.289846
+L 737.128799 234.68354
+L 737.849507 236.460489
+L 738.570215 238.679902
+L 739.290923 241.432374
+L 740.011631 244.8631
+L 740.732339 249.224018
+L 741.453047 255.013257
+L 742.173755 263.474277
+L 742.894463 279.993064
+L 743.615171 284.90076
+L 744.335879 270.413816
+L 745.056587 265.871093
+L 745.777295 264.850897
+L 746.498003 266.573216
+L 747.218711 272.141283
+L 747.939419 291.039708
+L 749.380835 263.480086
+L 750.101543 255.841233
+L 750.822251 250.602383
+L 751.542959 246.696478
+L 752.263667 243.677206
+L 752.984375 241.313895
+L 753.705083 239.47214
+L 754.425791 238.067835
+L 755.146499 237.046339
+L 755.867207 236.37199
+L 756.587915 236.022483
+L 757.308623 235.98585
+L 758.029331 236.259003
+L 758.750039 236.847429
+L 759.470747 237.765943
+L 760.191455 239.040746
+L 760.912163 240.713435
+L 761.632871 242.848482
+L 762.353579 245.547669
+L 763.074287 248.980307
+L 763.794995 253.455349
+L 764.515703 259.632734
+L 765.236411 269.417843
+L 765.957119 297.284391
+L 766.677827 277.607688
+L 767.398535 267.874409
+L 768.119243 263.786762
+L 768.839951 262.180587
+L 769.560659 262.342599
+L 770.281367 264.284874
+L 771.002075 268.76437
+L 771.722783 279.180255
+L 772.443491 295.578569
+L 773.164199 270.317442
+L 773.884907 261.024017
+L 774.605615 255.204327
+L 775.326323 251.051101
+L 776.047031 247.927982
+L 776.767739 245.535243
+L 777.488447 243.708593
+L 778.209155 242.349872
+L 778.929863 241.39791
+L 779.650571 240.814681
+L 780.371279 240.578289
+L 781.091987 240.67949
+L 781.812695 241.120382
+L 782.533403 241.914818
+L 783.254111 243.090699
+L 783.974819 244.694992
+L 784.695527 246.803685
+L 785.416235 249.542068
+L 786.136943 253.130129
+L 786.857651 258.001642
+L 787.578359 265.211629
+L 789.019775 291.108471
+L 789.740483 271.560954
+L 790.461191 264.790219
+L 791.181899 261.305772
+L 791.902607 259.559817
+L 792.623315 259.061701
+L 793.344023 259.681517
+L 794.064731 261.527733
+L 794.785439 265.047262
+L 795.506147 271.625583
+L 796.226855 288.772121
+L 796.947563 282.21421
+L 797.668271 267.590996
+L 798.388979 260.3146
+L 799.109687 255.541887
+L 799.830396 252.116823
+L 800.551104 249.577487
+L 801.271812 247.694166
+L 801.99252 246.338717
+L 802.713228 245.435842
+L 803.433936 244.941845
+L 804.154644 244.834701
+L 804.875352 245.109739
+L 805.59606 245.778875
+L 806.316768 246.873065
+L 807.037476 248.449123
+L 807.758184 250.604466
+L 808.478892 253.509586
+L 809.1996 257.48821
+L 809.920308 263.261479
+L 810.641016 273.054865
+L 811.361724 313.297756
+L 812.082432 276.076115
+L 812.80314 266.39063
+L 813.523848 261.418403
+L 814.244556 258.468636
+L 814.965264 256.753615
+L 815.685972 255.959089
+L 816.40668 255.961113
+L 817.127388 256.748586
+L 817.848096 258.416991
+L 818.568804 261.224739
+L 819.289512 265.801767
+L 820.01022 274.079771
+L 820.730928 302.099721
+L 821.451636 278.013525
+L 822.172344 266.603717
+L 822.893052 260.438388
+L 823.61376 256.370974
+L 824.334468 253.506834
+L 825.055176 251.468093
+L 825.775884 250.064562
+L 826.496592 249.193243
+L 827.2173 248.799861
+L 827.938008 248.862844
+L 828.658716 249.387814
+L 829.379424 250.409179
+L 830.100132 251.999793
+L 830.82084 254.295126
+L 831.541548 257.552638
+L 832.262256 262.321249
+L 832.982964 270.103219
+L 833.703672 289.138063
+L 834.42438 281.398895
+L 835.145088 268.12163
+L 835.865796 261.79357
+L 836.586504 257.901237
+L 837.307212 255.348261
+L 838.02792 253.704315
+L 838.748628 252.76758
+L 839.469336 252.441674
+L 840.190044 252.692863
+L 840.910752 253.537296
+L 841.63146 255.046691
+L 842.352168 257.377389
+L 843.072876 260.853046
+L 843.793584 266.228933
+L 844.514292 275.947618
+L 844.514292 275.947618
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
</g>
<g id="patch_8">
- <path d="M 477.425 387.16
-L 477.425 39.24
+ <path d="M 476.2325 388.6
+L 476.2325 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_9">
- <path d="M 845.28 387.16
-L 845.28 39.24
+ <path d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_10">
- <path d="M 477.425 387.16
-L 845.28 387.16
+ <path d="M 476.2325 388.6
+L 845.235 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_11">
- <path d="M 477.425 39.24
-L 845.28 39.24
+ <path d="M 476.2325 36.72
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
@@ -2199,11 +2199,11 @@ z
</g>
</g>
<defs>
- <clipPath id="p97ec8ec411">
- <rect height="347.92" width="367.855" x="47.72" y="39.24"/>
+ <clipPath id="p29883769eb">
+ <rect height="351.88" width="369.0025" x="47.855" y="36.72"/>
</clipPath>
- <clipPath id="p88d3f29b79">
- <rect height="347.92" width="367.855" x="477.425" y="39.24"/>
+ <clipPath id="p9bfbf75de8">
+ <rect height="351.88" width="369.0025" x="476.2325" y="36.72"/>
</clipPath>
</defs>
</svg>
diff --git a/docs/docs/img/window_cosine.svg b/docs/docs/img/window_cosine.svg
@@ -19,28 +19,28 @@ z
</g>
<g id="axes_1">
<g id="patch_2">
- <path d="M 47.72 387.16
-L 418.77 387.16
-L 418.77 39.24
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 420.03 388.6
+L 420.03 36.72
+L 47.855 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
- <path clip-path="url(#p5db5ac15e0)" d="M 47.72 387.16
-L 47.72 39.24
+ <path clip-path="url(#pa303fa7717)" d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
-" id="mfa61dcf6dd" style="stroke:#000000;stroke-width:0.8;"/>
+" id="mc5e2e8c3a3" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mfa61dcf6dd" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mc5e2e8c3a3" y="388.6"/>
</g>
</g>
<g id="text_1">
@@ -68,20 +68,20 @@ Q 19.53125 74.21875 31.78125 74.21875
z
" id="DejaVuSans-48"/>
</defs>
- <g transform="translate(44.53875 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(44.67375 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
- <path clip-path="url(#p5db5ac15e0)" d="M 106.616825 387.16
-L 106.616825 39.24
+ <path clip-path="url(#pa303fa7717)" d="M 106.930397 388.6
+L 106.930397 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="106.616825" xlink:href="#mfa61dcf6dd" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="106.930397" xlink:href="#mc5e2e8c3a3" y="388.6"/>
</g>
</g>
<g id="text_2">
@@ -101,7 +101,7 @@ L 12.40625 0
z
" id="DejaVuSans-49"/>
</defs>
- <g transform="translate(100.254325 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(100.567897 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -109,13 +109,13 @@ z
</g>
<g id="xtick_3">
<g id="line2d_5">
- <path clip-path="url(#p5db5ac15e0)" d="M 165.513651 387.16
-L 165.513651 39.24
+ <path clip-path="url(#pa303fa7717)" d="M 166.005794 388.6
+L 166.005794 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="165.513651" xlink:href="#mfa61dcf6dd" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="166.005794" xlink:href="#mc5e2e8c3a3" y="388.6"/>
</g>
</g>
<g id="text_3">
@@ -146,7 +146,7 @@ Q 31.109375 20.453125 19.1875 8.296875
z
" id="DejaVuSans-50"/>
</defs>
- <g transform="translate(159.151151 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(159.643294 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -154,13 +154,13 @@ z
</g>
<g id="xtick_4">
<g id="line2d_7">
- <path clip-path="url(#p5db5ac15e0)" d="M 224.410476 387.16
-L 224.410476 39.24
+ <path clip-path="url(#pa303fa7717)" d="M 225.08119 388.6
+L 225.08119 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_8">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="224.410476" xlink:href="#mfa61dcf6dd" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="225.08119" xlink:href="#mc5e2e8c3a3" y="388.6"/>
</g>
</g>
<g id="text_4">
@@ -199,7 +199,7 @@ Q 46.96875 40.921875 40.578125 39.3125
z
" id="DejaVuSans-51"/>
</defs>
- <g transform="translate(218.047976 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(218.71869 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-51"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -207,13 +207,13 @@ z
</g>
<g id="xtick_5">
<g id="line2d_9">
- <path clip-path="url(#p5db5ac15e0)" d="M 283.307302 387.16
-L 283.307302 39.24
+ <path clip-path="url(#pa303fa7717)" d="M 284.156587 388.6
+L 284.156587 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_10">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="283.307302" xlink:href="#mfa61dcf6dd" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="284.156587" xlink:href="#mc5e2e8c3a3" y="388.6"/>
</g>
</g>
<g id="text_5">
@@ -237,7 +237,7 @@ L 4.890625 26.703125
z
" id="DejaVuSans-52"/>
</defs>
- <g transform="translate(276.944802 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(277.794087 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-52"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -245,13 +245,13 @@ z
</g>
<g id="xtick_6">
<g id="line2d_11">
- <path clip-path="url(#p5db5ac15e0)" d="M 342.204127 387.16
-L 342.204127 39.24
+ <path clip-path="url(#pa303fa7717)" d="M 343.231984 388.6
+L 343.231984 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_12">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="342.204127" xlink:href="#mfa61dcf6dd" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="343.231984" xlink:href="#mc5e2e8c3a3" y="388.6"/>
</g>
</g>
<g id="text_6">
@@ -282,7 +282,7 @@ Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-53"/>
</defs>
- <g transform="translate(335.841627 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(336.869484 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-53"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -290,13 +290,13 @@ z
</g>
<g id="xtick_7">
<g id="line2d_13">
- <path clip-path="url(#p5db5ac15e0)" d="M 401.100952 387.16
-L 401.100952 39.24
+ <path clip-path="url(#pa303fa7717)" d="M 402.307381 388.6
+L 402.307381 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_14">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="401.100952" xlink:href="#mfa61dcf6dd" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="402.307381" xlink:href="#mc5e2e8c3a3" y="388.6"/>
</g>
</g>
<g id="text_7">
@@ -333,7 +333,7 @@ Q 48.484375 72.75 52.59375 71.296875
z
" id="DejaVuSans-54"/>
</defs>
- <g transform="translate(394.738452 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(395.944881 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-54"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -523,7 +523,7 @@ Q 40.578125 54.546875 44.28125 53.078125
z
" id="DejaVuSans-115"/>
</defs>
- <g transform="translate(211.891875 415.436563)scale(0.1 -0.1)">
+ <g transform="translate(212.589375 416.876562)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-83"/>
<use x="63.476562" xlink:href="#DejaVuSans-97"/>
<use x="124.755859" xlink:href="#DejaVuSans-109"/>
@@ -537,18 +537,18 @@ z
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_15">
- <path clip-path="url(#p5db5ac15e0)" d="M 47.72 387.16
-L 418.77 387.16
+ <path clip-path="url(#pa303fa7717)" d="M 47.855 388.6
+L 420.03 388.6
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_16">
<defs>
<path d="M 0 0
L -3.5 0
-" id="ma05dc57272" style="stroke:#000000;stroke-width:0.8;"/>
+" id="md251959f01" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#ma05dc57272" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md251959f01" y="388.6"/>
</g>
</g>
<g id="text_9">
@@ -561,7 +561,7 @@ L 10.6875 0
z
" id="DejaVuSans-46"/>
</defs>
- <g transform="translate(24.816875 390.959219)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 392.399219)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -570,18 +570,18 @@ z
</g>
<g id="ytick_2">
<g id="line2d_17">
- <path clip-path="url(#p5db5ac15e0)" d="M 47.72 320.868919
-L 418.77 320.868919
+ <path clip-path="url(#pa303fa7717)" d="M 47.855 321.554399
+L 420.03 321.554399
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_18">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#ma05dc57272" y="320.868919"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md251959f01" y="321.554399"/>
</g>
</g>
<g id="text_10">
<!-- 0.2 -->
- <g transform="translate(24.816875 324.668138)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 325.353618)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -590,18 +590,18 @@ L 418.77 320.868919
</g>
<g id="ytick_3">
<g id="line2d_19">
- <path clip-path="url(#p5db5ac15e0)" d="M 47.72 254.577839
-L 418.77 254.577839
+ <path clip-path="url(#pa303fa7717)" d="M 47.855 254.508798
+L 420.03 254.508798
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_20">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#ma05dc57272" y="254.577839"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md251959f01" y="254.508798"/>
</g>
</g>
<g id="text_11">
<!-- 0.4 -->
- <g transform="translate(24.816875 258.377057)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 258.308017)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -610,18 +610,18 @@ L 418.77 254.577839
</g>
<g id="ytick_4">
<g id="line2d_21">
- <path clip-path="url(#p5db5ac15e0)" d="M 47.72 188.286758
-L 418.77 188.286758
+ <path clip-path="url(#pa303fa7717)" d="M 47.855 187.463197
+L 420.03 187.463197
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_22">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#ma05dc57272" y="188.286758"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md251959f01" y="187.463197"/>
</g>
</g>
<g id="text_12">
<!-- 0.6 -->
- <g transform="translate(24.816875 192.085977)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 191.262416)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -630,13 +630,13 @@ L 418.77 188.286758
</g>
<g id="ytick_5">
<g id="line2d_23">
- <path clip-path="url(#p5db5ac15e0)" d="M 47.72 121.995677
-L 418.77 121.995677
+ <path clip-path="url(#pa303fa7717)" d="M 47.855 120.417596
+L 420.03 120.417596
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_24">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#ma05dc57272" y="121.995677"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md251959f01" y="120.417596"/>
</g>
</g>
<g id="text_13">
@@ -682,7 +682,7 @@ Q 18.3125 60.0625 18.3125 54.390625
z
" id="DejaVuSans-56"/>
</defs>
- <g transform="translate(24.816875 125.794896)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 124.216815)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -691,18 +691,18 @@ z
</g>
<g id="ytick_6">
<g id="line2d_25">
- <path clip-path="url(#p5db5ac15e0)" d="M 47.72 55.704597
-L 418.77 55.704597
+ <path clip-path="url(#pa303fa7717)" d="M 47.855 53.371996
+L 420.03 53.371996
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_26">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#ma05dc57272" y="55.704597"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md251959f01" y="53.371996"/>
</g>
</g>
<g id="text_14">
<!-- 1.0 -->
- <g transform="translate(24.816875 59.503815)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 57.171214)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -805,7 +805,7 @@ Q 14.796875 37.203125 14.796875 27.296875
z
" id="DejaVuSans-100"/>
</defs>
- <g transform="translate(18.737188 238.822656)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(18.872187 238.282656)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-65"/>
<use x="68.408203" xlink:href="#DejaVuSans-109"/>
<use x="165.820312" xlink:href="#DejaVuSans-112"/>
@@ -819,70 +819,70 @@ z
</g>
</g>
<g id="line2d_27">
- <path clip-path="url(#p5db5ac15e0)" d="M 47.72 387.16
-L 53.609683 370.638312
-L 59.499365 354.157699
-L 65.389048 337.759136
-L 71.27873 321.48339
-L 77.168413 305.370927
-L 83.058095 289.461805
-L 88.947778 273.795575
-L 94.83746 258.411188
-L 100.727143 243.34689
-L 106.616825 228.640135
-L 112.506508 214.327484
-L 118.39619 200.444523
-L 124.285873 187.025766
-L 130.175556 174.104574
-L 136.065238 161.713071
-L 141.954921 149.882065
-L 147.844603 138.640969
-L 153.734286 128.017731
-L 159.623968 118.038761
-L 165.513651 108.728869
-L 171.403333 100.111201
-L 177.293016 92.207181
-L 183.182698 85.03646
-L 189.072381 78.616866
-L 194.962063 72.964359
-L 200.851746 68.092992
-L 206.741429 64.014876
-L 212.631111 60.740149
-L 218.520794 58.276954
-L 224.410476 56.631413
-L 230.300159 55.807619
-L 236.189841 55.807619
-L 242.079524 56.631413
-L 247.969206 58.276954
-L 253.858889 60.740149
-L 259.748571 64.014876
-L 265.638254 68.092992
-L 271.527937 72.964359
-L 277.417619 78.616866
-L 283.307302 85.03646
-L 289.196984 92.207181
-L 295.086667 100.111201
-L 300.976349 108.728869
-L 306.866032 118.038761
-L 312.755714 128.017731
-L 318.645397 138.640969
-L 324.535079 149.882065
-L 330.424762 161.713071
-L 336.314444 174.104574
-L 342.204127 187.025766
-L 348.09381 200.444523
-L 353.983492 214.327484
-L 359.873175 228.640135
-L 365.762857 243.34689
-L 371.65254 258.411188
-L 377.542222 273.795575
-L 383.431905 289.461805
-L 389.321587 305.370927
-L 395.21127 321.48339
-L 401.100952 337.759136
-L 406.990635 354.157699
-L 412.880317 370.638312
-L 418.77 387.16
+ <path clip-path="url(#pa303fa7717)" d="M 47.855 388.6
+L 53.76254 371.890263
+L 59.670079 355.222069
+L 65.577619 338.636859
+L 71.485159 322.175864
+L 77.392698 305.88001
+L 83.300238 289.789811
+L 89.207778 273.94527
+L 95.115317 258.385778
+L 101.022857 243.15002
+L 106.930397 228.275873
+L 112.837937 213.800317
+L 118.745476 199.759341
+L 124.653016 186.187852
+L 130.560556 173.119592
+L 136.468095 160.58705
+L 142.375635 148.621385
+L 148.283175 137.252344
+L 154.190714 126.508192
+L 160.098254 116.415643
+L 166.005794 106.999786
+L 171.913333 98.284032
+L 177.820873 90.290049
+L 183.728413 83.037712
+L 189.635952 76.545051
+L 195.543492 70.828207
+L 201.451032 65.901395
+L 207.358571 61.776862
+L 213.266111 58.464862
+L 219.173651 55.973631
+L 225.08119 54.309361
+L 230.98873 53.47619
+L 236.89627 53.47619
+L 242.80381 54.309361
+L 248.711349 55.973631
+L 254.618889 58.464862
+L 260.526429 61.776862
+L 266.433968 65.901395
+L 272.341508 70.828207
+L 278.249048 76.545051
+L 284.156587 83.037712
+L 290.064127 90.290049
+L 295.971667 98.284032
+L 301.879206 106.999786
+L 307.786746 116.415643
+L 313.694286 126.508192
+L 319.601825 137.252344
+L 325.509365 148.621385
+L 331.416905 160.58705
+L 337.324444 173.119592
+L 343.231984 186.187852
+L 349.139524 199.759341
+L 355.047063 213.800317
+L 360.954603 228.275873
+L 366.862143 243.15002
+L 372.769683 258.385778
+L 378.677222 273.94527
+L 384.584762 289.789811
+L 390.492302 305.88001
+L 396.399841 322.175864
+L 402.307381 338.636859
+L 408.214921 355.222069
+L 414.12246 371.890263
+L 420.03 388.6
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
<defs>
<path d="M 0 1.5
@@ -895,120 +895,120 @@ C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0
C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066
C -0.77937 1.341951 -0.397805 1.5 0 1.5
z
-" id="mddf2bbd99e" style="stroke:#0072bd;"/>
+" id="ma19ffd6759" style="stroke:#0072bd;"/>
</defs>
- <g clip-path="url(#p5db5ac15e0)">
- <use style="fill:#0072bd;stroke:#0072bd;" x="47.72" xlink:href="#mddf2bbd99e" y="387.16"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="53.609683" xlink:href="#mddf2bbd99e" y="370.638312"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="59.499365" xlink:href="#mddf2bbd99e" y="354.157699"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="65.389048" xlink:href="#mddf2bbd99e" y="337.759136"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="71.27873" xlink:href="#mddf2bbd99e" y="321.48339"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="77.168413" xlink:href="#mddf2bbd99e" y="305.370927"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="83.058095" xlink:href="#mddf2bbd99e" y="289.461805"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="88.947778" xlink:href="#mddf2bbd99e" y="273.795575"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="94.83746" xlink:href="#mddf2bbd99e" y="258.411188"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="100.727143" xlink:href="#mddf2bbd99e" y="243.34689"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="106.616825" xlink:href="#mddf2bbd99e" y="228.640135"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="112.506508" xlink:href="#mddf2bbd99e" y="214.327484"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="118.39619" xlink:href="#mddf2bbd99e" y="200.444523"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="124.285873" xlink:href="#mddf2bbd99e" y="187.025766"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="130.175556" xlink:href="#mddf2bbd99e" y="174.104574"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="136.065238" xlink:href="#mddf2bbd99e" y="161.713071"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="141.954921" xlink:href="#mddf2bbd99e" y="149.882065"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="147.844603" xlink:href="#mddf2bbd99e" y="138.640969"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="153.734286" xlink:href="#mddf2bbd99e" y="128.017731"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="159.623968" xlink:href="#mddf2bbd99e" y="118.038761"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="165.513651" xlink:href="#mddf2bbd99e" y="108.728869"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="171.403333" xlink:href="#mddf2bbd99e" y="100.111201"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="177.293016" xlink:href="#mddf2bbd99e" y="92.207181"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="183.182698" xlink:href="#mddf2bbd99e" y="85.03646"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="189.072381" xlink:href="#mddf2bbd99e" y="78.616866"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="194.962063" xlink:href="#mddf2bbd99e" y="72.964359"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="200.851746" xlink:href="#mddf2bbd99e" y="68.092992"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="206.741429" xlink:href="#mddf2bbd99e" y="64.014876"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="212.631111" xlink:href="#mddf2bbd99e" y="60.740149"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="218.520794" xlink:href="#mddf2bbd99e" y="58.276954"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="224.410476" xlink:href="#mddf2bbd99e" y="56.631413"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="230.300159" xlink:href="#mddf2bbd99e" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="236.189841" xlink:href="#mddf2bbd99e" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="242.079524" xlink:href="#mddf2bbd99e" y="56.631413"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="247.969206" xlink:href="#mddf2bbd99e" y="58.276954"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="253.858889" xlink:href="#mddf2bbd99e" y="60.740149"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="259.748571" xlink:href="#mddf2bbd99e" y="64.014876"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="265.638254" xlink:href="#mddf2bbd99e" y="68.092992"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="271.527937" xlink:href="#mddf2bbd99e" y="72.964359"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="277.417619" xlink:href="#mddf2bbd99e" y="78.616866"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="283.307302" xlink:href="#mddf2bbd99e" y="85.03646"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="289.196984" xlink:href="#mddf2bbd99e" y="92.207181"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="295.086667" xlink:href="#mddf2bbd99e" y="100.111201"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="300.976349" xlink:href="#mddf2bbd99e" y="108.728869"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="306.866032" xlink:href="#mddf2bbd99e" y="118.038761"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="312.755714" xlink:href="#mddf2bbd99e" y="128.017731"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="318.645397" xlink:href="#mddf2bbd99e" y="138.640969"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="324.535079" xlink:href="#mddf2bbd99e" y="149.882065"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="330.424762" xlink:href="#mddf2bbd99e" y="161.713071"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="336.314444" xlink:href="#mddf2bbd99e" y="174.104574"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="342.204127" xlink:href="#mddf2bbd99e" y="187.025766"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="348.09381" xlink:href="#mddf2bbd99e" y="200.444523"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="353.983492" xlink:href="#mddf2bbd99e" y="214.327484"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="359.873175" xlink:href="#mddf2bbd99e" y="228.640135"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="365.762857" xlink:href="#mddf2bbd99e" y="243.34689"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="371.65254" xlink:href="#mddf2bbd99e" y="258.411188"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="377.542222" xlink:href="#mddf2bbd99e" y="273.795575"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="383.431905" xlink:href="#mddf2bbd99e" y="289.461805"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="389.321587" xlink:href="#mddf2bbd99e" y="305.370927"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="395.21127" xlink:href="#mddf2bbd99e" y="321.48339"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="401.100952" xlink:href="#mddf2bbd99e" y="337.759136"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="406.990635" xlink:href="#mddf2bbd99e" y="354.157699"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="412.880317" xlink:href="#mddf2bbd99e" y="370.638312"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="418.77" xlink:href="#mddf2bbd99e" y="387.16"/>
+ <g clip-path="url(#pa303fa7717)">
+ <use style="fill:#0072bd;stroke:#0072bd;" x="47.855" xlink:href="#ma19ffd6759" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="53.76254" xlink:href="#ma19ffd6759" y="371.890263"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="59.670079" xlink:href="#ma19ffd6759" y="355.222069"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="65.577619" xlink:href="#ma19ffd6759" y="338.636859"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="71.485159" xlink:href="#ma19ffd6759" y="322.175864"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="77.392698" xlink:href="#ma19ffd6759" y="305.88001"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="83.300238" xlink:href="#ma19ffd6759" y="289.789811"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="89.207778" xlink:href="#ma19ffd6759" y="273.94527"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="95.115317" xlink:href="#ma19ffd6759" y="258.385778"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="101.022857" xlink:href="#ma19ffd6759" y="243.15002"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="106.930397" xlink:href="#ma19ffd6759" y="228.275873"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="112.837937" xlink:href="#ma19ffd6759" y="213.800317"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="118.745476" xlink:href="#ma19ffd6759" y="199.759341"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="124.653016" xlink:href="#ma19ffd6759" y="186.187852"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="130.560556" xlink:href="#ma19ffd6759" y="173.119592"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="136.468095" xlink:href="#ma19ffd6759" y="160.58705"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="142.375635" xlink:href="#ma19ffd6759" y="148.621385"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="148.283175" xlink:href="#ma19ffd6759" y="137.252344"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="154.190714" xlink:href="#ma19ffd6759" y="126.508192"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="160.098254" xlink:href="#ma19ffd6759" y="116.415643"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="166.005794" xlink:href="#ma19ffd6759" y="106.999786"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="171.913333" xlink:href="#ma19ffd6759" y="98.284032"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="177.820873" xlink:href="#ma19ffd6759" y="90.290049"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="183.728413" xlink:href="#ma19ffd6759" y="83.037712"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="189.635952" xlink:href="#ma19ffd6759" y="76.545051"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="195.543492" xlink:href="#ma19ffd6759" y="70.828207"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="201.451032" xlink:href="#ma19ffd6759" y="65.901395"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="207.358571" xlink:href="#ma19ffd6759" y="61.776862"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="213.266111" xlink:href="#ma19ffd6759" y="58.464862"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="219.173651" xlink:href="#ma19ffd6759" y="55.973631"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="225.08119" xlink:href="#ma19ffd6759" y="54.309361"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="230.98873" xlink:href="#ma19ffd6759" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="236.89627" xlink:href="#ma19ffd6759" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="242.80381" xlink:href="#ma19ffd6759" y="54.309361"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="248.711349" xlink:href="#ma19ffd6759" y="55.973631"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="254.618889" xlink:href="#ma19ffd6759" y="58.464862"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="260.526429" xlink:href="#ma19ffd6759" y="61.776862"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="266.433968" xlink:href="#ma19ffd6759" y="65.901395"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="272.341508" xlink:href="#ma19ffd6759" y="70.828207"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="278.249048" xlink:href="#ma19ffd6759" y="76.545051"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="284.156587" xlink:href="#ma19ffd6759" y="83.037712"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="290.064127" xlink:href="#ma19ffd6759" y="90.290049"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="295.971667" xlink:href="#ma19ffd6759" y="98.284032"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="301.879206" xlink:href="#ma19ffd6759" y="106.999786"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="307.786746" xlink:href="#ma19ffd6759" y="116.415643"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="313.694286" xlink:href="#ma19ffd6759" y="126.508192"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="319.601825" xlink:href="#ma19ffd6759" y="137.252344"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="325.509365" xlink:href="#ma19ffd6759" y="148.621385"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="331.416905" xlink:href="#ma19ffd6759" y="160.58705"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="337.324444" xlink:href="#ma19ffd6759" y="173.119592"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="343.231984" xlink:href="#ma19ffd6759" y="186.187852"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="349.139524" xlink:href="#ma19ffd6759" y="199.759341"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="355.047063" xlink:href="#ma19ffd6759" y="213.800317"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="360.954603" xlink:href="#ma19ffd6759" y="228.275873"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="366.862143" xlink:href="#ma19ffd6759" y="243.15002"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="372.769683" xlink:href="#ma19ffd6759" y="258.385778"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="378.677222" xlink:href="#ma19ffd6759" y="273.94527"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="384.584762" xlink:href="#ma19ffd6759" y="289.789811"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="390.492302" xlink:href="#ma19ffd6759" y="305.88001"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="396.399841" xlink:href="#ma19ffd6759" y="322.175864"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="402.307381" xlink:href="#ma19ffd6759" y="338.636859"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="408.214921" xlink:href="#ma19ffd6759" y="355.222069"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="414.12246" xlink:href="#ma19ffd6759" y="371.890263"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="420.03" xlink:href="#ma19ffd6759" y="388.6"/>
</g>
</g>
<g id="patch_3">
- <path d="M 47.72 387.16
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
- <path d="M 418.77 387.16
-L 418.77 39.24
+ <path d="M 420.03 388.6
+L 420.03 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
- <path d="M 47.72 387.16
-L 418.77 387.16
+ <path d="M 47.855 388.6
+L 420.03 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
- <path d="M 47.72 39.24
-L 418.77 39.24
+ <path d="M 47.855 36.72
+L 420.03 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
<g id="axes_2">
<g id="patch_7">
- <path d="M 474.23 387.16
-L 845.28 387.16
-L 845.28 39.24
-L 474.23 39.24
+ <path d="M 473.06 388.6
+L 845.235 388.6
+L 845.235 36.72
+L 473.06 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_3">
<g id="xtick_8">
<g id="line2d_28">
- <path clip-path="url(#pb3dc7ea038)" d="M 474.23 387.16
-L 474.23 39.24
+ <path clip-path="url(#p0ffc0990a4)" d="M 473.06 388.6
+L 473.06 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_29">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#mfa61dcf6dd" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#mc5e2e8c3a3" y="388.6"/>
</g>
</g>
<g id="text_16">
<!-- 0.0 -->
- <g transform="translate(466.278437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(465.108437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1017,18 +1017,18 @@ L 474.23 39.24
</g>
<g id="xtick_9">
<g id="line2d_30">
- <path clip-path="url(#pb3dc7ea038)" d="M 548.44 387.16
-L 548.44 39.24
+ <path clip-path="url(#p0ffc0990a4)" d="M 547.495 388.6
+L 547.495 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_31">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="548.44" xlink:href="#mfa61dcf6dd" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.495" xlink:href="#mc5e2e8c3a3" y="388.6"/>
</g>
</g>
<g id="text_17">
<!-- 0.2 -->
- <g transform="translate(540.488437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(539.543437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -1037,18 +1037,18 @@ L 548.44 39.24
</g>
<g id="xtick_10">
<g id="line2d_32">
- <path clip-path="url(#pb3dc7ea038)" d="M 622.65 387.16
-L 622.65 39.24
+ <path clip-path="url(#p0ffc0990a4)" d="M 621.93 388.6
+L 621.93 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_33">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="622.65" xlink:href="#mfa61dcf6dd" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="621.93" xlink:href="#mc5e2e8c3a3" y="388.6"/>
</g>
</g>
<g id="text_18">
<!-- 0.4 -->
- <g transform="translate(614.698437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(613.978437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -1057,18 +1057,18 @@ L 622.65 39.24
</g>
<g id="xtick_11">
<g id="line2d_34">
- <path clip-path="url(#pb3dc7ea038)" d="M 696.86 387.16
-L 696.86 39.24
+ <path clip-path="url(#p0ffc0990a4)" d="M 696.365 388.6
+L 696.365 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_35">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="696.86" xlink:href="#mfa61dcf6dd" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="696.365" xlink:href="#mc5e2e8c3a3" y="388.6"/>
</g>
</g>
<g id="text_19">
<!-- 0.6 -->
- <g transform="translate(688.908437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(688.413437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -1077,18 +1077,18 @@ L 696.86 39.24
</g>
<g id="xtick_12">
<g id="line2d_36">
- <path clip-path="url(#pb3dc7ea038)" d="M 771.07 387.16
-L 771.07 39.24
+ <path clip-path="url(#p0ffc0990a4)" d="M 770.8 388.6
+L 770.8 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_37">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="771.07" xlink:href="#mfa61dcf6dd" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="770.8" xlink:href="#mc5e2e8c3a3" y="388.6"/>
</g>
</g>
<g id="text_20">
<!-- 0.8 -->
- <g transform="translate(763.118437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(762.848437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -1097,18 +1097,18 @@ L 771.07 39.24
</g>
<g id="xtick_13">
<g id="line2d_38">
- <path clip-path="url(#pb3dc7ea038)" d="M 845.28 387.16
-L 845.28 39.24
+ <path clip-path="url(#p0ffc0990a4)" d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_39">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="845.28" xlink:href="#mfa61dcf6dd" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="845.235" xlink:href="#mc5e2e8c3a3" y="388.6"/>
</g>
</g>
<g id="text_21">
<!-- 1.0 -->
- <g transform="translate(837.328437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(837.283437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1341,7 +1341,7 @@ Q 14.5 64.65625 8.015625 75.875
z
" id="DejaVuSans-41"/>
</defs>
- <g transform="translate(560.955 415.438125)scale(0.1 -0.1)">
+ <g transform="translate(560.3475 416.878125)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-78"/>
<use transform="translate(74.804688 0.015625)" xlink:href="#DejaVuSans-111"/>
<use transform="translate(135.986328 0.015625)" xlink:href="#DejaVuSans-114"/>
@@ -1384,13 +1384,13 @@ z
<g id="matplotlib.axis_4">
<g id="ytick_7">
<g id="line2d_40">
- <path clip-path="url(#pb3dc7ea038)" d="M 474.23 365.860358
-L 845.28 365.860358
+ <path clip-path="url(#p0ffc0990a4)" d="M 473.06 367.057927
+L 845.235 367.057927
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_41">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#ma05dc57272" y="365.860358"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#md251959f01" y="367.057927"/>
</g>
</g>
<g id="text_23">
@@ -1403,7 +1403,7 @@ L 10.59375 27.203125
z
" id="DejaVuSans-8722"/>
</defs>
- <g transform="translate(446.125312 369.659577)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 370.857146)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-56"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1412,18 +1412,18 @@ z
</g>
<g id="ytick_8">
<g id="line2d_42">
- <path clip-path="url(#pb3dc7ea038)" d="M 474.23 310.390331
-L 845.28 310.390331
+ <path clip-path="url(#p0ffc0990a4)" d="M 473.06 310.956544
+L 845.235 310.956544
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_43">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#ma05dc57272" y="310.390331"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#md251959f01" y="310.956544"/>
</g>
</g>
<g id="text_24">
<!-- −60 -->
- <g transform="translate(446.125312 314.189549)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 314.755763)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-54"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1432,18 +1432,18 @@ L 845.28 310.390331
</g>
<g id="ytick_9">
<g id="line2d_44">
- <path clip-path="url(#pb3dc7ea038)" d="M 474.23 254.920303
-L 845.28 254.920303
+ <path clip-path="url(#p0ffc0990a4)" d="M 473.06 254.855161
+L 845.235 254.855161
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_45">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#ma05dc57272" y="254.920303"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#md251959f01" y="254.855161"/>
</g>
</g>
<g id="text_25">
<!-- −40 -->
- <g transform="translate(446.125312 258.719522)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 258.654379)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-52"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1452,18 +1452,18 @@ L 845.28 254.920303
</g>
<g id="ytick_10">
<g id="line2d_46">
- <path clip-path="url(#pb3dc7ea038)" d="M 474.23 199.450275
-L 845.28 199.450275
+ <path clip-path="url(#p0ffc0990a4)" d="M 473.06 198.753777
+L 845.235 198.753777
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_47">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#ma05dc57272" y="199.450275"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#md251959f01" y="198.753777"/>
</g>
</g>
<g id="text_26">
<!-- −20 -->
- <g transform="translate(446.125312 203.249494)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 202.552996)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-50"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1472,36 +1472,36 @@ L 845.28 199.450275
</g>
<g id="ytick_11">
<g id="line2d_48">
- <path clip-path="url(#pb3dc7ea038)" d="M 474.23 143.980248
-L 845.28 143.980248
+ <path clip-path="url(#p0ffc0990a4)" d="M 473.06 142.652394
+L 845.235 142.652394
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_49">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#ma05dc57272" y="143.980248"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#md251959f01" y="142.652394"/>
</g>
</g>
<g id="text_27">
<!-- 0 -->
- <g transform="translate(460.8675 147.779466)scale(0.1 -0.1)">
+ <g transform="translate(459.6975 146.451612)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_12">
<g id="line2d_50">
- <path clip-path="url(#pb3dc7ea038)" d="M 474.23 88.51022
-L 845.28 88.51022
+ <path clip-path="url(#p0ffc0990a4)" d="M 473.06 86.55101
+L 845.235 86.55101
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_51">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#ma05dc57272" y="88.51022"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#md251959f01" y="86.55101"/>
</g>
</g>
<g id="text_28">
<!-- 20 -->
- <g transform="translate(454.505 92.309439)scale(0.1 -0.1)">
+ <g transform="translate(453.335 90.350229)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -1565,7 +1565,7 @@ L 9.8125 0
z
" id="DejaVuSans-66"/>
</defs>
- <g transform="translate(440.045625 236.791406)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(438.875625 236.251406)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-71"/>
<use x="77.490234" xlink:href="#DejaVuSans-97"/>
<use x="138.769531" xlink:href="#DejaVuSans-105"/>
@@ -1579,530 +1579,530 @@ z
</g>
</g>
<g id="line2d_52">
- <path clip-path="url(#pb3dc7ea038)" d="M 474.23 55.054545
-L 474.954707 55.13975
-L 475.679414 55.395854
-L 476.404121 55.824338
-L 477.128828 56.42772
-L 477.853535 57.209637
-L 478.578242 58.174959
-L 480.027656 60.682549
-L 481.47707 64.022278
-L 482.926484 68.305244
-L 484.375898 73.705999
-L 485.825312 80.513063
-L 487.274727 89.249255
-L 487.999434 94.642389
-L 488.724141 101.023629
-L 489.448848 108.84096
-L 490.173555 119.017346
-L 490.898262 134.030334
-L 491.622969 167.116029
-L 492.347676 157.662233
-L 493.072383 136.938117
-L 493.79709 127.997911
-L 494.521797 123.082752
-L 495.246504 120.333589
-L 495.971211 119.023235
-L 496.695918 118.808699
-L 497.420625 119.521
-L 498.145332 121.090453
-L 498.870039 123.520556
-L 499.594746 126.887891
-L 500.319453 131.36786
-L 501.04416 137.308409
-L 501.768867 145.436704
-L 502.493574 157.58984
-L 503.218281 181.301676
-L 503.942988 195.825913
-L 504.667695 165.515539
-L 505.392402 154.010612
-L 506.117109 147.534714
-L 506.841816 143.586073
-L 507.566523 141.258483
-L 508.29123 140.135924
-L 509.015937 140.011115
-L 509.740645 140.789284
-L 510.465352 142.453072
-L 511.190059 145.056449
-L 511.914766 148.742867
-L 512.639473 153.802598
-L 513.36418 160.829586
-L 514.088887 171.233578
-L 514.813594 189.852019
-L 515.538301 240.691905
-L 516.263008 186.251805
-L 516.987715 172.10708
-L 517.712422 164.379301
-L 518.437129 159.58784
-L 519.161836 156.594524
-L 519.886543 154.898045
-L 520.61125 154.250381
-L 521.335957 154.532377
-L 522.060664 155.707897
-L 522.785371 157.811542
-L 523.510078 160.960138
-L 524.234785 165.397118
-L 524.959492 171.612961
-L 525.684199 180.713804
-L 526.408906 196.032537
-L 527.133613 246.595827
-L 527.85832 204.191489
-L 528.583027 186.617572
-L 529.307734 177.591626
-L 530.032441 172.024682
-L 530.757148 168.462548
-L 531.481855 166.297586
-L 532.206562 165.234164
-L 532.93127 165.126416
-L 533.655977 165.919081
-L 534.380684 167.628468
-L 535.105391 170.347795
-L 535.830098 174.281097
-L 536.554805 179.836459
-L 537.279512 187.897163
-L 538.004219 200.87215
-L 538.728926 231.454745
-L 539.453633 221.928061
-L 540.17834 199.234057
-L 540.903047 188.711621
-L 541.627754 182.345803
-L 542.352461 178.237106
-L 543.077168 175.642234
-L 543.801875 174.208574
-L 544.526582 173.760109
-L 545.251289 174.221408
-L 545.975996 175.590915
-L 546.700703 177.940404
-L 547.42541 181.44016
-L 548.150117 186.431501
-L 548.874824 193.62981
-L 549.599531 204.838518
-L 550.324238 227.363622
-L 551.048945 242.758653
-L 551.773652 210.892162
-L 552.498359 198.526886
-L 553.223066 191.286504
-L 553.947773 186.618752
-L 554.67248 183.603626
-L 555.397187 181.819182
-L 556.121895 181.054742
-L 556.846602 181.213118
-L 557.571309 182.2749
-L 558.296016 184.291988
-L 559.020723 187.405301
-L 559.74543 191.901213
-L 560.470137 198.365785
-L 561.194844 208.186112
-L 561.919551 226.079444
-L 562.644258 280.572043
-L 563.368965 222.290293
-L 564.093672 207.5179
-L 564.818379 199.279999
-L 565.543086 194.017743
-L 566.267793 190.575624
-L 566.9925 188.445994
-L 567.717207 187.377712
-L 568.441914 187.24969
-L 569.166621 188.024282
-L 569.891328 189.734612
-L 570.616035 192.495654
-L 571.340742 196.5479
-L 572.065449 202.375859
-L 572.790156 211.069447
-L 573.514863 225.890324
-L 574.23957 273.911515
-L 574.964277 234.166265
-L 575.688984 216.025994
-L 576.413691 206.610879
-L 577.138398 200.698434
-L 577.863105 196.810834
-L 578.587812 194.332745
-L 579.31252 192.965103
-L 580.037227 192.560106
-L 580.761934 193.061111
-L 581.486641 194.483151
-L 582.211348 196.917905
-L 582.936055 200.567007
-L 583.660762 205.833826
-L 584.385469 213.589617
-L 585.110176 226.197809
-L 585.834883 255.858583
-L 586.55959 247.674206
-L 587.284297 224.33651
-L 588.009004 213.484598
-L 588.733711 206.844338
-L 589.458418 202.482483
-L 590.183125 199.64595
-L 590.907832 197.978098
-L 591.632539 197.300801
-L 592.357246 197.537232
-L 593.081953 198.684643
-L 593.80666 200.813445
-L 594.531367 204.091894
-L 595.256074 208.857485
-L 595.980781 215.816453
-L 596.705488 226.741531
-L 597.430195 248.722683
-L 598.154902 265.627762
-L 598.879609 232.737207
-L 599.604316 220.064223
-L 600.329023 212.591417
-L 601.05373 207.716004
-L 601.778437 204.505155
-L 602.503145 202.532043
-L 603.227852 201.583593
-L 603.952559 201.561144
-L 604.677266 202.444112
-L 605.401973 204.283148
-L 606.12668 207.217411
-L 606.851387 211.530122
-L 607.576094 217.800228
-L 608.300801 227.393247
-L 609.025508 244.910973
-L 609.750215 304.06017
-L 610.474922 241.585246
-L 611.199629 226.493453
-L 611.924336 218.04696
-L 612.649043 212.606675
-L 613.37375 208.999819
-L 614.098457 206.712693
-L 614.823164 205.491368
-L 615.547871 205.213141
-L 616.272578 205.839177
-L 616.997285 207.401422
-L 617.721992 210.013293
-L 618.446699 213.912638
-L 619.171406 219.57833
-L 619.896113 228.084612
-L 620.62082 242.624229
-L 621.345527 288.548635
-L 622.070234 251.431207
-L 622.794941 232.914814
-L 623.519648 223.301451
-L 624.244355 217.230242
-L 624.969062 213.199395
-L 625.69377 210.585925
-L 626.418477 209.087456
-L 627.143184 208.554385
-L 627.867891 208.928826
-L 628.592598 210.224676
-L 629.317305 212.532209
-L 630.042012 216.050809
-L 630.766719 221.179304
-L 631.491426 228.777248
-L 632.216133 241.163829
-L 632.94084 270.075337
-L 633.665547 263.351993
-L 634.390254 239.48914
-L 635.114961 228.437021
-L 635.839668 221.649783
-L 636.564375 217.159705
-L 637.289082 214.203834
-L 638.013789 212.421534
-L 638.738496 211.632625
-L 639.463203 211.758956
-L 640.18791 212.796656
-L 640.912617 214.814847
-L 641.637324 217.979837
-L 642.362031 222.625411
-L 643.086738 229.448858
-L 643.811445 240.192976
-L 645.260859 280.29446
-L 645.985566 246.423993
-L 646.710273 233.53456
-L 647.43498 225.920507
-L 648.159687 220.927186
-L 648.884395 217.608758
-L 649.609102 215.533494
-L 650.333809 214.485945
-L 651.058516 214.366005
-L 651.783223 215.151957
-L 652.50793 216.893245
-L 653.232637 219.727322
-L 653.957344 223.934324
-L 654.682051 230.086226
-L 655.406758 239.527449
-L 656.131465 256.748325
-L 656.856172 321.60231
-L 657.580879 254.026672
-L 658.305586 238.681096
-L 659.030293 230.093456
-L 659.755 224.541892
-L 660.479707 220.836039
-L 661.204414 218.456088
-L 661.929121 217.145315
-L 662.653828 216.779421
-L 663.378535 217.3184
-L 664.103242 218.793047
-L 664.827949 221.315256
-L 665.552656 225.12028
-L 666.277363 230.681456
-L 667.00207 239.057666
-L 667.726777 253.374774
-L 668.451484 297.452648
-L 669.176191 262.825881
-L 669.900898 243.979264
-L 670.625605 234.218735
-L 671.350312 228.039733
-L 672.07502 223.915994
-L 672.799727 221.216778
-L 673.524434 219.636377
-L 674.249141 219.02339
-L 674.973848 219.318696
-L 675.698555 220.535073
-L 676.423262 222.761416
-L 677.147969 226.19489
-L 677.872676 231.229857
-L 678.597383 238.714384
-L 679.32209 250.92456
-L 680.046797 279.159511
-L 680.771504 273.924708
-L 681.496211 249.561924
-L 682.220918 238.34881
-L 682.945625 231.454311
-L 683.670332 226.875398
-L 684.395039 223.839096
-L 685.119746 221.980732
-L 685.844453 221.11807
-L 686.56916 221.171635
-L 687.293867 222.136441
-L 688.018574 224.08034
-L 688.743281 227.167718
-L 689.467988 231.728701
-L 690.192695 238.451787
-L 690.917402 249.050524
-L 692.366816 290.492562
-L 693.091523 255.618259
-L 693.81623 242.54244
-L 694.540937 234.818549
-L 695.265645 229.738648
-L 695.990352 226.343658
-L 696.715059 224.19689
-L 697.439766 223.080504
-L 698.164473 222.89295
-L 698.88918 223.611381
-L 699.613887 225.284047
-L 700.338594 228.04671
-L 701.063301 232.176467
-L 701.788008 238.238427
-L 702.512715 247.556354
-L 703.237422 264.51291
-L 703.962129 336.64639
-L 704.686836 262.447179
-L 705.411543 246.870063
-L 706.13625 238.16635
-L 706.860957 232.528748
-L 707.585664 228.748965
-L 708.310371 226.300996
-L 709.035078 224.925301
-L 709.759785 224.495975
-L 710.484492 224.971843
-L 711.209199 226.382558
-L 711.933906 228.838506
-L 712.658613 232.572373
-L 713.38332 238.052043
-L 714.108027 246.321332
-L 714.832734 260.44115
-L 715.557441 302.858018
-L 716.282148 270.584962
-L 717.006855 251.42211
-L 717.731562 241.53447
-L 718.45627 235.26821
-L 719.180977 231.072054
-L 719.905684 228.307395
-L 720.630391 226.665158
-L 721.355098 225.992128
-L 722.079805 226.227955
-L 722.804512 227.384297
-L 723.529219 229.548681
-L 724.253926 232.916081
-L 724.978633 237.876452
-L 725.70334 245.266572
-L 726.428047 257.320527
-L 727.152754 284.924834
-L 727.877461 281.185364
-L 728.602168 256.32314
-L 729.326875 244.964906
-L 730.051582 237.979946
-L 730.776289 233.329062
-L 731.500996 230.22909
-L 732.225703 228.311273
-L 732.95041 227.391299
-L 733.675117 227.388369
-L 734.399824 228.296384
-L 735.124531 230.181933
-L 735.849238 233.207499
-L 736.573945 237.699594
-L 737.298652 244.338069
-L 738.023359 254.807883
-L 739.472773 297.685057
-L 740.19748 261.758356
-L 740.922187 248.50823
-L 741.646895 240.688266
-L 742.371602 235.535751
-L 743.096309 232.078126
-L 743.821016 229.873676
-L 744.545723 228.702146
-L 745.27043 228.460539
-L 745.995137 229.124876
-L 746.719844 230.742218
-L 747.444551 233.446655
-L 748.169258 237.512274
-L 748.893965 243.497427
-L 749.618672 252.70564
-L 750.343379 269.415523
-L 751.068086 351.671648
-L 751.792793 268.029236
-L 752.5175 252.228639
-L 753.242207 243.420067
-L 753.966914 237.708025
-L 754.691621 233.86593
-L 755.416328 231.361498
-L 756.141035 229.932338
-L 756.865742 229.450934
-L 757.590449 229.87494
-L 758.315156 231.232869
-L 759.039863 233.633608
-L 759.76457 237.307309
-L 760.489277 242.716476
-L 761.213984 250.890138
-L 761.938691 264.826118
-L 762.663398 305.731192
-L 763.388105 275.688816
-L 764.112813 256.21217
-L 764.83752 246.206391
-L 765.562227 239.862491
-L 766.286934 235.60363
-L 767.011641 232.783211
-L 767.736348 231.08875
-L 768.461055 230.365211
-L 769.185762 230.551004
-L 769.910469 231.656675
-L 770.635176 233.768391
-L 771.359883 237.078952
-L 772.08459 241.973966
-L 772.809297 249.279118
-L 773.534004 261.187541
-L 774.258711 288.195774
-L 774.983418 285.952482
-L 775.708125 260.581098
-L 776.432832 249.0846
-L 777.157539 242.017109
-L 777.882246 237.302362
-L 778.606953 234.146833
-L 779.33166 232.177632
-L 780.056367 231.208353
-L 780.781074 231.156864
-L 781.505781 232.015958
-L 782.230488 233.850964
-L 782.955195 236.822481
-L 783.679902 241.25345
-L 784.404609 247.81521
-L 785.129316 258.164776
-L 785.854023 278.615252
-L 786.57873 302.564118
-L 787.303437 265.52142
-L 788.028145 252.101595
-L 788.752852 244.192001
-L 789.477559 238.973607
-L 790.202266 235.460126
-L 790.926973 233.20475
-L 791.65168 231.984787
-L 792.376387 231.695781
-L 793.101094 232.312622
-L 793.825801 233.881189
-L 794.550508 236.533907
-L 795.275215 240.541892
-L 795.999922 246.456835
-L 796.724629 255.562438
-L 797.449336 272.036715
-L 798.174043 371.345455
-L 798.89875 271.341214
-L 799.623457 255.318859
-L 800.348164 246.410507
-L 801.072871 240.629563
-L 801.797578 236.730785
-L 802.522285 234.175513
-L 803.246992 232.698482
-L 803.971699 232.17055
-L 804.696406 232.548196
-L 805.421113 233.858797
-L 806.14582 236.209754
-L 806.870527 239.828707
-L 807.595234 245.172855
-L 808.319941 253.256716
-L 809.044648 267.016813
-L 809.769355 306.534316
-L 810.494062 278.614436
-L 811.21877 258.820825
-L 811.943477 248.700662
-L 812.668184 242.283592
-L 813.392891 237.966642
-L 814.117598 235.095097
-L 814.842305 233.35303
-L 815.567012 232.583563
-L 816.291719 232.723867
-L 817.016426 233.783374
-L 817.741133 235.846897
-L 818.46584 239.105088
-L 819.190547 243.939259
-L 819.915254 251.164193
-L 820.639961 262.933091
-L 821.364668 289.373403
-L 822.089375 288.625746
-L 822.814082 262.729739
-L 823.538789 251.097318
-L 824.263496 243.950786
-L 824.988203 239.175886
-L 825.71291 235.968556
-L 826.437617 233.95172
-L 827.162324 232.93686
-L 827.887031 232.840506
-L 828.611738 233.654339
-L 829.336445 235.442436
-L 830.061152 238.363526
-L 830.785859 242.737024
-L 831.510566 249.225891
-L 832.235273 259.459819
-L 832.95998 279.577078
-L 833.684687 305.469454
-L 834.409395 267.234278
-L 835.134102 253.645379
-L 835.858809 245.648709
-L 836.583516 240.367322
-L 837.308223 236.800945
-L 838.03293 234.497611
-L 838.757637 233.232165
-L 839.482344 232.898684
-L 840.207051 233.470926
-L 840.931758 234.993588
-L 841.656465 237.597449
-L 842.381172 241.550682
-L 843.105879 247.398415
-L 843.830586 256.404926
-L 844.555293 272.650938
-L 844.555293 272.650938
+ <path clip-path="url(#p0ffc0990a4)" d="M 473.06 52.714545
+L 473.786904 52.80072
+L 474.513809 53.059739
+L 475.240713 53.4931
+L 475.967617 54.10335
+L 476.694521 54.894166
+L 477.421426 55.870475
+L 478.875234 58.406606
+L 480.329043 61.784348
+L 481.782852 66.116063
+L 483.23666 71.578288
+L 484.690469 78.46283
+L 486.144277 87.298456
+L 486.871182 92.752975
+L 487.598086 99.206846
+L 488.32499 107.113153
+L 489.051895 117.405366
+L 489.778799 132.589231
+L 490.505703 166.051505
+L 491.232607 156.490106
+L 491.959512 135.53011
+L 492.686416 126.488147
+L 493.41332 121.517044
+L 494.140225 118.73659
+L 494.867129 117.411322
+L 495.594033 117.194344
+L 496.320937 117.914753
+L 497.047842 119.502068
+L 497.774746 121.959832
+L 498.50165 125.365493
+L 499.228555 129.896453
+L 499.955459 135.904616
+L 500.682363 144.125427
+L 501.409268 156.416889
+L 502.136172 180.398612
+L 502.863076 195.088162
+L 503.58998 164.432798
+L 504.316885 152.796923
+L 505.043789 146.247316
+L 505.770693 142.253733
+L 506.497598 139.89965
+L 507.224502 138.764314
+L 507.951406 138.638085
+L 508.678311 139.42511
+L 509.405215 141.107835
+L 510.132119 143.740844
+L 510.859023 147.46922
+L 511.585928 152.586541
+L 512.312832 159.69351
+L 513.039736 170.215919
+L 513.766641 189.046274
+L 514.493545 240.464816
+L 515.220449 185.405083
+L 515.947354 171.099363
+L 516.674258 163.283628
+L 517.401162 158.437631
+L 518.128066 155.410244
+L 518.854971 153.694457
+L 519.581875 153.039421
+L 520.308779 153.324627
+L 521.035684 154.513526
+L 521.762588 156.641115
+L 522.489492 159.825548
+L 523.216396 164.313029
+L 523.943301 170.599621
+L 524.670205 179.804049
+L 525.397109 195.297138
+L 526.124014 246.435936
+L 526.850918 203.548954
+L 527.577822 185.775013
+L 528.304727 176.646335
+L 529.031631 171.016028
+L 529.758535 167.41335
+L 530.485439 165.223746
+L 531.212344 164.14822
+L 531.939248 164.039246
+L 532.666152 164.840933
+L 533.393057 166.569776
+L 534.119961 169.320054
+L 534.846865 173.298124
+L 535.57377 178.916717
+L 536.300674 187.069168
+L 537.027578 200.191835
+L 537.754482 231.122519
+L 538.481387 221.487403
+L 539.208291 198.535097
+L 539.935195 187.892896
+L 540.6621 181.454623
+L 541.389004 177.299161
+L 542.115908 174.674754
+L 542.842812 173.224776
+L 543.569717 172.771207
+L 544.296621 173.237756
+L 545.023525 174.622851
+L 545.75043 176.999082
+L 546.477334 180.538672
+L 547.204238 185.586824
+L 547.931143 192.867064
+L 548.658047 204.203348
+L 549.384951 226.984832
+L 550.111855 242.555088
+L 550.83876 210.325894
+L 551.565664 197.819878
+L 552.292568 190.497086
+L 553.019473 185.776206
+L 553.746377 182.726763
+L 554.473281 180.922008
+L 555.200186 180.148867
+L 555.92709 180.309045
+L 556.653994 181.382913
+L 557.380898 183.422959
+L 558.107803 186.571708
+L 558.834707 191.118792
+L 559.561611 197.656943
+L 560.288516 207.589044
+L 561.01542 225.686037
+L 561.742324 280.798866
+L 562.469229 221.853758
+L 563.196133 206.913227
+L 563.923037 198.581562
+L 564.649941 193.259412
+L 565.376846 189.778115
+L 566.10375 187.624246
+L 566.830654 186.543805
+L 567.557559 186.414325
+L 568.284463 187.197733
+L 569.011367 188.927531
+L 569.738271 191.719999
+L 570.465176 195.818367
+L 571.19208 201.712659
+L 571.918984 210.505197
+L 572.645889 225.494765
+L 573.372793 274.062529
+L 574.099697 233.864902
+L 574.826602 215.518159
+L 575.553506 205.995883
+L 576.28041 200.016142
+L 577.007314 196.084294
+L 577.734219 193.577999
+L 578.461123 192.194791
+L 579.188027 191.785184
+L 579.914932 192.291892
+L 580.641836 193.730117
+L 581.36874 196.192583
+L 582.095645 199.883219
+L 582.822549 205.209985
+L 583.549453 213.054052
+L 584.276357 225.805749
+L 585.003262 255.804119
+L 585.730166 247.526589
+L 586.45707 223.923265
+L 587.183975 212.947838
+L 587.910879 206.231998
+L 588.637783 201.820497
+L 589.364687 198.951679
+L 590.091592 197.264844
+L 590.818496 196.579837
+L 591.5454 196.818959
+L 592.272305 197.97943
+L 592.999209 200.132463
+L 593.726113 203.448226
+L 594.453018 208.268059
+L 595.179922 215.306233
+L 595.906826 226.35566
+L 596.63373 248.587
+L 597.360635 265.684491
+L 598.087539 232.419578
+L 598.814443 219.602351
+L 599.541348 212.04449
+L 600.268252 207.113586
+L 600.995156 203.866191
+L 601.722061 201.870621
+L 602.448965 200.911376
+L 603.175869 200.888672
+L 603.902773 201.781689
+L 604.629678 203.641657
+L 605.356582 206.609318
+L 606.083486 210.971115
+L 606.810391 217.312587
+L 607.537295 227.014794
+L 608.264199 244.731905
+L 608.991104 304.554333
+L 609.718008 241.368325
+L 610.444912 226.104759
+L 611.171816 217.562128
+L 611.898721 212.059922
+L 612.625625 208.412013
+L 613.352529 206.098855
+L 614.079434 204.863629
+L 614.806338 204.582235
+L 615.533242 205.215396
+L 616.260146 206.795423
+L 616.987051 209.437022
+L 617.713955 213.380749
+L 618.440859 219.110928
+L 619.167764 227.714027
+L 619.894668 242.419134
+L 620.621572 288.866248
+L 621.348477 251.326352
+L 622.075381 232.599206
+L 622.802285 222.876425
+L 623.529189 216.736114
+L 624.256094 212.659389
+L 624.982998 210.016172
+L 625.709902 208.500647
+L 626.436807 207.961509
+L 627.163711 208.340212
+L 627.890615 209.650811
+L 628.61752 211.984608
+L 629.344424 215.543256
+L 630.071328 220.730124
+L 630.798232 228.414547
+L 631.525137 240.942112
+L 632.252041 270.182688
+L 632.978945 263.382819
+L 633.70585 239.248361
+L 634.432754 228.070448
+L 635.159658 221.205958
+L 635.886562 216.664774
+L 636.613467 213.67526
+L 637.340371 211.872673
+L 638.067275 211.074785
+L 638.79418 211.202555
+L 639.521084 212.252065
+L 640.247988 214.293227
+L 640.974893 217.494241
+L 641.701797 222.19269
+L 642.428701 229.093801
+L 643.155605 239.960208
+L 644.609414 280.518124
+L 645.336318 246.262146
+L 646.063223 233.226007
+L 646.790127 225.525291
+L 647.517031 220.475137
+L 648.243936 217.118939
+L 648.97084 215.020054
+L 649.697744 213.960581
+L 650.424648 213.839277
+L 651.151553 214.634174
+L 651.878457 216.395282
+L 652.605361 219.261616
+L 653.332266 223.516501
+L 654.05917 229.738424
+L 654.786074 239.287106
+L 655.512979 256.703989
+L 656.239883 322.296137
+L 656.966787 253.951358
+L 657.693691 238.43112
+L 658.420596 229.745736
+L 659.1475 224.130984
+L 659.874404 220.382952
+L 660.601309 217.975912
+L 661.328213 216.65022
+L 662.055117 216.280162
+L 662.782021 216.825275
+L 663.508926 218.316707
+L 664.23583 220.867624
+L 664.962734 224.715955
+L 665.689639 230.340428
+L 666.416543 238.811976
+L 667.143447 253.29204
+L 667.870352 297.871605
+L 668.597256 262.850719
+L 669.32416 243.789591
+L 670.051064 233.917968
+L 670.777969 227.668638
+L 671.504873 223.497963
+L 672.231777 220.768024
+L 672.958682 219.169636
+L 673.685586 218.549671
+L 674.41249 218.848339
+L 675.139395 220.078561
+L 675.866299 222.330243
+L 676.593203 225.802796
+L 677.320107 230.895072
+L 678.047012 238.464787
+L 678.773916 250.813938
+L 679.50082 279.370257
+L 680.227725 274.075872
+L 680.954629 249.435792
+L 681.681533 238.095052
+L 682.408437 231.12208
+L 683.135342 226.49105
+L 683.862246 223.420189
+L 684.58915 221.540674
+L 685.316055 220.668192
+L 686.042959 220.722367
+L 686.769863 221.698155
+L 687.496768 223.664179
+L 688.223672 226.786698
+L 688.950576 231.399593
+L 689.67748 238.199201
+L 690.404385 248.918573
+L 691.858193 290.8323
+L 692.585098 255.561061
+L 693.312002 242.336414
+L 694.038906 234.524609
+L 694.765811 229.386889
+L 695.492715 225.953258
+L 696.219619 223.782056
+L 696.946523 222.652963
+L 697.673428 222.463275
+L 698.400332 223.189882
+L 699.127236 224.881586
+L 699.854141 227.675694
+L 700.581045 231.852455
+L 701.307949 237.983413
+L 702.034854 247.407396
+L 702.761758 264.55695
+L 703.488662 337.511448
+L 704.215566 262.467707
+L 704.942471 246.713294
+L 705.669375 237.910515
+L 706.396279 232.208747
+L 707.123184 228.385942
+L 707.850088 225.910111
+L 708.576992 224.518757
+L 709.303896 224.084545
+L 710.030801 224.565829
+L 710.757705 225.992601
+L 711.484609 228.476502
+L 712.211514 232.252868
+L 712.938418 237.794908
+L 713.665322 246.158316
+L 714.392227 260.438845
+L 715.119131 303.338499
+L 715.846035 270.698113
+L 716.572939 251.317152
+L 717.299844 241.31697
+L 718.026748 234.979388
+L 718.753652 230.735472
+L 719.480557 227.939347
+L 720.207461 226.278417
+L 720.934365 225.597727
+L 721.66127 225.836238
+L 722.388174 227.005741
+L 723.115078 229.194761
+L 723.841982 232.600488
+L 724.568887 237.617318
+L 725.295791 245.091552
+L 726.022695 257.282703
+L 726.7496 285.201201
+L 727.476504 281.419168
+L 728.203408 256.273964
+L 728.930312 244.786451
+L 729.657217 237.721989
+L 730.384121 233.01817
+L 731.111025 229.882914
+L 731.83793 227.943269
+L 732.564834 227.012823
+L 733.291738 227.00986
+L 734.018643 227.92821
+L 734.745547 229.83522
+L 735.472451 232.895223
+L 736.199355 237.438447
+L 736.92626 244.15248
+L 737.653164 254.741461
+L 739.106973 298.10666
+L 739.833877 261.771044
+L 740.560781 248.370106
+L 741.287686 240.461135
+L 742.01459 235.249975
+L 742.741494 231.752995
+L 743.468398 229.523454
+L 744.195303 228.33859
+L 744.922207 228.094233
+L 745.649111 228.766131
+L 746.376016 230.401883
+L 747.10292 233.137101
+L 747.829824 237.248995
+L 748.556729 243.30227
+L 749.283633 252.61529
+L 750.010537 269.515364
+L 750.737441 352.707722
+L 751.464346 268.113299
+L 752.19125 252.132861
+L 752.918154 243.224029
+L 753.645059 237.446973
+L 754.371963 233.561148
+L 755.098867 231.028211
+L 755.825771 229.582784
+L 756.552676 229.095901
+L 757.27958 229.524733
+L 758.006484 230.898117
+L 758.733389 233.326182
+L 759.460293 237.041696
+L 760.187197 242.512431
+L 760.914102 250.779124
+L 761.641006 264.873722
+L 762.36791 306.244375
+L 763.094814 275.860059
+L 763.821719 256.161731
+L 764.548623 246.042067
+L 765.275527 239.625961
+L 766.002432 235.318627
+L 766.729336 232.466105
+L 767.45624 230.752358
+L 768.183145 230.020584
+L 768.910049 230.208492
+L 769.636953 231.326748
+L 770.363857 233.462499
+L 771.090762 236.81074
+L 771.817666 241.761469
+L 772.54457 249.149768
+L 773.271475 261.193732
+L 773.998379 288.50937
+L 774.725283 286.240545
+L 775.452187 260.580386
+L 776.179092 248.953036
+L 776.905996 241.805104
+L 777.6329 237.036694
+L 778.359805 233.845248
+L 779.086709 231.853634
+L 779.813613 230.873322
+L 780.540518 230.821248
+L 781.267422 231.69012
+L 781.994326 233.546012
+L 782.72123 236.55135
+L 783.448135 241.032752
+L 784.175039 247.669198
+L 784.901943 258.136562
+L 785.628848 278.819804
+L 786.355752 303.041253
+L 787.082656 265.576938
+L 787.809561 252.00437
+L 788.536465 244.00475
+L 789.263369 238.726961
+L 789.990273 235.173489
+L 790.717178 232.892442
+L 791.444082 231.658594
+L 792.170986 231.366299
+L 792.897891 231.990161
+L 793.624795 233.57658
+L 794.351699 236.259492
+L 795.078604 240.313096
+L 795.805508 246.295362
+L 796.532412 255.504604
+L 797.259316 272.166391
+L 797.986221 372.605455
+L 798.713125 271.462973
+L 799.440029 255.258253
+L 800.166934 246.248507
+L 800.893838 240.401764
+L 801.620742 236.458611
+L 802.347646 233.874255
+L 803.074551 232.380412
+L 803.801455 231.846471
+L 804.528359 232.228416
+L 805.255264 233.553934
+L 805.982168 235.931649
+L 806.709072 239.591793
+L 807.435977 244.996768
+L 808.162881 253.172639
+L 808.889785 267.089352
+L 809.616689 307.05664
+L 810.343594 278.818978
+L 811.070498 258.800078
+L 811.797402 248.564728
+L 812.524307 242.074619
+L 813.251211 237.708534
+L 813.978115 234.804306
+L 814.70502 233.04241
+L 815.431924 232.264185
+L 816.158828 232.406086
+L 816.885732 233.477652
+L 817.612637 235.564663
+L 818.339541 238.859938
+L 819.066445 243.749131
+L 819.79335 251.056299
+L 820.520254 262.95915
+L 821.247158 289.700403
+L 821.974062 288.944236
+L 822.700967 262.753482
+L 823.427871 250.988663
+L 824.154775 243.760789
+L 824.88168 238.931542
+L 825.608584 235.687706
+L 826.335488 233.647915
+L 827.062393 232.621503
+L 827.789297 232.524053
+L 828.516201 233.347149
+L 829.243105 235.155598
+L 829.97001 238.109936
+L 830.696914 242.533213
+L 831.423818 249.095935
+L 832.150723 259.446345
+L 832.877627 279.792578
+L 833.604531 305.979659
+L 834.331436 267.309292
+L 835.05834 253.565726
+L 835.785244 245.478038
+L 836.512148 240.136539
+L 837.239053 236.529569
+L 837.965957 234.200018
+L 838.692861 232.92017
+L 839.419766 232.582893
+L 840.14667 233.161648
+L 840.873574 234.701641
+L 841.600479 237.335139
+L 842.327383 241.333367
+L 843.054287 247.247659
+L 843.781191 256.356681
+L 844.508096 272.787605
+L 844.508096 272.787605
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
</g>
<g id="patch_8">
- <path d="M 474.23 387.16
-L 474.23 39.24
+ <path d="M 473.06 388.6
+L 473.06 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_9">
- <path d="M 845.28 387.16
-L 845.28 39.24
+ <path d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_10">
- <path d="M 474.23 387.16
-L 845.28 387.16
+ <path d="M 473.06 388.6
+L 845.235 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_11">
- <path d="M 474.23 39.24
-L 845.28 39.24
+ <path d="M 473.06 36.72
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
@@ -2164,11 +2164,11 @@ z
</g>
</g>
<defs>
- <clipPath id="p5db5ac15e0">
- <rect height="347.92" width="371.05" x="47.72" y="39.24"/>
+ <clipPath id="pa303fa7717">
+ <rect height="351.88" width="372.175" x="47.855" y="36.72"/>
</clipPath>
- <clipPath id="pb3dc7ea038">
- <rect height="347.92" width="371.05" x="474.23" y="39.24"/>
+ <clipPath id="p0ffc0990a4">
+ <rect height="351.88" width="372.175" x="473.06" y="36.72"/>
</clipPath>
</defs>
</svg>
diff --git a/docs/docs/img/window_cosine_np.svg b/docs/docs/img/window_cosine_np.svg
@@ -0,0 +1,2224 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Created with matplotlib (https://matplotlib.org/) -->
+<svg height="432pt" version="1.1" viewBox="0 0 864 432" width="864pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+ </style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 432
+L 864 432
+L 864 0
+L 0 0
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="axes_1">
+ <g id="patch_2">
+ <path d="M 47.855 388.6
+L 416.835 388.6
+L 416.835 36.72
+L 47.855 36.72
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_1">
+ <g id="xtick_1">
+ <g id="line2d_1">
+ <path clip-path="url(#pc9909b1bc7)" d="M 47.855 388.6
+L 47.855 36.72
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_2">
+ <defs>
+ <path d="M 0 0
+L 0 3.5
+" id="mee698f347f" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mee698f347f" y="388.6"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- 0 -->
+ <defs>
+ <path d="M 31.78125 66.40625
+Q 24.171875 66.40625 20.328125 58.90625
+Q 16.5 51.421875 16.5 36.375
+Q 16.5 21.390625 20.328125 13.890625
+Q 24.171875 6.390625 31.78125 6.390625
+Q 39.453125 6.390625 43.28125 13.890625
+Q 47.125 21.390625 47.125 36.375
+Q 47.125 51.421875 43.28125 58.90625
+Q 39.453125 66.40625 31.78125 66.40625
+z
+M 31.78125 74.21875
+Q 44.046875 74.21875 50.515625 64.515625
+Q 56.984375 54.828125 56.984375 36.375
+Q 56.984375 17.96875 50.515625 8.265625
+Q 44.046875 -1.421875 31.78125 -1.421875
+Q 19.53125 -1.421875 13.0625 8.265625
+Q 6.59375 17.96875 6.59375 36.375
+Q 6.59375 54.828125 13.0625 64.515625
+Q 19.53125 74.21875 31.78125 74.21875
+z
+" id="DejaVuSans-48"/>
+ </defs>
+ <g transform="translate(44.67375 403.198438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_2">
+ <g id="line2d_3">
+ <path clip-path="url(#pc9909b1bc7)" d="M 106.423254 388.6
+L 106.423254 36.72
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_4">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="106.423254" xlink:href="#mee698f347f" y="388.6"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- 10 -->
+ <defs>
+ <path d="M 12.40625 8.296875
+L 28.515625 8.296875
+L 28.515625 63.921875
+L 10.984375 60.40625
+L 10.984375 69.390625
+L 28.421875 72.90625
+L 38.28125 72.90625
+L 38.28125 8.296875
+L 54.390625 8.296875
+L 54.390625 0
+L 12.40625 0
+z
+" id="DejaVuSans-49"/>
+ </defs>
+ <g transform="translate(100.060754 403.198438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_3">
+ <g id="line2d_5">
+ <path clip-path="url(#pc9909b1bc7)" d="M 164.991508 388.6
+L 164.991508 36.72
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_6">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="164.991508" xlink:href="#mee698f347f" y="388.6"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- 20 -->
+ <defs>
+ <path d="M 19.1875 8.296875
+L 53.609375 8.296875
+L 53.609375 0
+L 7.328125 0
+L 7.328125 8.296875
+Q 12.9375 14.109375 22.625 23.890625
+Q 32.328125 33.6875 34.8125 36.53125
+Q 39.546875 41.84375 41.421875 45.53125
+Q 43.3125 49.21875 43.3125 52.78125
+Q 43.3125 58.59375 39.234375 62.25
+Q 35.15625 65.921875 28.609375 65.921875
+Q 23.96875 65.921875 18.8125 64.3125
+Q 13.671875 62.703125 7.8125 59.421875
+L 7.8125 69.390625
+Q 13.765625 71.78125 18.9375 73
+Q 24.125 74.21875 28.421875 74.21875
+Q 39.75 74.21875 46.484375 68.546875
+Q 53.21875 62.890625 53.21875 53.421875
+Q 53.21875 48.921875 51.53125 44.890625
+Q 49.859375 40.875 45.40625 35.40625
+Q 44.1875 33.984375 37.640625 27.21875
+Q 31.109375 20.453125 19.1875 8.296875
+z
+" id="DejaVuSans-50"/>
+ </defs>
+ <g transform="translate(158.629008 403.198438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-50"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_4">
+ <g id="line2d_7">
+ <path clip-path="url(#pc9909b1bc7)" d="M 223.559762 388.6
+L 223.559762 36.72
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_8">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="223.559762" xlink:href="#mee698f347f" y="388.6"/>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- 30 -->
+ <defs>
+ <path d="M 40.578125 39.3125
+Q 47.65625 37.796875 51.625 33
+Q 55.609375 28.21875 55.609375 21.1875
+Q 55.609375 10.40625 48.1875 4.484375
+Q 40.765625 -1.421875 27.09375 -1.421875
+Q 22.515625 -1.421875 17.65625 -0.515625
+Q 12.796875 0.390625 7.625 2.203125
+L 7.625 11.71875
+Q 11.71875 9.328125 16.59375 8.109375
+Q 21.484375 6.890625 26.8125 6.890625
+Q 36.078125 6.890625 40.9375 10.546875
+Q 45.796875 14.203125 45.796875 21.1875
+Q 45.796875 27.640625 41.28125 31.265625
+Q 36.765625 34.90625 28.71875 34.90625
+L 20.21875 34.90625
+L 20.21875 43.015625
+L 29.109375 43.015625
+Q 36.375 43.015625 40.234375 45.921875
+Q 44.09375 48.828125 44.09375 54.296875
+Q 44.09375 59.90625 40.109375 62.90625
+Q 36.140625 65.921875 28.71875 65.921875
+Q 24.65625 65.921875 20.015625 65.03125
+Q 15.375 64.15625 9.8125 62.3125
+L 9.8125 71.09375
+Q 15.4375 72.65625 20.34375 73.4375
+Q 25.25 74.21875 29.59375 74.21875
+Q 40.828125 74.21875 47.359375 69.109375
+Q 53.90625 64.015625 53.90625 55.328125
+Q 53.90625 49.265625 50.4375 45.09375
+Q 46.96875 40.921875 40.578125 39.3125
+z
+" id="DejaVuSans-51"/>
+ </defs>
+ <g transform="translate(217.197262 403.198438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-51"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_5">
+ <g id="line2d_9">
+ <path clip-path="url(#pc9909b1bc7)" d="M 282.128016 388.6
+L 282.128016 36.72
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_10">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="282.128016" xlink:href="#mee698f347f" y="388.6"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- 40 -->
+ <defs>
+ <path d="M 37.796875 64.3125
+L 12.890625 25.390625
+L 37.796875 25.390625
+z
+M 35.203125 72.90625
+L 47.609375 72.90625
+L 47.609375 25.390625
+L 58.015625 25.390625
+L 58.015625 17.1875
+L 47.609375 17.1875
+L 47.609375 0
+L 37.796875 0
+L 37.796875 17.1875
+L 4.890625 17.1875
+L 4.890625 26.703125
+z
+" id="DejaVuSans-52"/>
+ </defs>
+ <g transform="translate(275.765516 403.198438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-52"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_6">
+ <g id="line2d_11">
+ <path clip-path="url(#pc9909b1bc7)" d="M 340.69627 388.6
+L 340.69627 36.72
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_12">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="340.69627" xlink:href="#mee698f347f" y="388.6"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- 50 -->
+ <defs>
+ <path d="M 10.796875 72.90625
+L 49.515625 72.90625
+L 49.515625 64.59375
+L 19.828125 64.59375
+L 19.828125 46.734375
+Q 21.96875 47.46875 24.109375 47.828125
+Q 26.265625 48.1875 28.421875 48.1875
+Q 40.625 48.1875 47.75 41.5
+Q 54.890625 34.8125 54.890625 23.390625
+Q 54.890625 11.625 47.5625 5.09375
+Q 40.234375 -1.421875 26.90625 -1.421875
+Q 22.3125 -1.421875 17.546875 -0.640625
+Q 12.796875 0.140625 7.71875 1.703125
+L 7.71875 11.625
+Q 12.109375 9.234375 16.796875 8.0625
+Q 21.484375 6.890625 26.703125 6.890625
+Q 35.15625 6.890625 40.078125 11.328125
+Q 45.015625 15.765625 45.015625 23.390625
+Q 45.015625 31 40.078125 35.4375
+Q 35.15625 39.890625 26.703125 39.890625
+Q 22.75 39.890625 18.8125 39.015625
+Q 14.890625 38.140625 10.796875 36.28125
+z
+" id="DejaVuSans-53"/>
+ </defs>
+ <g transform="translate(334.33377 403.198438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-53"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_7">
+ <g id="line2d_13">
+ <path clip-path="url(#pc9909b1bc7)" d="M 399.264524 388.6
+L 399.264524 36.72
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_14">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="399.264524" xlink:href="#mee698f347f" y="388.6"/>
+ </g>
+ </g>
+ <g id="text_7">
+ <!-- 60 -->
+ <defs>
+ <path d="M 33.015625 40.375
+Q 26.375 40.375 22.484375 35.828125
+Q 18.609375 31.296875 18.609375 23.390625
+Q 18.609375 15.53125 22.484375 10.953125
+Q 26.375 6.390625 33.015625 6.390625
+Q 39.65625 6.390625 43.53125 10.953125
+Q 47.40625 15.53125 47.40625 23.390625
+Q 47.40625 31.296875 43.53125 35.828125
+Q 39.65625 40.375 33.015625 40.375
+z
+M 52.59375 71.296875
+L 52.59375 62.3125
+Q 48.875 64.0625 45.09375 64.984375
+Q 41.3125 65.921875 37.59375 65.921875
+Q 27.828125 65.921875 22.671875 59.328125
+Q 17.53125 52.734375 16.796875 39.40625
+Q 19.671875 43.65625 24.015625 45.921875
+Q 28.375 48.1875 33.59375 48.1875
+Q 44.578125 48.1875 50.953125 41.515625
+Q 57.328125 34.859375 57.328125 23.390625
+Q 57.328125 12.15625 50.6875 5.359375
+Q 44.046875 -1.421875 33.015625 -1.421875
+Q 20.359375 -1.421875 13.671875 8.265625
+Q 6.984375 17.96875 6.984375 36.375
+Q 6.984375 53.65625 15.1875 63.9375
+Q 23.390625 74.21875 37.203125 74.21875
+Q 40.921875 74.21875 44.703125 73.484375
+Q 48.484375 72.75 52.59375 71.296875
+z
+" id="DejaVuSans-54"/>
+ </defs>
+ <g transform="translate(392.902024 403.198438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-54"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_8">
+ <!-- Samples -->
+ <defs>
+ <path d="M 53.515625 70.515625
+L 53.515625 60.890625
+Q 47.90625 63.578125 42.921875 64.890625
+Q 37.9375 66.21875 33.296875 66.21875
+Q 25.25 66.21875 20.875 63.09375
+Q 16.5 59.96875 16.5 54.203125
+Q 16.5 49.359375 19.40625 46.890625
+Q 22.3125 44.4375 30.421875 42.921875
+L 36.375 41.703125
+Q 47.40625 39.59375 52.65625 34.296875
+Q 57.90625 29 57.90625 20.125
+Q 57.90625 9.515625 50.796875 4.046875
+Q 43.703125 -1.421875 29.984375 -1.421875
+Q 24.8125 -1.421875 18.96875 -0.25
+Q 13.140625 0.921875 6.890625 3.21875
+L 6.890625 13.375
+Q 12.890625 10.015625 18.65625 8.296875
+Q 24.421875 6.59375 29.984375 6.59375
+Q 38.421875 6.59375 43.015625 9.90625
+Q 47.609375 13.234375 47.609375 19.390625
+Q 47.609375 24.75 44.3125 27.78125
+Q 41.015625 30.8125 33.5 32.328125
+L 27.484375 33.5
+Q 16.453125 35.6875 11.515625 40.375
+Q 6.59375 45.0625 6.59375 53.421875
+Q 6.59375 63.09375 13.40625 68.65625
+Q 20.21875 74.21875 32.171875 74.21875
+Q 37.3125 74.21875 42.625 73.28125
+Q 47.953125 72.359375 53.515625 70.515625
+z
+" id="DejaVuSans-83"/>
+ <path d="M 34.28125 27.484375
+Q 23.390625 27.484375 19.1875 25
+Q 14.984375 22.515625 14.984375 16.5
+Q 14.984375 11.71875 18.140625 8.90625
+Q 21.296875 6.109375 26.703125 6.109375
+Q 34.1875 6.109375 38.703125 11.40625
+Q 43.21875 16.703125 43.21875 25.484375
+L 43.21875 27.484375
+z
+M 52.203125 31.203125
+L 52.203125 0
+L 43.21875 0
+L 43.21875 8.296875
+Q 40.140625 3.328125 35.546875 0.953125
+Q 30.953125 -1.421875 24.3125 -1.421875
+Q 15.921875 -1.421875 10.953125 3.296875
+Q 6 8.015625 6 15.921875
+Q 6 25.140625 12.171875 29.828125
+Q 18.359375 34.515625 30.609375 34.515625
+L 43.21875 34.515625
+L 43.21875 35.40625
+Q 43.21875 41.609375 39.140625 45
+Q 35.0625 48.390625 27.6875 48.390625
+Q 23 48.390625 18.546875 47.265625
+Q 14.109375 46.140625 10.015625 43.890625
+L 10.015625 52.203125
+Q 14.9375 54.109375 19.578125 55.046875
+Q 24.21875 56 28.609375 56
+Q 40.484375 56 46.34375 49.84375
+Q 52.203125 43.703125 52.203125 31.203125
+z
+" id="DejaVuSans-97"/>
+ <path d="M 52 44.1875
+Q 55.375 50.25 60.0625 53.125
+Q 64.75 56 71.09375 56
+Q 79.640625 56 84.28125 50.015625
+Q 88.921875 44.046875 88.921875 33.015625
+L 88.921875 0
+L 79.890625 0
+L 79.890625 32.71875
+Q 79.890625 40.578125 77.09375 44.375
+Q 74.3125 48.1875 68.609375 48.1875
+Q 61.625 48.1875 57.5625 43.546875
+Q 53.515625 38.921875 53.515625 30.90625
+L 53.515625 0
+L 44.484375 0
+L 44.484375 32.71875
+Q 44.484375 40.625 41.703125 44.40625
+Q 38.921875 48.1875 33.109375 48.1875
+Q 26.21875 48.1875 22.15625 43.53125
+Q 18.109375 38.875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.1875 51.21875 25.484375 53.609375
+Q 29.78125 56 35.6875 56
+Q 41.65625 56 45.828125 52.96875
+Q 50 49.953125 52 44.1875
+z
+" id="DejaVuSans-109"/>
+ <path d="M 18.109375 8.203125
+L 18.109375 -20.796875
+L 9.078125 -20.796875
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+z
+M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+" id="DejaVuSans-112"/>
+ <path d="M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 0
+L 9.421875 0
+z
+" id="DejaVuSans-108"/>
+ <path d="M 56.203125 29.59375
+L 56.203125 25.203125
+L 14.890625 25.203125
+Q 15.484375 15.921875 20.484375 11.0625
+Q 25.484375 6.203125 34.421875 6.203125
+Q 39.59375 6.203125 44.453125 7.46875
+Q 49.3125 8.734375 54.109375 11.28125
+L 54.109375 2.78125
+Q 49.265625 0.734375 44.1875 -0.34375
+Q 39.109375 -1.421875 33.890625 -1.421875
+Q 20.796875 -1.421875 13.15625 6.1875
+Q 5.515625 13.8125 5.515625 26.8125
+Q 5.515625 40.234375 12.765625 48.109375
+Q 20.015625 56 32.328125 56
+Q 43.359375 56 49.78125 48.890625
+Q 56.203125 41.796875 56.203125 29.59375
+z
+M 47.21875 32.234375
+Q 47.125 39.59375 43.09375 43.984375
+Q 39.0625 48.390625 32.421875 48.390625
+Q 24.90625 48.390625 20.390625 44.140625
+Q 15.875 39.890625 15.1875 32.171875
+z
+" id="DejaVuSans-101"/>
+ <path d="M 44.28125 53.078125
+L 44.28125 44.578125
+Q 40.484375 46.53125 36.375 47.5
+Q 32.28125 48.484375 27.875 48.484375
+Q 21.1875 48.484375 17.84375 46.4375
+Q 14.5 44.390625 14.5 40.28125
+Q 14.5 37.15625 16.890625 35.375
+Q 19.28125 33.59375 26.515625 31.984375
+L 29.59375 31.296875
+Q 39.15625 29.25 43.1875 25.515625
+Q 47.21875 21.78125 47.21875 15.09375
+Q 47.21875 7.46875 41.1875 3.015625
+Q 35.15625 -1.421875 24.609375 -1.421875
+Q 20.21875 -1.421875 15.453125 -0.5625
+Q 10.6875 0.296875 5.421875 2
+L 5.421875 11.28125
+Q 10.40625 8.6875 15.234375 7.390625
+Q 20.0625 6.109375 24.8125 6.109375
+Q 31.15625 6.109375 34.5625 8.28125
+Q 37.984375 10.453125 37.984375 14.40625
+Q 37.984375 18.0625 35.515625 20.015625
+Q 33.0625 21.96875 24.703125 23.78125
+L 21.578125 24.515625
+Q 13.234375 26.265625 9.515625 29.90625
+Q 5.8125 33.546875 5.8125 39.890625
+Q 5.8125 47.609375 11.28125 51.796875
+Q 16.75 56 26.8125 56
+Q 31.78125 56 36.171875 55.265625
+Q 40.578125 54.546875 44.28125 53.078125
+z
+" id="DejaVuSans-115"/>
+ </defs>
+ <g transform="translate(210.991875 416.876562)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-83"/>
+ <use x="63.476562" xlink:href="#DejaVuSans-97"/>
+ <use x="124.755859" xlink:href="#DejaVuSans-109"/>
+ <use x="222.167969" xlink:href="#DejaVuSans-112"/>
+ <use x="285.644531" xlink:href="#DejaVuSans-108"/>
+ <use x="313.427734" xlink:href="#DejaVuSans-101"/>
+ <use x="374.951172" xlink:href="#DejaVuSans-115"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_2">
+ <g id="ytick_1">
+ <g id="line2d_15">
+ <path clip-path="url(#pc9909b1bc7)" d="M 47.855 328.301631
+L 416.835 328.301631
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_16">
+ <defs>
+ <path d="M 0 0
+L -3.5 0
+" id="mf3541a3da8" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mf3541a3da8" y="328.301631"/>
+ </g>
+ </g>
+ <g id="text_9">
+ <!-- 0.2 -->
+ <defs>
+ <path d="M 10.6875 12.40625
+L 21 12.40625
+L 21 0
+L 10.6875 0
+z
+" id="DejaVuSans-46"/>
+ </defs>
+ <g transform="translate(24.951875 332.10085)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-50"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_2">
+ <g id="line2d_17">
+ <path clip-path="url(#pc9909b1bc7)" d="M 47.855 259.569395
+L 416.835 259.569395
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_18">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mf3541a3da8" y="259.569395"/>
+ </g>
+ </g>
+ <g id="text_10">
+ <!-- 0.4 -->
+ <g transform="translate(24.951875 263.368614)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-52"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_3">
+ <g id="line2d_19">
+ <path clip-path="url(#pc9909b1bc7)" d="M 47.855 190.837159
+L 416.835 190.837159
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_20">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mf3541a3da8" y="190.837159"/>
+ </g>
+ </g>
+ <g id="text_11">
+ <!-- 0.6 -->
+ <g transform="translate(24.951875 194.636377)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-54"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_4">
+ <g id="line2d_21">
+ <path clip-path="url(#pc9909b1bc7)" d="M 47.855 122.104922
+L 416.835 122.104922
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_22">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mf3541a3da8" y="122.104922"/>
+ </g>
+ </g>
+ <g id="text_12">
+ <!-- 0.8 -->
+ <defs>
+ <path d="M 31.78125 34.625
+Q 24.75 34.625 20.71875 30.859375
+Q 16.703125 27.09375 16.703125 20.515625
+Q 16.703125 13.921875 20.71875 10.15625
+Q 24.75 6.390625 31.78125 6.390625
+Q 38.8125 6.390625 42.859375 10.171875
+Q 46.921875 13.96875 46.921875 20.515625
+Q 46.921875 27.09375 42.890625 30.859375
+Q 38.875 34.625 31.78125 34.625
+z
+M 21.921875 38.8125
+Q 15.578125 40.375 12.03125 44.71875
+Q 8.5 49.078125 8.5 55.328125
+Q 8.5 64.0625 14.71875 69.140625
+Q 20.953125 74.21875 31.78125 74.21875
+Q 42.671875 74.21875 48.875 69.140625
+Q 55.078125 64.0625 55.078125 55.328125
+Q 55.078125 49.078125 51.53125 44.71875
+Q 48 40.375 41.703125 38.8125
+Q 48.828125 37.15625 52.796875 32.3125
+Q 56.78125 27.484375 56.78125 20.515625
+Q 56.78125 9.90625 50.3125 4.234375
+Q 43.84375 -1.421875 31.78125 -1.421875
+Q 19.734375 -1.421875 13.25 4.234375
+Q 6.78125 9.90625 6.78125 20.515625
+Q 6.78125 27.484375 10.78125 32.3125
+Q 14.796875 37.15625 21.921875 38.8125
+z
+M 18.3125 54.390625
+Q 18.3125 48.734375 21.84375 45.5625
+Q 25.390625 42.390625 31.78125 42.390625
+Q 38.140625 42.390625 41.71875 45.5625
+Q 45.3125 48.734375 45.3125 54.390625
+Q 45.3125 60.0625 41.71875 63.234375
+Q 38.140625 66.40625 31.78125 66.40625
+Q 25.390625 66.40625 21.84375 63.234375
+Q 18.3125 60.0625 18.3125 54.390625
+z
+" id="DejaVuSans-56"/>
+ </defs>
+ <g transform="translate(24.951875 125.904141)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-56"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_5">
+ <g id="line2d_23">
+ <path clip-path="url(#pc9909b1bc7)" d="M 47.855 53.372686
+L 416.835 53.372686
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_24">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mf3541a3da8" y="53.372686"/>
+ </g>
+ </g>
+ <g id="text_13">
+ <!-- 1.0 -->
+ <g transform="translate(24.951875 57.171905)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_14">
+ <!-- Amplitude -->
+ <defs>
+ <path d="M 34.1875 63.1875
+L 20.796875 26.90625
+L 47.609375 26.90625
+z
+M 28.609375 72.90625
+L 39.796875 72.90625
+L 67.578125 0
+L 57.328125 0
+L 50.6875 18.703125
+L 17.828125 18.703125
+L 11.1875 0
+L 0.78125 0
+z
+" id="DejaVuSans-65"/>
+ <path d="M 9.421875 54.6875
+L 18.40625 54.6875
+L 18.40625 0
+L 9.421875 0
+z
+M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 64.59375
+L 9.421875 64.59375
+z
+" id="DejaVuSans-105"/>
+ <path d="M 18.3125 70.21875
+L 18.3125 54.6875
+L 36.8125 54.6875
+L 36.8125 47.703125
+L 18.3125 47.703125
+L 18.3125 18.015625
+Q 18.3125 11.328125 20.140625 9.421875
+Q 21.96875 7.515625 27.59375 7.515625
+L 36.8125 7.515625
+L 36.8125 0
+L 27.59375 0
+Q 17.1875 0 13.234375 3.875
+Q 9.28125 7.765625 9.28125 18.015625
+L 9.28125 47.703125
+L 2.6875 47.703125
+L 2.6875 54.6875
+L 9.28125 54.6875
+L 9.28125 70.21875
+z
+" id="DejaVuSans-116"/>
+ <path d="M 8.5 21.578125
+L 8.5 54.6875
+L 17.484375 54.6875
+L 17.484375 21.921875
+Q 17.484375 14.15625 20.5 10.265625
+Q 23.53125 6.390625 29.59375 6.390625
+Q 36.859375 6.390625 41.078125 11.03125
+Q 45.3125 15.671875 45.3125 23.6875
+L 45.3125 54.6875
+L 54.296875 54.6875
+L 54.296875 0
+L 45.3125 0
+L 45.3125 8.40625
+Q 42.046875 3.421875 37.71875 1
+Q 33.40625 -1.421875 27.6875 -1.421875
+Q 18.265625 -1.421875 13.375 4.4375
+Q 8.5 10.296875 8.5 21.578125
+z
+M 31.109375 56
+z
+" id="DejaVuSans-117"/>
+ <path d="M 45.40625 46.390625
+L 45.40625 75.984375
+L 54.390625 75.984375
+L 54.390625 0
+L 45.40625 0
+L 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+z
+M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+" id="DejaVuSans-100"/>
+ </defs>
+ <g transform="translate(18.872187 238.282656)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-65"/>
+ <use x="68.408203" xlink:href="#DejaVuSans-109"/>
+ <use x="165.820312" xlink:href="#DejaVuSans-112"/>
+ <use x="229.296875" xlink:href="#DejaVuSans-108"/>
+ <use x="257.080078" xlink:href="#DejaVuSans-105"/>
+ <use x="284.863281" xlink:href="#DejaVuSans-116"/>
+ <use x="324.072266" xlink:href="#DejaVuSans-117"/>
+ <use x="387.451172" xlink:href="#DejaVuSans-100"/>
+ <use x="450.927734" xlink:href="#DejaVuSans-101"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_25">
+ <path clip-path="url(#pc9909b1bc7)" d="M 47.855 388.6
+L 53.711825 371.752583
+L 59.568651 354.96607
+L 65.425476 338.280903
+L 71.282302 321.737277
+L 77.139127 305.375046
+L 82.995952 289.23363
+L 88.852778 273.351914
+L 94.709603 257.768159
+L 100.566429 242.519907
+L 106.423254 227.643893
+L 112.280079 213.175953
+L 118.136905 199.150944
+L 123.99373 185.602652
+L 129.850556 172.563717
+L 135.707381 160.065549
+L 141.564206 148.138259
+L 147.421032 136.810581
+L 153.277857 126.109803
+L 159.134683 116.061705
+L 164.991508 106.690493
+L 170.848333 98.018744
+L 176.705159 90.067349
+L 182.561984 82.855463
+L 188.41881 76.40046
+L 194.275635 70.717891
+L 200.13246 65.821446
+L 205.989286 61.722921
+L 211.846111 58.432189
+L 217.702937 55.957178
+L 223.559762 54.303851
+L 229.416587 53.47619
+L 235.273413 53.47619
+L 241.130238 54.303851
+L 246.987063 55.957178
+L 252.843889 58.432189
+L 258.700714 61.722921
+L 264.55754 65.821446
+L 270.414365 70.717891
+L 276.27119 76.40046
+L 282.128016 82.855463
+L 287.984841 90.067349
+L 293.841667 98.018744
+L 299.698492 106.690493
+L 305.555317 116.061705
+L 311.412143 126.109803
+L 317.268968 136.810581
+L 323.125794 148.138259
+L 328.982619 160.065549
+L 334.839444 172.563717
+L 340.69627 185.602652
+L 346.553095 199.150944
+L 352.409921 213.175953
+L 358.266746 227.643893
+L 364.123571 242.519907
+L 369.980397 257.768159
+L 375.837222 273.351914
+L 381.694048 289.23363
+L 387.550873 305.375046
+L 393.407698 321.737277
+L 399.264524 338.280903
+L 405.121349 354.96607
+L 410.978175 371.752583
+L 416.835 388.6
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ <defs>
+ <path d="M 0 1.5
+C 0.397805 1.5 0.77937 1.341951 1.06066 1.06066
+C 1.341951 0.77937 1.5 0.397805 1.5 0
+C 1.5 -0.397805 1.341951 -0.77937 1.06066 -1.06066
+C 0.77937 -1.341951 0.397805 -1.5 0 -1.5
+C -0.397805 -1.5 -0.77937 -1.341951 -1.06066 -1.06066
+C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0
+C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066
+C -0.77937 1.341951 -0.397805 1.5 0 1.5
+z
+" id="ma51964f500" style="stroke:#0072bd;"/>
+ </defs>
+ <g clip-path="url(#pc9909b1bc7)">
+ <use style="fill:#0072bd;stroke:#0072bd;" x="47.855" xlink:href="#ma51964f500" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="53.711825" xlink:href="#ma51964f500" y="371.752583"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="59.568651" xlink:href="#ma51964f500" y="354.96607"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="65.425476" xlink:href="#ma51964f500" y="338.280903"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="71.282302" xlink:href="#ma51964f500" y="321.737277"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="77.139127" xlink:href="#ma51964f500" y="305.375046"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="82.995952" xlink:href="#ma51964f500" y="289.23363"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="88.852778" xlink:href="#ma51964f500" y="273.351914"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="94.709603" xlink:href="#ma51964f500" y="257.768159"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="100.566429" xlink:href="#ma51964f500" y="242.519907"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="106.423254" xlink:href="#ma51964f500" y="227.643893"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="112.280079" xlink:href="#ma51964f500" y="213.175953"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="118.136905" xlink:href="#ma51964f500" y="199.150944"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="123.99373" xlink:href="#ma51964f500" y="185.602652"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="129.850556" xlink:href="#ma51964f500" y="172.563717"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="135.707381" xlink:href="#ma51964f500" y="160.065549"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="141.564206" xlink:href="#ma51964f500" y="148.138259"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="147.421032" xlink:href="#ma51964f500" y="136.810581"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="153.277857" xlink:href="#ma51964f500" y="126.109803"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="159.134683" xlink:href="#ma51964f500" y="116.061705"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="164.991508" xlink:href="#ma51964f500" y="106.690493"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="170.848333" xlink:href="#ma51964f500" y="98.018744"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="176.705159" xlink:href="#ma51964f500" y="90.067349"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="182.561984" xlink:href="#ma51964f500" y="82.855463"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="188.41881" xlink:href="#ma51964f500" y="76.40046"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="194.275635" xlink:href="#ma51964f500" y="70.717891"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="200.13246" xlink:href="#ma51964f500" y="65.821446"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="205.989286" xlink:href="#ma51964f500" y="61.722921"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="211.846111" xlink:href="#ma51964f500" y="58.432189"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="217.702937" xlink:href="#ma51964f500" y="55.957178"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="223.559762" xlink:href="#ma51964f500" y="54.303851"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="229.416587" xlink:href="#ma51964f500" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="235.273413" xlink:href="#ma51964f500" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="241.130238" xlink:href="#ma51964f500" y="54.303851"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="246.987063" xlink:href="#ma51964f500" y="55.957178"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="252.843889" xlink:href="#ma51964f500" y="58.432189"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="258.700714" xlink:href="#ma51964f500" y="61.722921"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="264.55754" xlink:href="#ma51964f500" y="65.821446"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="270.414365" xlink:href="#ma51964f500" y="70.717891"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="276.27119" xlink:href="#ma51964f500" y="76.40046"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="282.128016" xlink:href="#ma51964f500" y="82.855463"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="287.984841" xlink:href="#ma51964f500" y="90.067349"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="293.841667" xlink:href="#ma51964f500" y="98.018744"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="299.698492" xlink:href="#ma51964f500" y="106.690493"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="305.555317" xlink:href="#ma51964f500" y="116.061705"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="311.412143" xlink:href="#ma51964f500" y="126.109803"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="317.268968" xlink:href="#ma51964f500" y="136.810581"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="323.125794" xlink:href="#ma51964f500" y="148.138259"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="328.982619" xlink:href="#ma51964f500" y="160.065549"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="334.839444" xlink:href="#ma51964f500" y="172.563717"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="340.69627" xlink:href="#ma51964f500" y="185.602652"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="346.553095" xlink:href="#ma51964f500" y="199.150944"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="352.409921" xlink:href="#ma51964f500" y="213.175953"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="358.266746" xlink:href="#ma51964f500" y="227.643893"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="364.123571" xlink:href="#ma51964f500" y="242.519907"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="369.980397" xlink:href="#ma51964f500" y="257.768159"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="375.837222" xlink:href="#ma51964f500" y="273.351914"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="381.694048" xlink:href="#ma51964f500" y="289.23363"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="387.550873" xlink:href="#ma51964f500" y="305.375046"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="393.407698" xlink:href="#ma51964f500" y="321.737277"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="399.264524" xlink:href="#ma51964f500" y="338.280903"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="405.121349" xlink:href="#ma51964f500" y="354.96607"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="410.978175" xlink:href="#ma51964f500" y="371.752583"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="416.835" xlink:href="#ma51964f500" y="388.6"/>
+ </g>
+ </g>
+ <g id="patch_3">
+ <path d="M 47.855 388.6
+L 47.855 36.72
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_4">
+ <path d="M 416.835 388.6
+L 416.835 36.72
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_5">
+ <path d="M 47.855 388.6
+L 416.835 388.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_6">
+ <path d="M 47.855 36.72
+L 416.835 36.72
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="axes_2">
+ <g id="patch_7">
+ <path d="M 476.255 388.6
+L 845.235 388.6
+L 845.235 36.72
+L 476.255 36.72
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_3">
+ <g id="xtick_8">
+ <g id="line2d_26">
+ <path clip-path="url(#pd09d21ff00)" d="M 476.255 388.6
+L 476.255 36.72
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_27">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mee698f347f" y="388.6"/>
+ </g>
+ </g>
+ <g id="text_15">
+ <!-- 0.0 -->
+ <g transform="translate(468.303437 403.198438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_9">
+ <g id="line2d_28">
+ <path clip-path="url(#pd09d21ff00)" d="M 550.051 388.6
+L 550.051 36.72
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_29">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="550.051" xlink:href="#mee698f347f" y="388.6"/>
+ </g>
+ </g>
+ <g id="text_16">
+ <!-- 0.2 -->
+ <g transform="translate(542.099437 403.198438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-50"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_10">
+ <g id="line2d_30">
+ <path clip-path="url(#pd09d21ff00)" d="M 623.847 388.6
+L 623.847 36.72
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_31">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.847" xlink:href="#mee698f347f" y="388.6"/>
+ </g>
+ </g>
+ <g id="text_17">
+ <!-- 0.4 -->
+ <g transform="translate(615.895437 403.198438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-52"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_11">
+ <g id="line2d_32">
+ <path clip-path="url(#pd09d21ff00)" d="M 697.643 388.6
+L 697.643 36.72
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_33">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="697.643" xlink:href="#mee698f347f" y="388.6"/>
+ </g>
+ </g>
+ <g id="text_18">
+ <!-- 0.6 -->
+ <g transform="translate(689.691437 403.198438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-54"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_12">
+ <g id="line2d_34">
+ <path clip-path="url(#pd09d21ff00)" d="M 771.439 388.6
+L 771.439 36.72
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_35">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="771.439" xlink:href="#mee698f347f" y="388.6"/>
+ </g>
+ </g>
+ <g id="text_19">
+ <!-- 0.8 -->
+ <g transform="translate(763.487437 403.198438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-56"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_13">
+ <g id="line2d_36">
+ <path clip-path="url(#pd09d21ff00)" d="M 845.235 388.6
+L 845.235 36.72
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_37">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="845.235" xlink:href="#mee698f347f" y="388.6"/>
+ </g>
+ </g>
+ <g id="text_20">
+ <!-- 1.0 -->
+ <g transform="translate(837.283437 403.198438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_21">
+ <!-- Normalized Frequency ($\times \pi$ rad/sample) -->
+ <defs>
+ <path d="M 9.8125 72.90625
+L 23.09375 72.90625
+L 55.421875 11.921875
+L 55.421875 72.90625
+L 64.984375 72.90625
+L 64.984375 0
+L 51.703125 0
+L 19.390625 60.984375
+L 19.390625 0
+L 9.8125 0
+z
+" id="DejaVuSans-78"/>
+ <path d="M 30.609375 48.390625
+Q 23.390625 48.390625 19.1875 42.75
+Q 14.984375 37.109375 14.984375 27.296875
+Q 14.984375 17.484375 19.15625 11.84375
+Q 23.34375 6.203125 30.609375 6.203125
+Q 37.796875 6.203125 41.984375 11.859375
+Q 46.1875 17.53125 46.1875 27.296875
+Q 46.1875 37.015625 41.984375 42.703125
+Q 37.796875 48.390625 30.609375 48.390625
+z
+M 30.609375 56
+Q 42.328125 56 49.015625 48.375
+Q 55.71875 40.765625 55.71875 27.296875
+Q 55.71875 13.875 49.015625 6.21875
+Q 42.328125 -1.421875 30.609375 -1.421875
+Q 18.84375 -1.421875 12.171875 6.21875
+Q 5.515625 13.875 5.515625 27.296875
+Q 5.515625 40.765625 12.171875 48.375
+Q 18.84375 56 30.609375 56
+z
+" id="DejaVuSans-111"/>
+ <path d="M 41.109375 46.296875
+Q 39.59375 47.171875 37.8125 47.578125
+Q 36.03125 48 33.890625 48
+Q 26.265625 48 22.1875 43.046875
+Q 18.109375 38.09375 18.109375 28.8125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 20.953125 51.171875 25.484375 53.578125
+Q 30.03125 56 36.53125 56
+Q 37.453125 56 38.578125 55.875
+Q 39.703125 55.765625 41.0625 55.515625
+z
+" id="DejaVuSans-114"/>
+ <path d="M 5.515625 54.6875
+L 48.1875 54.6875
+L 48.1875 46.484375
+L 14.40625 7.171875
+L 48.1875 7.171875
+L 48.1875 0
+L 4.296875 0
+L 4.296875 8.203125
+L 38.09375 47.515625
+L 5.515625 47.515625
+z
+" id="DejaVuSans-122"/>
+ <path id="DejaVuSans-32"/>
+ <path d="M 9.8125 72.90625
+L 51.703125 72.90625
+L 51.703125 64.59375
+L 19.671875 64.59375
+L 19.671875 43.109375
+L 48.578125 43.109375
+L 48.578125 34.8125
+L 19.671875 34.8125
+L 19.671875 0
+L 9.8125 0
+z
+" id="DejaVuSans-70"/>
+ <path d="M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+M 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+L 45.40625 54.6875
+L 54.390625 54.6875
+L 54.390625 -20.796875
+L 45.40625 -20.796875
+z
+" id="DejaVuSans-113"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-110"/>
+ <path d="M 48.78125 52.59375
+L 48.78125 44.1875
+Q 44.96875 46.296875 41.140625 47.34375
+Q 37.3125 48.390625 33.40625 48.390625
+Q 24.65625 48.390625 19.8125 42.84375
+Q 14.984375 37.3125 14.984375 27.296875
+Q 14.984375 17.28125 19.8125 11.734375
+Q 24.65625 6.203125 33.40625 6.203125
+Q 37.3125 6.203125 41.140625 7.25
+Q 44.96875 8.296875 48.78125 10.40625
+L 48.78125 2.09375
+Q 45.015625 0.34375 40.984375 -0.53125
+Q 36.96875 -1.421875 32.421875 -1.421875
+Q 20.0625 -1.421875 12.78125 6.34375
+Q 5.515625 14.109375 5.515625 27.296875
+Q 5.515625 40.671875 12.859375 48.328125
+Q 20.21875 56 33.015625 56
+Q 37.15625 56 41.109375 55.140625
+Q 45.0625 54.296875 48.78125 52.59375
+z
+" id="DejaVuSans-99"/>
+ <path d="M 32.171875 -5.078125
+Q 28.375 -14.84375 24.75 -17.8125
+Q 21.140625 -20.796875 15.09375 -20.796875
+L 7.90625 -20.796875
+L 7.90625 -13.28125
+L 13.1875 -13.28125
+Q 16.890625 -13.28125 18.9375 -11.515625
+Q 21 -9.765625 23.484375 -3.21875
+L 25.09375 0.875
+L 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 11.921875
+L 46.6875 54.6875
+L 56.203125 54.6875
+z
+" id="DejaVuSans-121"/>
+ <path d="M 31 75.875
+Q 24.46875 64.65625 21.28125 53.65625
+Q 18.109375 42.671875 18.109375 31.390625
+Q 18.109375 20.125 21.3125 9.0625
+Q 24.515625 -2 31 -13.1875
+L 23.1875 -13.1875
+Q 15.875 -1.703125 12.234375 9.375
+Q 8.59375 20.453125 8.59375 31.390625
+Q 8.59375 42.28125 12.203125 53.3125
+Q 15.828125 64.359375 23.1875 75.875
+z
+" id="DejaVuSans-40"/>
+ <path d="M 70.125 53.71875
+L 47.796875 31.296875
+L 70.125 8.984375
+L 64.3125 3.078125
+L 41.890625 25.484375
+L 19.484375 3.078125
+L 13.71875 8.984375
+L 35.984375 31.296875
+L 13.71875 53.71875
+L 19.484375 59.625
+L 41.890625 37.203125
+L 64.3125 59.625
+z
+" id="DejaVuSans-215"/>
+ <path d="M 9.125 54.6875
+L 61.53125 54.6875
+L 59.765625 45.703125
+L 52.875 45.703125
+L 46.34375 12.109375
+Q 45.65625 8.59375 46.578125 7.03125
+Q 47.46875 5.515625 50.140625 5.515625
+Q 50.875 5.515625 51.953125 5.671875
+Q 53.078125 5.765625 53.421875 5.8125
+L 52.15625 -0.6875
+Q 50.34375 -1.3125 48.484375 -1.609375
+Q 46.578125 -1.90625 44.78125 -1.90625
+Q 38.921875 -1.90625 37.3125 1.265625
+Q 35.6875 4.5 37.359375 13.09375
+L 43.703125 45.703125
+L 23.53125 45.703125
+L 14.65625 0
+L 5.46875 0
+L 14.359375 45.703125
+L 7.375 45.703125
+z
+" id="DejaVuSans-Oblique-960"/>
+ <path d="M 25.390625 72.90625
+L 33.6875 72.90625
+L 8.296875 -9.28125
+L 0 -9.28125
+z
+" id="DejaVuSans-47"/>
+ <path d="M 8.015625 75.875
+L 15.828125 75.875
+Q 23.140625 64.359375 26.78125 53.3125
+Q 30.421875 42.28125 30.421875 31.390625
+Q 30.421875 20.453125 26.78125 9.375
+Q 23.140625 -1.703125 15.828125 -13.1875
+L 8.015625 -13.1875
+Q 14.5 -2 17.703125 9.0625
+Q 20.90625 20.125 20.90625 31.390625
+Q 20.90625 42.671875 17.703125 53.65625
+Q 14.5 64.65625 8.015625 75.875
+z
+" id="DejaVuSans-41"/>
+ </defs>
+ <g transform="translate(561.945 416.878125)scale(0.1 -0.1)">
+ <use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-78"/>
+ <use transform="translate(74.804688 0.015625)" xlink:href="#DejaVuSans-111"/>
+ <use transform="translate(135.986328 0.015625)" xlink:href="#DejaVuSans-114"/>
+ <use transform="translate(177.099609 0.015625)" xlink:href="#DejaVuSans-109"/>
+ <use transform="translate(274.511719 0.015625)" xlink:href="#DejaVuSans-97"/>
+ <use transform="translate(335.791016 0.015625)" xlink:href="#DejaVuSans-108"/>
+ <use transform="translate(363.574219 0.015625)" xlink:href="#DejaVuSans-105"/>
+ <use transform="translate(391.357422 0.015625)" xlink:href="#DejaVuSans-122"/>
+ <use transform="translate(443.847656 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(505.371094 0.015625)" xlink:href="#DejaVuSans-100"/>
+ <use transform="translate(568.847656 0.015625)" xlink:href="#DejaVuSans-32"/>
+ <use transform="translate(600.634766 0.015625)" xlink:href="#DejaVuSans-70"/>
+ <use transform="translate(658.154297 0.015625)" xlink:href="#DejaVuSans-114"/>
+ <use transform="translate(699.267578 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(760.791016 0.015625)" xlink:href="#DejaVuSans-113"/>
+ <use transform="translate(824.267578 0.015625)" xlink:href="#DejaVuSans-117"/>
+ <use transform="translate(887.646484 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(949.169922 0.015625)" xlink:href="#DejaVuSans-110"/>
+ <use transform="translate(1012.548828 0.015625)" xlink:href="#DejaVuSans-99"/>
+ <use transform="translate(1067.529297 0.015625)" xlink:href="#DejaVuSans-121"/>
+ <use transform="translate(1126.708984 0.015625)" xlink:href="#DejaVuSans-32"/>
+ <use transform="translate(1158.496094 0.015625)" xlink:href="#DejaVuSans-40"/>
+ <use transform="translate(1197.509766 0.015625)" xlink:href="#DejaVuSans-215"/>
+ <use transform="translate(1281.298828 0.015625)" xlink:href="#DejaVuSans-Oblique-960"/>
+ <use transform="translate(1341.503906 0.015625)" xlink:href="#DejaVuSans-32"/>
+ <use transform="translate(1373.291016 0.015625)" xlink:href="#DejaVuSans-114"/>
+ <use transform="translate(1414.404297 0.015625)" xlink:href="#DejaVuSans-97"/>
+ <use transform="translate(1475.683594 0.015625)" xlink:href="#DejaVuSans-100"/>
+ <use transform="translate(1539.160156 0.015625)" xlink:href="#DejaVuSans-47"/>
+ <use transform="translate(1572.851562 0.015625)" xlink:href="#DejaVuSans-115"/>
+ <use transform="translate(1624.951172 0.015625)" xlink:href="#DejaVuSans-97"/>
+ <use transform="translate(1686.230469 0.015625)" xlink:href="#DejaVuSans-109"/>
+ <use transform="translate(1783.642578 0.015625)" xlink:href="#DejaVuSans-112"/>
+ <use transform="translate(1847.119141 0.015625)" xlink:href="#DejaVuSans-108"/>
+ <use transform="translate(1874.902344 0.015625)" xlink:href="#DejaVuSans-101"/>
+ <use transform="translate(1936.425781 0.015625)" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_4">
+ <g id="ytick_6">
+ <g id="line2d_38">
+ <path clip-path="url(#pd09d21ff00)" d="M 476.255 372.605455
+L 845.235 372.605455
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_39">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mf3541a3da8" y="372.605455"/>
+ </g>
+ </g>
+ <g id="text_22">
+ <!-- −300 -->
+ <defs>
+ <path d="M 10.59375 35.5
+L 73.1875 35.5
+L 73.1875 27.203125
+L 10.59375 27.203125
+z
+" id="DejaVuSans-8722"/>
+ </defs>
+ <g transform="translate(441.787812 376.404673)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-51"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_7">
+ <g id="line2d_40">
+ <path clip-path="url(#pd09d21ff00)" d="M 476.255 324.458418
+L 845.235 324.458418
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_41">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mf3541a3da8" y="324.458418"/>
+ </g>
+ </g>
+ <g id="text_23">
+ <!-- −250 -->
+ <g transform="translate(441.787812 328.257637)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_8">
+ <g id="line2d_42">
+ <path clip-path="url(#pd09d21ff00)" d="M 476.255 276.311381
+L 845.235 276.311381
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_43">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mf3541a3da8" y="276.311381"/>
+ </g>
+ </g>
+ <g id="text_24">
+ <!-- −200 -->
+ <g transform="translate(441.787812 280.1106)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_9">
+ <g id="line2d_44">
+ <path clip-path="url(#pd09d21ff00)" d="M 476.255 228.164344
+L 845.235 228.164344
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_45">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mf3541a3da8" y="228.164344"/>
+ </g>
+ </g>
+ <g id="text_25">
+ <!-- −150 -->
+ <g transform="translate(441.787812 231.963563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_10">
+ <g id="line2d_46">
+ <path clip-path="url(#pd09d21ff00)" d="M 476.255 180.017308
+L 845.235 180.017308
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_47">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mf3541a3da8" y="180.017308"/>
+ </g>
+ </g>
+ <g id="text_26">
+ <!-- −100 -->
+ <g transform="translate(441.787812 183.816526)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_11">
+ <g id="line2d_48">
+ <path clip-path="url(#pd09d21ff00)" d="M 476.255 131.870271
+L 845.235 131.870271
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_49">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mf3541a3da8" y="131.870271"/>
+ </g>
+ </g>
+ <g id="text_27">
+ <!-- −50 -->
+ <g transform="translate(448.150312 135.66949)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-53"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_12">
+ <g id="line2d_50">
+ <path clip-path="url(#pd09d21ff00)" d="M 476.255 83.723234
+L 845.235 83.723234
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_51">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mf3541a3da8" y="83.723234"/>
+ </g>
+ </g>
+ <g id="text_28">
+ <!-- 0 -->
+ <g transform="translate(462.8925 87.522453)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_29">
+ <!-- Gain (dB) -->
+ <defs>
+ <path d="M 59.515625 10.40625
+L 59.515625 29.984375
+L 43.40625 29.984375
+L 43.40625 38.09375
+L 69.28125 38.09375
+L 69.28125 6.78125
+Q 63.578125 2.734375 56.6875 0.65625
+Q 49.8125 -1.421875 42 -1.421875
+Q 24.90625 -1.421875 15.25 8.5625
+Q 5.609375 18.5625 5.609375 36.375
+Q 5.609375 54.25 15.25 64.234375
+Q 24.90625 74.21875 42 74.21875
+Q 49.125 74.21875 55.546875 72.453125
+Q 61.96875 70.703125 67.390625 67.28125
+L 67.390625 56.78125
+Q 61.921875 61.421875 55.765625 63.765625
+Q 49.609375 66.109375 42.828125 66.109375
+Q 29.4375 66.109375 22.71875 58.640625
+Q 16.015625 51.171875 16.015625 36.375
+Q 16.015625 21.625 22.71875 14.15625
+Q 29.4375 6.6875 42.828125 6.6875
+Q 48.046875 6.6875 52.140625 7.59375
+Q 56.25 8.5 59.515625 10.40625
+z
+" id="DejaVuSans-71"/>
+ <path d="M 19.671875 34.8125
+L 19.671875 8.109375
+L 35.5 8.109375
+Q 43.453125 8.109375 47.28125 11.40625
+Q 51.125 14.703125 51.125 21.484375
+Q 51.125 28.328125 47.28125 31.5625
+Q 43.453125 34.8125 35.5 34.8125
+z
+M 19.671875 64.796875
+L 19.671875 42.828125
+L 34.28125 42.828125
+Q 41.5 42.828125 45.03125 45.53125
+Q 48.578125 48.25 48.578125 53.8125
+Q 48.578125 59.328125 45.03125 62.0625
+Q 41.5 64.796875 34.28125 64.796875
+z
+M 9.8125 72.90625
+L 35.015625 72.90625
+Q 46.296875 72.90625 52.390625 68.21875
+Q 58.5 63.53125 58.5 54.890625
+Q 58.5 48.1875 55.375 44.234375
+Q 52.25 40.28125 46.1875 39.3125
+Q 53.46875 37.75 57.5 32.78125
+Q 61.53125 27.828125 61.53125 20.40625
+Q 61.53125 10.640625 54.890625 5.3125
+Q 48.25 0 35.984375 0
+L 9.8125 0
+z
+" id="DejaVuSans-66"/>
+ </defs>
+ <g transform="translate(435.708125 236.251406)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-71"/>
+ <use x="77.490234" xlink:href="#DejaVuSans-97"/>
+ <use x="138.769531" xlink:href="#DejaVuSans-105"/>
+ <use x="166.552734" xlink:href="#DejaVuSans-110"/>
+ <use x="229.931641" xlink:href="#DejaVuSans-32"/>
+ <use x="261.71875" xlink:href="#DejaVuSans-40"/>
+ <use x="300.732422" xlink:href="#DejaVuSans-100"/>
+ <use x="364.208984" xlink:href="#DejaVuSans-66"/>
+ <use x="432.8125" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_52">
+ <path clip-path="url(#pd09d21ff00)" d="M 476.255 52.714545
+L 477.696328 52.837006
+L 479.137656 53.207324
+L 480.578984 53.834694
+L 482.020312 54.73583
+L 483.461641 55.937527
+L 484.902969 57.481548
+L 486.344297 59.434181
+L 487.785625 61.906697
+L 489.226953 65.105648
+L 489.947617 67.100424
+L 490.668281 69.487956
+L 491.388945 72.468761
+L 492.109609 76.490707
+L 492.830273 82.977815
+L 493.550937 364.218816
+L 494.271602 84.548865
+L 494.992266 79.642095
+L 495.71293 77.219475
+L 496.433594 75.867555
+L 497.154258 75.150476
+L 497.874922 74.881946
+L 498.595586 74.971874
+L 499.31625 75.378158
+L 500.036914 76.089258
+L 500.757578 77.11967
+L 501.478242 78.514509
+L 502.198906 80.36699
+L 502.91957 82.866709
+L 503.640234 86.453077
+L 504.360898 92.543436
+L 505.081562 372.605455
+L 505.802227 93.417033
+L 506.522891 88.201598
+L 507.243555 85.492821
+L 507.964219 83.87473
+L 508.684883 82.909324
+L 509.405547 82.408476
+L 510.126211 82.280517
+L 510.846875 82.481975
+L 511.567539 83.000116
+L 512.288203 83.848389
+L 513.008867 85.070985
+L 513.729531 86.760301
+L 514.450195 89.105208
+L 515.170859 92.544468
+L 515.891523 98.494843
+L 516.612187 368.194539
+L 517.332852 99.107804
+L 518.053516 93.770821
+L 518.77418 90.945816
+L 519.494844 89.216465
+L 520.215508 88.144447
+L 520.936172 87.541343
+L 521.656836 87.315217
+L 522.3775 87.42235
+L 523.098164 87.849783
+L 523.818828 88.610757
+L 524.539492 89.749269
+L 525.260156 91.357542
+L 525.98082 93.624279
+L 526.701484 96.988092
+L 527.422148 102.865599
+L 528.142812 371.336337
+L 528.863477 103.340047
+L 529.584141 97.937182
+L 530.304805 95.048398
+L 531.025469 93.257271
+L 531.746133 92.125387
+L 532.466797 91.464239
+L 533.187461 91.181808
+L 533.908125 91.234299
+L 534.628789 91.608678
+L 535.349453 92.318119
+L 536.070117 93.406554
+L 536.790781 94.966143
+L 537.511445 97.185535
+L 538.232109 100.503284
+L 538.952773 106.33596
+L 539.673437 372.605455
+L 540.394102 106.724246
+L 541.114766 101.27996
+L 541.83543 98.350807
+L 542.556094 96.520323
+L 543.276758 95.350057
+L 543.997422 94.651466
+L 544.718086 94.332496
+L 545.43875 94.349321
+L 546.159414 94.688877
+L 546.880078 95.364307
+L 547.600742 96.419517
+L 548.321406 97.94664
+L 549.04207 100.134299
+L 549.762734 103.421024
+L 550.483398 109.223361
+L 551.204062 372.605455
+L 551.924727 109.552939
+L 552.645391 104.080243
+L 553.366055 101.123283
+L 554.086719 99.265575
+L 554.807383 98.068652
+L 555.528047 97.343952
+L 556.248711 96.999407
+L 556.969375 96.991174
+L 557.690039 97.306173
+L 558.410703 97.957533
+L 559.131367 98.989147
+L 559.852031 100.493133
+L 560.572695 102.658102
+L 561.293359 105.922572
+L 562.014023 111.703076
+L 562.734687 372.605455
+L 563.455352 111.990211
+L 564.176016 106.496882
+L 564.89668 103.519668
+L 565.617344 101.642075
+L 566.338008 100.425626
+L 567.058672 99.68175
+L 567.779336 99.318371
+L 568.5 99.291635
+L 569.220664 99.588456
+L 569.941328 100.221955
+L 570.661992 101.236015
+L 571.382656 102.722748
+L 572.10332 104.870758
+L 572.823984 108.118555
+L 573.544648 113.882666
+L 574.265312 372.605455
+L 574.985977 114.137828
+L 575.706641 108.628906
+L 576.427305 105.636354
+L 577.147969 103.743672
+L 577.868633 102.512376
+L 578.589297 101.753893
+L 579.309961 101.376138
+L 580.030625 101.335254
+L 580.751289 101.61815
+L 581.471953 102.23794
+L 582.192617 103.238505
+L 582.913281 104.711952
+L 583.633945 106.84688
+L 584.354609 110.081794
+L 585.075273 115.833218
+L 585.795937 372.605455
+L 586.516602 116.063578
+L 587.237266 110.542533
+L 587.95793 107.538038
+L 588.678594 105.633589
+L 589.399258 104.390701
+L 590.119922 103.620794
+L 590.840586 103.231782
+L 591.56125 103.179805
+L 592.281914 103.451768
+L 593.002578 104.060782
+L 593.723242 105.050726
+L 594.443906 106.513703
+L 595.16457 108.638308
+L 595.885234 111.863047
+L 596.605898 117.604439
+L 597.326562 372.206444
+L 598.047227 117.815152
+L 598.767891 112.284489
+L 599.488555 109.270509
+L 600.209219 107.356707
+L 600.929883 106.104593
+L 601.650547 105.325588
+L 602.371211 104.927601
+L 603.091875 104.866772
+L 603.812539 105.130002
+L 604.533203 105.730403
+L 605.253867 106.711849
+L 605.974531 108.166443
+L 606.695195 110.282777
+L 607.415859 113.499356
+L 608.136523 119.232696
+L 608.857187 372.605455
+L 609.577852 119.427628
+L 610.298516 113.88923
+L 611.01918 110.867618
+L 611.739844 108.946284
+L 612.460508 107.686738
+L 613.181172 106.900398
+L 613.901836 106.495173
+L 614.6225 106.427201
+L 615.343164 106.683381
+L 616.063828 107.276824
+L 616.784492 108.251403
+L 617.505156 109.699219
+L 618.22582 111.808864
+L 618.946484 115.018841
+L 619.667148 120.745664
+L 620.387812 372.605455
+L 621.108477 120.927815
+L 621.829141 115.383152
+L 622.549805 112.355355
+L 623.270469 110.427917
+L 623.991133 109.162345
+L 624.711797 108.370058
+L 625.432461 107.958963
+L 626.153125 107.885197
+L 626.873789 108.135658
+L 627.594453 108.723457
+L 628.315117 109.692465
+L 629.035781 111.134782
+L 629.756445 113.239001
+L 630.477109 116.443621
+L 631.197773 122.165159
+L 631.918437 372.605455
+L 632.639102 122.336944
+L 633.359766 116.787199
+L 634.08043 113.754388
+L 634.801094 111.822001
+L 635.521758 110.551547
+L 636.242422 109.754442
+L 636.963086 109.338593
+L 637.68375 109.260135
+L 638.404414 109.505969
+L 639.125078 110.089201
+L 639.845742 111.053704
+L 640.566406 112.491577
+L 641.28707 114.591411
+L 642.007734 117.791707
+L 642.728398 123.50898
+L 643.449062 368.552158
+L 644.169727 123.672409
+L 644.890391 118.118572
+L 645.611055 115.081726
+L 646.331719 113.145361
+L 647.052383 111.870985
+L 647.773047 111.070012
+L 648.493711 110.650351
+L 649.214375 110.568136
+L 649.935039 110.810266
+L 650.655703 111.389848
+L 651.376367 112.350754
+L 652.097031 113.785083
+L 652.817695 115.881427
+L 653.538359 119.078283
+L 654.259023 124.792167
+L 654.979687 364.46514
+L 655.700352 124.948974
+L 656.421016 119.391903
+L 657.14168 116.351872
+L 657.862344 114.412373
+L 658.583008 113.134911
+L 659.303672 112.330903
+L 660.024336 111.908255
+L 660.745 111.823102
+L 661.465664 112.062342
+L 662.186328 112.639083
+L 662.906992 113.597196
+L 663.627656 115.02878
+L 664.34832 117.122425
+L 665.068984 120.316631
+L 665.789648 126.027912
+L 666.510312 365.411917
+L 667.230977 126.179652
+L 667.951641 120.620117
+L 668.672305 117.577669
+L 669.392969 115.635798
+L 670.113633 114.35601
+L 670.834297 113.549723
+L 671.554961 113.124841
+L 672.275625 113.0375
+L 672.996289 113.274597
+L 673.716953 113.84924
+L 674.437617 114.805301
+L 675.158281 116.234877
+L 675.878945 118.32656
+L 676.599609 121.518847
+L 677.320273 127.228255
+L 678.040937 372.072346
+L 678.761602 127.376384
+L 679.482266 121.81511
+L 680.20293 118.770967
+L 680.923594 116.827446
+L 681.644258 115.546054
+L 682.364922 114.738205
+L 683.085586 114.311807
+L 683.80625 114.222994
+L 684.526914 114.458664
+L 685.247578 115.031924
+L 685.968242 115.986645
+L 686.688906 117.414928
+L 687.40957 119.505361
+L 688.130234 122.696444
+L 688.850898 128.404692
+L 689.571562 372.605455
+L 690.292227 128.550634
+L 691.012891 122.988335
+L 691.733555 119.943212
+L 692.454219 117.998755
+L 693.174883 116.716473
+L 693.895547 115.907779
+L 694.616211 115.480582
+L 695.336875 115.391014
+L 696.057539 115.625976
+L 696.778203 116.198574
+L 697.498867 117.15268
+L 698.219531 118.580393
+L 698.940195 120.670302
+L 699.660859 123.860909
+L 700.381523 129.568727
+L 701.102187 372.605455
+L 701.822852 129.713951
+L 702.543516 124.151364
+L 703.26418 121.106001
+L 703.984844 119.161353
+L 704.705508 117.878927
+L 705.426172 117.070138
+L 706.146836 116.642895
+L 706.8675 116.553331
+L 707.588164 116.788346
+L 708.308828 117.361047
+L 709.029492 118.315306
+L 709.750156 119.743222
+L 710.47082 121.833387
+L 711.191484 125.0243
+L 711.912148 130.732476
+L 712.632812 372.605455
+L 713.353477 130.878573
+L 714.074141 125.316502
+L 714.794805 122.271708
+L 715.515469 120.327684
+L 716.236133 119.045935
+L 716.956797 118.23788
+L 717.677461 117.811425
+L 718.398125 117.722705
+L 719.118789 117.958621
+L 719.839453 118.53228
+L 720.560117 119.487555
+L 721.280781 120.916546
+L 722.001445 123.007844
+L 722.722109 126.199949
+L 723.442773 131.909378
+L 724.163437 372.605455
+L 724.884102 132.058166
+L 725.604766 126.497533
+L 726.32543 123.45424
+L 727.046094 121.51178
+L 727.766758 120.231662
+L 728.487422 119.425302
+L 729.208086 119.000608
+L 729.92875 118.913717
+L 730.649414 119.15153
+L 731.370078 119.727155
+L 732.090742 120.684465
+L 732.811406 122.115562
+L 733.53207 124.209038
+L 734.252734 127.403395
+L 734.973398 133.115149
+L 735.694062 371.304655
+L 736.414727 133.268812
+L 737.135391 127.710732
+L 737.856055 124.670071
+L 738.576719 122.730323
+L 739.297383 121.452996
+L 740.018047 120.64951
+L 740.738711 120.227774
+L 741.459375 120.143925
+L 742.180039 120.384866
+L 742.900703 120.963707
+L 743.621367 121.924323
+L 744.342031 123.358816
+L 745.062695 125.45578
+L 745.783359 128.653718
+L 746.504023 134.36915
+L 747.224687 367.378554
+L 747.945352 134.530461
+L 748.666016 128.976355
+L 749.38668 125.93977
+L 750.107344 124.004203
+L 750.828008 122.731165
+L 751.548672 121.932075
+L 752.269336 121.514846
+L 752.99 121.435618
+L 753.710664 121.681294
+L 754.431328 122.264988
+L 755.151992 123.230576
+L 755.872656 124.670164
+L 756.59332 126.772347
+L 757.313984 129.975633
+L 758.034648 135.696542
+L 758.755312 366.344485
+L 759.475977 135.86921
+L 760.196641 130.32099
+L 760.917305 127.290433
+L 761.637969 125.361039
+L 762.358633 124.094322
+L 763.079297 123.301705
+L 763.799961 122.891105
+L 764.520625 122.818665
+L 765.241289 123.071292
+L 765.961953 123.662104
+L 766.682617 124.634981
+L 767.403281 126.082033
+L 768.123945 128.19186
+L 768.844609 131.402973
+L 769.565273 137.131899
+L 770.285937 372.605455
+L 771.006602 137.321185
+L 771.727266 131.781577
+L 772.44793 128.759841
+L 773.168594 126.839483
+L 773.889258 125.582022
+L 774.609922 124.798889
+L 775.330586 124.398006
+L 776.05125 124.335521
+L 776.771914 124.598351
+L 777.492578 125.199618
+L 778.213242 126.183211
+L 778.933906 127.641248
+L 779.65457 129.762336
+L 780.375234 132.984996
+L 781.095898 138.72576
+L 781.816562 372.605455
+L 782.537227 138.939641
+L 783.257891 133.412808
+L 783.978555 130.404179
+L 784.699219 128.49727
+L 785.419883 127.253612
+L 786.140547 126.484648
+L 786.861211 126.09831
+L 787.581875 126.050763
+L 788.302539 126.328933
+L 789.023203 126.945958
+L 789.743867 127.945742
+L 790.464531 129.420418
+L 791.185195 131.55861
+L 791.905859 134.798853
+L 792.626523 140.5577
+L 793.347187 372.605455
+L 794.067852 140.809321
+L 794.788516 135.302184
+L 795.50918 132.313832
+L 796.229844 130.427803
+L 796.950508 129.205653
+L 797.671172 128.458848
+L 798.391836 128.095351
+L 799.1125 128.071351
+L 799.833164 128.373809
+L 800.553828 129.015893
+L 801.274492 130.04154
+L 801.995156 131.542919
+L 802.71582 133.708693
+L 803.436484 136.977438
+L 804.157148 142.765749
+L 804.877812 372.605455
+L 805.598477 143.079372
+L 806.319141 137.604873
+L 807.039805 134.650324
+L 807.760469 132.799322
+L 808.481133 131.613487
+L 809.201797 130.904353
+L 809.922461 130.579955
+L 810.643125 130.596562
+L 811.363789 130.941217
+L 812.084453 131.627181
+L 812.805117 132.698488
+L 813.525781 134.247413
+L 814.246445 136.462733
+L 814.967109 139.783148
+L 815.687773 145.625389
+L 816.408437 372.605455
+L 817.129102 146.054242
+L 817.849766 140.641378
+L 818.57043 137.751392
+L 819.291094 135.968088
+L 820.011758 134.853316
+L 820.732422 134.218861
+L 821.453086 133.973036
+L 822.17375 134.072418
+L 822.894414 134.504391
+L 823.615078 135.282595
+L 824.335742 136.45149
+L 825.056406 138.103823
+L 825.77707 140.428907
+L 826.497734 143.866045
+L 827.218398 149.832648
+L 827.939062 372.605455
+L 828.659727 150.536367
+L 829.380391 145.275916
+L 830.101055 142.549849
+L 830.821719 140.943341
+L 831.542383 140.019845
+L 832.263047 139.593039
+L 832.983711 139.573481
+L 833.704375 139.920438
+L 834.425039 140.62455
+L 835.145703 141.703444
+L 835.866367 143.206512
+L 836.587031 145.232708
+L 837.307695 147.979266
+L 838.028359 151.895808
+L 838.749023 158.413496
+L 839.469687 367.604324
+L 840.190352 160.517591
+L 840.911016 156.172555
+L 841.63168 154.580226
+L 842.352344 154.429904
+L 843.073008 155.481459
+L 843.793672 157.99164
+L 844.514336 163.289386
+L 844.514336 163.289386
+" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
+ </g>
+ <g id="patch_8">
+ <path d="M 476.255 388.6
+L 476.255 36.72
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_9">
+ <path d="M 845.235 388.6
+L 845.235 36.72
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_10">
+ <path d="M 476.255 388.6
+L 845.235 388.6
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_11">
+ <path d="M 476.255 36.72
+L 845.235 36.72
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ </g>
+ <g id="text_30">
+ <!-- Cosine window (numpy compatible) -->
+ <defs>
+ <path d="M 64.40625 67.28125
+L 64.40625 56.890625
+Q 59.421875 61.53125 53.78125 63.8125
+Q 48.140625 66.109375 41.796875 66.109375
+Q 29.296875 66.109375 22.65625 58.46875
+Q 16.015625 50.828125 16.015625 36.375
+Q 16.015625 21.96875 22.65625 14.328125
+Q 29.296875 6.6875 41.796875 6.6875
+Q 48.140625 6.6875 53.78125 8.984375
+Q 59.421875 11.28125 64.40625 15.921875
+L 64.40625 5.609375
+Q 59.234375 2.09375 53.4375 0.328125
+Q 47.65625 -1.421875 41.21875 -1.421875
+Q 24.65625 -1.421875 15.125 8.703125
+Q 5.609375 18.84375 5.609375 36.375
+Q 5.609375 53.953125 15.125 64.078125
+Q 24.65625 74.21875 41.21875 74.21875
+Q 47.75 74.21875 53.53125 72.484375
+Q 59.328125 70.75 64.40625 67.28125
+z
+" id="DejaVuSans-67"/>
+ <path d="M 4.203125 54.6875
+L 13.1875 54.6875
+L 24.421875 12.015625
+L 35.59375 54.6875
+L 46.1875 54.6875
+L 57.421875 12.015625
+L 68.609375 54.6875
+L 77.59375 54.6875
+L 63.28125 0
+L 52.6875 0
+L 40.921875 44.828125
+L 29.109375 0
+L 18.5 0
+z
+" id="DejaVuSans-119"/>
+ <path d="M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+M 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 75.984375
+L 18.109375 75.984375
+z
+" id="DejaVuSans-98"/>
+ </defs>
+ <g transform="translate(288.51875 20.7975)scale(0.16 -0.16)">
+ <use xlink:href="#DejaVuSans-67"/>
+ <use x="69.824219" xlink:href="#DejaVuSans-111"/>
+ <use x="131.005859" xlink:href="#DejaVuSans-115"/>
+ <use x="183.105469" xlink:href="#DejaVuSans-105"/>
+ <use x="210.888672" xlink:href="#DejaVuSans-110"/>
+ <use x="274.267578" xlink:href="#DejaVuSans-101"/>
+ <use x="335.791016" xlink:href="#DejaVuSans-32"/>
+ <use x="367.578125" xlink:href="#DejaVuSans-119"/>
+ <use x="449.365234" xlink:href="#DejaVuSans-105"/>
+ <use x="477.148438" xlink:href="#DejaVuSans-110"/>
+ <use x="540.527344" xlink:href="#DejaVuSans-100"/>
+ <use x="604.003906" xlink:href="#DejaVuSans-111"/>
+ <use x="665.185547" xlink:href="#DejaVuSans-119"/>
+ <use x="746.972656" xlink:href="#DejaVuSans-32"/>
+ <use x="778.759766" xlink:href="#DejaVuSans-40"/>
+ <use x="817.773438" xlink:href="#DejaVuSans-110"/>
+ <use x="881.152344" xlink:href="#DejaVuSans-117"/>
+ <use x="944.53125" xlink:href="#DejaVuSans-109"/>
+ <use x="1041.943359" xlink:href="#DejaVuSans-112"/>
+ <use x="1105.419922" xlink:href="#DejaVuSans-121"/>
+ <use x="1164.599609" xlink:href="#DejaVuSans-32"/>
+ <use x="1196.386719" xlink:href="#DejaVuSans-99"/>
+ <use x="1251.367188" xlink:href="#DejaVuSans-111"/>
+ <use x="1312.548828" xlink:href="#DejaVuSans-109"/>
+ <use x="1409.960938" xlink:href="#DejaVuSans-112"/>
+ <use x="1473.4375" xlink:href="#DejaVuSans-97"/>
+ <use x="1534.716797" xlink:href="#DejaVuSans-116"/>
+ <use x="1573.925781" xlink:href="#DejaVuSans-105"/>
+ <use x="1601.708984" xlink:href="#DejaVuSans-98"/>
+ <use x="1665.185547" xlink:href="#DejaVuSans-108"/>
+ <use x="1692.96875" xlink:href="#DejaVuSans-101"/>
+ <use x="1754.492188" xlink:href="#DejaVuSans-41"/>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="pc9909b1bc7">
+ <rect height="351.88" width="368.98" x="47.855" y="36.72"/>
+ </clipPath>
+ <clipPath id="pd09d21ff00">
+ <rect height="351.88" width="368.98" x="476.255" y="36.72"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/docs/docs/img/window_flattop.svg b/docs/docs/img/window_flattop.svg
@@ -19,28 +19,28 @@ z
</g>
<g id="axes_1">
<g id="patch_2">
- <path d="M 38.27 387.16
-L 410.85 387.16
-L 410.85 39.24
-L 38.27 39.24
+ <path d="M 47.855 388.6
+L 416.8575 388.6
+L 416.8575 36.72
+L 47.855 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
- <path clip-path="url(#pf343411e61)" d="M 38.27 387.16
-L 38.27 39.24
+ <path clip-path="url(#pc0db56b267)" d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
-" id="m8074d2e5c9" style="stroke:#000000;stroke-width:0.8;"/>
+" id="ma808dad104" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="38.27" xlink:href="#m8074d2e5c9" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#ma808dad104" y="388.6"/>
</g>
</g>
<g id="text_1">
@@ -68,20 +68,20 @@ Q 19.53125 74.21875 31.78125 74.21875
z
" id="DejaVuSans-48"/>
</defs>
- <g transform="translate(35.08875 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(44.67375 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
- <path clip-path="url(#pf343411e61)" d="M 97.409683 387.16
-L 97.409683 39.24
+ <path clip-path="url(#pc0db56b267)" d="M 106.426825 388.6
+L 106.426825 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="97.409683" xlink:href="#m8074d2e5c9" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="106.426825" xlink:href="#ma808dad104" y="388.6"/>
</g>
</g>
<g id="text_2">
@@ -101,7 +101,7 @@ L 12.40625 0
z
" id="DejaVuSans-49"/>
</defs>
- <g transform="translate(91.047183 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(100.064325 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -109,13 +109,13 @@ z
</g>
<g id="xtick_3">
<g id="line2d_5">
- <path clip-path="url(#pf343411e61)" d="M 156.549365 387.16
-L 156.549365 39.24
+ <path clip-path="url(#pc0db56b267)" d="M 164.998651 388.6
+L 164.998651 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="156.549365" xlink:href="#m8074d2e5c9" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="164.998651" xlink:href="#ma808dad104" y="388.6"/>
</g>
</g>
<g id="text_3">
@@ -146,7 +146,7 @@ Q 31.109375 20.453125 19.1875 8.296875
z
" id="DejaVuSans-50"/>
</defs>
- <g transform="translate(150.186865 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(158.636151 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -154,13 +154,13 @@ z
</g>
<g id="xtick_4">
<g id="line2d_7">
- <path clip-path="url(#pf343411e61)" d="M 215.689048 387.16
-L 215.689048 39.24
+ <path clip-path="url(#pc0db56b267)" d="M 223.570476 388.6
+L 223.570476 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_8">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="215.689048" xlink:href="#m8074d2e5c9" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="223.570476" xlink:href="#ma808dad104" y="388.6"/>
</g>
</g>
<g id="text_4">
@@ -199,7 +199,7 @@ Q 46.96875 40.921875 40.578125 39.3125
z
" id="DejaVuSans-51"/>
</defs>
- <g transform="translate(209.326548 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(217.207976 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-51"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -207,13 +207,13 @@ z
</g>
<g id="xtick_5">
<g id="line2d_9">
- <path clip-path="url(#pf343411e61)" d="M 274.82873 387.16
-L 274.82873 39.24
+ <path clip-path="url(#pc0db56b267)" d="M 282.142302 388.6
+L 282.142302 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_10">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="274.82873" xlink:href="#m8074d2e5c9" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="282.142302" xlink:href="#ma808dad104" y="388.6"/>
</g>
</g>
<g id="text_5">
@@ -237,7 +237,7 @@ L 4.890625 26.703125
z
" id="DejaVuSans-52"/>
</defs>
- <g transform="translate(268.46623 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(275.779802 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-52"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -245,13 +245,13 @@ z
</g>
<g id="xtick_6">
<g id="line2d_11">
- <path clip-path="url(#pf343411e61)" d="M 333.968413 387.16
-L 333.968413 39.24
+ <path clip-path="url(#pc0db56b267)" d="M 340.714127 388.6
+L 340.714127 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_12">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="333.968413" xlink:href="#m8074d2e5c9" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="340.714127" xlink:href="#ma808dad104" y="388.6"/>
</g>
</g>
<g id="text_6">
@@ -282,7 +282,7 @@ Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-53"/>
</defs>
- <g transform="translate(327.605913 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(334.351627 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-53"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -290,13 +290,13 @@ z
</g>
<g id="xtick_7">
<g id="line2d_13">
- <path clip-path="url(#pf343411e61)" d="M 393.108095 387.16
-L 393.108095 39.24
+ <path clip-path="url(#pc0db56b267)" d="M 399.285952 388.6
+L 399.285952 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_14">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="393.108095" xlink:href="#m8074d2e5c9" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="399.285952" xlink:href="#ma808dad104" y="388.6"/>
</g>
</g>
<g id="text_7">
@@ -333,7 +333,7 @@ Q 48.484375 72.75 52.59375 71.296875
z
" id="DejaVuSans-54"/>
</defs>
- <g transform="translate(386.745595 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(392.923452 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-54"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -523,7 +523,7 @@ Q 40.578125 54.546875 44.28125 53.078125
z
" id="DejaVuSans-115"/>
</defs>
- <g transform="translate(203.206875 415.436563)scale(0.1 -0.1)">
+ <g transform="translate(211.003125 416.876562)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-83"/>
<use x="63.476562" xlink:href="#DejaVuSans-97"/>
<use x="124.755859" xlink:href="#DejaVuSans-109"/>
@@ -537,100 +537,179 @@ z
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_15">
- <path clip-path="url(#pf343411e61)" d="M 38.27 364.961797
-L 410.85 364.961797
+ <path clip-path="url(#pc0db56b267)" d="M 47.855 366.55665
+L 416.8575 366.55665
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_16">
<defs>
<path d="M 0 0
L -3.5 0
-" id="m16f260463d" style="stroke:#000000;stroke-width:0.8;"/>
+" id="md23aa5d281" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="38.27" xlink:href="#m16f260463d" y="364.961797"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md23aa5d281" y="366.55665"/>
</g>
</g>
<g id="text_9">
- <!-- 0 -->
- <g transform="translate(24.9075 368.761016)scale(0.1 -0.1)">
+ <!-- 0.0 -->
+ <defs>
+ <path d="M 10.6875 12.40625
+L 21 12.40625
+L 21 0
+L 10.6875 0
+z
+" id="DejaVuSans-46"/>
+ </defs>
+ <g transform="translate(24.951875 370.355869)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_2">
<g id="line2d_17">
- <path clip-path="url(#pf343411e61)" d="M 38.27 298.07863
-L 410.85 298.07863
+ <path clip-path="url(#pc0db56b267)" d="M 47.855 303.754227
+L 416.8575 303.754227
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_18">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="38.27" xlink:href="#m16f260463d" y="298.07863"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md23aa5d281" y="303.754227"/>
</g>
</g>
<g id="text_10">
- <!-- 1 -->
- <g transform="translate(24.9075 301.877849)scale(0.1 -0.1)">
- <use xlink:href="#DejaVuSans-49"/>
+ <!-- 0.2 -->
+ <g transform="translate(24.951875 307.553446)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-50"/>
</g>
</g>
</g>
<g id="ytick_3">
<g id="line2d_19">
- <path clip-path="url(#pf343411e61)" d="M 38.27 231.195464
-L 410.85 231.195464
+ <path clip-path="url(#pc0db56b267)" d="M 47.855 240.951804
+L 416.8575 240.951804
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_20">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="38.27" xlink:href="#m16f260463d" y="231.195464"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md23aa5d281" y="240.951804"/>
</g>
</g>
<g id="text_11">
- <!-- 2 -->
- <g transform="translate(24.9075 234.994682)scale(0.1 -0.1)">
- <use xlink:href="#DejaVuSans-50"/>
+ <!-- 0.4 -->
+ <g transform="translate(24.951875 244.751023)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-52"/>
</g>
</g>
</g>
<g id="ytick_4">
<g id="line2d_21">
- <path clip-path="url(#pf343411e61)" d="M 38.27 164.312297
-L 410.85 164.312297
+ <path clip-path="url(#pc0db56b267)" d="M 47.855 178.149381
+L 416.8575 178.149381
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_22">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="38.27" xlink:href="#m16f260463d" y="164.312297"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md23aa5d281" y="178.149381"/>
</g>
</g>
<g id="text_12">
- <!-- 3 -->
- <g transform="translate(24.9075 168.111516)scale(0.1 -0.1)">
- <use xlink:href="#DejaVuSans-51"/>
+ <!-- 0.6 -->
+ <g transform="translate(24.951875 181.9486)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-54"/>
</g>
</g>
</g>
<g id="ytick_5">
<g id="line2d_23">
- <path clip-path="url(#pf343411e61)" d="M 38.27 97.429131
-L 410.85 97.429131
+ <path clip-path="url(#pc0db56b267)" d="M 47.855 115.346958
+L 416.8575 115.346958
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_24">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="38.27" xlink:href="#m16f260463d" y="97.429131"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md23aa5d281" y="115.346958"/>
</g>
</g>
<g id="text_13">
- <!-- 4 -->
- <g transform="translate(24.9075 101.228349)scale(0.1 -0.1)">
- <use xlink:href="#DejaVuSans-52"/>
+ <!-- 0.8 -->
+ <defs>
+ <path d="M 31.78125 34.625
+Q 24.75 34.625 20.71875 30.859375
+Q 16.703125 27.09375 16.703125 20.515625
+Q 16.703125 13.921875 20.71875 10.15625
+Q 24.75 6.390625 31.78125 6.390625
+Q 38.8125 6.390625 42.859375 10.171875
+Q 46.921875 13.96875 46.921875 20.515625
+Q 46.921875 27.09375 42.890625 30.859375
+Q 38.875 34.625 31.78125 34.625
+z
+M 21.921875 38.8125
+Q 15.578125 40.375 12.03125 44.71875
+Q 8.5 49.078125 8.5 55.328125
+Q 8.5 64.0625 14.71875 69.140625
+Q 20.953125 74.21875 31.78125 74.21875
+Q 42.671875 74.21875 48.875 69.140625
+Q 55.078125 64.0625 55.078125 55.328125
+Q 55.078125 49.078125 51.53125 44.71875
+Q 48 40.375 41.703125 38.8125
+Q 48.828125 37.15625 52.796875 32.3125
+Q 56.78125 27.484375 56.78125 20.515625
+Q 56.78125 9.90625 50.3125 4.234375
+Q 43.84375 -1.421875 31.78125 -1.421875
+Q 19.734375 -1.421875 13.25 4.234375
+Q 6.78125 9.90625 6.78125 20.515625
+Q 6.78125 27.484375 10.78125 32.3125
+Q 14.796875 37.15625 21.921875 38.8125
+z
+M 18.3125 54.390625
+Q 18.3125 48.734375 21.84375 45.5625
+Q 25.390625 42.390625 31.78125 42.390625
+Q 38.140625 42.390625 41.71875 45.5625
+Q 45.3125 48.734375 45.3125 54.390625
+Q 45.3125 60.0625 41.71875 63.234375
+Q 38.140625 66.40625 31.78125 66.40625
+Q 25.390625 66.40625 21.84375 63.234375
+Q 18.3125 60.0625 18.3125 54.390625
+z
+" id="DejaVuSans-56"/>
+ </defs>
+ <g transform="translate(24.951875 119.146176)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-56"/>
</g>
</g>
</g>
- <g id="text_14">
+ <g id="ytick_6">
+ <g id="line2d_25">
+ <path clip-path="url(#pc0db56b267)" d="M 47.855 52.544535
+L 416.8575 52.544535
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_26">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md23aa5d281" y="52.544535"/>
+ </g>
+ </g>
+ <g id="text_14">
+ <!-- 1.0 -->
+ <g transform="translate(24.951875 56.343753)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-49"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-46"/>
+ <use x="95.410156" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_15">
<!-- Amplitude -->
<defs>
<path d="M 34.1875 63.1875
@@ -726,7 +805,7 @@ Q 14.796875 37.203125 14.796875 27.296875
z
" id="DejaVuSans-100"/>
</defs>
- <g transform="translate(18.827813 238.822656)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(18.872187 238.282656)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-65"/>
<use x="68.408203" xlink:href="#DejaVuSans-109"/>
<use x="165.820312" xlink:href="#DejaVuSans-112"/>
@@ -739,71 +818,71 @@ z
</g>
</g>
</g>
- <g id="line2d_25">
- <path clip-path="url(#pf343411e61)" d="M 38.27 364.961797
-L 44.183968 365.025189
-L 50.097937 365.233249
-L 56.011905 365.636781
-L 61.925873 366.311096
-L 67.839841 367.342454
-L 73.75381 368.810137
-L 79.667778 370.765317
-L 85.581746 373.208406
-L 91.495714 376.066979
-L 97.409683 379.176844
-L 103.323651 382.268965
-L 109.237619 384.964995
-L 115.151587 386.783722
-L 121.065556 387.16
-L 126.979524 385.476649
-L 132.893492 381.10837
-L 138.80746 373.475252
-L 144.721429 362.101924
-L 150.635397 346.677197
-L 156.549365 327.108232
-L 162.463333 303.56305
-L 168.377302 276.49573
-L 174.29127 246.64979
-L 180.205238 215.037118
-L 186.119206 182.892074
-L 192.033175 151.602954
-L 197.947143 122.625404
-L 203.861111 97.38457
-L 209.775079 77.174205
-L 215.689048 63.061682
-L 221.603016 55.807619
-L 227.516984 55.807619
-L 233.430952 63.061682
-L 239.344921 77.174205
-L 245.258889 97.38457
-L 251.172857 122.625404
-L 257.086825 151.602954
-L 263.000794 182.892074
-L 268.914762 215.037118
-L 274.82873 246.64979
-L 280.742698 276.49573
-L 286.656667 303.56305
-L 292.570635 327.108232
-L 298.484603 346.677197
-L 304.398571 362.101924
-L 310.31254 373.475252
-L 316.226508 381.10837
-L 322.140476 385.476649
-L 328.054444 387.16
-L 333.968413 386.783722
-L 339.882381 384.964995
-L 345.796349 382.268965
-L 351.710317 379.176844
-L 357.624286 376.066979
-L 363.538254 373.208406
-L 369.452222 370.765317
-L 375.36619 368.810137
-L 381.280159 367.342454
-L 387.194127 366.311096
-L 393.108095 365.636781
-L 399.022063 365.233249
-L 404.936032 365.025189
-L 410.85 364.961797
+ <g id="line2d_27">
+ <path clip-path="url(#pc0db56b267)" d="M 47.855 366.688865
+L 53.712183 366.770338
+L 59.569365 367.029463
+L 65.426548 367.508028
+L 71.28373 368.267958
+L 77.140913 369.379942
+L 82.998095 370.908018
+L 88.855278 372.890913
+L 94.71246 375.321341
+L 100.569643 378.125102
+L 106.426825 381.142279
+L 112.284008 384.113267
+L 118.14119 386.672495
+L 123.998373 388.352451
+L 129.855556 388.6
+L 135.712738 386.805892
+L 141.569921 382.346954
+L 147.427103 374.638837
+L 153.284286 363.195554
+L 159.141468 347.690635
+L 164.998651 328.013732
+L 170.855833 304.316142
+L 176.713016 277.039131
+L 182.570198 246.920064
+L 188.427381 214.973262
+L 194.284563 182.444858
+L 200.141746 150.743678
+L 205.998929 121.35278
+L 211.856111 95.728629
+L 217.713294 75.196549
+L 223.570476 60.851899
+L 229.427659 53.47619
+L 235.284841 53.47619
+L 241.142024 60.851899
+L 246.999206 75.196549
+L 252.856389 95.728629
+L 258.713571 121.35278
+L 264.570754 150.743678
+L 270.427937 182.444858
+L 276.285119 214.973262
+L 282.142302 246.920064
+L 287.999484 277.039131
+L 293.856667 304.316142
+L 299.713849 328.013732
+L 305.571032 347.690635
+L 311.428214 363.195554
+L 317.285397 374.638837
+L 323.142579 382.346954
+L 328.999762 386.805892
+L 334.856944 388.6
+L 340.714127 388.352451
+L 346.57131 386.672495
+L 352.428492 384.113267
+L 358.285675 381.142279
+L 364.142857 378.125102
+L 370.00004 375.321341
+L 375.857222 372.890913
+L 381.714405 370.908018
+L 387.571587 369.379942
+L 393.42877 368.267958
+L 399.285952 367.508028
+L 405.143135 367.029463
+L 411.000317 366.770338
+L 416.8575 366.688865
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
<defs>
<path d="M 0 1.5
@@ -816,128 +895,120 @@ C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0
C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066
C -0.77937 1.341951 -0.397805 1.5 0 1.5
z
-" id="md15e1ac7b5" style="stroke:#0072bd;"/>
+" id="m455922ac46" style="stroke:#0072bd;"/>
</defs>
- <g clip-path="url(#pf343411e61)">
- <use style="fill:#0072bd;stroke:#0072bd;" x="38.27" xlink:href="#md15e1ac7b5" y="364.961797"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="44.183968" xlink:href="#md15e1ac7b5" y="365.025189"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="50.097937" xlink:href="#md15e1ac7b5" y="365.233249"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="56.011905" xlink:href="#md15e1ac7b5" y="365.636781"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="61.925873" xlink:href="#md15e1ac7b5" y="366.311096"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="67.839841" xlink:href="#md15e1ac7b5" y="367.342454"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="73.75381" xlink:href="#md15e1ac7b5" y="368.810137"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="79.667778" xlink:href="#md15e1ac7b5" y="370.765317"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="85.581746" xlink:href="#md15e1ac7b5" y="373.208406"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="91.495714" xlink:href="#md15e1ac7b5" y="376.066979"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="97.409683" xlink:href="#md15e1ac7b5" y="379.176844"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="103.323651" xlink:href="#md15e1ac7b5" y="382.268965"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="109.237619" xlink:href="#md15e1ac7b5" y="384.964995"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="115.151587" xlink:href="#md15e1ac7b5" y="386.783722"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="121.065556" xlink:href="#md15e1ac7b5" y="387.16"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="126.979524" xlink:href="#md15e1ac7b5" y="385.476649"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="132.893492" xlink:href="#md15e1ac7b5" y="381.10837"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="138.80746" xlink:href="#md15e1ac7b5" y="373.475252"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="144.721429" xlink:href="#md15e1ac7b5" y="362.101924"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="150.635397" xlink:href="#md15e1ac7b5" y="346.677197"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="156.549365" xlink:href="#md15e1ac7b5" y="327.108232"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="162.463333" xlink:href="#md15e1ac7b5" y="303.56305"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="168.377302" xlink:href="#md15e1ac7b5" y="276.49573"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="174.29127" xlink:href="#md15e1ac7b5" y="246.64979"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="180.205238" xlink:href="#md15e1ac7b5" y="215.037118"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="186.119206" xlink:href="#md15e1ac7b5" y="182.892074"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="192.033175" xlink:href="#md15e1ac7b5" y="151.602954"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="197.947143" xlink:href="#md15e1ac7b5" y="122.625404"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="203.861111" xlink:href="#md15e1ac7b5" y="97.38457"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="209.775079" xlink:href="#md15e1ac7b5" y="77.174205"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="215.689048" xlink:href="#md15e1ac7b5" y="63.061682"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="221.603016" xlink:href="#md15e1ac7b5" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="227.516984" xlink:href="#md15e1ac7b5" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="233.430952" xlink:href="#md15e1ac7b5" y="63.061682"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="239.344921" xlink:href="#md15e1ac7b5" y="77.174205"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="245.258889" xlink:href="#md15e1ac7b5" y="97.38457"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="251.172857" xlink:href="#md15e1ac7b5" y="122.625404"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="257.086825" xlink:href="#md15e1ac7b5" y="151.602954"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="263.000794" xlink:href="#md15e1ac7b5" y="182.892074"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="268.914762" xlink:href="#md15e1ac7b5" y="215.037118"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="274.82873" xlink:href="#md15e1ac7b5" y="246.64979"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="280.742698" xlink:href="#md15e1ac7b5" y="276.49573"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="286.656667" xlink:href="#md15e1ac7b5" y="303.56305"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="292.570635" xlink:href="#md15e1ac7b5" y="327.108232"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="298.484603" xlink:href="#md15e1ac7b5" y="346.677197"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="304.398571" xlink:href="#md15e1ac7b5" y="362.101924"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="310.31254" xlink:href="#md15e1ac7b5" y="373.475252"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="316.226508" xlink:href="#md15e1ac7b5" y="381.10837"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="322.140476" xlink:href="#md15e1ac7b5" y="385.476649"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="328.054444" xlink:href="#md15e1ac7b5" y="387.16"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="333.968413" xlink:href="#md15e1ac7b5" y="386.783722"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="339.882381" xlink:href="#md15e1ac7b5" y="384.964995"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="345.796349" xlink:href="#md15e1ac7b5" y="382.268965"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="351.710317" xlink:href="#md15e1ac7b5" y="379.176844"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="357.624286" xlink:href="#md15e1ac7b5" y="376.066979"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="363.538254" xlink:href="#md15e1ac7b5" y="373.208406"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="369.452222" xlink:href="#md15e1ac7b5" y="370.765317"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="375.36619" xlink:href="#md15e1ac7b5" y="368.810137"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="381.280159" xlink:href="#md15e1ac7b5" y="367.342454"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="387.194127" xlink:href="#md15e1ac7b5" y="366.311096"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="393.108095" xlink:href="#md15e1ac7b5" y="365.636781"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="399.022063" xlink:href="#md15e1ac7b5" y="365.233249"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="404.936032" xlink:href="#md15e1ac7b5" y="365.025189"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="410.85" xlink:href="#md15e1ac7b5" y="364.961797"/>
+ <g clip-path="url(#pc0db56b267)">
+ <use style="fill:#0072bd;stroke:#0072bd;" x="47.855" xlink:href="#m455922ac46" y="366.688865"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="53.712183" xlink:href="#m455922ac46" y="366.770338"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="59.569365" xlink:href="#m455922ac46" y="367.029463"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="65.426548" xlink:href="#m455922ac46" y="367.508028"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="71.28373" xlink:href="#m455922ac46" y="368.267958"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="77.140913" xlink:href="#m455922ac46" y="369.379942"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="82.998095" xlink:href="#m455922ac46" y="370.908018"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="88.855278" xlink:href="#m455922ac46" y="372.890913"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="94.71246" xlink:href="#m455922ac46" y="375.321341"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="100.569643" xlink:href="#m455922ac46" y="378.125102"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="106.426825" xlink:href="#m455922ac46" y="381.142279"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="112.284008" xlink:href="#m455922ac46" y="384.113267"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="118.14119" xlink:href="#m455922ac46" y="386.672495"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="123.998373" xlink:href="#m455922ac46" y="388.352451"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="129.855556" xlink:href="#m455922ac46" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="135.712738" xlink:href="#m455922ac46" y="386.805892"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="141.569921" xlink:href="#m455922ac46" y="382.346954"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="147.427103" xlink:href="#m455922ac46" y="374.638837"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="153.284286" xlink:href="#m455922ac46" y="363.195554"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="159.141468" xlink:href="#m455922ac46" y="347.690635"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="164.998651" xlink:href="#m455922ac46" y="328.013732"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="170.855833" xlink:href="#m455922ac46" y="304.316142"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="176.713016" xlink:href="#m455922ac46" y="277.039131"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="182.570198" xlink:href="#m455922ac46" y="246.920064"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="188.427381" xlink:href="#m455922ac46" y="214.973262"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="194.284563" xlink:href="#m455922ac46" y="182.444858"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="200.141746" xlink:href="#m455922ac46" y="150.743678"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="205.998929" xlink:href="#m455922ac46" y="121.35278"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="211.856111" xlink:href="#m455922ac46" y="95.728629"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="217.713294" xlink:href="#m455922ac46" y="75.196549"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="223.570476" xlink:href="#m455922ac46" y="60.851899"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="229.427659" xlink:href="#m455922ac46" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="235.284841" xlink:href="#m455922ac46" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="241.142024" xlink:href="#m455922ac46" y="60.851899"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="246.999206" xlink:href="#m455922ac46" y="75.196549"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="252.856389" xlink:href="#m455922ac46" y="95.728629"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="258.713571" xlink:href="#m455922ac46" y="121.35278"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="264.570754" xlink:href="#m455922ac46" y="150.743678"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="270.427937" xlink:href="#m455922ac46" y="182.444858"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="276.285119" xlink:href="#m455922ac46" y="214.973262"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="282.142302" xlink:href="#m455922ac46" y="246.920064"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="287.999484" xlink:href="#m455922ac46" y="277.039131"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="293.856667" xlink:href="#m455922ac46" y="304.316142"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="299.713849" xlink:href="#m455922ac46" y="328.013732"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="305.571032" xlink:href="#m455922ac46" y="347.690635"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="311.428214" xlink:href="#m455922ac46" y="363.195554"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="317.285397" xlink:href="#m455922ac46" y="374.638837"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="323.142579" xlink:href="#m455922ac46" y="382.346954"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="328.999762" xlink:href="#m455922ac46" y="386.805892"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="334.856944" xlink:href="#m455922ac46" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="340.714127" xlink:href="#m455922ac46" y="388.352451"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="346.57131" xlink:href="#m455922ac46" y="386.672495"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="352.428492" xlink:href="#m455922ac46" y="384.113267"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="358.285675" xlink:href="#m455922ac46" y="381.142279"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="364.142857" xlink:href="#m455922ac46" y="378.125102"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="370.00004" xlink:href="#m455922ac46" y="375.321341"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="375.857222" xlink:href="#m455922ac46" y="372.890913"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="381.714405" xlink:href="#m455922ac46" y="370.908018"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="387.571587" xlink:href="#m455922ac46" y="369.379942"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="393.42877" xlink:href="#m455922ac46" y="368.267958"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="399.285952" xlink:href="#m455922ac46" y="367.508028"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="405.143135" xlink:href="#m455922ac46" y="367.029463"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="411.000317" xlink:href="#m455922ac46" y="366.770338"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="416.8575" xlink:href="#m455922ac46" y="366.688865"/>
</g>
</g>
<g id="patch_3">
- <path d="M 38.27 387.16
-L 38.27 39.24
+ <path d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
- <path d="M 410.85 387.16
-L 410.85 39.24
+ <path d="M 416.8575 388.6
+L 416.8575 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
- <path d="M 38.27 387.16
-L 410.85 387.16
+ <path d="M 47.855 388.6
+L 416.8575 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
- <path d="M 38.27 39.24
-L 410.85 39.24
+ <path d="M 47.855 36.72
+L 416.8575 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
<g id="axes_2">
<g id="patch_7">
- <path d="M 472.7 387.16
-L 845.28 387.16
-L 845.28 39.24
-L 472.7 39.24
+ <path d="M 476.2325 388.6
+L 845.235 388.6
+L 845.235 36.72
+L 476.2325 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_3">
<g id="xtick_8">
- <g id="line2d_26">
- <path clip-path="url(#p886f3e2196)" d="M 472.7 387.16
-L 472.7 39.24
+ <g id="line2d_28">
+ <path clip-path="url(#pd79735f1c9)" d="M 476.2325 388.6
+L 476.2325 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_27">
+ <g id="line2d_29">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="472.7" xlink:href="#m8074d2e5c9" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#ma808dad104" y="388.6"/>
</g>
</g>
- <g id="text_15">
+ <g id="text_16">
<!-- 0.0 -->
- <defs>
- <path d="M 10.6875 12.40625
-L 21 12.40625
-L 21 0
-L 10.6875 0
-z
-" id="DejaVuSans-46"/>
- </defs>
- <g transform="translate(464.748437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(468.280937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -945,19 +1016,19 @@ z
</g>
</g>
<g id="xtick_9">
- <g id="line2d_28">
- <path clip-path="url(#p886f3e2196)" d="M 547.216 387.16
-L 547.216 39.24
+ <g id="line2d_30">
+ <path clip-path="url(#pd79735f1c9)" d="M 550.033 388.6
+L 550.033 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_29">
+ <g id="line2d_31">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="547.216" xlink:href="#m8074d2e5c9" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="550.033" xlink:href="#ma808dad104" y="388.6"/>
</g>
</g>
- <g id="text_16">
+ <g id="text_17">
<!-- 0.2 -->
- <g transform="translate(539.264437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(542.081437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -965,19 +1036,19 @@ L 547.216 39.24
</g>
</g>
<g id="xtick_10">
- <g id="line2d_30">
- <path clip-path="url(#p886f3e2196)" d="M 621.732 387.16
-L 621.732 39.24
+ <g id="line2d_32">
+ <path clip-path="url(#pd79735f1c9)" d="M 623.8335 388.6
+L 623.8335 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_31">
+ <g id="line2d_33">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="621.732" xlink:href="#m8074d2e5c9" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.8335" xlink:href="#ma808dad104" y="388.6"/>
</g>
</g>
- <g id="text_17">
+ <g id="text_18">
<!-- 0.4 -->
- <g transform="translate(613.780437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(615.881937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -985,19 +1056,19 @@ L 621.732 39.24
</g>
</g>
<g id="xtick_11">
- <g id="line2d_32">
- <path clip-path="url(#p886f3e2196)" d="M 696.248 387.16
-L 696.248 39.24
+ <g id="line2d_34">
+ <path clip-path="url(#pd79735f1c9)" d="M 697.634 388.6
+L 697.634 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_33">
+ <g id="line2d_35">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="696.248" xlink:href="#m8074d2e5c9" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="697.634" xlink:href="#ma808dad104" y="388.6"/>
</g>
</g>
- <g id="text_18">
+ <g id="text_19">
<!-- 0.6 -->
- <g transform="translate(688.296437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(689.682437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -1005,60 +1076,19 @@ L 696.248 39.24
</g>
</g>
<g id="xtick_12">
- <g id="line2d_34">
- <path clip-path="url(#p886f3e2196)" d="M 770.764 387.16
-L 770.764 39.24
+ <g id="line2d_36">
+ <path clip-path="url(#pd79735f1c9)" d="M 771.4345 388.6
+L 771.4345 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_35">
+ <g id="line2d_37">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="770.764" xlink:href="#m8074d2e5c9" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="771.4345" xlink:href="#ma808dad104" y="388.6"/>
</g>
</g>
- <g id="text_19">
+ <g id="text_20">
<!-- 0.8 -->
- <defs>
- <path d="M 31.78125 34.625
-Q 24.75 34.625 20.71875 30.859375
-Q 16.703125 27.09375 16.703125 20.515625
-Q 16.703125 13.921875 20.71875 10.15625
-Q 24.75 6.390625 31.78125 6.390625
-Q 38.8125 6.390625 42.859375 10.171875
-Q 46.921875 13.96875 46.921875 20.515625
-Q 46.921875 27.09375 42.890625 30.859375
-Q 38.875 34.625 31.78125 34.625
-z
-M 21.921875 38.8125
-Q 15.578125 40.375 12.03125 44.71875
-Q 8.5 49.078125 8.5 55.328125
-Q 8.5 64.0625 14.71875 69.140625
-Q 20.953125 74.21875 31.78125 74.21875
-Q 42.671875 74.21875 48.875 69.140625
-Q 55.078125 64.0625 55.078125 55.328125
-Q 55.078125 49.078125 51.53125 44.71875
-Q 48 40.375 41.703125 38.8125
-Q 48.828125 37.15625 52.796875 32.3125
-Q 56.78125 27.484375 56.78125 20.515625
-Q 56.78125 9.90625 50.3125 4.234375
-Q 43.84375 -1.421875 31.78125 -1.421875
-Q 19.734375 -1.421875 13.25 4.234375
-Q 6.78125 9.90625 6.78125 20.515625
-Q 6.78125 27.484375 10.78125 32.3125
-Q 14.796875 37.15625 21.921875 38.8125
-z
-M 18.3125 54.390625
-Q 18.3125 48.734375 21.84375 45.5625
-Q 25.390625 42.390625 31.78125 42.390625
-Q 38.140625 42.390625 41.71875 45.5625
-Q 45.3125 48.734375 45.3125 54.390625
-Q 45.3125 60.0625 41.71875 63.234375
-Q 38.140625 66.40625 31.78125 66.40625
-Q 25.390625 66.40625 21.84375 63.234375
-Q 18.3125 60.0625 18.3125 54.390625
-z
-" id="DejaVuSans-56"/>
- </defs>
- <g transform="translate(762.812437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(763.482937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -1066,26 +1096,26 @@ z
</g>
</g>
<g id="xtick_13">
- <g id="line2d_36">
- <path clip-path="url(#p886f3e2196)" d="M 845.28 387.16
-L 845.28 39.24
+ <g id="line2d_38">
+ <path clip-path="url(#pd79735f1c9)" d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_37">
+ <g id="line2d_39">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="845.28" xlink:href="#m8074d2e5c9" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="845.235" xlink:href="#ma808dad104" y="388.6"/>
</g>
</g>
- <g id="text_20">
+ <g id="text_21">
<!-- 1.0 -->
- <g transform="translate(837.328437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(837.283437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
- <g id="text_21">
+ <g id="text_22">
<!-- Normalized Frequency ($\times \pi$ rad/sample) -->
<defs>
<path d="M 9.8125 72.90625
@@ -1311,7 +1341,7 @@ Q 14.5 64.65625 8.015625 75.875
z
" id="DejaVuSans-41"/>
</defs>
- <g transform="translate(560.19 415.438125)scale(0.1 -0.1)">
+ <g transform="translate(561.93375 416.878125)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-78"/>
<use transform="translate(74.804688 0.015625)" xlink:href="#DejaVuSans-111"/>
<use transform="translate(135.986328 0.015625)" xlink:href="#DejaVuSans-114"/>
@@ -1352,19 +1382,19 @@ z
</g>
</g>
<g id="matplotlib.axis_4">
- <g id="ytick_6">
- <g id="line2d_38">
- <path clip-path="url(#p886f3e2196)" d="M 472.7 358.989172
-L 845.28 358.989172
+ <g id="ytick_7">
+ <g id="line2d_40">
+ <path clip-path="url(#pd79735f1c9)" d="M 476.2325 386.699254
+L 845.235 386.699254
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
- <g id="line2d_39">
+ <g id="line2d_41">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="472.7" xlink:href="#m16f260463d" y="358.989172"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#md23aa5d281" y="386.699254"/>
</g>
</g>
- <g id="text_22">
- <!-- −125 -->
+ <g id="text_23">
+ <!-- −120 -->
<defs>
<path d="M 10.59375 35.5
L 73.1875 35.5
@@ -1373,144 +1403,153 @@ L 10.59375 27.203125
z
" id="DejaVuSans-8722"/>
</defs>
- <g transform="translate(438.232812 362.78839)scale(0.1 -0.1)">
+ <g transform="translate(441.765312 390.498472)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-49"/>
<use x="147.412109" xlink:href="#DejaVuSans-50"/>
- <use x="211.035156" xlink:href="#DejaVuSans-53"/>
- </g>
- </g>
- </g>
- <g id="ytick_7">
- <g id="line2d_40">
- <path clip-path="url(#p886f3e2196)" d="M 472.7 311.790692
-L 845.28 311.790692
-" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
- </g>
- <g id="line2d_41">
- <g>
- <use style="stroke:#000000;stroke-width:0.8;" x="472.7" xlink:href="#m16f260463d" y="311.790692"/>
- </g>
- </g>
- <g id="text_23">
- <!-- −100 -->
- <g transform="translate(438.232812 315.58991)scale(0.1 -0.1)">
- <use xlink:href="#DejaVuSans-8722"/>
- <use x="83.789062" xlink:href="#DejaVuSans-49"/>
- <use x="147.412109" xlink:href="#DejaVuSans-48"/>
<use x="211.035156" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_8">
<g id="line2d_42">
- <path clip-path="url(#p886f3e2196)" d="M 472.7 264.592211
-L 845.28 264.592211
+ <path clip-path="url(#pd79735f1c9)" d="M 476.2325 339.877106
+L 845.235 339.877106
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_43">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="472.7" xlink:href="#m16f260463d" y="264.592211"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#md23aa5d281" y="339.877106"/>
</g>
</g>
<g id="text_24">
- <!-- −75 -->
- <defs>
- <path d="M 8.203125 72.90625
-L 55.078125 72.90625
-L 55.078125 68.703125
-L 28.609375 0
-L 18.3125 0
-L 43.21875 64.59375
-L 8.203125 64.59375
-z
-" id="DejaVuSans-55"/>
- </defs>
- <g transform="translate(444.595312 268.39143)scale(0.1 -0.1)">
+ <!-- −100 -->
+ <g transform="translate(441.765312 343.676325)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
- <use x="83.789062" xlink:href="#DejaVuSans-55"/>
- <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-49"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ <use x="211.035156" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_9">
<g id="line2d_44">
- <path clip-path="url(#p886f3e2196)" d="M 472.7 217.393731
-L 845.28 217.393731
+ <path clip-path="url(#pd79735f1c9)" d="M 476.2325 293.054959
+L 845.235 293.054959
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_45">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="472.7" xlink:href="#m16f260463d" y="217.393731"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#md23aa5d281" y="293.054959"/>
</g>
</g>
<g id="text_25">
- <!-- −50 -->
- <g transform="translate(444.595312 221.19295)scale(0.1 -0.1)">
+ <!-- −80 -->
+ <g transform="translate(448.127812 296.854177)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
- <use x="83.789062" xlink:href="#DejaVuSans-53"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-56"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_10">
<g id="line2d_46">
- <path clip-path="url(#p886f3e2196)" d="M 472.7 170.195251
-L 845.28 170.195251
+ <path clip-path="url(#pd79735f1c9)" d="M 476.2325 246.232811
+L 845.235 246.232811
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_47">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="472.7" xlink:href="#m16f260463d" y="170.195251"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#md23aa5d281" y="246.232811"/>
</g>
</g>
<g id="text_26">
- <!-- −25 -->
- <g transform="translate(444.595312 173.99447)scale(0.1 -0.1)">
+ <!-- −60 -->
+ <g transform="translate(448.127812 250.03203)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
- <use x="83.789062" xlink:href="#DejaVuSans-50"/>
- <use x="147.412109" xlink:href="#DejaVuSans-53"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-54"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_11">
<g id="line2d_48">
- <path clip-path="url(#p886f3e2196)" d="M 472.7 122.996771
-L 845.28 122.996771
+ <path clip-path="url(#pd79735f1c9)" d="M 476.2325 199.410663
+L 845.235 199.410663
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_49">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="472.7" xlink:href="#m16f260463d" y="122.996771"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#md23aa5d281" y="199.410663"/>
</g>
</g>
<g id="text_27">
- <!-- 0 -->
- <g transform="translate(459.3375 126.79599)scale(0.1 -0.1)">
- <use xlink:href="#DejaVuSans-48"/>
+ <!-- −40 -->
+ <g transform="translate(448.127812 203.209882)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-52"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_12">
<g id="line2d_50">
- <path clip-path="url(#p886f3e2196)" d="M 472.7 75.798291
-L 845.28 75.798291
+ <path clip-path="url(#pd79735f1c9)" d="M 476.2325 152.588516
+L 845.235 152.588516
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_51">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="472.7" xlink:href="#m16f260463d" y="75.798291"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#md23aa5d281" y="152.588516"/>
</g>
</g>
<g id="text_28">
- <!-- 25 -->
- <g transform="translate(452.975 79.59751)scale(0.1 -0.1)">
+ <!-- −20 -->
+ <g transform="translate(448.127812 156.387735)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-8722"/>
+ <use x="83.789062" xlink:href="#DejaVuSans-50"/>
+ <use x="147.412109" xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_13">
+ <g id="line2d_52">
+ <path clip-path="url(#pd79735f1c9)" d="M 476.2325 105.766368
+L 845.235 105.766368
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_53">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#md23aa5d281" y="105.766368"/>
+ </g>
+ </g>
+ <g id="text_29">
+ <!-- 0 -->
+ <g transform="translate(462.87 109.565587)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-48"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_14">
+ <g id="line2d_54">
+ <path clip-path="url(#pd79735f1c9)" d="M 476.2325 58.944221
+L 845.235 58.944221
+" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_55">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#md23aa5d281" y="58.944221"/>
+ </g>
+ </g>
+ <g id="text_30">
+ <!-- 20 -->
+ <g transform="translate(456.5075 62.743439)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
- <use x="63.623047" xlink:href="#DejaVuSans-53"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
- <g id="text_29">
+ <g id="text_31">
<!-- Gain (dB) -->
<defs>
<path d="M 59.515625 10.40625
@@ -1568,7 +1607,7 @@ L 9.8125 0
z
" id="DejaVuSans-66"/>
</defs>
- <g transform="translate(432.153125 236.791406)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(435.685625 236.251406)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-71"/>
<use x="77.490234" xlink:href="#DejaVuSans-97"/>
<use x="138.769531" xlink:href="#DejaVuSans-105"/>
@@ -1581,492 +1620,491 @@ z
</g>
</g>
</g>
- <g id="line2d_52">
- <path clip-path="url(#p886f3e2196)" d="M 472.7 55.05586
-L 479.976953 55.133748
-L 482.887734 55.378961
-L 485.07082 55.75128
-L 487.253906 56.344604
-L 489.436992 57.209354
-L 491.620078 58.391774
-L 493.803164 59.934116
-L 495.98625 61.875686
-L 498.169336 64.254386
-L 500.352422 67.108574
-L 502.535508 70.479192
-L 504.718594 74.412265
-L 506.90168 78.962006
-L 509.084766 84.194986
-L 511.267852 90.196151
-L 513.450937 97.078217
-L 515.634023 104.997437
-L 517.089414 110.96163
-L 518.544805 117.581992
-L 520.000195 124.993351
-L 521.455586 133.395418
-L 522.910977 143.107163
-L 524.366367 154.698399
-L 525.821758 169.395484
-L 526.549453 178.833808
-L 527.277148 191.09738
-L 528.732539 230.573205
-L 529.460234 213.491347
-L 530.18793 212.791589
-L 530.915625 219.185513
-L 531.64332 243.162806
-L 532.371016 226.471597
-L 533.098711 212.705072
-L 533.826406 206.192472
-L 534.554102 202.538876
-L 535.281797 200.555481
-L 536.009492 199.746266
-L 536.737187 199.866393
-L 537.464883 200.791239
-L 538.192578 202.468309
-L 538.920273 204.900467
-L 539.647969 208.147035
-L 540.375664 212.343891
-L 541.103359 217.760203
-L 541.831055 224.959426
-L 542.55875 235.389041
-L 543.286445 255.528988
-L 544.014141 260.266292
-L 544.741836 245.550666
-L 545.469531 241.770653
-L 546.197227 242.15162
-L 546.924922 246.022156
-L 547.652617 255.359386
-L 548.380312 300.742754
-L 549.108008 256.720294
-L 549.835703 245.399076
-L 550.563398 239.784032
-L 551.291094 236.849621
-L 552.018789 235.773165
-L 552.746484 236.3601
-L 553.47418 238.835161
-L 554.201875 244.143826
-L 554.92957 256.158125
-L 555.657266 275.567376
-L 556.384961 246.84523
-L 557.112656 236.614712
-L 557.840352 230.417975
-L 558.568047 226.197099
-L 559.295742 223.237938
-L 560.023437 221.214645
-L 560.751133 219.961562
-L 561.478828 219.397129
-L 562.206523 219.495715
-L 562.934219 220.280895
-L 563.661914 221.834997
-L 564.389609 224.332792
-L 565.117305 228.133294
-L 565.845 234.06856
-L 566.572695 244.787752
-L 567.300391 301.709472
-L 568.028086 245.723287
-L 568.755781 234.373319
-L 569.483477 228.146729
-L 570.211172 224.129655
-L 570.938867 221.433535
-L 571.666562 219.677176
-L 572.394258 218.672995
-L 573.121953 218.328802
-L 573.849648 218.611732
-L 574.577344 219.53735
-L 575.305039 221.175079
-L 576.032734 223.674219
-L 576.76043 227.334871
-L 577.488125 232.818532
-L 578.21582 242.005311
-L 578.943516 266.634499
-L 580.398906 237.812438
-L 581.126602 230.875864
-L 581.854297 226.552161
-L 582.581992 223.694061
-L 583.309687 221.838508
-L 584.037383 220.76298
-L 584.765078 220.356632
-L 585.492773 220.57391
-L 586.220469 221.418755
-L 586.948164 222.94597
-L 587.675859 225.280834
-L 588.403555 228.67419
-L 589.13125 233.658983
-L 589.858945 241.623156
-L 590.586641 258.781901
-L 591.314336 261.564455
-L 592.042031 243.013178
-L 592.769727 235.049074
-L 593.497422 230.261514
-L 594.225117 227.129641
-L 594.952812 225.083759
-L 595.680508 223.858331
-L 596.408203 223.320554
-L 597.135898 223.410766
-L 597.863594 224.120956
-L 598.591289 225.492135
-L 599.318984 227.628528
-L 600.04668 230.740462
-L 600.774375 235.262582
-L 601.50207 242.250795
-L 602.229766 255.553644
-L 602.957461 277.781583
-L 603.685156 249.168485
-L 604.412852 239.818163
-L 605.140547 234.451093
-L 605.868242 230.983654
-L 606.595937 228.705279
-L 607.323633 227.29744
-L 608.051328 226.601712
-L 608.779023 226.542926
-L 609.506719 227.100865
-L 610.234414 228.303532
-L 610.962109 230.236602
-L 611.689805 233.076723
-L 612.4175 237.181926
-L 613.145195 243.374681
-L 613.872891 254.246614
-L 614.600586 305.023354
-L 615.328281 256.190917
-L 616.055977 244.918103
-L 616.783672 238.845291
-L 617.511367 234.98916
-L 618.239062 232.448603
-L 618.966758 230.838933
-L 619.694453 229.971517
-L 620.422148 229.753929
-L 621.149844 230.153313
-L 621.877539 231.185214
-L 622.605234 232.918745
-L 623.33293 235.502185
-L 624.060625 239.232783
-L 624.78832 244.763381
-L 625.516016 253.937284
-L 626.243711 277.949754
-L 627.699102 250.287153
-L 628.426797 243.346442
-L 629.154492 239.0441
-L 629.882187 236.2137
-L 630.609883 234.386573
-L 631.337578 233.337999
-L 632.065273 232.956076
-L 632.792969 233.194616
-L 633.520664 234.057011
-L 634.248359 235.597358
-L 634.976055 237.939706
-L 635.70375 241.332289
-L 636.431445 246.301277
-L 637.159141 254.210142
-L 637.886836 271.070238
-L 638.614531 274.909974
-L 639.342227 255.966818
-L 640.069922 247.931996
-L 640.797617 243.114128
-L 641.525312 239.963867
-L 642.253008 237.90393
-L 642.980703 236.665877
-L 643.708398 236.115496
-L 644.436094 236.192279
-L 645.163789 236.887532
-L 645.891484 238.241501
-L 646.61918 240.35725
-L 647.346875 243.442878
-L 648.07457 247.927737
-L 648.802266 254.85077
-L 649.529961 267.958967
-L 650.257656 291.809022
-L 650.985352 262.084568
-L 651.713047 252.618672
-L 652.440742 247.197007
-L 653.168437 243.691784
-L 653.896133 241.382223
-L 654.623828 239.946122
-L 655.351523 239.22335
-L 656.079219 239.137746
-L 656.806914 239.668352
-L 657.534609 240.842406
-L 658.262305 242.744526
-L 658.99 245.54947
-L 659.717695 249.611082
-L 660.445391 255.739657
-L 661.173086 266.468694
-L 661.900781 312.751351
-L 662.628477 268.888667
-L 663.356172 257.450443
-L 664.083867 251.308196
-L 664.811562 247.405336
-L 665.539258 244.826717
-L 666.266953 243.182997
-L 666.994648 242.283493
-L 667.722344 242.034649
-L 668.450039 242.402814
-L 669.177734 243.40278
-L 669.90543 245.102696
-L 670.633125 247.649229
-L 671.36082 251.336266
-L 672.088516 256.807654
-L 672.816211 265.870437
-L 673.543906 289.215556
-L 674.271602 276.875793
-L 674.999297 262.498099
-L 675.726992 255.47511
-L 676.454687 251.1214
-L 677.182383 248.250644
-L 677.910078 246.388202
-L 678.637773 245.306875
-L 679.365469 244.893465
-L 680.093164 245.100928
-L 680.820859 245.931912
-L 681.548555 247.439622
-L 682.27625 249.746717
-L 683.003945 253.098696
-L 683.731641 258.014915
-L 684.459336 265.834824
-L 685.187031 282.375645
-L 685.914727 287.25008
-L 686.642422 267.868246
-L 687.370117 259.735631
-L 688.097812 254.863283
-L 688.825508 251.672526
-L 689.553203 249.57827
-L 690.280898 248.30904
-L 691.008594 247.729126
-L 691.736289 247.777089
-L 692.463984 248.443482
-L 693.19168 249.767719
-L 693.919375 251.851649
-L 694.64707 254.901112
-L 695.374766 259.340192
-L 696.102461 266.191178
-L 696.830156 279.103266
-L 697.557852 304.677958
-L 698.285547 273.72635
-L 699.013242 264.139351
-L 699.740937 258.660087
-L 700.468633 255.11525
-L 701.196328 252.773611
-L 701.924023 251.309211
-L 702.651719 250.560159
-L 703.379414 250.449267
-L 704.107109 250.954804
-L 704.834805 252.103219
-L 705.5625 253.978052
-L 706.290195 256.752169
-L 707.017891 260.775263
-L 707.745586 266.845669
-L 708.473281 277.440552
-L 709.200977 320.290419
-L 709.928672 280.351025
-L 710.656367 268.751457
-L 711.384062 262.547333
-L 712.111758 258.606201
-L 712.839453 255.998563
-L 713.567148 254.330343
-L 714.294844 253.408768
-L 715.022539 253.139131
-L 715.750234 253.48697
-L 716.47793 254.466317
-L 717.205625 256.14435
-L 717.93332 258.66613
-L 718.661016 262.322218
-L 719.388711 267.747618
-L 720.116406 276.714082
-L 720.844102 299.444059
-L 721.571797 288.27916
-L 722.299492 273.66028
-L 723.027187 266.56869
-L 723.754883 262.178233
-L 724.482578 259.28222
-L 725.210273 257.399936
-L 725.937969 256.301666
-L 726.665664 255.872905
-L 727.393359 256.065744
-L 728.121055 256.882081
-L 728.84875 258.374234
-L 729.576445 260.663482
-L 730.304141 263.992617
-L 731.031836 268.874294
-L 731.759531 276.624512
-L 732.487227 292.87555
-L 733.214922 298.813331
-L 733.942617 278.991414
-L 734.670312 270.779049
-L 735.398008 265.871527
-L 736.125703 262.660077
-L 736.853398 260.55166
-L 737.581094 259.271733
-L 738.308789 258.683073
-L 739.036484 258.723305
-L 739.76418 259.382229
-L 740.491875 260.698436
-L 741.21957 262.772569
-L 741.947266 265.808237
-L 742.674961 270.224339
-L 743.402656 277.026873
-L 744.130352 289.770856
-L 744.858047 317.223698
-L 745.585742 284.935649
-L 746.313437 275.249552
-L 747.041133 269.736674
-L 747.768828 266.176826
-L 748.496523 263.828136
-L 749.224219 262.36084
-L 749.951914 261.611276
-L 750.679609 261.501226
-L 751.407305 262.008189
-L 752.135 263.157836
-L 752.862695 265.032642
-L 753.590391 267.803608
-L 754.318086 271.816343
-L 755.045781 277.857461
-L 755.773477 288.349543
-L 756.501172 328.461658
-L 757.228867 291.810595
-L 757.956562 280.075935
-L 758.684258 273.83974
-L 759.411953 269.891006
-L 760.139648 267.285591
-L 760.867344 265.624622
-L 761.595039 264.713227
-L 762.322734 264.455547
-L 763.05043 264.816322
-L 763.778125 265.808834
-L 764.50582 267.499309
-L 765.233516 270.031231
-L 765.961211 273.691896
-L 766.688906 279.107633
-L 767.416602 288.015862
-L 768.144297 310.202715
-L 768.871992 300.222476
-L 769.599687 285.392952
-L 770.327383 278.270855
-L 771.055078 273.88304
-L 771.782773 271.001996
-L 772.510469 269.140854
-L 773.238164 268.067377
-L 773.965859 267.665754
-L 774.693555 267.887234
-L 775.42125 268.732987
-L 776.148945 270.254473
-L 776.876641 272.571623
-L 777.604336 275.924585
-L 778.332031 280.819449
-L 779.059727 288.549343
-L 779.787422 304.570226
-L 780.515117 311.6339
-L 781.242812 291.400954
-L 781.970508 283.159769
-L 782.698203 278.270074
-L 783.425898 275.092248
-L 784.153594 273.025199
-L 784.881289 271.79131
-L 785.608984 271.25187
-L 786.33668 271.343607
-L 787.064375 272.055609
-L 787.79207 273.425691
-L 788.519766 275.553348
-L 789.247461 278.640032
-L 789.975156 283.099588
-L 790.702852 289.922123
-L 791.430547 302.571969
-L 792.158242 332.132939
-L 792.885937 298.419448
-L 793.613633 288.70658
-L 794.341328 283.235989
-L 795.069023 279.739255
-L 795.796719 277.463734
-L 796.524414 276.075878
-L 797.252109 275.41032
-L 797.979805 275.387893
-L 798.7075 275.985415
-L 799.435195 277.227878
-L 800.162891 279.1968
-L 800.890586 282.061446
-L 801.618281 286.163511
-L 802.345977 292.278236
-L 803.073672 302.77541
-L 803.801367 340.716817
-L 804.529062 307.008987
-L 805.256758 295.250572
-L 805.984453 289.100493
-L 806.712148 285.266537
-L 807.439844 282.789787
-L 808.167539 281.266691
-L 808.895234 280.500459
-L 809.62293 280.394289
-L 810.350625 280.912351
-L 811.07832 282.067428
-L 811.806016 283.925067
-L 812.533711 286.627475
-L 813.261406 290.459029
-L 813.989102 296.037869
-L 814.716797 305.068347
-L 815.444492 326.929641
-L 816.172187 318.303193
-L 816.899883 303.455885
-L 817.627578 296.51175
-L 818.355273 292.344516
-L 819.082969 289.705927
-L 819.810664 288.103479
-L 820.538359 287.303055
-L 821.266055 287.188272
-L 821.99375 287.710344
-L 822.721445 288.870605
-L 823.449141 290.720647
-L 824.176836 293.380158
-L 824.904531 297.087883
-L 825.632227 302.344802
-L 826.359922 310.423217
-L 827.087617 326.612503
-L 827.815312 335.228638
-L 828.543008 314.997203
-L 829.270703 307.189945
-L 829.998398 302.812127
-L 830.726094 300.195671
-L 831.453789 298.735016
-L 832.181484 298.153771
-L 832.90918 298.316825
-L 833.636875 299.166043
-L 834.36457 300.697034
-L 835.092266 302.955586
-L 835.819961 306.050771
-L 836.547656 310.195225
-L 837.275352 315.814643
-L 838.003047 323.905254
-L 838.730742 337.87256
-L 839.458437 371.345455
-L 840.186133 337.86461
-L 840.913828 330.313983
-L 841.641523 327.532785
-L 842.369219 327.410167
-L 843.096914 329.571236
-L 843.824609 334.551543
-L 844.552305 344.969874
-L 844.552305 344.969874
+ <g id="line2d_56">
+ <path clip-path="url(#pd79735f1c9)" d="M 476.2325 52.719992
+L 483.43958 52.797115
+L 486.322412 53.093023
+L 488.484536 53.553812
+L 490.64666 54.294881
+L 492.088076 54.976041
+L 493.529492 55.827108
+L 494.970908 56.864021
+L 496.412324 58.101606
+L 497.85374 59.553772
+L 499.295156 61.233744
+L 500.736572 63.154335
+L 502.898696 66.514157
+L 505.06082 70.487759
+L 507.222944 75.122206
+L 509.385068 80.470502
+L 511.547192 86.594805
+L 513.709316 93.570557
+L 515.87144 101.492149
+L 518.033564 110.48119
+L 520.195688 120.699269
+L 522.357812 132.368854
+L 524.519937 145.809711
+L 525.961353 155.983815
+L 527.402769 167.36482
+L 528.844185 180.253265
+L 530.285601 195.099128
+L 531.727017 212.606372
+L 533.168433 233.877469
+L 534.609849 260.012895
+L 535.330557 273.895237
+L 536.051265 284.764598
+L 536.771973 288.912131
+L 537.492681 288.207095
+L 538.213389 287.225651
+L 538.934097 288.648797
+L 539.654805 294.644387
+L 540.375513 312.881749
+L 541.096221 314.020046
+L 541.816929 289.277798
+L 542.537637 278.16103
+L 543.258345 271.408749
+L 543.979053 267.091154
+L 544.699761 264.481993
+L 545.420469 263.25842
+L 546.141177 263.296855
+L 546.861885 264.619945
+L 547.582593 267.420791
+L 548.303301 272.199292
+L 549.024009 280.266133
+L 549.744717 296.601671
+L 550.465425 320.373971
+L 551.186133 286.675354
+L 551.906841 275.032103
+L 552.627549 268.277638
+L 553.348257 263.914501
+L 554.068965 261.078978
+L 554.789673 259.382356
+L 555.510381 258.633758
+L 556.231089 258.74902
+L 556.951797 259.719679
+L 557.672505 261.611671
+L 558.393213 264.592741
+L 559.113921 269.015062
+L 559.834629 275.663078
+L 560.555337 286.747655
+L 561.276045 315.211706
+L 561.996753 300.596393
+L 562.717461 282.533716
+L 563.438169 273.694395
+L 564.158877 268.172404
+L 564.879585 264.476976
+L 565.600293 262.007905
+L 566.321001 260.47228
+L 567.041709 259.716383
+L 567.762417 259.66394
+L 568.483125 260.291948
+L 569.203833 261.624551
+L 569.924541 263.740765
+L 570.645249 266.801444
+L 571.365957 271.117948
+L 572.086665 277.34271
+L 572.807373 287.158318
+L 573.528081 307.942815
+L 574.248789 313.064348
+L 574.969497 289.325289
+L 575.690205 279.196767
+L 576.410913 273.024786
+L 577.131621 268.871866
+L 577.852329 266.012336
+L 578.573037 264.102725
+L 579.293745 262.962702
+L 580.014453 262.497396
+L 580.735161 262.666056
+L 581.455869 263.470545
+L 582.176577 264.955903
+L 582.897285 267.223339
+L 583.617993 270.464576
+L 584.338701 275.047502
+L 585.059409 281.763009
+L 585.780117 292.802388
+L 586.500825 320.717201
+L 587.221533 307.049658
+L 587.942241 288.652186
+L 588.662949 279.590171
+L 589.383657 273.836231
+L 590.104365 269.884999
+L 590.825073 267.133573
+L 591.545781 265.28865
+L 592.266489 264.196151
+L 592.987197 263.778419
+L 593.707905 264.009043
+L 594.428613 264.90512
+L 595.149321 266.531842
+L 595.870029 269.02236
+L 596.590737 272.627939
+L 597.311445 277.849198
+L 598.032153 285.8583
+L 598.752861 300.619993
+L 599.473569 347.082731
+L 600.194277 296.85794
+L 600.914985 283.963321
+L 601.635693 276.573461
+L 602.356401 271.66909
+L 603.077109 268.269397
+L 603.797817 265.940769
+L 604.518525 264.464354
+L 605.239233 263.727729
+L 605.959941 263.683217
+L 606.680649 264.332854
+L 607.401357 265.728794
+L 608.122065 267.989436
+L 608.842773 271.343383
+L 609.563481 276.244242
+L 610.284189 283.728058
+L 611.004897 297.070317
+L 611.725605 365.765295
+L 612.446313 298.385211
+L 613.167021 284.222962
+L 613.887729 276.397553
+L 614.608437 271.279041
+L 615.329146 267.76228
+L 616.049854 265.372421
+L 616.770562 263.873762
+L 617.49127 263.14682
+L 618.211978 263.142113
+L 618.932686 263.863986
+L 619.653394 265.371826
+L 620.374102 267.799544
+L 621.09481 271.408978
+L 621.815518 276.734098
+L 622.536226 285.060409
+L 623.256934 301.005851
+L 623.977642 330.829661
+L 624.69835 293.340653
+L 625.419058 281.284409
+L 626.139766 274.251789
+L 626.860474 269.590189
+L 627.581182 266.401752
+L 628.30189 264.284231
+L 629.022598 263.036004
+L 629.743306 262.558342
+L 630.464014 262.818638
+L 631.184722 263.83976
+L 631.90543 265.707307
+L 632.626138 268.600261
+L 633.346846 272.872663
+L 634.067554 279.291022
+L 634.788262 289.964919
+L 635.50897 316.470979
+L 636.229678 305.380298
+L 636.950386 286.367994
+L 637.671094 277.163732
+L 638.391802 271.388235
+L 639.11251 267.489563
+L 639.833218 264.854678
+L 640.553926 263.190978
+L 641.274634 262.351332
+L 641.995342 262.271419
+L 642.71605 262.947306
+L 643.436758 264.434122
+L 644.157466 266.864838
+L 644.878174 270.504709
+L 645.598882 275.900673
+L 646.31959 284.384865
+L 647.040298 300.863522
+L 647.761006 326.221619
+L 648.481714 291.74429
+L 649.202422 280.010917
+L 649.92313 273.13835
+L 650.643838 268.597028
+L 651.364546 265.518429
+L 652.085254 263.511937
+L 652.805962 262.382811
+L 653.52667 262.038312
+L 654.247378 262.452989
+L 654.968086 263.660203
+L 655.688794 265.763248
+L 656.409502 268.974913
+L 657.13021 273.724385
+L 657.850918 280.987827
+L 658.571626 293.771338
+L 659.292334 343.360602
+L 660.013042 297.580603
+L 660.73375 282.799597
+L 661.454458 274.832482
+L 662.175166 269.700192
+L 662.895874 266.232513
+L 663.616582 263.935054
+L 664.33729 262.566292
+L 665.057998 262.007448
+L 665.778706 262.214869
+L 666.499414 263.205093
+L 667.220122 265.060316
+L 667.94083 267.958554
+L 668.661538 272.25621
+L 669.382246 278.730278
+L 670.102954 289.536363
+L 670.823662 316.823278
+L 671.54437 304.166819
+L 672.265078 285.54177
+L 672.985786 276.46825
+L 673.706494 270.784394
+L 674.427202 266.968923
+L 675.14791 264.418575
+L 675.868618 262.845832
+L 676.589326 262.107682
+L 677.310034 262.144547
+L 678.030742 262.959252
+L 678.75145 264.617946
+L 679.472158 267.273702
+L 680.192866 271.233478
+L 680.913574 277.14815
+L 681.634282 286.703375
+L 682.35499 307.312544
+L 683.075698 312.058065
+L 683.796406 288.253208
+L 684.517114 278.046558
+L 685.237822 271.840877
+L 685.95853 267.709249
+L 686.679238 264.934666
+L 687.399946 263.184247
+L 688.120654 262.292165
+L 688.841362 262.184553
+L 689.56207 262.852621
+L 690.282778 264.349704
+L 691.003486 266.809917
+L 691.724194 270.504288
+L 692.444902 275.996811
+L 693.16561 284.678458
+L 693.886318 301.829898
+L 694.607026 322.549009
+L 695.327734 290.95281
+L 696.048442 279.570257
+L 696.76915 272.864691
+L 697.489858 268.441364
+L 698.210566 265.464496
+L 698.931274 263.556285
+L 699.651982 262.529182
+L 700.37269 262.29626
+L 701.093398 262.8386
+L 701.814106 264.198905
+L 702.534814 266.496243
+L 703.255522 269.974174
+L 703.97623 275.133067
+L 704.696938 283.162673
+L 705.417646 298.149686
+L 706.138354 340.211002
+L 706.859062 293.662757
+L 707.579771 281.043395
+L 708.300479 273.853387
+L 709.021187 269.157323
+L 709.741895 265.995202
+L 710.462603 263.944503
+L 711.183311 262.796797
+L 711.904019 262.453025
+L 712.624727 262.885227
+L 713.345435 264.127023
+L 714.066143 266.285115
+L 714.786851 269.581224
+L 715.507559 274.466903
+L 716.228267 281.985772
+L 716.948975 295.468285
+L 717.669683 372.605455
+L 718.390391 296.409329
+L 719.111099 282.470792
+L 719.831807 274.806183
+L 720.552515 269.852022
+L 721.273223 266.517963
+L 721.993931 264.336708
+L 722.714639 263.079577
+L 723.435347 262.636083
+L 724.156055 262.970043
+L 724.876763 264.107126
+L 725.597471 266.143581
+L 726.318179 269.283209
+L 727.038887 273.938714
+L 727.759595 281.042504
+L 728.480303 293.405295
+L 729.201011 335.471509
+L 729.921719 299.224416
+L 730.642427 283.857822
+L 731.363135 275.723444
+L 732.083843 270.522322
+L 732.804551 267.02675
+L 733.525259 264.724318
+L 734.245967 263.366527
+L 734.966675 262.832001
+L 735.687383 263.076955
+L 736.408091 264.119954
+L 737.128799 266.048203
+L 737.849507 269.050412
+L 738.570215 273.50743
+L 739.290923 280.263858
+L 740.011631 291.751607
+L 740.732339 324.119444
+L 741.453047 302.148002
+L 742.173755 285.210332
+L 742.894463 276.606338
+L 743.615171 271.166469
+L 744.335879 267.517501
+L 745.056587 265.101279
+L 745.777295 263.649748
+L 746.498003 263.031045
+L 747.218711 263.194252
+L 747.939419 264.151479
+L 748.660127 265.981947
+L 749.380835 268.861378
+L 750.101543 273.143848
+L 750.822251 279.60253
+L 751.542959 290.380655
+L 752.263667 317.480531
+L 752.984375 305.232195
+L 753.705083 286.534636
+L 754.425791 277.456632
+L 755.146499 271.783711
+L 755.867207 267.987567
+L 756.587915 265.463348
+L 757.308623 263.923549
+L 758.029331 263.226097
+L 758.750039 263.313307
+L 759.470747 264.191327
+L 760.191455 265.932213
+L 760.912163 268.70029
+L 761.632871 272.826663
+L 762.353579 279.024935
+L 763.074287 289.210469
+L 763.794995 312.867216
+L 764.515703 308.548011
+L 765.236411 287.837589
+L 765.957119 278.276567
+L 766.677827 272.374041
+L 767.398535 268.435336
+L 768.119243 265.807603
+L 768.839951 264.183836
+L 769.560659 263.411934
+L 770.281367 263.427711
+L 771.002075 264.231738
+L 771.722783 265.88954
+L 772.443491 268.555278
+L 773.164199 272.539986
+L 773.884907 278.50654
+L 774.605615 288.185207
+L 775.326323 309.363354
+L 776.047031 312.197414
+L 776.767739 289.126718
+L 777.488447 279.068788
+L 778.209155 272.93803
+L 778.929863 268.859981
+L 779.650571 266.132108
+L 780.371279 264.427703
+L 781.091987 263.584727
+L 781.812695 263.532681
+L 782.533403 264.266856
+L 783.254111 265.84674
+L 783.974819 268.417301
+L 784.695527 272.271755
+L 785.416235 278.028986
+L 786.136943 287.265297
+L 786.857651 306.545864
+L 787.578359 316.336432
+L 788.299067 290.410419
+L 789.019775 279.836335
+L 789.740483 273.476724
+L 790.461191 269.261287
+L 791.181899 266.435685
+L 791.902607 264.653145
+L 792.623315 263.741695
+L 793.344023 263.624649
+L 794.064731 264.292237
+L 794.785439 265.798302
+L 795.506147 268.279384
+L 796.226855 272.012656
+L 796.947563 277.57825
+L 797.668271 286.421776
+L 799.109687 321.224369
+L 799.830396 291.69823
+L 800.551104 280.582655
+L 801.271812 273.991585
+L 801.99252 269.63954
+L 802.713228 266.71775
+L 803.433936 264.858854
+L 804.154644 263.880865
+L 804.875352 263.700971
+L 805.59606 264.304507
+L 806.316768 265.739973
+L 807.037476 268.136089
+L 807.758184 271.755402
+L 808.478892 277.143422
+L 809.1996 285.632865
+L 809.920308 302.141289
+L 810.641016 327.345134
+L 811.361724 293.001216
+L 812.082432 281.311661
+L 812.80314 274.48447
+L 813.523848 269.99546
+L 814.244556 266.978218
+L 814.965264 265.044089
+L 815.685972 264.000903
+L 816.40668 263.759733
+L 817.127388 264.301124
+L 817.848096 265.668466
+L 818.568804 267.983145
+L 819.289512 271.494221
+L 820.01022 276.715874
+L 820.730928 284.881799
+L 821.451636 300.325434
+L 822.172344 335.782693
+L 822.893052 294.332484
+L 823.61376 282.027821
+L 824.334468 274.957642
+L 825.055176 270.33017
+L 825.775884 267.217439
+L 826.496592 265.208585
+L 827.2173 264.101003
+L 827.938008 263.799603
+L 828.658716 264.280199
+L 829.379424 265.581248
+L 830.100132 267.817184
+L 830.82084 271.224491
+L 831.541548 276.288679
+L 832.262256 284.155398
+L 832.982964 298.675472
+L 833.703672 349.992764
+L 834.42438 295.707918
+L 835.145088 282.736293
+L 835.865796 275.41381
+L 836.586504 270.645194
+L 837.307212 267.436163
+L 838.02792 265.352501
+L 838.748628 264.180812
+L 839.469336 263.81974
+L 840.190044 264.240389
+L 840.910752 265.476398
+L 841.63146 267.635549
+L 842.352168 270.942488
+L 843.072876 275.856204
+L 843.793584 283.443102
+L 844.514292 297.147224
+L 844.514292 297.147224
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
</g>
<g id="patch_8">
- <path d="M 472.7 387.16
-L 472.7 39.24
+ <path d="M 476.2325 388.6
+L 476.2325 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_9">
- <path d="M 845.28 387.16
-L 845.28 39.24
+ <path d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_10">
- <path d="M 472.7 387.16
-L 845.28 387.16
+ <path d="M 476.2325 388.6
+L 845.235 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_11">
- <path d="M 472.7 39.24
-L 845.28 39.24
+ <path d="M 476.2325 36.72
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
- <g id="text_30">
+ <g id="text_32">
<!-- Flat top window -->
<defs>
<path d="M 4.203125 54.6875
@@ -2105,11 +2143,11 @@ z
</g>
</g>
<defs>
- <clipPath id="pf343411e61">
- <rect height="347.92" width="372.58" x="38.27" y="39.24"/>
+ <clipPath id="pc0db56b267">
+ <rect height="351.88" width="369.0025" x="47.855" y="36.72"/>
</clipPath>
- <clipPath id="p886f3e2196">
- <rect height="347.92" width="372.58" x="472.7" y="39.24"/>
+ <clipPath id="pd79735f1c9">
+ <rect height="351.88" width="369.0025" x="476.2325" y="36.72"/>
</clipPath>
</defs>
</svg>
diff --git a/docs/docs/img/window_gaussian.svg b/docs/docs/img/window_gaussian.svg
@@ -19,28 +19,28 @@ z
</g>
<g id="axes_1">
<g id="patch_2">
- <path d="M 47.72 387.16
-L 418.77 387.16
-L 418.77 39.24
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 420.03 388.6
+L 420.03 36.72
+L 47.855 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
- <path clip-path="url(#pddfd66ca8f)" d="M 47.72 387.16
-L 47.72 39.24
+ <path clip-path="url(#p340eabe699)" d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
-" id="mb2dcc9b6ff" style="stroke:#000000;stroke-width:0.8;"/>
+" id="mbd5da5c367" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mb2dcc9b6ff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mbd5da5c367" y="388.6"/>
</g>
</g>
<g id="text_1">
@@ -68,20 +68,20 @@ Q 19.53125 74.21875 31.78125 74.21875
z
" id="DejaVuSans-48"/>
</defs>
- <g transform="translate(44.53875 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(44.67375 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
- <path clip-path="url(#pddfd66ca8f)" d="M 106.616825 387.16
-L 106.616825 39.24
+ <path clip-path="url(#p340eabe699)" d="M 106.930397 388.6
+L 106.930397 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="106.616825" xlink:href="#mb2dcc9b6ff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="106.930397" xlink:href="#mbd5da5c367" y="388.6"/>
</g>
</g>
<g id="text_2">
@@ -101,7 +101,7 @@ L 12.40625 0
z
" id="DejaVuSans-49"/>
</defs>
- <g transform="translate(100.254325 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(100.567897 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -109,13 +109,13 @@ z
</g>
<g id="xtick_3">
<g id="line2d_5">
- <path clip-path="url(#pddfd66ca8f)" d="M 165.513651 387.16
-L 165.513651 39.24
+ <path clip-path="url(#p340eabe699)" d="M 166.005794 388.6
+L 166.005794 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="165.513651" xlink:href="#mb2dcc9b6ff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="166.005794" xlink:href="#mbd5da5c367" y="388.6"/>
</g>
</g>
<g id="text_3">
@@ -146,7 +146,7 @@ Q 31.109375 20.453125 19.1875 8.296875
z
" id="DejaVuSans-50"/>
</defs>
- <g transform="translate(159.151151 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(159.643294 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -154,13 +154,13 @@ z
</g>
<g id="xtick_4">
<g id="line2d_7">
- <path clip-path="url(#pddfd66ca8f)" d="M 224.410476 387.16
-L 224.410476 39.24
+ <path clip-path="url(#p340eabe699)" d="M 225.08119 388.6
+L 225.08119 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_8">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="224.410476" xlink:href="#mb2dcc9b6ff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="225.08119" xlink:href="#mbd5da5c367" y="388.6"/>
</g>
</g>
<g id="text_4">
@@ -199,7 +199,7 @@ Q 46.96875 40.921875 40.578125 39.3125
z
" id="DejaVuSans-51"/>
</defs>
- <g transform="translate(218.047976 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(218.71869 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-51"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -207,13 +207,13 @@ z
</g>
<g id="xtick_5">
<g id="line2d_9">
- <path clip-path="url(#pddfd66ca8f)" d="M 283.307302 387.16
-L 283.307302 39.24
+ <path clip-path="url(#p340eabe699)" d="M 284.156587 388.6
+L 284.156587 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_10">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="283.307302" xlink:href="#mb2dcc9b6ff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="284.156587" xlink:href="#mbd5da5c367" y="388.6"/>
</g>
</g>
<g id="text_5">
@@ -237,7 +237,7 @@ L 4.890625 26.703125
z
" id="DejaVuSans-52"/>
</defs>
- <g transform="translate(276.944802 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(277.794087 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-52"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -245,13 +245,13 @@ z
</g>
<g id="xtick_6">
<g id="line2d_11">
- <path clip-path="url(#pddfd66ca8f)" d="M 342.204127 387.16
-L 342.204127 39.24
+ <path clip-path="url(#p340eabe699)" d="M 343.231984 388.6
+L 343.231984 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_12">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="342.204127" xlink:href="#mb2dcc9b6ff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="343.231984" xlink:href="#mbd5da5c367" y="388.6"/>
</g>
</g>
<g id="text_6">
@@ -282,7 +282,7 @@ Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-53"/>
</defs>
- <g transform="translate(335.841627 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(336.869484 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-53"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -290,13 +290,13 @@ z
</g>
<g id="xtick_7">
<g id="line2d_13">
- <path clip-path="url(#pddfd66ca8f)" d="M 401.100952 387.16
-L 401.100952 39.24
+ <path clip-path="url(#p340eabe699)" d="M 402.307381 388.6
+L 402.307381 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_14">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="401.100952" xlink:href="#mb2dcc9b6ff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="402.307381" xlink:href="#mbd5da5c367" y="388.6"/>
</g>
</g>
<g id="text_7">
@@ -333,7 +333,7 @@ Q 48.484375 72.75 52.59375 71.296875
z
" id="DejaVuSans-54"/>
</defs>
- <g transform="translate(394.738452 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(395.944881 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-54"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -523,7 +523,7 @@ Q 40.578125 54.546875 44.28125 53.078125
z
" id="DejaVuSans-115"/>
</defs>
- <g transform="translate(211.891875 415.436563)scale(0.1 -0.1)">
+ <g transform="translate(212.589375 416.876562)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-83"/>
<use x="63.476562" xlink:href="#DejaVuSans-97"/>
<use x="124.755859" xlink:href="#DejaVuSans-109"/>
@@ -537,18 +537,18 @@ z
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_15">
- <path clip-path="url(#pddfd66ca8f)" d="M 47.72 334.331811
-L 418.77 334.331811
+ <path clip-path="url(#p340eabe699)" d="M 47.855 335.170525
+L 420.03 335.170525
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_16">
<defs>
<path d="M 0 0
L -3.5 0
-" id="m699151275d" style="stroke:#000000;stroke-width:0.8;"/>
+" id="m375bb0e2c1" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m699151275d" y="334.331811"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m375bb0e2c1" y="335.170525"/>
</g>
</g>
<g id="text_9">
@@ -561,7 +561,7 @@ L 10.6875 0
z
" id="DejaVuSans-46"/>
</defs>
- <g transform="translate(24.816875 338.13103)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 338.969743)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -570,18 +570,18 @@ z
</g>
<g id="ytick_2">
<g id="line2d_17">
- <path clip-path="url(#pddfd66ca8f)" d="M 47.72 264.63432
-L 418.77 264.63432
+ <path clip-path="url(#p340eabe699)" d="M 47.855 264.679741
+L 420.03 264.679741
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_18">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m699151275d" y="264.63432"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m375bb0e2c1" y="264.679741"/>
</g>
</g>
<g id="text_10">
<!-- 0.4 -->
- <g transform="translate(24.816875 268.433538)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 268.47896)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -590,18 +590,18 @@ L 418.77 264.63432
</g>
<g id="ytick_3">
<g id="line2d_19">
- <path clip-path="url(#pddfd66ca8f)" d="M 47.72 194.936828
-L 418.77 194.936828
+ <path clip-path="url(#p340eabe699)" d="M 47.855 194.188958
+L 420.03 194.188958
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_20">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m699151275d" y="194.936828"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m375bb0e2c1" y="194.188958"/>
</g>
</g>
<g id="text_11">
<!-- 0.6 -->
- <g transform="translate(24.816875 198.736047)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 197.988177)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -610,13 +610,13 @@ L 418.77 194.936828
</g>
<g id="ytick_4">
<g id="line2d_21">
- <path clip-path="url(#pddfd66ca8f)" d="M 47.72 125.239337
-L 418.77 125.239337
+ <path clip-path="url(#p340eabe699)" d="M 47.855 123.698175
+L 420.03 123.698175
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_22">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m699151275d" y="125.239337"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m375bb0e2c1" y="123.698175"/>
</g>
</g>
<g id="text_12">
@@ -662,7 +662,7 @@ Q 18.3125 60.0625 18.3125 54.390625
z
" id="DejaVuSans-56"/>
</defs>
- <g transform="translate(24.816875 129.038556)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 127.497394)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -671,18 +671,18 @@ z
</g>
<g id="ytick_5">
<g id="line2d_23">
- <path clip-path="url(#pddfd66ca8f)" d="M 47.72 55.541846
-L 418.77 55.541846
+ <path clip-path="url(#p340eabe699)" d="M 47.855 53.207392
+L 420.03 53.207392
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_24">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m699151275d" y="55.541846"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m375bb0e2c1" y="53.207392"/>
</g>
</g>
<g id="text_13">
<!-- 1.0 -->
- <g transform="translate(24.816875 59.341064)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 57.006611)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -785,7 +785,7 @@ Q 14.796875 37.203125 14.796875 27.296875
z
" id="DejaVuSans-100"/>
</defs>
- <g transform="translate(18.737188 238.822656)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(18.872187 238.282656)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-65"/>
<use x="68.408203" xlink:href="#DejaVuSans-109"/>
<use x="165.820312" xlink:href="#DejaVuSans-112"/>
@@ -799,70 +799,70 @@ z
</g>
</g>
<g id="line2d_25">
- <path clip-path="url(#pddfd66ca8f)" d="M 47.72 387.16
-L 53.609683 383.646235
-L 59.499365 379.55044
-L 65.389048 374.810514
-L 71.27873 369.365001
-L 77.168413 363.154847
-L 83.058095 356.125412
-L 88.947778 348.228703
-L 94.83746 339.425777
-L 100.727143 329.689252
-L 106.616825 319.005845
-L 112.506508 307.378837
-L 118.39619 294.830365
-L 124.285873 281.403419
-L 130.175556 267.163431
-L 136.065238 252.199348
-L 141.954921 236.624069
-L 147.844603 220.574165
-L 153.734286 204.20882
-L 159.623968 187.707943
-L 165.513651 171.269445
-L 171.403333 155.105723
-L 177.293016 139.439398
-L 183.182698 124.498432
-L 189.072381 110.510746
-L 194.962063 97.698531
-L 200.851746 86.272422
-L 206.741429 76.425768
-L 212.631111 68.329202
-L 218.520794 62.125728
-L 224.410476 57.926523
-L 230.300159 55.807619
-L 236.189841 55.807619
-L 242.079524 57.926523
-L 247.969206 62.125728
-L 253.858889 68.329202
-L 259.748571 76.425768
-L 265.638254 86.272422
-L 271.527937 97.698531
-L 277.417619 110.510746
-L 283.307302 124.498432
-L 289.196984 139.439398
-L 295.086667 155.105723
-L 300.976349 171.269445
-L 306.866032 187.707943
-L 312.755714 204.20882
-L 318.645397 220.574165
-L 324.535079 236.624069
-L 330.424762 252.199348
-L 336.314444 267.163431
-L 342.204127 281.403419
-L 348.09381 294.830365
-L 353.983492 307.378837
-L 359.873175 319.005845
-L 365.762857 329.689252
-L 371.65254 339.425777
-L 377.542222 348.228703
-L 383.431905 356.125412
-L 389.321587 363.154847
-L 395.21127 369.365001
-L 401.100952 374.810514
-L 406.990635 379.55044
-L 412.880317 383.646235
-L 418.77 387.16
+ <path clip-path="url(#p340eabe699)" d="M 47.855 388.6
+L 53.76254 385.046242
+L 59.670079 380.903828
+L 65.577619 376.109953
+L 71.485159 370.602459
+L 77.392698 364.321622
+L 83.300238 357.212179
+L 89.207778 349.22559
+L 95.115317 340.322469
+L 101.022857 330.475124
+L 106.930397 319.670119
+L 112.837937 307.910774
+L 118.745476 295.219476
+L 124.653016 281.639705
+L 130.560556 267.237639
+L 136.468095 252.103236
+L 142.375635 236.35068
+L 148.283175 220.118097
+L 154.190714 203.566483
+L 160.098254 186.877794
+L 166.005794 170.252195
+L 171.913333 153.904498
+L 177.820873 138.059861
+L 183.728413 122.948837
+L 189.635952 108.801945
+L 195.543492 95.843902
+L 201.451032 84.287741
+L 207.358571 74.329013
+L 213.266111 66.140293
+L 219.173651 59.866212
+L 225.08119 55.619211
+L 230.98873 53.47619
+L 236.89627 53.47619
+L 242.80381 55.619211
+L 248.711349 59.866212
+L 254.618889 66.140293
+L 260.526429 74.329013
+L 266.433968 84.287741
+L 272.341508 95.843902
+L 278.249048 108.801945
+L 284.156587 122.948837
+L 290.064127 138.059861
+L 295.971667 153.904498
+L 301.879206 170.252195
+L 307.786746 186.877794
+L 313.694286 203.566483
+L 319.601825 220.118097
+L 325.509365 236.35068
+L 331.416905 252.103236
+L 337.324444 267.237639
+L 343.231984 281.639705
+L 349.139524 295.219476
+L 355.047063 307.910774
+L 360.954603 319.670119
+L 366.862143 330.475124
+L 372.769683 340.322469
+L 378.677222 349.22559
+L 384.584762 357.212179
+L 390.492302 364.321622
+L 396.399841 370.602459
+L 402.307381 376.109953
+L 408.214921 380.903828
+L 414.12246 385.046242
+L 420.03 388.6
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
<defs>
<path d="M 0 1.5
@@ -875,120 +875,120 @@ C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0
C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066
C -0.77937 1.341951 -0.397805 1.5 0 1.5
z
-" id="me883282928" style="stroke:#0072bd;"/>
+" id="mee59402d4e" style="stroke:#0072bd;"/>
</defs>
- <g clip-path="url(#pddfd66ca8f)">
- <use style="fill:#0072bd;stroke:#0072bd;" x="47.72" xlink:href="#me883282928" y="387.16"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="53.609683" xlink:href="#me883282928" y="383.646235"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="59.499365" xlink:href="#me883282928" y="379.55044"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="65.389048" xlink:href="#me883282928" y="374.810514"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="71.27873" xlink:href="#me883282928" y="369.365001"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="77.168413" xlink:href="#me883282928" y="363.154847"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="83.058095" xlink:href="#me883282928" y="356.125412"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="88.947778" xlink:href="#me883282928" y="348.228703"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="94.83746" xlink:href="#me883282928" y="339.425777"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="100.727143" xlink:href="#me883282928" y="329.689252"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="106.616825" xlink:href="#me883282928" y="319.005845"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="112.506508" xlink:href="#me883282928" y="307.378837"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="118.39619" xlink:href="#me883282928" y="294.830365"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="124.285873" xlink:href="#me883282928" y="281.403419"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="130.175556" xlink:href="#me883282928" y="267.163431"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="136.065238" xlink:href="#me883282928" y="252.199348"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="141.954921" xlink:href="#me883282928" y="236.624069"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="147.844603" xlink:href="#me883282928" y="220.574165"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="153.734286" xlink:href="#me883282928" y="204.20882"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="159.623968" xlink:href="#me883282928" y="187.707943"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="165.513651" xlink:href="#me883282928" y="171.269445"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="171.403333" xlink:href="#me883282928" y="155.105723"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="177.293016" xlink:href="#me883282928" y="139.439398"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="183.182698" xlink:href="#me883282928" y="124.498432"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="189.072381" xlink:href="#me883282928" y="110.510746"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="194.962063" xlink:href="#me883282928" y="97.698531"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="200.851746" xlink:href="#me883282928" y="86.272422"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="206.741429" xlink:href="#me883282928" y="76.425768"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="212.631111" xlink:href="#me883282928" y="68.329202"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="218.520794" xlink:href="#me883282928" y="62.125728"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="224.410476" xlink:href="#me883282928" y="57.926523"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="230.300159" xlink:href="#me883282928" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="236.189841" xlink:href="#me883282928" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="242.079524" xlink:href="#me883282928" y="57.926523"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="247.969206" xlink:href="#me883282928" y="62.125728"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="253.858889" xlink:href="#me883282928" y="68.329202"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="259.748571" xlink:href="#me883282928" y="76.425768"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="265.638254" xlink:href="#me883282928" y="86.272422"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="271.527937" xlink:href="#me883282928" y="97.698531"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="277.417619" xlink:href="#me883282928" y="110.510746"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="283.307302" xlink:href="#me883282928" y="124.498432"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="289.196984" xlink:href="#me883282928" y="139.439398"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="295.086667" xlink:href="#me883282928" y="155.105723"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="300.976349" xlink:href="#me883282928" y="171.269445"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="306.866032" xlink:href="#me883282928" y="187.707943"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="312.755714" xlink:href="#me883282928" y="204.20882"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="318.645397" xlink:href="#me883282928" y="220.574165"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="324.535079" xlink:href="#me883282928" y="236.624069"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="330.424762" xlink:href="#me883282928" y="252.199348"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="336.314444" xlink:href="#me883282928" y="267.163431"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="342.204127" xlink:href="#me883282928" y="281.403419"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="348.09381" xlink:href="#me883282928" y="294.830365"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="353.983492" xlink:href="#me883282928" y="307.378837"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="359.873175" xlink:href="#me883282928" y="319.005845"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="365.762857" xlink:href="#me883282928" y="329.689252"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="371.65254" xlink:href="#me883282928" y="339.425777"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="377.542222" xlink:href="#me883282928" y="348.228703"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="383.431905" xlink:href="#me883282928" y="356.125412"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="389.321587" xlink:href="#me883282928" y="363.154847"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="395.21127" xlink:href="#me883282928" y="369.365001"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="401.100952" xlink:href="#me883282928" y="374.810514"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="406.990635" xlink:href="#me883282928" y="379.55044"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="412.880317" xlink:href="#me883282928" y="383.646235"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="418.77" xlink:href="#me883282928" y="387.16"/>
+ <g clip-path="url(#p340eabe699)">
+ <use style="fill:#0072bd;stroke:#0072bd;" x="47.855" xlink:href="#mee59402d4e" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="53.76254" xlink:href="#mee59402d4e" y="385.046242"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="59.670079" xlink:href="#mee59402d4e" y="380.903828"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="65.577619" xlink:href="#mee59402d4e" y="376.109953"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="71.485159" xlink:href="#mee59402d4e" y="370.602459"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="77.392698" xlink:href="#mee59402d4e" y="364.321622"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="83.300238" xlink:href="#mee59402d4e" y="357.212179"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="89.207778" xlink:href="#mee59402d4e" y="349.22559"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="95.115317" xlink:href="#mee59402d4e" y="340.322469"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="101.022857" xlink:href="#mee59402d4e" y="330.475124"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="106.930397" xlink:href="#mee59402d4e" y="319.670119"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="112.837937" xlink:href="#mee59402d4e" y="307.910774"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="118.745476" xlink:href="#mee59402d4e" y="295.219476"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="124.653016" xlink:href="#mee59402d4e" y="281.639705"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="130.560556" xlink:href="#mee59402d4e" y="267.237639"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="136.468095" xlink:href="#mee59402d4e" y="252.103236"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="142.375635" xlink:href="#mee59402d4e" y="236.35068"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="148.283175" xlink:href="#mee59402d4e" y="220.118097"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="154.190714" xlink:href="#mee59402d4e" y="203.566483"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="160.098254" xlink:href="#mee59402d4e" y="186.877794"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="166.005794" xlink:href="#mee59402d4e" y="170.252195"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="171.913333" xlink:href="#mee59402d4e" y="153.904498"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="177.820873" xlink:href="#mee59402d4e" y="138.059861"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="183.728413" xlink:href="#mee59402d4e" y="122.948837"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="189.635952" xlink:href="#mee59402d4e" y="108.801945"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="195.543492" xlink:href="#mee59402d4e" y="95.843902"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="201.451032" xlink:href="#mee59402d4e" y="84.287741"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="207.358571" xlink:href="#mee59402d4e" y="74.329013"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="213.266111" xlink:href="#mee59402d4e" y="66.140293"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="219.173651" xlink:href="#mee59402d4e" y="59.866212"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="225.08119" xlink:href="#mee59402d4e" y="55.619211"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="230.98873" xlink:href="#mee59402d4e" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="236.89627" xlink:href="#mee59402d4e" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="242.80381" xlink:href="#mee59402d4e" y="55.619211"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="248.711349" xlink:href="#mee59402d4e" y="59.866212"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="254.618889" xlink:href="#mee59402d4e" y="66.140293"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="260.526429" xlink:href="#mee59402d4e" y="74.329013"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="266.433968" xlink:href="#mee59402d4e" y="84.287741"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="272.341508" xlink:href="#mee59402d4e" y="95.843902"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="278.249048" xlink:href="#mee59402d4e" y="108.801945"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="284.156587" xlink:href="#mee59402d4e" y="122.948837"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="290.064127" xlink:href="#mee59402d4e" y="138.059861"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="295.971667" xlink:href="#mee59402d4e" y="153.904498"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="301.879206" xlink:href="#mee59402d4e" y="170.252195"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="307.786746" xlink:href="#mee59402d4e" y="186.877794"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="313.694286" xlink:href="#mee59402d4e" y="203.566483"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="319.601825" xlink:href="#mee59402d4e" y="220.118097"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="325.509365" xlink:href="#mee59402d4e" y="236.35068"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="331.416905" xlink:href="#mee59402d4e" y="252.103236"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="337.324444" xlink:href="#mee59402d4e" y="267.237639"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="343.231984" xlink:href="#mee59402d4e" y="281.639705"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="349.139524" xlink:href="#mee59402d4e" y="295.219476"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="355.047063" xlink:href="#mee59402d4e" y="307.910774"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="360.954603" xlink:href="#mee59402d4e" y="319.670119"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="366.862143" xlink:href="#mee59402d4e" y="330.475124"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="372.769683" xlink:href="#mee59402d4e" y="340.322469"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="378.677222" xlink:href="#mee59402d4e" y="349.22559"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="384.584762" xlink:href="#mee59402d4e" y="357.212179"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="390.492302" xlink:href="#mee59402d4e" y="364.321622"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="396.399841" xlink:href="#mee59402d4e" y="370.602459"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="402.307381" xlink:href="#mee59402d4e" y="376.109953"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="408.214921" xlink:href="#mee59402d4e" y="380.903828"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="414.12246" xlink:href="#mee59402d4e" y="385.046242"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="420.03" xlink:href="#mee59402d4e" y="388.6"/>
</g>
</g>
<g id="patch_3">
- <path d="M 47.72 387.16
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
- <path d="M 418.77 387.16
-L 418.77 39.24
+ <path d="M 420.03 388.6
+L 420.03 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
- <path d="M 47.72 387.16
-L 418.77 387.16
+ <path d="M 47.855 388.6
+L 420.03 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
- <path d="M 47.72 39.24
-L 418.77 39.24
+ <path d="M 47.855 36.72
+L 420.03 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
<g id="axes_2">
<g id="patch_7">
- <path d="M 474.23 387.16
-L 845.28 387.16
-L 845.28 39.24
-L 474.23 39.24
+ <path d="M 473.06 388.6
+L 845.235 388.6
+L 845.235 36.72
+L 473.06 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_3">
<g id="xtick_8">
<g id="line2d_26">
- <path clip-path="url(#p75d7c8ff62)" d="M 474.23 387.16
-L 474.23 39.24
+ <path clip-path="url(#p2d45453e6f)" d="M 473.06 388.6
+L 473.06 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_27">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#mb2dcc9b6ff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#mbd5da5c367" y="388.6"/>
</g>
</g>
<g id="text_15">
<!-- 0.0 -->
- <g transform="translate(466.278437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(465.108437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -997,18 +997,18 @@ L 474.23 39.24
</g>
<g id="xtick_9">
<g id="line2d_28">
- <path clip-path="url(#p75d7c8ff62)" d="M 548.44 387.16
-L 548.44 39.24
+ <path clip-path="url(#p2d45453e6f)" d="M 547.495 388.6
+L 547.495 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_29">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="548.44" xlink:href="#mb2dcc9b6ff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.495" xlink:href="#mbd5da5c367" y="388.6"/>
</g>
</g>
<g id="text_16">
<!-- 0.2 -->
- <g transform="translate(540.488437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(539.543437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -1017,18 +1017,18 @@ L 548.44 39.24
</g>
<g id="xtick_10">
<g id="line2d_30">
- <path clip-path="url(#p75d7c8ff62)" d="M 622.65 387.16
-L 622.65 39.24
+ <path clip-path="url(#p2d45453e6f)" d="M 621.93 388.6
+L 621.93 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_31">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="622.65" xlink:href="#mb2dcc9b6ff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="621.93" xlink:href="#mbd5da5c367" y="388.6"/>
</g>
</g>
<g id="text_17">
<!-- 0.4 -->
- <g transform="translate(614.698437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(613.978437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -1037,18 +1037,18 @@ L 622.65 39.24
</g>
<g id="xtick_11">
<g id="line2d_32">
- <path clip-path="url(#p75d7c8ff62)" d="M 696.86 387.16
-L 696.86 39.24
+ <path clip-path="url(#p2d45453e6f)" d="M 696.365 388.6
+L 696.365 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_33">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="696.86" xlink:href="#mb2dcc9b6ff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="696.365" xlink:href="#mbd5da5c367" y="388.6"/>
</g>
</g>
<g id="text_18">
<!-- 0.6 -->
- <g transform="translate(688.908437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(688.413437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -1057,18 +1057,18 @@ L 696.86 39.24
</g>
<g id="xtick_12">
<g id="line2d_34">
- <path clip-path="url(#p75d7c8ff62)" d="M 771.07 387.16
-L 771.07 39.24
+ <path clip-path="url(#p2d45453e6f)" d="M 770.8 388.6
+L 770.8 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_35">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="771.07" xlink:href="#mb2dcc9b6ff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="770.8" xlink:href="#mbd5da5c367" y="388.6"/>
</g>
</g>
<g id="text_19">
<!-- 0.8 -->
- <g transform="translate(763.118437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(762.848437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -1077,18 +1077,18 @@ L 771.07 39.24
</g>
<g id="xtick_13">
<g id="line2d_36">
- <path clip-path="url(#p75d7c8ff62)" d="M 845.28 387.16
-L 845.28 39.24
+ <path clip-path="url(#p2d45453e6f)" d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_37">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="845.28" xlink:href="#mb2dcc9b6ff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="845.235" xlink:href="#mbd5da5c367" y="388.6"/>
</g>
</g>
<g id="text_20">
<!-- 1.0 -->
- <g transform="translate(837.328437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(837.283437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1321,7 +1321,7 @@ Q 14.5 64.65625 8.015625 75.875
z
" id="DejaVuSans-41"/>
</defs>
- <g transform="translate(560.955 415.438125)scale(0.1 -0.1)">
+ <g transform="translate(560.3475 416.878125)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-78"/>
<use transform="translate(74.804688 0.015625)" xlink:href="#DejaVuSans-111"/>
<use transform="translate(135.986328 0.015625)" xlink:href="#DejaVuSans-114"/>
@@ -1364,13 +1364,13 @@ z
<g id="matplotlib.axis_4">
<g id="ytick_6">
<g id="line2d_38">
- <path clip-path="url(#p75d7c8ff62)" d="M 474.23 329.967768
-L 845.28 329.967768
+ <path clip-path="url(#p2d45453e6f)" d="M 473.06 330.756811
+L 845.235 330.756811
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_39">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m699151275d" y="329.967768"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#m375bb0e2c1" y="330.756811"/>
</g>
</g>
<g id="text_22">
@@ -1383,7 +1383,7 @@ L 10.59375 27.203125
z
" id="DejaVuSans-8722"/>
</defs>
- <g transform="translate(446.125312 333.766987)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 334.556029)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-54"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1392,18 +1392,18 @@ z
</g>
<g id="ytick_7">
<g id="line2d_40">
- <path clip-path="url(#p75d7c8ff62)" d="M 474.23 268.887917
-L 845.28 268.887917
+ <path clip-path="url(#p2d45453e6f)" d="M 473.06 268.981752
+L 845.235 268.981752
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_41">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m699151275d" y="268.887917"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#m375bb0e2c1" y="268.981752"/>
</g>
</g>
<g id="text_23">
<!-- −40 -->
- <g transform="translate(446.125312 272.687135)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 272.780971)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-52"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1412,18 +1412,18 @@ L 845.28 268.887917
</g>
<g id="ytick_8">
<g id="line2d_42">
- <path clip-path="url(#p75d7c8ff62)" d="M 474.23 207.808065
-L 845.28 207.808065
+ <path clip-path="url(#p2d45453e6f)" d="M 473.06 207.206694
+L 845.235 207.206694
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_43">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m699151275d" y="207.808065"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#m375bb0e2c1" y="207.206694"/>
</g>
</g>
<g id="text_24">
<!-- −20 -->
- <g transform="translate(446.125312 211.607283)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 211.005913)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-50"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1432,36 +1432,36 @@ L 845.28 207.808065
</g>
<g id="ytick_9">
<g id="line2d_44">
- <path clip-path="url(#p75d7c8ff62)" d="M 474.23 146.728213
-L 845.28 146.728213
+ <path clip-path="url(#p2d45453e6f)" d="M 473.06 145.431636
+L 845.235 145.431636
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_45">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m699151275d" y="146.728213"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#m375bb0e2c1" y="145.431636"/>
</g>
</g>
<g id="text_25">
<!-- 0 -->
- <g transform="translate(460.8675 150.527432)scale(0.1 -0.1)">
+ <g transform="translate(459.6975 149.230855)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_10">
<g id="line2d_46">
- <path clip-path="url(#p75d7c8ff62)" d="M 474.23 85.648361
-L 845.28 85.648361
+ <path clip-path="url(#p2d45453e6f)" d="M 473.06 83.656577
+L 845.235 83.656577
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_47">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m699151275d" y="85.648361"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#m375bb0e2c1" y="83.656577"/>
</g>
</g>
<g id="text_26">
<!-- 20 -->
- <g transform="translate(454.505 89.44758)scale(0.1 -0.1)">
+ <g transform="translate(453.335 87.455796)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -1525,7 +1525,7 @@ L 9.8125 0
z
" id="DejaVuSans-66"/>
</defs>
- <g transform="translate(440.045625 236.791406)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(438.875625 236.251406)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-71"/>
<use x="77.490234" xlink:href="#DejaVuSans-97"/>
<use x="138.769531" xlink:href="#DejaVuSans-105"/>
@@ -1539,519 +1539,519 @@ z
</g>
</g>
<g id="line2d_48">
- <path clip-path="url(#p75d7c8ff62)" d="M 474.23 55.054545
-L 474.954707 55.129119
-L 475.679414 55.352998
-L 476.404121 55.726655
-L 477.128828 56.250886
-L 477.853535 56.926809
-L 479.302949 58.73988
-L 480.752363 61.181651
-L 482.201777 64.273782
-L 483.651191 68.044272
-L 485.100605 72.527927
-L 486.55002 77.766606
-L 487.999434 83.808767
-L 489.448848 90.707269
-L 490.898262 98.51311
-L 492.347676 107.260157
-L 494.521797 122.075866
-L 498.870039 153.291572
-L 499.594746 157.388418
-L 500.319453 160.806501
-L 501.04416 163.517918
-L 501.768867 165.590923
-L 502.493574 167.17564
-L 504.667695 171.025004
-L 505.392402 172.672911
-L 506.117109 174.806865
-L 506.841816 177.613317
-L 507.566523 181.320057
-L 508.29123 186.255384
-L 509.015937 192.979255
-L 509.740645 202.653809
-L 510.465352 218.566647
-L 511.190059 263.314621
-L 511.914766 232.333394
-L 512.639473 211.324891
-L 513.36418 200.895231
-L 514.088887 194.550598
-L 514.813594 190.548833
-L 515.538301 188.186374
-L 516.263008 187.134884
-L 516.987715 187.247917
-L 517.712422 188.495662
-L 518.437129 190.952904
-L 519.161836 194.828735
-L 519.886543 200.567339
-L 520.61125 209.152703
-L 521.335957 223.309148
-L 522.060664 257.894546
-L 522.785371 244.485182
-L 523.510078 219.933237
-L 524.234785 208.334721
-L 524.959492 201.270741
-L 525.684199 196.706715
-L 526.408906 193.844783
-L 527.133613 192.31082
-L 527.85832 191.926437
-L 528.583027 192.63005
-L 529.307734 194.453906
-L 530.032441 197.536056
-L 530.757148 202.177888
-L 531.481855 209.008733
-L 532.206562 219.523092
-L 532.93127 238.760802
-L 533.655977 305.059497
-L 534.380684 235.333827
-L 535.105391 218.752947
-L 535.830098 209.540133
-L 536.554805 203.672591
-L 537.279512 199.858402
-L 538.004219 197.535639
-L 538.728926 196.431813
-L 539.453633 196.423447
-L 540.17834 197.486714
-L 540.903047 199.688948
-L 541.627754 203.213721
-L 542.352461 208.44222
-L 543.077168 216.187349
-L 543.801875 228.533904
-L 544.526582 254.27632
-L 545.251289 265.778072
-L 545.975996 232.876155
-L 546.700703 219.457096
-L 547.42541 211.486049
-L 548.150117 206.307308
-L 548.874824 202.950278
-L 549.599531 200.970188
-L 550.324238 200.149816
-L 551.048945 200.398247
-L 551.773652 201.71652
-L 552.498359 204.198034
-L 553.223066 208.064055
-L 553.947773 213.767744
-L 554.67248 222.301929
-L 555.397187 236.408925
-L 556.121895 271.119253
-L 556.846602 257.099031
-L 557.571309 232.528131
-L 558.296016 220.811221
-L 559.020723 213.599825
-L 559.74543 208.868046
-L 560.470137 205.819026
-L 561.194844 204.076763
-L 561.919551 203.458567
-L 562.644258 203.895273
-L 563.368965 205.40597
-L 564.093672 208.104745
-L 564.818379 212.245092
-L 565.543086 218.345517
-L 566.267793 227.573305
-L 566.9925 243.386567
-L 567.717207 292.412185
-L 568.441914 253.646499
-L 569.166621 233.024623
-L 569.891328 222.375137
-L 570.616035 215.677672
-L 571.340742 211.260366
-L 572.065449 208.433954
-L 572.790156 206.867462
-L 573.514863 206.401894
-L 574.23957 206.983835
-L 574.964277 208.646341
-L 575.688984 211.520613
-L 576.413691 215.888275
-L 577.138398 222.32751
-L 577.863105 232.173843
-L 578.587812 249.653776
-L 579.31252 334.985718
-L 580.037227 252.171092
-L 580.761934 233.885349
-L 581.486641 223.970654
-L 582.211348 217.645433
-L 582.936055 213.462435
-L 583.660762 210.805301
-L 584.385469 209.374844
-L 585.110176 209.029423
-L 585.834883 209.727689
-L 586.55959 211.513991
-L 587.284297 214.534093
-L 588.009004 219.094547
-L 588.733711 225.828346
-L 589.458418 236.232945
-L 590.183125 255.352745
-L 590.907832 321.378035
-L 591.632539 251.627285
-L 592.357246 234.89641
-L 593.081953 225.520643
-L 593.80666 219.47868
-L 594.531367 215.477869
-L 595.256074 212.954501
-L 595.980781 211.633085
-L 596.705488 211.385324
-L 597.430195 212.1795
-L 598.154902 214.069384
-L 598.879609 217.213392
-L 599.604316 221.940442
-L 600.329023 228.934163
-L 601.05373 239.847879
-L 601.778437 260.592463
-L 602.503145 301.648654
-L 603.227852 251.568557
-L 603.952559 235.953155
-L 604.677266 226.991344
-L 605.401973 221.173153
-L 606.12668 217.318759
-L 606.851387 214.904321
-L 607.576094 213.672765
-L 608.300801 213.50643
-L 609.025508 214.381532
-L 609.750215 216.359897
-L 610.474922 219.611118
-L 611.199629 224.484381
-L 611.924336 231.710378
-L 612.649043 243.092687
-L 613.37375 265.458118
-L 614.098457 293.279214
-L 614.823164 251.773348
-L 615.547871 237.001366
-L 616.272578 228.368945
-L 616.997285 222.732826
-L 617.721992 218.99925
-L 618.446699 216.675698
-L 619.171406 215.519876
-L 619.896113 215.422857
-L 620.62082 216.367556
-L 621.345527 218.422813
-L 622.070234 221.768228
-L 622.794941 226.771533
-L 623.519648 234.207413
-L 624.244355 246.024621
-L 624.969062 270.017933
-L 625.69377 288.546113
-L 626.418477 252.120858
-L 627.143184 238.012072
-L 627.867891 229.649189
-L 628.592598 224.164803
-L 629.317305 220.533105
-L 630.042012 218.286921
-L 630.766719 217.196134
-L 631.491426 217.159156
-L 632.216133 218.164673
-L 632.94084 220.287733
-L 633.665547 223.717002
-L 634.390254 228.837315
-L 635.114961 236.464719
-L 635.839668 248.688649
-L 636.564375 274.32803
-L 637.289082 285.533588
-L 638.013789 252.540818
-L 638.738496 238.969676
-L 639.463203 230.832453
-L 640.18791 225.477053
-L 640.912617 221.932842
-L 641.637324 219.753645
-L 642.362031 218.719599
-L 643.086738 218.735406
-L 643.811445 219.794806
-L 644.536152 221.978417
-L 645.260859 225.483195
-L 645.985566 230.709876
-L 646.710273 238.513613
-L 647.43498 251.120613
-L 648.159687 278.435962
-L 648.884395 283.479269
-L 649.609102 252.990395
-L 650.333809 239.865961
-L 651.058516 231.921301
-L 651.783223 226.677416
-L 652.50793 223.209509
-L 653.232637 221.089163
-L 653.957344 220.105308
-L 654.682051 220.168123
-L 655.406758 221.275839
-L 656.131465 223.51413
-L 656.856172 227.087604
-L 657.580879 232.411879
-L 658.305586 240.379285
-L 659.030293 253.349474
-L 659.755 282.383354
-L 660.479707 282.008204
-L 661.204414 253.442543
-L 661.929121 240.696888
-L 662.653828 232.91924
-L 663.378535 227.773177
-L 664.103242 224.372728
-L 664.827949 222.304748
-L 665.552656 221.365827
-L 666.277363 221.470983
-L 667.00207 222.62249
-L 667.726777 224.910652
-L 668.451484 228.547199
-L 669.176191 233.961776
-L 669.900898 242.082239
-L 670.625605 255.398923
-L 671.350312 286.207994
-L 672.07502 280.911518
-L 672.799727 253.87972
-L 673.524434 241.460812
-L 674.249141 233.830066
-L 674.973848 228.770913
-L 675.698555 225.430815
-L 676.423262 223.40996
-L 677.147969 222.511699
-L 677.872676 222.655384
-L 678.597383 223.846961
-L 679.32209 226.18102
-L 680.046797 229.875967
-L 680.771504 235.374745
-L 681.496211 243.639343
-L 682.220918 257.288563
-L 682.945625 289.945606
-L 683.670332 280.062771
-L 684.395039 254.290304
-L 685.119746 242.157454
-L 685.844453 234.65753
-L 686.56916 229.676468
-L 687.293867 226.390939
-L 688.018574 224.412924
-L 688.743281 223.551814
-L 689.467988 223.730879
-L 690.192695 224.959443
-L 690.917402 227.336089
-L 691.642109 231.085527
-L 692.366816 236.663386
-L 693.091523 245.064606
-L 693.81623 259.034781
-L 694.540937 293.631506
-L 695.265645 279.38069
-L 695.990352 254.666457
-L 696.715059 242.787299
-L 697.439766 235.405164
-L 698.164473 230.494983
-L 698.88918 227.259271
-L 699.613887 225.320557
-L 700.338594 224.493689
-L 701.063301 224.705519
-L 701.788008 225.968496
-L 702.512715 228.384959
-L 703.237422 232.185608
-L 703.962129 237.838237
-L 704.686836 246.369761
-L 705.411543 260.651411
-L 706.13625 297.302317
-L 706.860957 278.81058
-L 707.585664 255.00281
-L 708.310371 243.351226
-L 709.035078 236.0762
-L 709.759785 231.230949
-L 710.484492 228.041114
-L 711.209199 226.138757
-L 711.933906 225.343706
-L 712.658613 225.586112
-L 713.38332 226.881347
-L 714.108027 229.3353
-L 714.832734 233.184398
-L 715.557441 238.908172
-L 716.282148 247.564708
-L 717.006855 262.150237
-L 717.731562 300.997976
-L 719.180977 255.295625
-L 719.905684 243.850289
-L 720.630391 236.673536
-L 721.355098 231.888265
-L 722.079805 228.741018
-L 722.804512 226.872557
-L 723.529219 226.107291
-L 724.253926 226.378436
-L 724.978633 227.704117
-L 725.70334 230.193604
-L 726.428047 234.088831
-L 727.152754 239.880707
-L 727.877461 248.657853
-L 728.602168 263.541384
-L 729.326875 304.764314
-L 730.051582 277.864233
-L 730.776289 255.542246
-L 731.500996 244.285571
-L 732.225703 237.199733
-L 732.95041 232.470299
-L 733.675117 229.362883
-L 734.399824 227.526251
-L 735.124531 226.78906
-L 735.849238 227.087402
-L 736.573945 228.442004
-L 737.298652 230.965382
-L 738.023359 234.904792
-L 738.748066 240.762232
-L 739.472773 249.656377
-L 740.19748 264.833623
-L 740.922187 308.656694
-L 741.646895 277.440171
-L 742.371602 255.740739
-L 743.096309 244.658106
-L 743.821016 237.657015
-L 744.545723 232.97994
-L 745.27043 229.910034
-L 745.995137 228.103491
-L 746.719844 227.392939
-L 747.444551 227.717179
-L 748.169258 229.099426
-L 748.893965 231.65532
-L 749.618672 235.637292
-L 750.343379 241.558202
-L 751.068086 250.56644
-L 751.792793 266.034622
-L 752.5175 312.745555
-L 753.242207 277.026662
-L 753.966914 255.889637
-L 754.691621 244.968818
-L 755.416328 238.047289
-L 756.141035 233.41964
-L 756.865742 230.385291
-L 757.590449 228.607375
-L 758.315156 227.922255
-L 759.039863 228.271307
-L 759.76457 229.680133
-L 760.489277 232.267401
-L 761.213984 236.290601
-L 761.938691 242.273282
-L 762.663398 251.39335
-L 763.388105 267.151135
-L 764.112813 317.125433
-L 764.83752 276.611751
-L 765.562227 255.987766
-L 766.286934 245.21849
-L 767.011641 238.372152
-L 767.736348 233.791461
-L 768.461055 230.791027
-L 769.185762 229.040509
-L 769.910469 228.379813
-L 770.635176 228.752774
-L 771.359883 230.187296
-L 772.08459 232.805004
-L 772.809297 236.868353
-L 773.534004 242.911464
-L 774.258711 252.141695
-L 774.983418 268.189171
-L 775.708125 321.930817
-L 776.432832 276.185944
-L 777.157539 256.034127
-L 777.882246 245.407738
-L 778.606953 238.63291
-L 779.33166 234.097102
-L 780.056367 231.129207
-L 780.781074 229.405065
-L 781.505781 228.767957
-L 782.230488 229.164084
-L 782.955195 230.623586
-L 783.679902 233.270982
-L 784.404609 237.373633
-L 785.129316 243.476162
-L 785.854023 252.81545
-L 786.57873 269.154131
-L 787.303437 327.366389
-L 788.028145 275.741527
-L 788.752852 256.027796
-L 789.477559 245.537002
-L 790.202266 238.830589
-L 790.926973 234.337929
-L 791.65168 231.401429
-L 792.376387 229.702819
-L 793.101094 229.088618
-L 793.825801 229.507311
-L 794.550508 230.991225
-L 795.275215 233.667728
-L 795.999922 237.809046
-L 796.724629 243.970288
-L 797.449336 253.418069
-L 798.174043 270.050918
-L 798.89875 333.771289
-L 799.623457 275.272068
-L 800.348164 255.967866
-L 801.072871 245.606526
-L 801.797578 238.965944
-L 802.522285 234.514995
-L 803.246992 231.608953
-L 803.971699 229.935192
-L 804.696406 229.343351
-L 805.421113 229.784143
-L 806.14582 231.292034
-L 806.870527 233.997218
-L 807.595234 238.176769
-L 808.319941 244.396315
-L 809.044648 253.952551
-L 809.769355 270.884044
-L 810.494062 341.777446
-L 811.21877 274.77207
-L 811.943477 255.853384
-L 812.668184 245.616358
-L 813.392891 239.039467
-L 814.117598 234.629056
-L 814.842305 231.752719
-L 815.567012 230.103267
-L 816.291719 229.533369
-L 817.016426 229.99591
-L 817.741133 231.527473
-L 818.46584 234.26106
-L 819.190547 238.478601
-L 819.915254 244.756326
-L 820.639961 254.421507
-L 821.364668 271.657724
-L 822.089375 352.799388
-L 822.814082 274.236697
-L 823.538789 255.683315
-L 824.263496 245.56633
-L 824.988203 239.051391
-L 825.71291 234.680585
-L 826.437617 231.833367
-L 827.162324 230.207819
-L 827.887031 229.659562
-L 828.611738 230.143616
-L 829.336445 231.698665
-L 830.061152 234.460517
-L 830.785859 238.715992
-L 831.510566 245.052054
-L 832.235273 254.827209
-L 832.95998 272.37596
-L 833.684687 371.345455
-L 834.409395 273.661575
-L 835.134102 255.456503
-L 835.858809 245.456057
-L 836.583516 239.00169
-L 837.308223 234.669774
-L 838.03293 231.851246
-L 838.757637 230.24932
-L 839.482344 229.722513
-L 840.207051 230.227955
-L 840.931758 231.806419
-L 841.656465 234.596539
-L 842.381172 238.890076
-L 843.105879 245.284921
-L 843.830586 255.171634
-L 844.555293 273.04263
-L 844.555293 273.04263
+ <path clip-path="url(#p2d45453e6f)" d="M 473.06 52.714545
+L 473.786904 52.789968
+L 474.513809 53.016394
+L 475.240713 53.394305
+L 475.967617 53.924503
+L 476.694521 54.608119
+L 478.14833 56.441826
+L 479.602139 58.91139
+L 481.055947 62.038715
+L 482.509756 65.85212
+L 483.963564 70.386808
+L 485.417373 75.685113
+L 486.871182 81.796046
+L 488.32499 88.773065
+L 489.778799 96.667753
+L 491.232607 105.514358
+L 493.41332 120.498698
+L 497.774746 152.069699
+L 498.50165 156.213175
+L 499.228555 159.670162
+L 499.955459 162.41244
+L 500.682363 164.50904
+L 501.409268 166.111794
+L 503.58998 170.004971
+L 504.316885 171.671634
+L 505.043789 173.829877
+L 505.770693 176.668272
+L 506.497598 180.417202
+L 507.224502 185.408702
+L 507.951406 192.209104
+L 508.678311 201.993773
+L 509.405215 218.08773
+L 510.132119 263.345022
+L 510.859023 232.011169
+L 511.585928 210.763549
+L 512.312832 200.21518
+L 513.039736 193.798332
+L 513.766641 189.751019
+L 514.493545 187.361671
+L 515.220449 186.298213
+L 515.947354 186.412532
+L 516.674258 187.67448
+L 517.401162 190.159689
+L 518.128066 194.079634
+L 518.854971 199.883555
+L 519.581875 208.566637
+L 520.308779 222.88421
+L 521.035684 257.863256
+L 521.762588 244.301267
+L 522.489492 219.469874
+L 523.216396 207.739344
+L 523.943301 200.594963
+L 524.670205 195.97899
+L 525.397109 193.084483
+L 526.124014 191.533061
+L 526.850918 191.144303
+L 527.577822 191.855925
+L 528.304727 193.700539
+L 529.031631 196.81777
+L 529.758535 201.512435
+L 530.485439 208.421029
+L 531.212344 219.05506
+L 531.939248 238.511733
+L 532.666152 305.565035
+L 533.393057 235.045753
+L 534.119961 218.27615
+L 534.846865 208.958476
+L 535.57377 203.024151
+L 536.300674 199.166549
+L 537.027578 196.817348
+L 537.754482 195.700959
+L 538.481387 195.692497
+L 539.208291 196.767867
+L 539.935195 198.995166
+L 540.6621 202.560058
+L 541.389004 207.848067
+L 542.115908 215.68135
+L 542.842812 228.168434
+L 543.569717 254.203848
+L 544.296621 265.836512
+L 545.023525 232.560107
+L 545.75043 218.988314
+L 546.477334 210.926541
+L 547.204238 205.688856
+L 547.931143 202.293617
+L 548.658047 200.290989
+L 549.384951 199.46128
+L 550.111855 199.712538
+L 550.83876 201.045816
+L 551.565664 203.555574
+L 552.292568 207.465598
+L 553.019473 213.234206
+L 553.746377 221.865527
+L 554.473281 236.133087
+L 555.200186 271.238486
+L 555.92709 257.058687
+L 556.653994 232.208123
+L 557.380898 220.357852
+L 558.107803 213.064376
+L 558.834707 208.27874
+L 559.561611 205.195017
+L 560.288516 203.432923
+L 561.01542 202.807691
+L 561.742324 203.249367
+L 562.469229 204.777259
+L 563.196133 207.506751
+L 563.923037 211.694223
+L 564.649941 217.864083
+L 565.376846 227.196901
+L 566.10375 243.190149
+L 566.830654 292.773772
+L 567.557559 253.566858
+L 568.284463 232.710265
+L 569.011367 221.939568
+L 569.738271 215.165873
+L 570.465176 210.698289
+L 571.19208 207.839707
+L 571.918984 206.255386
+L 572.645889 205.784519
+L 573.372793 206.373083
+L 574.099697 208.054511
+L 574.826602 210.961498
+L 575.553506 215.378873
+L 576.28041 221.891398
+L 577.007314 231.849802
+L 577.734219 249.52869
+L 578.461123 335.831874
+L 579.188027 252.074658
+L 579.914932 233.580788
+L 580.641836 223.553245
+L 581.36874 217.15603
+L 582.095645 212.925422
+L 582.822549 210.238045
+L 583.549453 208.791306
+L 584.276357 208.441954
+L 585.003262 209.148167
+L 585.730166 210.954801
+L 586.45707 214.009278
+L 587.183975 218.621639
+L 587.910879 225.432081
+L 588.637783 235.955105
+L 589.364687 255.292525
+L 590.091592 322.069309
+L 590.818496 251.524662
+L 591.5454 234.603357
+L 592.272305 225.120876
+L 592.999209 219.010143
+L 593.726113 214.963796
+L 594.453018 212.411707
+L 595.179922 211.075251
+L 595.906826 210.82467
+L 596.63373 211.627885
+L 597.360635 213.539279
+L 598.087539 216.719072
+L 598.814443 221.499925
+L 599.541348 228.573248
+L 600.268252 239.611183
+L 600.995156 260.59188
+L 601.722061 302.11537
+L 602.448965 251.465265
+L 603.175869 235.672129
+L 603.902773 226.608316
+L 604.629678 220.723903
+L 605.356582 216.825638
+L 606.083486 214.38372
+L 606.810391 213.138146
+L 607.537295 212.969917
+L 608.264199 213.854981
+L 608.991104 215.855863
+L 609.718008 219.144089
+L 610.444912 224.072819
+L 611.171816 231.381062
+L 611.898721 242.892923
+L 612.625625 265.512916
+L 613.352529 293.650669
+L 614.079434 251.672387
+L 614.806338 236.732272
+L 615.533242 228.001596
+L 616.260146 222.301328
+L 616.987051 218.525257
+L 617.713955 216.175258
+L 618.440859 215.006281
+L 619.167764 214.908157
+L 619.894668 215.863609
+L 620.621572 217.942258
+L 621.348477 221.325751
+L 622.075381 226.386003
+L 622.802285 233.906518
+L 623.529189 245.858229
+L 624.256094 270.124631
+L 624.982998 288.863697
+L 625.709902 252.023852
+L 626.436807 237.754481
+L 627.163711 229.296413
+L 627.890615 223.749604
+L 628.61752 220.07657
+L 629.344424 217.80482
+L 630.071328 216.701618
+L 630.798232 216.664219
+L 631.525137 217.68118
+L 632.252041 219.828405
+L 632.978945 223.296706
+L 633.70585 228.475298
+L 634.432754 236.189516
+L 635.159658 248.552578
+L 635.886562 274.483785
+L 636.613467 285.816884
+L 637.340371 252.448592
+L 638.067275 238.722984
+L 638.79418 230.493144
+L 639.521084 225.07679
+L 640.247988 221.492238
+L 640.974893 219.288238
+L 641.701797 218.242423
+L 642.428701 218.25841
+L 643.155605 219.329867
+L 643.88251 221.538332
+L 644.609414 225.083002
+L 645.336318 230.369172
+L 646.063223 238.261731
+L 646.790127 251.012222
+L 647.517031 278.638473
+L 648.243936 283.739183
+L 648.97084 252.903286
+L 649.697744 239.629471
+L 650.424648 231.594386
+L 651.151553 226.290815
+L 651.878457 222.783437
+L 652.605361 220.638957
+L 653.332266 219.643904
+L 654.05917 219.707434
+L 654.786074 220.827758
+L 655.512979 223.091525
+L 656.239883 226.705672
+L 656.966787 232.090547
+L 657.693691 240.148638
+L 658.420596 253.266452
+L 659.1475 282.630794
+L 659.874404 282.251374
+L 660.601309 253.36058
+L 661.328213 240.469856
+L 662.055117 232.603683
+L 662.782021 227.399048
+L 663.508926 223.959895
+L 664.23583 221.868378
+L 664.962734 220.918769
+L 665.689639 221.025123
+L 666.416543 222.189736
+L 667.143447 224.503942
+L 667.870352 228.18188
+L 668.597256 233.658085
+L 669.32416 241.870975
+L 670.051064 255.339228
+L 670.777969 286.498965
+L 671.504873 281.142206
+L 672.231777 253.802734
+L 672.958682 241.242474
+L 673.685586 233.524876
+L 674.41249 228.40814
+L 675.139395 225.030025
+L 675.866299 222.986169
+L 676.593203 222.077685
+L 677.320107 222.223005
+L 678.047012 223.428144
+L 678.773916 225.788769
+L 679.50082 229.525772
+L 680.227725 235.087137
+L 680.954629 243.445801
+L 681.681533 257.250375
+L 682.408437 290.279119
+L 683.135342 280.283798
+L 683.862246 254.217991
+L 684.58915 241.947045
+L 685.316055 234.361758
+L 686.042959 229.324002
+L 686.769863 226.001078
+L 687.496768 224.000549
+L 688.223672 223.129637
+L 688.950576 223.310741
+L 689.67748 224.553288
+L 690.404385 226.956984
+L 691.131289 230.749099
+L 691.858193 236.390445
+L 692.585098 244.887287
+L 693.312002 259.016469
+L 694.038906 294.006971
+L 694.765811 279.593953
+L 695.492715 254.598426
+L 696.219619 242.584059
+L 696.946523 235.117902
+L 697.673428 230.151833
+L 698.400332 226.879293
+L 699.127236 224.918512
+L 699.854141 224.082233
+L 700.581045 224.296474
+L 701.307949 225.573826
+L 702.034854 228.017793
+L 702.761758 231.8617
+L 703.488662 237.578668
+L 704.215566 246.207297
+L 704.942471 260.6515
+L 705.669375 297.719563
+L 706.396279 279.017355
+L 707.123184 254.938607
+L 707.850088 243.154405
+L 708.576992 235.796575
+L 709.303896 230.896176
+L 710.030801 227.670034
+L 710.757705 225.746025
+L 711.484609 224.941925
+L 712.211514 225.18709
+L 712.938418 226.497067
+L 713.665322 228.978951
+L 714.392227 232.871859
+L 715.119131 238.660781
+L 715.846035 247.415844
+L 716.572939 262.167385
+L 717.299844 301.457286
+L 718.753652 255.234754
+L 719.480557 243.659148
+L 720.207461 236.40071
+L 720.934365 231.560973
+L 721.66127 228.377905
+L 722.388174 226.488177
+L 723.115078 225.714201
+L 723.841982 225.988432
+L 724.568887 227.329202
+L 725.295791 229.847024
+L 726.022695 233.786586
+L 726.7496 239.644384
+L 727.476504 248.521432
+L 728.203408 263.574366
+L 728.930312 305.266492
+L 729.657217 278.060236
+L 730.384121 255.484183
+L 731.111025 244.099385
+L 731.83793 236.932896
+L 732.564834 232.149632
+L 733.291738 229.006848
+L 734.018643 227.149311
+L 734.745547 226.40373
+L 735.472451 226.705467
+L 736.199355 228.075488
+L 736.92626 230.627587
+L 737.653164 234.611834
+L 738.380068 240.535943
+L 739.106973 249.531321
+L 739.833877 264.881314
+L 740.560781 309.203176
+L 741.287686 277.631348
+L 742.01459 255.684935
+L 742.741494 244.47616
+L 743.468398 237.395383
+L 744.195303 232.665073
+L 744.922207 229.560226
+L 745.649111 227.733121
+L 746.376016 227.014482
+L 747.10292 227.342413
+L 747.829824 228.740392
+L 748.556729 231.325377
+L 749.283633 235.352672
+L 750.010537 241.340973
+L 750.737441 250.451742
+L 751.464346 266.095981
+L 752.19125 313.338575
+L 752.918154 277.213133
+L 753.645059 255.835527
+L 754.371963 244.790409
+L 755.098867 237.790099
+L 755.825771 233.109779
+L 756.552676 230.040893
+L 757.27958 228.24274
+L 758.006484 227.549823
+L 758.733389 227.902848
+L 759.460293 229.327708
+L 760.187197 231.944424
+L 760.914102 236.013416
+L 761.641006 242.064192
+L 762.36791 251.288064
+L 763.094814 267.225202
+L 763.821719 317.768305
+L 764.548623 276.793499
+L 765.275527 255.934773
+L 766.002432 245.042922
+L 766.729336 238.118659
+L 767.45624 233.485832
+L 768.183145 230.451247
+L 768.910049 228.680805
+L 769.636953 228.012589
+L 770.363857 228.389795
+L 771.090762 229.840644
+L 771.817666 232.488146
+L 772.54457 236.597744
+L 773.271475 242.709638
+L 773.998379 252.044926
+L 774.725283 268.275054
+L 775.452187 322.628383
+L 776.179092 276.362846
+L 776.905996 255.981662
+L 777.6329 245.234324
+L 778.359805 238.382385
+L 779.086709 233.794952
+L 779.813613 230.793276
+L 780.540518 229.04951
+L 781.267422 228.405151
+L 781.994326 228.805786
+L 782.72123 230.2819
+L 783.448135 232.959429
+L 784.175039 237.108776
+L 784.901943 243.280763
+L 785.628848 252.726351
+L 786.355752 269.250997
+L 787.082656 328.125823
+L 787.809561 275.91337
+L 788.536465 255.975259
+L 789.263369 245.365059
+L 789.990273 238.582314
+L 790.717178 234.03852
+L 791.444082 231.068597
+L 792.170986 229.350653
+L 792.897891 228.729461
+L 793.624795 229.15292
+L 794.351699 230.653723
+L 795.078604 233.36069
+L 795.805508 237.549144
+L 796.532412 243.780514
+L 797.259316 253.335828
+L 797.986221 270.157991
+L 798.713125 334.603623
+L 799.440029 275.438568
+L 800.166934 255.914647
+L 800.893838 245.435375
+L 801.620742 238.71921
+L 802.347646 234.217601
+L 803.074551 231.278482
+L 803.801455 229.58567
+L 804.528359 228.987094
+L 805.255264 229.432902
+L 805.982168 230.957956
+L 806.709072 233.693931
+L 807.435977 237.921053
+L 808.162881 244.211389
+L 808.889785 253.876393
+L 809.616689 271.0006
+L 810.343594 342.700906
+L 811.070498 274.932879
+L 811.797402 255.798862
+L 812.524307 245.445318
+L 813.251211 238.79357
+L 813.978115 234.33296
+L 814.70502 231.423885
+L 815.431924 229.755659
+L 816.158828 229.179275
+L 816.885732 229.64708
+L 817.612637 231.196075
+L 818.339541 233.960775
+L 819.066445 238.22632
+L 819.79335 244.575497
+L 820.520254 254.350687
+L 821.247158 271.783086
+L 821.974062 353.848298
+L 822.700967 274.391412
+L 823.427871 255.626857
+L 824.154775 245.394721
+L 824.88168 238.80563
+L 825.608584 234.385075
+L 826.335488 231.505451
+L 827.062393 229.8614
+L 827.789297 229.306903
+L 828.516201 229.796467
+L 829.243105 231.369215
+L 829.97001 234.162503
+L 830.696914 238.466413
+L 831.423818 244.874592
+L 832.150723 254.761007
+L 832.877627 272.509497
+L 833.604531 372.605455
+L 834.331436 273.809744
+L 835.05834 255.397463
+L 835.785244 245.283193
+L 836.512148 238.755363
+L 837.239053 234.374141
+L 837.965957 231.523533
+L 838.692861 229.903375
+L 839.419766 229.370571
+L 840.14667 229.881766
+L 840.873574 231.478196
+L 841.600479 234.300072
+L 842.327383 238.642478
+L 843.054287 245.110109
+L 843.781191 255.109352
+L 844.508096 273.183754
+L 844.508096 273.183754
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
</g>
<g id="patch_8">
- <path d="M 474.23 387.16
-L 474.23 39.24
+ <path d="M 473.06 388.6
+L 473.06 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_9">
- <path d="M 845.28 387.16
-L 845.28 39.24
+ <path d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_10">
- <path d="M 474.23 387.16
-L 845.28 387.16
+ <path d="M 473.06 388.6
+L 845.235 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_11">
- <path d="M 474.23 39.24
-L 845.28 39.24
+ <path d="M 473.06 36.72
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
@@ -2094,11 +2094,11 @@ z
</g>
</g>
<defs>
- <clipPath id="pddfd66ca8f">
- <rect height="347.92" width="371.05" x="47.72" y="39.24"/>
+ <clipPath id="p340eabe699">
+ <rect height="351.88" width="372.175" x="47.855" y="36.72"/>
</clipPath>
- <clipPath id="p75d7c8ff62">
- <rect height="347.92" width="371.05" x="474.23" y="39.24"/>
+ <clipPath id="p2d45453e6f">
+ <rect height="351.88" width="372.175" x="473.06" y="36.72"/>
</clipPath>
</defs>
</svg>
diff --git a/docs/docs/img/window_hamming.svg b/docs/docs/img/window_hamming.svg
@@ -19,28 +19,28 @@ z
</g>
<g id="axes_1">
<g id="patch_2">
- <path d="M 47.72 387.16
-L 418.77 387.16
-L 418.77 39.24
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 420.03 388.6
+L 420.03 36.72
+L 47.855 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
- <path clip-path="url(#p79177e7d8d)" d="M 47.72 387.16
-L 47.72 39.24
+ <path clip-path="url(#p9df6d55b6c)" d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
-" id="m84aad1aeff" style="stroke:#000000;stroke-width:0.8;"/>
+" id="m08b5520b76" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m84aad1aeff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m08b5520b76" y="388.6"/>
</g>
</g>
<g id="text_1">
@@ -68,20 +68,20 @@ Q 19.53125 74.21875 31.78125 74.21875
z
" id="DejaVuSans-48"/>
</defs>
- <g transform="translate(44.53875 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(44.67375 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
- <path clip-path="url(#p79177e7d8d)" d="M 106.616825 387.16
-L 106.616825 39.24
+ <path clip-path="url(#p9df6d55b6c)" d="M 106.930397 388.6
+L 106.930397 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="106.616825" xlink:href="#m84aad1aeff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="106.930397" xlink:href="#m08b5520b76" y="388.6"/>
</g>
</g>
<g id="text_2">
@@ -101,7 +101,7 @@ L 12.40625 0
z
" id="DejaVuSans-49"/>
</defs>
- <g transform="translate(100.254325 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(100.567897 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -109,13 +109,13 @@ z
</g>
<g id="xtick_3">
<g id="line2d_5">
- <path clip-path="url(#p79177e7d8d)" d="M 165.513651 387.16
-L 165.513651 39.24
+ <path clip-path="url(#p9df6d55b6c)" d="M 166.005794 388.6
+L 166.005794 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="165.513651" xlink:href="#m84aad1aeff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="166.005794" xlink:href="#m08b5520b76" y="388.6"/>
</g>
</g>
<g id="text_3">
@@ -146,7 +146,7 @@ Q 31.109375 20.453125 19.1875 8.296875
z
" id="DejaVuSans-50"/>
</defs>
- <g transform="translate(159.151151 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(159.643294 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -154,13 +154,13 @@ z
</g>
<g id="xtick_4">
<g id="line2d_7">
- <path clip-path="url(#p79177e7d8d)" d="M 224.410476 387.16
-L 224.410476 39.24
+ <path clip-path="url(#p9df6d55b6c)" d="M 225.08119 388.6
+L 225.08119 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_8">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="224.410476" xlink:href="#m84aad1aeff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="225.08119" xlink:href="#m08b5520b76" y="388.6"/>
</g>
</g>
<g id="text_4">
@@ -199,7 +199,7 @@ Q 46.96875 40.921875 40.578125 39.3125
z
" id="DejaVuSans-51"/>
</defs>
- <g transform="translate(218.047976 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(218.71869 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-51"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -207,13 +207,13 @@ z
</g>
<g id="xtick_5">
<g id="line2d_9">
- <path clip-path="url(#p79177e7d8d)" d="M 283.307302 387.16
-L 283.307302 39.24
+ <path clip-path="url(#p9df6d55b6c)" d="M 284.156587 388.6
+L 284.156587 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_10">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="283.307302" xlink:href="#m84aad1aeff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="284.156587" xlink:href="#m08b5520b76" y="388.6"/>
</g>
</g>
<g id="text_5">
@@ -237,7 +237,7 @@ L 4.890625 26.703125
z
" id="DejaVuSans-52"/>
</defs>
- <g transform="translate(276.944802 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(277.794087 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-52"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -245,13 +245,13 @@ z
</g>
<g id="xtick_6">
<g id="line2d_11">
- <path clip-path="url(#p79177e7d8d)" d="M 342.204127 387.16
-L 342.204127 39.24
+ <path clip-path="url(#p9df6d55b6c)" d="M 343.231984 388.6
+L 343.231984 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_12">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="342.204127" xlink:href="#m84aad1aeff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="343.231984" xlink:href="#m08b5520b76" y="388.6"/>
</g>
</g>
<g id="text_6">
@@ -282,7 +282,7 @@ Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-53"/>
</defs>
- <g transform="translate(335.841627 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(336.869484 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-53"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -290,13 +290,13 @@ z
</g>
<g id="xtick_7">
<g id="line2d_13">
- <path clip-path="url(#p79177e7d8d)" d="M 401.100952 387.16
-L 401.100952 39.24
+ <path clip-path="url(#p9df6d55b6c)" d="M 402.307381 388.6
+L 402.307381 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_14">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="401.100952" xlink:href="#m84aad1aeff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="402.307381" xlink:href="#m08b5520b76" y="388.6"/>
</g>
</g>
<g id="text_7">
@@ -333,7 +333,7 @@ Q 48.484375 72.75 52.59375 71.296875
z
" id="DejaVuSans-54"/>
</defs>
- <g transform="translate(394.738452 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(395.944881 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-54"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -523,7 +523,7 @@ Q 40.578125 54.546875 44.28125 53.078125
z
" id="DejaVuSans-115"/>
</defs>
- <g transform="translate(211.891875 415.436563)scale(0.1 -0.1)">
+ <g transform="translate(212.589375 416.876562)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-83"/>
<use x="63.476562" xlink:href="#DejaVuSans-97"/>
<use x="124.755859" xlink:href="#DejaVuSans-109"/>
@@ -537,18 +537,18 @@ z
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_15">
- <path clip-path="url(#p79177e7d8d)" d="M 47.72 343.913245
-L 418.77 343.913245
+ <path clip-path="url(#p9df6d55b6c)" d="M 47.855 344.861013
+L 420.03 344.861013
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_16">
<defs>
<path d="M 0 0
L -3.5 0
-" id="m223692a064" style="stroke:#000000;stroke-width:0.8;"/>
+" id="ma3b96fd830" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m223692a064" y="343.913245"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#ma3b96fd830" y="344.861013"/>
</g>
</g>
<g id="text_9">
@@ -561,7 +561,7 @@ L 10.6875 0
z
" id="DejaVuSans-46"/>
</defs>
- <g transform="translate(24.816875 347.712463)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 348.660232)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -570,18 +570,18 @@ z
</g>
<g id="ytick_2">
<g id="line2d_17">
- <path clip-path="url(#p79177e7d8d)" d="M 47.72 271.835319
-L 418.77 271.835319
+ <path clip-path="url(#p9df6d55b6c)" d="M 47.855 271.962702
+L 420.03 271.962702
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_18">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m223692a064" y="271.835319"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#ma3b96fd830" y="271.962702"/>
</g>
</g>
<g id="text_10">
<!-- 0.4 -->
- <g transform="translate(24.816875 275.634538)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 275.761921)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -590,18 +590,18 @@ L 418.77 271.835319
</g>
<g id="ytick_3">
<g id="line2d_19">
- <path clip-path="url(#p79177e7d8d)" d="M 47.72 199.757394
-L 418.77 199.757394
+ <path clip-path="url(#p9df6d55b6c)" d="M 47.855 199.064391
+L 420.03 199.064391
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_20">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m223692a064" y="199.757394"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#ma3b96fd830" y="199.064391"/>
</g>
</g>
<g id="text_11">
<!-- 0.6 -->
- <g transform="translate(24.816875 203.556612)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 202.86361)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -610,13 +610,13 @@ L 418.77 199.757394
</g>
<g id="ytick_4">
<g id="line2d_21">
- <path clip-path="url(#p79177e7d8d)" d="M 47.72 127.679468
-L 418.77 127.679468
+ <path clip-path="url(#p9df6d55b6c)" d="M 47.855 126.16608
+L 420.03 126.16608
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_22">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m223692a064" y="127.679468"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#ma3b96fd830" y="126.16608"/>
</g>
</g>
<g id="text_12">
@@ -662,7 +662,7 @@ Q 18.3125 60.0625 18.3125 54.390625
z
" id="DejaVuSans-56"/>
</defs>
- <g transform="translate(24.816875 131.478687)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 129.965298)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -671,18 +671,18 @@ z
</g>
<g id="ytick_5">
<g id="line2d_23">
- <path clip-path="url(#p79177e7d8d)" d="M 47.72 55.601542
-L 418.77 55.601542
+ <path clip-path="url(#p9df6d55b6c)" d="M 47.855 53.267768
+L 420.03 53.267768
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_24">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m223692a064" y="55.601542"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#ma3b96fd830" y="53.267768"/>
</g>
</g>
<g id="text_13">
<!-- 1.0 -->
- <g transform="translate(24.816875 59.400761)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 57.066987)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -785,7 +785,7 @@ Q 14.796875 37.203125 14.796875 27.296875
z
" id="DejaVuSans-100"/>
</defs>
- <g transform="translate(18.737188 238.822656)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(18.872187 238.282656)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-65"/>
<use x="68.408203" xlink:href="#DejaVuSans-109"/>
<use x="165.820312" xlink:href="#DejaVuSans-112"/>
@@ -799,70 +799,70 @@ z
</g>
</g>
<g id="line2d_25">
- <path clip-path="url(#p79177e7d8d)" d="M 47.72 387.16
-L 53.609683 386.336206
-L 59.499365 383.87301
-L 65.389048 379.794894
-L 71.27873 374.142387
-L 77.168413 366.971666
-L 83.058095 358.353998
-L 88.947778 348.375028
-L 94.83746 337.133932
-L 100.727143 324.74243
-L 106.616825 311.323672
-L 112.506508 297.011022
-L 118.39619 281.946724
-L 124.285873 266.280495
-L 130.175556 250.168032
-L 136.065238 233.769468
-L 141.954921 217.24778
-L 147.844603 200.767168
-L 153.734286 184.491422
-L 159.623968 168.5823
-L 165.513651 153.197912
-L 171.403333 138.491157
-L 177.293016 124.608195
-L 183.182698 111.687003
-L 189.072381 99.855997
-L 194.962063 89.232759
-L 200.851746 79.922867
-L 206.741429 72.018847
-L 212.631111 65.599253
-L 218.520794 60.727886
-L 224.410476 57.453159
-L 230.300159 55.807619
-L 236.189841 55.807619
-L 242.079524 57.453159
-L 247.969206 60.727886
-L 253.858889 65.599253
-L 259.748571 72.018847
-L 265.638254 79.922867
-L 271.527937 89.232759
-L 277.417619 99.855997
-L 283.307302 111.687003
-L 289.196984 124.608195
-L 295.086667 138.491157
-L 300.976349 153.197912
-L 306.866032 168.5823
-L 312.755714 184.491422
-L 318.645397 200.767168
-L 324.535079 217.24778
-L 330.424762 233.769468
-L 336.314444 250.168032
-L 342.204127 266.280495
-L 348.09381 281.946724
-L 353.983492 297.011022
-L 359.873175 311.323672
-L 365.762857 324.74243
-L 371.65254 337.133932
-L 377.542222 348.375028
-L 383.431905 358.353998
-L 389.321587 366.971666
-L 395.21127 374.142387
-L 401.100952 379.794894
-L 406.990635 383.87301
-L 412.880317 386.336206
-L 418.77 387.16
+ <path clip-path="url(#p9df6d55b6c)" d="M 47.855 388.6
+L 53.76254 387.766829
+L 59.670079 385.275598
+L 65.577619 381.151065
+L 71.485159 375.434221
+L 77.392698 368.181884
+L 83.300238 359.46613
+L 89.207778 349.37358
+L 95.115317 338.004539
+L 101.022857 325.471997
+L 106.930397 311.900509
+L 112.837937 297.424953
+L 118.745476 282.189195
+L 124.653016 266.344653
+L 130.560556 250.0488
+L 136.468095 233.463589
+L 142.375635 216.753852
+L 148.283175 200.085658
+L 154.190714 183.624663
+L 160.098254 167.534465
+L 166.005794 151.974973
+L 171.913333 137.100826
+L 177.820873 123.05985
+L 183.728413 109.99159
+L 189.635952 98.025924
+L 195.543492 87.281773
+L 201.451032 77.865916
+L 207.358571 69.871934
+L 213.266111 63.379272
+L 219.173651 58.45246
+L 225.08119 55.14046
+L 230.98873 53.47619
+L 236.89627 53.47619
+L 242.80381 55.14046
+L 248.711349 58.45246
+L 254.618889 63.379272
+L 260.526429 69.871934
+L 266.433968 77.865916
+L 272.341508 87.281773
+L 278.249048 98.025924
+L 284.156587 109.99159
+L 290.064127 123.05985
+L 295.971667 137.100826
+L 301.879206 151.974973
+L 307.786746 167.534465
+L 313.694286 183.624663
+L 319.601825 200.085658
+L 325.509365 216.753852
+L 331.416905 233.463589
+L 337.324444 250.0488
+L 343.231984 266.344653
+L 349.139524 282.189195
+L 355.047063 297.424953
+L 360.954603 311.900509
+L 366.862143 325.471997
+L 372.769683 338.004539
+L 378.677222 349.37358
+L 384.584762 359.46613
+L 390.492302 368.181884
+L 396.399841 375.434221
+L 402.307381 381.151065
+L 408.214921 385.275598
+L 414.12246 387.766829
+L 420.03 388.6
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
<defs>
<path d="M 0 1.5
@@ -875,120 +875,120 @@ C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0
C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066
C -0.77937 1.341951 -0.397805 1.5 0 1.5
z
-" id="m68fddb1e47" style="stroke:#0072bd;"/>
+" id="m9d25593061" style="stroke:#0072bd;"/>
</defs>
- <g clip-path="url(#p79177e7d8d)">
- <use style="fill:#0072bd;stroke:#0072bd;" x="47.72" xlink:href="#m68fddb1e47" y="387.16"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="53.609683" xlink:href="#m68fddb1e47" y="386.336206"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="59.499365" xlink:href="#m68fddb1e47" y="383.87301"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="65.389048" xlink:href="#m68fddb1e47" y="379.794894"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="71.27873" xlink:href="#m68fddb1e47" y="374.142387"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="77.168413" xlink:href="#m68fddb1e47" y="366.971666"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="83.058095" xlink:href="#m68fddb1e47" y="358.353998"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="88.947778" xlink:href="#m68fddb1e47" y="348.375028"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="94.83746" xlink:href="#m68fddb1e47" y="337.133932"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="100.727143" xlink:href="#m68fddb1e47" y="324.74243"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="106.616825" xlink:href="#m68fddb1e47" y="311.323672"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="112.506508" xlink:href="#m68fddb1e47" y="297.011022"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="118.39619" xlink:href="#m68fddb1e47" y="281.946724"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="124.285873" xlink:href="#m68fddb1e47" y="266.280495"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="130.175556" xlink:href="#m68fddb1e47" y="250.168032"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="136.065238" xlink:href="#m68fddb1e47" y="233.769468"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="141.954921" xlink:href="#m68fddb1e47" y="217.24778"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="147.844603" xlink:href="#m68fddb1e47" y="200.767168"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="153.734286" xlink:href="#m68fddb1e47" y="184.491422"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="159.623968" xlink:href="#m68fddb1e47" y="168.5823"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="165.513651" xlink:href="#m68fddb1e47" y="153.197912"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="171.403333" xlink:href="#m68fddb1e47" y="138.491157"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="177.293016" xlink:href="#m68fddb1e47" y="124.608195"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="183.182698" xlink:href="#m68fddb1e47" y="111.687003"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="189.072381" xlink:href="#m68fddb1e47" y="99.855997"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="194.962063" xlink:href="#m68fddb1e47" y="89.232759"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="200.851746" xlink:href="#m68fddb1e47" y="79.922867"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="206.741429" xlink:href="#m68fddb1e47" y="72.018847"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="212.631111" xlink:href="#m68fddb1e47" y="65.599253"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="218.520794" xlink:href="#m68fddb1e47" y="60.727886"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="224.410476" xlink:href="#m68fddb1e47" y="57.453159"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="230.300159" xlink:href="#m68fddb1e47" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="236.189841" xlink:href="#m68fddb1e47" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="242.079524" xlink:href="#m68fddb1e47" y="57.453159"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="247.969206" xlink:href="#m68fddb1e47" y="60.727886"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="253.858889" xlink:href="#m68fddb1e47" y="65.599253"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="259.748571" xlink:href="#m68fddb1e47" y="72.018847"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="265.638254" xlink:href="#m68fddb1e47" y="79.922867"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="271.527937" xlink:href="#m68fddb1e47" y="89.232759"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="277.417619" xlink:href="#m68fddb1e47" y="99.855997"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="283.307302" xlink:href="#m68fddb1e47" y="111.687003"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="289.196984" xlink:href="#m68fddb1e47" y="124.608195"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="295.086667" xlink:href="#m68fddb1e47" y="138.491157"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="300.976349" xlink:href="#m68fddb1e47" y="153.197912"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="306.866032" xlink:href="#m68fddb1e47" y="168.5823"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="312.755714" xlink:href="#m68fddb1e47" y="184.491422"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="318.645397" xlink:href="#m68fddb1e47" y="200.767168"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="324.535079" xlink:href="#m68fddb1e47" y="217.24778"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="330.424762" xlink:href="#m68fddb1e47" y="233.769468"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="336.314444" xlink:href="#m68fddb1e47" y="250.168032"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="342.204127" xlink:href="#m68fddb1e47" y="266.280495"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="348.09381" xlink:href="#m68fddb1e47" y="281.946724"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="353.983492" xlink:href="#m68fddb1e47" y="297.011022"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="359.873175" xlink:href="#m68fddb1e47" y="311.323672"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="365.762857" xlink:href="#m68fddb1e47" y="324.74243"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="371.65254" xlink:href="#m68fddb1e47" y="337.133932"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="377.542222" xlink:href="#m68fddb1e47" y="348.375028"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="383.431905" xlink:href="#m68fddb1e47" y="358.353998"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="389.321587" xlink:href="#m68fddb1e47" y="366.971666"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="395.21127" xlink:href="#m68fddb1e47" y="374.142387"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="401.100952" xlink:href="#m68fddb1e47" y="379.794894"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="406.990635" xlink:href="#m68fddb1e47" y="383.87301"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="412.880317" xlink:href="#m68fddb1e47" y="386.336206"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="418.77" xlink:href="#m68fddb1e47" y="387.16"/>
+ <g clip-path="url(#p9df6d55b6c)">
+ <use style="fill:#0072bd;stroke:#0072bd;" x="47.855" xlink:href="#m9d25593061" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="53.76254" xlink:href="#m9d25593061" y="387.766829"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="59.670079" xlink:href="#m9d25593061" y="385.275598"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="65.577619" xlink:href="#m9d25593061" y="381.151065"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="71.485159" xlink:href="#m9d25593061" y="375.434221"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="77.392698" xlink:href="#m9d25593061" y="368.181884"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="83.300238" xlink:href="#m9d25593061" y="359.46613"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="89.207778" xlink:href="#m9d25593061" y="349.37358"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="95.115317" xlink:href="#m9d25593061" y="338.004539"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="101.022857" xlink:href="#m9d25593061" y="325.471997"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="106.930397" xlink:href="#m9d25593061" y="311.900509"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="112.837937" xlink:href="#m9d25593061" y="297.424953"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="118.745476" xlink:href="#m9d25593061" y="282.189195"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="124.653016" xlink:href="#m9d25593061" y="266.344653"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="130.560556" xlink:href="#m9d25593061" y="250.0488"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="136.468095" xlink:href="#m9d25593061" y="233.463589"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="142.375635" xlink:href="#m9d25593061" y="216.753852"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="148.283175" xlink:href="#m9d25593061" y="200.085658"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="154.190714" xlink:href="#m9d25593061" y="183.624663"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="160.098254" xlink:href="#m9d25593061" y="167.534465"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="166.005794" xlink:href="#m9d25593061" y="151.974973"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="171.913333" xlink:href="#m9d25593061" y="137.100826"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="177.820873" xlink:href="#m9d25593061" y="123.05985"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="183.728413" xlink:href="#m9d25593061" y="109.99159"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="189.635952" xlink:href="#m9d25593061" y="98.025924"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="195.543492" xlink:href="#m9d25593061" y="87.281773"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="201.451032" xlink:href="#m9d25593061" y="77.865916"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="207.358571" xlink:href="#m9d25593061" y="69.871934"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="213.266111" xlink:href="#m9d25593061" y="63.379272"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="219.173651" xlink:href="#m9d25593061" y="58.45246"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="225.08119" xlink:href="#m9d25593061" y="55.14046"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="230.98873" xlink:href="#m9d25593061" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="236.89627" xlink:href="#m9d25593061" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="242.80381" xlink:href="#m9d25593061" y="55.14046"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="248.711349" xlink:href="#m9d25593061" y="58.45246"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="254.618889" xlink:href="#m9d25593061" y="63.379272"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="260.526429" xlink:href="#m9d25593061" y="69.871934"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="266.433968" xlink:href="#m9d25593061" y="77.865916"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="272.341508" xlink:href="#m9d25593061" y="87.281773"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="278.249048" xlink:href="#m9d25593061" y="98.025924"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="284.156587" xlink:href="#m9d25593061" y="109.99159"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="290.064127" xlink:href="#m9d25593061" y="123.05985"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="295.971667" xlink:href="#m9d25593061" y="137.100826"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="301.879206" xlink:href="#m9d25593061" y="151.974973"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="307.786746" xlink:href="#m9d25593061" y="167.534465"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="313.694286" xlink:href="#m9d25593061" y="183.624663"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="319.601825" xlink:href="#m9d25593061" y="200.085658"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="325.509365" xlink:href="#m9d25593061" y="216.753852"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="331.416905" xlink:href="#m9d25593061" y="233.463589"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="337.324444" xlink:href="#m9d25593061" y="250.0488"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="343.231984" xlink:href="#m9d25593061" y="266.344653"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="349.139524" xlink:href="#m9d25593061" y="282.189195"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="355.047063" xlink:href="#m9d25593061" y="297.424953"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="360.954603" xlink:href="#m9d25593061" y="311.900509"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="366.862143" xlink:href="#m9d25593061" y="325.471997"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="372.769683" xlink:href="#m9d25593061" y="338.004539"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="378.677222" xlink:href="#m9d25593061" y="349.37358"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="384.584762" xlink:href="#m9d25593061" y="359.46613"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="390.492302" xlink:href="#m9d25593061" y="368.181884"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="396.399841" xlink:href="#m9d25593061" y="375.434221"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="402.307381" xlink:href="#m9d25593061" y="381.151065"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="408.214921" xlink:href="#m9d25593061" y="385.275598"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="414.12246" xlink:href="#m9d25593061" y="387.766829"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="420.03" xlink:href="#m9d25593061" y="388.6"/>
</g>
</g>
<g id="patch_3">
- <path d="M 47.72 387.16
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
- <path d="M 418.77 387.16
-L 418.77 39.24
+ <path d="M 420.03 388.6
+L 420.03 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
- <path d="M 47.72 387.16
-L 418.77 387.16
+ <path d="M 47.855 388.6
+L 420.03 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
- <path d="M 47.72 39.24
-L 418.77 39.24
+ <path d="M 47.855 36.72
+L 420.03 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
<g id="axes_2">
<g id="patch_7">
- <path d="M 474.23 387.16
-L 845.28 387.16
-L 845.28 39.24
-L 474.23 39.24
+ <path d="M 473.06 388.6
+L 845.235 388.6
+L 845.235 36.72
+L 473.06 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_3">
<g id="xtick_8">
<g id="line2d_26">
- <path clip-path="url(#p6edaed3a83)" d="M 474.23 387.16
-L 474.23 39.24
+ <path clip-path="url(#pe1bc435c08)" d="M 473.06 388.6
+L 473.06 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_27">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m84aad1aeff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#m08b5520b76" y="388.6"/>
</g>
</g>
<g id="text_15">
<!-- 0.0 -->
- <g transform="translate(466.278437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(465.108437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -997,18 +997,18 @@ L 474.23 39.24
</g>
<g id="xtick_9">
<g id="line2d_28">
- <path clip-path="url(#p6edaed3a83)" d="M 548.44 387.16
-L 548.44 39.24
+ <path clip-path="url(#pe1bc435c08)" d="M 547.495 388.6
+L 547.495 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_29">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="548.44" xlink:href="#m84aad1aeff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.495" xlink:href="#m08b5520b76" y="388.6"/>
</g>
</g>
<g id="text_16">
<!-- 0.2 -->
- <g transform="translate(540.488437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(539.543437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -1017,18 +1017,18 @@ L 548.44 39.24
</g>
<g id="xtick_10">
<g id="line2d_30">
- <path clip-path="url(#p6edaed3a83)" d="M 622.65 387.16
-L 622.65 39.24
+ <path clip-path="url(#pe1bc435c08)" d="M 621.93 388.6
+L 621.93 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_31">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="622.65" xlink:href="#m84aad1aeff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="621.93" xlink:href="#m08b5520b76" y="388.6"/>
</g>
</g>
<g id="text_17">
<!-- 0.4 -->
- <g transform="translate(614.698437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(613.978437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -1037,18 +1037,18 @@ L 622.65 39.24
</g>
<g id="xtick_11">
<g id="line2d_32">
- <path clip-path="url(#p6edaed3a83)" d="M 696.86 387.16
-L 696.86 39.24
+ <path clip-path="url(#pe1bc435c08)" d="M 696.365 388.6
+L 696.365 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_33">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="696.86" xlink:href="#m84aad1aeff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="696.365" xlink:href="#m08b5520b76" y="388.6"/>
</g>
</g>
<g id="text_18">
<!-- 0.6 -->
- <g transform="translate(688.908437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(688.413437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -1057,18 +1057,18 @@ L 696.86 39.24
</g>
<g id="xtick_12">
<g id="line2d_34">
- <path clip-path="url(#p6edaed3a83)" d="M 771.07 387.16
-L 771.07 39.24
+ <path clip-path="url(#pe1bc435c08)" d="M 770.8 388.6
+L 770.8 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_35">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="771.07" xlink:href="#m84aad1aeff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="770.8" xlink:href="#m08b5520b76" y="388.6"/>
</g>
</g>
<g id="text_19">
<!-- 0.8 -->
- <g transform="translate(763.118437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(762.848437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -1077,18 +1077,18 @@ L 771.07 39.24
</g>
<g id="xtick_13">
<g id="line2d_36">
- <path clip-path="url(#p6edaed3a83)" d="M 845.28 387.16
-L 845.28 39.24
+ <path clip-path="url(#pe1bc435c08)" d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_37">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="845.28" xlink:href="#m84aad1aeff" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="845.235" xlink:href="#m08b5520b76" y="388.6"/>
</g>
</g>
<g id="text_20">
<!-- 1.0 -->
- <g transform="translate(837.328437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(837.283437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1321,7 +1321,7 @@ Q 14.5 64.65625 8.015625 75.875
z
" id="DejaVuSans-41"/>
</defs>
- <g transform="translate(560.955 415.438125)scale(0.1 -0.1)">
+ <g transform="translate(560.3475 416.878125)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-78"/>
<use transform="translate(74.804688 0.015625)" xlink:href="#DejaVuSans-111"/>
<use transform="translate(135.986328 0.015625)" xlink:href="#DejaVuSans-114"/>
@@ -1364,13 +1364,13 @@ z
<g id="matplotlib.axis_4">
<g id="ytick_6">
<g id="line2d_38">
- <path clip-path="url(#p6edaed3a83)" d="M 474.23 357.720863
-L 845.28 357.720863
+ <path clip-path="url(#pe1bc435c08)" d="M 473.06 358.825789
+L 845.235 358.825789
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_39">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m223692a064" y="357.720863"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#ma3b96fd830" y="358.825789"/>
</g>
</g>
<g id="text_22">
@@ -1383,7 +1383,7 @@ L 10.59375 27.203125
z
" id="DejaVuSans-8722"/>
</defs>
- <g transform="translate(446.125312 361.520082)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 362.625008)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-56"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1392,18 +1392,18 @@ z
</g>
<g id="ytick_7">
<g id="line2d_40">
- <path clip-path="url(#p6edaed3a83)" d="M 474.23 303.016407
-L 845.28 303.016407
+ <path clip-path="url(#pe1bc435c08)" d="M 473.06 303.498691
+L 845.235 303.498691
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_41">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m223692a064" y="303.016407"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#ma3b96fd830" y="303.498691"/>
</g>
</g>
<g id="text_23">
<!-- −60 -->
- <g transform="translate(446.125312 306.815626)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 307.29791)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-54"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1412,18 +1412,18 @@ L 845.28 303.016407
</g>
<g id="ytick_8">
<g id="line2d_42">
- <path clip-path="url(#p6edaed3a83)" d="M 474.23 248.311951
-L 845.28 248.311951
+ <path clip-path="url(#pe1bc435c08)" d="M 473.06 248.171593
+L 845.235 248.171593
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_43">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m223692a064" y="248.311951"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#ma3b96fd830" y="248.171593"/>
</g>
</g>
<g id="text_24">
<!-- −40 -->
- <g transform="translate(446.125312 252.11117)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 251.970812)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-52"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1432,18 +1432,18 @@ L 845.28 248.311951
</g>
<g id="ytick_9">
<g id="line2d_44">
- <path clip-path="url(#p6edaed3a83)" d="M 474.23 193.607495
-L 845.28 193.607495
+ <path clip-path="url(#pe1bc435c08)" d="M 473.06 192.844495
+L 845.235 192.844495
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_45">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m223692a064" y="193.607495"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#ma3b96fd830" y="192.844495"/>
</g>
</g>
<g id="text_25">
<!-- −20 -->
- <g transform="translate(446.125312 197.406714)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 196.643714)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-50"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1452,36 +1452,36 @@ L 845.28 193.607495
</g>
<g id="ytick_10">
<g id="line2d_46">
- <path clip-path="url(#p6edaed3a83)" d="M 474.23 138.90304
-L 845.28 138.90304
+ <path clip-path="url(#pe1bc435c08)" d="M 473.06 137.517397
+L 845.235 137.517397
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_47">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m223692a064" y="138.90304"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#ma3b96fd830" y="137.517397"/>
</g>
</g>
<g id="text_26">
<!-- 0 -->
- <g transform="translate(460.8675 142.702258)scale(0.1 -0.1)">
+ <g transform="translate(459.6975 141.316616)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_11">
<g id="line2d_48">
- <path clip-path="url(#p6edaed3a83)" d="M 474.23 84.198584
-L 845.28 84.198584
+ <path clip-path="url(#pe1bc435c08)" d="M 473.06 82.190299
+L 845.235 82.190299
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_49">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m223692a064" y="84.198584"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#ma3b96fd830" y="82.190299"/>
</g>
</g>
<g id="text_27">
<!-- 20 -->
- <g transform="translate(454.505 87.997803)scale(0.1 -0.1)">
+ <g transform="translate(453.335 85.989518)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -1545,7 +1545,7 @@ L 9.8125 0
z
" id="DejaVuSans-66"/>
</defs>
- <g transform="translate(440.045625 236.791406)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(438.875625 236.251406)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-71"/>
<use x="77.490234" xlink:href="#DejaVuSans-97"/>
<use x="138.769531" xlink:href="#DejaVuSans-105"/>
@@ -1559,524 +1559,525 @@ z
</g>
</g>
<g id="line2d_50">
- <path clip-path="url(#p6edaed3a83)" d="M 474.23 55.054545
-L 474.954707 55.126767
-L 475.679414 55.343639
-L 476.404121 55.70579
-L 477.128828 56.214276
-L 478.578242 57.676723
-L 480.027656 59.748768
-L 481.47707 62.456837
-L 482.926484 65.837803
-L 484.375898 69.941778
-L 485.825312 74.836483
-L 487.274727 80.614226
-L 488.724141 87.403574
-L 490.173555 95.390117
-L 491.622969 104.856747
-L 493.072383 116.271803
-L 494.521797 130.519522
-L 495.246504 139.258042
-L 495.971211 149.707007
-L 496.695918 163.005254
-L 497.420625 182.487577
-L 498.145332 236.823771
-L 498.870039 199.657126
-L 499.594746 187.19669
-L 500.319453 183.483906
-L 501.04416 183.612343
-L 501.768867 186.301767
-L 502.493574 191.172182
-L 503.218281 198.256785
-L 503.942988 207.904042
-L 504.667695 220.763699
-L 506.117109 252.968885
-L 506.841816 249.93983
-L 508.29123 217.79677
-L 509.015937 205.997821
-L 509.740645 196.968513
-L 510.465352 190.004272
-L 511.190059 184.634933
-L 511.914766 180.557704
-L 512.639473 177.578933
-L 513.36418 175.579349
-L 514.088887 174.495612
-L 514.813594 174.313136
-L 515.538301 175.068822
-L 516.263008 176.866708
-L 516.987715 179.917748
-L 517.712422 184.638623
-L 518.437129 191.935939
-L 519.161836 204.325986
-L 519.886543 235.995749
-L 520.61125 221.045177
-L 521.335957 199.130525
-L 522.060664 188.400707
-L 522.785371 181.652712
-L 523.510078 177.106927
-L 524.234785 174.056539
-L 524.959492 172.163692
-L 525.684199 171.259332
-L 526.408906 171.2717
-L 527.133613 172.201523
-L 527.85832 174.122595
-L 528.583027 177.20821
-L 529.307734 181.806389
-L 530.032441 188.6519
-L 530.757148 199.62542
-L 531.481855 222.690559
-L 532.206562 232.32003
-L 532.93127 202.944156
-L 533.655977 190.815476
-L 534.380684 183.534314
-L 535.105391 178.736218
-L 535.830098 175.553721
-L 536.554805 173.586708
-L 537.279512 172.636412
-L 538.004219 172.614203
-L 538.728926 173.509027
-L 539.453633 175.383738
-L 540.17834 178.397364
-L 540.903047 182.87247
-L 541.627754 189.483557
-L 542.352461 199.908508
-L 543.801875 241.405452
-L 544.526582 206.656523
-L 545.251289 193.750512
-L 545.975996 186.162006
-L 546.700703 181.199831
-L 547.42541 177.913952
-L 548.150117 175.873347
-L 548.874824 174.864651
-L 549.599531 174.790861
-L 550.324238 175.63492
-L 551.048945 177.453919
-L 551.773652 180.399243
-L 552.498359 184.779851
-L 553.223066 191.238624
-L 553.947773 201.350799
-L 554.67248 220.974368
-L 555.397187 249.050769
-L 556.121895 210.014437
-L 556.846602 196.597795
-L 557.571309 188.803013
-L 558.296016 183.724005
-L 559.020723 180.358865
-L 559.74543 178.257534
-L 560.470137 177.197718
-L 561.194844 177.07728
-L 561.919551 177.87544
-L 562.644258 179.645664
-L 563.368965 182.534483
-L 564.093672 186.842227
-L 564.818379 193.19191
-L 565.543086 203.095563
-L 566.267793 222.027487
-L 566.9925 255.676049
-L 567.717207 213.008726
-L 568.441914 199.22403
-L 569.166621 191.278737
-L 569.891328 186.111564
-L 570.616035 182.684257
-L 571.340742 180.533584
-L 572.065449 179.431111
-L 572.790156 179.271172
-L 573.514863 180.030406
-L 574.23957 181.75975
-L 574.964277 184.602333
-L 575.688984 188.852438
-L 576.413691 195.119247
-L 577.138398 204.871347
-L 577.863105 223.328589
-L 578.587812 261.542833
-L 579.31252 215.677897
-L 580.037227 201.611633
-L 580.761934 193.550408
-L 581.486641 188.313887
-L 582.211348 184.836532
-L 582.936055 182.645318
-L 583.660762 181.507266
-L 584.385469 181.314094
-L 585.110176 182.040529
-L 585.834883 183.735621
-L 586.55959 186.53995
-L 587.284297 190.74328
-L 588.009004 196.944493
-L 588.733711 206.580135
-L 589.458418 224.687048
-L 590.183125 266.826325
-L 590.907832 218.06552
-L 591.632539 203.774651
-L 592.357246 195.62061
-L 593.081953 190.327794
-L 593.80666 186.809189
-L 594.531367 184.584122
-L 595.256074 183.41607
-L 595.980781 183.194718
-L 596.705488 183.893302
-L 597.430195 185.559396
-L 598.154902 188.331584
-L 598.879609 192.49609
-L 599.604316 198.643757
-L 600.329023 208.186299
-L 601.05373 226.021408
-L 601.778437 271.650596
-L 602.503145 220.210396
-L 603.227852 205.734664
-L 603.952559 197.504102
-L 604.677266 192.164428
-L 605.401973 188.611126
-L 606.12668 186.357323
-L 606.851387 185.163635
-L 607.576094 184.918107
-L 608.300801 185.592768
-L 609.025508 187.233996
-L 609.750215 189.978757
-L 610.474922 194.110404
-L 611.199629 200.213283
-L 611.924336 209.679145
-L 612.649043 227.295479
-L 613.37375 276.107559
-L 614.098457 222.144962
-L 614.823164 207.513304
-L 615.547871 199.21817
-L 616.272578 193.838683
-L 616.997285 190.255677
-L 617.721992 187.977111
-L 618.446699 186.761225
-L 619.171406 186.494699
-L 619.896113 187.148559
-L 620.62082 188.768189
-L 621.345527 191.489205
-L 622.070234 195.592571
-L 622.794941 201.657232
-L 623.519648 211.058431
-L 624.244355 228.493607
-L 624.969062 280.268021
-L 625.69377 223.89584
-L 626.418477 209.130023
-L 627.143184 200.779351
-L 627.867891 195.365451
-L 628.592598 191.756623
-L 629.317305 189.456425
-L 630.042012 188.221074
-L 630.766719 187.936091
-L 631.491426 188.571653
-L 632.216133 190.172294
-L 632.94084 192.872483
-L 633.665547 196.951148
-L 634.390254 202.982648
-L 635.114961 212.328255
-L 635.839668 229.609979
-L 636.564375 284.188547
-L 637.289082 225.484818
-L 638.013789 210.601642
-L 638.738496 202.202428
-L 639.463203 196.758339
-L 640.18791 193.126761
-L 640.912617 190.80743
-L 641.637324 189.554814
-L 642.362031 189.25343
-L 643.086738 189.872717
-L 643.811445 191.456476
-L 644.536152 194.138178
-L 645.260859 198.19499
-L 645.985566 204.1973
-L 646.710273 213.494333
-L 647.43498 230.643617
-L 648.159687 287.915954
-L 648.884395 226.929782
-L 649.609102 211.942481
-L 650.333809 203.500252
-L 651.058516 198.029337
-L 651.783223 194.377474
-L 652.50793 192.041034
-L 653.232637 190.772941
-L 653.957344 190.456832
-L 654.682051 191.061497
-L 655.406758 192.63009
-L 656.131465 195.295207
-L 656.856172 199.332461
-L 657.580879 205.308753
-L 658.305586 214.562753
-L 659.030293 231.595912
-L 659.755 291.490455
-L 660.479707 228.245498
-L 661.204414 213.164673
-L 661.929121 204.683865
-L 662.653828 199.18884
-L 663.378535 195.518697
-L 664.103242 193.1668
-L 664.827949 191.884699
-L 665.552656 191.555245
-L 666.277363 192.14665
-L 667.00207 193.701491
-L 667.726777 196.351581
-L 668.451484 200.37115
-L 669.176191 206.323994
-L 669.900898 215.539404
-L 670.625605 232.46935
-L 671.350312 294.94797
-L 672.07502 229.444236
-L 672.799727 214.278493
-L 673.524434 205.762712
-L 674.249141 200.245796
-L 674.973848 196.55902
-L 675.698555 194.19303
-L 676.423262 192.898138
-L 677.147969 192.556484
-L 677.872676 193.135758
-L 678.597383 194.67802
-L 679.32209 197.314374
-L 680.046797 201.317803
-L 680.771504 207.249302
-L 681.496211 216.429734
-L 682.220918 233.266844
-L 682.945625 298.322005
-L 683.670332 230.536253
-L 684.395039 215.292654
-L 685.119746 206.744863
-L 685.844453 201.207889
-L 686.56916 197.505844
-L 687.293867 195.126896
-L 688.018574 193.820226
-L 688.743281 193.467329
-L 689.467988 194.035419
-L 690.192695 195.56608
-L 690.917402 198.189774
-L 691.642109 202.178345
-L 692.366816 208.090239
-L 693.091523 217.238659
-L 693.81623 233.991382
-L 694.540937 301.645304
-L 695.265645 231.530176
-L 695.990352 216.214564
-L 696.715059 207.63722
-L 697.439766 202.081709
-L 698.164473 198.365534
-L 698.88918 195.974579
-L 699.613887 194.656983
-L 700.338594 194.293646
-L 701.063301 194.851345
-L 701.788008 196.371229
-L 702.512715 198.983164
-L 703.237422 202.95795
-L 703.962129 208.851689
-L 704.686836 217.970554
-L 705.411543 234.645836
-L 706.13625 304.951507
-L 706.860957 232.433294
-L 707.585664 217.050537
-L 708.310371 208.445689
-L 709.035078 202.872915
-L 709.759785 199.143566
-L 710.484492 196.741403
-L 711.209199 195.413597
-L 711.933906 195.040498
-L 712.658613 195.588477
-L 713.38332 197.098276
-L 714.108027 199.699213
-L 714.832734 203.661114
-L 715.557441 209.537911
-L 716.282148 218.629272
-L 717.006855 235.232871
-L 717.731562 308.277018
-L 718.45627 233.251795
-L 719.180977 217.805964
-L 719.905684 209.175327
-L 720.630391 203.586361
-L 721.355098 199.844643
-L 722.079805 197.431946
-L 722.804512 196.094536
-L 723.529219 195.712249
-L 724.253926 196.251073
-L 724.978633 197.751374
-L 725.70334 200.341954
-L 726.428047 204.291732
-L 727.152754 210.152606
-L 727.877461 219.21818
-L 728.602168 235.754897
-L 729.326875 311.663378
-L 730.051582 233.990949
-L 730.776289 218.485453
-L 731.500996 209.830469
-L 732.225703 204.226212
-L 732.95041 200.472805
-L 733.675117 198.050142
-L 734.399824 196.703642
-L 735.124531 196.312651
-L 735.849238 196.842801
-L 736.573945 198.334101
-L 737.298652 200.914866
-L 738.023359 204.85316
-L 738.748066 210.698971
-L 739.472773 219.740199
-L 740.19748 236.214055
-L 740.922187 315.160554
-L 741.646895 234.655248
-L 742.371602 219.092945
-L 743.096309 210.414825
-L 743.821016 204.796035
-L 744.545723 201.031512
-L 745.27043 198.599367
-L 745.995137 197.244209
-L 746.719844 196.844924
-L 747.444551 197.366806
-L 748.169258 198.849523
-L 748.893965 201.420932
-L 749.618672 205.348283
-L 750.343379 211.179753
-L 751.068086 220.197848
-L 751.792793 236.612213
-L 752.5175 318.831932
-L 753.242207 235.248531
-L 753.966914 219.631804
-L 754.691621 210.931564
-L 755.416328 205.298879
-L 756.141035 201.523721
-L 756.865742 199.082498
-L 757.590449 197.719049
-L 758.315156 197.311816
-L 759.039863 197.825772
-L 759.76457 199.30026
-L 760.489277 201.862698
-L 761.213984 205.779559
-L 761.938691 211.597296
-L 762.663398 220.593271
-L 763.388105 236.95097
-L 764.112813 322.762418
-L 764.83752 235.77407
-L 765.562227 220.104896
-L 766.286934 211.383381
-L 767.011641 205.737334
-L 767.736348 201.951944
-L 768.461055 199.501984
-L 769.185762 198.130548
-L 769.910469 197.715658
-L 770.635176 198.221974
-L 771.359883 199.688528
-L 772.08459 202.242316
-L 772.809297 206.149068
-L 773.534004 211.953576
-L 774.258711 220.928279
-L 774.983418 237.231668
-L 775.708125 327.072648
-L 776.432832 236.234648
-L 777.157539 220.514644
-L 777.882246 211.772553
-L 778.606953 206.113585
-L 779.33166 202.318299
-L 780.056367 199.859882
-L 780.781074 198.480714
-L 781.505781 198.058406
-L 782.230488 198.557318
-L 782.955195 200.016183
-L 783.679902 202.561588
-L 784.404609 206.458542
-L 785.129316 212.250239
-L 785.854023 221.204367
-L 786.57873 237.455402
-L 787.303437 331.946085
-L 788.028145 236.632622
-L 788.752852 220.863084
-L 789.477559 212.100984
-L 790.202266 206.429454
-L 790.926973 202.624544
-L 791.65168 200.157901
-L 792.376387 198.771207
-L 793.101094 198.341678
-L 793.825801 198.833379
-L 794.550508 200.284754
-L 795.275215 202.82199
-L 795.999922 206.709401
-L 796.724629 212.488625
-L 797.449336 221.422744
-L 798.174043 237.623022
-L 798.89875 337.686586
-L 799.623457 236.969967
-L 800.348164 221.151902
-L 801.072871 212.37024
-L 801.797578 206.686434
-L 802.522285 202.872118
-L 803.246992 200.397433
-L 803.971699 199.003377
-L 804.696406 198.566781
-L 805.421113 199.051425
-L 806.14582 200.495465
-L 806.870527 203.024703
-L 807.595234 206.90277
-L 808.319941 212.669786
-L 809.044648 221.584346
-L 809.769355 237.735148
-L 810.494062 344.860207
-L 811.21877 237.24832
-L 811.943477 221.382466
-L 812.668184 212.581582
-L 813.392891 206.885718
-L 814.117598 203.062162
-L 814.842305 200.579573
-L 815.567012 199.178282
-L 816.291719 198.734737
-L 817.016426 199.212439
-L 817.741133 200.649263
-L 818.46584 203.170631
-L 819.190547 207.039503
-L 819.915254 212.794512
-L 820.639961 221.68985
-L 821.364668 237.792167
-L 822.089375 354.733891
-L 822.814082 237.469009
-L 823.538789 221.555852
-L 824.263496 212.735983
-L 824.988203 207.028216
-L 825.71291 203.195538
-L 826.437617 200.705145
-L 827.162324 199.296707
-L 827.887031 198.846296
-L 828.611738 199.317137
-L 829.336445 200.746827
-L 830.061152 203.260413
-L 830.785859 207.120194
-L 831.510566 212.863332
-L 832.235273 221.739686
-L 832.95998 237.794244
-L 833.684687 371.345455
-L 834.409395 237.63308
-L 835.134102 221.672862
-L 835.858809 212.834149
-L 836.583516 207.114574
-L 837.308223 203.272847
-L 838.03293 200.774712
-L 838.757637 199.359181
-L 839.482344 198.901954
-L 840.207051 199.36598
-L 840.931758 200.788584
-L 841.656465 203.294438
-L 842.381172 207.145185
-L 843.105879 212.876531
-L 843.830586 221.734041
-L 844.555293 237.741313
-L 844.555293 237.741313
+ <path clip-path="url(#pe1bc435c08)" d="M 473.06 52.714545
+L 473.786904 52.787589
+L 474.513809 53.006929
+L 475.240713 53.373202
+L 475.967617 53.887476
+L 476.694521 54.551269
+L 478.14833 56.335868
+L 479.602139 58.749179
+L 481.055947 61.822933
+L 482.509756 65.600679
+L 483.963564 70.141321
+L 485.417373 75.524674
+L 486.871182 81.860528
+L 488.32499 89.304256
+L 489.778799 98.085694
+L 491.232607 108.568333
+L 492.686416 121.389588
+L 493.41332 129.038459
+L 494.140225 137.87644
+L 494.867129 148.444335
+L 495.594033 161.893941
+L 496.320937 181.598011
+L 497.047842 236.552655
+L 497.774746 198.962982
+L 498.50165 186.360723
+L 499.228555 182.60568
+L 499.955459 182.735579
+L 500.682363 185.455613
+L 501.409268 190.381463
+L 502.136172 197.546702
+L 502.863076 207.303763
+L 503.58998 220.309788
+L 505.043789 252.881531
+L 505.770693 249.818
+L 507.224502 217.309091
+L 507.951406 205.375846
+L 508.678311 196.243768
+L 509.405215 189.20026
+L 510.132119 183.769808
+L 510.859023 179.646171
+L 511.585928 176.633496
+L 512.312832 174.611153
+L 513.039736 173.515082
+L 513.766641 173.330528
+L 514.493545 174.094816
+L 515.220449 175.913165
+L 515.947354 178.998932
+L 516.674258 183.77354
+L 517.401162 191.153913
+L 518.128066 203.684982
+L 518.854971 235.715209
+L 519.581875 220.59447
+L 520.308779 198.430387
+L 521.035684 187.578443
+L 521.762588 180.753643
+L 522.489492 176.156119
+L 523.216396 173.071011
+L 523.943301 171.15662
+L 524.670205 170.241966
+L 525.397109 170.254475
+L 526.124014 171.194881
+L 526.850918 173.137819
+L 527.577822 176.258554
+L 528.304727 180.909069
+L 529.031631 187.832495
+L 529.758535 198.930915
+L 530.485439 222.25858
+L 531.212344 231.997653
+L 531.939248 202.287424
+L 532.666152 190.020697
+L 533.393057 182.656661
+L 534.119961 177.803954
+L 534.846865 174.585234
+L 535.57377 172.595832
+L 536.300674 171.63472
+L 537.027578 171.612258
+L 537.754482 172.517267
+L 538.481387 174.413316
+L 539.208291 177.461243
+L 539.935195 181.987284
+L 540.6621 188.673619
+L 541.389004 199.217226
+L 542.842812 241.186484
+L 543.569717 206.042046
+L 544.296621 192.989139
+L 545.023525 185.314262
+L 545.75043 180.295607
+L 546.477334 176.972329
+L 547.204238 174.908498
+L 547.931143 173.888321
+L 548.658047 173.813691
+L 549.384951 174.667357
+L 550.111855 176.507059
+L 550.83876 179.485907
+L 551.565664 183.916375
+L 552.292568 190.448661
+L 553.019473 200.675932
+L 553.746377 220.522856
+L 554.473281 248.91882
+L 555.200186 209.438179
+L 555.92709 195.86883
+L 556.653994 187.985328
+L 557.380898 182.848511
+L 558.107803 179.44507
+L 558.834707 177.319821
+L 559.561611 176.247942
+L 560.288516 176.126134
+L 561.01542 176.933379
+L 561.742324 178.723751
+L 562.469229 181.645451
+L 563.196133 186.002225
+L 563.923037 192.424179
+L 564.649941 202.440555
+L 565.376846 221.587961
+L 566.10375 255.619508
+L 566.830654 212.466549
+L 567.557559 198.524956
+L 568.284463 190.489231
+L 569.011367 185.263246
+L 569.738271 181.796929
+L 570.465176 179.621777
+L 571.19208 178.506756
+L 571.918984 178.344996
+L 572.645889 179.112872
+L 573.372793 180.8619
+L 574.099697 183.736837
+L 574.826602 188.035316
+L 575.553506 194.373453
+L 576.28041 204.236551
+L 577.007314 222.903872
+L 577.734219 261.553067
+L 578.461123 215.1661
+L 579.188027 200.939735
+L 579.914932 192.786758
+L 580.641836 187.490636
+L 581.36874 183.973701
+L 582.095645 181.757547
+L 582.822549 180.606542
+L 583.549453 180.411171
+L 584.276357 181.145874
+L 585.003262 182.86026
+L 585.730166 185.696507
+L 586.45707 189.94768
+L 587.183975 196.219474
+L 587.910879 205.964788
+L 588.637783 224.277793
+L 589.364687 266.896696
+L 590.091592 217.580899
+L 590.818496 203.127372
+L 591.5454 194.880523
+L 592.272305 189.527464
+L 592.999209 185.968811
+L 593.726113 183.718418
+L 594.453018 182.537071
+L 595.179922 182.3132
+L 595.906826 183.019735
+L 596.63373 184.704793
+L 597.360635 187.508534
+L 598.087539 191.720439
+L 598.814443 197.938079
+L 599.541348 207.589233
+L 600.268252 225.62734
+L 600.995156 271.775876
+L 601.722061 219.750188
+L 602.448965 205.109694
+L 603.175869 196.785453
+L 603.902773 191.385002
+L 604.629678 187.791257
+L 605.356582 185.511801
+L 606.083486 184.304528
+L 606.810391 184.056205
+L 607.537295 184.738545
+L 608.264199 186.398453
+L 608.991104 189.174455
+L 609.718008 193.353128
+L 610.444912 199.525469
+L 611.171816 209.099071
+L 611.898721 226.915913
+L 612.625625 276.283568
+L 613.352529 221.706773
+L 614.079434 206.908578
+L 614.806338 198.519029
+L 615.533242 193.078314
+L 616.260146 189.454526
+L 616.987051 187.150026
+L 617.713955 185.920301
+L 618.440859 185.650741
+L 619.167764 186.312043
+L 619.894668 187.950108
+L 620.621572 190.702094
+L 621.348477 194.852165
+L 622.075381 200.985853
+L 622.802285 210.494055
+L 623.529189 228.127678
+L 624.256094 280.491385
+L 624.982998 223.47758
+L 625.709902 208.543699
+L 626.436807 200.09798
+L 627.163711 194.622459
+L 627.890615 190.972556
+L 628.61752 188.646177
+L 629.344424 187.396766
+L 630.071328 187.108539
+L 630.798232 187.751335
+L 631.525137 189.370195
+L 632.252041 192.101117
+L 632.978945 196.226205
+L 633.70585 202.326355
+L 634.432754 211.778332
+L 635.159658 229.256756
+L 635.886562 284.456533
+L 636.613467 225.084643
+L 637.340371 210.032067
+L 638.067275 201.537254
+L 638.79418 196.031201
+L 639.521084 192.358289
+L 640.247988 190.01256
+L 640.974893 188.745687
+L 641.701797 188.440872
+L 642.428701 189.067208
+L 643.155605 190.668993
+L 643.88251 193.381218
+L 644.609414 197.484204
+L 645.336318 203.554832
+L 646.063223 212.957683
+L 646.790127 230.302159
+L 647.517031 288.226366
+L 648.243936 226.546053
+L 648.97084 211.388168
+L 649.697744 202.84985
+L 650.424648 197.316666
+L 651.151553 193.623238
+L 651.878457 191.260204
+L 652.605361 189.977678
+L 653.332266 189.657971
+L 654.05917 190.269518
+L 654.786074 191.855965
+L 655.512979 194.551416
+L 656.239883 198.634621
+L 656.966787 204.678936
+L 657.693691 214.038264
+L 658.420596 231.265293
+L 659.1475 291.841551
+L 659.874404 227.876745
+L 660.601309 212.624271
+L 661.328213 204.046935
+L 662.055117 198.489366
+L 662.782021 194.77745
+L 663.508926 192.398783
+L 664.23583 191.10209
+L 664.962734 190.768886
+L 665.689639 191.367022
+L 666.416543 192.93956
+L 667.143447 195.619813
+L 667.870352 199.685133
+L 668.597256 205.705732
+L 669.32416 215.026031
+L 670.051064 232.148673
+L 670.777969 295.338419
+L 671.504873 229.089127
+L 672.231777 213.750768
+L 672.958682 205.138061
+L 673.685586 199.558353
+L 674.41249 195.829614
+L 675.139395 193.436694
+L 675.866299 192.127063
+L 676.593203 191.781521
+L 677.320107 192.367389
+L 678.047012 193.927204
+L 678.773916 196.593565
+L 679.50082 200.642561
+L 680.227725 206.641572
+L 680.954629 215.926494
+L 681.681533 232.955244
+L 682.408437 298.750858
+L 683.135342 230.193573
+L 683.862246 214.776472
+L 684.58915 206.131392
+L 685.316055 200.531395
+L 686.042959 196.787214
+L 686.769863 194.381189
+L 687.496768 193.059647
+L 688.223672 192.702733
+L 688.950576 193.277289
+L 689.67748 194.825372
+L 690.404385 197.478928
+L 691.131289 201.512897
+L 691.858193 207.492081
+L 692.585098 216.744627
+L 693.312002 233.688028
+L 694.038906 302.111982
+L 694.765811 231.198808
+L 695.492715 215.708876
+L 696.219619 207.033905
+L 696.946523 201.415161
+L 697.673428 197.65669
+L 698.400332 195.238521
+L 699.127236 193.905928
+L 699.854141 193.538456
+L 700.581045 194.102502
+L 701.307949 195.639685
+L 702.034854 198.281349
+L 702.761758 202.301376
+L 703.488662 208.262197
+L 704.215566 217.484853
+L 704.942471 234.349931
+L 705.669375 305.455815
+L 706.396279 232.112206
+L 707.123184 216.554364
+L 707.850088 207.851575
+L 708.576992 202.215372
+L 709.303896 198.443577
+L 710.030801 196.014072
+L 710.757705 194.671154
+L 711.484609 194.293808
+L 712.211514 194.848024
+L 712.938418 196.375007
+L 713.665322 199.005548
+L 714.392227 203.012543
+L 715.119131 208.956229
+L 715.846035 218.151068
+L 716.572939 234.943648
+L 717.299844 308.819178
+L 718.026748 232.940024
+L 718.753652 217.318389
+L 719.480557 208.589518
+L 720.207461 202.936939
+L 720.934365 199.152634
+L 721.66127 196.712475
+L 722.388174 195.359843
+L 723.115078 194.973204
+L 723.841982 195.518162
+L 724.568887 197.035539
+L 725.295791 199.655605
+L 726.022695 203.650338
+L 726.7496 209.57792
+L 727.476504 218.746678
+L 728.203408 235.471616
+L 728.930312 312.244081
+L 729.657217 233.68759
+L 730.384121 218.005612
+L 731.111025 209.252118
+L 731.83793 203.584073
+L 732.564834 199.787945
+L 733.291738 197.337708
+L 734.018643 195.975882
+L 734.745547 195.58044
+L 735.472451 196.116625
+L 736.199355 197.624898
+L 736.92626 200.235038
+L 737.653164 204.218157
+L 738.380068 210.130504
+L 739.106973 219.27464
+L 739.833877 235.936
+L 740.560781 315.781062
+L 741.287686 234.35945
+L 742.01459 218.620018
+L 742.741494 209.843125
+L 743.468398 204.160382
+L 744.195303 200.353011
+L 744.922207 197.893183
+L 745.649111 196.522601
+L 746.376016 196.118772
+L 747.10292 196.646594
+L 747.829824 198.146187
+L 748.556729 200.746864
+L 749.283633 204.718915
+L 750.010537 210.616759
+L 750.737441 219.737497
+L 751.464346 236.338689
+L 752.19125 319.494227
+L 752.918154 234.959486
+L 753.645059 219.165011
+L 754.371963 210.365745
+L 755.098867 204.668949
+L 755.825771 200.850822
+L 756.552676 198.381814
+L 757.27958 197.002846
+L 758.006484 196.590978
+L 758.733389 197.110784
+L 759.460293 198.602054
+L 760.187197 201.193657
+L 760.914102 205.1551
+L 761.641006 211.039054
+L 762.36791 220.137421
+L 763.094814 236.681301
+L 763.821719 323.469449
+L 764.548623 235.491006
+L 765.275527 219.643487
+L 766.002432 210.822704
+L 766.729336 205.112394
+L 767.45624 201.28392
+L 768.183145 198.806075
+L 768.910049 197.419029
+L 769.636953 196.999417
+L 770.363857 197.511495
+L 771.090762 198.994742
+L 771.817666 201.577597
+L 772.54457 205.528815
+L 773.271475 211.399389
+L 773.998379 220.476242
+L 774.725283 236.965195
+L 775.452187 327.828738
+L 776.179092 235.956827
+L 776.905996 220.057899
+L 777.6329 211.216306
+L 778.359805 205.492928
+L 779.086709 201.654444
+L 779.813613 199.168046
+L 780.540518 197.77318
+L 781.267422 197.346066
+L 781.994326 197.850656
+L 782.72123 199.326126
+L 783.448135 201.900502
+L 784.175039 205.841812
+L 784.901943 211.699429
+L 785.628848 220.755473
+L 786.355752 237.191475
+L 787.082656 332.757645
+L 787.809561 236.35933
+L 788.536465 220.410305
+L 789.263369 211.548475
+L 789.990273 205.812392
+L 790.717178 201.964175
+L 791.444082 199.469457
+L 792.170986 198.06698
+L 792.897891 197.632561
+L 793.624795 198.12986
+L 794.351699 199.597753
+L 795.078604 202.163868
+L 795.805508 206.095526
+L 796.532412 211.940528
+L 797.259316 220.976335
+L 797.986221 237.361003
+L 798.713125 338.563483
+L 799.440029 236.700515
+L 800.166934 220.70241
+L 800.893838 211.820796
+L 801.620742 206.072297
+L 802.347646 202.214567
+L 803.074551 199.711715
+L 803.801455 198.301792
+L 804.528359 197.860227
+L 805.255264 198.350387
+L 805.982168 199.810863
+L 806.709072 202.368889
+L 807.435977 206.291096
+L 808.162881 212.123751
+L 808.889785 221.139776
+L 809.616689 237.474405
+L 810.343594 345.818753
+L 811.070498 236.982036
+L 811.797402 220.935598
+L 812.524307 212.034543
+L 813.251211 206.273849
+L 813.978115 202.406773
+L 814.70502 199.895928
+L 815.431924 198.478688
+L 816.158828 198.030094
+L 816.885732 198.513233
+L 817.612637 199.966411
+L 818.339541 202.516478
+L 819.066445 206.429385
+L 819.79335 212.249896
+L 820.520254 221.24648
+L 821.247158 237.532074
+L 821.974062 355.80482
+L 822.700967 237.205237
+L 823.427871 221.110957
+L 824.154775 212.190702
+L 824.88168 206.417969
+L 825.608584 202.541668
+L 826.335488 200.02293
+L 827.062393 198.598461
+L 827.789297 198.142923
+L 828.516201 198.619123
+L 829.243105 200.065086
+L 829.97001 202.607282
+L 830.696914 206.510994
+L 831.423818 212.3195
+L 832.150723 221.296884
+L 832.877627 237.534174
+L 833.604531 372.605455
+L 834.331436 237.371175
+L 835.05834 221.229299
+L 835.785244 212.289985
+L 836.512148 206.50531
+L 837.239053 202.619857
+L 837.965957 200.093288
+L 838.692861 198.661645
+L 839.419766 198.199214
+L 840.14667 198.668522
+L 840.873574 200.107318
+L 841.600479 202.641694
+L 842.327383 206.536269
+L 843.054287 212.332849
+L 843.781191 221.291175
+L 844.508096 237.480641
+L 844.508096 237.480641
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
</g>
<g id="patch_8">
- <path d="M 474.23 387.16
-L 474.23 39.24
+ <path d="M 473.06 388.6
+L 473.06 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_9">
- <path d="M 845.28 387.16
-L 845.28 39.24
+ <path d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_10">
- <path d="M 474.23 387.16
-L 845.28 387.16
+ <path d="M 473.06 388.6
+L 845.235 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_11">
- <path d="M 474.23 39.24
-L 845.28 39.24
+ <path d="M 473.06 36.72
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
@@ -2165,11 +2166,11 @@ z
</g>
</g>
<defs>
- <clipPath id="p79177e7d8d">
- <rect height="347.92" width="371.05" x="47.72" y="39.24"/>
+ <clipPath id="p9df6d55b6c">
+ <rect height="351.88" width="372.175" x="47.855" y="36.72"/>
</clipPath>
- <clipPath id="p6edaed3a83">
- <rect height="347.92" width="371.05" x="474.23" y="39.24"/>
+ <clipPath id="pe1bc435c08">
+ <rect height="351.88" width="372.175" x="473.06" y="36.72"/>
</clipPath>
</defs>
</svg>
diff --git a/docs/docs/img/window_hann.svg b/docs/docs/img/window_hann.svg
@@ -19,28 +19,28 @@ z
</g>
<g id="axes_1">
<g id="patch_2">
- <path d="M 47.72 387.16
-L 415.62 387.16
-L 415.62 39.24
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 416.8575 388.6
+L 416.8575 36.72
+L 47.855 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
- <path clip-path="url(#pee27c16c99)" d="M 47.72 387.16
-L 47.72 39.24
+ <path clip-path="url(#pda623824ba)" d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
-" id="mb700b157a7" style="stroke:#000000;stroke-width:0.8;"/>
+" id="m617b920959" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mb700b157a7" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m617b920959" y="388.6"/>
</g>
</g>
<g id="text_1">
@@ -68,20 +68,20 @@ Q 19.53125 74.21875 31.78125 74.21875
z
" id="DejaVuSans-48"/>
</defs>
- <g transform="translate(44.53875 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(44.67375 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
- <path clip-path="url(#pee27c16c99)" d="M 106.116825 387.16
-L 106.116825 39.24
+ <path clip-path="url(#pda623824ba)" d="M 106.426825 388.6
+L 106.426825 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="106.116825" xlink:href="#mb700b157a7" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="106.426825" xlink:href="#m617b920959" y="388.6"/>
</g>
</g>
<g id="text_2">
@@ -101,7 +101,7 @@ L 12.40625 0
z
" id="DejaVuSans-49"/>
</defs>
- <g transform="translate(99.754325 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(100.064325 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -109,13 +109,13 @@ z
</g>
<g id="xtick_3">
<g id="line2d_5">
- <path clip-path="url(#pee27c16c99)" d="M 164.513651 387.16
-L 164.513651 39.24
+ <path clip-path="url(#pda623824ba)" d="M 164.998651 388.6
+L 164.998651 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="164.513651" xlink:href="#mb700b157a7" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="164.998651" xlink:href="#m617b920959" y="388.6"/>
</g>
</g>
<g id="text_3">
@@ -146,7 +146,7 @@ Q 31.109375 20.453125 19.1875 8.296875
z
" id="DejaVuSans-50"/>
</defs>
- <g transform="translate(158.151151 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(158.636151 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -154,13 +154,13 @@ z
</g>
<g id="xtick_4">
<g id="line2d_7">
- <path clip-path="url(#pee27c16c99)" d="M 222.910476 387.16
-L 222.910476 39.24
+ <path clip-path="url(#pda623824ba)" d="M 223.570476 388.6
+L 223.570476 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_8">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="222.910476" xlink:href="#mb700b157a7" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="223.570476" xlink:href="#m617b920959" y="388.6"/>
</g>
</g>
<g id="text_4">
@@ -199,7 +199,7 @@ Q 46.96875 40.921875 40.578125 39.3125
z
" id="DejaVuSans-51"/>
</defs>
- <g transform="translate(216.547976 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(217.207976 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-51"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -207,13 +207,13 @@ z
</g>
<g id="xtick_5">
<g id="line2d_9">
- <path clip-path="url(#pee27c16c99)" d="M 281.307302 387.16
-L 281.307302 39.24
+ <path clip-path="url(#pda623824ba)" d="M 282.142302 388.6
+L 282.142302 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_10">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="281.307302" xlink:href="#mb700b157a7" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="282.142302" xlink:href="#m617b920959" y="388.6"/>
</g>
</g>
<g id="text_5">
@@ -237,7 +237,7 @@ L 4.890625 26.703125
z
" id="DejaVuSans-52"/>
</defs>
- <g transform="translate(274.944802 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(275.779802 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-52"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -245,13 +245,13 @@ z
</g>
<g id="xtick_6">
<g id="line2d_11">
- <path clip-path="url(#pee27c16c99)" d="M 339.704127 387.16
-L 339.704127 39.24
+ <path clip-path="url(#pda623824ba)" d="M 340.714127 388.6
+L 340.714127 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_12">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="339.704127" xlink:href="#mb700b157a7" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="340.714127" xlink:href="#m617b920959" y="388.6"/>
</g>
</g>
<g id="text_6">
@@ -282,7 +282,7 @@ Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-53"/>
</defs>
- <g transform="translate(333.341627 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(334.351627 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-53"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -290,13 +290,13 @@ z
</g>
<g id="xtick_7">
<g id="line2d_13">
- <path clip-path="url(#pee27c16c99)" d="M 398.100952 387.16
-L 398.100952 39.24
+ <path clip-path="url(#pda623824ba)" d="M 399.285952 388.6
+L 399.285952 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_14">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="398.100952" xlink:href="#mb700b157a7" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="399.285952" xlink:href="#m617b920959" y="388.6"/>
</g>
</g>
<g id="text_7">
@@ -333,7 +333,7 @@ Q 48.484375 72.75 52.59375 71.296875
z
" id="DejaVuSans-54"/>
</defs>
- <g transform="translate(391.738452 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(392.923452 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-54"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -523,7 +523,7 @@ Q 40.578125 54.546875 44.28125 53.078125
z
" id="DejaVuSans-115"/>
</defs>
- <g transform="translate(210.316875 415.436563)scale(0.1 -0.1)">
+ <g transform="translate(211.003125 416.876562)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-83"/>
<use x="63.476562" xlink:href="#DejaVuSans-97"/>
<use x="124.755859" xlink:href="#DejaVuSans-109"/>
@@ -537,18 +537,18 @@ z
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_15">
- <path clip-path="url(#pee27c16c99)" d="M 47.72 387.16
-L 415.62 387.16
+ <path clip-path="url(#pda623824ba)" d="M 47.855 388.6
+L 416.8575 388.6
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_16">
<defs>
<path d="M 0 0
L -3.5 0
-" id="m65df5f0b96" style="stroke:#000000;stroke-width:0.8;"/>
+" id="m3206e4d0a9" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m65df5f0b96" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m3206e4d0a9" y="388.6"/>
</g>
</g>
<g id="text_9">
@@ -561,7 +561,7 @@ L 10.6875 0
z
" id="DejaVuSans-46"/>
</defs>
- <g transform="translate(24.816875 390.959219)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 392.399219)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -570,18 +570,18 @@ z
</g>
<g id="ytick_2">
<g id="line2d_17">
- <path clip-path="url(#pee27c16c99)" d="M 47.72 320.848308
-L 415.62 320.848308
+ <path clip-path="url(#pda623824ba)" d="M 47.855 321.533554
+L 416.8575 321.533554
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_18">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m65df5f0b96" y="320.848308"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m3206e4d0a9" y="321.533554"/>
</g>
</g>
<g id="text_10">
<!-- 0.2 -->
- <g transform="translate(24.816875 324.647527)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 325.332772)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -590,18 +590,18 @@ L 415.62 320.848308
</g>
<g id="ytick_3">
<g id="line2d_19">
- <path clip-path="url(#pee27c16c99)" d="M 47.72 254.536617
-L 415.62 254.536617
+ <path clip-path="url(#pda623824ba)" d="M 47.855 254.467107
+L 416.8575 254.467107
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_20">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m65df5f0b96" y="254.536617"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m3206e4d0a9" y="254.467107"/>
</g>
</g>
<g id="text_11">
<!-- 0.4 -->
- <g transform="translate(24.816875 258.335836)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 258.266326)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -610,18 +610,18 @@ L 415.62 254.536617
</g>
<g id="ytick_4">
<g id="line2d_21">
- <path clip-path="url(#pee27c16c99)" d="M 47.72 188.224925
-L 415.62 188.224925
+ <path clip-path="url(#pda623824ba)" d="M 47.855 187.400661
+L 416.8575 187.400661
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_22">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m65df5f0b96" y="188.224925"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m3206e4d0a9" y="187.400661"/>
</g>
</g>
<g id="text_12">
<!-- 0.6 -->
- <g transform="translate(24.816875 192.024144)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 191.19988)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -630,13 +630,13 @@ L 415.62 188.224925
</g>
<g id="ytick_5">
<g id="line2d_23">
- <path clip-path="url(#pee27c16c99)" d="M 47.72 121.913234
-L 415.62 121.913234
+ <path clip-path="url(#pda623824ba)" d="M 47.855 120.334215
+L 416.8575 120.334215
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_24">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m65df5f0b96" y="121.913234"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m3206e4d0a9" y="120.334215"/>
</g>
</g>
<g id="text_13">
@@ -682,7 +682,7 @@ Q 18.3125 60.0625 18.3125 54.390625
z
" id="DejaVuSans-56"/>
</defs>
- <g transform="translate(24.816875 125.712453)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 124.133433)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -691,18 +691,18 @@ z
</g>
<g id="ytick_6">
<g id="line2d_25">
- <path clip-path="url(#pee27c16c99)" d="M 47.72 55.601542
-L 415.62 55.601542
+ <path clip-path="url(#pda623824ba)" d="M 47.855 53.267768
+L 416.8575 53.267768
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_26">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m65df5f0b96" y="55.601542"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m3206e4d0a9" y="53.267768"/>
</g>
</g>
<g id="text_14">
<!-- 1.0 -->
- <g transform="translate(24.816875 59.400761)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 57.066987)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -805,7 +805,7 @@ Q 14.796875 37.203125 14.796875 27.296875
z
" id="DejaVuSans-100"/>
</defs>
- <g transform="translate(18.737188 238.822656)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(18.872187 238.282656)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-65"/>
<use x="68.408203" xlink:href="#DejaVuSans-109"/>
<use x="165.820312" xlink:href="#DejaVuSans-112"/>
@@ -819,70 +819,70 @@ z
</g>
</g>
<g id="line2d_27">
- <path clip-path="url(#pee27c16c99)" d="M 47.72 387.16
-L 53.559683 386.336206
-L 59.399365 383.87301
-L 65.239048 379.794894
-L 71.07873 374.142387
-L 76.918413 366.971666
-L 82.758095 358.353998
-L 88.597778 348.375028
-L 94.43746 337.133932
-L 100.277143 324.74243
-L 106.116825 311.323672
-L 111.956508 297.011022
-L 117.79619 281.946724
-L 123.635873 266.280495
-L 129.475556 250.168032
-L 135.315238 233.769468
-L 141.154921 217.24778
-L 146.994603 200.767168
-L 152.834286 184.491422
-L 158.673968 168.5823
-L 164.513651 153.197912
-L 170.353333 138.491157
-L 176.193016 124.608195
-L 182.032698 111.687003
-L 187.872381 99.855997
-L 193.712063 89.232759
-L 199.551746 79.922867
-L 205.391429 72.018847
-L 211.231111 65.599253
-L 217.070794 60.727886
-L 222.910476 57.453159
-L 228.750159 55.807619
-L 234.589841 55.807619
-L 240.429524 57.453159
-L 246.269206 60.727886
-L 252.108889 65.599253
-L 257.948571 72.018847
-L 263.788254 79.922867
-L 269.627937 89.232759
-L 275.467619 99.855997
-L 281.307302 111.687003
-L 287.146984 124.608195
-L 292.986667 138.491157
-L 298.826349 153.197912
-L 304.666032 168.5823
-L 310.505714 184.491422
-L 316.345397 200.767168
-L 322.185079 217.24778
-L 328.024762 233.769468
-L 333.864444 250.168032
-L 339.704127 266.280495
-L 345.54381 281.946724
-L 351.383492 297.011022
-L 357.223175 311.323672
-L 363.062857 324.74243
-L 368.90254 337.133932
-L 374.742222 348.375028
-L 380.581905 358.353998
-L 386.421587 366.971666
-L 392.26127 374.142387
-L 398.100952 379.794894
-L 403.940635 383.87301
-L 409.780317 386.336206
-L 415.62 387.16
+ <path clip-path="url(#pda623824ba)" d="M 47.855 388.6
+L 53.712183 387.766829
+L 59.569365 385.275598
+L 65.426548 381.151065
+L 71.28373 375.434221
+L 77.140913 368.181884
+L 82.998095 359.46613
+L 88.855278 349.37358
+L 94.71246 338.004539
+L 100.569643 325.471997
+L 106.426825 311.900509
+L 112.284008 297.424953
+L 118.14119 282.189195
+L 123.998373 266.344653
+L 129.855556 250.0488
+L 135.712738 233.463589
+L 141.569921 216.753852
+L 147.427103 200.085658
+L 153.284286 183.624663
+L 159.141468 167.534465
+L 164.998651 151.974973
+L 170.855833 137.100826
+L 176.713016 123.05985
+L 182.570198 109.99159
+L 188.427381 98.025924
+L 194.284563 87.281773
+L 200.141746 77.865916
+L 205.998929 69.871934
+L 211.856111 63.379272
+L 217.713294 58.45246
+L 223.570476 55.14046
+L 229.427659 53.47619
+L 235.284841 53.47619
+L 241.142024 55.14046
+L 246.999206 58.45246
+L 252.856389 63.379272
+L 258.713571 69.871934
+L 264.570754 77.865916
+L 270.427937 87.281773
+L 276.285119 98.025924
+L 282.142302 109.99159
+L 287.999484 123.05985
+L 293.856667 137.100826
+L 299.713849 151.974973
+L 305.571032 167.534465
+L 311.428214 183.624663
+L 317.285397 200.085658
+L 323.142579 216.753852
+L 328.999762 233.463589
+L 334.856944 250.0488
+L 340.714127 266.344653
+L 346.57131 282.189195
+L 352.428492 297.424953
+L 358.285675 311.900509
+L 364.142857 325.471997
+L 370.00004 338.004539
+L 375.857222 349.37358
+L 381.714405 359.46613
+L 387.571587 368.181884
+L 393.42877 375.434221
+L 399.285952 381.151065
+L 405.143135 385.275598
+L 411.000317 387.766829
+L 416.8575 388.6
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
<defs>
<path d="M 0 1.5
@@ -895,120 +895,120 @@ C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0
C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066
C -0.77937 1.341951 -0.397805 1.5 0 1.5
z
-" id="m775322028f" style="stroke:#0072bd;"/>
+" id="m2560a89e0b" style="stroke:#0072bd;"/>
</defs>
- <g clip-path="url(#pee27c16c99)">
- <use style="fill:#0072bd;stroke:#0072bd;" x="47.72" xlink:href="#m775322028f" y="387.16"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="53.559683" xlink:href="#m775322028f" y="386.336206"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="59.399365" xlink:href="#m775322028f" y="383.87301"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="65.239048" xlink:href="#m775322028f" y="379.794894"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="71.07873" xlink:href="#m775322028f" y="374.142387"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="76.918413" xlink:href="#m775322028f" y="366.971666"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="82.758095" xlink:href="#m775322028f" y="358.353998"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="88.597778" xlink:href="#m775322028f" y="348.375028"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="94.43746" xlink:href="#m775322028f" y="337.133932"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="100.277143" xlink:href="#m775322028f" y="324.74243"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="106.116825" xlink:href="#m775322028f" y="311.323672"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="111.956508" xlink:href="#m775322028f" y="297.011022"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="117.79619" xlink:href="#m775322028f" y="281.946724"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="123.635873" xlink:href="#m775322028f" y="266.280495"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="129.475556" xlink:href="#m775322028f" y="250.168032"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="135.315238" xlink:href="#m775322028f" y="233.769468"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="141.154921" xlink:href="#m775322028f" y="217.24778"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="146.994603" xlink:href="#m775322028f" y="200.767168"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="152.834286" xlink:href="#m775322028f" y="184.491422"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="158.673968" xlink:href="#m775322028f" y="168.5823"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="164.513651" xlink:href="#m775322028f" y="153.197912"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="170.353333" xlink:href="#m775322028f" y="138.491157"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="176.193016" xlink:href="#m775322028f" y="124.608195"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="182.032698" xlink:href="#m775322028f" y="111.687003"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="187.872381" xlink:href="#m775322028f" y="99.855997"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="193.712063" xlink:href="#m775322028f" y="89.232759"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="199.551746" xlink:href="#m775322028f" y="79.922867"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="205.391429" xlink:href="#m775322028f" y="72.018847"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="211.231111" xlink:href="#m775322028f" y="65.599253"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="217.070794" xlink:href="#m775322028f" y="60.727886"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="222.910476" xlink:href="#m775322028f" y="57.453159"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="228.750159" xlink:href="#m775322028f" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="234.589841" xlink:href="#m775322028f" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="240.429524" xlink:href="#m775322028f" y="57.453159"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="246.269206" xlink:href="#m775322028f" y="60.727886"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="252.108889" xlink:href="#m775322028f" y="65.599253"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="257.948571" xlink:href="#m775322028f" y="72.018847"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="263.788254" xlink:href="#m775322028f" y="79.922867"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="269.627937" xlink:href="#m775322028f" y="89.232759"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="275.467619" xlink:href="#m775322028f" y="99.855997"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="281.307302" xlink:href="#m775322028f" y="111.687003"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="287.146984" xlink:href="#m775322028f" y="124.608195"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="292.986667" xlink:href="#m775322028f" y="138.491157"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="298.826349" xlink:href="#m775322028f" y="153.197912"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="304.666032" xlink:href="#m775322028f" y="168.5823"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="310.505714" xlink:href="#m775322028f" y="184.491422"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="316.345397" xlink:href="#m775322028f" y="200.767168"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="322.185079" xlink:href="#m775322028f" y="217.24778"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="328.024762" xlink:href="#m775322028f" y="233.769468"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="333.864444" xlink:href="#m775322028f" y="250.168032"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="339.704127" xlink:href="#m775322028f" y="266.280495"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="345.54381" xlink:href="#m775322028f" y="281.946724"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="351.383492" xlink:href="#m775322028f" y="297.011022"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="357.223175" xlink:href="#m775322028f" y="311.323672"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="363.062857" xlink:href="#m775322028f" y="324.74243"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="368.90254" xlink:href="#m775322028f" y="337.133932"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="374.742222" xlink:href="#m775322028f" y="348.375028"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="380.581905" xlink:href="#m775322028f" y="358.353998"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="386.421587" xlink:href="#m775322028f" y="366.971666"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="392.26127" xlink:href="#m775322028f" y="374.142387"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="398.100952" xlink:href="#m775322028f" y="379.794894"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="403.940635" xlink:href="#m775322028f" y="383.87301"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="409.780317" xlink:href="#m775322028f" y="386.336206"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="415.62" xlink:href="#m775322028f" y="387.16"/>
+ <g clip-path="url(#pda623824ba)">
+ <use style="fill:#0072bd;stroke:#0072bd;" x="47.855" xlink:href="#m2560a89e0b" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="53.712183" xlink:href="#m2560a89e0b" y="387.766829"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="59.569365" xlink:href="#m2560a89e0b" y="385.275598"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="65.426548" xlink:href="#m2560a89e0b" y="381.151065"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="71.28373" xlink:href="#m2560a89e0b" y="375.434221"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="77.140913" xlink:href="#m2560a89e0b" y="368.181884"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="82.998095" xlink:href="#m2560a89e0b" y="359.46613"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="88.855278" xlink:href="#m2560a89e0b" y="349.37358"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="94.71246" xlink:href="#m2560a89e0b" y="338.004539"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="100.569643" xlink:href="#m2560a89e0b" y="325.471997"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="106.426825" xlink:href="#m2560a89e0b" y="311.900509"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="112.284008" xlink:href="#m2560a89e0b" y="297.424953"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="118.14119" xlink:href="#m2560a89e0b" y="282.189195"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="123.998373" xlink:href="#m2560a89e0b" y="266.344653"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="129.855556" xlink:href="#m2560a89e0b" y="250.0488"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="135.712738" xlink:href="#m2560a89e0b" y="233.463589"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="141.569921" xlink:href="#m2560a89e0b" y="216.753852"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="147.427103" xlink:href="#m2560a89e0b" y="200.085658"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="153.284286" xlink:href="#m2560a89e0b" y="183.624663"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="159.141468" xlink:href="#m2560a89e0b" y="167.534465"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="164.998651" xlink:href="#m2560a89e0b" y="151.974973"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="170.855833" xlink:href="#m2560a89e0b" y="137.100826"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="176.713016" xlink:href="#m2560a89e0b" y="123.05985"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="182.570198" xlink:href="#m2560a89e0b" y="109.99159"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="188.427381" xlink:href="#m2560a89e0b" y="98.025924"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="194.284563" xlink:href="#m2560a89e0b" y="87.281773"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="200.141746" xlink:href="#m2560a89e0b" y="77.865916"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="205.998929" xlink:href="#m2560a89e0b" y="69.871934"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="211.856111" xlink:href="#m2560a89e0b" y="63.379272"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="217.713294" xlink:href="#m2560a89e0b" y="58.45246"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="223.570476" xlink:href="#m2560a89e0b" y="55.14046"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="229.427659" xlink:href="#m2560a89e0b" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="235.284841" xlink:href="#m2560a89e0b" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="241.142024" xlink:href="#m2560a89e0b" y="55.14046"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="246.999206" xlink:href="#m2560a89e0b" y="58.45246"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="252.856389" xlink:href="#m2560a89e0b" y="63.379272"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="258.713571" xlink:href="#m2560a89e0b" y="69.871934"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="264.570754" xlink:href="#m2560a89e0b" y="77.865916"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="270.427937" xlink:href="#m2560a89e0b" y="87.281773"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="276.285119" xlink:href="#m2560a89e0b" y="98.025924"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="282.142302" xlink:href="#m2560a89e0b" y="109.99159"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="287.999484" xlink:href="#m2560a89e0b" y="123.05985"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="293.856667" xlink:href="#m2560a89e0b" y="137.100826"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="299.713849" xlink:href="#m2560a89e0b" y="151.974973"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="305.571032" xlink:href="#m2560a89e0b" y="167.534465"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="311.428214" xlink:href="#m2560a89e0b" y="183.624663"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="317.285397" xlink:href="#m2560a89e0b" y="200.085658"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="323.142579" xlink:href="#m2560a89e0b" y="216.753852"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="328.999762" xlink:href="#m2560a89e0b" y="233.463589"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="334.856944" xlink:href="#m2560a89e0b" y="250.0488"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="340.714127" xlink:href="#m2560a89e0b" y="266.344653"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="346.57131" xlink:href="#m2560a89e0b" y="282.189195"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="352.428492" xlink:href="#m2560a89e0b" y="297.424953"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="358.285675" xlink:href="#m2560a89e0b" y="311.900509"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="364.142857" xlink:href="#m2560a89e0b" y="325.471997"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="370.00004" xlink:href="#m2560a89e0b" y="338.004539"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="375.857222" xlink:href="#m2560a89e0b" y="349.37358"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="381.714405" xlink:href="#m2560a89e0b" y="359.46613"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="387.571587" xlink:href="#m2560a89e0b" y="368.181884"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="393.42877" xlink:href="#m2560a89e0b" y="375.434221"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="399.285952" xlink:href="#m2560a89e0b" y="381.151065"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="405.143135" xlink:href="#m2560a89e0b" y="385.275598"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="411.000317" xlink:href="#m2560a89e0b" y="387.766829"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="416.8575" xlink:href="#m2560a89e0b" y="388.6"/>
</g>
</g>
<g id="patch_3">
- <path d="M 47.72 387.16
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
- <path d="M 415.62 387.16
-L 415.62 39.24
+ <path d="M 416.8575 388.6
+L 416.8575 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
- <path d="M 47.72 387.16
-L 415.62 387.16
+ <path d="M 47.855 388.6
+L 416.8575 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
- <path d="M 47.72 39.24
-L 415.62 39.24
+ <path d="M 47.855 36.72
+L 416.8575 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
<g id="axes_2">
<g id="patch_7">
- <path d="M 477.38 387.16
-L 845.28 387.16
-L 845.28 39.24
-L 477.38 39.24
+ <path d="M 476.2325 388.6
+L 845.235 388.6
+L 845.235 36.72
+L 476.2325 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_3">
<g id="xtick_8">
<g id="line2d_28">
- <path clip-path="url(#p6d916e55c9)" d="M 477.38 387.16
-L 477.38 39.24
+ <path clip-path="url(#p2e76f6499c)" d="M 476.2325 388.6
+L 476.2325 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_29">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#mb700b157a7" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m617b920959" y="388.6"/>
</g>
</g>
<g id="text_16">
<!-- 0.0 -->
- <g transform="translate(469.428437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(468.280937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1017,18 +1017,18 @@ L 477.38 39.24
</g>
<g id="xtick_9">
<g id="line2d_30">
- <path clip-path="url(#p6d916e55c9)" d="M 550.96 387.16
-L 550.96 39.24
+ <path clip-path="url(#p2e76f6499c)" d="M 550.033 388.6
+L 550.033 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_31">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="550.96" xlink:href="#mb700b157a7" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="550.033" xlink:href="#m617b920959" y="388.6"/>
</g>
</g>
<g id="text_17">
<!-- 0.2 -->
- <g transform="translate(543.008437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(542.081437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -1037,18 +1037,18 @@ L 550.96 39.24
</g>
<g id="xtick_10">
<g id="line2d_32">
- <path clip-path="url(#p6d916e55c9)" d="M 624.54 387.16
-L 624.54 39.24
+ <path clip-path="url(#p2e76f6499c)" d="M 623.8335 388.6
+L 623.8335 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_33">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="624.54" xlink:href="#mb700b157a7" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.8335" xlink:href="#m617b920959" y="388.6"/>
</g>
</g>
<g id="text_18">
<!-- 0.4 -->
- <g transform="translate(616.588437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(615.881937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -1057,18 +1057,18 @@ L 624.54 39.24
</g>
<g id="xtick_11">
<g id="line2d_34">
- <path clip-path="url(#p6d916e55c9)" d="M 698.12 387.16
-L 698.12 39.24
+ <path clip-path="url(#p2e76f6499c)" d="M 697.634 388.6
+L 697.634 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_35">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="698.12" xlink:href="#mb700b157a7" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="697.634" xlink:href="#m617b920959" y="388.6"/>
</g>
</g>
<g id="text_19">
<!-- 0.6 -->
- <g transform="translate(690.168438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(689.682437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -1077,18 +1077,18 @@ L 698.12 39.24
</g>
<g id="xtick_12">
<g id="line2d_36">
- <path clip-path="url(#p6d916e55c9)" d="M 771.7 387.16
-L 771.7 39.24
+ <path clip-path="url(#p2e76f6499c)" d="M 771.4345 388.6
+L 771.4345 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_37">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="771.7" xlink:href="#mb700b157a7" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="771.4345" xlink:href="#m617b920959" y="388.6"/>
</g>
</g>
<g id="text_20">
<!-- 0.8 -->
- <g transform="translate(763.748438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(763.482937 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -1097,18 +1097,18 @@ L 771.7 39.24
</g>
<g id="xtick_13">
<g id="line2d_38">
- <path clip-path="url(#p6d916e55c9)" d="M 845.28 387.16
-L 845.28 39.24
+ <path clip-path="url(#p2e76f6499c)" d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_39">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="845.28" xlink:href="#mb700b157a7" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="845.235" xlink:href="#m617b920959" y="388.6"/>
</g>
</g>
<g id="text_21">
<!-- 1.0 -->
- <g transform="translate(837.328438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(837.283437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1341,7 +1341,7 @@ Q 14.5 64.65625 8.015625 75.875
z
" id="DejaVuSans-41"/>
</defs>
- <g transform="translate(562.53 415.438125)scale(0.1 -0.1)">
+ <g transform="translate(561.93375 416.878125)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-78"/>
<use transform="translate(74.804688 0.015625)" xlink:href="#DejaVuSans-111"/>
<use transform="translate(135.986328 0.015625)" xlink:href="#DejaVuSans-114"/>
@@ -1384,13 +1384,13 @@ z
<g id="matplotlib.axis_4">
<g id="ytick_7">
<g id="line2d_40">
- <path clip-path="url(#p6d916e55c9)" d="M 477.38 366.1794
-L 845.28 366.1794
+ <path clip-path="url(#p2e76f6499c)" d="M 476.2325 367.380601
+L 845.235 367.380601
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_41">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m65df5f0b96" y="366.1794"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m3206e4d0a9" y="367.380601"/>
</g>
</g>
<g id="text_23">
@@ -1403,7 +1403,7 @@ L 10.59375 27.203125
z
" id="DejaVuSans-8722"/>
</defs>
- <g transform="translate(442.912812 369.978619)scale(0.1 -0.1)">
+ <g transform="translate(441.765312 371.179819)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-49"/>
<use x="147.412109" xlink:href="#DejaVuSans-50"/>
@@ -1413,18 +1413,18 @@ z
</g>
<g id="ytick_8">
<g id="line2d_42">
- <path clip-path="url(#p6d916e55c9)" d="M 477.38 324.68674
-L 845.28 324.68674
+ <path clip-path="url(#p2e76f6499c)" d="M 476.2325 325.415674
+L 845.235 325.415674
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_43">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m65df5f0b96" y="324.68674"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m3206e4d0a9" y="325.415674"/>
</g>
</g>
<g id="text_24">
<!-- −100 -->
- <g transform="translate(442.912812 328.485959)scale(0.1 -0.1)">
+ <g transform="translate(441.765312 329.214892)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-49"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1434,18 +1434,18 @@ L 845.28 324.68674
</g>
<g id="ytick_9">
<g id="line2d_44">
- <path clip-path="url(#p6d916e55c9)" d="M 477.38 283.194079
-L 845.28 283.194079
+ <path clip-path="url(#p2e76f6499c)" d="M 476.2325 283.450747
+L 845.235 283.450747
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_45">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m65df5f0b96" y="283.194079"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m3206e4d0a9" y="283.450747"/>
</g>
</g>
<g id="text_25">
<!-- −80 -->
- <g transform="translate(449.275312 286.993298)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 287.249965)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-56"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1454,18 +1454,18 @@ L 845.28 283.194079
</g>
<g id="ytick_10">
<g id="line2d_46">
- <path clip-path="url(#p6d916e55c9)" d="M 477.38 241.701419
-L 845.28 241.701419
+ <path clip-path="url(#p2e76f6499c)" d="M 476.2325 241.48582
+L 845.235 241.48582
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_47">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m65df5f0b96" y="241.701419"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m3206e4d0a9" y="241.48582"/>
</g>
</g>
<g id="text_26">
<!-- −60 -->
- <g transform="translate(449.275312 245.500637)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 245.285038)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-54"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1474,18 +1474,18 @@ L 845.28 241.701419
</g>
<g id="ytick_11">
<g id="line2d_48">
- <path clip-path="url(#p6d916e55c9)" d="M 477.38 200.208758
-L 845.28 200.208758
+ <path clip-path="url(#p2e76f6499c)" d="M 476.2325 199.520893
+L 845.235 199.520893
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_49">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m65df5f0b96" y="200.208758"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m3206e4d0a9" y="199.520893"/>
</g>
</g>
<g id="text_27">
<!-- −40 -->
- <g transform="translate(449.275312 204.007977)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 203.320111)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-52"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1494,18 +1494,18 @@ L 845.28 200.208758
</g>
<g id="ytick_12">
<g id="line2d_50">
- <path clip-path="url(#p6d916e55c9)" d="M 477.38 158.716097
-L 845.28 158.716097
+ <path clip-path="url(#p2e76f6499c)" d="M 476.2325 157.555966
+L 845.235 157.555966
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_51">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m65df5f0b96" y="158.716097"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m3206e4d0a9" y="157.555966"/>
</g>
</g>
<g id="text_28">
<!-- −20 -->
- <g transform="translate(449.275312 162.515316)scale(0.1 -0.1)">
+ <g transform="translate(448.127812 161.355184)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-50"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1514,36 +1514,36 @@ L 845.28 158.716097
</g>
<g id="ytick_13">
<g id="line2d_52">
- <path clip-path="url(#p6d916e55c9)" d="M 477.38 117.223437
-L 845.28 117.223437
+ <path clip-path="url(#p2e76f6499c)" d="M 476.2325 115.591039
+L 845.235 115.591039
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_53">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m65df5f0b96" y="117.223437"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m3206e4d0a9" y="115.591039"/>
</g>
</g>
<g id="text_29">
<!-- 0 -->
- <g transform="translate(464.0175 121.022656)scale(0.1 -0.1)">
+ <g transform="translate(462.87 119.390257)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_14">
<g id="line2d_54">
- <path clip-path="url(#p6d916e55c9)" d="M 477.38 75.730776
-L 845.28 75.730776
+ <path clip-path="url(#p2e76f6499c)" d="M 476.2325 73.626111
+L 845.235 73.626111
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_55">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.38" xlink:href="#m65df5f0b96" y="75.730776"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.2325" xlink:href="#m3206e4d0a9" y="73.626111"/>
</g>
</g>
<g id="text_30">
<!-- 20 -->
- <g transform="translate(457.655 79.529995)scale(0.1 -0.1)">
+ <g transform="translate(456.5075 77.42533)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -1607,7 +1607,7 @@ L 9.8125 0
z
" id="DejaVuSans-66"/>
</defs>
- <g transform="translate(436.833125 236.791406)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(435.685625 236.251406)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-71"/>
<use x="77.490234" xlink:href="#DejaVuSans-97"/>
<use x="138.769531" xlink:href="#DejaVuSans-105"/>
@@ -1621,523 +1621,523 @@ z
</g>
</g>
<g id="line2d_56">
- <path clip-path="url(#p6d916e55c9)" d="M 477.38 55.054545
-L 478.817109 55.230675
-L 480.254219 55.761126
-L 481.691328 56.65222
-L 483.128437 57.914968
-L 484.565547 59.565851
-L 486.002656 61.628122
-L 487.439766 64.133848
-L 488.876875 67.127198
-L 490.313984 70.669884
-L 491.751094 74.850616
-L 493.188203 79.802738
-L 494.625312 85.740429
-L 496.062422 93.043645
-L 496.780977 97.423013
-L 497.499531 102.502139
-L 498.218086 108.590892
-L 498.936641 116.312513
-L 499.655195 127.26593
-L 500.37375 148.779236
-L 501.092305 151.383257
-L 501.810859 133.562134
-L 502.529414 126.635815
-L 503.247969 123.035886
-L 503.966523 121.157852
-L 504.685078 120.397589
-L 505.403633 120.474552
-L 506.122187 121.250268
-L 506.840742 122.664965
-L 507.559297 124.714863
-L 508.277852 127.449898
-L 508.996406 130.990062
-L 509.714961 135.574068
-L 510.433516 141.693829
-L 511.15207 150.550379
-L 511.870625 166.611468
-L 512.58918 188.721439
-L 513.307734 160.358732
-L 514.026289 151.236271
-L 514.744844 146.334251
-L 515.463398 143.457298
-L 516.181953 141.847653
-L 516.900508 141.164361
-L 517.619062 141.238115
-L 518.337617 141.989481
-L 519.056172 143.398829
-L 519.774727 145.499507
-L 520.493281 148.388861
-L 521.211836 152.266015
-L 521.930391 157.534558
-L 522.648945 165.126575
-L 523.3675 178.024704
-L 524.086055 253.728172
-L 524.804609 180.32743
-L 525.523164 168.874753
-L 526.241719 162.920735
-L 526.960273 159.340585
-L 527.678828 157.174496
-L 528.397383 156.010195
-L 529.115937 155.645268
-L 529.834492 155.981023
-L 530.553047 156.983493
-L 531.271602 158.671794
-L 531.990156 161.124379
-L 532.708711 164.508132
-L 533.427266 169.157562
-L 534.14582 175.810714
-L 534.864375 186.576542
-L 535.58293 215.003913
-L 537.020039 183.204256
-L 537.738594 176.156245
-L 538.457148 171.933686
-L 539.175703 169.297307
-L 539.894258 167.745137
-L 540.612813 167.035802
-L 541.331367 167.049358
-L 542.049922 167.737116
-L 542.768477 169.104643
-L 543.487031 171.213541
-L 544.205586 174.203408
-L 544.924141 178.353326
-L 545.642695 184.257021
-L 546.36125 193.467723
-L 547.079805 213.051274
-L 547.798359 215.328861
-L 548.516914 195.720171
-L 549.235469 187.40099
-L 549.954023 182.519828
-L 550.672578 179.436299
-L 551.391133 177.532888
-L 552.109687 176.521267
-L 552.828242 176.257325
-L 553.546797 176.676714
-L 554.265352 177.771648
-L 554.983906 179.588297
-L 555.702461 182.242727
-L 556.421016 185.968776
-L 557.13957 191.250203
-L 557.858125 199.266603
-L 558.57668 214.363298
-L 559.295234 237.359352
-L 560.013789 207.281399
-L 560.732344 197.373002
-L 561.450898 191.771156
-L 562.169453 188.233505
-L 562.888008 185.990389
-L 563.606562 184.695919
-L 564.325117 184.178005
-L 565.043672 184.355265
-L 565.762227 185.206438
-L 566.480781 186.763263
-L 567.199336 189.121189
-L 567.917891 192.476549
-L 568.636445 197.227562
-L 569.355 204.291797
-L 570.073555 216.583214
-L 570.792109 279.618697
-L 571.510664 218.555968
-L 572.229219 206.52028
-L 572.947773 200.093216
-L 573.666328 196.074342
-L 574.384883 193.488645
-L 575.103437 191.918517
-L 575.821992 191.158982
-L 576.540547 191.109785
-L 577.259102 191.735769
-L 577.977656 193.054915
-L 578.696211 195.144311
-L 579.414766 198.168755
-L 580.13332 202.4587
-L 580.851875 208.74168
-L 581.57043 219.084299
-L 582.288984 246.387248
-L 583.726094 215.166028
-L 584.444648 207.757142
-L 585.163203 203.212135
-L 585.881758 200.270657
-L 586.600312 198.424204
-L 587.318867 197.428572
-L 588.037422 197.162255
-L 588.755977 197.575477
-L 589.474531 198.672831
-L 590.193086 200.514788
-L 590.911641 203.23925
-L 591.630195 207.122085
-L 592.34875 212.749145
-L 593.067305 221.645819
-L 593.785859 240.64209
-L 594.504414 243.836509
-L 595.222969 223.583579
-L 595.941523 214.96105
-L 596.660078 209.825623
-L 597.378633 206.506184
-L 598.097188 204.376834
-L 598.815742 203.145905
-L 599.534297 202.667578
-L 600.252852 202.876408
-L 600.971406 203.763698
-L 601.689961 205.374616
-L 602.408516 207.823793
-L 603.12707 211.342448
-L 603.845625 216.408295
-L 604.56418 224.181742
-L 605.282734 238.891987
-L 606.001289 263.407702
-L 606.719844 232.052704
-L 607.438398 221.863276
-L 608.156953 216.049006
-L 608.875508 212.320293
-L 609.594062 209.896364
-L 610.312617 208.427255
-L 611.031172 207.738931
-L 611.749727 207.748841
-L 612.468281 208.434825
-L 613.186836 209.827703
-L 613.905391 212.021672
-L 614.623945 215.210893
-L 615.3425 219.788847
-L 616.061055 226.659379
-L 616.779609 238.670434
-L 617.498164 294.531063
-L 618.216719 240.931111
-L 618.935273 228.603712
-L 619.653828 221.989313
-L 620.372383 217.809615
-L 621.090937 215.074436
-L 621.809492 213.361078
-L 622.528047 212.462285
-L 623.246602 212.276522
-L 623.965156 212.767713
-L 624.683711 213.952964
-L 625.402266 215.908253
-L 626.12082 218.796544
-L 626.839375 222.944507
-L 627.55793 229.069565
-L 628.276484 239.197326
-L 628.995039 265.630149
-L 630.432148 235.321203
-L 631.150703 227.737512
-L 631.869258 223.052316
-L 632.587813 219.983863
-L 633.306367 218.017157
-L 634.024922 216.905272
-L 634.743477 216.525258
-L 635.462031 216.826377
-L 636.180586 217.812373
-L 636.899141 219.542706
-L 637.617695 222.153709
-L 638.33625 225.918177
-L 639.054805 231.414326
-L 639.773359 240.140474
-L 640.491914 258.702435
-L 641.210469 262.955912
-L 641.929023 242.172994
-L 642.647578 233.376565
-L 643.366133 228.114672
-L 644.084687 224.68477
-L 644.803242 222.452503
-L 645.521797 221.122892
-L 646.240352 220.548468
-L 646.958906 220.662748
-L 647.677461 221.456189
-L 648.396016 222.973026
-L 649.11457 225.326524
-L 649.833125 228.745371
-L 650.55168 233.701384
-L 651.270234 241.336255
-L 651.988789 255.767513
-L 652.707344 282.002461
-L 653.425898 249.364647
-L 654.144453 238.988322
-L 654.863008 233.055771
-L 655.581563 229.228802
-L 656.300117 226.715363
-L 657.018672 225.161401
-L 657.737227 224.390954
-L 658.455781 224.320337
-L 659.174336 224.926526
-L 659.892891 226.239461
-L 660.611445 228.352132
-L 661.33 231.456585
-L 662.048555 235.941661
-L 662.767109 242.697788
-L 663.485664 254.509004
-L 664.204219 305.389355
-L 664.922773 257.209815
-L 665.641328 244.660827
-L 666.359883 237.93124
-L 667.078438 233.662214
-L 667.796992 230.848106
-L 668.515547 229.061082
-L 669.234102 228.091607
-L 669.952656 227.836876
-L 670.671211 228.259916
-L 671.389766 229.376986
-L 672.10832 231.262979
-L 672.826875 234.079068
-L 673.54543 238.148209
-L 674.263984 244.177918
-L 674.982539 254.153939
-L 675.701094 279.824419
-L 676.419648 266.281004
-L 677.138203 250.497915
-L 677.856758 242.796607
-L 678.575312 238.028327
-L 679.293867 234.889441
-L 680.012422 232.858377
-L 680.730977 231.68547
-L 681.449531 231.246334
-L 682.168086 231.489275
-L 682.886641 232.417204
-L 683.605195 234.088593
-L 684.32375 236.638233
-L 685.042305 240.335901
-L 685.760859 245.752315
-L 686.479414 254.359382
-L 687.197969 272.549581
-L 687.916523 277.919561
-L 688.635078 256.63446
-L 689.353633 247.710821
-L 690.072188 242.369687
-L 690.790742 238.876274
-L 691.509297 236.587633
-L 692.227852 235.205449
-L 692.946406 234.580592
-L 693.664961 234.645552
-L 694.383516 235.389948
-L 695.10207 236.857095
-L 695.820625 239.158914
-L 696.53918 242.521605
-L 697.257734 247.411187
-L 697.976289 254.951046
-L 698.694844 269.151239
-L 699.413398 297.266076
-L 700.131953 263.264731
-L 700.850508 252.740559
-L 701.569062 246.730198
-L 702.287617 242.845428
-L 703.006172 240.282713
-L 703.724727 238.683861
-L 704.443281 237.870976
-L 705.161836 237.759238
-L 705.880391 238.324766
-L 706.598945 239.596629
-L 707.3175 241.666628
-L 708.036055 244.724727
-L 708.754609 249.155199
-L 709.473164 255.835325
-L 710.191719 267.487236
-L 710.910273 314.583641
-L 711.628828 270.703845
-L 712.347383 257.966229
-L 713.065938 251.157496
-L 713.784492 246.835436
-L 714.503047 243.978634
-L 715.221602 242.154047
-L 715.940156 241.149842
-L 716.658711 240.861945
-L 717.377266 241.252491
-L 718.09582 242.336898
-L 718.814375 244.188988
-L 719.53293 246.968169
-L 720.251484 250.993737
-L 720.970039 256.96349
-L 721.688594 266.824385
-L 722.407148 291.809747
-L 723.125703 279.548361
-L 723.844258 263.491353
-L 724.562813 255.705908
-L 725.281367 250.888619
-L 725.999922 247.713473
-L 726.718477 245.65222
-L 727.437031 244.452431
-L 728.155586 243.988275
-L 728.874141 244.20711
-L 729.592695 245.11102
-L 730.31125 246.757501
-L 731.029805 249.279822
-L 731.748359 252.944787
-L 732.466914 258.315747
-L 733.185469 266.838837
-L 733.904023 284.703301
-L 734.622578 291.23458
-L 735.341133 269.458777
-L 736.059688 260.440496
-L 736.778242 255.053795
-L 737.496797 251.530819
-L 738.215352 249.219884
-L 738.933906 247.819299
-L 739.652461 247.178271
-L 740.371016 247.228259
-L 741.08957 247.958055
-L 741.808125 249.410066
-L 742.52668 251.694889
-L 743.245234 255.036268
-L 743.963789 259.894526
-L 744.682344 267.375143
-L 745.400898 281.384682
-L 746.119453 311.557544
-L 746.838008 276.08182
-L 747.556563 265.443041
-L 748.275117 259.390103
-L 748.993672 255.483267
-L 749.712227 252.9073
-L 750.430781 251.299828
-L 751.149336 250.481006
-L 751.867891 250.364882
-L 752.586445 250.92673
-L 753.305 252.194761
-L 754.023555 254.259605
-L 754.742109 257.309175
-L 755.460664 261.723256
-L 756.179219 268.366249
-L 756.897773 279.900298
-L 757.616328 323.983382
-L 758.334883 283.712309
-L 759.053437 270.821513
-L 759.771992 263.972859
-L 760.490547 259.637819
-L 761.209102 256.778885
-L 761.927656 254.957742
-L 762.646211 253.960248
-L 763.364766 253.681065
-L 764.08332 254.081446
-L 764.801875 255.175987
-L 765.52043 257.037464
-L 766.238984 259.82355
-L 766.957539 263.849951
-L 767.676094 269.804933
-L 768.394648 279.597725
-L 769.113203 303.982188
-L 769.831758 293.018586
-L 770.550313 276.72612
-L 771.268867 268.903206
-L 771.987422 264.084918
-L 772.705977 260.922357
-L 773.424531 258.880511
-L 774.143086 257.704176
-L 774.861641 257.266092
-L 775.580195 257.512686
-L 776.29875 258.445243
-L 777.017305 260.120313
-L 777.735859 262.669688
-L 778.454414 266.357263
-L 779.172969 271.739173
-L 779.891523 280.236423
-L 780.610078 297.844498
-L 781.328633 305.609567
-L 782.047188 283.378678
-L 782.765742 274.325347
-L 783.484297 268.95489
-L 784.202852 265.465544
-L 784.921406 263.196779
-L 785.639961 261.843525
-L 786.358516 261.253354
-L 787.07707 261.356738
-L 787.795625 262.141686
-L 788.51418 263.649753
-L 789.232734 265.990273
-L 789.951289 269.384619
-L 790.669844 274.28756
-L 791.388398 281.787113
-L 792.106953 295.690189
-L 792.825508 328.176655
-L 793.544063 291.131563
-L 794.262617 280.460422
-L 794.981172 274.451033
-L 795.699727 270.610655
-L 796.418281 268.112218
-L 797.136836 266.58919
-L 797.855391 265.859852
-L 798.573945 265.837209
-L 799.2925 266.495786
-L 800.011055 267.863046
-L 800.729609 270.028569
-L 801.448164 273.178358
-L 802.166719 277.687899
-L 802.885273 284.409093
-L 803.603828 295.946073
-L 804.322383 337.641147
-L 805.040938 300.60173
-L 805.759492 287.68222
-L 806.478047 280.925608
-L 807.196602 276.714123
-L 807.915156 273.994023
-L 808.633711 272.321849
-L 809.352266 271.481351
-L 810.07082 271.366156
-L 810.789375 271.936889
-L 811.50793 273.207599
-L 812.226484 275.250314
-L 812.945039 278.221303
-L 813.663594 282.433066
-L 814.382148 288.564869
-L 815.100703 298.489603
-L 815.819258 322.513931
-L 816.537813 313.035626
-L 817.256367 296.721263
-L 817.974922 289.09157
-L 818.693477 284.513348
-L 819.412031 281.614905
-L 820.130586 279.855034
-L 820.849141 278.976466
-L 821.567695 278.851311
-L 822.28625 279.425958
-L 823.004805 280.701873
-L 823.723359 282.735749
-L 824.441914 285.659112
-L 825.160469 289.734314
-L 825.879023 295.511876
-L 826.597578 304.389917
-L 827.316133 322.180862
-L 828.034688 331.649737
-L 828.753242 309.418344
-L 829.471797 300.839697
-L 830.190352 296.02959
-L 830.908906 293.154991
-L 831.627461 291.550459
-L 832.346016 290.912271
-L 833.06457 291.091954
-L 833.783125 292.025626
-L 834.50168 293.70846
-L 835.220234 296.190773
-L 835.938789 299.592422
-L 836.657344 304.147072
-L 837.375898 310.322512
-L 838.094453 319.213487
-L 838.813008 334.56226
-L 839.531563 371.345455
-L 840.250117 334.553985
-L 840.968672 326.256881
-L 841.687227 323.200815
-L 842.405781 323.066201
-L 843.124336 325.441073
-L 843.842891 330.913943
-L 844.561445 342.362561
-L 844.561445 342.362561
+ <path clip-path="url(#p2e76f6499c)" d="M 476.2325 52.714545
+L 477.673916 52.89268
+L 479.115332 53.429168
+L 480.556748 54.330405
+L 481.998164 55.607525
+L 483.43958 57.277199
+L 484.880996 59.362942
+L 486.322412 61.897188
+L 487.763828 64.924608
+L 489.205244 68.507617
+L 490.64666 72.735933
+L 492.088076 77.74442
+L 493.529492 83.749693
+L 494.970908 91.136034
+L 495.691616 95.565248
+L 496.412324 100.702184
+L 497.133032 106.860239
+L 497.85374 114.669747
+L 498.574448 125.747835
+L 499.295156 147.506004
+L 500.015864 150.139663
+L 500.736572 132.115701
+L 501.45728 125.110548
+L 502.177988 121.469644
+L 502.898696 119.570235
+L 503.619404 118.801319
+L 504.340112 118.879158
+L 505.06082 119.663703
+L 505.781528 121.094502
+L 506.502236 123.167732
+L 507.222944 125.933897
+L 507.943652 129.514354
+L 508.66436 134.150535
+L 509.385068 140.339951
+L 510.105776 149.297305
+L 510.826484 165.541201
+L 511.547192 187.902826
+L 512.2679 159.217296
+L 512.988608 149.991005
+L 513.709316 145.03319
+L 514.430024 142.123491
+L 515.150732 140.495525
+L 515.87144 139.804457
+L 516.592148 139.87905
+L 517.312856 140.638968
+L 518.033564 142.064357
+L 518.754272 144.188945
+L 519.47498 147.111185
+L 520.195688 151.032469
+L 520.916396 156.360978
+L 521.637104 164.039407
+L 522.357812 177.084341
+L 523.078521 253.649461
+L 523.799229 179.413277
+L 524.519937 167.830246
+L 525.240645 161.80846
+L 525.961353 158.187561
+L 526.682061 155.996817
+L 527.402769 154.819265
+L 528.123477 154.450184
+L 528.844185 154.789761
+L 529.564893 155.803641
+L 530.285601 157.511158
+L 531.006309 159.991658
+L 531.727017 163.413924
+L 532.447725 168.116275
+L 533.168433 174.845152
+L 533.889141 185.733516
+L 534.609849 214.484444
+L 536.051265 182.322847
+L 536.771973 175.194616
+L 537.492681 170.923995
+L 538.213389 168.25761
+L 538.934097 166.687773
+L 539.654805 165.970364
+L 540.375513 165.984074
+L 541.096221 166.679661
+L 541.816929 168.062753
+L 542.537637 170.195654
+L 543.258345 173.219551
+L 543.979053 177.416704
+L 544.699761 183.387594
+L 545.420469 192.703132
+L 546.141177 212.509581
+L 546.861885 214.813092
+L 547.582593 194.981216
+L 548.303301 186.567348
+L 549.024009 181.630629
+L 549.744717 178.512003
+L 550.465425 176.586927
+L 551.186133 175.563792
+L 551.906841 175.296846
+L 552.627549 175.721009
+L 553.348257 176.828405
+L 554.068965 178.665731
+L 554.789673 181.350374
+L 555.510381 185.118832
+L 556.231089 190.460372
+L 556.951797 198.568014
+L 557.672505 213.836539
+L 558.393213 237.094332
+L 559.113921 206.674034
+L 559.834629 196.652861
+L 560.555337 190.987254
+L 561.276045 187.409338
+L 561.996753 185.140692
+L 562.717461 183.831487
+L 563.438169 183.307679
+L 564.158877 183.486957
+L 564.879585 184.347817
+L 565.600293 185.922362
+L 566.321001 188.307126
+L 567.041709 191.700676
+L 567.762417 196.505765
+L 568.483125 203.650404
+L 569.203833 216.081721
+L 569.924541 279.83467
+L 570.645249 218.07693
+L 571.365957 205.904252
+L 572.086665 199.404035
+L 572.807373 195.339419
+L 573.528081 192.724292
+L 574.248789 191.136293
+L 574.969497 190.368113
+L 575.690205 190.318356
+L 576.410913 190.951465
+L 577.131621 192.285625
+L 577.852329 194.398803
+L 578.573037 197.457671
+L 579.293745 201.796443
+L 580.014453 208.150936
+L 580.735161 218.611273
+L 581.455869 246.224982
+L 582.897285 214.648405
+L 583.617993 207.155192
+L 584.338701 202.558453
+L 585.059409 199.583496
+L 585.780117 197.716027
+L 586.500825 196.709063
+L 587.221533 196.439715
+L 587.942241 196.857639
+L 588.662949 197.967483
+L 589.383657 199.830406
+L 590.104365 202.585878
+L 590.825073 206.512907
+L 591.545781 212.204013
+L 592.266489 221.201949
+L 592.987197 240.414434
+L 593.707905 243.645212
+L 594.428613 223.161764
+L 595.149321 214.441095
+L 595.870029 209.247216
+L 596.590737 205.889995
+L 597.311445 203.736409
+L 598.032153 202.49147
+L 598.752861 202.007699
+L 599.473569 202.218906
+L 600.194277 203.116294
+L 600.914985 204.745548
+L 601.635693 207.222601
+L 602.356401 210.781306
+L 603.077109 215.904812
+L 603.797817 223.766736
+L 604.518525 238.644411
+L 605.239233 263.439163
+L 605.959941 231.727284
+L 606.680649 221.421881
+L 607.401357 215.541433
+L 608.122065 211.77028
+L 608.842773 209.318763
+L 609.563481 207.832932
+L 610.284189 207.136773
+L 611.004897 207.146796
+L 611.725605 207.840588
+L 612.446313 209.24932
+L 613.167021 211.46826
+L 613.887729 214.693781
+L 614.608437 219.32384
+L 615.329146 226.272572
+L 616.049854 238.420337
+L 616.770562 294.916767
+L 617.49127 240.706744
+L 618.211978 228.239035
+L 618.932686 221.549352
+L 619.653394 217.322081
+L 620.374102 214.555771
+L 621.09481 212.822911
+L 621.815518 211.913889
+L 622.536226 211.726011
+L 623.256934 212.222792
+L 623.977642 213.421534
+L 624.69835 215.399078
+L 625.419058 218.320244
+L 626.139766 222.515418
+L 626.860474 228.710192
+L 627.581182 238.953226
+L 628.30189 265.686905
+L 629.743306 235.032985
+L 630.464014 227.362977
+L 631.184722 222.624455
+L 631.90543 219.521077
+L 632.626138 217.531985
+L 633.346846 216.407445
+L 634.067554 216.023106
+L 634.788262 216.327653
+L 635.50897 217.32487
+L 636.229678 219.074898
+L 636.950386 221.715619
+L 637.671094 225.522935
+L 638.391802 231.081641
+L 639.11251 239.907108
+L 639.833218 258.68034
+L 640.553926 262.98223
+L 641.274634 241.962763
+L 641.995342 233.066213
+L 642.71605 227.74443
+L 643.436758 224.275489
+L 644.157466 222.017814
+L 644.878174 220.67307
+L 645.598882 220.092108
+L 646.31959 220.207689
+L 647.040298 221.01016
+L 647.761006 222.544262
+L 648.481714 224.924547
+L 649.202422 228.382307
+L 649.92313 233.39473
+L 650.643838 241.1165
+L 651.364546 255.712014
+L 652.085254 282.245565
+L 652.805962 249.23627
+L 653.52667 238.741843
+L 654.247378 232.741768
+L 654.968086 228.871241
+L 655.688794 226.329194
+L 656.409502 224.757544
+L 657.13021 223.978328
+L 657.850918 223.906908
+L 658.571626 224.519997
+L 659.292334 225.847876
+L 660.013042 227.984592
+L 660.73375 231.12438
+L 661.454458 235.660505
+L 662.175166 242.49353
+L 662.895874 254.43918
+L 663.616582 305.898647
+L 664.33729 257.170732
+L 665.057998 244.478912
+L 665.778706 237.67273
+L 666.499414 233.355113
+L 667.220122 230.508976
+L 667.94083 228.701612
+L 668.661538 227.721102
+L 669.382246 227.463471
+L 670.102954 227.891326
+L 670.823662 229.021111
+L 671.54437 230.92857
+L 672.265078 233.776712
+L 672.985786 237.892167
+L 673.706494 243.990507
+L 674.427202 254.080074
+L 675.14791 280.042733
+L 675.868618 266.345168
+L 676.589326 250.382437
+L 677.310034 242.593473
+L 678.030742 237.770921
+L 678.75145 234.596309
+L 679.472158 232.542127
+L 680.192866 231.355871
+L 680.913574 230.911736
+L 681.634282 231.157442
+L 682.35499 232.095933
+L 683.075698 233.786345
+L 683.796406 236.365005
+L 684.517114 240.10476
+L 685.237822 245.582823
+L 685.95853 254.287855
+L 686.679238 272.685093
+L 687.399946 278.116194
+L 688.120654 256.588827
+L 688.841362 247.563621
+L 689.56207 242.161694
+L 690.282778 238.628519
+L 691.003486 236.31383
+L 691.724194 234.915913
+L 692.444902 234.283945
+L 693.16561 234.349644
+L 693.886318 235.102512
+L 694.607026 236.586358
+L 695.327734 238.914377
+L 696.048442 242.315341
+L 696.76915 247.260576
+L 697.489858 254.886254
+L 698.210566 269.248071
+L 698.931274 297.68291
+L 699.651982 263.294564
+L 700.37269 252.650607
+L 701.093398 246.571837
+L 701.814106 242.64285
+L 702.534814 240.050966
+L 703.255522 238.433917
+L 703.97623 237.61178
+L 704.696938 237.498769
+L 705.417646 238.070734
+L 706.138354 239.357074
+L 706.859062 241.450633
+L 707.579771 244.543539
+L 708.300479 249.024438
+L 709.021187 255.780598
+L 709.741895 267.565129
+L 710.462603 315.197582
+L 711.183311 270.81835
+L 711.904019 257.935755
+L 712.624727 251.049526
+L 713.345435 246.678272
+L 714.066143 243.788954
+L 714.786851 241.9436
+L 715.507559 240.927965
+L 716.228267 240.636792
+L 716.948975 241.031782
+L 717.669683 242.128532
+L 718.390391 244.001703
+L 719.111099 246.812516
+L 719.831807 250.883903
+L 720.552515 256.921603
+L 721.273223 266.894734
+L 721.993931 292.164477
+L 722.714639 279.763533
+L 723.435347 263.523766
+L 724.156055 255.649707
+L 724.876763 250.777588
+L 725.597471 247.566303
+L 726.318179 245.481589
+L 727.038887 244.268143
+L 727.759595 243.798705
+L 728.480303 244.020031
+L 729.201011 244.934229
+L 729.921719 246.59945
+L 730.642427 249.15048
+L 731.363135 252.857159
+L 732.083843 258.289251
+L 732.804551 266.90935
+L 733.525259 284.977146
+L 734.245967 291.582764
+L 734.966675 269.559111
+L 735.687383 260.438184
+L 736.408091 254.990172
+L 737.128799 251.427097
+L 737.849507 249.08986
+L 738.570215 247.673333
+L 739.290923 247.025009
+L 740.011631 247.075566
+L 740.732339 247.813669
+L 741.453047 249.282207
+L 742.173755 251.593035
+L 742.894463 254.972446
+L 743.615171 259.885999
+L 744.335879 267.45176
+L 745.056587 281.620755
+L 745.777295 312.137042
+L 746.498003 276.257536
+L 747.218711 265.497668
+L 747.939419 259.375836
+L 748.660127 255.424532
+L 749.380835 252.819246
+L 750.101543 251.193477
+L 750.822251 250.365335
+L 751.542959 250.24789
+L 752.263667 250.816133
+L 752.984375 252.098597
+L 753.705083 254.186943
+L 754.425791 257.271222
+L 755.146499 261.735544
+L 755.867207 268.454147
+L 756.587915 280.119476
+L 757.308623 324.704311
+L 758.029331 283.974875
+L 758.750039 270.937357
+L 759.470747 264.010752
+L 760.191455 259.626371
+L 760.912163 256.734897
+L 761.632871 254.893026
+L 762.353579 253.884178
+L 763.074287 253.601817
+L 763.794995 254.006755
+L 764.515703 255.113754
+L 765.236411 256.996419
+L 765.957119 259.814216
+L 766.677827 263.886445
+L 767.398535 269.909206
+L 768.119243 279.813459
+L 768.839951 304.475464
+L 769.560659 293.387075
+L 770.281367 276.90917
+L 771.002075 268.997216
+L 771.722783 264.124086
+L 772.443491 260.925529
+L 773.164199 258.860443
+L 773.884907 257.670719
+L 774.605615 257.227649
+L 775.326323 257.47705
+L 776.047031 258.420221
+L 776.767739 260.114357
+L 777.488447 262.692749
+L 778.209155 266.422295
+L 778.929863 271.865462
+L 779.650571 280.459427
+L 780.371279 298.267915
+L 781.091987 306.121366
+L 781.812695 283.637446
+L 782.533403 274.481072
+L 783.254111 269.049488
+L 783.974819 265.520427
+L 784.695527 263.225839
+L 785.416235 261.857182
+L 786.136943 261.260294
+L 786.857651 261.364854
+L 787.578359 262.158737
+L 788.299067 263.683968
+L 789.019775 266.051128
+L 789.740483 269.484108
+L 790.461191 274.442854
+L 791.181899 282.027766
+L 791.902607 296.089086
+L 792.623315 328.945311
+L 793.344023 291.478574
+L 794.064731 280.685975
+L 794.785439 274.608188
+L 795.506147 270.724099
+L 796.226855 268.197224
+L 796.947563 266.656862
+L 797.668271 265.919223
+L 798.388979 265.896322
+L 799.109687 266.562395
+L 799.830396 267.945217
+L 800.551104 270.135388
+L 801.271812 273.321028
+L 801.99252 277.881895
+L 802.713228 284.67959
+L 803.433936 296.347883
+L 804.154644 338.517527
+L 804.875352 301.05653
+L 805.59606 287.989971
+L 806.316768 281.156456
+L 807.037476 276.897036
+L 807.758184 274.145976
+L 808.478892 272.45477
+L 809.1996 271.604705
+L 809.920308 271.488199
+L 810.641016 272.065428
+L 811.361724 273.350601
+L 812.082432 275.416566
+L 812.80314 278.421371
+L 813.523848 282.681071
+L 814.244556 288.882667
+L 814.965264 298.920363
+L 815.685972 323.218134
+L 816.40668 313.631948
+L 817.127388 297.131896
+L 817.848096 289.415362
+L 818.568804 284.785032
+L 819.289512 281.853598
+L 820.01022 280.073696
+L 820.730928 279.185129
+L 821.451636 279.05855
+L 822.172344 279.639737
+L 822.893052 280.930175
+L 823.61376 282.9872
+L 824.334468 285.943837
+L 825.055176 290.065422
+L 825.775884 295.908744
+L 826.496592 304.887833
+L 827.2173 322.881275
+L 827.938008 332.457923
+L 828.658716 309.973494
+L 829.379424 301.297206
+L 830.100132 296.43235
+L 830.82084 293.525033
+L 831.541548 291.902238
+L 832.262256 291.256786
+L 832.982964 291.438515
+L 833.703672 292.382813
+L 834.42438 294.084801
+L 835.145088 296.595368
+L 835.865796 300.035734
+L 836.586504 304.642225
+L 837.307212 310.887954
+L 838.02792 319.880125
+L 838.748628 335.403596
+L 839.469336 372.605455
+L 840.190044 335.395227
+L 840.910752 327.003687
+L 841.63146 323.912836
+L 842.352168 323.77669
+L 843.072876 326.178593
+L 843.793584 331.713755
+L 844.514292 343.29268
+L 844.514292 343.29268
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
</g>
<g id="patch_8">
- <path d="M 477.38 387.16
-L 477.38 39.24
+ <path d="M 476.2325 388.6
+L 476.2325 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_9">
- <path d="M 845.28 387.16
-L 845.28 39.24
+ <path d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_10">
- <path d="M 477.38 387.16
-L 845.28 387.16
+ <path d="M 476.2325 388.6
+L 845.235 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_11">
- <path d="M 477.38 39.24
-L 845.28 39.24
+ <path d="M 476.2325 36.72
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
@@ -2190,11 +2190,11 @@ z
</g>
</g>
<defs>
- <clipPath id="pee27c16c99">
- <rect height="347.92" width="367.9" x="47.72" y="39.24"/>
+ <clipPath id="pda623824ba">
+ <rect height="351.88" width="369.0025" x="47.855" y="36.72"/>
</clipPath>
- <clipPath id="p6d916e55c9">
- <rect height="347.92" width="367.9" x="477.38" y="39.24"/>
+ <clipPath id="p2e76f6499c">
+ <rect height="351.88" width="369.0025" x="476.2325" y="36.72"/>
</clipPath>
</defs>
</svg>
diff --git a/docs/docs/img/window_kaiser.svg b/docs/docs/img/window_kaiser.svg
@@ -19,28 +19,28 @@ z
</g>
<g id="axes_1">
<g id="patch_2">
- <path d="M 47.72 387.16
-L 418.77 387.16
-L 418.77 39.24
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 420.03 388.6
+L 420.03 36.72
+L 47.855 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
- <path clip-path="url(#pd87578ca95)" d="M 47.72 387.16
-L 47.72 39.24
+ <path clip-path="url(#p61146dcf68)" d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
-" id="m4c7698b8f4" style="stroke:#000000;stroke-width:0.8;"/>
+" id="m7fb90904fc" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m4c7698b8f4" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m7fb90904fc" y="388.6"/>
</g>
</g>
<g id="text_1">
@@ -68,20 +68,20 @@ Q 19.53125 74.21875 31.78125 74.21875
z
" id="DejaVuSans-48"/>
</defs>
- <g transform="translate(44.53875 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(44.67375 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
- <path clip-path="url(#pd87578ca95)" d="M 106.616825 387.16
-L 106.616825 39.24
+ <path clip-path="url(#p61146dcf68)" d="M 106.930397 388.6
+L 106.930397 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="106.616825" xlink:href="#m4c7698b8f4" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="106.930397" xlink:href="#m7fb90904fc" y="388.6"/>
</g>
</g>
<g id="text_2">
@@ -101,7 +101,7 @@ L 12.40625 0
z
" id="DejaVuSans-49"/>
</defs>
- <g transform="translate(100.254325 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(100.567897 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -109,13 +109,13 @@ z
</g>
<g id="xtick_3">
<g id="line2d_5">
- <path clip-path="url(#pd87578ca95)" d="M 165.513651 387.16
-L 165.513651 39.24
+ <path clip-path="url(#p61146dcf68)" d="M 166.005794 388.6
+L 166.005794 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="165.513651" xlink:href="#m4c7698b8f4" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="166.005794" xlink:href="#m7fb90904fc" y="388.6"/>
</g>
</g>
<g id="text_3">
@@ -146,7 +146,7 @@ Q 31.109375 20.453125 19.1875 8.296875
z
" id="DejaVuSans-50"/>
</defs>
- <g transform="translate(159.151151 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(159.643294 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -154,13 +154,13 @@ z
</g>
<g id="xtick_4">
<g id="line2d_7">
- <path clip-path="url(#pd87578ca95)" d="M 224.410476 387.16
-L 224.410476 39.24
+ <path clip-path="url(#p61146dcf68)" d="M 225.08119 388.6
+L 225.08119 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_8">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="224.410476" xlink:href="#m4c7698b8f4" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="225.08119" xlink:href="#m7fb90904fc" y="388.6"/>
</g>
</g>
<g id="text_4">
@@ -199,7 +199,7 @@ Q 46.96875 40.921875 40.578125 39.3125
z
" id="DejaVuSans-51"/>
</defs>
- <g transform="translate(218.047976 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(218.71869 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-51"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -207,13 +207,13 @@ z
</g>
<g id="xtick_5">
<g id="line2d_9">
- <path clip-path="url(#pd87578ca95)" d="M 283.307302 387.16
-L 283.307302 39.24
+ <path clip-path="url(#p61146dcf68)" d="M 284.156587 388.6
+L 284.156587 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_10">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="283.307302" xlink:href="#m4c7698b8f4" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="284.156587" xlink:href="#m7fb90904fc" y="388.6"/>
</g>
</g>
<g id="text_5">
@@ -237,7 +237,7 @@ L 4.890625 26.703125
z
" id="DejaVuSans-52"/>
</defs>
- <g transform="translate(276.944802 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(277.794087 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-52"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -245,13 +245,13 @@ z
</g>
<g id="xtick_6">
<g id="line2d_11">
- <path clip-path="url(#pd87578ca95)" d="M 342.204127 387.16
-L 342.204127 39.24
+ <path clip-path="url(#p61146dcf68)" d="M 343.231984 388.6
+L 343.231984 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_12">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="342.204127" xlink:href="#m4c7698b8f4" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="343.231984" xlink:href="#m7fb90904fc" y="388.6"/>
</g>
</g>
<g id="text_6">
@@ -282,7 +282,7 @@ Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-53"/>
</defs>
- <g transform="translate(335.841627 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(336.869484 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-53"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -290,13 +290,13 @@ z
</g>
<g id="xtick_7">
<g id="line2d_13">
- <path clip-path="url(#pd87578ca95)" d="M 401.100952 387.16
-L 401.100952 39.24
+ <path clip-path="url(#p61146dcf68)" d="M 402.307381 388.6
+L 402.307381 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_14">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="401.100952" xlink:href="#m4c7698b8f4" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="402.307381" xlink:href="#m7fb90904fc" y="388.6"/>
</g>
</g>
<g id="text_7">
@@ -333,7 +333,7 @@ Q 48.484375 72.75 52.59375 71.296875
z
" id="DejaVuSans-54"/>
</defs>
- <g transform="translate(394.738452 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(395.944881 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-54"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -523,7 +523,7 @@ Q 40.578125 54.546875 44.28125 53.078125
z
" id="DejaVuSans-115"/>
</defs>
- <g transform="translate(211.891875 415.436563)scale(0.1 -0.1)">
+ <g transform="translate(212.589375 416.876562)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-83"/>
<use x="63.476562" xlink:href="#DejaVuSans-97"/>
<use x="124.755859" xlink:href="#DejaVuSans-109"/>
@@ -537,18 +537,18 @@ z
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_15">
- <path clip-path="url(#pd87578ca95)" d="M 47.72 341.426535
-L 418.77 341.426535
+ <path clip-path="url(#p61146dcf68)" d="M 47.855 342.346
+L 420.03 342.346
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_16">
<defs>
<path d="M 0 0
L -3.5 0
-" id="m5b5cabe784" style="stroke:#000000;stroke-width:0.8;"/>
+" id="mdb7bec3693" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m5b5cabe784" y="341.426535"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mdb7bec3693" y="342.346"/>
</g>
</g>
<g id="text_9">
@@ -561,7 +561,7 @@ L 10.6875 0
z
" id="DejaVuSans-46"/>
</defs>
- <g transform="translate(24.816875 345.225754)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 346.145219)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -570,18 +570,18 @@ z
</g>
<g id="ytick_2">
<g id="line2d_17">
- <path clip-path="url(#pd87578ca95)" d="M 47.72 293.804261
-L 418.77 293.804261
+ <path clip-path="url(#p61146dcf68)" d="M 47.855 294.181693
+L 420.03 294.181693
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_18">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m5b5cabe784" y="293.804261"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mdb7bec3693" y="294.181693"/>
</g>
</g>
<g id="text_10">
<!-- 0.5 -->
- <g transform="translate(24.816875 297.60348)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 297.980912)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-53"/>
@@ -590,18 +590,18 @@ L 418.77 293.804261
</g>
<g id="ytick_3">
<g id="line2d_19">
- <path clip-path="url(#pd87578ca95)" d="M 47.72 246.181987
-L 418.77 246.181987
+ <path clip-path="url(#p61146dcf68)" d="M 47.855 246.017386
+L 420.03 246.017386
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_20">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m5b5cabe784" y="246.181987"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mdb7bec3693" y="246.017386"/>
</g>
</g>
<g id="text_11">
<!-- 0.6 -->
- <g transform="translate(24.816875 249.981206)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 249.816605)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -610,13 +610,13 @@ L 418.77 246.181987
</g>
<g id="ytick_4">
<g id="line2d_21">
- <path clip-path="url(#pd87578ca95)" d="M 47.72 198.559714
-L 418.77 198.559714
+ <path clip-path="url(#p61146dcf68)" d="M 47.855 197.853079
+L 420.03 197.853079
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_22">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m5b5cabe784" y="198.559714"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mdb7bec3693" y="197.853079"/>
</g>
</g>
<g id="text_12">
@@ -632,7 +632,7 @@ L 8.203125 64.59375
z
" id="DejaVuSans-55"/>
</defs>
- <g transform="translate(24.816875 202.358932)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 201.652298)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-55"/>
@@ -641,13 +641,13 @@ z
</g>
<g id="ytick_5">
<g id="line2d_23">
- <path clip-path="url(#pd87578ca95)" d="M 47.72 150.93744
-L 418.77 150.93744
+ <path clip-path="url(#p61146dcf68)" d="M 47.855 149.688772
+L 420.03 149.688772
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_24">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m5b5cabe784" y="150.93744"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mdb7bec3693" y="149.688772"/>
</g>
</g>
<g id="text_13">
@@ -693,7 +693,7 @@ Q 18.3125 60.0625 18.3125 54.390625
z
" id="DejaVuSans-56"/>
</defs>
- <g transform="translate(24.816875 154.736659)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 153.487991)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -702,13 +702,13 @@ z
</g>
<g id="ytick_6">
<g id="line2d_25">
- <path clip-path="url(#pd87578ca95)" d="M 47.72 103.315166
-L 418.77 103.315166
+ <path clip-path="url(#p61146dcf68)" d="M 47.855 101.524465
+L 420.03 101.524465
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_26">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m5b5cabe784" y="103.315166"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mdb7bec3693" y="101.524465"/>
</g>
</g>
<g id="text_14">
@@ -745,7 +745,7 @@ Q 23.96875 32.421875 30.609375 32.421875
z
" id="DejaVuSans-57"/>
</defs>
- <g transform="translate(24.816875 107.114385)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 105.323684)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-57"/>
@@ -754,18 +754,18 @@ z
</g>
<g id="ytick_7">
<g id="line2d_27">
- <path clip-path="url(#pd87578ca95)" d="M 47.72 55.692892
-L 418.77 55.692892
+ <path clip-path="url(#p61146dcf68)" d="M 47.855 53.360158
+L 420.03 53.360158
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_28">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m5b5cabe784" y="55.692892"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mdb7bec3693" y="53.360158"/>
</g>
</g>
<g id="text_15">
<!-- 1.0 -->
- <g transform="translate(24.816875 59.492111)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 57.159377)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -868,7 +868,7 @@ Q 14.796875 37.203125 14.796875 27.296875
z
" id="DejaVuSans-100"/>
</defs>
- <g transform="translate(18.737188 238.822656)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(18.872187 238.282656)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-65"/>
<use x="68.408203" xlink:href="#DejaVuSans-109"/>
<use x="165.820312" xlink:href="#DejaVuSans-112"/>
@@ -882,70 +882,70 @@ z
</g>
</g>
<g id="line2d_29">
- <path clip-path="url(#pd87578ca95)" d="M 47.72 387.16
-L 53.609683 372.678554
-L 59.499365 357.985927
-L 65.389048 343.128793
-L 71.27873 328.155189
-L 77.168413 313.114316
-L 83.058095 298.056322
-L 88.947778 283.032091
-L 94.83746 268.093014
-L 100.727143 253.290771
-L 106.616825 238.677097
-L 112.506508 224.303556
-L 118.39619 210.221304
-L 124.285873 196.480867
-L 130.175556 183.131908
-L 136.065238 170.223004
-L 141.954921 157.801421
-L 147.844603 145.912904
-L 153.734286 134.601464
-L 159.623968 123.909175
-L 165.513651 113.875985
-L 171.403333 104.539525
-L 177.293016 95.93494
-L 183.182698 88.094723
-L 189.072381 81.048566
-L 194.962063 74.823222
-L 200.851746 69.442379
-L 206.741429 64.926552
-L 212.631111 61.292982
-L 218.520794 58.555564
-L 224.410476 56.724772
-L 230.300159 55.807619
-L 236.189841 55.807619
-L 242.079524 56.724772
-L 247.969206 58.555564
-L 253.858889 61.292982
-L 259.748571 64.926552
-L 265.638254 69.442379
-L 271.527937 74.823222
-L 277.417619 81.048566
-L 283.307302 88.094723
-L 289.196984 95.93494
-L 295.086667 104.539525
-L 300.976349 113.875985
-L 306.866032 123.909175
-L 312.755714 134.601464
-L 318.645397 145.912904
-L 324.535079 157.801421
-L 330.424762 170.223004
-L 336.314444 183.131908
-L 342.204127 196.480867
-L 348.09381 210.221304
-L 353.983492 224.303556
-L 359.873175 238.677097
-L 365.762857 253.290771
-L 371.65254 268.093014
-L 377.542222 283.032091
-L 383.431905 298.056322
-L 389.321587 313.114316
-L 395.21127 328.155189
-L 401.100952 343.128793
-L 406.990635 357.985927
-L 412.880317 372.678554
-L 418.77 387.16
+ <path clip-path="url(#p61146dcf68)" d="M 47.855 388.6
+L 53.76254 373.953728
+L 59.670079 359.09387
+L 65.577619 344.067633
+L 71.485159 328.923601
+L 77.392698 313.711533
+L 83.300238 298.482151
+L 89.207778 283.286914
+L 95.115317 268.177802
+L 101.022857 253.207081
+L 106.930397 238.427076
+L 112.837937 223.889935
+L 118.745476 209.647401
+L 124.653016 195.750571
+L 130.560556 182.249676
+L 136.468095 169.193843
+L 142.375635 156.630878
+L 148.283175 144.607047
+L 154.190714 133.166861
+L 160.098254 122.352874
+L 166.005794 112.205487
+L 171.913333 102.76276
+L 177.820873 94.060237
+L 183.728413 86.130783
+L 189.635952 79.004428
+L 195.543492 72.708228
+L 201.451032 67.266141
+L 207.358571 62.698914
+L 213.266111 59.023988
+L 219.173651 56.255412
+L 225.08119 54.403782
+L 230.98873 53.47619
+L 236.89627 53.47619
+L 242.80381 54.403782
+L 248.711349 56.255412
+L 254.618889 59.023988
+L 260.526429 62.698914
+L 266.433968 67.266141
+L 272.341508 72.708228
+L 278.249048 79.004428
+L 284.156587 86.130783
+L 290.064127 94.060237
+L 295.971667 102.76276
+L 301.879206 112.205487
+L 307.786746 122.352874
+L 313.694286 133.166861
+L 319.601825 144.607047
+L 325.509365 156.630878
+L 331.416905 169.193843
+L 337.324444 182.249676
+L 343.231984 195.750571
+L 349.139524 209.647401
+L 355.047063 223.889935
+L 360.954603 238.427076
+L 366.862143 253.207081
+L 372.769683 268.177802
+L 378.677222 283.286914
+L 384.584762 298.482151
+L 390.492302 313.711533
+L 396.399841 328.923601
+L 402.307381 344.067633
+L 408.214921 359.09387
+L 414.12246 373.953728
+L 420.03 388.6
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
<defs>
<path d="M 0 1.5
@@ -958,120 +958,120 @@ C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0
C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066
C -0.77937 1.341951 -0.397805 1.5 0 1.5
z
-" id="m49a2708535" style="stroke:#0072bd;"/>
+" id="mee90c8733d" style="stroke:#0072bd;"/>
</defs>
- <g clip-path="url(#pd87578ca95)">
- <use style="fill:#0072bd;stroke:#0072bd;" x="47.72" xlink:href="#m49a2708535" y="387.16"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="53.609683" xlink:href="#m49a2708535" y="372.678554"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="59.499365" xlink:href="#m49a2708535" y="357.985927"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="65.389048" xlink:href="#m49a2708535" y="343.128793"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="71.27873" xlink:href="#m49a2708535" y="328.155189"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="77.168413" xlink:href="#m49a2708535" y="313.114316"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="83.058095" xlink:href="#m49a2708535" y="298.056322"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="88.947778" xlink:href="#m49a2708535" y="283.032091"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="94.83746" xlink:href="#m49a2708535" y="268.093014"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="100.727143" xlink:href="#m49a2708535" y="253.290771"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="106.616825" xlink:href="#m49a2708535" y="238.677097"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="112.506508" xlink:href="#m49a2708535" y="224.303556"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="118.39619" xlink:href="#m49a2708535" y="210.221304"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="124.285873" xlink:href="#m49a2708535" y="196.480867"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="130.175556" xlink:href="#m49a2708535" y="183.131908"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="136.065238" xlink:href="#m49a2708535" y="170.223004"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="141.954921" xlink:href="#m49a2708535" y="157.801421"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="147.844603" xlink:href="#m49a2708535" y="145.912904"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="153.734286" xlink:href="#m49a2708535" y="134.601464"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="159.623968" xlink:href="#m49a2708535" y="123.909175"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="165.513651" xlink:href="#m49a2708535" y="113.875985"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="171.403333" xlink:href="#m49a2708535" y="104.539525"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="177.293016" xlink:href="#m49a2708535" y="95.93494"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="183.182698" xlink:href="#m49a2708535" y="88.094723"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="189.072381" xlink:href="#m49a2708535" y="81.048566"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="194.962063" xlink:href="#m49a2708535" y="74.823222"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="200.851746" xlink:href="#m49a2708535" y="69.442379"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="206.741429" xlink:href="#m49a2708535" y="64.926552"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="212.631111" xlink:href="#m49a2708535" y="61.292982"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="218.520794" xlink:href="#m49a2708535" y="58.555564"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="224.410476" xlink:href="#m49a2708535" y="56.724772"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="230.300159" xlink:href="#m49a2708535" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="236.189841" xlink:href="#m49a2708535" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="242.079524" xlink:href="#m49a2708535" y="56.724772"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="247.969206" xlink:href="#m49a2708535" y="58.555564"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="253.858889" xlink:href="#m49a2708535" y="61.292982"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="259.748571" xlink:href="#m49a2708535" y="64.926552"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="265.638254" xlink:href="#m49a2708535" y="69.442379"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="271.527937" xlink:href="#m49a2708535" y="74.823222"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="277.417619" xlink:href="#m49a2708535" y="81.048566"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="283.307302" xlink:href="#m49a2708535" y="88.094723"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="289.196984" xlink:href="#m49a2708535" y="95.93494"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="295.086667" xlink:href="#m49a2708535" y="104.539525"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="300.976349" xlink:href="#m49a2708535" y="113.875985"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="306.866032" xlink:href="#m49a2708535" y="123.909175"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="312.755714" xlink:href="#m49a2708535" y="134.601464"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="318.645397" xlink:href="#m49a2708535" y="145.912904"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="324.535079" xlink:href="#m49a2708535" y="157.801421"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="330.424762" xlink:href="#m49a2708535" y="170.223004"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="336.314444" xlink:href="#m49a2708535" y="183.131908"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="342.204127" xlink:href="#m49a2708535" y="196.480867"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="348.09381" xlink:href="#m49a2708535" y="210.221304"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="353.983492" xlink:href="#m49a2708535" y="224.303556"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="359.873175" xlink:href="#m49a2708535" y="238.677097"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="365.762857" xlink:href="#m49a2708535" y="253.290771"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="371.65254" xlink:href="#m49a2708535" y="268.093014"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="377.542222" xlink:href="#m49a2708535" y="283.032091"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="383.431905" xlink:href="#m49a2708535" y="298.056322"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="389.321587" xlink:href="#m49a2708535" y="313.114316"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="395.21127" xlink:href="#m49a2708535" y="328.155189"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="401.100952" xlink:href="#m49a2708535" y="343.128793"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="406.990635" xlink:href="#m49a2708535" y="357.985927"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="412.880317" xlink:href="#m49a2708535" y="372.678554"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="418.77" xlink:href="#m49a2708535" y="387.16"/>
+ <g clip-path="url(#p61146dcf68)">
+ <use style="fill:#0072bd;stroke:#0072bd;" x="47.855" xlink:href="#mee90c8733d" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="53.76254" xlink:href="#mee90c8733d" y="373.953728"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="59.670079" xlink:href="#mee90c8733d" y="359.09387"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="65.577619" xlink:href="#mee90c8733d" y="344.067633"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="71.485159" xlink:href="#mee90c8733d" y="328.923601"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="77.392698" xlink:href="#mee90c8733d" y="313.711533"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="83.300238" xlink:href="#mee90c8733d" y="298.482151"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="89.207778" xlink:href="#mee90c8733d" y="283.286914"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="95.115317" xlink:href="#mee90c8733d" y="268.177802"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="101.022857" xlink:href="#mee90c8733d" y="253.207081"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="106.930397" xlink:href="#mee90c8733d" y="238.427076"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="112.837937" xlink:href="#mee90c8733d" y="223.889935"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="118.745476" xlink:href="#mee90c8733d" y="209.647401"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="124.653016" xlink:href="#mee90c8733d" y="195.750571"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="130.560556" xlink:href="#mee90c8733d" y="182.249676"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="136.468095" xlink:href="#mee90c8733d" y="169.193843"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="142.375635" xlink:href="#mee90c8733d" y="156.630878"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="148.283175" xlink:href="#mee90c8733d" y="144.607047"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="154.190714" xlink:href="#mee90c8733d" y="133.166861"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="160.098254" xlink:href="#mee90c8733d" y="122.352874"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="166.005794" xlink:href="#mee90c8733d" y="112.205487"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="171.913333" xlink:href="#mee90c8733d" y="102.76276"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="177.820873" xlink:href="#mee90c8733d" y="94.060237"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="183.728413" xlink:href="#mee90c8733d" y="86.130783"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="189.635952" xlink:href="#mee90c8733d" y="79.004428"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="195.543492" xlink:href="#mee90c8733d" y="72.708228"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="201.451032" xlink:href="#mee90c8733d" y="67.266141"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="207.358571" xlink:href="#mee90c8733d" y="62.698914"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="213.266111" xlink:href="#mee90c8733d" y="59.023988"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="219.173651" xlink:href="#mee90c8733d" y="56.255412"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="225.08119" xlink:href="#mee90c8733d" y="54.403782"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="230.98873" xlink:href="#mee90c8733d" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="236.89627" xlink:href="#mee90c8733d" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="242.80381" xlink:href="#mee90c8733d" y="54.403782"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="248.711349" xlink:href="#mee90c8733d" y="56.255412"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="254.618889" xlink:href="#mee90c8733d" y="59.023988"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="260.526429" xlink:href="#mee90c8733d" y="62.698914"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="266.433968" xlink:href="#mee90c8733d" y="67.266141"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="272.341508" xlink:href="#mee90c8733d" y="72.708228"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="278.249048" xlink:href="#mee90c8733d" y="79.004428"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="284.156587" xlink:href="#mee90c8733d" y="86.130783"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="290.064127" xlink:href="#mee90c8733d" y="94.060237"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="295.971667" xlink:href="#mee90c8733d" y="102.76276"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="301.879206" xlink:href="#mee90c8733d" y="112.205487"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="307.786746" xlink:href="#mee90c8733d" y="122.352874"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="313.694286" xlink:href="#mee90c8733d" y="133.166861"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="319.601825" xlink:href="#mee90c8733d" y="144.607047"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="325.509365" xlink:href="#mee90c8733d" y="156.630878"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="331.416905" xlink:href="#mee90c8733d" y="169.193843"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="337.324444" xlink:href="#mee90c8733d" y="182.249676"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="343.231984" xlink:href="#mee90c8733d" y="195.750571"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="349.139524" xlink:href="#mee90c8733d" y="209.647401"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="355.047063" xlink:href="#mee90c8733d" y="223.889935"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="360.954603" xlink:href="#mee90c8733d" y="238.427076"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="366.862143" xlink:href="#mee90c8733d" y="253.207081"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="372.769683" xlink:href="#mee90c8733d" y="268.177802"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="378.677222" xlink:href="#mee90c8733d" y="283.286914"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="384.584762" xlink:href="#mee90c8733d" y="298.482151"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="390.492302" xlink:href="#mee90c8733d" y="313.711533"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="396.399841" xlink:href="#mee90c8733d" y="328.923601"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="402.307381" xlink:href="#mee90c8733d" y="344.067633"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="408.214921" xlink:href="#mee90c8733d" y="359.09387"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="414.12246" xlink:href="#mee90c8733d" y="373.953728"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="420.03" xlink:href="#mee90c8733d" y="388.6"/>
</g>
</g>
<g id="patch_3">
- <path d="M 47.72 387.16
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
- <path d="M 418.77 387.16
-L 418.77 39.24
+ <path d="M 420.03 388.6
+L 420.03 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
- <path d="M 47.72 387.16
-L 418.77 387.16
+ <path d="M 47.855 388.6
+L 420.03 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
- <path d="M 47.72 39.24
-L 418.77 39.24
+ <path d="M 47.855 36.72
+L 420.03 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
<g id="axes_2">
<g id="patch_7">
- <path d="M 474.23 387.16
-L 845.28 387.16
-L 845.28 39.24
-L 474.23 39.24
+ <path d="M 473.06 388.6
+L 845.235 388.6
+L 845.235 36.72
+L 473.06 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_3">
<g id="xtick_8">
<g id="line2d_30">
- <path clip-path="url(#pa16bc3513c)" d="M 474.23 387.16
-L 474.23 39.24
+ <path clip-path="url(#p3736a39444)" d="M 473.06 388.6
+L 473.06 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_31">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m4c7698b8f4" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#m7fb90904fc" y="388.6"/>
</g>
</g>
<g id="text_17">
<!-- 0.0 -->
- <g transform="translate(466.278437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(465.108437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1080,18 +1080,18 @@ L 474.23 39.24
</g>
<g id="xtick_9">
<g id="line2d_32">
- <path clip-path="url(#pa16bc3513c)" d="M 548.44 387.16
-L 548.44 39.24
+ <path clip-path="url(#p3736a39444)" d="M 547.495 388.6
+L 547.495 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_33">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="548.44" xlink:href="#m4c7698b8f4" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.495" xlink:href="#m7fb90904fc" y="388.6"/>
</g>
</g>
<g id="text_18">
<!-- 0.2 -->
- <g transform="translate(540.488437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(539.543437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -1100,18 +1100,18 @@ L 548.44 39.24
</g>
<g id="xtick_10">
<g id="line2d_34">
- <path clip-path="url(#pa16bc3513c)" d="M 622.65 387.16
-L 622.65 39.24
+ <path clip-path="url(#p3736a39444)" d="M 621.93 388.6
+L 621.93 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_35">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="622.65" xlink:href="#m4c7698b8f4" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="621.93" xlink:href="#m7fb90904fc" y="388.6"/>
</g>
</g>
<g id="text_19">
<!-- 0.4 -->
- <g transform="translate(614.698437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(613.978437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -1120,18 +1120,18 @@ L 622.65 39.24
</g>
<g id="xtick_11">
<g id="line2d_36">
- <path clip-path="url(#pa16bc3513c)" d="M 696.86 387.16
-L 696.86 39.24
+ <path clip-path="url(#p3736a39444)" d="M 696.365 388.6
+L 696.365 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_37">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="696.86" xlink:href="#m4c7698b8f4" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="696.365" xlink:href="#m7fb90904fc" y="388.6"/>
</g>
</g>
<g id="text_20">
<!-- 0.6 -->
- <g transform="translate(688.908437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(688.413437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -1140,18 +1140,18 @@ L 696.86 39.24
</g>
<g id="xtick_12">
<g id="line2d_38">
- <path clip-path="url(#pa16bc3513c)" d="M 771.07 387.16
-L 771.07 39.24
+ <path clip-path="url(#p3736a39444)" d="M 770.8 388.6
+L 770.8 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_39">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="771.07" xlink:href="#m4c7698b8f4" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="770.8" xlink:href="#m7fb90904fc" y="388.6"/>
</g>
</g>
<g id="text_21">
<!-- 0.8 -->
- <g transform="translate(763.118437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(762.848437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -1160,18 +1160,18 @@ L 771.07 39.24
</g>
<g id="xtick_13">
<g id="line2d_40">
- <path clip-path="url(#pa16bc3513c)" d="M 845.28 387.16
-L 845.28 39.24
+ <path clip-path="url(#p3736a39444)" d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_41">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="845.28" xlink:href="#m4c7698b8f4" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="845.235" xlink:href="#m7fb90904fc" y="388.6"/>
</g>
</g>
<g id="text_22">
<!-- 1.0 -->
- <g transform="translate(837.328437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(837.283437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1404,7 +1404,7 @@ Q 14.5 64.65625 8.015625 75.875
z
" id="DejaVuSans-41"/>
</defs>
- <g transform="translate(560.955 415.438125)scale(0.1 -0.1)">
+ <g transform="translate(560.3475 416.878125)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-78"/>
<use transform="translate(74.804688 0.015625)" xlink:href="#DejaVuSans-111"/>
<use transform="translate(135.986328 0.015625)" xlink:href="#DejaVuSans-114"/>
@@ -1447,13 +1447,13 @@ z
<g id="matplotlib.axis_4">
<g id="ytick_8">
<g id="line2d_42">
- <path clip-path="url(#pa16bc3513c)" d="M 474.23 362.545834
-L 845.28 362.545834
+ <path clip-path="url(#p3736a39444)" d="M 473.06 363.705677
+L 845.235 363.705677
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_43">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m5b5cabe784" y="362.545834"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#mdb7bec3693" y="363.705677"/>
</g>
</g>
<g id="text_24">
@@ -1466,7 +1466,7 @@ L 10.59375 27.203125
z
" id="DejaVuSans-8722"/>
</defs>
- <g transform="translate(446.125312 366.345052)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 367.504896)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-54"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1475,18 +1475,18 @@ z
</g>
<g id="ytick_9">
<g id="line2d_44">
- <path clip-path="url(#pa16bc3513c)" d="M 474.23 296.684786
-L 845.28 296.684786
+ <path clip-path="url(#p3736a39444)" d="M 473.06 297.095004
+L 845.235 297.095004
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_45">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m5b5cabe784" y="296.684786"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#mdb7bec3693" y="297.095004"/>
</g>
</g>
<g id="text_25">
<!-- −40 -->
- <g transform="translate(446.125312 300.484005)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 300.894223)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-52"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1495,18 +1495,18 @@ L 845.28 296.684786
</g>
<g id="ytick_10">
<g id="line2d_46">
- <path clip-path="url(#pa16bc3513c)" d="M 474.23 230.823739
-L 845.28 230.823739
+ <path clip-path="url(#p3736a39444)" d="M 473.06 230.484331
+L 845.235 230.484331
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_47">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m5b5cabe784" y="230.823739"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#mdb7bec3693" y="230.484331"/>
</g>
</g>
<g id="text_26">
<!-- −20 -->
- <g transform="translate(446.125312 234.622958)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 234.28355)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-50"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1515,36 +1515,36 @@ L 845.28 230.823739
</g>
<g id="ytick_11">
<g id="line2d_48">
- <path clip-path="url(#pa16bc3513c)" d="M 474.23 164.962692
-L 845.28 164.962692
+ <path clip-path="url(#p3736a39444)" d="M 473.06 163.873658
+L 845.235 163.873658
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_49">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m5b5cabe784" y="164.962692"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#mdb7bec3693" y="163.873658"/>
</g>
</g>
<g id="text_27">
<!-- 0 -->
- <g transform="translate(460.8675 168.76191)scale(0.1 -0.1)">
+ <g transform="translate(459.6975 167.672877)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_12">
<g id="line2d_50">
- <path clip-path="url(#pa16bc3513c)" d="M 474.23 99.101644
-L 845.28 99.101644
+ <path clip-path="url(#p3736a39444)" d="M 473.06 97.262985
+L 845.235 97.262985
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_51">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#m5b5cabe784" y="99.101644"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#mdb7bec3693" y="97.262985"/>
</g>
</g>
<g id="text_28">
<!-- 20 -->
- <g transform="translate(454.505 102.900863)scale(0.1 -0.1)">
+ <g transform="translate(453.335 101.062204)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -1608,7 +1608,7 @@ L 9.8125 0
z
" id="DejaVuSans-66"/>
</defs>
- <g transform="translate(440.045625 236.791406)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(438.875625 236.251406)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-71"/>
<use x="77.490234" xlink:href="#DejaVuSans-97"/>
<use x="138.769531" xlink:href="#DejaVuSans-105"/>
@@ -1622,534 +1622,534 @@ z
</g>
</g>
<g id="line2d_52">
- <path clip-path="url(#pa16bc3513c)" d="M 474.23 55.054545
-L 474.954707 55.188384
-L 475.679414 55.591019
-L 476.404121 56.265855
-L 477.128828 57.218731
-L 477.853535 58.458184
-L 478.578242 59.995853
-L 479.302949 61.847074
-L 480.027656 64.031744
-L 481.47707 69.511824
-L 482.926484 76.75103
-L 484.375898 86.31998
-L 485.100605 92.302255
-L 485.825312 99.402472
-L 486.55002 108.074289
-L 487.274727 119.208183
-L 487.999434 134.988176
-L 488.724141 164.197327
-L 489.448848 184.115129
-L 490.173555 148.767736
-L 490.898262 136.289976
-L 491.622969 129.861716
-L 492.347676 126.499755
-L 493.072383 125.152214
-L 493.79709 125.367416
-L 494.521797 126.963947
-L 495.246504 129.931569
-L 495.971211 134.42365
-L 496.695918 140.832165
-L 497.420625 150.043741
-L 498.145332 164.39744
-L 498.870039 194.178864
-L 499.594746 202.592188
-L 500.319453 169.878769
-L 501.04416 156.548346
-L 501.768867 148.903738
-L 502.493574 144.219561
-L 503.218281 141.490128
-L 503.942988 140.257883
-L 504.667695 140.308211
-L 505.392402 141.567613
-L 506.117109 144.074447
-L 506.841816 147.993787
-L 507.566523 153.690343
-L 508.29123 161.943529
-L 509.015937 174.690258
-L 509.740645 199.271212
-L 510.465352 229.970493
-L 511.190059 185.613987
-L 511.914766 170.195059
-L 512.639473 161.413793
-L 513.36418 155.876547
-L 514.088887 152.405043
-L 514.813594 150.471673
-L 515.538301 149.821116
-L 516.263008 150.345504
-L 516.987715 152.042183
-L 517.712422 155.012782
-L 518.437129 159.502783
-L 519.161836 166.01987
-L 519.886543 175.689538
-L 520.61125 191.691364
-L 521.335957 233.099027
-L 522.785371 185.985436
-L 523.510078 173.985364
-L 524.234785 166.635916
-L 524.959492 161.887858
-L 525.684199 158.922729
-L 526.408906 157.352845
-L 527.133613 156.991758
-L 527.85832 157.77364
-L 528.583027 159.729191
-L 529.307734 162.996629
-L 530.032441 167.877193
-L 530.757148 174.991943
-L 531.481855 185.776925
-L 532.206562 204.773797
-L 532.93127 295.492822
-L 533.655977 207.980884
-L 534.380684 188.409581
-L 535.105391 177.88872
-L 535.830098 171.244591
-L 536.554805 166.913515
-L 537.279512 164.230293
-L 538.004219 162.872693
-L 538.728926 162.689082
-L 539.453633 163.636887
-L 540.17834 165.767459
-L 540.903047 169.244478
-L 541.627754 174.411712
-L 542.352461 181.983172
-L 543.077168 193.671347
-L 543.801875 215.451011
-L 544.526582 268.482236
-L 545.251289 208.310433
-L 545.975996 191.157362
-L 546.700703 181.465876
-L 547.42541 175.243754
-L 548.150117 171.172262
-L 548.874824 168.670253
-L 549.599531 167.453384
-L 550.324238 167.391241
-L 551.048945 168.456348
-L 551.773652 170.714552
-L 552.498359 174.348746
-L 553.223066 179.736646
-L 553.947773 187.670034
-L 554.67248 200.107456
-L 555.397187 224.500124
-L 556.121895 253.60755
-L 556.846602 209.567219
-L 557.571309 193.830568
-L 558.296016 184.672008
-L 559.020723 178.732065
-L 559.74543 174.838724
-L 560.470137 172.463855
-L 561.194844 171.347906
-L 561.919551 171.37487
-L 562.644258 172.528028
-L 563.368965 174.884148
-L 564.093672 178.641339
-L 564.818379 184.205229
-L 565.543086 192.433783
-L 566.267793 205.505502
-L 566.9925 232.376553
-L 567.717207 248.264047
-L 568.441914 211.125114
-L 569.166621 196.323353
-L 569.891328 187.537701
-L 570.616035 181.800653
-L 571.340742 178.037818
-L 572.065449 175.757618
-L 572.790156 174.718056
-L 573.514863 174.813631
-L 574.23957 176.035766
-L 574.964277 178.469846
-L 575.688984 182.326437
-L 576.413691 188.034646
-L 577.138398 196.509606
-L 577.863105 210.127673
-L 578.587812 239.371654
-L 579.31252 245.928786
-L 580.037227 212.749603
-L 580.761934 198.61406
-L 581.486641 190.105148
-L 582.211348 184.521703
-L 582.936055 180.85907
-L 583.660762 178.652483
-L 584.385469 177.673088
-L 585.110176 177.823434
-L 585.834883 179.101378
-L 586.55959 181.599342
-L 587.284297 185.53834
-L 588.009004 191.367599
-L 588.733711 200.052298
-L 589.458418 214.148032
-L 590.183125 245.684148
-L 590.907832 244.920066
-L 591.632539 214.342464
-L 592.357246 200.707931
-L 593.081953 192.413472
-L 593.80666 186.950897
-L 594.531367 183.367995
-L 595.256074 181.220579
-L 595.980781 180.290053
-L 596.705488 180.485374
-L 597.430195 181.809644
-L 598.154902 184.36118
-L 598.879609 188.369939
-L 599.604316 194.302663
-L 600.329023 203.168866
-L 601.05373 217.687703
-L 601.778437 251.456544
-L 602.503145 244.584056
-L 603.227852 215.860829
-L 603.952559 202.618485
-L 604.677266 194.495847
-L 605.401973 189.131303
-L 606.12668 185.613657
-L 606.851387 183.515076
-L 607.576094 182.625234
-L 608.300801 182.858336
-L 609.025508 184.221873
-L 609.750215 186.819201
-L 610.474922 190.888062
-L 611.199629 196.910648
-L 611.924336 205.936182
-L 612.649043 220.834142
-L 613.37375 256.795398
-L 614.098457 244.612618
-L 614.823164 217.286535
-L 615.547871 204.360936
-L 616.272578 196.379672
-L 616.997285 191.096602
-L 617.721992 187.633602
-L 618.446699 185.576207
-L 619.171406 184.720928
-L 619.896113 184.986373
-L 620.62082 186.383782
-L 621.345527 189.020894
-L 622.070234 193.142319
-L 622.794941 199.244044
-L 623.519648 208.411206
-L 624.244355 223.652413
-L 624.969062 261.783386
-L 625.69377 244.842864
-L 626.418477 218.613098
-L 627.143184 205.949818
-L 627.867891 198.087445
-L 628.592598 192.873473
-L 629.317305 189.457116
-L 630.042012 187.43509
-L 630.766719 186.609682
-L 631.491426 186.903264
-L 632.216133 188.330332
-L 632.94084 191.002494
-L 633.665547 195.170494
-L 634.390254 201.34277
-L 635.114961 210.637236
-L 635.839668 226.192128
-L 636.564375 266.486922
-L 637.289082 245.18182
-L 638.013789 219.839693
-L 638.738496 207.398213
-L 639.463203 199.637674
-L 640.18791 194.483314
-L 640.912617 191.107422
-L 641.637324 189.116244
-L 642.362031 188.317032
-L 643.086738 188.635433
-L 643.811445 190.088813
-L 644.536152 192.792235
-L 645.260859 197.001986
-L 645.985566 203.237842
-L 646.710273 212.647885
-L 647.43498 228.491905
-L 648.159687 270.96124
-L 649.609102 220.968222
-L 650.333809 208.717595
-L 651.058516 201.045656
-L 651.783223 195.943487
-L 652.50793 192.603198
-L 653.232637 190.639288
-L 653.957344 189.863348
-L 654.682051 190.20391
-L 655.406758 191.680901
-L 656.131465 194.412509
-L 656.856172 198.660072
-L 657.580879 204.95379
-L 658.305586 214.46972
-L 659.030293 230.58234
-L 659.755 275.253958
-L 660.479707 245.9825
-L 661.204414 222.001818
-L 661.929121 209.917904
-L 662.653828 202.324107
-L 663.378535 197.268225
-L 664.103242 193.959649
-L 664.827949 192.020132
-L 665.552656 191.2651
-L 666.277363 191.625664
-L 667.00207 193.124064
-L 667.726777 195.881336
-L 668.451484 200.163467
-L 669.176191 206.510312
-L 669.900898 216.124059
-L 670.625605 232.488036
-L 671.350312 279.407763
-L 672.07502 246.386197
-L 672.799727 222.944069
-L 673.524434 211.007704
-L 674.249141 203.483659
-L 674.973848 198.469299
-L 675.698555 195.189283
-L 676.423262 193.271817
-L 677.147969 192.535762
-L 677.872676 192.914556
-L 678.597383 194.432548
-L 679.32209 197.213396
-L 680.046797 201.5274
-L 680.771504 207.923424
-L 681.496211 217.628232
-L 682.220918 234.229043
-L 682.945625 283.462581
-L 683.670332 246.769353
-L 684.395039 223.79861
-L 685.119746 211.994358
-L 685.844453 204.533245
-L 686.56916 199.556514
-L 687.293867 196.302474
-L 688.018574 194.405133
-L 688.743281 193.686461
-L 689.467988 194.082018
-L 690.192695 195.618092
-L 690.917402 198.420777
-L 691.642109 202.764399
-L 692.366816 209.206291
-L 693.091523 218.996477
-L 693.81623 235.821878
-L 694.540937 287.457531
-L 695.265645 247.121664
-L 695.990352 224.56891
-L 696.715059 212.884184
-L 697.439766 205.480399
-L 698.164473 200.538088
-L 698.88918 197.307885
-L 699.613887 195.429072
-L 700.338594 194.726459
-L 701.063301 195.137554
-L 701.788008 196.690449
-L 702.512715 199.51351
-L 703.237422 203.884858
-L 703.962129 210.369833
-L 704.686836 220.240605
-L 705.411543 237.280288
-L 706.13625 291.432883
-L 706.860957 247.436
-L 707.585664 225.258167
-L 708.310371 213.682599
-L 709.035078 206.3315
-L 709.759785 201.420938
-L 710.484492 198.212792
-L 711.209199 196.351173
-L 711.933906 195.663508
-L 712.658613 196.089117
-L 713.38332 197.657771
-L 714.108027 200.499983
-L 714.832734 204.89746
-L 715.557441 211.423169
-L 716.282148 221.370488
-L 717.006855 238.615811
-L 717.731562 295.432295
-L 718.45627 247.707326
-L 719.180977 225.869259
-L 719.905684 214.394238
-L 720.630391 207.09195
-L 721.355098 202.210906
-L 722.079805 199.023322
-L 722.804512 197.177778
-L 723.529219 196.504131
-L 724.253926 196.94339
-L 724.978633 198.526911
-L 725.70334 201.387238
-L 726.428047 205.809502
-L 727.152754 212.373965
-L 727.877461 222.394431
-L 728.602168 239.838203
-L 729.326875 299.505641
-L 730.051582 247.932016
-L 730.776289 226.404729
-L 731.500996 215.023059
-L 732.225703 207.76633
-L 732.95041 202.912927
-L 733.675117 199.744651
-L 734.399824 197.91424
-L 735.124531 197.253826
-L 735.849238 197.706007
-L 736.573945 199.303643
-L 737.298652 202.181214
-L 738.023359 206.627132
-L 738.748066 213.228685
-L 739.472773 223.31945
-L 740.19748 240.955768
-L 740.922187 303.712976
-L 741.646895 248.107382
-L 742.371602 226.866786
-L 743.096309 215.572421
-L 743.821016 208.358516
-L 744.545723 203.531172
-L 745.27043 200.381145
-L 745.995137 198.565073
-L 746.719844 197.91723
-L 747.444551 198.381723
-L 748.169258 199.99284
-L 748.893965 202.886924
-L 749.618672 207.355547
-L 750.343379 213.992799
-L 751.068086 224.1515
-L 751.792793 241.975612
-L 752.5175 308.130528
-L 753.242207 248.231361
-L 753.966914 227.25731
-L 754.691621 216.045157
-L 755.416328 208.871767
-L 756.141035 204.069151
-L 756.865742 200.93648
-L 757.590449 199.134079
-L 758.315156 198.498252
-L 759.039863 198.974542
-L 759.76457 200.598612
-L 760.489277 203.508598
-L 761.213984 207.999136
-L 761.938691 214.670936
-L 762.663398 224.895641
-L 763.388105 242.903849
-L 764.112813 312.860456
-L 764.83752 248.302295
-L 765.562227 227.577866
-L 766.286934 216.443629
-L 767.011641 209.30881
-L 767.736348 204.529799
-L 768.461055 201.413735
-L 769.185762 199.624445
-L 769.910469 199.000168
-L 770.635176 199.487827
-L 771.359883 201.12441
-L 772.08459 204.049794
-L 772.809297 208.5616
-L 773.534004 215.267012
-L 774.258711 225.556175
-L 774.983418 243.745755
-L 775.708125 318.047947
-L 776.432832 248.318776
-L 777.157539 227.829713
-L 777.882246 216.769775
-L 778.606953 209.671892
-L 779.33166 204.915544
-L 780.056367 201.815461
-L 780.781074 200.038814
-L 781.505781 199.425704
-L 782.230488 199.924379
-L 782.955195 201.573116
-L 783.679902 204.513488
-L 784.404609 209.046042
-L 785.129316 215.784323
-L 785.854023 226.136752
-L 786.57873 244.505904
-L 787.303437 323.913841
-L 788.028145 248.27953
-L 788.752852 228.013817
-L 789.477559 217.02514
-L 790.202266 209.962828
-L 790.926973 205.228363
-L 791.65168 202.143742
-L 792.376387 200.379355
-L 793.101094 199.777096
-L 793.825801 200.286503
-L 794.550508 201.947105
-L 795.275215 204.902143
-L 795.999922 209.45504
-L 796.724629 216.225626
-L 797.449336 226.640461
-L 798.174043 245.188267
-L 798.89875 330.823931
-L 799.623457 248.183332
-L 800.348164 228.130856
-L 801.072871 217.210911
-L 801.797578 210.183042
-L 802.522285 205.469818
-L 803.246992 202.400238
-L 803.971699 200.647802
-L 804.696406 200.056143
-L 805.421113 200.576058
-L 806.14582 202.248304
-L 806.870527 205.217763
-L 807.595234 209.790706
-L 808.319941 216.5932
-L 809.044648 227.069893
-L 809.769355 245.796306
-L 810.494062 339.459693
-L 811.21877 248.028939
-L 811.943477 228.181228
-L 812.668184 217.327932
-L 813.392891 210.333592
-L 814.117598 205.641094
-L 814.842305 202.58622
-L 815.567012 200.845491
-L 816.291719 200.264241
-L 817.016426 200.794496
-L 817.741133 202.478227
-L 818.46584 205.461938
-L 819.190547 210.05473
-L 819.915254 216.888894
-L 820.639961 227.427201
-L 821.364668 246.333038
-L 822.089375 351.346439
-L 822.814082 247.815036
-L 823.538789 228.16505
-L 824.263496 217.376724
-L 824.988203 210.415188
-L 825.71291 205.743016
-L 826.437617 202.702593
-L 827.162324 200.973393
-L 827.887031 200.402414
-L 828.611738 200.942896
-L 829.336445 202.638008
-L 830.061152 205.635872
-L 830.785859 210.248417
-L 831.510566 217.114166
-L 832.235273 227.71414
-L 832.95998 246.801102
-L 833.684687 371.345455
-L 834.409395 247.54019
-L 835.134102 228.08216
-L 835.858809 217.357488
-L 836.583516 210.428209
-L 837.308223 205.776072
-L 838.03293 202.74992
-L 838.757637 201.032128
-L 839.482344 200.471335
-L 840.207051 201.021979
-L 840.931758 202.728427
-L 841.656465 205.740415
-L 842.381172 210.372709
-L 843.105879 217.270112
-L 843.830586 227.932106
-L 844.555293 247.202809
-L 844.555293 247.202809
+ <path clip-path="url(#p3736a39444)" d="M 473.06 52.714545
+L 473.786904 52.849907
+L 474.513809 53.257125
+L 475.240713 53.939642
+L 475.967617 54.903364
+L 476.694521 56.156924
+L 477.421426 57.712094
+L 478.14833 59.584386
+L 478.875234 61.793922
+L 480.329043 67.336375
+L 481.782852 74.657978
+L 483.23666 84.335841
+L 483.963564 90.386206
+L 484.690469 97.567236
+L 485.417373 106.337756
+L 486.144277 117.598375
+L 486.871182 133.557975
+L 487.598086 163.099582
+L 488.32499 183.244087
+L 489.051895 147.494373
+L 489.778799 134.874592
+L 490.505703 128.373166
+L 491.232607 124.972939
+L 491.959512 123.61006
+L 492.686416 123.827712
+L 493.41332 125.442415
+L 494.140225 128.443814
+L 494.867129 132.987023
+L 495.594033 139.468479
+L 496.320937 148.784901
+L 497.047842 163.301972
+L 497.774746 193.422367
+L 498.50165 201.93145
+L 499.228555 168.84569
+L 499.955459 155.363541
+L 500.682363 147.631923
+L 501.409268 142.894431
+L 502.136172 140.133932
+L 502.863076 138.887661
+L 503.58998 138.938562
+L 504.316885 140.212298
+L 505.043789 142.747665
+L 505.770693 146.711614
+L 506.497598 152.473009
+L 507.224502 160.820132
+L 507.951406 173.711943
+L 508.678311 198.572675
+L 509.405215 229.621373
+L 510.132119 184.760006
+L 510.859023 169.16558
+L 511.585928 160.284367
+L 512.312832 154.684096
+L 513.039736 151.173079
+L 513.766641 149.217704
+L 514.493545 148.559743
+L 515.220449 149.090099
+L 515.947354 150.80609
+L 516.674258 153.810499
+L 517.401162 158.351605
+L 518.128066 164.942869
+L 518.854971 174.722596
+L 519.581875 190.906554
+L 520.308779 232.785516
+L 521.762588 185.135682
+L 522.489492 172.999026
+L 523.216396 165.565927
+L 523.943301 160.763827
+L 524.670205 157.764949
+L 525.397109 156.177197
+L 526.124014 155.812
+L 526.850918 156.602782
+L 527.577822 158.58059
+L 528.304727 161.885218
+L 529.031631 166.821333
+L 529.758535 174.017062
+L 530.485439 184.924798
+L 531.212344 204.137891
+L 531.939248 295.889473
+L 532.666152 207.381481
+L 533.393057 187.587418
+L 534.119961 176.94681
+L 534.846865 170.227057
+L 535.57377 165.846685
+L 536.300674 163.132924
+L 537.027578 161.759871
+L 537.754482 161.574171
+L 538.481387 162.532763
+L 539.208291 164.687585
+L 539.935195 168.204179
+L 540.6621 173.430227
+L 541.389004 181.087865
+L 542.115908 192.909074
+L 542.842812 214.936632
+L 543.569717 268.571454
+L 544.296621 207.71478
+L 545.023525 190.366474
+L 545.75043 180.564681
+L 546.477334 174.271739
+L 547.204238 170.153906
+L 547.931143 167.623418
+L 548.658047 166.392699
+L 549.384951 166.329849
+L 550.111855 167.407079
+L 550.83876 169.690985
+L 551.565664 173.366544
+L 552.292568 178.815769
+L 553.019473 186.839454
+L 553.746377 199.418438
+L 554.473281 224.088742
+L 555.200186 253.527465
+L 555.92709 208.98587
+L 556.653994 193.070106
+L 557.380898 183.807304
+L 558.107803 177.799753
+L 558.834707 173.862099
+L 559.561611 171.4602
+L 560.288516 170.331548
+L 561.01542 170.358819
+L 561.742324 171.525103
+L 562.469229 173.908039
+L 563.196133 177.707995
+L 563.923037 183.335212
+L 564.649941 191.657423
+L 565.376846 204.877924
+L 566.10375 232.054819
+L 566.830654 248.123144
+L 567.557559 210.561498
+L 568.284463 195.591264
+L 569.011367 186.705614
+L 569.738271 180.903268
+L 570.465176 177.097604
+L 571.19208 174.791452
+L 571.918984 173.740058
+L 572.645889 173.83672
+L 573.372793 175.072765
+L 574.099697 177.53455
+L 574.826602 181.435037
+L 575.553506 187.208216
+L 576.28041 195.779637
+L 577.007314 209.552704
+L 577.734219 239.129538
+L 578.461123 245.761302
+L 579.188027 212.204476
+L 579.914932 197.908044
+L 580.641836 189.302284
+L 581.36874 183.655289
+L 582.095645 179.950968
+L 582.822549 177.719266
+L 583.549453 176.728723
+L 584.276357 176.880781
+L 585.003262 178.17327
+L 585.730166 180.699665
+L 586.45707 184.683497
+L 587.183975 190.579104
+L 587.910879 199.362652
+L 588.637783 213.618822
+L 589.364687 245.513881
+L 590.091592 244.741101
+L 590.818496 213.815468
+L 591.5454 200.025747
+L 592.272305 191.636882
+L 592.999209 186.112131
+L 593.726113 182.488449
+L 594.453018 180.316592
+L 595.179922 179.375475
+L 595.906826 179.573019
+L 596.63373 180.912362
+L 597.360635 183.492938
+L 598.087539 187.547325
+L 598.814443 193.547575
+L 599.541348 202.514692
+L 600.268252 217.198781
+L 600.995156 251.351978
+L 601.722061 244.401267
+L 602.448965 215.351114
+L 603.175869 201.958047
+L 603.902773 193.742958
+L 604.629678 188.317355
+L 605.356582 184.759671
+L 606.083486 182.637205
+L 606.810391 181.737234
+L 607.537295 181.972989
+L 608.264199 183.352046
+L 608.991104 185.978937
+L 609.718008 190.094109
+L 610.444912 196.185244
+L 611.171816 205.313505
+L 611.898721 220.381033
+L 612.625625 256.751598
+L 613.352529 244.430154
+L 614.079434 216.793048
+L 614.806338 203.72033
+L 615.533242 195.648224
+L 616.260146 190.305023
+L 616.987051 186.802607
+L 617.713955 184.721795
+L 618.440859 183.856781
+L 619.167764 184.125248
+L 619.894668 185.538562
+L 620.621572 188.205689
+L 621.348477 192.374023
+L 622.075381 198.545198
+L 622.802285 207.816701
+L 623.529189 223.231382
+L 624.256094 261.796358
+L 624.982998 244.66302
+L 625.709902 218.134709
+L 626.436807 205.327297
+L 627.163711 197.375435
+L 627.890615 192.102118
+L 628.61752 188.646876
+L 629.344424 186.601836
+L 630.071328 185.767033
+L 630.798232 186.063956
+L 631.525137 187.507267
+L 632.252041 190.209844
+L 632.978945 194.425284
+L 633.70585 200.667812
+L 634.432754 210.068067
+L 635.159658 225.800003
+L 635.886562 266.55343
+L 636.613467 245.005835
+L 637.340371 219.375265
+L 638.067275 206.792178
+L 638.79418 198.943309
+L 639.521084 193.730282
+L 640.247988 190.315966
+L 640.974893 188.302125
+L 641.701797 187.493816
+L 642.428701 187.815841
+L 643.155605 189.285763
+L 643.88251 192.019956
+L 644.609414 196.277621
+L 645.336318 202.584453
+L 646.063223 212.1016
+L 646.790127 228.125956
+L 647.517031 271.078674
+L 648.97084 220.516639
+L 649.697744 208.126577
+L 650.424648 200.367316
+L 651.151553 195.207074
+L 651.878457 191.828766
+L 652.605361 189.842504
+L 653.332266 189.057732
+L 654.05917 189.40217
+L 654.786074 190.895973
+L 655.512979 193.658672
+L 656.239883 197.95458
+L 656.966787 204.319932
+L 657.693691 213.944171
+L 658.420596 230.240184
+L 659.1475 275.420252
+L 659.874404 245.815628
+L 660.601309 221.561999
+L 661.328213 209.340547
+L 662.055117 201.660318
+L 662.782021 196.546891
+L 663.508926 193.200657
+L 664.23583 191.239064
+L 664.962734 190.475438
+L 665.689639 190.840106
+L 666.416543 192.355561
+L 667.143447 195.144216
+L 667.870352 199.475086
+L 668.597256 205.89417
+L 669.32416 215.617341
+L 670.051064 232.167571
+L 670.777969 279.621335
+L 671.504873 246.22392
+L 672.231777 222.514976
+L 672.958682 210.442752
+L 673.685586 202.833068
+L 674.41249 197.761636
+L 675.139395 194.444287
+L 675.866299 192.504996
+L 676.593203 191.760563
+L 677.320107 192.143668
+L 678.047012 193.678938
+L 678.773916 196.491438
+L 679.50082 200.854543
+L 680.227725 207.323366
+L 680.954629 217.138634
+L 681.681533 233.928394
+L 682.408437 283.722304
+L 683.135342 246.611437
+L 683.862246 223.379243
+L 684.58915 211.440636
+L 685.316055 203.8946
+L 686.042959 198.861225
+L 686.769863 195.570148
+L 687.496768 193.651211
+L 688.223672 192.92436
+L 688.950576 193.324418
+L 689.67748 194.877976
+L 690.404385 197.712561
+L 691.131289 202.105622
+L 691.858193 208.620835
+L 692.585098 218.522452
+L 693.312002 235.539359
+L 694.038906 287.762724
+L 694.765811 246.967758
+L 695.492715 224.15831
+L 696.219619 212.340589
+L 696.946523 204.852535
+L 697.673428 199.853971
+L 698.400332 196.587003
+L 699.127236 194.686805
+L 699.854141 193.976194
+L 700.581045 194.391969
+L 701.307949 195.962538
+L 702.034854 198.817732
+L 702.761758 203.238834
+L 703.488662 209.79762
+L 704.215566 219.780741
+L 704.942471 237.014368
+L 705.669375 291.783324
+L 706.396279 247.285671
+L 707.123184 224.855412
+L 707.850088 213.148092
+L 708.576992 205.713323
+L 709.303896 200.74687
+L 710.030801 197.502208
+L 710.757705 195.6194
+L 711.484609 194.923909
+L 712.211514 195.354362
+L 712.938418 196.940871
+L 713.665322 199.815432
+L 714.392227 204.262962
+L 715.119131 210.862946
+L 715.846035 220.923484
+L 716.572939 238.365092
+L 717.299844 295.828257
+L 718.026748 247.560086
+L 718.753652 225.473459
+L 719.480557 213.867831
+L 720.207461 206.482428
+L 720.934365 201.545829
+L 721.66127 198.321964
+L 722.388174 196.455414
+L 723.115078 195.7741
+L 723.841982 196.218358
+L 724.568887 197.819903
+L 725.295791 200.712786
+L 726.022695 205.185384
+L 726.7496 211.824563
+L 727.476504 221.959081
+L 728.203408 239.601397
+L 728.930312 299.947965
+L 729.657217 247.787334
+L 730.384121 226.015024
+L 731.111025 214.503809
+L 731.83793 207.164485
+L 732.564834 202.255841
+L 733.291738 199.051503
+L 734.018643 197.200259
+L 734.745547 196.532328
+L 735.472451 196.989656
+L 736.199355 198.605476
+L 736.92626 201.515799
+L 737.653164 206.01232
+L 738.380068 212.689011
+L 739.106973 222.894629
+L 739.833877 240.731682
+L 740.560781 304.203188
+L 741.287686 247.964695
+L 742.01459 226.482341
+L 742.741494 215.059424
+L 743.468398 207.76341
+L 744.195303 202.881122
+L 744.922207 199.695241
+L 745.649111 197.858499
+L 746.376016 197.203283
+L 747.10292 197.673062
+L 747.829824 199.302517
+L 748.556729 202.229542
+L 749.283633 206.749026
+L 750.010537 213.461822
+L 750.737441 223.73615
+L 751.464346 241.763134
+L 752.19125 308.67102
+L 752.918154 248.090085
+L 753.645059 226.87731
+L 754.371963 215.53754
+L 755.098867 208.282504
+L 755.825771 203.425224
+L 756.552676 200.256898
+L 757.27958 198.433982
+L 758.006484 197.790918
+L 758.733389 198.272629
+L 759.460293 199.915184
+L 760.187197 202.858291
+L 760.914102 207.39994
+L 761.641006 214.147678
+L 762.36791 224.48876
+L 763.094814 242.701936
+L 763.821719 313.454784
+L 764.548623 248.161826
+L 765.275527 227.201514
+L 766.002432 215.940548
+L 766.729336 208.724521
+L 767.45624 203.891115
+L 768.183145 200.739584
+L 768.910049 198.929929
+L 769.636953 198.298547
+L 770.363857 198.791756
+L 771.090762 200.446967
+L 771.817666 203.405647
+L 772.54457 207.968806
+L 773.271475 214.750539
+L 773.998379 225.156812
+L 774.725283 243.553425
+L 775.452187 318.701318
+L 776.179092 248.178495
+L 776.905996 227.456228
+L 777.6329 216.270406
+L 778.359805 209.091735
+L 779.086709 204.281251
+L 779.813613 201.145883
+L 780.540518 199.349015
+L 781.267422 198.728926
+L 781.994326 199.233277
+L 782.72123 200.900779
+L 783.448135 203.874618
+L 784.175039 208.458762
+L 784.901943 215.273738
+L 785.628848 225.743997
+L 786.355752 244.322225
+L 787.082656 324.633978
+L 787.809561 248.138803
+L 788.536465 227.642427
+L 789.263369 216.528677
+L 789.990273 209.385983
+L 790.717178 204.59763
+L 791.444082 201.477901
+L 792.170986 199.693432
+L 792.897891 199.084317
+L 793.624795 199.599523
+L 794.351699 201.279026
+L 795.078604 204.267697
+L 795.805508 208.872415
+L 796.532412 215.720064
+L 797.259316 226.253439
+L 797.986221 245.012356
+L 798.713125 331.622718
+L 799.440029 248.04151
+L 800.166934 227.760798
+L 800.893838 216.716562
+L 801.620742 209.608703
+L 802.347646 204.841834
+L 803.074551 201.737316
+L 803.801455 199.964933
+L 804.528359 199.36654
+L 805.255264 199.892373
+L 805.982168 201.583653
+L 806.709072 204.58691
+L 807.435977 209.211901
+L 808.162881 216.091821
+L 808.889785 226.687759
+L 809.616689 245.627315
+L 810.343594 340.356772
+L 811.070498 247.885359
+L 811.797402 227.811743
+L 812.524307 216.834916
+L 813.251211 209.760966
+L 813.978115 205.015059
+L 814.70502 201.925414
+L 815.431924 200.164873
+L 816.158828 199.577007
+L 816.885732 200.113298
+L 817.612637 201.816192
+L 818.339541 204.833863
+L 819.066445 209.478931
+L 819.79335 216.39088
+L 820.520254 227.049134
+L 821.247158 246.170156
+L 821.974062 352.378812
+L 822.700967 247.669022
+L 823.427871 227.795381
+L 824.154775 216.884263
+L 824.88168 209.843491
+L 825.608584 205.118142
+L 826.335488 202.043112
+L 827.062393 200.294231
+L 827.789297 199.716753
+L 828.516201 200.263386
+L 829.243105 201.977792
+L 829.97001 205.009778
+L 830.696914 209.674822
+L 831.423818 216.618716
+L 832.150723 227.339339
+L 832.877627 246.643547
+L 833.604531 372.605455
+L 834.331436 247.391048
+L 835.05834 227.711548
+L 835.785244 216.864808
+L 836.512148 209.856661
+L 837.239053 205.151573
+L 837.965957 202.090978
+L 838.692861 200.353635
+L 839.419766 199.786458
+L 840.14667 200.34337
+L 840.873574 202.06924
+L 841.600479 205.115511
+L 842.327383 209.800529
+L 843.054287 216.776438
+L 843.781191 227.559786
+L 844.508096 247.049827
+L 844.508096 247.049827
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
</g>
<g id="patch_8">
- <path d="M 474.23 387.16
-L 474.23 39.24
+ <path d="M 473.06 388.6
+L 473.06 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_9">
- <path d="M 845.28 387.16
-L 845.28 39.24
+ <path d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_10">
- <path d="M 474.23 387.16
-L 845.28 387.16
+ <path d="M 473.06 388.6
+L 845.235 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_11">
- <path d="M 474.23 39.24
-L 845.28 39.24
+ <path d="M 473.06 36.72
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
@@ -2203,11 +2203,11 @@ z
</g>
</g>
<defs>
- <clipPath id="pd87578ca95">
- <rect height="347.92" width="371.05" x="47.72" y="39.24"/>
+ <clipPath id="p61146dcf68">
+ <rect height="351.88" width="372.175" x="47.855" y="36.72"/>
</clipPath>
- <clipPath id="pa16bc3513c">
- <rect height="347.92" width="371.05" x="474.23" y="39.24"/>
+ <clipPath id="p3736a39444">
+ <rect height="351.88" width="372.175" x="473.06" y="36.72"/>
</clipPath>
</defs>
</svg>
diff --git a/docs/docs/img/window_lanczos.svg b/docs/docs/img/window_lanczos.svg
@@ -19,28 +19,28 @@ z
</g>
<g id="axes_1">
<g id="patch_2">
- <path d="M 47.72 387.16
-L 418.77 387.16
-L 418.77 39.24
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 420.03 388.6
+L 420.03 36.72
+L 47.855 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
- <path clip-path="url(#p474020f3d9)" d="M 47.72 387.16
-L 47.72 39.24
+ <path clip-path="url(#p2c6b1ef163)" d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
-" id="mc87c468ee3" style="stroke:#000000;stroke-width:0.8;"/>
+" id="m9dba40b40b" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mc87c468ee3" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m9dba40b40b" y="388.6"/>
</g>
</g>
<g id="text_1">
@@ -68,20 +68,20 @@ Q 19.53125 74.21875 31.78125 74.21875
z
" id="DejaVuSans-48"/>
</defs>
- <g transform="translate(44.53875 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(44.67375 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
- <path clip-path="url(#p474020f3d9)" d="M 106.616825 387.16
-L 106.616825 39.24
+ <path clip-path="url(#p2c6b1ef163)" d="M 106.930397 388.6
+L 106.930397 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="106.616825" xlink:href="#mc87c468ee3" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="106.930397" xlink:href="#m9dba40b40b" y="388.6"/>
</g>
</g>
<g id="text_2">
@@ -101,7 +101,7 @@ L 12.40625 0
z
" id="DejaVuSans-49"/>
</defs>
- <g transform="translate(100.254325 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(100.567897 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -109,13 +109,13 @@ z
</g>
<g id="xtick_3">
<g id="line2d_5">
- <path clip-path="url(#p474020f3d9)" d="M 165.513651 387.16
-L 165.513651 39.24
+ <path clip-path="url(#p2c6b1ef163)" d="M 166.005794 388.6
+L 166.005794 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="165.513651" xlink:href="#mc87c468ee3" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="166.005794" xlink:href="#m9dba40b40b" y="388.6"/>
</g>
</g>
<g id="text_3">
@@ -146,7 +146,7 @@ Q 31.109375 20.453125 19.1875 8.296875
z
" id="DejaVuSans-50"/>
</defs>
- <g transform="translate(159.151151 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(159.643294 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -154,13 +154,13 @@ z
</g>
<g id="xtick_4">
<g id="line2d_7">
- <path clip-path="url(#p474020f3d9)" d="M 224.410476 387.16
-L 224.410476 39.24
+ <path clip-path="url(#p2c6b1ef163)" d="M 225.08119 388.6
+L 225.08119 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_8">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="224.410476" xlink:href="#mc87c468ee3" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="225.08119" xlink:href="#m9dba40b40b" y="388.6"/>
</g>
</g>
<g id="text_4">
@@ -199,7 +199,7 @@ Q 46.96875 40.921875 40.578125 39.3125
z
" id="DejaVuSans-51"/>
</defs>
- <g transform="translate(218.047976 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(218.71869 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-51"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -207,13 +207,13 @@ z
</g>
<g id="xtick_5">
<g id="line2d_9">
- <path clip-path="url(#p474020f3d9)" d="M 283.307302 387.16
-L 283.307302 39.24
+ <path clip-path="url(#p2c6b1ef163)" d="M 284.156587 388.6
+L 284.156587 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_10">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="283.307302" xlink:href="#mc87c468ee3" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="284.156587" xlink:href="#m9dba40b40b" y="388.6"/>
</g>
</g>
<g id="text_5">
@@ -237,7 +237,7 @@ L 4.890625 26.703125
z
" id="DejaVuSans-52"/>
</defs>
- <g transform="translate(276.944802 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(277.794087 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-52"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -245,13 +245,13 @@ z
</g>
<g id="xtick_6">
<g id="line2d_11">
- <path clip-path="url(#p474020f3d9)" d="M 342.204127 387.16
-L 342.204127 39.24
+ <path clip-path="url(#p2c6b1ef163)" d="M 343.231984 388.6
+L 343.231984 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_12">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="342.204127" xlink:href="#mc87c468ee3" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="343.231984" xlink:href="#m9dba40b40b" y="388.6"/>
</g>
</g>
<g id="text_6">
@@ -282,7 +282,7 @@ Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-53"/>
</defs>
- <g transform="translate(335.841627 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(336.869484 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-53"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -290,13 +290,13 @@ z
</g>
<g id="xtick_7">
<g id="line2d_13">
- <path clip-path="url(#p474020f3d9)" d="M 401.100952 387.16
-L 401.100952 39.24
+ <path clip-path="url(#p2c6b1ef163)" d="M 402.307381 388.6
+L 402.307381 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_14">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="401.100952" xlink:href="#mc87c468ee3" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="402.307381" xlink:href="#m9dba40b40b" y="388.6"/>
</g>
</g>
<g id="text_7">
@@ -333,7 +333,7 @@ Q 48.484375 72.75 52.59375 71.296875
z
" id="DejaVuSans-54"/>
</defs>
- <g transform="translate(394.738452 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(395.944881 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-54"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -523,7 +523,7 @@ Q 40.578125 54.546875 44.28125 53.078125
z
" id="DejaVuSans-115"/>
</defs>
- <g transform="translate(211.891875 415.436563)scale(0.1 -0.1)">
+ <g transform="translate(212.589375 416.876562)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-83"/>
<use x="63.476562" xlink:href="#DejaVuSans-97"/>
<use x="124.755859" xlink:href="#DejaVuSans-109"/>
@@ -537,18 +537,18 @@ z
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_15">
- <path clip-path="url(#p474020f3d9)" d="M 47.72 387.16
-L 418.77 387.16
+ <path clip-path="url(#p2c6b1ef163)" d="M 47.855 388.6
+L 420.03 388.6
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_16">
<defs>
<path d="M 0 0
L -3.5 0
-" id="mb88f302533" style="stroke:#000000;stroke-width:0.8;"/>
+" id="m2b39638b15" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mb88f302533" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m2b39638b15" y="388.6"/>
</g>
</g>
<g id="text_9">
@@ -561,7 +561,7 @@ L 10.6875 0
z
" id="DejaVuSans-46"/>
</defs>
- <g transform="translate(24.816875 390.959219)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 392.399219)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -570,18 +570,18 @@ z
</g>
<g id="ytick_2">
<g id="line2d_17">
- <path clip-path="url(#p474020f3d9)" d="M 47.72 320.86205
-L 418.77 320.86205
+ <path clip-path="url(#p2c6b1ef163)" d="M 47.855 321.547452
+L 420.03 321.547452
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_18">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mb88f302533" y="320.86205"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m2b39638b15" y="321.547452"/>
</g>
</g>
<g id="text_10">
<!-- 0.2 -->
- <g transform="translate(24.816875 324.661269)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 325.346671)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -590,18 +590,18 @@ L 418.77 320.86205
</g>
<g id="ytick_3">
<g id="line2d_19">
- <path clip-path="url(#p474020f3d9)" d="M 47.72 254.564101
-L 418.77 254.564101
+ <path clip-path="url(#p2c6b1ef163)" d="M 47.855 254.494904
+L 420.03 254.494904
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_20">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mb88f302533" y="254.564101"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m2b39638b15" y="254.494904"/>
</g>
</g>
<g id="text_11">
<!-- 0.4 -->
- <g transform="translate(24.816875 258.363319)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 258.294123)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -610,18 +610,18 @@ L 418.77 254.564101
</g>
<g id="ytick_4">
<g id="line2d_21">
- <path clip-path="url(#p474020f3d9)" d="M 47.72 188.266151
-L 418.77 188.266151
+ <path clip-path="url(#p2c6b1ef163)" d="M 47.855 187.442356
+L 420.03 187.442356
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_22">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mb88f302533" y="188.266151"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m2b39638b15" y="187.442356"/>
</g>
</g>
<g id="text_12">
<!-- 0.6 -->
- <g transform="translate(24.816875 192.06537)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 191.241575)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -630,13 +630,13 @@ L 418.77 188.266151
</g>
<g id="ytick_5">
<g id="line2d_23">
- <path clip-path="url(#p474020f3d9)" d="M 47.72 121.968201
-L 418.77 121.968201
+ <path clip-path="url(#p2c6b1ef163)" d="M 47.855 120.389808
+L 420.03 120.389808
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_24">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mb88f302533" y="121.968201"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m2b39638b15" y="120.389808"/>
</g>
</g>
<g id="text_13">
@@ -682,7 +682,7 @@ Q 18.3125 60.0625 18.3125 54.390625
z
" id="DejaVuSans-56"/>
</defs>
- <g transform="translate(24.816875 125.76742)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 124.189026)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -691,18 +691,18 @@ z
</g>
<g id="ytick_6">
<g id="line2d_25">
- <path clip-path="url(#p474020f3d9)" d="M 47.72 55.670252
-L 418.77 55.670252
+ <path clip-path="url(#p2c6b1ef163)" d="M 47.855 53.33726
+L 420.03 53.33726
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_26">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mb88f302533" y="55.670252"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#m2b39638b15" y="53.33726"/>
</g>
</g>
<g id="text_14">
<!-- 1.0 -->
- <g transform="translate(24.816875 59.46947)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 57.136478)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -805,7 +805,7 @@ Q 14.796875 37.203125 14.796875 27.296875
z
" id="DejaVuSans-100"/>
</defs>
- <g transform="translate(18.737188 238.822656)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(18.872187 238.282656)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-65"/>
<use x="68.408203" xlink:href="#DejaVuSans-109"/>
<use x="165.820312" xlink:href="#DejaVuSans-112"/>
@@ -819,70 +819,70 @@ z
</g>
</g>
<g id="line2d_27">
- <path clip-path="url(#p474020f3d9)" d="M 47.72 387.16
-L 53.609683 376.309492
-L 59.499365 364.83485
-L 65.389048 352.784632
-L 71.27873 340.212095
-L 77.168413 327.174884
-L 83.058095 313.734685
-L 88.947778 299.956846
-L 94.83746 285.909967
-L 100.727143 271.665469
-L 106.616825 257.297126
-L 112.506508 242.880586
-L 118.39619 228.492874
-L 124.285873 214.211878
-L 130.175556 200.115823
-L 136.065238 186.282746
-L 141.954921 172.789966
-L 147.844603 159.713549
-L 153.734286 147.127793
-L 159.623968 135.104707
-L 165.513651 123.713518
-L 171.403333 113.020185
-L 177.293016 103.086941
-L 183.182698 93.971855
-L 189.072381 85.728427
-L 194.962063 78.405208
-L 200.851746 72.045461
-L 206.741429 66.686854
-L 212.631111 62.361195
-L 218.520794 59.094202
-L 224.410476 56.905329
-L 230.300159 55.807619
-L 236.189841 55.807619
-L 242.079524 56.905329
-L 247.969206 59.094202
-L 253.858889 62.361195
-L 259.748571 66.686854
-L 265.638254 72.045461
-L 271.527937 78.405208
-L 277.417619 85.728427
-L 283.307302 93.971855
-L 289.196984 103.086941
-L 295.086667 113.020185
-L 300.976349 123.713518
-L 306.866032 135.104707
-L 312.755714 147.127793
-L 318.645397 159.713549
-L 324.535079 172.789966
-L 330.424762 186.282746
-L 336.314444 200.115823
-L 342.204127 214.211878
-L 348.09381 228.492874
-L 353.983492 242.880586
-L 359.873175 257.297126
-L 365.762857 271.665469
-L 371.65254 285.909967
-L 377.542222 299.956846
-L 383.431905 313.734685
-L 389.321587 327.174884
-L 395.21127 340.212095
-L 401.100952 352.784632
-L 406.990635 364.83485
-L 412.880317 376.309492
-L 418.77 387.16
+ <path clip-path="url(#p2c6b1ef163)" d="M 47.855 388.6
+L 53.76254 377.625993
+L 59.670079 366.020747
+L 65.577619 353.833374
+L 71.485159 341.117737
+L 77.392698 327.932138
+L 83.300238 314.338964
+L 89.207778 300.404306
+L 95.115317 286.197547
+L 101.022857 271.790919
+L 106.930397 257.259036
+L 112.837937 242.678408
+L 118.745476 228.126937
+L 124.653016 213.683395
+L 130.560556 199.426899
+L 136.468095 185.436376
+L 142.375635 171.790022
+L 148.283175 158.56477
+L 154.190714 145.835764
+L 160.098254 133.675832
+L 166.005794 122.154989
+L 171.913333 111.339946
+L 177.820873 101.293642
+L 183.728413 92.074809
+L 189.635952 83.737554
+L 195.543492 76.330983
+L 201.451032 69.89885
+L 207.358571 64.479252
+L 213.266111 60.104358
+L 219.173651 56.800181
+L 225.08119 54.586394
+L 230.98873 53.47619
+L 236.89627 53.47619
+L 242.80381 54.586394
+L 248.711349 56.800181
+L 254.618889 60.104358
+L 260.526429 64.479252
+L 266.433968 69.89885
+L 272.341508 76.330983
+L 278.249048 83.737554
+L 284.156587 92.074809
+L 290.064127 101.293642
+L 295.971667 111.339946
+L 301.879206 122.154989
+L 307.786746 133.675832
+L 313.694286 145.835764
+L 319.601825 158.56477
+L 325.509365 171.790022
+L 331.416905 185.436376
+L 337.324444 199.426899
+L 343.231984 213.683395
+L 349.139524 228.126937
+L 355.047063 242.678408
+L 360.954603 257.259036
+L 366.862143 271.790919
+L 372.769683 286.197547
+L 378.677222 300.404306
+L 384.584762 314.338964
+L 390.492302 327.932138
+L 396.399841 341.117737
+L 402.307381 353.833374
+L 408.214921 366.020747
+L 414.12246 377.625993
+L 420.03 388.6
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
<defs>
<path d="M 0 1.5
@@ -895,120 +895,120 @@ C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0
C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066
C -0.77937 1.341951 -0.397805 1.5 0 1.5
z
-" id="mecbbe6fafc" style="stroke:#0072bd;"/>
+" id="m5e8e9090b8" style="stroke:#0072bd;"/>
</defs>
- <g clip-path="url(#p474020f3d9)">
- <use style="fill:#0072bd;stroke:#0072bd;" x="47.72" xlink:href="#mecbbe6fafc" y="387.16"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="53.609683" xlink:href="#mecbbe6fafc" y="376.309492"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="59.499365" xlink:href="#mecbbe6fafc" y="364.83485"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="65.389048" xlink:href="#mecbbe6fafc" y="352.784632"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="71.27873" xlink:href="#mecbbe6fafc" y="340.212095"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="77.168413" xlink:href="#mecbbe6fafc" y="327.174884"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="83.058095" xlink:href="#mecbbe6fafc" y="313.734685"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="88.947778" xlink:href="#mecbbe6fafc" y="299.956846"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="94.83746" xlink:href="#mecbbe6fafc" y="285.909967"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="100.727143" xlink:href="#mecbbe6fafc" y="271.665469"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="106.616825" xlink:href="#mecbbe6fafc" y="257.297126"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="112.506508" xlink:href="#mecbbe6fafc" y="242.880586"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="118.39619" xlink:href="#mecbbe6fafc" y="228.492874"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="124.285873" xlink:href="#mecbbe6fafc" y="214.211878"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="130.175556" xlink:href="#mecbbe6fafc" y="200.115823"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="136.065238" xlink:href="#mecbbe6fafc" y="186.282746"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="141.954921" xlink:href="#mecbbe6fafc" y="172.789966"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="147.844603" xlink:href="#mecbbe6fafc" y="159.713549"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="153.734286" xlink:href="#mecbbe6fafc" y="147.127793"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="159.623968" xlink:href="#mecbbe6fafc" y="135.104707"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="165.513651" xlink:href="#mecbbe6fafc" y="123.713518"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="171.403333" xlink:href="#mecbbe6fafc" y="113.020185"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="177.293016" xlink:href="#mecbbe6fafc" y="103.086941"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="183.182698" xlink:href="#mecbbe6fafc" y="93.971855"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="189.072381" xlink:href="#mecbbe6fafc" y="85.728427"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="194.962063" xlink:href="#mecbbe6fafc" y="78.405208"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="200.851746" xlink:href="#mecbbe6fafc" y="72.045461"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="206.741429" xlink:href="#mecbbe6fafc" y="66.686854"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="212.631111" xlink:href="#mecbbe6fafc" y="62.361195"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="218.520794" xlink:href="#mecbbe6fafc" y="59.094202"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="224.410476" xlink:href="#mecbbe6fafc" y="56.905329"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="230.300159" xlink:href="#mecbbe6fafc" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="236.189841" xlink:href="#mecbbe6fafc" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="242.079524" xlink:href="#mecbbe6fafc" y="56.905329"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="247.969206" xlink:href="#mecbbe6fafc" y="59.094202"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="253.858889" xlink:href="#mecbbe6fafc" y="62.361195"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="259.748571" xlink:href="#mecbbe6fafc" y="66.686854"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="265.638254" xlink:href="#mecbbe6fafc" y="72.045461"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="271.527937" xlink:href="#mecbbe6fafc" y="78.405208"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="277.417619" xlink:href="#mecbbe6fafc" y="85.728427"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="283.307302" xlink:href="#mecbbe6fafc" y="93.971855"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="289.196984" xlink:href="#mecbbe6fafc" y="103.086941"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="295.086667" xlink:href="#mecbbe6fafc" y="113.020185"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="300.976349" xlink:href="#mecbbe6fafc" y="123.713518"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="306.866032" xlink:href="#mecbbe6fafc" y="135.104707"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="312.755714" xlink:href="#mecbbe6fafc" y="147.127793"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="318.645397" xlink:href="#mecbbe6fafc" y="159.713549"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="324.535079" xlink:href="#mecbbe6fafc" y="172.789966"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="330.424762" xlink:href="#mecbbe6fafc" y="186.282746"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="336.314444" xlink:href="#mecbbe6fafc" y="200.115823"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="342.204127" xlink:href="#mecbbe6fafc" y="214.211878"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="348.09381" xlink:href="#mecbbe6fafc" y="228.492874"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="353.983492" xlink:href="#mecbbe6fafc" y="242.880586"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="359.873175" xlink:href="#mecbbe6fafc" y="257.297126"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="365.762857" xlink:href="#mecbbe6fafc" y="271.665469"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="371.65254" xlink:href="#mecbbe6fafc" y="285.909967"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="377.542222" xlink:href="#mecbbe6fafc" y="299.956846"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="383.431905" xlink:href="#mecbbe6fafc" y="313.734685"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="389.321587" xlink:href="#mecbbe6fafc" y="327.174884"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="395.21127" xlink:href="#mecbbe6fafc" y="340.212095"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="401.100952" xlink:href="#mecbbe6fafc" y="352.784632"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="406.990635" xlink:href="#mecbbe6fafc" y="364.83485"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="412.880317" xlink:href="#mecbbe6fafc" y="376.309492"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="418.77" xlink:href="#mecbbe6fafc" y="387.16"/>
+ <g clip-path="url(#p2c6b1ef163)">
+ <use style="fill:#0072bd;stroke:#0072bd;" x="47.855" xlink:href="#m5e8e9090b8" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="53.76254" xlink:href="#m5e8e9090b8" y="377.625993"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="59.670079" xlink:href="#m5e8e9090b8" y="366.020747"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="65.577619" xlink:href="#m5e8e9090b8" y="353.833374"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="71.485159" xlink:href="#m5e8e9090b8" y="341.117737"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="77.392698" xlink:href="#m5e8e9090b8" y="327.932138"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="83.300238" xlink:href="#m5e8e9090b8" y="314.338964"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="89.207778" xlink:href="#m5e8e9090b8" y="300.404306"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="95.115317" xlink:href="#m5e8e9090b8" y="286.197547"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="101.022857" xlink:href="#m5e8e9090b8" y="271.790919"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="106.930397" xlink:href="#m5e8e9090b8" y="257.259036"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="112.837937" xlink:href="#m5e8e9090b8" y="242.678408"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="118.745476" xlink:href="#m5e8e9090b8" y="228.126937"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="124.653016" xlink:href="#m5e8e9090b8" y="213.683395"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="130.560556" xlink:href="#m5e8e9090b8" y="199.426899"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="136.468095" xlink:href="#m5e8e9090b8" y="185.436376"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="142.375635" xlink:href="#m5e8e9090b8" y="171.790022"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="148.283175" xlink:href="#m5e8e9090b8" y="158.56477"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="154.190714" xlink:href="#m5e8e9090b8" y="145.835764"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="160.098254" xlink:href="#m5e8e9090b8" y="133.675832"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="166.005794" xlink:href="#m5e8e9090b8" y="122.154989"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="171.913333" xlink:href="#m5e8e9090b8" y="111.339946"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="177.820873" xlink:href="#m5e8e9090b8" y="101.293642"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="183.728413" xlink:href="#m5e8e9090b8" y="92.074809"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="189.635952" xlink:href="#m5e8e9090b8" y="83.737554"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="195.543492" xlink:href="#m5e8e9090b8" y="76.330983"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="201.451032" xlink:href="#m5e8e9090b8" y="69.89885"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="207.358571" xlink:href="#m5e8e9090b8" y="64.479252"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="213.266111" xlink:href="#m5e8e9090b8" y="60.104358"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="219.173651" xlink:href="#m5e8e9090b8" y="56.800181"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="225.08119" xlink:href="#m5e8e9090b8" y="54.586394"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="230.98873" xlink:href="#m5e8e9090b8" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="236.89627" xlink:href="#m5e8e9090b8" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="242.80381" xlink:href="#m5e8e9090b8" y="54.586394"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="248.711349" xlink:href="#m5e8e9090b8" y="56.800181"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="254.618889" xlink:href="#m5e8e9090b8" y="60.104358"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="260.526429" xlink:href="#m5e8e9090b8" y="64.479252"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="266.433968" xlink:href="#m5e8e9090b8" y="69.89885"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="272.341508" xlink:href="#m5e8e9090b8" y="76.330983"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="278.249048" xlink:href="#m5e8e9090b8" y="83.737554"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="284.156587" xlink:href="#m5e8e9090b8" y="92.074809"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="290.064127" xlink:href="#m5e8e9090b8" y="101.293642"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="295.971667" xlink:href="#m5e8e9090b8" y="111.339946"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="301.879206" xlink:href="#m5e8e9090b8" y="122.154989"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="307.786746" xlink:href="#m5e8e9090b8" y="133.675832"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="313.694286" xlink:href="#m5e8e9090b8" y="145.835764"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="319.601825" xlink:href="#m5e8e9090b8" y="158.56477"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="325.509365" xlink:href="#m5e8e9090b8" y="171.790022"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="331.416905" xlink:href="#m5e8e9090b8" y="185.436376"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="337.324444" xlink:href="#m5e8e9090b8" y="199.426899"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="343.231984" xlink:href="#m5e8e9090b8" y="213.683395"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="349.139524" xlink:href="#m5e8e9090b8" y="228.126937"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="355.047063" xlink:href="#m5e8e9090b8" y="242.678408"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="360.954603" xlink:href="#m5e8e9090b8" y="257.259036"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="366.862143" xlink:href="#m5e8e9090b8" y="271.790919"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="372.769683" xlink:href="#m5e8e9090b8" y="286.197547"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="378.677222" xlink:href="#m5e8e9090b8" y="300.404306"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="384.584762" xlink:href="#m5e8e9090b8" y="314.338964"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="390.492302" xlink:href="#m5e8e9090b8" y="327.932138"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="396.399841" xlink:href="#m5e8e9090b8" y="341.117737"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="402.307381" xlink:href="#m5e8e9090b8" y="353.833374"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="408.214921" xlink:href="#m5e8e9090b8" y="366.020747"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="414.12246" xlink:href="#m5e8e9090b8" y="377.625993"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="420.03" xlink:href="#m5e8e9090b8" y="388.6"/>
</g>
</g>
<g id="patch_3">
- <path d="M 47.72 387.16
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
- <path d="M 418.77 387.16
-L 418.77 39.24
+ <path d="M 420.03 388.6
+L 420.03 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
- <path d="M 47.72 387.16
-L 418.77 387.16
+ <path d="M 47.855 388.6
+L 420.03 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
- <path d="M 47.72 39.24
-L 418.77 39.24
+ <path d="M 47.855 36.72
+L 420.03 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
<g id="axes_2">
<g id="patch_7">
- <path d="M 474.23 387.16
-L 845.28 387.16
-L 845.28 39.24
-L 474.23 39.24
+ <path d="M 473.06 388.6
+L 845.235 388.6
+L 845.235 36.72
+L 473.06 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_3">
<g id="xtick_8">
<g id="line2d_28">
- <path clip-path="url(#p05bb25f7b1)" d="M 474.23 387.16
-L 474.23 39.24
+ <path clip-path="url(#pd465dffb33)" d="M 473.06 388.6
+L 473.06 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_29">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#mc87c468ee3" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#m9dba40b40b" y="388.6"/>
</g>
</g>
<g id="text_16">
<!-- 0.0 -->
- <g transform="translate(466.278437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(465.108437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1017,18 +1017,18 @@ L 474.23 39.24
</g>
<g id="xtick_9">
<g id="line2d_30">
- <path clip-path="url(#p05bb25f7b1)" d="M 548.44 387.16
-L 548.44 39.24
+ <path clip-path="url(#pd465dffb33)" d="M 547.495 388.6
+L 547.495 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_31">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="548.44" xlink:href="#mc87c468ee3" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="547.495" xlink:href="#m9dba40b40b" y="388.6"/>
</g>
</g>
<g id="text_17">
<!-- 0.2 -->
- <g transform="translate(540.488437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(539.543437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -1037,18 +1037,18 @@ L 548.44 39.24
</g>
<g id="xtick_10">
<g id="line2d_32">
- <path clip-path="url(#p05bb25f7b1)" d="M 622.65 387.16
-L 622.65 39.24
+ <path clip-path="url(#pd465dffb33)" d="M 621.93 388.6
+L 621.93 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_33">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="622.65" xlink:href="#mc87c468ee3" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="621.93" xlink:href="#m9dba40b40b" y="388.6"/>
</g>
</g>
<g id="text_18">
<!-- 0.4 -->
- <g transform="translate(614.698437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(613.978437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -1057,18 +1057,18 @@ L 622.65 39.24
</g>
<g id="xtick_11">
<g id="line2d_34">
- <path clip-path="url(#p05bb25f7b1)" d="M 696.86 387.16
-L 696.86 39.24
+ <path clip-path="url(#pd465dffb33)" d="M 696.365 388.6
+L 696.365 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_35">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="696.86" xlink:href="#mc87c468ee3" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="696.365" xlink:href="#m9dba40b40b" y="388.6"/>
</g>
</g>
<g id="text_19">
<!-- 0.6 -->
- <g transform="translate(688.908437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(688.413437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -1077,18 +1077,18 @@ L 696.86 39.24
</g>
<g id="xtick_12">
<g id="line2d_36">
- <path clip-path="url(#p05bb25f7b1)" d="M 771.07 387.16
-L 771.07 39.24
+ <path clip-path="url(#pd465dffb33)" d="M 770.8 388.6
+L 770.8 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_37">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="771.07" xlink:href="#mc87c468ee3" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="770.8" xlink:href="#m9dba40b40b" y="388.6"/>
</g>
</g>
<g id="text_20">
<!-- 0.8 -->
- <g transform="translate(763.118437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(762.848437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -1097,18 +1097,18 @@ L 771.07 39.24
</g>
<g id="xtick_13">
<g id="line2d_38">
- <path clip-path="url(#p05bb25f7b1)" d="M 845.28 387.16
-L 845.28 39.24
+ <path clip-path="url(#pd465dffb33)" d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_39">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="845.28" xlink:href="#mc87c468ee3" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="845.235" xlink:href="#m9dba40b40b" y="388.6"/>
</g>
</g>
<g id="text_21">
<!-- 1.0 -->
- <g transform="translate(837.328437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(837.283437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1341,7 +1341,7 @@ Q 14.5 64.65625 8.015625 75.875
z
" id="DejaVuSans-41"/>
</defs>
- <g transform="translate(560.955 415.438125)scale(0.1 -0.1)">
+ <g transform="translate(560.3475 416.878125)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-78"/>
<use transform="translate(74.804688 0.015625)" xlink:href="#DejaVuSans-111"/>
<use transform="translate(135.986328 0.015625)" xlink:href="#DejaVuSans-114"/>
@@ -1384,13 +1384,13 @@ z
<g id="matplotlib.axis_4">
<g id="ytick_7">
<g id="line2d_40">
- <path clip-path="url(#p05bb25f7b1)" d="M 474.23 357.438172
-L 845.28 357.438172
+ <path clip-path="url(#pd465dffb33)" d="M 473.06 358.53988
+L 845.235 358.53988
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_41">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#mb88f302533" y="357.438172"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#m2b39638b15" y="358.53988"/>
</g>
</g>
<g id="text_23">
@@ -1403,7 +1403,7 @@ L 10.59375 27.203125
z
" id="DejaVuSans-8722"/>
</defs>
- <g transform="translate(446.125312 361.23739)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 362.339099)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-56"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1412,18 +1412,18 @@ z
</g>
<g id="ytick_8">
<g id="line2d_42">
- <path clip-path="url(#p05bb25f7b1)" d="M 474.23 303.14788
-L 845.28 303.14788
+ <path clip-path="url(#pd465dffb33)" d="M 473.06 303.63166
+L 845.235 303.63166
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_43">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#mb88f302533" y="303.14788"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#m2b39638b15" y="303.63166"/>
</g>
</g>
<g id="text_24">
<!-- −60 -->
- <g transform="translate(446.125312 306.947098)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 307.430879)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-54"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1432,18 +1432,18 @@ L 845.28 303.14788
</g>
<g id="ytick_9">
<g id="line2d_44">
- <path clip-path="url(#p05bb25f7b1)" d="M 474.23 248.857588
-L 845.28 248.857588
+ <path clip-path="url(#pd465dffb33)" d="M 473.06 248.72344
+L 845.235 248.72344
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_45">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#mb88f302533" y="248.857588"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#m2b39638b15" y="248.72344"/>
</g>
</g>
<g id="text_25">
<!-- −40 -->
- <g transform="translate(446.125312 252.656806)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 252.522658)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-52"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1452,18 +1452,18 @@ L 845.28 248.857588
</g>
<g id="ytick_10">
<g id="line2d_46">
- <path clip-path="url(#p05bb25f7b1)" d="M 474.23 194.567296
-L 845.28 194.567296
+ <path clip-path="url(#pd465dffb33)" d="M 473.06 193.81522
+L 845.235 193.81522
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_47">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#mb88f302533" y="194.567296"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#m2b39638b15" y="193.81522"/>
</g>
</g>
<g id="text_26">
<!-- −20 -->
- <g transform="translate(446.125312 198.366514)scale(0.1 -0.1)">
+ <g transform="translate(444.955312 197.614438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-50"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1472,36 +1472,36 @@ L 845.28 194.567296
</g>
<g id="ytick_11">
<g id="line2d_48">
- <path clip-path="url(#p05bb25f7b1)" d="M 474.23 140.277004
-L 845.28 140.277004
+ <path clip-path="url(#pd465dffb33)" d="M 473.06 138.906999
+L 845.235 138.906999
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_49">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#mb88f302533" y="140.277004"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#m2b39638b15" y="138.906999"/>
</g>
</g>
<g id="text_27">
<!-- 0 -->
- <g transform="translate(460.8675 144.076222)scale(0.1 -0.1)">
+ <g transform="translate(459.6975 142.706218)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="ytick_12">
<g id="line2d_50">
- <path clip-path="url(#p05bb25f7b1)" d="M 474.23 85.986712
-L 845.28 85.986712
+ <path clip-path="url(#pd465dffb33)" d="M 473.06 83.998779
+L 845.235 83.998779
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_51">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="474.23" xlink:href="#mb88f302533" y="85.986712"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="473.06" xlink:href="#m2b39638b15" y="83.998779"/>
</g>
</g>
<g id="text_28">
<!-- 20 -->
- <g transform="translate(454.505 89.78593)scale(0.1 -0.1)">
+ <g transform="translate(453.335 87.797998)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -1565,7 +1565,7 @@ L 9.8125 0
z
" id="DejaVuSans-66"/>
</defs>
- <g transform="translate(440.045625 236.791406)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(438.875625 236.251406)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-71"/>
<use x="77.490234" xlink:href="#DejaVuSans-97"/>
<use x="138.769531" xlink:href="#DejaVuSans-105"/>
@@ -1579,529 +1579,529 @@ z
</g>
</g>
<g id="line2d_52">
- <path clip-path="url(#p05bb25f7b1)" d="M 474.23 55.054545
-L 474.954707 55.13022
-L 475.679414 55.357595
-L 476.404121 55.737732
-L 477.128828 56.272431
-L 477.853535 56.964273
-L 479.302949 58.834069
-L 480.752363 61.386747
-L 482.201777 64.682258
-L 483.651191 68.809606
-L 485.100605 73.902794
-L 486.55002 80.171986
-L 487.999434 87.971115
-L 489.448848 97.969441
-L 490.173555 104.203536
-L 490.898262 111.711012
-L 491.622969 121.23452
-L 492.347676 134.606183
-L 493.072383 159.306676
-L 493.79709 174.16856
-L 494.521797 146.004621
-L 495.246504 135.950253
-L 495.971211 130.751859
-L 496.695918 127.990985
-L 497.420625 126.798047
-L 498.145332 126.782399
-L 498.870039 127.760705
-L 499.594746 129.666519
-L 500.319453 132.522208
-L 501.04416 136.445828
-L 501.768867 141.699113
-L 502.493574 148.827929
-L 503.218281 159.118427
-L 503.942988 176.824454
-L 504.667695 251.480658
-L 505.392402 177.357344
-L 506.117109 163.183552
-L 506.841816 155.761901
-L 507.566523 151.339835
-L 508.29123 148.731714
-L 509.015937 147.424548
-L 509.740645 147.168736
-L 510.465352 147.848214
-L 511.190059 149.43395
-L 511.914766 151.973469
-L 512.639473 155.607582
-L 513.36418 160.628756
-L 514.088887 167.644691
-L 514.813594 178.124576
-L 515.538301 197.318776
-L 516.263008 234.624621
-L 516.987715 190.7872
-L 517.712422 177.609995
-L 518.437129 170.330696
-L 519.161836 165.827499
-L 519.886543 163.050873
-L 520.61125 161.534268
-L 521.335957 161.047795
-L 522.060664 161.484656
-L 522.785371 162.820048
-L 523.510078 165.102575
-L 524.234785 168.471173
-L 524.959492 173.211832
-L 525.684199 179.914687
-L 526.408906 189.99164
-L 527.133613 208.362794
-L 527.85832 252.638825
-L 528.583027 203.321221
-L 529.307734 189.554866
-L 530.032441 181.927409
-L 530.757148 177.143923
-L 531.481855 174.115385
-L 532.206562 172.36056
-L 532.93127 171.641979
-L 533.655977 171.847455
-L 534.380684 172.946858
-L 535.105391 174.981824
-L 535.830098 178.080031
-L 536.554805 182.50584
-L 537.279512 188.79921
-L 538.004219 198.21868
-L 538.728926 214.866833
-L 539.453633 309.371001
-L 540.17834 215.068311
-L 540.903047 199.904343
-L 541.627754 191.684381
-L 542.352461 186.519809
-L 543.077168 183.195005
-L 543.801875 181.184412
-L 544.526582 180.229909
-L 545.251289 180.20697
-L 545.975996 181.075699
-L 546.700703 182.867194
-L 547.42541 185.69405
-L 548.150117 189.793535
-L 548.874824 195.645527
-L 549.599531 204.334257
-L 550.324238 219.131788
-L 551.048945 268.757539
-L 551.773652 226.589292
-L 552.498359 209.229371
-L 553.223066 200.218357
-L 553.947773 194.594727
-L 554.67248 190.938753
-L 555.397187 188.657115
-L 556.121895 187.461494
-L 556.846602 187.21031
-L 557.571309 187.851194
-L 558.296016 189.402889
-L 559.020723 191.961512
-L 559.74543 195.736166
-L 560.470137 201.146921
-L 561.194844 209.114014
-L 561.919551 222.214899
-L 562.644258 255.545184
-L 563.368965 238.609304
-L 564.093672 217.922264
-L 564.818379 207.907374
-L 565.543086 201.747929
-L 566.267793 197.726792
-L 566.9925 195.158394
-L 567.717207 193.715149
-L 568.441914 193.234339
-L 569.166621 193.649045
-L 569.891328 194.964591
-L 570.616035 197.260315
-L 571.340742 200.718036
-L 572.065449 205.702411
-L 572.790156 212.990204
-L 573.514863 224.614837
-L 574.23957 249.834262
-L 574.964277 252.335681
-L 575.688984 226.291246
-L 576.413691 215.007367
-L 577.138398 208.226178
-L 577.863105 203.803004
-L 578.587812 200.930438
-L 579.31252 199.231644
-L 580.037227 198.518597
-L 580.761934 198.707914
-L 581.486641 199.790735
-L 582.211348 201.82978
-L 582.936055 204.981235
-L 583.660762 209.560056
-L 584.385469 216.221351
-L 585.110176 226.581218
-L 585.834883 246.782972
-L 586.55959 270.856895
-L 587.284297 234.62383
-L 588.009004 221.708533
-L 588.733711 214.202303
-L 589.458418 209.334787
-L 590.183125 206.138108
-L 590.907832 204.174235
-L 591.632539 203.225168
-L 592.357246 203.189044
-L 593.081953 204.042113
-L 593.80666 205.830785
-L 594.531367 208.68747
-L 595.256074 212.88318
-L 595.980781 218.97117
-L 596.705488 228.248119
-L 597.430195 245.009774
-L 598.154902 315.258088
-L 598.879609 243.248433
-L 599.604316 228.166839
-L 600.329023 219.805528
-L 601.05373 214.44352
-L 601.778437 210.899465
-L 602.503145 208.65915
-L 603.227852 207.46906
-L 603.952559 207.206575
-L 604.677266 207.832256
-L 605.401973 209.376493
-L 606.12668 211.949707
-L 606.851387 215.784245
-L 607.576094 221.348374
-L 608.300801 229.692809
-L 609.025508 243.940033
-L 609.750215 288.848499
-L 610.474922 252.632003
-L 611.199629 234.52521
-L 611.924336 225.138895
-L 612.649043 219.221574
-L 613.37375 215.3027
-L 614.098457 212.77245
-L 614.823164 211.335026
-L 615.547871 210.844332
-L 616.272578 211.244275
-L 616.997285 212.549399
-L 617.721992 214.849719
-L 618.446699 218.343544
-L 619.171406 223.428089
-L 619.896113 230.962829
-L 620.62082 243.28718
-L 621.345527 272.626155
-L 622.070234 263.61287
-L 622.794941 240.932068
-L 623.519648 230.290417
-L 624.244355 223.742559
-L 624.969062 219.416184
-L 625.69377 216.58002
-L 626.418477 214.887503
-L 627.143184 214.165764
-L 627.867891 214.340832
-L 628.592598 215.411409
-L 629.317305 217.44844
-L 630.042012 220.620132
-L 630.766719 225.264013
-L 631.491426 232.08919
-L 632.216133 242.891723
-L 632.94084 265.046572
-L 633.665547 278.211484
-L 634.390254 247.563705
-L 635.114961 235.341214
-L 635.839668 228.067968
-L 636.564375 223.294809
-L 637.289082 220.133806
-L 638.013789 218.176817
-L 638.738496 217.220129
-L 639.463203 217.170344
-L 640.18791 218.010115
-L 640.912617 219.792379
-L 641.637324 222.658541
-L 642.362031 226.895645
-L 643.086738 233.093174
-L 643.811445 242.65803
-L 644.536152 260.47851
-L 645.260859 305.101016
-L 645.985566 254.660526
-L 646.710273 240.37264
-L 647.43498 232.251833
-L 648.159687 226.984203
-L 648.884395 223.475906
-L 649.609102 221.243222
-L 650.333809 220.04652
-L 651.058516 219.771012
-L 651.783223 220.382853
-L 652.50793 221.917766
-L 653.232637 224.493066
-L 653.957344 228.352757
-L 654.682051 233.990027
-L 655.406758 242.525553
-L 656.131465 257.395377
-L 656.856172 312.859213
-L 657.580879 262.600999
-L 658.305586 245.47401
-L 659.030293 236.344354
-L 659.755 230.523687
-L 660.479707 226.64136
-L 661.204414 224.119638
-L 661.929121 222.676578
-L 662.653828 222.173535
-L 663.378535 222.559441
-L 664.103242 223.853318
-L 664.827949 226.150602
-L 665.552656 229.658262
-L 666.277363 234.791064
-L 667.00207 242.454318
-L 667.726777 255.165286
-L 668.451484 287.236048
-L 669.176191 272.088461
-L 669.900898 250.752994
-L 670.625605 240.395096
-L 671.350312 233.948496
-L 672.07502 229.660143
-L 672.799727 226.833564
-L 673.524434 225.136381
-L 674.249141 224.40299
-L 674.973848 224.564056
-L 675.698555 225.622144
-L 676.423262 227.652566
-L 677.147969 230.830107
-L 677.872676 235.504928
-L 678.597383 242.417029
-L 679.32209 253.468954
-L 680.046797 276.840568
-L 680.771504 284.775305
-L 681.496211 256.352257
-L 682.220918 244.456303
-L 682.945625 237.291578
-L 683.670332 232.558641
-L 684.395039 229.408466
-L 685.119746 227.447796
-L 685.844453 226.48017
-L 686.56916 226.416575
-L 687.293867 227.243086
-L 688.018574 229.016246
-L 688.743281 231.882563
-L 689.467988 236.138369
-L 690.192695 242.394511
-L 690.917402 252.124534
-L 691.642109 270.597097
-L 692.366816 306.829662
-L 693.091523 262.480258
-L 693.81623 248.586906
-L 694.540937 240.585205
-L 695.265645 235.360817
-L 695.990352 231.864813
-L 696.715059 229.629471
-L 697.439766 228.422561
-L 698.164473 228.133543
-L 698.88918 228.731684
-L 699.613887 230.255754
-L 700.338594 232.827117
-L 701.063301 236.696746
-L 701.788008 242.372957
-L 702.512715 251.019725
-L 703.237422 266.2749
-L 703.962129 332.337483
-L 704.686836 269.476765
-L 705.411543 252.858095
-L 706.13625 243.862592
-L 706.860957 238.089176
-L 707.585664 234.22088
-L 708.310371 231.697587
-L 709.035078 230.24507
-L 709.759785 229.728894
-L 710.484492 230.100891
-L 711.209199 231.382726
-L 711.933906 233.673115
-L 712.658613 237.184365
-L 713.38332 242.342196
-L 714.108027 250.080971
-L 714.832734 263.03381
-L 715.557441 297.054618
-L 717.006855 257.362011
-L 717.731562 247.159742
-L 718.45627 240.765651
-L 719.180977 236.493407
-L 719.905684 233.666435
-L 720.630391 231.960575
-L 721.355098 231.214486
-L 722.079805 231.3616
-L 722.804512 232.406834
-L 723.529219 234.428218
-L 724.253926 237.604706
-L 724.978633 242.294562
-L 725.70334 249.257852
-L 726.428047 260.467683
-L 727.152754 284.671788
-L 727.877461 289.449161
-L 728.602168 262.226716
-L 729.326875 250.517779
-L 730.051582 243.412467
-L 730.776289 238.698151
-L 731.500996 235.548887
-L 732.225703 233.580362
-L 732.95041 232.60052
-L 733.675117 232.523051
-L 734.399824 233.336175
-L 735.124531 235.098744
-L 735.849238 237.960586
-L 736.573945 242.224152
-L 737.298652 248.514514
-L 738.023359 258.350268
-L 738.748066 277.267111
-L 739.472773 308.979194
-L 740.19748 267.644645
-L 740.922187 253.986215
-L 741.646895 246.053091
-L 742.371602 240.850395
-L 743.096309 237.356778
-L 743.821016 235.114461
-L 744.545723 233.895861
-L 745.27043 233.593139
-L 745.995137 234.177567
-L 746.719844 235.689922
-L 747.444551 238.254271
-L 748.169258 242.126302
-L 748.893965 247.824661
-L 749.618672 256.543239
-L 750.343379 272.062905
-L 751.068086 350.235501
-L 751.792793 273.933305
-L 752.5175 257.627894
-L 753.242207 248.713362
-L 753.966914 242.965451
-L 754.691621 239.101242
-L 755.416328 236.571933
-L 756.141035 235.108298
-L 756.865742 234.578659
-L 757.590449 234.93677
-L 758.315156 236.206084
-L 759.039863 238.487567
-L 759.76457 241.997231
-L 760.489277 247.16847
-L 761.213984 254.956205
-L 761.938691 268.077007
-L 762.663398 303.601039
-L 764.112813 261.527034
-L 764.83752 251.422953
-L 765.562227 245.059178
-L 766.286934 240.793022
-L 767.011641 237.961099
-L 767.736348 236.244746
-L 768.461055 235.485495
-L 769.185762 235.618667
-L 769.910469 236.650811
-L 770.635176 238.661873
-L 771.359883 241.83378
-L 772.08459 246.530623
-L 772.809297 253.527025
-L 773.534004 264.847973
-L 774.258711 289.677553
-L 774.983418 292.251771
-L 775.708125 265.803317
-L 776.432832 254.217401
-L 777.157539 247.14859
-L 777.882246 242.44276
-L 778.606953 239.289753
-L 779.33166 237.311423
-L 780.056367 236.318777
-L 780.781074 236.227401
-L 781.505781 237.027046
-L 782.230488 238.778232
-L 782.955195 241.633223
-L 783.679902 245.898994
-L 784.404609 252.211211
-L 785.129316 262.122381
-L 785.854023 281.374679
-L 786.57873 310.088482
-L 787.303437 270.63879
-L 788.028145 257.141083
-L 788.752852 249.25259
-L 789.477559 244.061309
-L 790.202266 240.565345
-L 790.926973 238.313996
-L 791.65168 237.083004
-L 792.376387 236.766485
-L 793.101094 237.33718
-L 793.825801 238.837358
-L 794.550508 241.393127
-L 795.275215 245.263757
-L 795.999922 250.975806
-L 796.724629 259.746281
-L 797.449336 275.468566
-L 798.174043 371.345455
-L 798.89875 276.334985
-L 799.623457 260.251846
-L 800.348164 251.392919
-L 801.072871 245.660073
-L 801.797578 241.795165
-L 802.522285 239.257699
-L 803.246992 237.782147
-L 803.971699 237.238885
-L 804.696406 237.583117
-L 805.421113 238.839664
-L 806.14582 241.111239
-L 806.870527 244.616753
-L 807.595234 249.795655
-L 808.319941 257.6192
-L 809.044648 270.871155
-L 809.769355 307.67435
-L 810.494062 283.453654
-L 811.21877 263.628643
-L 811.943477 253.595468
-L 812.668184 247.251396
-L 813.392891 242.986521
-L 814.117598 240.147457
-L 814.842305 238.419734
-L 815.567012 237.647096
-L 816.291719 237.76633
-L 817.016426 238.785271
-L 817.741133 240.785399
-L 818.46584 243.951038
-L 819.190547 248.651023
-L 819.915254 255.671895
-L 820.639961 267.081558
-L 821.364668 292.437779
-L 822.089375 293.252137
-L 822.814082 267.384941
-L 823.538789 255.892144
-L 824.263496 248.849064
-L 824.988203 244.14694
-L 825.71291 240.987987
-L 826.437617 238.998924
-L 827.162324 237.993189
-L 827.887031 237.887888
-L 828.611738 238.674017
-L 829.336445 240.413472
-L 830.061152 243.260548
-L 830.785859 247.526018
-L 831.510566 253.854505
-L 832.235273 263.82742
-L 832.95998 283.366729
-L 833.684687 309.737669
-L 834.409395 271.694256
-L 835.134102 258.32367
-L 835.858809 250.46893
-L 836.583516 245.284384
-L 837.308223 241.783908
-L 838.03293 239.522573
-L 838.757637 238.278859
-L 839.482344 237.948494
-L 840.207051 238.505457
-L 840.931758 239.993285
-L 841.656465 242.539844
-L 842.381172 246.407515
-L 843.105879 252.129774
-L 843.830586 260.94397
-L 844.555293 276.844013
-L 844.555293 276.844013
+ <path clip-path="url(#pd465dffb33)" d="M 473.06 52.714545
+L 473.786904 52.791081
+L 474.513809 53.021044
+L 475.240713 53.405508
+L 475.967617 53.946292
+L 476.694521 54.646009
+L 478.14833 56.537087
+L 479.602139 59.11882
+L 481.055947 62.45184
+L 482.509756 66.626166
+L 483.963564 71.777324
+L 485.417373 78.117871
+L 486.871182 86.005769
+L 488.32499 96.117895
+L 489.051895 102.422946
+L 489.778799 110.015872
+L 490.505703 119.647775
+L 491.232607 133.171634
+L 491.959512 158.153266
+L 492.686416 173.184307
+L 493.41332 144.699809
+L 494.140225 134.531002
+L 494.867129 129.27344
+L 495.594033 126.481142
+L 496.320937 125.274627
+L 497.047842 125.2588
+L 497.774746 126.248241
+L 498.50165 128.175747
+L 499.228555 131.063939
+L 499.955459 135.032217
+L 500.682363 140.345295
+L 501.409268 147.555251
+L 502.136172 157.962875
+L 502.863076 175.870431
+L 503.58998 251.376366
+L 504.316885 176.409386
+L 505.043789 162.074269
+L 505.770693 154.568145
+L 506.497598 150.095748
+L 507.224502 147.45794
+L 507.951406 146.135897
+L 508.678311 145.877173
+L 509.405215 146.564384
+L 510.132119 148.168169
+L 510.859023 150.736593
+L 511.585928 154.41207
+L 512.312832 159.490393
+L 513.039736 166.586184
+L 513.766641 177.18535
+L 514.493545 196.598017
+L 515.220449 234.328475
+L 515.947354 189.992099
+L 516.674258 176.664912
+L 517.401162 169.302761
+L 518.128066 164.748309
+L 518.854971 161.940079
+L 519.581875 160.406213
+L 520.308779 159.914202
+L 521.035684 160.356035
+L 521.762588 161.706627
+L 522.489492 164.015133
+L 523.216396 167.422073
+L 523.943301 172.21669
+L 524.670205 178.995836
+L 525.397109 189.187484
+L 526.124014 207.767737
+L 526.850918 252.547714
+L 527.577822 202.668782
+L 528.304727 188.745739
+L 529.031631 181.031467
+L 529.758535 176.193536
+L 530.485439 173.130527
+L 531.212344 171.355729
+L 531.939248 170.628969
+L 532.666152 170.836783
+L 533.393057 171.9487
+L 534.119961 174.006827
+L 534.846865 177.140298
+L 535.57377 181.616481
+L 536.300674 187.981482
+L 537.027578 197.508164
+L 537.754482 214.345805
+L 538.481387 309.925612
+L 539.208291 214.549576
+L 539.935195 199.213013
+L 540.6621 190.899492
+L 541.389004 185.676137
+L 542.115908 182.31349
+L 542.842812 180.280013
+L 543.569717 179.314646
+L 544.296621 179.291445
+L 545.023525 180.170063
+L 545.75043 181.981948
+L 546.477334 184.84098
+L 547.204238 188.987124
+L 547.931143 194.905724
+L 548.658047 203.693348
+L 549.384951 218.659303
+L 550.111855 268.849891
+L 550.83876 226.201687
+L 551.565664 208.644178
+L 552.292568 199.530601
+L 553.019473 193.842964
+L 553.746377 190.145377
+L 554.473281 187.83777
+L 555.200186 186.62854
+L 555.92709 186.374497
+L 556.653994 187.022676
+L 557.380898 188.592032
+L 558.107803 191.179777
+L 558.834707 194.997394
+L 559.561611 200.469734
+L 560.288516 208.527508
+L 561.01542 221.777506
+L 561.742324 255.487154
+L 562.469229 238.358511
+L 563.196133 217.436012
+L 563.923037 207.307134
+L 564.649941 201.077582
+L 565.376846 197.010677
+L 566.10375 194.413046
+L 566.830654 192.953374
+L 567.557559 192.467092
+L 568.284463 192.886517
+L 569.011367 194.217037
+L 569.738271 196.538891
+L 570.465176 200.035967
+L 571.19208 205.077074
+L 571.918984 212.447816
+L 572.645889 224.20476
+L 573.372793 249.711231
+L 574.099697 252.24112
+L 574.826602 225.90025
+L 575.553506 214.487938
+L 576.28041 207.629566
+L 577.007314 203.156049
+L 577.734219 200.250787
+L 578.461123 198.532657
+L 579.188027 197.811495
+L 579.914932 198.002966
+L 580.641836 199.098112
+L 581.36874 201.160365
+L 582.095645 204.34769
+L 582.822549 208.978627
+L 583.549453 215.715739
+L 584.276357 226.193522
+L 585.003262 246.625211
+L 585.730166 270.973142
+L 586.45707 234.327675
+L 587.183975 221.265376
+L 587.910879 213.673712
+L 588.637783 208.750794
+L 589.364687 205.51773
+L 590.091592 203.531505
+L 590.818496 202.571635
+L 591.5454 202.5351
+L 592.272305 203.397879
+L 592.999209 205.206909
+L 593.726113 208.096109
+L 594.453018 212.339574
+L 595.179922 218.496857
+L 595.906826 227.879396
+L 596.63373 244.83183
+L 597.360635 315.879706
+L 598.087539 243.050442
+L 598.814443 227.79719
+L 599.541348 219.340711
+L 600.268252 213.917674
+L 600.995156 210.333281
+L 601.722061 208.067466
+L 602.448965 206.863831
+L 603.175869 206.598358
+L 603.902773 207.23116
+L 604.629678 208.792975
+L 605.356582 211.395476
+L 606.083486 215.273659
+L 606.810391 220.901118
+L 607.537295 229.340529
+L 608.264199 243.749913
+L 608.991104 289.169525
+L 609.718008 252.540815
+L 610.444912 234.227932
+L 611.171816 224.734783
+L 611.898721 218.750111
+L 612.625625 214.786632
+L 613.352529 212.227584
+L 614.079434 210.773799
+L 614.806338 210.27752
+L 615.533242 210.682015
+L 616.260146 212.001994
+L 616.987051 214.328496
+L 617.713955 217.862088
+L 618.440859 223.004504
+L 619.167764 230.625005
+L 619.894668 243.08963
+L 620.621572 272.76254
+L 621.348477 263.646666
+L 622.075381 240.707713
+L 622.802285 229.944939
+L 623.529189 223.322554
+L 624.256094 218.946936
+L 624.982998 216.078491
+L 625.709902 214.36671
+L 626.436807 213.636757
+L 627.163711 213.813817
+L 627.890615 214.89658
+L 628.61752 216.956796
+L 629.344424 220.164588
+L 630.071328 224.861325
+L 630.798232 231.764186
+L 631.525137 242.689672
+L 632.252041 265.096686
+L 632.978945 278.41144
+L 633.70585 247.41483
+L 634.432754 235.053224
+L 635.159658 227.697194
+L 635.886562 222.869708
+L 636.613467 219.672726
+L 637.340371 217.693462
+L 638.067275 216.725886
+L 638.79418 216.675534
+L 639.521084 217.524863
+L 640.247988 219.327413
+L 640.974893 222.226197
+L 641.701797 226.511528
+L 642.428701 232.779597
+L 643.155605 242.453319
+L 643.88251 260.476631
+L 644.609414 305.607027
+L 645.336318 254.592426
+L 646.063223 240.141917
+L 646.790127 231.92868
+L 647.517031 226.601094
+L 648.243936 223.052865
+L 648.97084 220.794769
+L 649.697744 219.584447
+L 650.424648 219.305803
+L 651.151553 219.924608
+L 651.878457 221.476991
+L 652.605361 224.081603
+L 653.332266 227.985225
+L 654.05917 233.686658
+L 654.786074 242.319334
+L 655.512979 257.358405
+L 656.239883 313.453527
+L 656.966787 262.623278
+L 657.693691 245.301351
+L 658.420596 236.067781
+L 659.1475 230.180864
+L 659.874404 226.254349
+L 660.601309 223.703924
+L 661.328213 222.24444
+L 662.055117 221.735671
+L 662.782021 222.12597
+L 663.508926 223.434574
+L 664.23583 225.758004
+L 664.962734 229.305589
+L 665.689639 234.496812
+L 666.416543 242.247288
+L 667.143447 255.102932
+L 667.870352 287.538721
+L 668.597256 272.218725
+L 669.32416 250.64042
+L 670.051064 240.164628
+L 670.777969 233.644654
+L 671.504873 229.307491
+L 672.231777 226.448741
+L 672.958682 224.73224
+L 673.685586 223.990501
+L 674.41249 224.153401
+L 675.139395 225.223532
+L 675.866299 227.277064
+L 676.593203 230.490772
+L 677.320107 235.218801
+L 678.047012 242.209575
+L 678.773916 253.387293
+L 679.50082 277.02492
+L 680.227725 285.049969
+L 680.954629 256.303413
+L 681.681533 244.27206
+L 682.408437 237.025787
+L 683.135342 232.23898
+L 683.862246 229.05295
+L 684.58915 227.069963
+L 685.316055 226.091324
+L 686.042959 226.027005
+L 686.769863 226.862923
+L 687.496768 228.656266
+L 688.223672 231.555206
+L 688.950576 235.859452
+L 689.67748 242.186801
+L 690.404385 252.02757
+L 691.131289 270.710386
+L 691.858193 307.355348
+L 692.585098 262.501163
+L 693.312002 248.449677
+L 694.038906 240.356901
+L 694.765811 235.073049
+L 695.492715 231.537254
+L 696.219619 229.27647
+L 696.946523 228.055823
+L 697.673428 227.763516
+L 698.400332 228.368464
+L 699.127236 229.909882
+L 699.854141 232.510512
+L 700.581045 236.424185
+L 701.307949 242.165002
+L 702.034854 250.910186
+L 702.761758 266.338995
+L 703.488662 333.153497
+L 704.215566 269.577303
+L 704.942471 252.76948
+L 705.669375 243.671592
+L 706.396279 237.832463
+L 707.123184 233.920138
+L 707.850088 231.368125
+L 708.576992 229.899075
+L 709.303896 229.377025
+L 710.030801 229.753255
+L 710.757705 231.04968
+L 711.484609 233.366139
+L 712.211514 236.917354
+L 712.938418 242.13389
+L 713.665322 249.960748
+L 714.392227 263.061015
+L 715.119131 297.469045
+L 716.572939 257.324659
+L 717.299844 247.006269
+L 718.026748 240.539401
+L 718.753652 236.218531
+L 719.480557 233.359383
+L 720.207461 231.634107
+L 720.934365 230.879526
+L 721.66127 231.028314
+L 722.388174 232.085444
+L 723.115078 234.129836
+L 723.841982 237.342479
+L 724.568887 242.085715
+L 725.295791 249.12826
+L 726.022695 260.46568
+L 726.7496 284.945274
+L 727.476504 289.777023
+L 728.203408 262.244734
+L 728.930312 250.402527
+L 729.657217 243.216343
+L 730.384121 238.448369
+L 731.111025 235.26326
+L 731.83793 233.27233
+L 732.564834 232.281335
+L 733.291738 232.202984
+L 734.018643 233.025364
+L 734.745547 234.807994
+L 735.472451 237.702409
+L 736.199355 242.014503
+L 736.92626 248.376461
+L 737.653164 258.324165
+L 738.380068 277.456318
+L 739.106973 309.529346
+L 739.833877 267.72433
+L 740.560781 253.910441
+L 741.287686 245.887022
+L 742.01459 240.62511
+L 742.741494 237.091728
+L 743.468398 234.82389
+L 744.195303 233.59142
+L 744.922207 233.285252
+L 745.649111 233.876332
+L 746.376016 235.4059
+L 747.10292 237.999437
+L 747.829824 241.915539
+L 748.556729 247.678756
+L 749.283633 256.496569
+L 750.010537 272.192879
+L 750.737441 351.255229
+L 751.464346 274.084567
+L 752.19125 257.593569
+L 752.918154 248.577572
+L 753.645059 242.764239
+L 754.371963 238.856048
+L 755.098867 236.29795
+L 755.825771 234.817656
+L 756.552676 234.281989
+L 757.27958 234.644176
+L 758.006484 235.927937
+L 758.733389 238.235388
+L 759.460293 241.784999
+L 760.187197 247.015096
+L 760.914102 254.891471
+L 761.641006 268.161613
+L 762.36791 304.089977
+L 763.821719 261.537088
+L 764.548623 251.318004
+L 765.275527 244.881797
+L 766.002432 240.567084
+L 766.729336 237.702928
+L 767.45624 235.967039
+L 768.183145 235.199147
+L 768.910049 235.333835
+L 769.636953 236.377726
+L 770.363857 238.411678
+L 771.090762 241.619687
+L 771.817666 246.369989
+L 772.54457 253.446024
+L 773.271475 264.895827
+L 773.998379 290.008015
+L 774.725283 292.611533
+L 775.452187 265.862044
+L 776.179092 254.144258
+L 776.905996 246.994991
+L 777.6329 242.235599
+L 778.359805 239.046705
+L 779.086709 237.045858
+L 779.813613 236.041913
+L 780.540518 235.949497
+L 781.267422 236.758244
+L 781.994326 238.529361
+L 782.72123 241.416848
+L 783.448135 245.731172
+L 784.175039 252.115233
+L 784.901943 262.139212
+L 785.628848 281.610639
+L 786.355752 310.65126
+L 787.082656 270.752555
+L 787.809561 257.101217
+L 788.536465 249.122938
+L 789.263369 243.872571
+L 789.990273 240.336816
+L 790.717178 238.059841
+L 791.444082 236.814839
+L 792.170986 236.494717
+L 792.897891 237.071907
+L 793.624795 238.589161
+L 794.351699 241.17402
+L 795.078604 245.088704
+L 795.805508 250.865768
+L 796.532412 259.736067
+L 797.259316 275.637302
+L 797.986221 372.605455
+L 798.713125 276.513583
+L 799.440029 260.247387
+L 800.166934 251.287628
+L 800.893838 245.489531
+L 801.620742 241.580633
+L 802.347646 239.014286
+L 803.074551 237.521939
+L 803.801455 236.972494
+L 804.528359 237.320644
+L 805.255264 238.591493
+L 805.982168 240.888922
+L 806.709072 244.434336
+L 807.435977 249.672184
+L 808.162881 257.584776
+L 808.889785 270.987564
+L 809.616689 308.20965
+L 810.343594 283.713276
+L 811.070498 263.662618
+L 811.797402 253.515246
+L 812.524307 247.098967
+L 813.251211 242.785549
+L 813.978115 239.914171
+L 814.70502 238.166783
+L 815.431924 237.385351
+L 816.158828 237.505942
+L 816.885732 238.536481
+L 817.612637 240.559374
+L 818.339541 243.761044
+L 819.066445 248.514524
+L 819.79335 255.615307
+L 820.520254 267.154834
+L 821.247158 292.799657
+L 821.974062 293.623284
+L 822.700967 267.46167
+L 823.427871 255.838063
+L 824.154775 248.714819
+L 824.88168 243.959176
+L 825.608584 240.764268
+L 826.335488 238.752566
+L 827.062393 237.735383
+L 827.789297 237.628884
+L 828.516201 238.42396
+L 829.243105 240.183214
+L 829.97001 243.062695
+L 830.696914 247.376715
+L 831.423818 253.777232
+L 832.150723 263.863658
+L 832.877627 283.625362
+L 833.604531 310.296454
+L 834.331436 271.820033
+L 835.05834 258.297264
+L 835.785244 250.353122
+L 836.512148 245.109566
+L 837.239053 241.569248
+L 837.965957 239.282175
+L 838.692861 238.024304
+L 839.419766 237.69018
+L 840.14667 238.253482
+L 840.873574 239.758245
+L 841.600479 242.333788
+L 842.327383 246.24548
+L 843.054287 252.03287
+L 843.781191 260.947389
+L 844.508096 277.028405
+L 844.508096 277.028405
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
</g>
<g id="patch_8">
- <path d="M 474.23 387.16
-L 474.23 39.24
+ <path d="M 473.06 388.6
+L 473.06 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_9">
- <path d="M 845.28 387.16
-L 845.28 39.24
+ <path d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_10">
- <path d="M 474.23 387.16
-L 845.28 387.16
+ <path d="M 473.06 388.6
+L 845.235 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_11">
- <path d="M 474.23 39.24
-L 845.28 39.24
+ <path d="M 473.06 36.72
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
@@ -2151,11 +2151,11 @@ z
</g>
</g>
<defs>
- <clipPath id="p474020f3d9">
- <rect height="347.92" width="371.05" x="47.72" y="39.24"/>
+ <clipPath id="p2c6b1ef163">
+ <rect height="351.88" width="372.175" x="47.855" y="36.72"/>
</clipPath>
- <clipPath id="p05bb25f7b1">
- <rect height="347.92" width="371.05" x="474.23" y="39.24"/>
+ <clipPath id="pd465dffb33">
+ <rect height="351.88" width="372.175" x="473.06" y="36.72"/>
</clipPath>
</defs>
</svg>
diff --git a/docs/docs/img/window_triangular.svg b/docs/docs/img/window_triangular.svg
@@ -19,28 +19,28 @@ z
</g>
<g id="axes_1">
<g id="patch_2">
- <path d="M 47.72 387.16
-L 415.575 387.16
-L 415.575 39.24
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 416.835 388.6
+L 416.835 36.72
+L 47.855 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
- <path clip-path="url(#p27494a8a68)" d="M 47.72 387.16
-L 47.72 39.24
+ <path clip-path="url(#p18189ee57d)" d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
-" id="mf5a66f271b" style="stroke:#000000;stroke-width:0.8;"/>
+" id="mf936eb5a21" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#mf5a66f271b" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#mf936eb5a21" y="388.6"/>
</g>
</g>
<g id="text_1">
@@ -68,20 +68,20 @@ Q 19.53125 74.21875 31.78125 74.21875
z
" id="DejaVuSans-48"/>
</defs>
- <g transform="translate(44.53875 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(44.67375 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
- <path clip-path="url(#p27494a8a68)" d="M 106.109683 387.16
-L 106.109683 39.24
+ <path clip-path="url(#p18189ee57d)" d="M 106.423254 388.6
+L 106.423254 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="106.109683" xlink:href="#mf5a66f271b" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="106.423254" xlink:href="#mf936eb5a21" y="388.6"/>
</g>
</g>
<g id="text_2">
@@ -101,7 +101,7 @@ L 12.40625 0
z
" id="DejaVuSans-49"/>
</defs>
- <g transform="translate(99.747183 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(100.060754 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -109,13 +109,13 @@ z
</g>
<g id="xtick_3">
<g id="line2d_5">
- <path clip-path="url(#p27494a8a68)" d="M 164.499365 387.16
-L 164.499365 39.24
+ <path clip-path="url(#p18189ee57d)" d="M 164.991508 388.6
+L 164.991508 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="164.499365" xlink:href="#mf5a66f271b" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="164.991508" xlink:href="#mf936eb5a21" y="388.6"/>
</g>
</g>
<g id="text_3">
@@ -146,7 +146,7 @@ Q 31.109375 20.453125 19.1875 8.296875
z
" id="DejaVuSans-50"/>
</defs>
- <g transform="translate(158.136865 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(158.629008 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-50"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -154,13 +154,13 @@ z
</g>
<g id="xtick_4">
<g id="line2d_7">
- <path clip-path="url(#p27494a8a68)" d="M 222.889048 387.16
-L 222.889048 39.24
+ <path clip-path="url(#p18189ee57d)" d="M 223.559762 388.6
+L 223.559762 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_8">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="222.889048" xlink:href="#mf5a66f271b" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="223.559762" xlink:href="#mf936eb5a21" y="388.6"/>
</g>
</g>
<g id="text_4">
@@ -199,7 +199,7 @@ Q 46.96875 40.921875 40.578125 39.3125
z
" id="DejaVuSans-51"/>
</defs>
- <g transform="translate(216.526548 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(217.197262 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-51"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -207,13 +207,13 @@ z
</g>
<g id="xtick_5">
<g id="line2d_9">
- <path clip-path="url(#p27494a8a68)" d="M 281.27873 387.16
-L 281.27873 39.24
+ <path clip-path="url(#p18189ee57d)" d="M 282.128016 388.6
+L 282.128016 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_10">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="281.27873" xlink:href="#mf5a66f271b" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="282.128016" xlink:href="#mf936eb5a21" y="388.6"/>
</g>
</g>
<g id="text_5">
@@ -237,7 +237,7 @@ L 4.890625 26.703125
z
" id="DejaVuSans-52"/>
</defs>
- <g transform="translate(274.91623 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(275.765516 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-52"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -245,13 +245,13 @@ z
</g>
<g id="xtick_6">
<g id="line2d_11">
- <path clip-path="url(#p27494a8a68)" d="M 339.668413 387.16
-L 339.668413 39.24
+ <path clip-path="url(#p18189ee57d)" d="M 340.69627 388.6
+L 340.69627 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_12">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="339.668413" xlink:href="#mf5a66f271b" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="340.69627" xlink:href="#mf936eb5a21" y="388.6"/>
</g>
</g>
<g id="text_6">
@@ -282,7 +282,7 @@ Q 14.890625 38.140625 10.796875 36.28125
z
" id="DejaVuSans-53"/>
</defs>
- <g transform="translate(333.305913 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(334.33377 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-53"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -290,13 +290,13 @@ z
</g>
<g id="xtick_7">
<g id="line2d_13">
- <path clip-path="url(#p27494a8a68)" d="M 398.058095 387.16
-L 398.058095 39.24
+ <path clip-path="url(#p18189ee57d)" d="M 399.264524 388.6
+L 399.264524 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_14">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="398.058095" xlink:href="#mf5a66f271b" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="399.264524" xlink:href="#mf936eb5a21" y="388.6"/>
</g>
</g>
<g id="text_7">
@@ -333,7 +333,7 @@ Q 48.484375 72.75 52.59375 71.296875
z
" id="DejaVuSans-54"/>
</defs>
- <g transform="translate(391.695595 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(392.902024 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-54"/>
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
</g>
@@ -523,7 +523,7 @@ Q 40.578125 54.546875 44.28125 53.078125
z
" id="DejaVuSans-115"/>
</defs>
- <g transform="translate(210.294375 415.436563)scale(0.1 -0.1)">
+ <g transform="translate(210.991875 416.876562)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-83"/>
<use x="63.476562" xlink:href="#DejaVuSans-97"/>
<use x="124.755859" xlink:href="#DejaVuSans-109"/>
@@ -537,18 +537,18 @@ z
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_15">
- <path clip-path="url(#p27494a8a68)" d="M 47.72 324.09616
-L 415.575 324.09616
+ <path clip-path="url(#p18189ee57d)" d="M 47.855 324.818372
+L 416.835 324.818372
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_16">
<defs>
<path d="M 0 0
L -3.5 0
-" id="m971e6caaf5" style="stroke:#000000;stroke-width:0.8;"/>
+" id="md6ec74d2e9" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m971e6caaf5" y="324.09616"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md6ec74d2e9" y="324.818372"/>
</g>
</g>
<g id="text_9">
@@ -561,7 +561,7 @@ L 10.6875 0
z
" id="DejaVuSans-46"/>
</defs>
- <g transform="translate(24.816875 327.895379)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 328.61759)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -570,18 +570,18 @@ z
</g>
<g id="ytick_2">
<g id="line2d_17">
- <path clip-path="url(#p27494a8a68)" d="M 47.72 255.687926
-L 415.575 255.687926
+ <path clip-path="url(#p18189ee57d)" d="M 47.855 255.631521
+L 416.835 255.631521
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_18">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m971e6caaf5" y="255.687926"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md6ec74d2e9" y="255.631521"/>
</g>
</g>
<g id="text_10">
<!-- 0.4 -->
- <g transform="translate(24.816875 259.487145)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 259.430739)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -590,18 +590,18 @@ L 415.575 255.687926
</g>
<g id="ytick_3">
<g id="line2d_19">
- <path clip-path="url(#p27494a8a68)" d="M 47.72 187.279693
-L 415.575 187.279693
+ <path clip-path="url(#p18189ee57d)" d="M 47.855 186.44467
+L 416.835 186.44467
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_20">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m971e6caaf5" y="187.279693"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md6ec74d2e9" y="186.44467"/>
</g>
</g>
<g id="text_11">
<!-- 0.6 -->
- <g transform="translate(24.816875 191.078912)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 190.243888)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -610,13 +610,13 @@ L 415.575 187.279693
</g>
<g id="ytick_4">
<g id="line2d_21">
- <path clip-path="url(#p27494a8a68)" d="M 47.72 118.871459
-L 415.575 118.871459
+ <path clip-path="url(#p18189ee57d)" d="M 47.855 117.257819
+L 416.835 117.257819
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_22">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m971e6caaf5" y="118.871459"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md6ec74d2e9" y="117.257819"/>
</g>
</g>
<g id="text_12">
@@ -662,7 +662,7 @@ Q 18.3125 60.0625 18.3125 54.390625
z
" id="DejaVuSans-56"/>
</defs>
- <g transform="translate(24.816875 122.670678)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 121.057037)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -671,18 +671,18 @@ z
</g>
<g id="ytick_5">
<g id="line2d_23">
- <path clip-path="url(#p27494a8a68)" d="M 47.72 50.463226
-L 415.575 50.463226
+ <path clip-path="url(#p18189ee57d)" d="M 47.855 48.070968
+L 416.835 48.070968
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_24">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="47.72" xlink:href="#m971e6caaf5" y="50.463226"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="47.855" xlink:href="#md6ec74d2e9" y="48.070968"/>
</g>
</g>
<g id="text_13">
<!-- 1.0 -->
- <g transform="translate(24.816875 54.262445)scale(0.1 -0.1)">
+ <g transform="translate(24.951875 51.870186)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -785,7 +785,7 @@ Q 14.796875 37.203125 14.796875 27.296875
z
" id="DejaVuSans-100"/>
</defs>
- <g transform="translate(18.737188 238.822656)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(18.872187 238.282656)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-65"/>
<use x="68.408203" xlink:href="#DejaVuSans-109"/>
<use x="165.820312" xlink:href="#DejaVuSans-112"/>
@@ -799,70 +799,70 @@ z
</g>
</g>
<g id="line2d_25">
- <path clip-path="url(#p27494a8a68)" d="M 47.72 387.16
-L 53.558968 376.471214
-L 59.397937 365.782427
-L 65.236905 355.093641
-L 71.075873 344.404854
-L 76.914841 333.716068
-L 82.75381 323.027281
-L 88.592778 312.338495
-L 94.431746 301.649708
-L 100.270714 290.960922
-L 106.109683 280.272135
-L 111.948651 269.583349
-L 117.787619 258.894562
-L 123.626587 248.205776
-L 129.465556 237.516989
-L 135.304524 226.828203
-L 141.143492 216.139416
-L 146.98246 205.45063
-L 152.821429 194.761843
-L 158.660397 184.073057
-L 164.499365 173.38427
-L 170.338333 162.695484
-L 176.177302 152.006697
-L 182.01627 141.317911
-L 187.855238 130.629124
-L 193.694206 119.940338
-L 199.533175 109.251551
-L 205.372143 98.562765
-L 211.211111 87.873978
-L 217.050079 77.185192
-L 222.889048 66.496406
-L 228.728016 55.807619
-L 234.566984 55.807619
-L 240.405952 66.496406
-L 246.244921 77.185192
-L 252.083889 87.873978
-L 257.922857 98.562765
-L 263.761825 109.251551
-L 269.600794 119.940338
-L 275.439762 130.629124
-L 281.27873 141.317911
-L 287.117698 152.006697
-L 292.956667 162.695484
-L 298.795635 173.38427
-L 304.634603 184.073057
-L 310.473571 194.761843
-L 316.31254 205.45063
-L 322.151508 216.139416
-L 327.990476 226.828203
-L 333.829444 237.516989
-L 339.668413 248.205776
-L 345.507381 258.894562
-L 351.346349 269.583349
-L 357.185317 280.272135
-L 363.024286 290.960922
-L 368.863254 301.649708
-L 374.702222 312.338495
-L 380.54119 323.027281
-L 386.380159 333.716068
-L 392.219127 344.404854
-L 398.058095 355.093641
-L 403.897063 365.782427
-L 409.736032 376.471214
-L 415.575 387.16
+ <path clip-path="url(#p18189ee57d)" d="M 47.855 388.6
+L 53.711825 377.789555
+L 59.568651 366.979109
+L 65.425476 356.168664
+L 71.282302 345.358218
+L 77.139127 334.547773
+L 82.995952 323.737327
+L 88.852778 312.926882
+L 94.709603 302.116436
+L 100.566429 291.305991
+L 106.423254 280.495545
+L 112.280079 269.6851
+L 118.136905 258.874654
+L 123.99373 248.064209
+L 129.850556 237.253763
+L 135.707381 226.443318
+L 141.564206 215.632873
+L 147.421032 204.822427
+L 153.277857 194.011982
+L 159.134683 183.201536
+L 164.991508 172.391091
+L 170.848333 161.580645
+L 176.705159 150.7702
+L 182.561984 139.959754
+L 188.41881 129.149309
+L 194.275635 118.338863
+L 200.13246 107.528418
+L 205.989286 96.717972
+L 211.846111 85.907527
+L 217.702937 75.097081
+L 223.559762 64.286636
+L 229.416587 53.47619
+L 235.273413 53.47619
+L 241.130238 64.286636
+L 246.987063 75.097081
+L 252.843889 85.907527
+L 258.700714 96.717972
+L 264.55754 107.528418
+L 270.414365 118.338863
+L 276.27119 129.149309
+L 282.128016 139.959754
+L 287.984841 150.7702
+L 293.841667 161.580645
+L 299.698492 172.391091
+L 305.555317 183.201536
+L 311.412143 194.011982
+L 317.268968 204.822427
+L 323.125794 215.632873
+L 328.982619 226.443318
+L 334.839444 237.253763
+L 340.69627 248.064209
+L 346.553095 258.874654
+L 352.409921 269.6851
+L 358.266746 280.495545
+L 364.123571 291.305991
+L 369.980397 302.116436
+L 375.837222 312.926882
+L 381.694048 323.737327
+L 387.550873 334.547773
+L 393.407698 345.358218
+L 399.264524 356.168664
+L 405.121349 366.979109
+L 410.978175 377.789555
+L 416.835 388.6
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
<defs>
<path d="M 0 1.5
@@ -875,120 +875,120 @@ C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0
C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066
C -0.77937 1.341951 -0.397805 1.5 0 1.5
z
-" id="m6e1c2f29eb" style="stroke:#0072bd;"/>
+" id="m70962186fd" style="stroke:#0072bd;"/>
</defs>
- <g clip-path="url(#p27494a8a68)">
- <use style="fill:#0072bd;stroke:#0072bd;" x="47.72" xlink:href="#m6e1c2f29eb" y="387.16"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="53.558968" xlink:href="#m6e1c2f29eb" y="376.471214"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="59.397937" xlink:href="#m6e1c2f29eb" y="365.782427"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="65.236905" xlink:href="#m6e1c2f29eb" y="355.093641"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="71.075873" xlink:href="#m6e1c2f29eb" y="344.404854"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="76.914841" xlink:href="#m6e1c2f29eb" y="333.716068"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="82.75381" xlink:href="#m6e1c2f29eb" y="323.027281"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="88.592778" xlink:href="#m6e1c2f29eb" y="312.338495"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="94.431746" xlink:href="#m6e1c2f29eb" y="301.649708"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="100.270714" xlink:href="#m6e1c2f29eb" y="290.960922"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="106.109683" xlink:href="#m6e1c2f29eb" y="280.272135"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="111.948651" xlink:href="#m6e1c2f29eb" y="269.583349"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="117.787619" xlink:href="#m6e1c2f29eb" y="258.894562"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="123.626587" xlink:href="#m6e1c2f29eb" y="248.205776"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="129.465556" xlink:href="#m6e1c2f29eb" y="237.516989"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="135.304524" xlink:href="#m6e1c2f29eb" y="226.828203"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="141.143492" xlink:href="#m6e1c2f29eb" y="216.139416"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="146.98246" xlink:href="#m6e1c2f29eb" y="205.45063"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="152.821429" xlink:href="#m6e1c2f29eb" y="194.761843"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="158.660397" xlink:href="#m6e1c2f29eb" y="184.073057"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="164.499365" xlink:href="#m6e1c2f29eb" y="173.38427"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="170.338333" xlink:href="#m6e1c2f29eb" y="162.695484"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="176.177302" xlink:href="#m6e1c2f29eb" y="152.006697"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="182.01627" xlink:href="#m6e1c2f29eb" y="141.317911"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="187.855238" xlink:href="#m6e1c2f29eb" y="130.629124"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="193.694206" xlink:href="#m6e1c2f29eb" y="119.940338"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="199.533175" xlink:href="#m6e1c2f29eb" y="109.251551"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="205.372143" xlink:href="#m6e1c2f29eb" y="98.562765"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="211.211111" xlink:href="#m6e1c2f29eb" y="87.873978"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="217.050079" xlink:href="#m6e1c2f29eb" y="77.185192"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="222.889048" xlink:href="#m6e1c2f29eb" y="66.496406"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="228.728016" xlink:href="#m6e1c2f29eb" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="234.566984" xlink:href="#m6e1c2f29eb" y="55.807619"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="240.405952" xlink:href="#m6e1c2f29eb" y="66.496406"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="246.244921" xlink:href="#m6e1c2f29eb" y="77.185192"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="252.083889" xlink:href="#m6e1c2f29eb" y="87.873978"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="257.922857" xlink:href="#m6e1c2f29eb" y="98.562765"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="263.761825" xlink:href="#m6e1c2f29eb" y="109.251551"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="269.600794" xlink:href="#m6e1c2f29eb" y="119.940338"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="275.439762" xlink:href="#m6e1c2f29eb" y="130.629124"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="281.27873" xlink:href="#m6e1c2f29eb" y="141.317911"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="287.117698" xlink:href="#m6e1c2f29eb" y="152.006697"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="292.956667" xlink:href="#m6e1c2f29eb" y="162.695484"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="298.795635" xlink:href="#m6e1c2f29eb" y="173.38427"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="304.634603" xlink:href="#m6e1c2f29eb" y="184.073057"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="310.473571" xlink:href="#m6e1c2f29eb" y="194.761843"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="316.31254" xlink:href="#m6e1c2f29eb" y="205.45063"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="322.151508" xlink:href="#m6e1c2f29eb" y="216.139416"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="327.990476" xlink:href="#m6e1c2f29eb" y="226.828203"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="333.829444" xlink:href="#m6e1c2f29eb" y="237.516989"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="339.668413" xlink:href="#m6e1c2f29eb" y="248.205776"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="345.507381" xlink:href="#m6e1c2f29eb" y="258.894562"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="351.346349" xlink:href="#m6e1c2f29eb" y="269.583349"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="357.185317" xlink:href="#m6e1c2f29eb" y="280.272135"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="363.024286" xlink:href="#m6e1c2f29eb" y="290.960922"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="368.863254" xlink:href="#m6e1c2f29eb" y="301.649708"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="374.702222" xlink:href="#m6e1c2f29eb" y="312.338495"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="380.54119" xlink:href="#m6e1c2f29eb" y="323.027281"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="386.380159" xlink:href="#m6e1c2f29eb" y="333.716068"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="392.219127" xlink:href="#m6e1c2f29eb" y="344.404854"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="398.058095" xlink:href="#m6e1c2f29eb" y="355.093641"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="403.897063" xlink:href="#m6e1c2f29eb" y="365.782427"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="409.736032" xlink:href="#m6e1c2f29eb" y="376.471214"/>
- <use style="fill:#0072bd;stroke:#0072bd;" x="415.575" xlink:href="#m6e1c2f29eb" y="387.16"/>
+ <g clip-path="url(#p18189ee57d)">
+ <use style="fill:#0072bd;stroke:#0072bd;" x="47.855" xlink:href="#m70962186fd" y="388.6"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="53.711825" xlink:href="#m70962186fd" y="377.789555"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="59.568651" xlink:href="#m70962186fd" y="366.979109"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="65.425476" xlink:href="#m70962186fd" y="356.168664"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="71.282302" xlink:href="#m70962186fd" y="345.358218"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="77.139127" xlink:href="#m70962186fd" y="334.547773"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="82.995952" xlink:href="#m70962186fd" y="323.737327"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="88.852778" xlink:href="#m70962186fd" y="312.926882"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="94.709603" xlink:href="#m70962186fd" y="302.116436"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="100.566429" xlink:href="#m70962186fd" y="291.305991"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="106.423254" xlink:href="#m70962186fd" y="280.495545"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="112.280079" xlink:href="#m70962186fd" y="269.6851"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="118.136905" xlink:href="#m70962186fd" y="258.874654"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="123.99373" xlink:href="#m70962186fd" y="248.064209"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="129.850556" xlink:href="#m70962186fd" y="237.253763"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="135.707381" xlink:href="#m70962186fd" y="226.443318"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="141.564206" xlink:href="#m70962186fd" y="215.632873"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="147.421032" xlink:href="#m70962186fd" y="204.822427"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="153.277857" xlink:href="#m70962186fd" y="194.011982"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="159.134683" xlink:href="#m70962186fd" y="183.201536"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="164.991508" xlink:href="#m70962186fd" y="172.391091"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="170.848333" xlink:href="#m70962186fd" y="161.580645"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="176.705159" xlink:href="#m70962186fd" y="150.7702"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="182.561984" xlink:href="#m70962186fd" y="139.959754"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="188.41881" xlink:href="#m70962186fd" y="129.149309"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="194.275635" xlink:href="#m70962186fd" y="118.338863"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="200.13246" xlink:href="#m70962186fd" y="107.528418"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="205.989286" xlink:href="#m70962186fd" y="96.717972"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="211.846111" xlink:href="#m70962186fd" y="85.907527"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="217.702937" xlink:href="#m70962186fd" y="75.097081"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="223.559762" xlink:href="#m70962186fd" y="64.286636"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="229.416587" xlink:href="#m70962186fd" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="235.273413" xlink:href="#m70962186fd" y="53.47619"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="241.130238" xlink:href="#m70962186fd" y="64.286636"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="246.987063" xlink:href="#m70962186fd" y="75.097081"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="252.843889" xlink:href="#m70962186fd" y="85.907527"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="258.700714" xlink:href="#m70962186fd" y="96.717972"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="264.55754" xlink:href="#m70962186fd" y="107.528418"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="270.414365" xlink:href="#m70962186fd" y="118.338863"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="276.27119" xlink:href="#m70962186fd" y="129.149309"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="282.128016" xlink:href="#m70962186fd" y="139.959754"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="287.984841" xlink:href="#m70962186fd" y="150.7702"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="293.841667" xlink:href="#m70962186fd" y="161.580645"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="299.698492" xlink:href="#m70962186fd" y="172.391091"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="305.555317" xlink:href="#m70962186fd" y="183.201536"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="311.412143" xlink:href="#m70962186fd" y="194.011982"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="317.268968" xlink:href="#m70962186fd" y="204.822427"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="323.125794" xlink:href="#m70962186fd" y="215.632873"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="328.982619" xlink:href="#m70962186fd" y="226.443318"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="334.839444" xlink:href="#m70962186fd" y="237.253763"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="340.69627" xlink:href="#m70962186fd" y="248.064209"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="346.553095" xlink:href="#m70962186fd" y="258.874654"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="352.409921" xlink:href="#m70962186fd" y="269.6851"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="358.266746" xlink:href="#m70962186fd" y="280.495545"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="364.123571" xlink:href="#m70962186fd" y="291.305991"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="369.980397" xlink:href="#m70962186fd" y="302.116436"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="375.837222" xlink:href="#m70962186fd" y="312.926882"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="381.694048" xlink:href="#m70962186fd" y="323.737327"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="387.550873" xlink:href="#m70962186fd" y="334.547773"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="393.407698" xlink:href="#m70962186fd" y="345.358218"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="399.264524" xlink:href="#m70962186fd" y="356.168664"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="405.121349" xlink:href="#m70962186fd" y="366.979109"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="410.978175" xlink:href="#m70962186fd" y="377.789555"/>
+ <use style="fill:#0072bd;stroke:#0072bd;" x="416.835" xlink:href="#m70962186fd" y="388.6"/>
</g>
</g>
<g id="patch_3">
- <path d="M 47.72 387.16
-L 47.72 39.24
+ <path d="M 47.855 388.6
+L 47.855 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
- <path d="M 415.575 387.16
-L 415.575 39.24
+ <path d="M 416.835 388.6
+L 416.835 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_5">
- <path d="M 47.72 387.16
-L 415.575 387.16
+ <path d="M 47.855 388.6
+L 416.835 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_6">
- <path d="M 47.72 39.24
-L 415.575 39.24
+ <path d="M 47.855 36.72
+L 416.835 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
<g id="axes_2">
<g id="patch_7">
- <path d="M 477.425 387.16
-L 845.28 387.16
-L 845.28 39.24
-L 477.425 39.24
+ <path d="M 476.255 388.6
+L 845.235 388.6
+L 845.235 36.72
+L 476.255 36.72
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_3">
<g id="xtick_8">
<g id="line2d_26">
- <path clip-path="url(#pc114ec78aa)" d="M 477.425 387.16
-L 477.425 39.24
+ <path clip-path="url(#p89e61601c2)" d="M 476.255 388.6
+L 476.255 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_27">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#mf5a66f271b" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#mf936eb5a21" y="388.6"/>
</g>
</g>
<g id="text_15">
<!-- 0.0 -->
- <g transform="translate(469.473437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(468.303437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -997,18 +997,18 @@ L 477.425 39.24
</g>
<g id="xtick_9">
<g id="line2d_28">
- <path clip-path="url(#pc114ec78aa)" d="M 550.996 387.16
-L 550.996 39.24
+ <path clip-path="url(#p89e61601c2)" d="M 550.051 388.6
+L 550.051 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_29">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="550.996" xlink:href="#mf5a66f271b" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="550.051" xlink:href="#mf936eb5a21" y="388.6"/>
</g>
</g>
<g id="text_16">
<!-- 0.2 -->
- <g transform="translate(543.044437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(542.099437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
@@ -1017,18 +1017,18 @@ L 550.996 39.24
</g>
<g id="xtick_10">
<g id="line2d_30">
- <path clip-path="url(#pc114ec78aa)" d="M 624.567 387.16
-L 624.567 39.24
+ <path clip-path="url(#p89e61601c2)" d="M 623.847 388.6
+L 623.847 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_31">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="624.567" xlink:href="#mf5a66f271b" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="623.847" xlink:href="#mf936eb5a21" y="388.6"/>
</g>
</g>
<g id="text_17">
<!-- 0.4 -->
- <g transform="translate(616.615437 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(615.895437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
@@ -1037,18 +1037,18 @@ L 624.567 39.24
</g>
<g id="xtick_11">
<g id="line2d_32">
- <path clip-path="url(#pc114ec78aa)" d="M 698.138 387.16
-L 698.138 39.24
+ <path clip-path="url(#p89e61601c2)" d="M 697.643 388.6
+L 697.643 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_33">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="698.138" xlink:href="#mf5a66f271b" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="697.643" xlink:href="#mf936eb5a21" y="388.6"/>
</g>
</g>
<g id="text_18">
<!-- 0.6 -->
- <g transform="translate(690.186438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(689.691437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
@@ -1057,18 +1057,18 @@ L 698.138 39.24
</g>
<g id="xtick_12">
<g id="line2d_34">
- <path clip-path="url(#pc114ec78aa)" d="M 771.709 387.16
-L 771.709 39.24
+ <path clip-path="url(#p89e61601c2)" d="M 771.439 388.6
+L 771.439 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_35">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="771.709" xlink:href="#mf5a66f271b" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="771.439" xlink:href="#mf936eb5a21" y="388.6"/>
</g>
</g>
<g id="text_19">
<!-- 0.8 -->
- <g transform="translate(763.757438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(763.487437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
@@ -1077,18 +1077,18 @@ L 771.709 39.24
</g>
<g id="xtick_13">
<g id="line2d_36">
- <path clip-path="url(#pc114ec78aa)" d="M 845.28 387.16
-L 845.28 39.24
+ <path clip-path="url(#p89e61601c2)" d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_37">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="845.28" xlink:href="#mf5a66f271b" y="387.16"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="845.235" xlink:href="#mf936eb5a21" y="388.6"/>
</g>
</g>
<g id="text_20">
<!-- 1.0 -->
- <g transform="translate(837.328438 401.758438)scale(0.1 -0.1)">
+ <g transform="translate(837.283437 403.198438)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-49"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@@ -1321,7 +1321,7 @@ Q 14.5 64.65625 8.015625 75.875
z
" id="DejaVuSans-41"/>
</defs>
- <g transform="translate(562.5525 415.438125)scale(0.1 -0.1)">
+ <g transform="translate(561.945 416.878125)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-78"/>
<use transform="translate(74.804688 0.015625)" xlink:href="#DejaVuSans-111"/>
<use transform="translate(135.986328 0.015625)" xlink:href="#DejaVuSans-114"/>
@@ -1364,13 +1364,13 @@ z
<g id="matplotlib.axis_4">
<g id="ytick_6">
<g id="line2d_38">
- <path clip-path="url(#pc114ec78aa)" d="M 477.425 371.345455
-L 845.28 371.345455
+ <path clip-path="url(#p89e61601c2)" d="M 476.255 372.605455
+L 845.235 372.605455
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_39">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m971e6caaf5" y="371.345455"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#md6ec74d2e9" y="372.605455"/>
</g>
</g>
<g id="text_22">
@@ -1383,7 +1383,7 @@ L 10.59375 27.203125
z
" id="DejaVuSans-8722"/>
</defs>
- <g transform="translate(442.957812 375.144673)scale(0.1 -0.1)">
+ <g transform="translate(441.787812 376.404673)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-51"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1393,18 +1393,18 @@ z
</g>
<g id="ytick_7">
<g id="line2d_40">
- <path clip-path="url(#pc114ec78aa)" d="M 477.425 323.437543
-L 845.28 323.437543
+ <path clip-path="url(#p89e61601c2)" d="M 476.255 324.152258
+L 845.235 324.152258
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_41">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m971e6caaf5" y="323.437543"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#md6ec74d2e9" y="324.152258"/>
</g>
</g>
<g id="text_23">
<!-- −250 -->
- <g transform="translate(442.957812 327.236761)scale(0.1 -0.1)">
+ <g transform="translate(441.787812 327.951477)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-50"/>
<use x="147.412109" xlink:href="#DejaVuSans-53"/>
@@ -1414,18 +1414,18 @@ L 845.28 323.437543
</g>
<g id="ytick_8">
<g id="line2d_42">
- <path clip-path="url(#pc114ec78aa)" d="M 477.425 275.529631
-L 845.28 275.529631
+ <path clip-path="url(#p89e61601c2)" d="M 476.255 275.699062
+L 845.235 275.699062
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_43">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m971e6caaf5" y="275.529631"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#md6ec74d2e9" y="275.699062"/>
</g>
</g>
<g id="text_24">
<!-- −200 -->
- <g transform="translate(442.957812 279.328849)scale(0.1 -0.1)">
+ <g transform="translate(441.787812 279.498281)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-50"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1435,18 +1435,18 @@ L 845.28 275.529631
</g>
<g id="ytick_9">
<g id="line2d_44">
- <path clip-path="url(#pc114ec78aa)" d="M 477.425 227.621719
-L 845.28 227.621719
+ <path clip-path="url(#p89e61601c2)" d="M 476.255 227.245865
+L 845.235 227.245865
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_45">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m971e6caaf5" y="227.621719"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#md6ec74d2e9" y="227.245865"/>
</g>
</g>
<g id="text_25">
<!-- −150 -->
- <g transform="translate(442.957812 231.420937)scale(0.1 -0.1)">
+ <g transform="translate(441.787812 231.045084)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-49"/>
<use x="147.412109" xlink:href="#DejaVuSans-53"/>
@@ -1456,18 +1456,18 @@ L 845.28 227.621719
</g>
<g id="ytick_10">
<g id="line2d_46">
- <path clip-path="url(#pc114ec78aa)" d="M 477.425 179.713807
-L 845.28 179.713807
+ <path clip-path="url(#p89e61601c2)" d="M 476.255 178.792669
+L 845.235 178.792669
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_47">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m971e6caaf5" y="179.713807"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#md6ec74d2e9" y="178.792669"/>
</g>
</g>
<g id="text_26">
<!-- −100 -->
- <g transform="translate(442.957812 183.513025)scale(0.1 -0.1)">
+ <g transform="translate(441.787812 182.591888)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-49"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1477,18 +1477,18 @@ L 845.28 179.713807
</g>
<g id="ytick_11">
<g id="line2d_48">
- <path clip-path="url(#pc114ec78aa)" d="M 477.425 131.805895
-L 845.28 131.805895
+ <path clip-path="url(#p89e61601c2)" d="M 476.255 130.339473
+L 845.235 130.339473
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_49">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m971e6caaf5" y="131.805895"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#md6ec74d2e9" y="130.339473"/>
</g>
</g>
<g id="text_27">
<!-- −50 -->
- <g transform="translate(449.320312 135.605113)scale(0.1 -0.1)">
+ <g transform="translate(448.150312 134.138692)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-8722"/>
<use x="83.789062" xlink:href="#DejaVuSans-53"/>
<use x="147.412109" xlink:href="#DejaVuSans-48"/>
@@ -1497,18 +1497,18 @@ L 845.28 131.805895
</g>
<g id="ytick_12">
<g id="line2d_50">
- <path clip-path="url(#pc114ec78aa)" d="M 477.425 83.897983
-L 845.28 83.897983
+ <path clip-path="url(#p89e61601c2)" d="M 476.255 81.886276
+L 845.235 81.886276
" style="fill:none;stroke:#777777;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="line2d_51">
<g>
- <use style="stroke:#000000;stroke-width:0.8;" x="477.425" xlink:href="#m971e6caaf5" y="83.897983"/>
+ <use style="stroke:#000000;stroke-width:0.8;" x="476.255" xlink:href="#md6ec74d2e9" y="81.886276"/>
</g>
</g>
<g id="text_28">
<!-- 0 -->
- <g transform="translate(464.0625 87.697201)scale(0.1 -0.1)">
+ <g transform="translate(462.8925 85.685495)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
</g>
</g>
@@ -1571,7 +1571,7 @@ L 9.8125 0
z
" id="DejaVuSans-66"/>
</defs>
- <g transform="translate(436.878125 236.791406)rotate(-90)scale(0.1 -0.1)">
+ <g transform="translate(435.708125 236.251406)rotate(-90)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-71"/>
<use x="77.490234" xlink:href="#DejaVuSans-97"/>
<use x="138.769531" xlink:href="#DejaVuSans-105"/>
@@ -1585,525 +1585,525 @@ z
</g>
</g>
<g id="line2d_52">
- <path clip-path="url(#pc114ec78aa)" d="M 477.425 55.054545
-L 478.861934 55.161688
-L 480.298867 55.484784
-L 481.735801 56.028971
-L 483.172734 56.803249
-L 484.609668 57.821231
-L 486.046602 59.102376
-L 487.483535 60.673983
-L 488.920469 62.574446
-L 490.357402 64.858765
-L 491.794336 67.608374
-L 493.23127 70.950061
-L 494.668203 75.096257
-L 496.105137 80.444405
-L 496.823604 83.80796
-L 497.54207 87.88435
-L 498.260537 93.068947
-L 498.979004 100.24869
-L 499.697471 112.252308
-L 500.415938 371.345455
-L 501.134404 113.294639
-L 501.852871 102.33539
-L 502.571338 96.204116
-L 503.289805 92.074198
-L 504.008271 89.060885
-L 504.726738 86.77109
-L 505.445205 84.996119
-L 506.163672 83.612394
-L 506.882139 82.541229
-L 507.600605 81.729979
-L 508.319072 81.14225
-L 509.037539 80.752424
-L 509.756006 80.542439
-L 510.474473 80.499812
-L 511.192939 80.61642
-L 511.911406 80.887772
-L 512.629873 81.312612
-L 513.34834 81.8928
-L 514.066807 82.633432
-L 514.785273 83.543243
-L 516.222207 85.928416
-L 516.940674 87.448745
-L 517.659141 89.23339
-L 518.377607 91.335695
-L 519.096074 93.83507
-L 519.814541 96.855851
-L 520.533008 100.607534
-L 521.251475 105.484046
-L 521.969941 112.371037
-L 522.688408 124.096077
-L 523.406875 371.345455
-L 524.125342 124.619729
-L 524.843809 113.418595
-L 525.562275 107.05602
-L 526.280742 102.70469
-L 526.999209 99.479213
-L 527.717676 96.985925
-L 528.436143 95.015596
-L 529.154609 93.444159
-L 529.873076 92.192481
-L 530.591543 91.207501
-L 531.31001 90.452442
-L 532.028477 89.901336
-L 532.746943 89.53579
-L 533.46541 89.343019
-L 534.183877 89.314618
-L 534.902344 89.445833
-L 535.620811 89.735164
-L 536.339277 90.184242
-L 537.057744 90.797951
-L 537.776211 91.584827
-L 538.494678 92.557786
-L 539.213145 93.735355
-L 539.931611 95.143635
-L 540.650078 96.81954
-L 541.368545 98.816267
-L 542.087012 101.213088
-L 542.805479 104.134214
-L 543.523945 107.789016
-L 544.242412 112.571309
-L 544.960879 119.366633
-L 545.679346 131.002457
-L 546.397812 371.345455
-L 547.116279 131.354644
-L 547.834746 120.071082
-L 548.553213 113.628172
-L 549.27168 109.198521
-L 549.990146 105.896662
-L 550.708613 103.328861
-L 551.42708 101.28582
-L 552.145547 99.643408
-L 552.864014 98.322431
-L 553.58248 97.269771
-L 554.300947 96.448594
-L 555.019414 95.832879
-L 555.737881 95.404185
-L 556.456348 95.149675
-L 557.174814 95.0609
-L 557.893281 95.133062
-L 558.611748 95.364619
-L 559.330215 95.757161
-L 560.048682 96.315533
-L 560.767148 97.048234
-L 561.485615 97.968146
-L 562.204082 99.09376
-L 562.922549 100.451145
-L 563.641016 102.077184
-L 564.359482 104.025043
-L 565.077949 106.373967
-L 565.796416 109.248136
-L 566.514883 112.856898
-L 567.23335 117.594038
-L 567.951816 124.345075
-L 568.670283 135.937453
-L 569.38875 371.345455
-L 570.107217 136.205179
-L 570.825684 124.880559
-L 571.54415 118.397345
-L 572.262617 113.928123
-L 572.981084 110.587409
-L 573.699551 107.981449
-L 574.418018 105.900928
-L 575.136484 104.221698
-L 575.854951 102.864548
-L 576.573418 101.776344
-L 577.291885 100.920237
-L 578.010352 100.270191
-L 578.728818 99.807748
-L 579.447285 99.520061
-L 580.165752 99.398666
-L 580.884219 99.438751
-L 581.602686 99.638762
-L 582.321152 100.000276
-L 583.039619 100.528127
-L 583.758086 101.230803
-L 584.476553 102.121173
-L 585.19502 103.217718
-L 585.913486 104.546499
-L 586.631953 106.144384
-L 587.35042 108.064533
-L 588.068887 110.38618
-L 588.787354 113.233497
-L 589.50582 116.81582
-L 590.224287 121.526929
-L 590.942754 128.252332
-L 591.661221 139.819465
-L 592.379688 371.345455
-L 593.098154 140.037839
-L 593.816621 128.689096
-L 594.535088 122.182117
-L 595.253555 117.689483
-L 595.972021 114.325702
-L 596.690488 111.697011
-L 597.408955 109.594092
-L 598.127422 107.89279
-L 598.845889 106.513885
-L 599.564355 105.40424
-L 600.282822 104.526998
-L 601.001289 103.856119
-L 601.719756 103.373139
-L 602.438223 103.065205
-L 603.156689 102.923848
-L 603.875156 102.944251
-L 604.593623 103.124854
-L 605.31209 103.467231
-L 606.030557 103.976211
-L 606.749023 104.660275
-L 607.46749 105.53229
-L 608.185957 106.610732
-L 608.904424 107.921657
-L 609.622891 109.50193
-L 610.341357 111.404705
-L 611.059824 113.709214
-L 611.778291 116.539624
-L 612.496758 120.105268
-L 613.215225 124.799922
-L 613.933691 131.50909
-L 614.652158 143.060205
-L 615.370625 371.345455
-L 616.089092 143.247179
-L 616.807559 131.883048
-L 617.526025 125.360886
-L 618.244492 120.853267
-L 618.962959 117.4747
-L 619.681426 114.831418
-L 620.399893 112.714099
-L 621.118359 110.998585
-L 621.836826 109.605655
-L 622.555293 108.482167
-L 623.27376 107.591265
-L 623.992227 106.906902
-L 624.710693 106.410616
-L 625.42916 106.089547
-L 626.147627 105.935227
-L 626.866094 105.942835
-L 627.584561 106.11081
-L 628.303027 106.440722
-L 629.021494 106.9374
-L 629.739961 107.60932
-L 630.458428 108.46935
-L 631.176895 109.535963
-L 631.895361 110.83521
-L 632.613828 112.403959
-L 633.332295 114.29536
-L 634.050762 116.588642
-L 634.769229 119.407971
-L 635.487695 122.962679
-L 636.206162 127.646538
-L 636.924629 134.345053
-L 637.643096 145.885654
-L 638.361562 371.345455
-L 639.080029 146.052012
-L 639.798496 134.677776
-L 640.516963 128.145641
-L 641.23543 123.628182
-L 641.953896 120.239904
-L 642.672363 117.58704
-L 643.39083 115.460266
-L 644.109297 113.735424
-L 644.827764 112.33329
-L 645.54623 111.200723
-L 646.264697 110.300862
-L 646.983164 109.607662
-L 647.701631 109.102658
-L 648.420098 108.772991
-L 649.138564 108.61019
-L 649.857031 108.609434
-L 650.575498 108.76916
-L 651.293965 109.090937
-L 652.012432 109.579593
-L 652.730898 110.243604
-L 653.449365 111.095836
-L 654.167832 112.154761
-L 654.886299 113.446431
-L 655.604766 115.00771
-L 656.323232 116.891749
-L 657.041699 119.177776
-L 657.760166 121.989956
-L 658.478633 125.537621
-L 659.1971 130.214541
-L 659.915566 136.90622
-L 660.634033 148.440089
-L 661.3525 371.345455
-L 662.070967 148.593288
-L 662.789434 137.212624
-L 663.5079 130.674161
-L 664.226367 126.150474
-L 664.944834 122.756066
-L 665.663301 120.097171
-L 666.381768 117.964464
-L 667.100234 116.233786
-L 667.818701 114.825913
-L 668.537168 113.687702
-L 669.255635 112.782294
-L 669.974102 112.083642
-L 670.692568 111.57328
-L 671.411035 111.23835
-L 672.129502 111.070379
-L 672.847969 111.064546
-L 673.566436 111.219289
-L 674.284902 111.536176
-L 675.003369 112.020034
-L 675.721836 112.679339
-L 676.440303 113.526957
-L 677.15877 114.581358
-L 677.877236 115.868596
-L 678.595703 117.425534
-L 679.31417 119.305322
-L 680.032637 121.587189
-L 680.751104 124.395298
-L 681.46957 127.938982
-L 682.188037 132.612012
-L 682.906504 139.299889
-L 683.624971 150.830046
-L 684.343438 371.345455
-L 685.061904 150.976089
-L 685.780371 139.59198
-L 686.498838 133.050161
-L 687.217305 128.523207
-L 687.935771 125.125622
-L 688.654238 122.463638
-L 689.372705 120.32793
-L 690.091172 118.59434
-L 690.809639 117.183645
-L 691.528105 116.0427
-L 692.246572 115.134647
-L 692.965039 114.433439
-L 693.683506 113.92061
-L 694.401973 113.583302
-L 695.120439 113.413042
-L 695.838906 113.40501
-L 696.557373 113.557644
-L 697.27584 113.872511
-L 697.994307 114.354438
-L 698.712773 115.011904
-L 699.43124 115.857772
-L 700.149707 116.910515
-L 700.868174 118.196185
-L 701.586641 119.751646
-L 702.305107 121.630049
-L 703.023574 123.910623
-L 703.742041 126.717531
-L 704.460508 130.260106
-L 705.178975 134.932121
-L 705.897441 141.619076
-L 706.615908 153.148405
-L 707.334375 371.345455
-L 708.052842 153.293074
-L 708.771309 141.908421
-L 709.489775 135.366154
-L 710.208242 130.838848
-L 710.926709 127.441007
-L 711.645176 124.778865
-L 712.363643 122.643098
-L 713.082109 120.909547
-L 713.800576 119.49899
-L 714.519043 118.358283
-L 715.23751 117.450568
-L 715.955977 116.749801
-L 716.674443 116.237514
-L 717.39291 115.900852
-L 718.111377 115.731341
-L 718.829844 115.724164
-L 719.548311 115.877756
-L 720.266777 116.19369
-L 720.985244 116.676791
-L 721.703711 117.335538
-L 722.422178 118.182797
-L 723.140645 119.237041
-L 723.859111 120.524324
-L 724.577578 122.08151
-L 725.296045 123.961752
-L 726.014512 126.244279
-L 726.732979 129.053257
-L 727.451445 132.598019
-L 728.169912 137.272338
-L 728.888379 143.961719
-L 729.606846 155.493593
-L 730.325313 371.345455
-L 731.043779 155.643723
-L 731.762246 144.261988
-L 732.480713 137.722766
-L 733.19918 133.198633
-L 733.917646 129.804095
-L 734.636113 127.145388
-L 735.35458 125.013189
-L 736.073047 123.283341
-L 736.791514 121.876624
-L 737.50998 120.739897
-L 738.228447 119.836302
-L 738.946914 119.139797
-L 739.665381 118.631918
-L 740.383848 118.29981
-L 741.102314 118.135002
-L 741.820781 118.132679
-L 742.539248 118.291279
-L 743.257715 118.612375
-L 743.976182 119.100797
-L 744.694648 119.765027
-L 745.413115 120.617931
-L 746.131582 121.677986
-L 746.850049 122.971247
-L 747.568516 124.534584
-L 748.286982 126.421151
-L 749.005449 128.710179
-L 749.723916 131.525839
-L 750.442383 135.077465
-L 751.16085 139.758836
-L 751.879316 146.455457
-L 752.597783 157.994765
-L 753.31625 371.345455
-L 754.034717 158.160357
-L 754.753184 146.786656
-L 755.47165 140.255677
-L 756.190117 135.739998
-L 756.908584 132.354131
-L 757.627051 129.704315
-L 758.345518 127.581231
-L 759.063984 125.860728
-L 759.782451 124.463589
-L 760.500918 123.336678
-L 761.219385 122.443143
-L 761.937852 121.756946
-L 762.656318 121.259629
-L 763.374785 120.938342
-L 764.093252 120.784621
-L 764.811719 120.793654
-L 765.530186 120.963888
-L 766.248652 121.296901
-L 766.967119 121.797529
-L 767.685586 122.47426
-L 768.404053 123.339969
-L 769.12252 124.413138
-L 769.840986 125.719832
-L 770.559453 127.296926
-L 771.27792 129.197581
-L 771.996387 131.50104
-L 772.714854 134.33148
-L 773.43332 137.898245
-L 774.151787 142.595121
-L 774.870254 149.307625
-L 775.588721 160.863202
-L 776.307188 371.345455
-L 777.025654 161.062532
-L 777.744121 149.706322
-L 778.462588 143.193263
-L 779.181055 138.695946
-L 779.899521 135.328895
-L 780.617988 132.69836
-L 781.336455 130.595038
-L 782.054922 128.894789
-L 782.773389 127.518412
-L 783.491855 126.412786
-L 784.210322 125.541075
-L 784.928789 124.877256
-L 785.647256 124.402889
-L 786.365723 124.10514
-L 787.084189 123.975566
-L 787.802656 124.009372
-L 788.521123 124.205026
-L 789.23959 124.564127
-L 789.958057 125.091532
-L 790.676523 125.795754
-L 791.39499 126.68969
-L 792.113457 127.791849
-L 792.831924 129.128321
-L 793.550391 130.736008
-L 794.268857 132.668103
-L 794.987324 135.003876
-L 795.705791 137.867538
-L 796.424258 141.468465
-L 797.142725 146.20048
-L 797.861191 152.949135
-L 798.579658 164.541917
-L 799.298125 371.345455
-L 800.016592 164.818979
-L 800.735059 153.503388
-L 801.453525 147.032177
-L 802.171992 142.577992
-L 802.890459 139.255407
-L 803.608926 136.670733
-L 804.327393 134.614726
-L 805.045859 132.96331
-L 805.764326 131.637353
-L 806.482793 130.583806
-L 807.20126 129.76591
-L 807.919727 129.157724
-L 808.638193 128.740895
-L 809.35666 128.502683
-L 810.075127 128.434743
-L 810.793594 128.53239
-L 811.512061 128.794202
-L 812.230527 129.221902
-L 812.948994 129.82048
-L 813.667461 130.598585
-L 814.385928 131.569271
-L 815.104395 132.751207
-L 815.822861 134.17066
-L 816.541328 135.864726
-L 817.259795 137.886801
-L 817.978262 140.316383
-L 818.696729 143.277925
-L 819.415195 146.981071
-L 820.133662 151.819934
-L 820.852129 158.680384
-L 821.570596 170.390257
-L 822.289062 371.345455
-L 823.007529 170.918967
-L 823.725996 159.738823
-L 824.444463 153.410152
-L 825.16293 149.106174
-L 825.881396 145.942112
-L 826.599863 143.524997
-L 827.31833 141.646399
-L 828.036797 140.183161
-L 828.755264 139.057193
-L 829.47373 138.216633
-L 830.192197 137.626087
-L 830.910664 137.261184
-L 831.629131 137.105395
-L 832.347598 137.148112
-L 833.066064 137.383501
-L 833.784531 137.80986
-L 834.502998 138.429348
-L 835.221465 139.248029
-L 835.939932 140.276226
-L 836.658398 141.529236
-L 837.376865 143.028524
-L 838.095332 144.803629
-L 838.813799 146.895179
-L 839.532266 149.359776
-L 840.250732 152.278247
-L 840.969199 155.770356
-L 841.687666 160.023113
-L 842.406133 165.351134
-L 843.1246 172.345568
-L 843.843066 182.33504
-L 844.561533 199.560955
-L 844.561533 199.560955
+ <path clip-path="url(#p89e61601c2)" d="M 476.255 52.714545
+L 477.696328 52.822907
+L 479.137656 53.149681
+L 480.578984 53.700062
+L 482.020312 54.483152
+L 483.461641 55.512721
+L 484.902969 56.808448
+L 486.344297 58.397943
+L 487.785625 60.320037
+L 489.226953 62.630355
+L 490.668281 65.411261
+L 492.109609 68.790982
+L 493.550937 72.984371
+L 494.992266 78.39339
+L 495.71293 81.79523
+L 496.433594 85.918016
+L 497.154258 91.161624
+L 497.874922 98.423087
+L 498.595586 110.563329
+L 499.31625 372.605455
+L 500.036914 111.617523
+L 500.757578 100.533537
+L 501.478242 94.332477
+L 502.198906 90.155553
+L 502.91957 87.107942
+L 503.640234 84.792086
+L 504.360898 82.996912
+L 505.081562 81.597437
+L 505.802227 80.514081
+L 506.522891 79.693597
+L 507.243555 79.099178
+L 507.964219 78.704916
+L 508.684883 78.492541
+L 509.405547 78.449428
+L 510.126211 78.567363
+L 510.846875 78.841804
+L 511.567539 79.27148
+L 512.288203 79.858271
+L 513.008867 80.607333
+L 513.729531 81.5275
+L 515.170859 83.93982
+L 515.891523 85.477453
+L 516.612187 87.282411
+L 517.332852 89.408645
+L 518.053516 91.936467
+L 518.77418 94.991631
+L 519.494844 98.786015
+L 520.215508 103.718031
+L 520.936172 110.683409
+L 521.656836 122.541903
+L 522.3775 372.605455
+L 523.098164 123.071515
+L 523.818828 111.74289
+L 524.539492 105.307897
+L 525.260156 100.90704
+L 525.98082 97.644851
+L 526.701484 95.123184
+L 527.422148 93.130429
+L 528.142812 91.541107
+L 528.863477 90.275182
+L 529.584141 89.278991
+L 530.304805 88.515339
+L 531.025469 87.95796
+L 531.746133 87.588253
+L 532.466797 87.393288
+L 533.187461 87.364563
+L 533.908125 87.497272
+L 534.628789 87.789896
+L 535.349453 88.244086
+L 536.070117 88.86478
+L 536.790781 89.660612
+L 537.511445 90.644646
+L 538.232109 91.835617
+L 538.952773 93.259926
+L 539.673437 94.954906
+L 540.394102 96.974359
+L 541.114766 99.398461
+L 541.83543 102.352835
+L 542.556094 106.049236
+L 543.276758 110.88596
+L 543.997422 117.758628
+L 544.718086 129.52689
+L 545.43875 372.605455
+L 546.159414 129.883086
+L 546.880078 118.471096
+L 547.600742 111.954853
+L 548.321406 107.474784
+L 549.04207 104.135344
+L 549.762734 101.538315
+L 550.483398 99.472021
+L 551.204062 97.810915
+L 551.924727 96.474903
+L 552.645391 95.410262
+L 553.366055 94.579738
+L 554.086719 93.957016
+L 554.807383 93.523441
+L 555.528047 93.266034
+L 556.248711 93.176249
+L 556.969375 93.249233
+L 557.690039 93.483426
+L 558.410703 93.880435
+L 559.131367 94.445163
+L 559.852031 95.186203
+L 560.572695 96.116586
+L 561.293359 97.255011
+L 562.014023 98.627846
+L 562.734687 100.272392
+L 563.455352 102.242422
+L 564.176016 104.618081
+L 564.89668 107.524964
+L 565.617344 111.1748
+L 566.338008 115.965858
+L 567.058672 122.793735
+L 567.779336 134.518056
+L 568.5 372.605455
+L 569.220664 134.788829
+L 569.941328 123.335313
+L 570.661992 116.778308
+L 571.382656 112.258218
+L 572.10332 108.87948
+L 572.823984 106.243859
+L 573.544648 104.139658
+L 574.265312 102.441315
+L 574.985977 101.068718
+L 575.706641 99.968128
+L 576.427305 99.102277
+L 577.147969 98.444832
+L 577.868633 97.977126
+L 578.589297 97.686164
+L 579.309961 97.563387
+L 580.030625 97.603929
+L 580.751289 97.806216
+L 581.471953 98.171845
+L 582.192617 98.705704
+L 582.913281 99.416377
+L 583.633945 100.316882
+L 584.354609 101.425908
+L 585.075273 102.769812
+L 585.795937 104.385885
+L 586.516602 106.327889
+L 587.237266 108.675961
+L 587.95793 111.555686
+L 588.678594 115.178783
+L 589.399258 119.943513
+L 590.119922 126.745464
+L 590.840586 138.444253
+L 591.56125 372.605455
+L 592.281914 138.665112
+L 593.002578 127.187199
+L 593.723242 120.606158
+L 594.443906 116.062389
+L 595.16457 112.660322
+L 595.885234 110.001712
+L 596.605898 107.874857
+L 597.326562 106.154191
+L 598.047227 104.759592
+L 598.767891 103.637316
+L 599.488555 102.75009
+L 600.209219 102.071575
+L 600.929883 101.583098
+L 601.650547 101.271659
+L 602.371211 101.128692
+L 603.091875 101.149328
+L 603.812539 101.331987
+L 604.533203 101.678261
+L 605.253867 102.193034
+L 605.974531 102.884884
+L 606.695195 103.766824
+L 607.415859 104.857541
+L 608.136523 106.183386
+L 608.857187 107.781646
+L 609.577852 109.706079
+L 610.298516 112.036817
+L 611.01918 114.899443
+L 611.739844 118.505671
+L 612.460508 123.253759
+L 613.181172 130.03929
+L 613.901836 141.721879
+L 614.6225 372.605455
+L 615.343164 141.910981
+L 616.063828 130.417505
+L 616.784492 123.821107
+L 617.505156 119.262184
+L 618.22582 115.845161
+L 618.946484 113.171794
+L 619.667148 111.030375
+L 620.387812 109.295336
+L 621.108477 107.886552
+L 621.829141 106.750277
+L 622.549805 105.849234
+L 623.270469 105.157082
+L 623.991133 104.655147
+L 624.711797 104.330424
+L 625.432461 104.174347
+L 626.153125 104.182042
+L 626.873789 104.351929
+L 627.594453 104.685596
+L 628.315117 105.187926
+L 629.035781 105.867495
+L 629.756445 106.737314
+L 630.477109 107.816066
+L 631.197773 109.130102
+L 631.918437 110.716706
+L 632.639102 112.629634
+L 633.359766 114.949018
+L 634.08043 117.800437
+L 634.801094 121.395604
+L 635.521758 126.132775
+L 636.242422 132.907532
+L 636.963086 144.579487
+L 637.68375 372.605455
+L 638.404414 144.747739
+L 639.125078 133.244042
+L 639.845742 126.637559
+L 640.566406 122.068682
+L 641.28707 118.641839
+L 642.007734 115.95878
+L 642.728398 113.8078
+L 643.449062 112.063325
+L 644.169727 110.645233
+L 644.890391 109.499774
+L 645.611055 108.589672
+L 646.331719 107.888582
+L 647.052383 107.37783
+L 647.773047 107.044411
+L 648.493711 106.879756
+L 649.214375 106.878991
+L 649.935039 107.040535
+L 650.655703 107.365975
+L 651.376367 107.860193
+L 652.097031 108.531762
+L 652.817695 109.393694
+L 653.538359 110.464672
+L 654.259023 111.771043
+L 654.979687 113.350093
+L 655.700352 115.255576
+L 656.421016 117.567622
+L 657.14168 120.41181
+L 657.862344 123.999854
+L 658.583008 128.730007
+L 659.303672 135.49785
+L 660.024336 147.162997
+L 660.745 367.76924
+L 661.465664 147.317939
+L 662.186328 135.807741
+L 662.906992 129.194858
+L 663.627656 124.619682
+L 664.34832 121.18664
+L 665.068984 118.497482
+L 665.789648 116.3405
+L 666.510312 114.590123
+L 667.230977 113.166226
+L 667.951641 112.01506
+L 668.672305 111.099347
+L 669.392969 110.392743
+L 670.113633 109.876572
+L 670.834297 109.53783
+L 671.554961 109.367947
+L 672.275625 109.362048
+L 672.996289 109.518552
+L 673.716953 109.839046
+L 674.437617 110.328411
+L 675.158281 110.99522
+L 675.878945 111.852486
+L 676.599609 112.918888
+L 677.320273 114.220777
+L 678.040937 115.795436
+L 678.761602 117.69662
+L 679.482266 120.004458
+L 680.20293 122.84453
+L 680.923594 126.428547
+L 681.644258 131.154765
+L 682.364922 137.918764
+L 683.085586 149.580156
+L 683.80625 372.605455
+L 684.526914 149.727861
+L 685.247578 138.214179
+L 685.968242 131.597902
+L 686.688906 127.019422
+L 687.40957 123.583166
+L 688.130234 120.890883
+L 688.850898 118.730867
+L 689.571562 116.977546
+L 690.292227 115.550794
+L 691.012891 114.396863
+L 691.733555 113.478474
+L 692.454219 112.769285
+L 693.174883 112.250619
+L 693.895547 111.909472
+L 694.616211 111.737274
+L 695.336875 111.729151
+L 696.057539 111.883521
+L 696.778203 112.201972
+L 697.498867 112.689385
+L 698.219531 113.354334
+L 698.940195 114.20983
+L 699.660859 115.274555
+L 700.381523 116.574858
+L 701.102187 118.148024
+L 701.822852 120.047807
+L 702.543516 122.354337
+L 703.26418 125.193194
+L 703.984844 128.776091
+L 704.705508 133.501281
+L 705.426172 140.264348
+L 706.146836 151.924902
+L 706.8675 372.605455
+L 707.588164 152.071218
+L 708.308828 140.556985
+L 709.029492 133.940255
+L 709.750156 129.361419
+L 710.47082 125.924904
+L 711.191484 123.232462
+L 711.912148 121.072386
+L 712.632812 119.319103
+L 713.353477 117.892492
+L 714.074141 116.738801
+L 714.794805 115.820755
+L 715.515469 115.112012
+L 716.236133 114.593894
+L 716.956797 114.2534
+L 717.677461 114.08196
+L 718.398125 114.074701
+L 719.118789 114.230042
+L 719.839453 114.549571
+L 720.560117 115.03817
+L 721.280781 115.704415
+L 722.001445 116.561318
+L 722.722109 117.627562
+L 723.442773 118.929496
+L 724.163437 120.504406
+L 724.884102 122.406049
+L 725.604766 124.714555
+L 726.32543 127.555505
+L 727.046094 131.140613
+L 727.766758 135.868135
+L 728.487422 142.633654
+L 729.208086 154.296783
+L 729.92875 372.605455
+L 730.649414 154.448622
+L 731.370078 142.937341
+L 732.090742 136.323689
+L 732.811406 131.748063
+L 733.53207 128.314889
+L 734.252734 125.625921
+L 734.973398 123.469453
+L 735.694062 121.719916
+L 736.414727 120.297189
+L 737.135391 119.147523
+L 737.856055 118.233644
+L 738.576719 117.529211
+L 739.297383 117.015551
+L 740.018047 116.679663
+L 740.738711 116.512979
+L 741.459375 116.510629
+L 742.180039 116.671035
+L 742.900703 116.995786
+L 743.621367 117.489767
+L 744.342031 118.161557
+L 745.062695 119.024168
+L 745.783359 120.096289
+L 746.504023 121.40427
+L 747.224687 122.985401
+L 747.945352 124.89344
+L 748.666016 127.208522
+L 749.38668 130.056229
+L 750.107344 133.64828
+L 750.828008 138.382934
+L 751.548672 145.155775
+L 752.269336 156.826423
+L 752.99 372.605455
+L 753.710664 156.993899
+L 754.431328 145.490745
+L 755.151992 138.88543
+L 755.872656 134.318354
+L 756.59332 130.893949
+L 757.313984 128.213973
+L 758.034648 126.066725
+L 758.755312 124.326639
+L 759.475977 122.913598
+L 760.196641 121.77386
+L 760.917305 120.870155
+L 761.637969 120.176148
+L 762.358633 119.673171
+L 763.079297 119.348227
+L 763.799961 119.192756
+L 764.520625 119.201892
+L 765.241289 119.374064
+L 765.961953 119.710867
+L 766.682617 120.217193
+L 767.403281 120.901626
+L 768.123945 121.777189
+L 768.844609 122.862573
+L 769.565273 124.184139
+L 770.285937 125.779183
+L 771.006602 127.701472
+L 771.727266 130.031149
+L 772.44793 132.893804
+L 773.168594 136.501166
+L 773.889258 141.251501
+L 774.609922 148.040406
+L 775.330586 159.727508
+L 776.05125 372.605455
+L 776.771914 159.929107
+L 777.492578 148.443642
+L 778.213242 141.856451
+L 778.933906 137.307947
+L 779.65457 133.902571
+L 780.375234 131.242096
+L 781.095898 129.114834
+L 781.816562 127.395233
+L 782.537227 126.003191
+L 783.257891 124.88498
+L 783.978555 124.003348
+L 784.699219 123.331973
+L 785.419883 122.852207
+L 786.140547 122.551069
+L 786.861211 122.42002
+L 787.581875 122.454211
+L 788.302539 122.652092
+L 789.023203 123.01528
+L 789.743867 123.548688
+L 790.464531 124.260925
+L 791.185195 125.165036
+L 791.905859 126.27974
+L 792.626523 127.631423
+L 793.347187 129.257409
+L 794.067852 131.211495
+L 794.788516 133.573854
+L 795.50918 136.470109
+L 796.229844 140.112022
+L 796.950508 144.897896
+L 797.671172 151.723364
+L 798.391836 163.448094
+L 799.1125 372.605455
+L 799.833164 163.72831
+L 800.553828 152.283925
+L 801.274492 145.73906
+L 801.995156 141.234177
+L 802.71582 137.873775
+L 803.436484 135.259683
+L 804.157148 133.180274
+L 804.877812 131.510062
+L 805.598477 130.169013
+L 806.319141 129.103474
+L 807.039805 128.276269
+L 807.760469 127.661161
+L 808.481133 127.239588
+L 809.201797 126.998664
+L 809.922461 126.929952
+L 810.643125 127.028709
+L 811.363789 127.293502
+L 812.084453 127.72607
+L 812.805117 128.33146
+L 813.525781 129.118422
+L 814.246445 130.100156
+L 814.967109 131.295544
+L 815.687773 132.731154
+L 816.408437 134.444501
+L 817.129102 136.489592
+L 817.849766 138.946827
+L 818.57043 141.942077
+L 819.291094 145.687372
+L 820.011758 150.58131
+L 820.732422 157.519846
+L 821.453086 169.363
+L 822.17375 372.605455
+L 822.894414 169.897728
+L 823.615078 158.590332
+L 824.335742 152.189628
+L 825.056406 147.836663
+L 825.77707 144.636587
+L 826.497734 142.191961
+L 827.218398 140.291981
+L 827.939062 138.812089
+L 828.659727 137.673305
+L 829.380391 136.823178
+L 830.101055 136.22591
+L 830.821719 135.856854
+L 831.542383 135.699292
+L 832.263047 135.742495
+L 832.983711 135.980564
+L 833.704375 136.411775
+L 834.425039 137.038314
+L 835.145703 137.866313
+L 835.866367 138.906213
+L 836.587031 140.173484
+L 837.307695 141.689837
+L 838.028359 143.485147
+L 838.749023 145.600502
+L 839.469687 148.093151
+L 840.190352 151.04484
+L 840.911016 154.576696
+L 841.63168 158.877858
+L 842.352344 164.266522
+L 843.073008 171.340566
+L 843.793672 181.443737
+L 844.514336 198.865716
+L 844.514336 198.865716
" style="fill:none;stroke:#0072bd;stroke-linecap:square;stroke-width:1.4;"/>
</g>
<g id="patch_8">
- <path d="M 477.425 387.16
-L 477.425 39.24
+ <path d="M 476.255 388.6
+L 476.255 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_9">
- <path d="M 845.28 387.16
-L 845.28 39.24
+ <path d="M 845.235 388.6
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_10">
- <path d="M 477.425 387.16
-L 845.28 387.16
+ <path d="M 476.255 388.6
+L 845.235 388.6
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_11">
- <path d="M 477.425 39.24
-L 845.28 39.24
+ <path d="M 476.255 36.72
+L 845.235 36.72
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
@@ -2191,11 +2191,11 @@ z
</g>
</g>
<defs>
- <clipPath id="p27494a8a68">
- <rect height="347.92" width="367.855" x="47.72" y="39.24"/>
+ <clipPath id="p18189ee57d">
+ <rect height="351.88" width="368.98" x="47.855" y="36.72"/>
</clipPath>
- <clipPath id="pc114ec78aa">
- <rect height="347.92" width="367.855" x="477.425" y="39.24"/>
+ <clipPath id="p89e61601c2">
+ <rect height="351.88" width="368.98" x="476.255" y="36.72"/>
</clipPath>
</defs>
</svg>
diff --git a/docs/docs/index.md b/docs/docs/index.md
@@ -1,62 +1,41 @@
-# KFR
-
-## Features
-
-* All code in the library is optimized for Intel, AMD (SSE2, SSE3, SSE4.x, AVX and AVX2 and AVX512) and ARM (NEON) processors
-* Mathematical and statistical functions
-* Template expressions (See examples)
-* All data types are supported including complex numbers
-* All vector lengths are also supported. `vec<float,1>`, `vec<unsigned,3>`, `vec<complex<float>, 11>` all are valid vector types in KFR
-* Most of the standard library functions are re-implemented to support vector of any length and data type and to support expressions
-* Runtime cpu detection
-* C API: DFT, real DFT, DCT, FIR and IIR filters and convolution, memory allocation
- * Built for SSE2, SSE4.1, AVX, AVX2, AVX512, x86 and x86_64, architecture is selected at runtime
- * Can be used with any compiler and any language with ability to call C functions
- * [Prebuilt Windows binaries](https://github.com/kfrlib/kfr/releases)
-
-### DSP/Audio algorithms
-
-* [FFT](dft.md)
-* DCT
-* [Convolution](convolution.md)
-* [FIR filtering](fir.md)
-* [FIR filter design using the window method](fir.md)
-* [Resampling with configurable quality](src.md) (See resampling.cpp from Examples directory)
-* IIR filter design
- * Butterworth
- * Chevyshev I and Chevyshev II
- * Bessel
- * Low pass, high pass, band pass, band stop
- * Convert arbitrary filter from Z, P, K format to SOS suitable for biquad function
-* Goertzel algorithm
-* Fractional delay
-* [Biquad filtering](bq.md)
-* [Biquad design functions](bq.md)
-* Oscillators: Sine, Square, Sawtooth, Triangle
-* Window functions: Triangular, Bartlett, Cosine, Hann, Bartlett-Hann, Hamming, Bohman, Blackman, Blackman-Harris, Kaiser, Flattop, Gaussian, Lanczos, Rectangular
-* [Audio file reading/writing (wav, flac, mp3)](read_audio.md)
-* Pseudorandom number generator
-* Sorting
-* Color space conversion (sRGB, XYZ, Lab, LCH)
-* Ring (Circular) buffer
-* Simple waveshaper
-* Fast incremental sine/cosine generation
-* [EBU R 128](ebur128.md)
-
-## Installation
-
-[GitHub:kfrlib/kfr/blob/master/README.md](https://github.com/kfrlib/kfr/blob/master/README.md#usage)
-
-## Compiler support
-
-Xcode | Visual Studio | Clang | GCC | Intel Compiler
------ | ------------- | ----- | --- | --------------
-9+ | 2017 | 6+ | 7+ | Experimental
-
-Tested on macOS, Windows (MinGW, MSYS and MSVC), Linux, iOS, Android.
-
-## Architecture support
-
-x86, x86_64 | ARM, ARM64 |
------ | -------------
-Scalar, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512 | Scalar, NEON, NEON64
+# KFR 5 Documentation
+
+## Getting started
+
+* [What's new in KFR 5](whatsnew5.md)
+* [Installation](installation.md)
+* [Basics](basics.md)
+* [Expressions](expressions.md)
+* [C API](capi.md)
+
+## Guides
+
+### DSP
+* [How to apply a FIR filter](fir.md)
+* [How to apply a Biquad filter](bq.md)
+* [How to do Sample Rate Conversion](src.md)
+* [How to apply Convolution Reverb](conv_reverb.md)
+* [How to measure loudness according to EBU R 128](ebur128.md)
+* [How to convert sample type](conversion.md)
+* [How to normalize audio](normalize.md)
+* [How to mix stereo channels](convert_stereo.md)
+* [FIR filters code & examples](fir_gallery.md)
+* [IIR filters code & examples](iir_gallery.md)
+* [Biquad filters code & examples](bq_gallery.md)
+* [Sample Rate Converter code & examples](src_gallery.md)
+* [Window functions code & examples](window_gallery.md)
+* [Convolution filter details](convolution.md)
+
+### FFT
+* [How to apply Fast Fourier Transform](dft.md)
+* [More about FFT/DFT](dft2.md)
+* [DFT data layout](dft_format.md)
+
+### I/O
+* [How to read WAV file](read_audio.md)
+* [File types support](file_support.md)
+* [How to plot filter impulse response](plot.md)
+
+## Function reference
+
+* [Function reference](auto/refindex.md)
diff --git a/docs/docs/installation.md b/docs/docs/installation.md
@@ -0,0 +1,257 @@
+# Installation
+
+## Support
+
+KFR is tested and supported on the following systems and architectures:
+
+**OS** • Windows • Linux • macOS • iOS • Android
+
+**CPU** • x86 • x86_64 • ARM • ARM64 (AArch64)
+
+**x86 extensions** • SSE2 • SSE3 • SSSE3 • SSE4.1 • SSE4.2 • AVX • AVX2 • AVX512 • FMA
+
+**ARM extensions** • NEON
+
+**Compiler** • GCC7+ • Clang 9+ • MSVC2019+ • Xcode 10.3+
+
+## Prerequisites
+
+* CMake 3.10 or newer for building tests and examples
+* Python 3.6+ for running examples
+* (recommended) Ninja (https://ninja-build.org/) for faster builds
+
+For running examples and generating the frequency responses of the filters some python packages are required:
+
+```bash
+# in the kfr directory
+pip install -r requirements.txt
+```
+
+### Clang
+
+Clang is highly recommended and proven to provide the best performance for KFR.
+
+#### Linux
+
+Install clang using your package manager and add the following defines to the cmake command line:
+
+```bash
+cmake -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang ...
+```
+
+#### macOS
+
+On macOS clang is the default compiler and already included in the official Xcode toolchain. No additional setup required.
+
+#### Windows
+
+Download and install the latest `win64` build from the official LLVM GitHub page:
+
+https://github.com/llvm/llvm-project/releases
+
+## Getting the source code and binaries
+
+### Git (recommended)
+
+To obtain the full source code, including examples and tests, you can clone the git repository:
+
+```
+git clone https://github.com/kfrlib/kfr.git
+```
+
+The repository default branch `master` is stable and passes all tests. Latest features reside in `dev`.
+
+#### Update
+
+```bash
+# in the kfr directory
+git pull
+```
+
+### Tarball/zip
+
+Download the latest release package from the GitHub releases:
+
+https://github.com/kfrlib/kfr/releases
+
+#### Update
+
+Re-download tarball and unpack it to the same location.
+
+### vcpkg
+
+#### Linux/macOS
+```bash
+./vcpkg install kfr
+```
+
+#### Windows
+
+```cmd
+vcpkg install kfr
+```
+
+### ArchLinux Package
+KFR is available on the [ArchLinux User Repository](https://wiki.archlinux.org/index.php/Arch_User_Repository) (AUR).
+You can install it with an [AUR helper](https://wiki.archlinux.org/index.php/AUR_helpers), like [`yay`](https://aur.archlinux.org/packages/yay/), as follows:
+
+```bash
+yay -S kfr
+```
+To discuss any issues related to this AUR package refer to the comments section of
+[`kfr`](https://aur.archlinux.org/packages/kfr/).
+
+Prebuilt binaries will be available soon.
+
+## Usage
+
+### Including in CMake project
+
+`CMakeLists.txt` contains these libraries:
+* `kfr` - header only interface library
+* `kfr_dft` - static library for DFT and related algorithms
+* `kfr_io` - static library for file IO and audio IO
+
+```cmake
+# Include KFR subdirectory
+add_subdirectory(kfr)
+
+# Add header-only KFR to your executable or library, this sets include directories etc
+target_link_libraries(your_executable_or_library kfr)
+
+# Add KFR DFT to your executable or library, (cpp file will be built for this)
+target_link_libraries(your_executable_or_library kfr_dft)
+
+# Add KFR IO to your executable or library, (cpp file will be built for this)
+target_link_libraries(your_executable_or_library kfr_io)
+```
+
+### Makefile, command line etc (Unix-like systems)
+
+```bash
+# Add this to command line
+-Ipath_to_kfr/include
+
+# And this if needed
+-lkfr_dft -lkfr_io
+
+# C++17 mode must be enabled
+-std=c++17
+# or
+-std=gnu++17
+
+# linker options (requires kfr to be installed)
+-lkfr_dft -lkfr_io
+```
+
+### Linux
+
+#### Prerequisites
+
+* GCC 7 or newer
+* Clang 9.0 or newer (recommended)
+
+#### Command line
+
+```bash
+cd <path_to_kfr>
+mkdir build && cd build
+cmake -DENABLE_TESTS=ON -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release ..
+make -- -j
+```
+Or using Ninja (better):
+```bash
+cd <path_to_kfr>
+mkdir build && cd build
+cmake -GNinja -DENABLE_TESTS=ON -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release ..
+ninja
+```
+
+### macOS
+
+#### Prerequisites
+
+* Xcode 10.3 or later
+
+#### Command line
+Using Xcode project:
+```bash
+cd <path_to_kfr>
+mkdir build && cd build
+cmake -GXcode -DENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Release ..
+cmake --build .
+```
+Using Unix Makefiles:
+```bash
+cd <path_to_kfr>
+mkdir build && cd build
+cmake -G"Unix Makefiles" -DENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Release ..
+make -- -j
+```
+Or using Ninja (better):
+```bash
+cd <path_to_kfr>
+mkdir build && cd build
+cmake -GNinja -DENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Release ..
+ninja
+```
+
+### Visual Studio
+
+#### Prerequisites
+* Visual Studio 2019 or later
+* Latest Clang (https://llvm.org/)
+* Ninja is highly recommended because Visual Studio does not support parallel build with Clang at this moment.
+
+#### Visual Studio IDE
+
+To work with KFR in Visual Studio you must add the path to the `include` directory inside KFR directory to the list of the project's include directories.<br>
+More details:
+https://learn.microsoft.com/en-us/cpp/build/reference/vcpp-directories-property-page?view=msvc-160
+
+Make sure that LLVM toolset is set for the project.
+
+Download and install the official LLVM toolchain extension:
+https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.llvm-toolchain
+
+More details:
+https://docs.microsoft.com/en-us/cpp/ide/general-property-page-project?view=vs-2017
+
+LLVM/Clang has very good compatibility with MSVC ABI and is widely used for building large projects on Windows (including Chrome), so switching to LLVM/Clang should not cause any compatibility problems.
+
+#### Command line
+Using Ninja:
+```
+cd <path_to_kfr>
+mkdir build && cd build
+call "C:\<path to your Visual Studio installation>\VC\Auxiliary\Build\vcvars64.bat"
+cmake -GNinja -DENABLE_TESTS=ON -DCMAKE_CXX_COMPILER="C:/Program Files/LLVM/bin/clang-cl.exe" -DCMAKE_BUILD_TYPE=Release ..
+ninja
+```
+Or generate Visual Studio solution (building will be slower):
+```
+cd <path_to_kfr>
+mkdir build && cd build
+cmake -G"Visual Studio 16 2019 Win64" -DENABLE_TESTS=ON -Tllvm -DCMAKE_BUILD_TYPE=Release ..
+```
+
+### MinGW/MSYS
+
+#### Prerequisites
+* Latest MinGW or MSYS2
+* Clang 9.0 or newer
+
+Using Makefiles:
+```
+cd <path_to_kfr>
+mkdir build && cd build
+cmake -DENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Release ..
+make -- -j
+```
+Using Ninja:
+```
+cd <path_to_kfr>
+mkdir build && cd build
+cmake -GNinja -DENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Release ..
+ninja
+```
diff --git a/docs/docs/normalize.md b/docs/docs/normalize.md
@@ -2,7 +2,7 @@
## One channel
-Input/Output data: [See how to pass data to KFR](types.md)
+Input/Output data: [See how to pass data to KFR](basics.md)
```c++
univector<float> audio;
```
@@ -45,4 +45,4 @@ unpack(stereo[0], stereo[1]) = pack(stereo[0], stereo[1]) / pack(peak, peak);
1. `absmaxof` function calculates the absolute maximum of the concatenated arrays
1. `pack` function combines two arrays as if it were a single array containing pairs of values
1. `operator/` divides pairs by the peak value
-1. `unpack` function unpacks the pairs to two target arrays
-\ No newline at end of file
+1. `unpack` function unpacks the pairs to two target arrays
diff --git a/docs/docs/src_gallery.md b/docs/docs/src_gallery.md
@@ -1,18 +1,18 @@
# Sample Rate Converter code & examples
-### High quality preset
-
+## High quality preset
+
-
+
-### High quality preset (taps=2048)
+## High quality preset (taps=2048)

-### Normal quality preset (taps=512)
+## Normal quality preset (taps=512)

-### Low quality preset (taps=128)
+## Low quality preset (taps=128)

-### Draft quality preset (taps=32)
-
-\ No newline at end of file
+## Draft quality preset (taps=32)
+
diff --git a/docs/docs/types.md b/docs/docs/types.md
@@ -1,81 +0,0 @@
-# Data types
-
-`univector` class is a base of all containers in KFR.
-
-`univector` can have both static and dynamic size and can even hold only reference to an external data (just like `array_view` or `string_view`)
-
-`univector<float>` is derived from `std::vector<float>` and contains all its member functions and constructors.
-
-`univector<float, 10>` is derived from `std::array<float, 10>` and contains all its member functions and constructors.
-
-`univector<float, 0>` is only reference to data and doesn’t contain any values.
-
-Such universal template allows functions in KFR to get data in any format.
-
-You can get subrange of an array using slice function:
-
-```c++
-univector<float, 100> v;
-// ...
-const float s1 = sum(v); // Sum all elements
-const float s2 = sum(v.slice(2, 50)); // Sum 50 elements starting from 2
-```
-Result of the call to slice is always `univector<T, 0>`, a reference to external data.
-
-The lifetime of the reference is limited to the lifetime of the original data.
-
-!!! note
- `univector` class is also [Expression](expressions.md) and can be used whereever expression is required.
-
-## Pass data to KFR functions
-
-If you don't use `univector` for data representation, you can still pass the data to KFR functions and filters.
-
-Examples (`rms` is used as an example function that takes `univector`):
-
-### `std::vector` or `std::array`
-```c++
-std::vector<float> data; // existing data, or std::array<N, float>
-
-float val = rms(make_univector(data)); // No data copy
-```
-
-### Plain pointer
-```c++
-const float* data; // existing data
-size_t size; //
-
-float val = rms(make_univector(data, size)); // No data copy
-```
-
-### array
-```c++
-const float data[1024];
-
-float val = rms(make_univector(data)); // No data copy
-```
-
-
-## Data Types
-
-Unsigned:
-
-``u8``, ``u16``, ``u32`` and ``u64``
-
-Signed:
-
-``i8``, ``i16``, ``i32`` and ``i64``
-
-Floating point:
-
-``f32`` and ``f64``
-
-Complex:
-
-``complex<f32>`` and ``complex<f64>``
-
-Vector:
-
-``vec<u8, 4>``, ``vec<f32, 3>``, ``vec<i64, 1>``, ``vec<complex<float>, 15>``, ``vec<u8, 256>``, ``vec<vec<int, 3>, 3>``
-
-You are not limited to sizes of SIMD registers and basic types.
-\ No newline at end of file
diff --git a/docs/docs/whatsnew5.md b/docs/docs/whatsnew5.md
@@ -0,0 +1,17 @@
+# What's new in KFR 5
+
+* New `tensor<T, dims>` class for multidimensional data (like nparray)
+* All builtin expressions support multiple dimensions
+* Exception support (may be configured to call user-supplied function or std::abort)
+* [changes required] CMake variables now have `KFR_` prefix
+* Template parameter deduction for `vec`, so `vec{1, 2}` is the same as `vec<int, 2>{1, 2}`
+* [changes required] `random_state` is now architecture-agnostic and defined in `kfr` namespace
+* All expression classes have been moved from `kfr::CMT_ARCH_NAME::internal` to `kfr::CMT_ARCH_NAME` namespace
+* `expression_traits<T>` introduced to support interpreting any object as kfr expression
+* [changes required] User-defined expressions should be rewritten to be used in KFR5
+* Out-of-class assign operators for all input & output expressions
+* `round.hpp`, `clamp.hpp`, `select.hpp`, `sort.hpp`, `saturation.hpp`, `min_max.hpp`, `logical.hpp`, `abs.hpp` headers have been moved to `simd` module
+* `state_holder.hpp` has been moved to `base` module
+* All code related to expressions have been moved to `base` module
+* `vec<T, N>::front()` and `vec<T, N>::front()` are now writable
+* `set_elements` functions for output expressions like `get_elements` for input expressions
diff --git a/docs/docs/window_gallery.md b/docs/docs/window_gallery.md
@@ -0,0 +1,214 @@
+# Window functions code & examples
+
+## Table of Contents
+
+* [Hann window](#hann-window)
+* [Hamming window](#hamming-window)
+* [Blackman window](#blackman-window)
+* [Blackman-Harris window](#blackman-harris-window)
+* [Gaussian window](#gaussian-window)
+* [Triangular window](#triangular-window)
+* [Bartlett window](#bartlett-window)
+* [Cosine window](#cosine-window)
+* [Cosine window (numpy compatible)](#cosine-window-numpy-compatible)
+* [Bartlett-Hann window](#bartlett-hann-window)
+* [Bohman window](#bohman-window)
+* [Lanczos window](#lanczos-window)
+* [Flat top window](#flat-top-window)
+* [Kaiser window](#kaiser-window)
+
+## Hann window
+
+Code
+```c++ linenums="1"
+const std::string options = "freqresp=True, dots=True, padwidth=1024, "
+ "log_freq=False, horizontal=False, normalized_freq=True";
+univector<fbase, 64> output;
+
+output = window_hann(output.size());
+plot_save("window_hann", output, options + ", title='Hann window'");
+```
+Result
+
+
+## Hamming window
+
+Code
+```c++ linenums="1"
+const std::string options = "freqresp=True, dots=True, padwidth=1024, "
+ "log_freq=False, horizontal=False, normalized_freq=True";
+univector<fbase, 64> output;
+
+output = window_hamming(output.size());
+plot_save("window_hamming", output, options + ", title='Hamming window'");
+```
+Result
+
+
+## Blackman window
+
+Code
+```c++ linenums="1"
+const std::string options = "freqresp=True, dots=True, padwidth=1024, "
+ "log_freq=False, horizontal=False, normalized_freq=True";
+univector<fbase, 64> output;
+
+output = window_blackman(output.size());
+plot_save("window_blackman", output, options + ", title='Blackman window'");
+```
+Result
+
+
+## Blackman-Harris window
+
+Code
+```c++ linenums="1"
+const std::string options = "freqresp=True, dots=True, padwidth=1024, "
+ "log_freq=False, horizontal=False, normalized_freq=True";
+univector<fbase, 64> output;
+
+output = window_blackman_harris(output.size());
+plot_save("window_blackman_harris", output, options + ", title='Blackman-Harris window'");
+```
+Result
+
+
+## Gaussian window
+
+Code
+```c++ linenums="1"
+const std::string options = "freqresp=True, dots=True, padwidth=1024, "
+ "log_freq=False, horizontal=False, normalized_freq=True";
+univector<fbase, 64> output;
+
+output = window_gaussian(output.size());
+plot_save("window_gaussian", output, options + ", title='Gaussian window'");
+```
+Result
+
+
+## Triangular window
+
+Code
+```c++ linenums="1"
+const std::string options = "freqresp=True, dots=True, padwidth=1024, "
+ "log_freq=False, horizontal=False, normalized_freq=True";
+univector<fbase, 64> output;
+
+output = window_triangular(output.size());
+plot_save("window_triangular", output, options + ", title='Triangular window'");
+```
+Result
+
+
+## Bartlett window
+
+Code
+```c++ linenums="1"
+const std::string options = "freqresp=True, dots=True, padwidth=1024, "
+ "log_freq=False, horizontal=False, normalized_freq=True";
+univector<fbase, 64> output;
+
+output = window_bartlett(output.size());
+plot_save("window_bartlett", output, options + ", title='Bartlett window'");
+```
+Result
+
+
+## Cosine window
+
+Code
+```c++ linenums="1"
+const std::string options = "freqresp=True, dots=True, padwidth=1024, "
+ "log_freq=False, horizontal=False, normalized_freq=True";
+univector<fbase, 64> output;
+
+output = window_cosine(output.size());
+plot_save("window_cosine", output, options + ", title='Cosine window'");
+```
+Result
+
+
+## Cosine window (numpy compatible)
+
+Code
+```c++ linenums="1"
+const std::string options = "freqresp=True, dots=True, padwidth=1024, "
+ "log_freq=False, horizontal=False, normalized_freq=True";
+univector<fbase, 64> output;
+
+output = window_cosine_np(output.size());
+plot_save("window_cosine_np", output, options + ", title='Cosine window (numpy compatible)'");
+```
+Result
+
+
+## Bartlett-Hann window
+
+Code
+```c++ linenums="1"
+const std::string options = "freqresp=True, dots=True, padwidth=1024, "
+ "log_freq=False, horizontal=False, normalized_freq=True";
+univector<fbase, 64> output;
+
+output = window_bartlett_hann(output.size());
+plot_save("window_bartlett_hann", output, options + ", title='Bartlett-Hann window'");
+```
+Result
+
+
+## Bohman window
+
+Code
+```c++ linenums="1"
+const std::string options = "freqresp=True, dots=True, padwidth=1024, "
+ "log_freq=False, horizontal=False, normalized_freq=True";
+univector<fbase, 64> output;
+
+output = window_bohman(output.size());
+plot_save("window_bohman", output, options + ", title='Bohman window'");
+```
+Result
+
+
+## Lanczos window
+
+Code
+```c++ linenums="1"
+const std::string options = "freqresp=True, dots=True, padwidth=1024, "
+ "log_freq=False, horizontal=False, normalized_freq=True";
+univector<fbase, 64> output;
+
+output = window_lanczos(output.size());
+plot_save("window_lanczos", output, options + ", title='Lanczos window'");
+```
+Result
+
+
+## Flat top window
+
+Code
+```c++ linenums="1"
+const std::string options = "freqresp=True, dots=True, padwidth=1024, "
+ "log_freq=False, horizontal=False, normalized_freq=True";
+univector<fbase, 64> output;
+
+output = window_flattop(output.size());
+plot_save("window_flattop", output, options + ", title='Flat top window'");
+```
+Result
+
+
+## Kaiser window
+
+Code
+```c++ linenums="1"
+const std::string options = "freqresp=True, dots=True, padwidth=1024, "
+ "log_freq=False, horizontal=False, normalized_freq=True";
+univector<fbase, 64> output;
+
+output = window_kaiser(output.size(), 2.5);
+plot_save("window_kaiser", output, options + ", title='Kaiser window'");
+```
+Result
+
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
@@ -4,6 +4,18 @@ theme:
features:
- navigation.tabs
- navigation.top
+ palette:
+ # Palette toggle for light mode
+ - scheme: default
+ toggle:
+ icon: material/brightness-7
+ name: Switch to dark mode
+
+ # Palette toggle for dark mode
+ - scheme: slate
+ toggle:
+ icon: material/brightness-4
+ name: Switch to light mode
extra:
search:
@@ -32,6 +44,7 @@ markdown_extensions:
- pymdownx.superfences
- pymdownx.highlight
- pymdownx.details
+ - pymdownx.magiclink
- pymdownx.tabbed:
alternate_style: true
@@ -45,23 +58,30 @@ extra_css:
repo_url: https://github.com/kfrlib/kfr
repo_name: KFR
+edit_uri: edit/master/docs/
nav:
- - index.md
- - types.md
- - expressions.md
+ - KFR:
+ - index.md
+ - installation.md
+ - basics.md
+ - expressions.md
+ - whatsnew5.md
- DSP:
- - conversion.md
- - normalize.md
- - convert_stereo.md
- fir.md
- bq.md
- src.md
- - convolution.md
+ - conv_reverb.md
- ebur128.md
+ - conversion.md
+ - normalize.md
+ - convert_stereo.md
- fir_gallery.md
+ - iir_gallery.md
- bq_gallery.md
- src_gallery.md
+ - window_gallery.md
+ - convolution.md
- DFT:
- dft.md
- dft2.md
@@ -73,9 +93,6 @@ nav:
- Reference:
- auto/refindex.md
- Math:
- - auto/types.md
- - auto/memory.md
- - auto/conversion.md
- auto/complex.md
- auto/constants.md
- auto/logical.md
@@ -87,12 +104,19 @@ nav:
- auto/hyperbolic.md
- auto/horizontal.md
- auto/other_math.md
+ - Base:
+ - auto/types.md
+ - auto/univector.md
+ - auto/tensor.md
- auto/expressions.md
- auto/generators.md
+ - auto/reducing.md
- auto/random.md
- - auto/array.md
+ - auto/memory.md
+ - auto/conversion.md
+ - auto/sort.md
- auto/utility.md
- - DSP:
+ - DSP:
- auto/filter.md
- auto/biquad.md
- auto/fir.md
@@ -102,7 +126,7 @@ nav:
- DFT:
- auto/convolution.md
- auto/dft.md
- - IO:
+ - IO:
- auto/binary_io.md
- auto/audio_io.md
- auto/plotting.md
@@ -112,4 +136,3 @@ nav:
- auto/cometa.md
- kfr.dev: https://kfr.dev
- - github.com/kfrlib/kfr: https://github.com/kfrlib/kfr
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
@@ -18,6 +18,7 @@ cmake_minimum_required(VERSION 3.10)
# Binary output directories
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/bin)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${PROJECT_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/bin)
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/svg)
@@ -34,7 +35,7 @@ target_link_libraries(window kfr use_arch)
add_executable(fir fir.cpp)
target_link_libraries(fir kfr use_arch)
-if (ENABLE_DFT)
+if (KFR_ENABLE_DFT)
target_link_libraries(fir kfr_dft use_arch)
target_compile_definitions(fir PRIVATE -DHAVE_DFT)
endif ()
@@ -42,7 +43,7 @@ endif ()
add_executable(sample_rate_conversion sample_rate_conversion.cpp)
target_link_libraries(sample_rate_conversion kfr kfr_io use_arch)
-if (ENABLE_DFT)
+if (KFR_ENABLE_DFT)
add_executable(dft dft.cpp)
target_link_libraries(dft kfr kfr_dft use_arch)
add_executable(ccv ccv.cpp)
diff --git a/examples/biquads.cpp b/examples/biquads.cpp
@@ -5,7 +5,9 @@
*/
#include <kfr/base.hpp>
-#include <kfr/dsp.hpp>
+#include <kfr/dsp/biquad.hpp>
+#include <kfr/dsp/biquad_design.hpp>
+#include <kfr/dsp/special.hpp>
#include <kfr/io.hpp>
using namespace kfr;
diff --git a/examples/ccv.cpp b/examples/ccv.cpp
@@ -21,22 +21,21 @@ int main()
// low-pass filter
univector<fbase, 1023> taps127;
- expression_pointer<fbase> kaiser = to_pointer(window_kaiser(taps127.size(), 3.0));
+ expression_handle<fbase> kaiser = to_handle(window_kaiser(taps127.size(), 3.0));
fir_lowpass(taps127, 0.2, kaiser, true);
// Create filters.
size_t const block_size = 256;
- convolve_filter<complex<fbase>> conv_filter_complex(univector<complex<fbase>>(make_complex(taps127, zeros())),
- block_size);
+ convolve_filter<complex<fbase>> conv_filter_complex(
+ univector<complex<fbase>>(make_complex(taps127, zeros())), block_size);
convolve_filter<fbase> conv_filter_real(taps127, block_size);
// Create noise to filter.
auto const size = 1024 * 100 + 33; // not a multiple of block_size
univector<complex<fbase>> cnoise =
- make_complex(truncate(gen_random_range(random_bit_generator{ 1, 2, 3, 4 }, -1.f, +1.f), size),
- truncate(gen_random_range(random_bit_generator{ 3, 4, 9, 8 }, -1.f, +1.f), size));
- univector<fbase> noise =
- truncate(gen_random_range(random_bit_generator{ 3, 4, 9, 8 }, -1.f, +1.f), size);
+ make_complex(truncate(gen_random_range(random_init(1, 2, 3, 4), -1.f, +1.f), size),
+ truncate(gen_random_range(random_init(3, 4, 9, 8), -1.f, +1.f), size));
+ univector<fbase> noise = truncate(gen_random_range(random_init(3, 4, 9, 8), -1.f, +1.f), size);
// Filter results.
univector<complex<fbase>> filtered_cnoise_ccv(size), filtered_cnoise_fir(size);
@@ -45,27 +44,29 @@ int main()
// Complex filtering (time and compare).
auto tic = std::chrono::high_resolution_clock::now();
conv_filter_complex.apply(filtered_cnoise_ccv, cnoise);
- auto toc = std::chrono::high_resolution_clock::now();
- auto const ccv_time_complex = std::chrono::duration_cast<std::chrono::duration<float>>(toc - tic);
- tic = toc;
- filtered_cnoise_fir = kfr::fir(cnoise, taps127);
- toc = std::chrono::high_resolution_clock::now();
- auto const fir_time_complex = std::chrono::duration_cast<std::chrono::duration<float>>(toc - tic);
- auto const cdiff = rms(cabs(filtered_cnoise_fir - filtered_cnoise_ccv));
+ auto toc = std::chrono::high_resolution_clock::now();
+ auto const ccv_time_complex = std::chrono::duration_cast<std::chrono::duration<float>>(toc - tic);
+ tic = toc;
+ filtered_cnoise_fir = kfr::fir(cnoise, taps127);
+ toc = std::chrono::high_resolution_clock::now();
+ auto const fir_time_complex = std::chrono::duration_cast<std::chrono::duration<float>>(toc - tic);
+ auto const cdiff = rms(cabs(filtered_cnoise_fir - filtered_cnoise_ccv));
// Real filtering (time and compare).
tic = std::chrono::high_resolution_clock::now();
conv_filter_real.apply(filtered_noise_ccv, noise);
- toc = std::chrono::high_resolution_clock::now();
- auto const ccv_time_real = std::chrono::duration_cast<std::chrono::duration<float>>(toc - tic);
- tic = toc;
- filtered_noise_fir = kfr::fir(noise, taps127);
- toc = std::chrono::high_resolution_clock::now();
- auto const fir_time_real = std::chrono::duration_cast<std::chrono::duration<float>>(toc - tic);
- auto const diff = rms(filtered_noise_fir - filtered_noise_ccv);
+ toc = std::chrono::high_resolution_clock::now();
+ auto const ccv_time_real = std::chrono::duration_cast<std::chrono::duration<float>>(toc - tic);
+ tic = toc;
+ filtered_noise_fir = kfr::fir(noise, taps127);
+ toc = std::chrono::high_resolution_clock::now();
+ auto const fir_time_real = std::chrono::duration_cast<std::chrono::duration<float>>(toc - tic);
+ auto const diff = rms(filtered_noise_fir - filtered_noise_ccv);
- println("complex: convolution_filter ", ccv_time_complex.count(), " fir ", fir_time_complex.count(), " diff=", cdiff);
- println("real: convolution_filter ", ccv_time_real.count(), " fir ", fir_time_real.count(), " diff=", diff);
+ println("complex: convolution_filter ", ccv_time_complex.count(), " fir ", fir_time_complex.count(),
+ " diff=", cdiff);
+ println("real: convolution_filter ", ccv_time_real.count(), " fir ", fir_time_real.count(),
+ " diff=", diff);
return 0;
}
diff --git a/examples/fir.cpp b/examples/fir.cpp
@@ -34,11 +34,11 @@ int main()
univector<fbase, 8191> taps8191;
// Prepare window functions (only expression saved here, not data)
- expression_pointer<fbase> hann = to_pointer(window_hann(taps15.size()));
+ expression_handle<fbase> hann = to_handle(window_hann(taps15.size()));
- expression_pointer<fbase> kaiser = to_pointer(window_kaiser(taps127.size(), 3.0));
+ expression_handle<fbase> kaiser = to_handle(window_kaiser(taps127.size(), 3.0));
- expression_pointer<fbase> blackman_harris = to_pointer(window_blackman_harris(taps8191.size()));
+ expression_handle<fbase> blackman_harris = to_handle(window_blackman_harris(taps8191.size()));
// Fill taps15 with the low pass FIR filter coefficients using hann window and cutoff=0.15
fir_lowpass(taps15, 0.15, hann, true);
@@ -102,8 +102,7 @@ int main()
// --------------------------------------------------------------------------------------
// Prepare 10000 samples of white noise
- univector<float> noise =
- truncate(gen_random_range(random_bit_generator{ 1, 2, 3, 4 }, -1.f, +1.f), 10000);
+ univector<float> noise = truncate(gen_random_range(random_init(1, 2, 3, 4), -1.f, +1.f), 10000);
// Apply band stop filter
univector<float> filtered_noise = fir(noise, taps127);
diff --git a/examples/window.cpp b/examples/window.cpp
@@ -42,6 +42,9 @@ int main()
output = window_cosine(output.size());
plot_save("window_cosine", output, options + ", title='Cosine window'");
+ output = window_cosine_np(output.size());
+ plot_save("window_cosine_np", output, options + ", title='Cosine window (numpy compatible)'");
+
output = window_bartlett_hann(output.size());
plot_save("window_bartlett_hann", output, options + ", title='Bartlett-Hann window'");
diff --git a/include/kfr/base.hpp b/include/kfr/base.hpp
@@ -29,12 +29,16 @@
#include "base/expression.hpp"
#include "base/filter.hpp"
#include "base/fraction.hpp"
-#include "base/function_expressions.hpp"
#include "base/generators.hpp"
+#include "base/handle.hpp"
+#include "base/math_expressions.hpp"
#include "base/memory.hpp"
-#include "base/pointer.hpp"
#include "base/random.hpp"
+#include "base/random_bits.hpp"
#include "base/reduce.hpp"
+#include "base/shape.hpp"
+#include "base/simd_expressions.hpp"
#include "base/small_buffer.hpp"
-#include "base/sort.hpp"
+#include "base/state_holder.hpp"
+#include "base/tensor.hpp"
#include "base/univector.hpp"
diff --git a/include/kfr/base/basic_expressions.hpp b/include/kfr/base/basic_expressions.hpp
@@ -25,408 +25,705 @@
*/
#pragma once
-#include "../simd/operators.hpp"
-#include "../simd/vec.hpp"
-#include "univector.hpp"
-#include <algorithm>
+#include "expression.hpp"
namespace kfr
{
-inline namespace CMT_ARCH_NAME
+// ----------------------------------------------------------------------------
+
+template <typename T>
+struct expression_scalar
{
+ T value;
+};
-namespace internal
+template <typename T>
+struct expression_traits<expression_scalar<T>> : expression_traits_defaults
{
-template <size_t width, typename Fn>
-KFR_INTRINSIC void block_process_impl(size_t& i, size_t size, Fn&& fn)
+ using value_type = T;
+ constexpr static size_t dims = 0;
+
+ constexpr static shape<0> get_shape(const expression_scalar<T>& self) { return {}; }
+ constexpr static shape<0> get_shape() { return {}; }
+};
+
+template <typename T>
+KFR_INTRINSIC expression_scalar<T> scalar(T value)
{
- CMT_LOOP_NOUNROLL
- for (; i < size / width * width; i += width)
- fn(i, csize_t<width>());
+ return { std::move(value) };
}
-} // namespace internal
-template <size_t... widths, typename Fn>
-KFR_INTRINSIC void block_process(size_t size, csizes_t<widths...>, Fn&& fn)
+template <typename T = fbase>
+KFR_INTRINSIC expression_scalar<T> zeros()
{
- size_t i = 0;
- swallow{ (internal::block_process_impl<widths>(i, size, std::forward<Fn>(fn)), 0)... };
+ return { static_cast<T>(0) };
}
-namespace internal
+template <typename T = fbase>
+KFR_INTRINSIC expression_scalar<T> ones()
+{
+ return { static_cast<T>(1) };
+}
+
+inline namespace CMT_ARCH_NAME
+{
+template <typename T, index_t Axis, size_t N>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_scalar<T>& self, const shape<0>& index,
+ const axis_params<Axis, N>&)
+{
+ return self.value;
+}
+} // namespace CMT_ARCH_NAME
+
+// ----------------------------------------------------------------------------
+
+template <typename T, index_t Dims = 1>
+struct expression_counter
{
+ T start;
+ T steps[Dims];
+
+ T back() const { return steps[Dims - 1]; }
+ T front() const { return steps[0]; }
+};
-template <typename To, typename E>
-struct expression_cast : expression_with_arguments<E>
+template <typename T, index_t Dims>
+struct expression_traits<expression_counter<T, Dims>> : expression_traits_defaults
{
- using value_type = To;
- KFR_MEM_INTRINSIC expression_cast(E&& expr) CMT_NOEXCEPT
- : expression_with_arguments<E>(std::forward<E>(expr))
+ using value_type = T;
+ constexpr static size_t dims = Dims;
+
+ constexpr static shape<dims> get_shape(const expression_counter<T, Dims>& self)
{
+ return shape<dims>(infinite_size);
}
+ constexpr static shape<dims> get_shape() { return shape<dims>(infinite_size); }
+};
+
+template <typename T = int, typename Arg = T, typename... Args,
+ typename Tout = std::common_type_t<T, Arg, Args...>>
+KFR_INTRINSIC expression_counter<Tout, 1> counter(T start = 0)
+{
+ return { static_cast<Tout>(std::move(start)), { static_cast<Tout>(1) } };
+}
+
+template <typename T = int, typename Arg = T, typename... Args,
+ typename Tout = std::common_type_t<T, Arg, Args...>>
+KFR_INTRINSIC expression_counter<Tout, 1 + sizeof...(Args)> counter(T start, Arg step, Args... steps)
+{
+ return { static_cast<Tout>(std::move(start)),
+ { static_cast<Tout>(std::move(step)), static_cast<Tout>(std::move(steps))... } };
+}
- template <size_t N>
- friend KFR_INTRINSIC vec<To, N> get_elements(const expression_cast& self, cinput_t input, size_t index,
- vec_shape<To, N>)
+inline namespace CMT_ARCH_NAME
+{
+
+template <typename T, index_t Axis, size_t N>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_counter<T, 1>& self, const shape<1>& index,
+ const axis_params<Axis, N>&)
+{
+ T acc = self.start;
+ acc += static_cast<T>(index.back()) * self.back();
+ return acc + enumerate(vec_shape<T, N>(), self.back());
+}
+template <typename T, index_t dims, index_t Axis, size_t N>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_counter<T, dims>& self, const shape<dims>& index,
+ const axis_params<Axis, N>&)
+{
+ T acc = self.start;
+ vec<T, dims> tindices = cast<T>(to_vec(index));
+ cfor(csize<0>, csize<dims>, [&](auto i) CMT_INLINE_LAMBDA { acc += tindices[i] * self.steps[i]; });
+ return acc + enumerate(vec_shape<T, N>(), self.steps[Axis]);
+}
+} // namespace CMT_ARCH_NAME
+
+// ----------------------------------------------------------------------------
+
+template <typename Arg>
+struct expression_slice : public expression_with_arguments<Arg>
+{
+ constexpr static index_t dims = expression_dims<Arg>;
+ static_assert(dims > 0);
+ shape<dims> start;
+ shape<dims> size;
+
+ KFR_MEM_INTRINSIC expression_slice(Arg&& arg, shape<dims> start, shape<dims> size)
+ : expression_with_arguments<Arg>{ std::forward<Arg>(arg) }, start(start), size(size)
{
- return self.argument_first(input, index, vec_shape<To, N>());
}
};
-template <typename T, typename E1>
-struct expression_iterator
+template <typename Arg>
+struct expression_traits<expression_slice<Arg>> : expression_traits_defaults
{
- constexpr expression_iterator(E1&& e1) : e1(std::forward<E1>(e1)) {}
- struct iterator
+ using ArgTraits = expression_traits<Arg>;
+
+ using value_type = typename ArgTraits::value_type;
+ constexpr static size_t dims = ArgTraits::dims;
+ constexpr static bool random_access = ArgTraits::random_access;
+
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape(const expression_slice<Arg>& self)
{
- T operator*() const { return get(); }
- T get() const { return get_elements(expr.e1, cinput, position, vec_shape<T, 1>()).front(); }
- iterator& operator++()
- {
- ++position;
- return *this;
- }
- iterator operator++(int)
- {
- iterator copy = *this;
- ++(*this);
- return copy;
- }
- bool operator!=(const iterator& other) const { return position != other.position; }
- const expression_iterator& expr;
- size_t position;
- };
- iterator begin() const { return { *this, 0 }; }
- iterator end() const { return { *this, e1.size() }; }
- E1 e1;
+ return min(sub_shape(ArgTraits::get_shape(self.first()), self.start), self.size);
+ }
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape() { return shape<dims>(undefined_size); }
};
-} // namespace internal
-template <typename To, typename E, KFR_ENABLE_IF(is_input_expression<E>)>
-KFR_INTRINSIC internal::expression_cast<To, E> cast(E&& expr)
+template <typename Arg, KFR_ACCEPT_EXPRESSIONS(Arg), index_t Dims = expression_dims<Arg>>
+KFR_INTRINSIC expression_slice<Arg> slice(Arg&& arg, identity<shape<Dims>> start,
+ identity<shape<Dims>> size = shape<Dims>(infinite_size))
{
- return internal::expression_cast<To, E>(std::forward<E>(expr));
+ static_assert(Dims > 0);
+ return { std::forward<Arg>(arg), start, size };
}
-template <typename E1, typename T = value_type_of<E1>>
-KFR_INTRINSIC internal::expression_iterator<T, E1> to_iterator(E1&& e1)
+template <typename Arg, KFR_ACCEPT_EXPRESSIONS(Arg), index_t Dims = expression_dims<Arg>>
+KFR_INTRINSIC expression_slice<Arg> truncate(Arg&& arg, identity<shape<Dims>> size)
{
- return internal::expression_iterator<T, E1>(std::forward<E1>(e1));
+ static_assert(Dims > 0);
+ return { std::forward<Arg>(arg), shape<Dims>{ 0 }, size };
}
-template <typename... Ts, typename T = common_type<Ts...>>
-inline auto sequence(const Ts&... list)
+inline namespace CMT_ARCH_NAME
{
- return lambda<T>([seq = std::array<T, sizeof...(Ts)>{ { static_cast<T>(list)... } }](size_t index) {
- return seq[index % seq.size()];
- });
+
+template <typename Arg, index_t NDims, index_t Axis, size_t N,
+ typename T = typename expression_traits<expression_slice<Arg>>::value_type>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_slice<Arg>& self, const shape<NDims>& index,
+ const axis_params<Axis, N>& sh)
+{
+ return static_cast<vec<T, N>>(get_elements(self.first(), index.add(self.start), sh));
}
-template <typename T = int>
-KFR_INTRINSIC auto zeros()
+template <typename Arg, index_t NDims, index_t Axis, size_t N,
+ typename T = typename expression_traits<expression_slice<Arg>>::value_type>
+KFR_INTRINSIC void set_elements(const expression_slice<Arg>& self, const shape<NDims>& index,
+ const axis_params<Axis, N>& sh, const identity<vec<T, N>>& value)
{
- return lambda<T>([](cinput_t, size_t, auto x) { return zerovector(x); });
+ set_elements(self.first(), index.add(self.start), sh, value);
}
+} // namespace CMT_ARCH_NAME
+
+// ----------------------------------------------------------------------------
-template <typename T = int>
-KFR_INTRINSIC auto ones()
+template <typename T, typename Arg>
+struct expression_cast : public expression_with_arguments<Arg>
{
- return lambda<T>([](cinput_t, size_t, auto) { return 1; });
+ using expression_with_arguments<Arg>::expression_with_arguments;
+};
+
+template <typename T, typename Arg>
+struct expression_traits<expression_cast<T, Arg>> : expression_traits_defaults
+{
+ using ArgTraits = expression_traits<Arg>;
+
+ using value_type = T;
+ constexpr static size_t dims = ArgTraits::dims;
+ constexpr static bool random_access = ArgTraits::random_access;
+
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape(const expression_cast<T, Arg>& self)
+ {
+ return ArgTraits::get_shape(self.first());
+ }
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape() { return ArgTraits::get_shape(); }
+};
+
+template <typename T, typename Arg, KFR_ACCEPT_EXPRESSIONS(Arg)>
+KFR_INTRINSIC expression_cast<T, Arg> cast(Arg&& arg)
+{
+ return { std::forward<Arg>(arg) };
}
-template <typename T = int>
-KFR_INTRINSIC auto counter()
+template <typename T, typename Arg, KFR_ACCEPT_EXPRESSIONS(Arg)>
+KFR_INTRINSIC expression_cast<T, Arg> cast(Arg&& arg, ctype_t<T>)
{
- return lambda<T>([](cinput_t, size_t index, auto x) { return enumerate(x) + index; });
+ return { std::forward<Arg>(arg) };
}
-template <typename T1>
-KFR_INTRINSIC auto counter(T1 start)
+inline namespace CMT_ARCH_NAME
{
- return lambda<T1>([start](cinput_t, size_t index, auto x) { return enumerate(x) + index + start; });
+
+template <typename T, typename Arg, index_t NDims, index_t Axis, size_t N>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_cast<T, Arg>& self, const shape<NDims>& index,
+ const axis_params<Axis, N>& sh)
+{
+ return static_cast<vec<T, N>>(get_elements(self.first(), index, sh));
}
-template <typename T1, typename T2>
-KFR_INTRINSIC auto counter(T1 start, T2 step)
+
+template <typename T, typename Arg, index_t NDims, index_t Axis, size_t N>
+KFR_INTRINSIC void set_elements(const expression_cast<T, Arg>& self, const shape<NDims>& index,
+ const axis_params<Axis, N>& sh, const identity<vec<T, N>>& value)
{
- return lambda<common_type<T1, T2>>(
- [start, step](cinput_t, size_t index, auto x) { return (enumerate(x) + index) * step + start; });
+ set_elements(self.first(), index, sh, value);
}
+} // namespace CMT_ARCH_NAME
-template <typename Gen>
-struct segment
+// ----------------------------------------------------------------------------
+
+template <typename T, index_t Dims, typename Fn, bool Rnd>
+struct expression_lambda
{
- template <typename Gen_>
- constexpr segment(size_t start, Gen_&& gen) : start(start), gen(std::forward<Gen_>(gen))
+ Fn fn;
+};
+
+template <typename T, index_t Dims, typename Fn, bool Rnd>
+struct expression_traits<expression_lambda<T, Dims, Fn, Rnd>> : expression_traits_defaults
+{
+ using value_type = T;
+ constexpr static size_t dims = Dims;
+ constexpr static inline bool random_access = Rnd;
+
+ KFR_MEM_INTRINSIC constexpr static shape<Dims> get_shape(const expression_lambda<T, Dims, Fn, Rnd>& self)
{
+ return shape<Dims>(infinite_size);
}
- size_t start;
- Gen gen;
+ KFR_MEM_INTRINSIC constexpr static shape<Dims> get_shape() { return shape<Dims>(infinite_size); }
};
-enum symmetric_linspace_t
+template <typename T, index_t Dims = 1, typename Fn, bool RandomAccess = true>
+KFR_INTRINSIC expression_lambda<T, Dims, Fn, RandomAccess> lambda(Fn&& fn, cbool_t<RandomAccess> = {})
{
- symmetric_linspace
-};
+ return { std::forward<Fn>(fn) };
+}
+template <typename T, index_t Dims = 1, typename Fn>
+KFR_INTRINSIC expression_lambda<T, Dims, Fn, false> lambda_generator(Fn&& fn)
+{
+ return { std::forward<Fn>(fn) };
+}
-namespace internal
+template <typename... Ts, typename T = std::common_type_t<Ts...>>
+KFR_INTRINSIC auto sequence(const Ts&... list)
{
-template <typename T, typename E1>
-struct expression_reader
+ return lambda<T>([seq = std::array<T, sizeof...(Ts)>{ { static_cast<T>(list)... } }](index_t index) { //
+ return seq[index % seq.size()];
+ });
+}
+
+inline namespace CMT_ARCH_NAME
+{
+
+template <typename T, index_t Dims, typename Fn, bool Rnd, index_t Axis, size_t N>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_lambda<T, Dims, Fn, Rnd>& self,
+ const shape<Dims>& index, const axis_params<Axis, N>& sh)
{
- constexpr expression_reader(E1&& e1) CMT_NOEXCEPT : e1(std::forward<E1>(e1)) {}
- T read() const
+ if constexpr (std::is_invocable_v<Fn, shape<Dims>, axis_params<Axis, N>>)
+ return self.fn(index, sh);
+ else if constexpr (std::is_invocable_v<Fn, shape<Dims>, csize_t<N>>)
+ return self.fn(index, csize<N>);
+ else if constexpr (std::is_invocable_v<Fn, shape<Dims>>)
{
- const T result = get_elements(e1, cinput, m_position, vec_shape<T, 1>());
- m_position++;
+ portable_vec<T, N> result;
+ shape<Dims> cur_index = index;
+ for (index_t i = 0; i < N; ++i)
+ {
+ result[i] = self.fn(cur_index);
+ ++cur_index.back();
+ }
return result;
}
- mutable size_t m_position = 0;
- E1 e1;
-};
-template <typename T, typename E1>
-struct expression_writer
+ else if constexpr (std::is_invocable_v<Fn>)
+ return apply<N>(self.fn);
+ else
+ {
+ static_assert(std::is_invocable_v<Fn, shape<Dims>, axis_params<Axis, N>> ||
+ std::is_invocable_v<Fn, shape<Dims>, csize_t<N>> ||
+ std::is_invocable_v<Fn, shape<Dims>> || std::is_invocable_v<Fn>,
+ "Lambda must be callable");
+ return czeros;
+ }
+}
+
+} // namespace CMT_ARCH_NAME
+
+// ----------------------------------------------------------------------------
+
+template <typename Arg>
+struct expression_padded : public expression_with_arguments<Arg>
{
- constexpr expression_writer(E1&& e1) CMT_NOEXCEPT : e1(std::forward<E1>(e1)) {}
- template <typename U>
- void write(U value)
+ using ArgTraits = typename expression_with_arguments<Arg>::first_arg_traits;
+ typename ArgTraits::value_type fill_value;
+ shape<ArgTraits::dims> input_shape;
+
+ KFR_MEM_INTRINSIC expression_padded(Arg&& arg, typename ArgTraits::value_type fill_value)
+ : expression_with_arguments<Arg>{ std::forward<Arg>(arg) }, fill_value(std::move(fill_value)),
+ input_shape(ArgTraits::get_shape(this->first()))
{
- e1(coutput, m_position, vec<U, 1>(value));
- m_position++;
}
- size_t m_position = 0;
- E1 e1;
};
-} // namespace internal
-template <typename T, typename E1>
-internal::expression_reader<T, E1> reader(E1&& e1)
+template <typename Arg, KFR_ACCEPT_EXPRESSIONS(Arg), typename T = expression_value_type<Arg>>
+KFR_INTRINSIC expression_padded<Arg> padded(Arg&& arg, T fill_value = T{})
{
- static_assert(is_input_expression<E1>, "E1 must be an expression");
- return internal::expression_reader<T, E1>(std::forward<E1>(e1));
+ static_assert(expression_dims<Arg> >= 1);
+ return { std::forward<Arg>(arg), std::move(fill_value) };
}
-template <typename T, typename E1>
-internal::expression_writer<T, E1> writer(E1&& e1)
+template <typename Arg>
+struct expression_traits<expression_padded<Arg>> : expression_traits_defaults
{
- static_assert(is_output_expression<E1>, "E1 must be an output expression");
- return internal::expression_writer<T, E1>(std::forward<E1>(e1));
-}
+ using ArgTraits = expression_traits<Arg>;
-namespace internal
+ using value_type = typename ArgTraits::value_type;
+ constexpr static size_t dims = ArgTraits::dims;
+ constexpr static bool random_access = ArgTraits::random_access;
+
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape(const expression_padded<Arg>& self)
+ {
+ return shape<dims>(infinite_size);
+ }
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape() { return shape<dims>(infinite_size); }
+};
+
+inline namespace CMT_ARCH_NAME
{
-template <typename E1>
-struct expression_slice : expression_with_arguments<E1>
+template <typename Arg, index_t Axis, size_t N, typename Traits = expression_traits<expression_padded<Arg>>,
+ typename T = typename Traits::value_type>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_padded<Arg>& self, const shape<Traits::dims>& index,
+ const axis_params<Axis, N>& sh)
{
- using value_type = value_type_of<E1>;
- using T = value_type;
- expression_slice(E1&& e1, size_t start, size_t size)
- : expression_with_arguments<E1>(std::forward<E1>(e1)), start(start),
- new_size(size_min(size, size_sub(std::get<0>(this->args).size(), start)))
+ if (index.ge(self.input_shape))
{
+ return self.fill_value;
}
- template <size_t N>
- friend KFR_INTRINSIC vec<T, N> get_elements(const expression_slice& self, cinput_t cinput, size_t index,
- vec_shape<T, N> y)
+ else if (CMT_LIKELY(index.add(N).le(self.input_shape)))
{
- return self.argument_first(cinput, index + self.start, y);
+ return get_elements(self.first(), index, sh);
}
- size_t size() const { return new_size; }
- size_t start;
- size_t new_size;
-};
+ else
+ {
+ vec<T, N> x = self.fill_value;
+ for (size_t i = 0; i < N; i++)
+ {
+ shape ish = index.add(i);
+ if (ish.back() < self.input_shape.back())
+ x[i] = get_elements(self.first(), ish, axis_params_v<Axis, 1>).front();
+ }
+ return x;
+ }
+}
-template <typename E1>
-struct expression_reverse : expression_with_arguments<E1>
+} // namespace CMT_ARCH_NAME
+
+// ----------------------------------------------------------------------------
+
+template <typename Arg>
+struct expression_reverse : public expression_with_arguments<Arg>
{
- using value_type = value_type_of<E1>;
- using T = value_type;
- expression_reverse(E1&& e1) : expression_with_arguments<E1>(std::forward<E1>(e1)), expr_size(e1.size()) {}
- template <size_t N>
- friend KFR_INTRINSIC vec<T, N> get_elements(const expression_reverse& self, cinput_t cinput, size_t index,
- vec_shape<T, N> y)
+ using ArgTraits = typename expression_with_arguments<Arg>::first_arg_traits;
+ shape<ArgTraits::dims> input_shape;
+
+ KFR_MEM_INTRINSIC expression_reverse(Arg&& arg)
+ : expression_with_arguments<Arg>{ std::forward<Arg>(arg) },
+ input_shape(ArgTraits::get_shape(this->first()))
{
- return reverse(self.argument_first(cinput, self.expr_size - index - N, y));
}
- size_t size() const { return expr_size; }
- size_t expr_size;
};
-template <typename T, bool precise = false>
-struct expression_linspace;
+template <typename Arg, KFR_ACCEPT_EXPRESSIONS(Arg)>
+KFR_INTRINSIC expression_reverse<Arg> reverse(Arg&& arg)
+{
+ static_assert(expression_dims<Arg> >= 1);
+ return { std::forward<Arg>(arg) };
+}
-template <typename T>
-struct expression_linspace<T, false> : input_expression
+template <typename Arg>
+struct expression_traits<expression_reverse<Arg>> : expression_traits_defaults
{
- using value_type = T;
+ using ArgTraits = expression_traits<Arg>;
- KFR_MEM_INTRINSIC constexpr size_t size() const CMT_NOEXCEPT { return truncate_size; }
+ using value_type = typename ArgTraits::value_type;
+ constexpr static size_t dims = ArgTraits::dims;
+ static_assert(ArgTraits::random_access, "expression_reverse requires an expression with random access");
- expression_linspace(T start, T stop, size_t size, bool endpoint = false, bool truncate = false)
- : start(start), offset((stop - start) / T(endpoint ? size - 1 : size)),
- truncate_size(truncate ? size : infinite_size)
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape(const expression_reverse<Arg>& self)
{
+ return ArgTraits::get_shape(self.first());
}
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape() { return ArgTraits::get_shape(); }
+};
- expression_linspace(symmetric_linspace_t, T symsize, size_t size, bool endpoint = false)
- : expression_linspace(-symsize, +symsize, size, endpoint)
- {
- }
+inline namespace CMT_ARCH_NAME
+{
+
+template <typename Arg, index_t Axis, size_t N, typename Traits = expression_traits<expression_reverse<Arg>>,
+ typename T = typename Traits::value_type>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_reverse<Arg>& self, const shape<Traits::dims>& index,
+ const axis_params<Axis, N>& sh)
+{
+ return reverse(get_elements(self.first(), self.input_shape.sub(index).sub(shape<Traits::dims>(N)), sh));
+}
+
+} // namespace CMT_ARCH_NAME
+
+// ----------------------------------------------------------------------------
- template <size_t N>
- friend KFR_INTRINSIC vec<T, N> get_elements(const expression_linspace& self, cinput_t, size_t index,
- vec_shape<T, N> x)
+template <index_t... Values>
+struct fixed_shape_t
+{
+ constexpr fixed_shape_t() = default;
+ constexpr static shape<sizeof...(Values)> get() { return { Values... }; }
+};
+
+template <index_t... Values>
+constexpr inline fixed_shape_t<Values...> fixed_shape{};
+
+template <typename Arg, typename Shape>
+struct expression_fixshape : public expression_with_arguments<Arg>
+{
+ using ArgTraits = typename expression_with_arguments<Arg>::first_arg_traits;
+
+ KFR_MEM_INTRINSIC expression_fixshape(Arg&& arg)
+ : expression_with_arguments<Arg>{ std::forward<Arg>(arg) }
{
- using TI = itype<T>;
- return T(self.start) + (enumerate(x) + static_cast<T>(static_cast<TI>(index))) * T(self.offset);
}
-
- T start;
- T offset;
- size_t truncate_size;
};
-template <typename T>
-struct expression_linspace<T, true> : input_expression
+template <typename Arg, index_t... ShapeValues, KFR_ACCEPT_EXPRESSIONS(Arg)>
+KFR_INTRINSIC expression_fixshape<Arg, fixed_shape_t<ShapeValues...>> fixshape(
+ Arg&& arg, const fixed_shape_t<ShapeValues...>&)
{
- using value_type = T;
+ return { std::forward<Arg>(arg) };
+}
- KFR_MEM_INTRINSIC constexpr size_t size() const CMT_NOEXCEPT { return truncate_size; }
+template <typename Arg, index_t... ShapeValues>
+struct expression_traits<expression_fixshape<Arg, fixed_shape_t<ShapeValues...>>> : expression_traits_defaults
+{
+ using ArgTraits = expression_traits<Arg>;
- expression_linspace(T start, T stop, size_t size, bool endpoint = false, bool truncate = false)
- : start(start), stop(stop), invsize(1.0 / T(endpoint ? size - 1 : size)),
- truncate_size(truncate ? size : infinite_size)
+ using value_type = typename ArgTraits::value_type;
+ constexpr static size_t dims = sizeof...(ShapeValues); // ArgTraits::dims;
+ constexpr static bool random_access = ArgTraits::random_access;
+
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape(
+ const expression_fixshape<Arg, fixed_shape_t<ShapeValues...>>& self)
{
+ return fixed_shape_t<ShapeValues...>::get();
}
-
- expression_linspace(symmetric_linspace_t, T symsize, size_t size, bool endpoint = false)
- : expression_linspace(-symsize, +symsize, size, endpoint)
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape()
{
+ return fixed_shape_t<ShapeValues...>::get();
}
+};
+
+inline namespace CMT_ARCH_NAME
+{
+
+template <typename Arg, typename Shape, index_t Axis, size_t N,
+ typename Traits = expression_traits<expression_fixshape<Arg, Shape>>,
+ typename T = typename Traits::value_type>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_fixshape<Arg, Shape>& self,
+ const shape<Traits::dims>& index, const axis_params<Axis, N>& sh)
+{
+ using ArgTraits = expression_traits<Arg>;
+ return get_elements(self.first(), index.template trim<ArgTraits::dims>(), sh);
+}
- template <size_t N>
- friend KFR_INTRINSIC vec<T, N> get_elements(const expression_linspace& self, cinput_t, size_t index,
- vec_shape<T, N> x)
+template <typename Arg, typename Shape, index_t Axis, size_t N,
+ typename Traits = expression_traits<expression_fixshape<Arg, Shape>>,
+ typename T = typename Traits::value_type>
+KFR_INTRINSIC void set_elements(expression_fixshape<Arg, Shape>& self, const shape<Traits::dims>& index,
+ const axis_params<Axis, N>& sh, const identity<vec<T, N>>& value)
+{
+ using ArgTraits = expression_traits<Arg>;
+ if constexpr (is_output_expression<Arg>)
{
- using TI = itype<T>;
- return mix((enumerate(x) + static_cast<T>(static_cast<TI>(index))) * self.invsize, self.start,
- self.stop);
+ set_elements(self.first(), index.template trim<ArgTraits::dims>(), sh, value);
}
- template <typename U, size_t N>
- KFR_MEM_INTRINSIC static vec<U, N> mix(const vec<U, N>& t, U x, U y)
+ else
{
- return (U(1.0) - t) * x + t * y;
}
+}
- T start;
- T stop;
- T invsize;
- size_t truncate_size;
+} // namespace CMT_ARCH_NAME
+
+// ----------------------------------------------------------------------------
+
+template <typename Arg, index_t OutDims>
+struct expression_reshape : public expression_with_arguments<Arg>
+{
+ using ArgTraits = typename expression_with_arguments<Arg>::first_arg_traits;
+ shape<ArgTraits::dims> in_shape;
+ shape<OutDims> out_shape;
+
+ KFR_MEM_INTRINSIC expression_reshape(Arg&& arg, const shape<OutDims>& out_shape)
+ : expression_with_arguments<Arg>{ std::forward<Arg>(arg) }, in_shape(ArgTraits::get_shape(arg)),
+ out_shape(out_shape)
+ {
+ }
};
-template <typename... E>
-struct expression_sequence : expression_with_arguments<E...>
+template <typename Arg, index_t OutDims, KFR_ACCEPT_EXPRESSIONS(Arg)>
+KFR_INTRINSIC expression_reshape<Arg, OutDims> reshape(Arg&& arg, const shape<OutDims>& out_shape)
+{
+ return { std::forward<Arg>(arg), out_shape };
+}
+
+template <typename Arg, index_t OutDims>
+struct expression_traits<expression_reshape<Arg, OutDims>> : expression_traits_defaults
{
-public:
- using base = expression_with_arguments<E...>;
+ using ArgTraits = expression_traits<Arg>;
- using value_type = common_type<value_type_of<E>...>;
- using T = value_type;
+ using value_type = typename ArgTraits::value_type;
+ constexpr static size_t dims = OutDims;
+ constexpr static bool random_access = ArgTraits::random_access;
- template <typename... Expr_>
- KFR_MEM_INTRINSIC expression_sequence(const size_t (&segments)[base::count], Expr_&&... expr) CMT_NOEXCEPT
- : base(std::forward<Expr_>(expr)...)
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape(const expression_reshape<Arg, OutDims>& self)
{
- std::copy(std::begin(segments), std::end(segments), this->segments.begin() + 1);
- this->segments[0] = 0;
- this->segments[base::count + 1] = size_t(-1);
+ return self.out_shape;
}
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape() { return shape<dims>{ undefined_size }; }
+};
- template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_sequence& self, cinput_t cinput,
- size_t index, vec_shape<T, N> y)
+inline namespace CMT_ARCH_NAME
+{
+
+template <typename Arg, index_t outdims, index_t Axis, size_t N,
+ typename Traits = expression_traits<expression_reshape<Arg, outdims>>,
+ typename T = typename Traits::value_type>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_reshape<Arg, outdims>& self,
+ const shape<Traits::dims>& index, const axis_params<Axis, N>& sh)
+{
+ using ArgTraits = typename Traits::ArgTraits;
+ constexpr index_t indims = ArgTraits::dims;
+ if constexpr (N == 1)
{
- std::size_t sindex =
- size_t(std::upper_bound(std::begin(self.segments), std::end(self.segments), index) - 1 -
- std::begin(self.segments));
- if (self.segments[sindex + 1] - index >= N)
- return get_elements(self, cinput, index, sindex - 1, y);
- else
+ const shape<indims> idx = self.in_shape.from_flat(self.out_shape.to_flat(index));
+ return get_elements(self.first(), idx, axis_params<indims - 1, 1>{});
+ }
+ else
+ {
+ const shape<indims> first_idx = self.in_shape.from_flat(self.out_shape.to_flat(index));
+ const shape<indims> last_idx =
+ self.in_shape.from_flat(self.out_shape.to_flat(index.add_at(N - 1, cindex<Axis>)));
+
+ const shape<indims> diff_idx = last_idx.sub(first_idx);
+
+ vec<T, N> result;
+ bool done = false;
+
+ if (diff_idx.sum() == N - 1)
{
- vec<T, N> result;
- CMT_PRAGMA_CLANG(clang loop unroll_count(4))
- for (size_t i = 0; i < N; i++)
+ cforeach(cvalseq_t<index_t, indims, 0>{},
+ [&](auto n) CMT_INLINE_LAMBDA
+ {
+ constexpr index_t axis = val_of<decltype(n)>({});
+ if (!done && diff_idx[axis] == N - 1)
+ {
+ result = get_elements(self.first(), first_idx, axis_params<axis, N>{});
+ done = true;
+ }
+ });
+ }
+
+ if (!done)
+ {
+ portable_vec<T, N> tmp;
+ CMT_LOOP_NOUNROLL
+ for (size_t i = 0; i < N; ++i)
{
- sindex = self.segments[sindex + 1] == index ? sindex + 1 : sindex;
- result.data()[i] = get_elements(self, cinput, index, sindex - 1, vec_shape<T, 1>()).front();
- index++;
+ shape<Traits::dims> idx = index.add_at(i, cindex<Axis>);
+ tmp[i] = get_elements(self.first(), self.in_shape.from_flat(self.out_shape.to_flat(idx)),
+ axis_params<indims - 1, 1>{})
+ .front();
}
- return result;
+ result = tmp;
}
+ return result;
}
+}
-protected:
- template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_sequence& self, cinput_t cinput,
- size_t index, size_t expr_index, vec_shape<T, N> y)
+template <typename Arg, index_t outdims, index_t Axis, size_t N,
+ typename Traits = expression_traits<expression_reshape<Arg, outdims>>,
+ typename T = typename Traits::value_type>
+KFR_INTRINSIC void set_elements(expression_reshape<Arg, outdims>& self, const shape<Traits::dims>& index,
+ const axis_params<Axis, N>& sh, const identity<vec<T, N>>& value)
+{
+ using ArgTraits = typename Traits::ArgTraits;
+ constexpr index_t indims = ArgTraits::dims;
+ if constexpr (N == 1)
{
- return cswitch(
- indicesfor_t<E...>(), expr_index, [&](auto val) { return self.argument(cinput, val, index, y); },
- [&]() { return zerovector(y); });
+ const shape<indims> idx = self.in_shape.from_flat(self.out_shape.to_flat(index));
+ set_elements(self.first(), idx, axis_params<indims - 1, 1>{}, value);
}
+ else
+ {
+ const shape<indims> first_idx = self.in_shape.from_flat(self.out_shape.to_flat(index));
+ const shape<indims> last_idx =
+ self.in_shape.from_flat(self.out_shape.to_flat(index.add_at(N - 1, cindex<Axis>)));
+
+ const shape<indims> diff_idx = last_idx.sub(first_idx);
+
+ bool done = false;
+
+ cforeach(cvalseq_t<index_t, indims, 0>{},
+ [&](auto n) CMT_INLINE_LAMBDA
+ {
+ constexpr index_t axis = val_of<decltype(n)>({});
+ if (!done && diff_idx[axis] == N - 1)
+ {
+ set_elements(self.first(), first_idx, axis_params<axis, N>{}, value);
+ done = true;
+ }
+ });
+
+ if (!done)
+ {
+ CMT_LOOP_NOUNROLL
+ for (size_t i = 0; i < N; ++i)
+ {
+ set_elements(self.first(),
+ self.in_shape.from_flat(self.out_shape.to_flat(index.add_at(i, cindex<Axis>))),
+ axis_params<indims - 1, 1>{}, vec<T, 1>{ value[i] });
+ }
+ }
+ }
+}
+
+} // namespace CMT_ARCH_NAME
+
+// ----------------------------------------------------------------------------
- std::array<size_t, base::count + 2> segments;
+struct symmetric_linspace_t
+{
};
+constexpr inline const symmetric_linspace_t symmetric_linspace{};
-template <typename Fn, typename E>
-struct expression_adjacent : expression_with_arguments<E>
+template <typename T, bool truncated = true>
+struct expression_linspace
{
- using value_type = value_type_of<E>;
- using T = value_type;
+ T start;
+ T stop;
+ index_t size;
+ bool endpoint;
+ T invsize;
- expression_adjacent(Fn&& fn, E&& e)
- : expression_with_arguments<E>(std::forward<E>(e)), fn(std::forward<Fn>(fn))
+ expression_linspace(T start, T stop, size_t size, bool endpoint = false)
+ : start(start), stop(stop), size(size), invsize(1.0 / T(endpoint ? size - 1 : size))
{
}
- template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_adjacent& self, cinput_t cinput,
- size_t index, vec_shape<T, N>)
+ expression_linspace(symmetric_linspace_t, T symsize, size_t size, bool endpoint = false)
+ : expression_linspace(-symsize, +symsize, size, endpoint)
{
- const vec<T, N> in = self.argument_first(cinput, index, vec_shape<T, N>());
- const vec<T, N> delayed = insertleft(self.data, in);
- self.data = in[N - 1];
- return self.fn(in, delayed);
}
- Fn fn;
- mutable value_type data = value_type(0);
};
-} // namespace internal
-/** @brief Returns the subrange of the given expression
- */
-template <typename E1>
-KFR_INTRINSIC internal::expression_slice<E1> slice(E1&& e1, size_t start, size_t size = infinite_size)
+template <typename T, bool truncated>
+struct expression_traits<expression_linspace<T, truncated>> : expression_traits_defaults
{
- return internal::expression_slice<E1>(std::forward<E1>(e1), start, size);
-}
+ using value_type = T;
+ constexpr static size_t dims = 1;
-/** @brief Returns the expression truncated to the given size
- */
-template <typename E1>
-KFR_INTRINSIC internal::expression_slice<E1> truncate(E1&& e1, size_t size)
-{
- return internal::expression_slice<E1>(std::forward<E1>(e1), 0, size);
-}
-
-/** @brief Returns the reversed expression
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_reverse<E1> reverse(E1&& e1)
-{
- static_assert(!is_infinite<E1>, "e1 must be a sized expression (use slice())");
- return internal::expression_reverse<E1>(std::forward<E1>(e1));
-}
+ constexpr static shape<dims> get_shape(const expression_linspace<T, truncated>& self)
+ {
+ return shape<dims>(truncated ? self.size : infinite_size);
+ }
+ constexpr static shape<dims> get_shape()
+ {
+ return shape<dims>(truncated ? undefined_size : infinite_size);
+ }
+};
/** @brief Returns evenly spaced numbers over a specified interval.
*
@@ -434,155 +731,212 @@ KFR_INTRINSIC internal::expression_reverse<E1> reverse(E1&& e1)
* @param stop The end value of the sequence. if ``endpoint`` is ``false``, the last value is excluded
* @param size Number of samples to generate
* @param endpoint If ``true``, ``stop`` is the last sample. Otherwise, it is not included
- * @param truncate If ``true``, linspace returns exactly size elements, otherwise, returns infinite sequence
+ * @tparam truncated If ``true``, linspace returns exactly size elements, otherwise, returns infinite sequence
+ * @tparam precise No longer used since KFR5, calculations are always precise
*/
-template <typename T1, typename T2, bool precise = false, typename TF = ftype<common_type<T1, T2>>>
-KFR_INTRINSIC internal::expression_linspace<TF, precise> linspace(T1 start, T2 stop, size_t size,
- bool endpoint = false,
- bool truncate = false)
+template <typename T = void, bool precise = false, bool truncated = false, typename T1, typename T2,
+ typename Tout = or_type<T, ftype<std::common_type_t<T1, T2>>>>
+KFR_INTRINSIC expression_linspace<Tout, truncated> linspace(T1 start, T2 stop, size_t size,
+ bool endpoint = false, cbool_t<truncated> = {})
{
- return internal::expression_linspace<TF, precise>(start, stop, size, endpoint, truncate);
+ return { static_cast<Tout>(start), static_cast<Tout>(stop), size, endpoint };
}
-KFR_FN(linspace)
-template <typename T, bool precise = false, typename TF = ftype<T>>
-KFR_INTRINSIC internal::expression_linspace<TF, precise> symmlinspace(T symsize, size_t size,
- bool endpoint = false)
+/** @brief Returns evenly spaced numbers over a specified interval.
+ *
+ * @param symsize The sequence will have interval [-symsize..symsize]
+ * @param size Number of samples to generate
+ * @tparam truncated If ``true``, linspace returns exactly size elements, otherwise, returns infinite sequence
+ * @tparam precise No longer used since KFR5, calculations are always precise
+ */
+template <typename T, bool precise = false, bool truncated = false, typename Tout = ftype<T>>
+KFR_INTRINSIC expression_linspace<Tout, truncated> symmlinspace(T symsize, size_t size,
+ cbool_t<truncated> = {})
{
- return internal::expression_linspace<TF, precise>(symmetric_linspace, symsize, size, endpoint);
+ return { symmetric_linspace, static_cast<Tout>(symsize), size, true };
}
-KFR_FN(symmlinspace)
-template <size_t size, typename... E>
-KFR_INTRINSIC internal::expression_sequence<decay<E>...> gen_sequence(const size_t (&list)[size], E&&... gens)
+inline namespace CMT_ARCH_NAME
{
- static_assert(size == sizeof...(E), "Lists must be of equal length");
- return internal::expression_sequence<decay<E>...>(list, std::forward<E>(gens)...);
-}
-KFR_FN(gen_sequence)
-/**
- * @brief Returns template expression that returns the result of calling \f$ fn(x_i, x_{i-1}) \f$
- */
-template <typename Fn, typename E1>
-KFR_INTRINSIC internal::expression_adjacent<Fn, E1> adjacent(Fn&& fn, E1&& e1)
+template <typename T, bool truncated, size_t N>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_linspace<T, truncated>& self, const shape<1>& index,
+ const axis_params<0, N>&)
{
- return internal::expression_adjacent<Fn, E1>(std::forward<Fn>(fn), std::forward<E1>(e1));
+ using TI = itype<T>;
+ return mix((enumerate(vec_shape<T, N>()) + static_cast<T>(static_cast<TI>(index.front()))) * self.invsize,
+ self.start, self.stop);
}
+} // namespace CMT_ARCH_NAME
-namespace internal
+// ----------------------------------------------------------------------------
+
+template <typename Arg1, typename Arg2, index_t ConcatAxis>
+struct expression_concatenate : public expression_with_arguments<Arg1, Arg2>
{
-template <typename E>
-struct expression_padded : expression_with_arguments<E>
+ static_assert(expression_dims<Arg1> == expression_dims<Arg2>);
+ static_assert(std::is_same_v<expression_value_type<Arg1>, expression_value_type<Arg2>>);
+ constexpr static index_t dims = expression_dims<Arg1>;
+ shape<dims> size1;
+
+ KFR_MEM_INTRINSIC expression_concatenate(Arg1&& arg1, Arg2&& arg2)
+ : expression_with_arguments<Arg1, Arg2>{ std::forward<Arg1>(arg1), std::forward<Arg2>(arg2) },
+ size1(expression_traits<Arg1>::get_shape(arg1))
+ {
+ }
+};
+
+template <typename Arg1, typename Arg2, index_t ConcatAxis>
+struct expression_traits<expression_concatenate<Arg1, Arg2, ConcatAxis>> : expression_traits_defaults
{
- using value_type = value_type_of<E>;
+ using ArgTraits1 = expression_traits<Arg1>;
+ using ArgTraits2 = expression_traits<Arg2>;
- KFR_MEM_INTRINSIC constexpr static size_t size() CMT_NOEXCEPT { return infinite_size; }
+ using value_type = typename ArgTraits1::value_type;
+ constexpr static size_t dims = ArgTraits1::dims;
+ constexpr static bool random_access = ArgTraits1::random_access && ArgTraits2::random_access;
- expression_padded(value_type fill_value, E&& e)
- : expression_with_arguments<E>(std::forward<E>(e)), fill_value(fill_value), input_size(e.size())
+ KFR_INTRINSIC static shape<dims> concat_shape(const shape<dims>& sh1, const shape<dims>& sh2)
{
+ shape<dims> result = min(sh1, sh2);
+ shape<dims> sum = add_shape_undef(sh1, sh2);
+ result[ConcatAxis] = sum[ConcatAxis];
+ return result;
}
- template <size_t N>
- KFR_INTRINSIC friend vec<value_type, N> get_elements(const expression_padded& self, cinput_t cinput,
- size_t index, vec_shape<value_type, N> y)
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape(
+ const expression_concatenate<Arg1, Arg2, ConcatAxis>& self)
{
- if (index >= self.input_size)
- {
- return self.fill_value;
- }
- else if (index + N <= self.input_size)
- {
- return self.argument_first(cinput, index, y);
- }
- else
- {
- vec<value_type, N> x{};
- for (size_t i = 0; i < N; i++)
- {
- if (index + i < self.input_size)
- x[i] = self.argument_first(cinput, index + i, vec_shape<value_type, 1>()).front();
- else
- x[i] = self.fill_value;
- }
- return x;
- }
+ return concat_shape(ArgTraits1::get_shape(std::get<0>(self.args)),
+ ArgTraits2::get_shape(std::get<1>(self.args)));
+ }
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape()
+ {
+ return concat_shape(ArgTraits1::get_shape(), ArgTraits2::get_shape());
}
- value_type fill_value;
- const size_t input_size;
};
-} // namespace internal
-/**
- * @brief Returns infinite template expression that pads e with fill_value (default value = 0)
- */
-template <typename E, typename T = value_type_of<E>>
-internal::expression_padded<E> padded(E&& e, const T& fill_value = T(0))
+template <index_t ConcatAxis = 0, typename Arg1, typename Arg2, KFR_ACCEPT_EXPRESSIONS(Arg1, Arg2)>
+KFR_INTRINSIC expression_concatenate<Arg1, Arg2, ConcatAxis> concatenate(Arg1&& arg1, Arg2&& arg2)
{
- static_assert(is_input_expression<E>, "E must be an input expression");
- return internal::expression_padded<E>(fill_value, std::forward<E>(e));
+ return { std::forward<Arg1>(arg1), std::forward<Arg2>(arg2) };
}
-namespace internal
+template <index_t ConcatAxis = 0, typename Arg1, typename Arg2, typename Arg3,
+ KFR_ACCEPT_EXPRESSIONS(Arg1, Arg2, Arg3)>
+KFR_INTRINSIC expression_concatenate<Arg1, expression_concatenate<Arg2, Arg3, ConcatAxis>, ConcatAxis>
+concatenate(Arg1&& arg1, Arg2&& arg2, Arg3&& arg3)
{
-template <typename... E>
-struct multioutput : output_expression
+ return { std::forward<Arg1>(arg1), { std::forward<Arg2>(arg2), std::forward<Arg3>(arg3) } };
+}
+
+inline namespace CMT_ARCH_NAME
+{
+
+template <typename Arg1, typename Arg2, index_t ConcatAxis, index_t NDims, index_t Axis, size_t N,
+ typename T = typename expression_traits<expression_concatenate<Arg1, Arg2, ConcatAxis>>::value_type>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_concatenate<Arg1, Arg2, ConcatAxis>& self,
+ const shape<NDims>& index, const axis_params<Axis, N>& sh)
{
- template <typename... E_>
- multioutput(E_&&... e) : outputs(std::forward<E_>(e)...)
+ const shape<NDims> size1 = self.size1;
+ constexpr index_t Naxis = ConcatAxis == Axis ? N : 1;
+ if (index[ConcatAxis] >= size1[ConcatAxis])
{
+ shape index1 = index;
+ index1[ConcatAxis] -= size1[ConcatAxis];
+ return get_elements(std::get<1>(self.args), index1, sh);
}
- template <typename T, size_t N>
- void operator()(coutput_t coutput, size_t index, const vec<T, N>& x)
+ else if (CMT_LIKELY(index[ConcatAxis] + Naxis <= size1[ConcatAxis]))
{
- cfor(csize_t<0>(), csize_t<sizeof...(E)>(),
- [&](auto n) { std::get<val_of(decltype(n)())>(outputs)(coutput, index, x); });
+ return get_elements(std::get<0>(self.args), index, sh);
}
- std::tuple<E...> outputs;
+ else // (index < size1) && (index + N > size1)
+ {
+ vec<T, N> result;
+ // Here Axis == ConcatAxis
+ shape index1 = index;
+ for (index_t i = 0; i < size1[ConcatAxis] - index[ConcatAxis]; ++i)
+ {
+ result[i] = get_elements(std::get<0>(self.args), index1, axis_params<Axis, 1>{})[0];
+ ++index1[ConcatAxis];
+ }
+ index1[ConcatAxis] -= size1[ConcatAxis];
+ for (index_t i = size1[ConcatAxis] - index[ConcatAxis]; i < N; ++i)
+ {
+ result[i] = get_elements(std::get<1>(self.args), index1, axis_params<Axis, 1>{})[0];
+ ++index1[ConcatAxis];
+ }
+ return result;
+ }
+}
-private:
-};
+// ----------------------------------------------------------------------------
-template <typename... E>
-struct expression_pack : expression_with_arguments<E...>
+template <typename... Args>
+using expression_pack = expression_function<fn::packtranspose, Args...>;
+
+template <typename... Args, KFR_ACCEPT_EXPRESSIONS(Args...)>
+KFR_INTRINSIC expression_pack<Args...> pack(Args&&... args)
{
- constexpr static size_t count = sizeof...(E);
+ return { std::forward<Args>(args)... };
+}
- expression_pack(E&&... e) : expression_with_arguments<E...>(std::forward<E>(e)...) {}
- using value_type = vec<common_type<value_type_of<E>...>, count>;
- using T = value_type;
+namespace internal
+{
+template <typename... Args, index_t Axis, size_t N,
+ typename Tr = expression_traits<expression_function<fn::packtranspose, Args...>>, size_t... Indices>
+KFR_INTRINSIC void set_elements_packed(expression_function<fn::packtranspose, Args...>& self,
+ shape<Tr::dims> index, axis_params<Axis, N> sh,
+ const vec<typename Tr::value_type, N>& x, csizes_t<Indices...>)
+{
+ constexpr size_t count = sizeof...(Args);
+ using ST = subtype<typename Tr::value_type>;
+ const vec<vec<ST, N>, count> xx = vec<vec<ST, N>, count>::from_flatten(transpose<count>(flatten(x)));
+ (set_elements(std::get<Indices>(self.args), index, sh, xx[Indices]), ...);
+}
+} // namespace internal
- using expression_with_arguments<E...>::size;
+template <typename... Args, index_t Axis, size_t N,
+ typename Tr = expression_traits<expression_function<fn::packtranspose, Args...>>>
+KFR_INTRINSIC void set_elements(expression_function<fn::packtranspose, Args...>& self, shape<Tr::dims> index,
+ axis_params<Axis, N> sh, const identity<vec<typename Tr::value_type, N>>& x)
+{
+ internal::set_elements_packed(self, index, sh, x, csizeseq<sizeof...(Args)>);
+}
- template <size_t N>
- friend KFR_INTRINSIC vec<T, N> get_elements(const expression_pack& self, cinput_t cinput, size_t index,
- vec_shape<T, N> y)
- {
- return self.call(cinput, fn::packtranspose(), index, y);
- }
-};
+// ----------------------------------------------------------------------------
template <typename... E>
-struct expression_unpack : private expression_with_arguments<E...>, output_expression
+struct expression_unpack : expression_with_arguments<E...>, expression_traits_defaults
{
- using expression_with_arguments<E...>::begin_block;
- using expression_with_arguments<E...>::end_block;
- using output_expression::begin_block;
- using output_expression::end_block;
constexpr static size_t count = sizeof...(E);
- expression_unpack(E&&... e) : expression_with_arguments<E...>(std::forward<E>(e)...) {}
+ using first_arg_traits = typename expression_with_arguments<E...>::first_arg_traits;
+
+ constexpr static index_t dims = first_arg_traits::dims;
+ using first_value_type = typename first_arg_traits::value_type;
+
+ using value_type = vec<first_value_type, count>;
+
+ static_assert(((expression_dims<E> == dims) && ...));
+ static_assert(((std::is_same_v<expression_value_type<E>, first_value_type>)&&...));
+
+ constexpr static shape<dims> get_shape(const expression_unpack& self)
+ {
+ return first_arg_traits::get_shape(self.first());
+ }
+ constexpr static shape<dims> get_shape() { return first_arg_traits::get_shape(); }
- using expression_with_arguments<E...>::size;
+ expression_unpack(E&&... e) : expression_with_arguments<E...>(std::forward<E>(e)...) {}
- template <typename U, size_t N>
- KFR_MEM_INTRINSIC void operator()(coutput_t coutput, size_t index, const vec<vec<U, count>, N>& x)
+ template <index_t Axis, size_t N>
+ KFR_INTRINSIC friend void set_elements(expression_unpack& self, shape<dims> index,
+ axis_params<Axis, N> sh, const identity<vec<value_type, N>>& x)
{
- output(coutput, index, x, csizeseq<count>);
+ self.output(index, sh, x, csizeseq<count>);
}
- template <typename Input, KFR_ENABLE_IF(is_input_expression<Input>)>
+ template <typename Input, KFR_ACCEPT_EXPRESSIONS(Input)>
KFR_MEM_INTRINSIC expression_unpack& operator=(Input&& input)
{
process(*this, std::forward<Input>(input));
@@ -590,118 +944,136 @@ struct expression_unpack : private expression_with_arguments<E...>, output_expre
}
private:
- template <typename U, size_t N, size_t... indices>
- void output(coutput_t coutput, size_t index, const vec<vec<U, count>, N>& x, csizes_t<indices...>)
+ template <index_t Axis, size_t N, size_t... indices>
+ KFR_MEM_INTRINSIC void output(shape<dims> index, axis_params<Axis, N> sh, const vec<value_type, N>& x,
+ csizes_t<indices...>)
{
- const vec<vec<U, N>, count> xx = vec<vec<U, N>, count>::from_flatten(transpose<count>(flatten(x)));
- swallow{ (std::get<indices>(this->args)(coutput, index, xx[indices]), void(), 0)... };
+ const vec<vec<first_value_type, N>, count> xx =
+ vec<vec<first_value_type, N>, count>::from_flatten(transpose<count>(flatten(x)));
+ (set_elements(std::get<indices>(this->args), index, sh, xx[indices]), ...);
}
};
-} // namespace internal
-template <typename... E, KFR_ENABLE_IF(is_output_expressions<E...>)>
-internal::expression_unpack<E...> unpack(E&&... e)
-{
- return internal::expression_unpack<E...>(std::forward<E>(e)...);
-}
+// ----------------------------------------------------------------------------
-template <typename... E, KFR_ENABLE_IF(is_input_expressions<E...>)>
-internal::expression_pack<internal::arg<E>...> pack(E&&... e)
+template <typename... E, enable_if_output_expressions<E...>* = nullptr>
+KFR_FUNCTION expression_unpack<E...> unpack(E&&... e)
{
- return internal::expression_pack<internal::arg<E>...>(std::forward<E>(e)...);
+ return { std::forward<E>(e)... };
}
-template <typename OutExpr, typename InExpr>
-struct task_partition
+// ----------------------------------------------------------------------------
+
+template <typename Fn, typename E>
+struct expression_adjacent : expression_with_traits<E>
{
- task_partition(OutExpr&& output, InExpr&& input, size_t size, size_t chunk_size, size_t count)
- : output(std::forward<OutExpr>(output)), input(std::forward<InExpr>(input)), size(size),
- chunk_size(chunk_size), count(count)
+ using value_type = typename expression_with_traits<E>::value_type;
+ constexpr static inline index_t dims = expression_with_traits<E>::dims;
+ constexpr static inline bool random_access = false;
+
+ expression_adjacent(Fn&& fn, E&& e)
+ : expression_with_traits<E>(std::forward<E>(e)), fn(std::forward<Fn>(fn))
{
}
- OutExpr output;
- InExpr input;
- size_t size;
- size_t chunk_size;
- size_t count;
- size_t operator()(size_t index)
+
+ template <size_t N, index_t VecAxis>
+ KFR_INTRINSIC friend vec<value_type, N> get_elements(const expression_adjacent& self, shape<dims> index,
+ axis_params<VecAxis, N> sh)
{
- if (index >= count)
- return 0;
- return process(output, input, index * chunk_size,
- index == count - 1 ? size - (count - 1) * chunk_size : chunk_size);
+ const vec<value_type, N> in = get_elements(self.first(), index, sh);
+ const vec<value_type, N> delayed = insertleft(self.data, in);
+ self.data = in.back();
+ return self.fn(in, delayed);
}
+ Fn fn;
+ mutable value_type data = value_type(0);
};
-template <typename OutExpr, typename InExpr, typename T = value_type_of<InExpr>>
-task_partition<OutExpr, InExpr> partition(OutExpr&& output, InExpr&& input, size_t count,
- size_t minimum_size = 0)
+/**
+ * @brief Returns template expression that returns the result of calling \f$ fn(x_i, x_{i-1}) \f$
+ */
+template <typename Fn, typename E1>
+KFR_INTRINSIC expression_adjacent<Fn, E1> adjacent(Fn&& fn, E1&& e1)
{
- static_assert(!is_infinite<OutExpr> || !is_infinite<InExpr>, "");
+ return { std::forward<Fn>(fn), std::forward<E1>(e1) };
+}
- minimum_size = minimum_size == 0 ? vector_width<T> * 8 : minimum_size;
- const size_t size = size_min(output.size(), input.size());
- const size_t chunk_size = align_up(std::max(size / count, minimum_size), vector_width<T>);
+// ----------------------------------------------------------------------------
- task_partition<OutExpr, InExpr> result(std::forward<OutExpr>(output), std::forward<InExpr>(input), size,
- chunk_size, (size + chunk_size - 1) / chunk_size);
- return result;
-}
+template <typename E>
+struct expression_trace : public expression_with_traits<E>
+{
+ using expression_with_traits<E>::expression_with_traits;
+ using value_type = typename expression_with_traits<E>::value_type;
+ constexpr static inline index_t dims = expression_with_traits<E>::dims;
-namespace internal
+ template <size_t N, index_t VecAxis>
+ KFR_INTRINSIC friend vec<value_type, N> get_elements(const expression_trace& self, shape<dims> index,
+ axis_params<VecAxis, N> sh)
+ {
+ const vec<value_type, N> in = get_elements(self.first(), index, sh);
+ println("[", fmt<'s', 16>(array_to_string(dims, index.data(), INT_MAX, INT_MAX, ",", "", "")),
+ "] = ", in);
+ return in;
+ }
+};
+
+/**
+ * @brief Returns template expression that prints all processed values for debug
+ */
+template <typename E1>
+KFR_INTRINSIC expression_trace<E1> trace(E1&& e1)
{
+ return { std::forward<E1>(e1) };
+}
-template <typename E1, typename E2>
-struct concatenate_expression : expression_with_arguments<E1, E2>
+// ----------------------------------------------------------------------------
+
+template <index_t Dims, typename E>
+struct expression_dimensions : public expression_with_traits<E>
{
- using value_type = common_type<value_type_of<E1>, value_type_of<E2>>;
- using T = value_type;
+ using expression_with_traits<E>::expression_with_traits;
+ using value_type = typename expression_with_traits<E>::value_type;
+ constexpr static inline index_t in_dims = expression_with_traits<E>::dims;
+ constexpr static inline index_t dims = Dims;
+ using first_arg_traits = typename expression_with_traits<E>::first_arg_traits;
- KFR_MEM_INTRINSIC constexpr size_t size() const CMT_NOEXCEPT
+ constexpr static shape<dims> get_shape(const expression_dimensions& self)
{
- return size_add(std::get<0>(this->args).size(), std::get<1>(this->args).size());
+ return first_arg_traits::get_shape(self.first()).template extend<dims>(infinite_size);
}
- template <typename E1_, typename E2_>
- concatenate_expression(E1_&& e1, E2_&& e2)
- : expression_with_arguments<E1, E2>(std::forward<E1_>(e1), std::forward<E2_>(e2))
+ constexpr static shape<dims> get_shape()
{
+ return first_arg_traits::get_shape().template extend<dims>(infinite_size);
}
- template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const concatenate_expression& self, cinput_t cinput,
- size_t index, vec_shape<T, N> y)
+ template <size_t N, index_t VecAxis>
+ KFR_INTRINSIC friend vec<value_type, N> get_elements(const expression_dimensions& self, shape<dims> index,
+ axis_params<VecAxis, N> sh)
{
- const size_t size0 = std::get<0>(self.args).size();
- if (index >= size0)
+ shape<in_dims> inindex = index.template trim<in_dims>();
+ if constexpr (VecAxis >= in_dims)
{
- return self.argument(cinput, csize<1>, index - size0, y);
+ return repeat<N>(get_elements(self.first(), inindex, axis_params_v<0, 1>));
}
- else if (index + N <= size0)
- {
- return self.argument(cinput, csize<0>, index, y);
- }
- else // (index < size0) && (index + N > size0)
+ else
{
- vec<T, N> result;
- for (size_t i = 0; i < size0 - index; ++i)
- {
- result[i] = self.argument(cinput, csize<0>, index + i, vec_shape<T, 1>{})[0];
- }
- for (size_t i = size0 - index; i < N; ++i)
- {
- result[i] = self.argument(cinput, csize<1>, index + i - size0, vec_shape<T, 1>{})[0];
- }
- return result;
+ return get_elements(self.first(), inindex, sh);
}
}
};
-} // namespace internal
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expression<E1>&& is_input_expression<E2>)>
-internal::concatenate_expression<E1, E2> concatenate(E1&& e1, E2&& e2)
+/**
+ * @brief Returns template expression with gien number of dimensions
+ */
+template <index_t Dims, typename E1>
+KFR_INTRINSIC expression_dimensions<Dims, E1> dimensions(E1&& e1)
{
- return { std::forward<E1>(e1), std::forward<E2>(e2) };
+ static_assert(Dims >= expression_dims<E1>, "Number of dimensions must be greater or equal");
+ return { std::forward<E1>(e1) };
}
+// ----------------------------------------------------------------------------
+
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/base/conversion.hpp b/include/kfr/base/conversion.hpp
@@ -25,7 +25,7 @@
*/
#pragma once
-#include "../math/clamp.hpp"
+#include "../simd/clamp.hpp"
#include "../simd/types.hpp"
#include "../simd/vec.hpp"
#include "univector.hpp"
@@ -172,18 +172,18 @@ struct audio_sample_traits<f64>
};
template <typename Tout, typename Tin, typename Tout_traits = audio_sample_traits<Tout>,
- typename Tin_traits = audio_sample_traits<Tin>, KFR_ENABLE_IF(is_same<Tin, Tout>)>
+ typename Tin_traits = audio_sample_traits<Tin>, KFR_ENABLE_IF(std::is_same_v<Tin, Tout>)>
inline Tout convert_sample(const Tin& in)
{
return in;
}
template <typename Tout, typename Tin, typename Tout_traits = audio_sample_traits<Tout>,
- typename Tin_traits = audio_sample_traits<Tin>, KFR_ENABLE_IF(!is_same<Tin, Tout>)>
+ typename Tin_traits = audio_sample_traits<Tin>, KFR_ENABLE_IF(!std::is_same_v<Tin, Tout>)>
inline Tout convert_sample(const Tin& in)
{
constexpr auto scale = Tout_traits::scale / Tin_traits::scale;
- return innercast<Tout>(clamp(in * scale, -Tout_traits::scale, +Tout_traits::scale));
+ return broadcastto<Tout>(clamp(in * scale, -Tout_traits::scale, +Tout_traits::scale));
}
/// @brief Deinterleaves and converts audio samples
@@ -202,7 +202,7 @@ void deinterleave(Tout* out[], const Tin* in, size_t channels, size_t size)
template <typename Tout, univector_tag Tag1, univector_tag Tag2, typename Tin, univector_tag Tag3>
void deinterleave(univector2d<Tout, Tag1, Tag2>& out, const univector<Tin, Tag3>& in)
{
- if (in.empty() || out.empty())
+ if (CMT_UNLIKELY(in.empty() || out.empty()))
return;
std::vector<Tout*> ptrs(out.size());
for (size_t i = 0; i < out.size(); ++i)
@@ -228,7 +228,7 @@ void interleave(Tout* out, const Tin* in[], size_t channels, size_t size)
template <typename Tout, univector_tag Tag1, typename Tin, univector_tag Tag2, univector_tag Tag3>
void interleave(univector<Tout, Tag1>& out, const univector2d<Tin, Tag2, Tag3>& in)
{
- if (in.empty() || out.empty())
+ if (CMT_UNLIKELY(in.empty() || out.empty()))
return;
std::vector<const Tin*> ptrs(in.size());
for (size_t i = 0; i < in.size(); ++i)
@@ -242,7 +242,7 @@ void interleave(univector<Tout, Tag1>& out, const univector2d<Tin, Tag2, Tag3>&
template <typename Tin, univector_tag Tag1, univector_tag Tag2>
univector<Tin> interleave(const univector2d<Tin, Tag1, Tag2>& in)
{
- if (in.empty())
+ if (CMT_UNLIKELY(in.empty()))
return {};
univector<Tin> result(in.size() * in[0].size());
interleave(result, in);
@@ -264,20 +264,24 @@ void convert(Tout* out, const Tin* in, size_t size)
template <typename Tout, typename Tout_traits = audio_sample_traits<Tout>>
void convert(Tout* out, const void* in, audio_sample_type in_type, size_t size)
{
- cswitch(audio_sample_type_clist{}, in_type, [&](auto t) {
- using type = typename audio_sample_get_type<val_of(decltype(t)())>::type;
- convert(out, reinterpret_cast<const type*>(in), size);
- });
+ cswitch(audio_sample_type_clist{}, in_type,
+ [&](auto t)
+ {
+ using type = typename audio_sample_get_type<val_of(decltype(t)())>::type;
+ convert(out, reinterpret_cast<const type*>(in), size);
+ });
}
/// @brief Converts audio samples (output format is known at runtime)
template <typename Tin, typename Tin_traits = audio_sample_traits<Tin>>
void convert(void* out, audio_sample_type out_type, const Tin* in, size_t size)
{
- cswitch(audio_sample_type_clist{}, out_type, [&](auto t) {
- using type = typename audio_sample_get_type<val_of(decltype(t)())>::type;
- convert(reinterpret_cast<type*>(out), in, size);
- });
+ cswitch(audio_sample_type_clist{}, out_type,
+ [&](auto t)
+ {
+ using type = typename audio_sample_get_type<val_of(decltype(t)())>::type;
+ convert(reinterpret_cast<type*>(out), in, size);
+ });
}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/base/expression.hpp b/include/kfr/base/expression.hpp
@@ -26,9 +26,11 @@
#pragma once
#include "../simd/platform.hpp"
+#include "../simd/read_write.hpp"
#include "../simd/shuffle.hpp"
#include "../simd/types.hpp"
#include "../simd/vec.hpp"
+#include "shape.hpp"
#include <tuple>
#ifdef KFR_STD_COMPLEX
@@ -55,448 +57,894 @@ struct complex;
#endif
#endif
-constexpr size_t inout_context_size = 16;
-
-struct coutput_context
+struct accepts_any
{
- pconstvoid data[inout_context_size];
};
-struct cinput_context
-{
- pconstvoid data[inout_context_size];
-};
+template <typename T, typename V = void>
+struct expression_traits;
-using coutput_t = const coutput_context*;
-using cinput_t = const cinput_context*;
-
-constexpr cinput_t cinput = nullptr;
-constexpr coutput_t coutput = nullptr;
+template <typename T>
+using expression_value_type = typename expression_traits<T>::value_type;
-constexpr size_t infinite_size = static_cast<size_t>(-1);
+template <typename T>
+constexpr inline size_t expression_dims = expression_traits<T>::dims;
-CMT_INTRINSIC constexpr size_t size_add(size_t x, size_t y)
+template <typename T>
+constexpr inline shape<expression_dims<T>> get_shape(T&& expr)
{
- return (x == infinite_size || y == infinite_size) ? infinite_size : x + y;
+ return expression_traits<T>::get_shape(expr);
}
-
-CMT_INTRINSIC constexpr size_t size_sub(size_t x, size_t y)
+template <typename T>
+constexpr inline shape<expression_dims<T>> get_shape()
{
- return (x == infinite_size || y == infinite_size) ? infinite_size : (x > y ? x - y : 0);
+ return expression_traits<T>::get_shape();
}
-CMT_INTRINSIC constexpr size_t size_min(size_t x) CMT_NOEXCEPT { return x; }
-
-template <typename... Ts>
-CMT_INTRINSIC constexpr size_t size_min(size_t x, size_t y, Ts... rest) CMT_NOEXCEPT
+template <typename T>
+struct expression_traits<const T, std::void_t<expression_value_type<T>>> : expression_traits<T>
{
- return size_min(x < y ? x : y, rest...);
-}
+};
+template <typename T>
+struct expression_traits<T&, std::void_t<expression_value_type<T>>> : expression_traits<T>
+{
+};
+template <typename T>
+struct expression_traits<T&&, std::void_t<expression_value_type<T>>> : expression_traits<T>
+{
+};
+template <typename T>
+struct expression_traits<const T&, std::void_t<expression_value_type<T>>> : expression_traits<T>
+{
+};
+template <typename T>
+struct expression_traits<const T&&, std::void_t<typename expression_traits<T>::value_type>>
+ : expression_traits<T>
+{
+};
-/// @brief Base class of all input expressoins
-struct input_expression
+// This allows old style expressions+traits
+template <typename T>
+struct expression_traits<T, std::void_t<decltype(T::random_access), decltype(T::get_shape())>>
{
- KFR_MEM_INTRINSIC constexpr static size_t size() CMT_NOEXCEPT { return infinite_size; }
+ using value_type = typename T::value_type;
+ constexpr static size_t dims = T::dims;
+ constexpr static shape<dims> get_shape(const T& self) { return T::get_shape(self); }
+ constexpr static shape<dims> get_shape() { return T::get_shape(); }
+
+ constexpr static inline bool explicit_operand = T::explicit_operand;
+ constexpr static inline bool random_access = T::random_access;
+};
- constexpr static bool is_incremental = false;
+struct expression_traits_defaults
+{
+ // using value_type = accepts_any;
+ // constexpr static size_t dims = 0;
+ // constexpr static shape<dims> get_shape(const T&);
+ // constexpr static shape<dims> get_shape();
- KFR_MEM_INTRINSIC constexpr void begin_block(cinput_t, size_t) const {}
- KFR_MEM_INTRINSIC constexpr void end_block(cinput_t, size_t) const {}
+ constexpr static inline bool explicit_operand = true;
+ constexpr static inline bool random_access = true;
};
-/// @brief Base class of all output expressoins
-struct output_expression
+template <typename T, typename = void>
+constexpr inline bool has_expression_traits = false;
+
+template <typename T>
+constexpr inline bool has_expression_traits<T, std::void_t<typename expression_traits<T>::value_type>> = true;
+
+namespace internal_generic
{
- KFR_MEM_INTRINSIC constexpr static size_t size() CMT_NOEXCEPT { return infinite_size; }
+template <typename... Xs>
+using expressions_condition = std::void_t<expression_traits<Xs>...>;
+template <typename... Xs>
+using expressions_check = std::enable_if_t<(expression_traits<Xs>::explicit_operand || ...)>;
+} // namespace internal_generic
- constexpr static bool is_incremental = false;
+template <typename T>
+using enable_if_input_expression =
+ std::void_t<expression_traits<T>,
+ decltype(get_elements(std::declval<T>(), shape<expression_traits<T>::dims>(),
+ axis_params<0, 1>{}))>;
- KFR_MEM_INTRINSIC constexpr void begin_block(coutput_t, size_t) const {}
- KFR_MEM_INTRINSIC constexpr void end_block(coutput_t, size_t) const {}
-};
+template <typename T>
+using enable_if_output_expression =
+ std::void_t<expression_traits<T>,
+ decltype(set_elements(std::declval<T&>(), shape<expression_traits<T>::dims>(),
+ axis_params<0, 1>{},
+ vec<typename expression_traits<T>::value_type, 1>{}))>;
+
+template <typename T>
+using enable_if_input_output_expression =
+ std::void_t<enable_if_input_expression<T>, enable_if_output_expression<T>>;
+
+template <typename... T>
+using enable_if_input_expressions = std::void_t<enable_if_input_expression<T>...>;
+
+template <typename... T>
+using enable_if_output_expressions = std::void_t<enable_if_output_expression<T>...>;
+
+template <typename... T>
+using enable_if_input_output_expressions = std::void_t<enable_if_input_output_expression<T>...>;
+
+template <typename E, typename = void>
+constexpr inline bool is_input_expression = false;
+
+template <typename E>
+constexpr inline bool is_input_expression<E, enable_if_input_expression<E>> = true;
+
+template <typename E, typename = void>
+constexpr inline bool is_output_expression = false;
-/// @brief Check if the type argument is an input expression
template <typename E>
-constexpr inline bool is_input_expression = is_base_of<input_expression, decay<E>>;
+constexpr inline bool is_output_expression<E, enable_if_output_expression<E>> = true;
-/// @brief Check if the type arguments are an input expressions
-template <typename... Es>
-constexpr inline bool is_input_expressions = (is_base_of<input_expression, decay<Es>> || ...);
+template <typename E, typename = void>
+constexpr inline bool is_input_output_expression = false;
-/// @brief Check if the type argument is an output expression
template <typename E>
-constexpr inline bool is_output_expression = is_base_of<output_expression, decay<E>>;
+constexpr inline bool is_input_output_expression<E, enable_if_input_output_expression<E>> = true;
-/// @brief Check if the type arguments are an output expressions
-template <typename... Es>
-constexpr inline bool is_output_expressions = (is_base_of<output_expression, decay<Es>> || ...);
+#define KFR_ACCEPT_EXPRESSIONS(...) internal_generic::expressions_check<__VA_ARGS__>* = nullptr
+
+#define KFR_ACCEPT_ASGN_EXPRESSIONS(E1, E2) \
+ KFR_ENABLE_IF(is_input_output_expression<E1>&& is_input_expression<E2>)
+
+template <typename T>
+constexpr inline bool is_expr_element = std::is_same_v<std::remove_cv_t<T>, T>&& is_vec_element<T>;
+
+template <typename E>
+constexpr inline bool is_infinite = expression_traits<E>::get_shape().has_infinity();
-/// @brief Check if the type argument is a number or a vector of numbers
template <typename T>
-constexpr inline bool is_numeric = is_number<deep_subtype<T>>;
+struct expression_traits<T, std::enable_if_t<is_expr_element<T>>> : expression_traits_defaults
+{
+ using value_type = T;
+ constexpr static size_t dims = 0;
+ constexpr static inline bool explicit_operand = false;
+
+ KFR_MEM_INTRINSIC constexpr static shape<0> get_shape(const T& self) { return {}; }
+ KFR_MEM_INTRINSIC constexpr static shape<0> get_shape() { return {}; }
+};
+
+template <typename E, enable_if_input_expression<E>* = nullptr, index_t Dims = expression_dims<E>>
+inline expression_value_type<E> get_element(E&& expr, shape<Dims> index)
+{
+ return get_elements(expr, index, axis_params_v<0, 1>).front();
+}
+
+template <index_t Axis, index_t Dims, index_t VecAxis, size_t N>
+inline vec<index_t, N> indices(const shape<Dims>& index, axis_params<VecAxis, N>)
+{
+ if constexpr (Axis == VecAxis)
+ return index[Axis] + enumerate<index_t, N, 0, 1>();
+ else
+ return index[Axis];
+}
-/// @brief Check if the type arguments are a numbers or a vectors of numbers
-template <typename... Ts>
-constexpr inline bool is_numeric_args = (is_numeric<Ts> && ...);
+namespace internal_generic
+{
+struct anything
+{
+ template <typename Expr>
+ constexpr anything(Expr&&)
+ {
+ }
+};
+} // namespace internal_generic
inline namespace CMT_ARCH_NAME
{
-#ifdef KFR_TESTING
+template <index_t Dims, typename U = unsigned_type<sizeof(index_t) * 8>>
+KFR_INTRINSIC vec<U, Dims> to_vec(const shape<Dims>& sh)
+{
+ return read<Dims>(reinterpret_cast<const U*>(sh.data()));
+}
+
namespace internal
{
-template <typename T, size_t N, typename Fn>
-inline vec<T, N> get_fn_value(size_t index, Fn&& fn)
+template <size_t width, typename Fn>
+KFR_INTRINSIC void block_process_impl(size_t& i, size_t size, Fn&& fn)
{
- return apply(fn, enumerate<size_t, N>() + index);
+ CMT_LOOP_NOUNROLL
+ for (; i < size / width * width; i += width)
+ fn(i, csize_t<width>());
}
} // namespace internal
-template <typename E, typename Fn>
-void test_expression(const E& expr, size_t size, Fn&& fn, const char* expression = nullptr)
+template <size_t... widths, typename Fn>
+KFR_INTRINSIC void block_process(size_t size, csizes_t<widths...>, Fn&& fn)
{
- using T = value_type_of<E>;
- ::testo::test_case* test = ::testo::active_test();
- auto&& c = ::testo::make_comparison();
- test->check(c <= expr.size() == size, expression);
- if (expr.size() != size)
- return;
- size = size_min(size, 200);
- constexpr size_t maxsize = 2 + ilog2(vector_width<T> * 2);
- size_t g = 1;
- for (size_t i = 0; i < size;)
- {
- const size_t next_size = std::min(prev_poweroftwo(size - i), g);
- g *= 2;
- if (g > (1 << (maxsize - 1)))
- g = 1;
-
- cswitch(csize<1> << csizeseq<maxsize>, next_size, [&](auto x) {
- constexpr size_t nsize = val_of(decltype(x)());
- ::testo::scope s(as_string("i = ", i, " width = ", nsize));
- test->check(c <= get_elements(expr, cinput, i, vec_shape<T, nsize>()) ==
- internal::get_fn_value<T, nsize>(i, fn),
- expression);
- });
- i += next_size;
- }
+ size_t i = 0;
+ swallow{ (internal::block_process_impl<widths>(i, size, std::forward<Fn>(fn)), 0)... };
}
-#define TESTO_CHECK_EXPRESSION(expr, size, ...) ::kfr::test_expression(expr, size, __VA_ARGS__, #expr)
-#ifndef TESTO_NO_SHORT_MACROS
-#define CHECK_EXPRESSION TESTO_CHECK_EXPRESSION
-#endif
-#endif
+template <index_t Dims>
+KFR_INTRINSIC void begin_pass(const internal_generic::anything&, shape<Dims> start, shape<Dims> stop)
+{
+}
+template <index_t Dims>
+KFR_INTRINSIC void end_pass(const internal_generic::anything&, shape<Dims> start, shape<Dims> stop)
+{
+}
-namespace internal
+template <typename T, index_t Axis, size_t N, KFR_ENABLE_IF(is_expr_element<std::decay_t<T>>)>
+KFR_INTRINSIC vec<std::decay_t<T>, N> get_elements(T&& self, const shape<0>& index,
+ const axis_params<Axis, N>&)
+{
+ return self;
+}
+template <typename T, index_t Axis, size_t N, KFR_ENABLE_IF(is_expr_element<std::decay_t<T>>)>
+KFR_INTRINSIC void set_elements(T& self, const shape<0>& index, const axis_params<Axis, N>&,
+ const identity<vec<T, N>>& val)
{
+ static_assert(N == 1);
+ static_assert(!std::is_const_v<T>);
+ self = val.front();
+}
-template <typename T, typename Fn>
-struct expression_lambda : input_expression
+template <typename... Args>
+struct expression_with_arguments
{
- using value_type = T;
- KFR_MEM_INTRINSIC expression_lambda(Fn&& fn) : fn(std::move(fn)) {}
+ constexpr static size_t count = sizeof...(Args);
+
+ using type_list = ctypes_t<Args...>;
+
+ template <size_t idx>
+ using nth = typename type_list::template nth<idx>;
+
+ using first_arg = typename type_list::template nth<0>;
+
+ template <size_t idx>
+ using nth_trait = expression_traits<typename type_list::template nth<idx>>;
+
+ using first_arg_traits = expression_traits<first_arg>;
+
+ std::tuple<Args...> args;
+ std::array<dimset, count> masks;
- template <size_t N, KFR_ENABLE_IF(N&& is_callable<Fn, cinput_t, size_t, vec_shape<T, N>>)>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_lambda& self, cinput_t cinput, size_t index,
- vec_shape<T, N> y)
+ KFR_INTRINSIC auto& first() { return std::get<0>(args); }
+ KFR_INTRINSIC const auto& first() const { return std::get<0>(args); }
+
+ template <size_t idx>
+ KFR_INTRINSIC dimset getmask(csize_t<idx> = {}) const
{
- return self.fn(cinput, index, y);
+ static_assert(idx < count);
+ using Traits = expression_traits<nth<idx>>;
+ if constexpr (sizeof...(Args) <= 1 || Traits::dims == 0)
+ {
+ return dimset(-1);
+ }
+ else
+ {
+ if constexpr (Traits::get_shape().product() > 0)
+ {
+ return Traits::get_shape().tomask();
+ }
+ else
+ {
+ return std::get<idx>(masks);
+ }
+ }
}
- template <size_t N, KFR_ENABLE_IF(N&& is_callable<Fn, size_t>)>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_lambda& self, cinput_t, size_t index,
- vec_shape<T, N>)
+ template <typename Fn>
+ KFR_INTRINSIC constexpr auto fold(Fn&& fn) const
{
- return apply(self.fn, enumerate<size_t, N>() + index);
+ return fold_impl(std::forward<Fn>(fn), csizeseq<count>);
}
- template <size_t N, KFR_ENABLE_IF(N&& is_callable<Fn>)>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_lambda& self, cinput_t, size_t,
- vec_shape<T, N>)
+ template <typename Fn>
+ KFR_INTRINSIC constexpr static auto fold_idx(Fn&& fn)
{
- return apply<N>(self.fn);
+ return fold_idx_impl(std::forward<Fn>(fn), csizeseq<count>);
}
- Fn fn;
+ KFR_INTRINSIC expression_with_arguments(Args&&... args) : args{ std::forward<Args>(args)... }
+ {
+ cforeach(csizeseq<count>,
+ [&](auto idx_) CMT_INLINE_LAMBDA
+ {
+ constexpr size_t idx = val_of(decltype(idx_)());
+ shape sh = expression_traits<nth<idx>>::get_shape(std::get<idx>(this->args));
+ masks[idx] = sh.tomask();
+ });
+ }
+
+private:
+ template <typename Fn, size_t... indices>
+ KFR_INTRINSIC constexpr auto fold_impl(Fn&& fn, csizes_t<indices...>) const
+ {
+ return fn(std::get<indices>(args)...);
+ }
+ template <typename Fn, size_t... indices>
+ KFR_INTRINSIC constexpr static auto fold_idx_impl(Fn&& fn, csizes_t<indices...>)
+ {
+ return fn(csize<indices>...);
+ }
};
-} // namespace internal
-template <typename T, typename Fn>
-internal::expression_lambda<T, decay<Fn>> lambda(Fn&& fn)
+template <typename Arg>
+struct expression_with_arguments<Arg>
{
- return internal::expression_lambda<T, decay<Fn>>(std::move(fn));
-}
+ constexpr static size_t count = 1;
-namespace internal
-{
+ using type_list = ctypes_t<Arg>;
-template <typename T, typename = void>
-struct is_infinite_impl : std::false_type
-{
-};
+ template <size_t idx>
+ using nth = Arg;
-template <typename T>
-struct is_infinite_impl<T, void_t<decltype(T::size())>>
- : std::integral_constant<bool, T::size() == infinite_size>
-{
-};
-} // namespace internal
+ using first_arg = Arg;
-template <typename T>
-constexpr inline bool is_infinite = internal::is_infinite_impl<T>::value;
+ template <size_t idx>
+ using nth_trait = expression_traits<Arg>;
-namespace internal
-{
+ using first_arg_traits = expression_traits<first_arg>;
-template <typename... Args>
-struct expression_with_arguments : input_expression
-{
- KFR_MEM_INTRINSIC constexpr size_t size() const CMT_NOEXCEPT
+ std::tuple<Arg> args;
+
+ KFR_MEM_INTRINSIC auto& first() { return std::get<0>(args); }
+ KFR_MEM_INTRINSIC const auto& first() const { return std::get<0>(args); }
+
+ template <size_t idx>
+ KFR_MEM_INTRINSIC dimset getmask(csize_t<idx> = {}) const
{
- return size_impl(indicesfor_t<Args...>());
+ return dimset(-1);
}
- constexpr static size_t count = sizeof...(Args);
- expression_with_arguments() = delete;
- constexpr expression_with_arguments(Args&&... args) CMT_NOEXCEPT : args(std::forward<Args>(args)...) {}
+ template <typename Fn>
+ KFR_MEM_INTRINSIC constexpr auto fold(Fn&& fn) const
+ {
+ return fold_impl(std::forward<Fn>(fn), csizeseq<count>);
+ }
+ template <typename Fn>
+ KFR_INTRINSIC constexpr static auto fold_idx(Fn&& fn)
+ {
+ return fold_idx_impl(std::forward<Fn>(fn), csizeseq<count>);
+ }
- KFR_MEM_INTRINSIC void begin_block(cinput_t cinput, size_t size) const
+ KFR_MEM_INTRINSIC expression_with_arguments(Arg&& arg) : args{ std::forward<Arg>(arg) } {}
+
+private:
+ template <typename Fn, size_t... indices>
+ KFR_MEM_INTRINSIC constexpr auto fold_impl(Fn&& fn, csizes_t<indices...>) const
{
- begin_block_impl(cinput, size, indicesfor_t<Args...>());
+ return fn(std::get<indices>(args)...);
}
- KFR_MEM_INTRINSIC void end_block(cinput_t cinput, size_t size) const
+ template <typename Fn, size_t... indices>
+ KFR_INTRINSIC constexpr static auto fold_idx_impl(Fn&& fn, csizes_t<indices...>)
{
- end_block_impl(cinput, size, indicesfor_t<Args...>());
+ return fn(csize<indices>...);
}
+};
- std::tuple<Args...> args;
+template <typename... Args>
+expression_with_arguments(Args&&... args) -> expression_with_arguments<Args...>;
+
+template <typename Arg>
+struct expression_with_traits : expression_with_arguments<Arg>
+{
+ constexpr static inline bool explicit_operand = true;
+ constexpr static inline bool random_access = true;
-protected:
- template <size_t... indices>
- KFR_MEM_INTRINSIC constexpr size_t size_impl(csizes_t<indices...>) const CMT_NOEXCEPT
+ using first_arg_traits = expression_traits<Arg>;
+ using value_type = typename first_arg_traits::value_type;
+ constexpr static size_t dims = first_arg_traits::dims;
+ constexpr static shape<dims> get_shape(const expression_with_traits& self)
{
- return size_min(std::get<indices>(this->args).size()...);
+ return first_arg_traits::get_shape(self.first());
}
+ constexpr static shape<dims> get_shape() { return first_arg_traits::get_shape(); }
+
+ using expression_with_arguments<Arg>::expression_with_arguments;
+};
+
+template <typename Fn, typename... Args>
+struct expression_function : expression_with_arguments<Args...>, expression_traits_defaults
+{
+ using value_type =
+ typename std::invoke_result_t<Fn,
+ vec<typename expression_traits<Args>::value_type, 1>...>::value_type;
+ constexpr static size_t dims = const_max(expression_traits<Args>::dims...);
- template <typename Fn, typename T, size_t N>
- KFR_MEM_INTRINSIC vec<T, N> call(cinput_t cinput, Fn&& fn, size_t index, vec_shape<T, N> x) const
+#if defined CMT_COMPILER_IS_MSVC || defined CMT_COMPILER_GCC
+ struct lambda_get_shape
+ {
+ template <size_t... idx>
+ constexpr auto operator()(csize_t<idx>...) const
+ {
+ return internal_generic::common_shape(
+ expression_traits<typename expression_function::template nth<idx>>::get_shape()...);
+ }
+ };
+ struct lambda_get_shape_self
+ {
+ const expression_function& self;
+ template <typename... TArgs>
+ constexpr auto operator()(const TArgs&... args) const
+ {
+ return internal_generic::common_shape<true>(expression_traits<Args>::get_shape(args)...);
+ }
+ };
+ constexpr static shape<dims> get_shape(const expression_function& self)
{
- return call_impl(cinput, std::forward<Fn>(fn), indicesfor_t<Args...>(), index, x);
+ return self.fold(lambda_get_shape_self{ self });
}
- template <size_t ArgIndex, typename U, size_t N,
- typename T = value_type_of<typename details::get_nth_type<ArgIndex, Args...>::type>>
- KFR_MEM_INTRINSIC vec<U, N> argument(cinput_t cinput, csize_t<ArgIndex>, size_t index,
- vec_shape<U, N>) const
- {
- static_assert(ArgIndex < count, "Incorrect ArgIndex");
- return static_cast<vec<U, N>>(
- get_elements(std::get<ArgIndex>(this->args), cinput, index, vec_shape<T, N>()));
+ constexpr static shape<dims> get_shape() { return expression_function::fold_idx(lambda_get_shape{}); }
+#else
+ constexpr static shape<dims> get_shape(const expression_function& self)
+ {
+ return self.fold([&](auto&&... args) CMT_INLINE_LAMBDA constexpr->auto {
+ return internal_generic::common_shape<true>(
+ expression_traits<decltype(args)>::get_shape(args)...);
+ });
}
- template <typename U, size_t N,
- typename T = value_type_of<typename details::get_nth_type<0, Args...>::type>>
- KFR_MEM_INTRINSIC vec<U, N> argument_first(cinput_t cinput, size_t index, vec_shape<U, N>) const
+ constexpr static shape<dims> get_shape()
{
- return static_cast<vec<U, N>>(
- get_elements(std::get<0>(this->args), cinput, index, vec_shape<T, N>()));
+ return expression_function::fold_idx([&](auto... args) CMT_INLINE_LAMBDA constexpr->auto {
+ return internal_generic::common_shape(
+ expression_traits<
+ typename expression_function::template nth<val_of(decltype(args)())>>::get_shape()...);
+ });
}
+#endif
-private:
- template <typename Fn, typename T, size_t N, size_t... indices>
- KFR_MEM_INTRINSIC vec<T, N> call_impl(cinput_t cinput, Fn&& fn, csizes_t<indices...>, size_t index,
- vec_shape<T, N>) const
+ constexpr static inline bool random_access = (expression_traits<Args>::random_access && ...);
+
+ Fn fn;
+
+ KFR_MEM_INTRINSIC expression_function(expression_with_arguments<Args...> args, Fn&& fn)
+ : expression_with_arguments<Args...>{ std::move(args) }, fn(std::forward<Fn>(fn))
{
- return fn(get_elements(std::get<indices>(this->args), cinput, index,
- vec_shape<value_type_of<Args>, N>())...);
}
- template <size_t... indices>
- KFR_MEM_INTRINSIC void begin_block_impl(cinput_t cinput, size_t size, csizes_t<indices...>) const
+ KFR_MEM_INTRINSIC expression_function(Fn&& fn, Args&&... args)
+ : expression_with_arguments<Args...>{ std::forward<Args>(args)... }, fn(std::forward<Fn>(fn))
{
- swallow{ (std::get<indices>(args).begin_block(cinput, size), 0)... };
}
- template <size_t... indices>
- KFR_MEM_INTRINSIC void end_block_impl(cinput_t cinput, size_t size, csizes_t<indices...>) const
+ KFR_MEM_INTRINSIC expression_function(Args&&... args)
+ : expression_with_arguments<Args...>{ std::forward<Args>(args)... }, fn{}
{
- swallow{ (std::get<indices>(args).end_block(cinput, size), 0)... };
}
-};
-template <typename T>
-struct expression_scalar : input_expression
-{
- using value_type = T;
- expression_scalar() = delete;
- constexpr expression_scalar(const T& val) CMT_NOEXCEPT : val(val) {}
- T val;
-
- template <size_t N>
- friend KFR_INTRINSIC vec<T, N> get_elements(const expression_scalar& self, cinput_t, size_t,
- vec_shape<T, N>)
+ template <typename In, enable_if_input_expression<In>* = nullptr>
+ expression_function& operator=(In&& in)
{
- return broadcast<N>(self.val);
+ static_assert(is_output_expression<expression_function>);
+ process(*this, std::forward<In>(in));
+ return *this;
}
};
-template <typename T1, typename T2, typename = void>
-struct arg_impl
+template <typename... Args, typename Fn>
+expression_function(const expression_with_arguments<Args...>& args, Fn&& fn)
+ -> expression_function<Fn, Args...>;
+template <typename... Args, typename Fn>
+expression_function(expression_with_arguments<Args...>&& args, Fn&& fn) -> expression_function<Fn, Args...>;
+template <typename... Args, typename Fn>
+expression_function(expression_with_arguments<Args...>& args, Fn&& fn) -> expression_function<Fn, Args...>;
+
+namespace internal
{
- using type = T2;
- using value_type = typename T1::value_type;
-};
-template <typename T1, typename T2>
-struct arg_impl<T1, T2, void_t<enable_if<is_vec_element<T1>>>>
+template <typename... Args, index_t Dims, size_t... idx>
+KFR_INTRINSIC void begin_pass_args(const expression_with_arguments<Args...>& self, shape<Dims> start,
+ shape<Dims> stop, csizes_t<idx...>)
{
- using type = expression_scalar<T1>;
- using value_type = T1;
-};
+ (begin_pass(std::get<idx>(self.args), start, stop), ...);
+}
-template <typename T>
-using arg = typename internal::arg_impl<decay<T>, T>::type;
+template <typename... Args, index_t Dims, size_t... idx>
+KFR_INTRINSIC void end_pass_args(const expression_with_arguments<Args...>& self, shape<Dims> start,
+ shape<Dims> stop, csizes_t<idx...>)
+{
+ (end_pass(std::get<idx>(self.args), start, stop), ...);
+}
-template <typename T>
-using arg_type = typename internal::arg_impl<decay<T>, T>::value_type;
+template <index_t outdims, typename Fn, typename... Args, index_t VecAxis, size_t N, index_t Dims, size_t idx,
+ typename Traits = expression_traits<typename expression_function<Fn, Args...>::template nth<idx>>>
+KFR_MEM_INTRINSIC vec<typename Traits::value_type, N> get_arg(const expression_function<Fn, Args...>& self,
+ const shape<Dims>& index,
+ const axis_params<VecAxis, N>& sh, csize_t<idx>)
+{
+ if constexpr (Traits::dims == 0)
+ {
+ return repeat<N>(get_elements(std::get<idx>(self.args), {}, axis_params<0, 1>{}));
+ }
+ else
+ {
+ constexpr size_t NewVecAxis = Traits::dims - (Dims - VecAxis);
+ auto indices = internal_generic::adapt<Traits::dims>(index, self.getmask(csize<idx>));
+ constexpr index_t last_dim = Traits::get_shape().back();
+ if constexpr (last_dim != undefined_size)
+ {
+ constexpr index_t last_dim_pot = prev_poweroftwo(last_dim);
+ return repeat<N / std::min(last_dim_pot, static_cast<index_t>(N))>(
+ get_elements(std::get<idx>(self.args), indices,
+ axis_params<NewVecAxis, std::min(last_dim_pot, static_cast<index_t>(N))>{}));
+ }
+ else
+ {
+ if constexpr (sizeof...(Args) > 1 && N > 1)
+ {
+ if (CMT_UNLIKELY(self.masks[idx].back() == 0))
+ return get_elements(std::get<idx>(self.args), indices, axis_params<NewVecAxis, 1>{})
+ .front();
+ else
+ return get_elements(std::get<idx>(self.args), indices, axis_params<NewVecAxis, N>{});
+ }
+ else
+ {
+ return get_elements(std::get<idx>(self.args), indices, axis_params<NewVecAxis, N>{});
+ }
+ }
+ }
+}
+} // namespace internal
-template <typename Fn, typename... Args>
-struct function_value_type
+template <typename... Args, index_t Dims>
+KFR_INTRINSIC void begin_pass(const expression_with_arguments<Args...>& self, shape<Dims> start,
+ shape<Dims> stop)
{
- using type = typename invoke_result<Fn, vec<arg_type<Args>, 1>...>::value_type;
-};
+ internal::begin_pass_args(self, start, stop, indicesfor<Args...>);
+}
-template <typename Fn, typename... Args>
-struct expression_function : expression_with_arguments<arg<Args>...>
+template <typename... Args, index_t Dims>
+KFR_INTRINSIC void end_pass(const expression_with_arguments<Args...>& self, shape<Dims> start,
+ shape<Dims> stop)
{
- using value_type = typename function_value_type<Fn, Args...>::type;
- // subtype<decltype(std::declval<Fn>()(std::declval<vec<value_type_of<arg<Args>>, 1>>()...))>;
- using T = value_type;
+ internal::end_pass_args(self, start, stop, indicesfor<Args...>);
+}
- expression_function(Fn&& fn, arg<Args>&&... args) CMT_NOEXCEPT
- : expression_with_arguments<arg<Args>...>(std::forward<arg<Args>>(args)...),
- fn(std::forward<Fn>(fn))
- {
- }
- expression_function(const Fn& fn, arg<Args>&&... args) CMT_NOEXCEPT
- : expression_with_arguments<arg<Args>...>(std::forward<arg<Args>>(args)...),
- fn(fn)
+template <typename Fn, typename... Args, index_t Axis, size_t N, index_t Dims,
+ typename Tr = expression_traits<expression_function<Fn, Args...>>,
+ typename T = typename Tr::value_type>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_function<Fn, Args...>& self, const shape<Dims>& index,
+ const axis_params<Axis, N>& sh)
+{
+ return self.fold_idx(
+ [&](auto... idx) CMT_INLINE_LAMBDA -> vec<T, N> {
+ return self.fn(internal::get_arg<Tr::dims>(self, index, sh, idx)...);
+ });
+}
+
+template <typename Out, typename In, index_t OutAxis, size_t w, size_t gw, typename Tin, index_t outdims,
+ index_t indims>
+KFR_INTRINSIC static void tprocess_body(Out&& out, In&& in, size_t start, size_t stop, size_t insize,
+ shape<outdims> outidx, shape<indims> inidx)
+{
+ if constexpr (indims == 0)
{
+ size_t x = start;
+ const vec<Tin, 1> val = get_elements(in, inidx, axis_params_v<0, 1>);
+ if constexpr (w > gw)
+ {
+ CMT_LOOP_NOUNROLL
+ for (; x < stop / w * w; x += w)
+ {
+ outidx[OutAxis] = x;
+ set_elements(out, outidx, axis_params_v<OutAxis, w>, repeat<w>(val));
+ }
+ }
+ CMT_LOOP_NOUNROLL
+ for (; x < stop / gw * gw; x += gw)
+ {
+ outidx[OutAxis] = x;
+ set_elements(out, outidx, axis_params_v<OutAxis, gw>, repeat<gw>(val));
+ }
}
- template <size_t N>
- friend KFR_INTRINSIC vec<T, N> get_elements(const expression_function& self, cinput_t cinput,
- size_t index, vec_shape<T, N> x)
+ else
{
- return self.call(cinput, self.fn, index, x);
+ constexpr index_t InAxis = OutAxis + indims - outdims;
+ size_t x = start;
+ if constexpr (w > gw)
+ {
+ CMT_LOOP_NOUNROLL
+ for (; x < stop / w * w; x += w)
+ {
+ outidx[OutAxis] = x;
+ inidx[InAxis] = std::min(x, insize - 1);
+ auto v = get_elements(in, inidx, axis_params_v<InAxis, w>);
+ // println("## i=", x, "\n", v);
+ set_elements(out, outidx, axis_params_v<OutAxis, w>, v);
+ }
+ }
+ CMT_LOOP_NOUNROLL
+ for (; x < stop / gw * gw; x += gw)
+ {
+ outidx[OutAxis] = x;
+ inidx[InAxis] = std::min(x, insize - 1);
+ set_elements(out, outidx, axis_params_v<OutAxis, gw>,
+ get_elements(in, inidx, axis_params_v<InAxis, gw>));
+ }
}
+}
- const Fn& get_fn() const CMT_NOEXCEPT { return fn; }
+template <size_t width = 0, index_t Axis = 0, typename Out, typename In, size_t gw = 1,
+ CMT_ENABLE_IF(expression_traits<Out>::dims == 0)>
+static auto process(Out&& out, In&& in, shape<0> = {}, shape<0> = {}, csize_t<gw> = {}) -> shape<0>
+{
+ static_assert(is_input_expression<In>, "In must be an input expression");
+ static_assert(is_output_expression<Out>, "Out must be an output expression");
+ static_assert(expression_traits<In>::dims == 0);
+ begin_pass(out, shape{}, shape{});
+ begin_pass(in, shape{}, shape{});
+ set_elements(out, shape<0>{}, axis_params_v<0, 1>, get_elements(in, shape<0>{}, axis_params_v<0, 1>));
+ end_pass(in, shape{}, shape{});
+ end_pass(out, shape{}, shape{});
+ return {};
+}
-protected:
- Fn fn;
-};
-} // namespace internal
+namespace internal
+{
-template <typename A>
-CMT_INTRINSIC internal::arg<A> e(A&& a)
+constexpr KFR_INTRINSIC size_t select_process_width(size_t width, size_t vec_width, index_t last_dim_size)
{
- return internal::arg<A>(std::forward<A>(a));
+ if (width != 0)
+ return width;
+ if (last_dim_size == 0)
+ return vec_width;
+
+ return std::min(vec_width, static_cast<size_t>(last_dim_size));
}
-template <typename T>
-CMT_INTRINSIC internal::expression_scalar<T> scalar(const T& val)
+constexpr KFR_INTRINSIC index_t select_axis(index_t ndims, index_t axis)
{
- return internal::expression_scalar<T>(val);
+ if (axis >= ndims)
+ return ndims - 1;
+ return axis;
}
-template <typename Fn, typename... Args>
-CMT_INTRINSIC internal::expression_function<decay<Fn>, Args...> bind_expression(Fn&& fn, Args&&... args)
+template <index_t VecAxis, index_t LoopAxis, index_t outdims>
+KFR_INTRINSIC index_t axis_start(const shape<outdims>& sh)
{
- return internal::expression_function<decay<Fn>, Args...>(std::forward<Fn>(fn),
- std::forward<Args>(args)...);
+ static_assert(VecAxis < outdims);
+ static_assert(LoopAxis < outdims);
+ if constexpr (VecAxis == LoopAxis)
+ return 0;
+ else
+ return sh[LoopAxis];
}
-/**
- * @brief Construct a new expression using the same function as in @c e and new arguments
- * @param e an expression
- * @param args new arguments for the function
- */
-template <typename Fn, typename... OldArgs, typename... NewArgs>
-CMT_INTRINSIC internal::expression_function<Fn, NewArgs...> rebind(
- const internal::expression_function<Fn, OldArgs...>& e, NewArgs&&... args)
-{
- return internal::expression_function<Fn, NewArgs...>(e.get_fn(), std::forward<NewArgs>(args)...);
+template <index_t VecAxis, index_t LoopAxis, index_t outdims>
+KFR_INTRINSIC index_t axis_stop(const shape<outdims>& sh)
+{
+ static_assert(VecAxis < outdims);
+ static_assert(LoopAxis < outdims);
+ if constexpr (VecAxis == LoopAxis)
+ return 1;
+ else
+ return sh[LoopAxis];
}
-template <size_t width = 0, typename OutputExpr, typename InputExpr, size_t groupsize = 1,
- typename Tvec = vec<value_type_of<InputExpr>, 1>>
-static size_t process(OutputExpr&& out, const InputExpr& in, size_t start = 0,
- size_t size = infinite_size, coutput_t coutput = nullptr,
- cinput_t cinput = nullptr, csize_t<groupsize> = csize_t<groupsize>())
+} // namespace internal
+
+template <size_t width = 0, index_t Axis = infinite_size, typename Out, typename In, size_t gw = 1,
+ index_t outdims = expression_dims<Out>, CMT_ENABLE_IF(expression_dims<Out> > 0)>
+static auto process(Out&& out, In&& in, shape<outdims> start = shape<outdims>(0),
+ shape<outdims> size = shape<outdims>(infinite_size), csize_t<gw> = {}) -> shape<outdims>
{
- using Tin = value_type_of<InputExpr>;
- static_assert(is_output_expression<OutputExpr>, "OutFn must be an expression");
- static_assert(is_input_expression<InputExpr>, "Fn must be an expression");
+ static_assert(is_input_expression<In>, "In must be an input expression");
+ static_assert(is_output_expression<Out>, "Out must be an output expression");
+
+ using Trin = expression_traits<In>;
+ using Trout = expression_traits<Out>;
+ using Tin = typename Trin::value_type;
+
+ using internal::axis_start;
+ using internal::axis_stop;
- size = size_sub(size_min(out.size(), in.size(), size_add(size, start)), start);
- if (size == 0 || size == infinite_size)
- return size;
- out.begin_block(coutput, size);
- in.begin_block(cinput, size);
+ constexpr index_t indims = expression_dims<In>;
+ static_assert(outdims >= indims);
+
+ constexpr index_t last_dim_size = prev_poweroftwo(Trout::get_shape().back());
#ifdef NDEBUG
- constexpr size_t w = width == 0 ? maximum_vector_size<Tin> : width;
+ constexpr size_t vec_width = maximum_vector_size<Tin>;
#else
- constexpr size_t w = width == 0 ? vector_width<Tin> : width;
+ constexpr size_t vec_width = vector_width<Tin>;
#endif
- static_assert(w > 0 && is_poweroftwo(w), "");
+ constexpr size_t w = internal::select_process_width(width, vec_width, last_dim_size);
- size_t i = start;
+ constexpr index_t out_axis = internal::select_axis(outdims, Axis);
+ constexpr index_t in_axis = out_axis + indims - outdims;
- CMT_LOOP_NOUNROLL
- for (; i < start + size / w * w; i += w)
- out(coutput, i, get_elements(in, cinput, i, vec_shape<Tin, w>()));
- CMT_LOOP_NOUNROLL
- for (; i < start + size / groupsize * groupsize; i += groupsize)
- out(coutput, i, get_elements(in, cinput, i, vec_shape<Tin, groupsize>()));
+ const shape<outdims> outshape = Trout::get_shape(out);
+ const shape<indims> inshape = Trin::get_shape(in);
+ if (CMT_UNLIKELY(!internal_generic::can_assign_from(outshape, inshape)))
+ return shape<outdims>{ 0 };
+ shape<outdims> stop = min(min(add_shape(start, size), outshape), inshape.template extend<outdims>());
+
+ index_t in_size = 0;
+ if constexpr (indims > 0)
+ in_size = inshape[in_axis];
- in.end_block(cinput, size);
- out.end_block(coutput, size);
- return size;
+ begin_pass(out, start, stop);
+ begin_pass(in, inshape.adapt(start), inshape.adapt(stop));
+
+ shape<outdims> outidx;
+ if constexpr (outdims == 1)
+ {
+ outidx = shape<outdims>{ 0 };
+ tprocess_body<Out, In, out_axis, w, gw, Tin, outdims, indims>(
+ std::forward<Out>(out), std::forward<In>(in), start[out_axis], stop[out_axis], in_size, outidx,
+ inshape.adapt(outidx));
+ }
+ else if constexpr (outdims == 2)
+ {
+ for (index_t i0 = axis_start<out_axis, 0>(start); i0 < axis_stop<out_axis, 0>(stop); ++i0)
+ {
+ for (index_t i1 = axis_start<out_axis, 1>(start); i1 < axis_stop<out_axis, 1>(stop); ++i1)
+ {
+ outidx = shape<outdims>{ i0, i1 };
+ tprocess_body<Out, In, out_axis, w, gw, Tin, outdims, indims>(
+ std::forward<Out>(out), std::forward<In>(in), start[out_axis], stop[out_axis], in_size,
+ outidx, inshape.adapt(outidx));
+ }
+ }
+ }
+ else if constexpr (outdims == 3)
+ {
+ for (index_t i0 = axis_start<out_axis, 0>(start); i0 < axis_stop<out_axis, 0>(stop); ++i0)
+ {
+ for (index_t i1 = axis_start<out_axis, 1>(start); i1 < axis_stop<out_axis, 1>(stop); ++i1)
+ {
+ for (index_t i2 = axis_start<out_axis, 2>(start); i2 < axis_stop<out_axis, 2>(stop); ++i2)
+ {
+ outidx = shape<outdims>{ i0, i1, i2 };
+ tprocess_body<Out, In, out_axis, w, gw, Tin, outdims, indims>(
+ std::forward<Out>(out), std::forward<In>(in), start[out_axis], stop[out_axis],
+ in_size, outidx, inshape.adapt(outidx));
+ }
+ }
+ }
+ }
+ else if constexpr (outdims == 4)
+ {
+ for (index_t i0 = axis_start<out_axis, 0>(start); i0 < axis_stop<out_axis, 0>(stop); ++i0)
+ {
+ for (index_t i1 = axis_start<out_axis, 1>(start); i1 < axis_stop<out_axis, 1>(stop); ++i1)
+ {
+ for (index_t i2 = axis_start<out_axis, 2>(start); i2 < axis_stop<out_axis, 2>(stop); ++i2)
+ {
+ for (index_t i3 = axis_start<out_axis, 3>(start); i3 < axis_stop<out_axis, 3>(stop); ++i3)
+ {
+ outidx = shape<outdims>{ i0, i1, i2, i3 };
+ tprocess_body<Out, In, out_axis, w, gw, Tin, outdims, indims>(
+ std::forward<Out>(out), std::forward<In>(in), start[out_axis], stop[out_axis],
+ in_size, outidx, inshape.adapt(outidx));
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ shape<outdims> outidx = start;
+ if (CMT_UNLIKELY(!internal_generic::compare_indices(outidx, stop)))
+ return stop;
+ do
+ {
+ tprocess_body<Out, In, out_axis, w, gw, Tin, outdims, indims>(
+ std::forward<Out>(out), std::forward<In>(in), start[out_axis], stop[out_axis], in_size,
+ outidx, inshape.adapt(outidx));
+ outidx[out_axis] = stop[out_axis] - 1;
+ } while (internal_generic::increment_indices(outidx, start, stop));
+ }
+ end_pass(in, inshape.adapt(start), inshape.adapt(stop));
+ end_pass(out, start, stop);
+ return stop;
}
-template <typename T>
-struct input_expression_base : input_expression
-{
- virtual ~input_expression_base() {}
- virtual T input(size_t index) const = 0;
- template <typename U, size_t N>
- friend KFR_INTRINSIC vec<U, N> get_elements(const input_expression_base& self, cinput_t, size_t index,
- vec_shape<U, N>)
- {
- vec<U, N> out;
- for (size_t i = 0; i < N; i++)
- out[i] = static_cast<U>(self.input(index + i));
- return out;
+template <typename Tin, index_t Dims>
+struct expression_discard : public expression_traits_defaults
+{
+ using value_type = Tin;
+ constexpr static size_t dims = Dims;
+ constexpr static shape<dims> get_shape(const expression_discard&) { return shape<dims>(infinite_size); }
+ constexpr static shape<dims> get_shape() { return shape<dims>(infinite_size); }
+
+ template <size_t N, index_t VecAxis>
+ friend KFR_INTRINSIC void set_elements(const expression_discard& self, shape<Dims>,
+ axis_params<VecAxis, N>, const identity<vec<Tin, N>>& x)
+ {
}
};
-template <typename T>
-struct output_expression_base : output_expression
+/// @brief Read the expression @c expr through the whole range.
+/// @param expr the input expression
+/// @return the input expression is returned
+template <size_t width = 0, index_t Axis = infinite_size, typename E, typename Traits = expression_traits<E>>
+KFR_FUNCTION const E& sink(E&& expr)
{
- virtual ~output_expression_base() {}
- virtual void output(size_t index, const T& value) = 0;
+ static_assert(!Traits::get_shape().has_infinity());
+ process<width, Axis>(expression_discard<expression_value_type<E>, expression_dims<E>>{}, expr);
+ return expr;
+}
- template <typename U, size_t N>
- KFR_MEM_INTRINSIC void operator()(coutput_t, size_t index, const vec<U, N>& value)
+template <typename Fn, typename... Args>
+KFR_FUNCTION expression_function<std::decay_t<Fn>, Args...> bind_expression(Fn&& fn, Args&&... args)
+{
+ return expression_function<std::decay_t<Fn>, Args...>(std::forward<Fn>(fn), std::forward<Args>(args)...);
+}
+/**
+ * @brief Construct a new expression using the same function as in @c e and new arguments
+ * @param e an expression
+ * @param args new arguments for the function
+ */
+template <typename Fn, typename... OldArgs, typename... NewArgs>
+KFR_FUNCTION expression_function<Fn, NewArgs...> rebind(const expression_function<Fn, OldArgs...>& e,
+ NewArgs&&... args)
+{
+ return expression_function<Fn, NewArgs...>(Fn{ e.fn }, std::forward<NewArgs>(args)...);
+}
+template <typename Fn, typename... OldArgs, typename... NewArgs>
+KFR_FUNCTION expression_function<Fn, NewArgs...> rebind(expression_function<Fn, OldArgs...>&& e,
+ NewArgs&&... args)
+{
+ return expression_function<Fn, NewArgs...>(std::move(e.fn), std::forward<NewArgs>(args)...);
+}
+
+#ifdef KFR_TESTING
+namespace internal
+{
+template <typename T, size_t N, typename Fn>
+inline vec<T, N> get_fn_value(size_t index, Fn&& fn)
+{
+ return apply(fn, enumerate<size_t, N>() + index);
+}
+} // namespace internal
+
+template <typename E, typename Fn, KFR_ENABLE_IF(std::is_invocable_v<Fn, size_t>)>
+void test_expression(const E& expr, size_t size, Fn&& fn, const char* expression = nullptr,
+ const char* file = nullptr, int line = 0)
+{
+ static_assert(expression_dims<E> == 1, "CHECK_EXPRESSION supports only 1-dim expressions");
+ using T = expression_value_type<E>;
+ size_t expr_size = get_shape(expr).front();
+ ::testo::test_case* test = ::testo::active_test();
+ auto&& c = ::testo::make_comparison();
+ test->check(c <= expr_size == size, expression, file, line);
+ if (expr_size != size)
+ return;
+ size = min(shape<1>(size), shape<1>(200)).front();
+ constexpr size_t maxsize = 2 + ilog2(vector_width<T> * 2);
+ size_t g = 1;
+ for (size_t i = 0; i < size;)
{
- for (size_t i = 0; i < N; i++)
- output(index + i, static_cast<T>(value[i]));
+ const size_t next_size = std::min(prev_poweroftwo(size - i), g);
+ g *= 2;
+ if (g > (1 << (maxsize - 1)))
+ g = 1;
+
+ cswitch(csize<1> << csizeseq<maxsize>, next_size,
+ [&](auto x)
+ {
+ constexpr size_t nsize = val_of(decltype(x)());
+ ::testo::scope s(as_string("i = ", i, " width = ", nsize));
+ test->check(c <= get_elements(expr, shape<1>(i), axis_params_v<0, nsize>) ==
+ internal::get_fn_value<T, nsize>(i, fn),
+ expression, file, line);
+ });
+ i += next_size;
}
-};
+}
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-CMT_INTRINSIC internal::expression_function<fn::interleave, E1, E2> interleave(E1&& x, E2&& y)
+template <typename E, typename T = expression_value_type<E>>
+void test_expression(const E& expr, std::initializer_list<cometa::identity<T>> list,
+ const char* expression = nullptr, const char* file = nullptr, int line = 0)
{
- return { fn::interleave(), std::forward<E1>(x), std::forward<E2>(y) };
+ test_expression(
+ expr, list.size(), [&](size_t i) { return list.begin()[i]; }, expression, file, line);
}
+#define TESTO_CHECK_EXPRESSION(expr, ...) ::kfr::test_expression(expr, __VA_ARGS__, #expr, __FILE__, __LINE__)
+
+#ifndef TESTO_NO_SHORT_MACROS
+#define CHECK_EXPRESSION TESTO_CHECK_EXPRESSION
+#endif
+#endif
+
} // namespace CMT_ARCH_NAME
+
} // namespace kfr
CMT_PRAGMA_GNU(GCC diagnostic pop)
diff --git a/include/kfr/base/filter.hpp b/include/kfr/base/filter.hpp
@@ -27,7 +27,7 @@
#include "basic_expressions.hpp"
#include "expression.hpp"
-#include "pointer.hpp"
+#include "handle.hpp"
#include "univector.hpp"
namespace kfr
@@ -78,12 +78,12 @@ public:
void apply(T* dest, const T* src, size_t size) { process_buffer(dest, src, size); }
template <univector_tag Tag>
- void apply(univector<T, Tag>& dest, const expression_pointer<T>& src)
+ void apply(univector<T, Tag>& dest, const expression_handle<T, 1>& src)
{
process_expression(dest.data(), src, size_min(dest.size(), src.size()));
}
- void apply(T* dest, const expression_pointer<T>& src, size_t size)
+ void apply(T* dest, const expression_handle<T, 1>& src, size_t size)
{
process_expression(dest, src, size_min(size, src.size()));
}
@@ -91,55 +91,56 @@ public:
template <univector_tag Tag, typename Expr, KFR_ENABLE_IF(is_input_expression<Expr>)>
void apply(univector<T, Tag>& dest, const Expr& src)
{
- process_expression(dest.data(), to_pointer(src), size_min(dest.size(), src.size()));
+ static_assert(expression_dims<Expr> == 1);
+ process_expression(dest.data(), to_handle(src), size_min(dest.size(), get_shape(src).front()));
}
template <typename Expr, KFR_ENABLE_IF(is_input_expression<Expr>)>
void apply(T* dest, const Expr& src, size_t size)
{
- process_expression(dest, to_pointer(src), size_min(size, src.size()));
+ process_expression(dest, to_handle(src), size_min(size, src.size()));
}
protected:
- virtual void process_buffer(T* dest, const T* src, size_t size) = 0;
- virtual void process_expression(T* dest, const expression_pointer<T>& src, size_t size) = 0;
+ virtual void process_buffer(T* dest, const T* src, size_t size) = 0;
+ virtual void process_expression(T* dest, const expression_handle<T, 1>& src, size_t size) = 0;
};
template <typename T>
class expression_filter : public filter<T>
{
public:
- explicit expression_filter(expression_pointer<T>&& filter_expr) : filter_expr(std::move(filter_expr)) {}
+ explicit expression_filter(expression_handle<T, 1> filter_expr) : filter_expr(std::move(filter_expr)) {}
protected:
void process_buffer(T* dest, const T* src, size_t size) override
{
- substitute(filter_expr, to_pointer(make_univector(src, size)));
- process(make_univector(dest, size), filter_expr, 0, size);
+ substitute(filter_expr, to_handle(make_univector(src, size)));
+ process(make_univector(dest, size), filter_expr, shape<1>(0), shape<1>(size));
}
- void process_expression(T* dest, const expression_pointer<T>& src, size_t size) override
+ void process_expression(T* dest, const expression_handle<T, 1>& src, size_t size) override
{
substitute(filter_expr, src);
- process(make_univector(dest, size), filter_expr, 0, size);
+ process(make_univector(dest, size), filter_expr, shape<1>(0), shape<1>(size));
}
- expression_pointer<T> filter_expr;
+ expression_handle<T, 1> filter_expr;
};
inline namespace CMT_ARCH_NAME
{
/// @brief Converts expression with placeholder to filter. Placeholder and filter must have the same type
-template <typename E, typename T = value_type_of<E>>
+template <typename E, typename T = expression_value_type<E>>
KFR_INTRINSIC expression_filter<T> to_filter(E&& e)
{
- return expression_filter<T>(to_pointer(std::move(e)));
+ return expression_filter<T>(to_handle(std::move(e)));
}
} // namespace CMT_ARCH_NAME
/// @brief Converts expression with placeholder to filter. Placeholder and filter must have the same type
template <typename T, typename E>
-KFR_INTRINSIC expression_filter<T> to_filter(expression_pointer<T>&& e)
+KFR_INTRINSIC expression_filter<T> to_filter(expression_handle<T, 1>&& e)
{
return expression_filter<T>(std::move(e));
}
diff --git a/include/kfr/base/fraction.hpp b/include/kfr/base/fraction.hpp
@@ -1,4 +1,4 @@
-/** @addtogroup types
+/** @addtogroup base
* @{
*/
/*
@@ -36,7 +36,7 @@ struct fraction
fraction(i64 num = 0, i64 den = 1) : numerator(num), denominator(den) { normalize(); }
void normalize()
{
- if (denominator < 0)
+ if (CMT_UNLIKELY(denominator < 0))
{
denominator = -denominator;
numerator = -numerator;
@@ -149,4 +149,4 @@ struct representation<kfr::fraction>
return as_string(value.numerator, "/", value.denominator);
}
};
-} // namespace cometa
-\ No newline at end of file
+} // namespace cometa
diff --git a/include/kfr/base/function_expressions.hpp b/include/kfr/base/function_expressions.hpp
@@ -1,30 +0,0 @@
-/** @addtogroup expressions
- * @{
- */
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-namespace kfr
-{
-} // namespace kfr
diff --git a/include/kfr/base/generators.hpp b/include/kfr/base/generators.hpp
@@ -26,107 +26,115 @@
#pragma once
#include "../math/log_exp.hpp"
-#include "../math/select.hpp"
#include "../math/sin_cos.hpp"
+#include "../simd/complex.hpp"
#include "../simd/impl/function.hpp"
+#include "../simd/select.hpp"
#include "../simd/vec.hpp"
+#include "expression.hpp"
+#include "shape.hpp"
namespace kfr
{
+
inline namespace CMT_ARCH_NAME
{
namespace internal
{
+template <typename T>
+constexpr size_t generator_width(size_t divisor)
+{
+ return const_max(1, vector_capacity<deep_subtype<T>> / 8 / divisor);
+}
+} // namespace internal
-template <typename T, size_t width_, typename Class>
-struct generator : input_expression
+template <typename T, size_t VecWidth, typename Class, typename Twork = T>
+struct generator : public expression_traits_defaults
{
- constexpr static size_t width = width_;
- using value_type = T;
+ using value_type = T;
+ constexpr static size_t dims = 1;
+ constexpr static shape<1> get_shape(const Class&) { return infinite_size; }
+ constexpr static shape<1> get_shape() { return infinite_size; }
- constexpr static bool is_incremental = true;
+ constexpr static inline bool random_access = false;
- template <typename U, size_t N>
- friend KFR_INTRINSIC vec<U, N> get_elements(const generator& self, cinput_t, size_t index,
- vec_shape<U, N> t)
- {
- return self.generate(t);
- }
+ constexpr static size_t width = VecWidth;
void resync(T start) const { ptr_cast<Class>(this)->sync(start); }
-protected:
- void call_next() const { ptr_cast<Class>(this)->next(); }
template <size_t N>
- void call_shift(csize_t<N>) const
+ KFR_MEM_INTRINSIC vec<T, N> generate() const
{
- ptr_cast<Class>(this)->shift(csize_t<N>());
+ if constexpr (N < width)
+ {
+ const vec<T, N> result = narrow<N>(call_get_value());
+ const vec<Twork, width> oldvalue = value;
+ call_next();
+ value = slice<N, width>(oldvalue, value);
+ return result;
+ }
+ else if constexpr (N > width)
+ {
+ constexpr size_t Nlow = prev_poweroftwo(N - 1);
+ const vec lo = generate<Nlow>();
+ const vec hi = generate<N - Nlow>();
+ return concat(lo, hi);
+ }
+ else // N == width
+ {
+ const vec<T, N> result = call_get_value();
+ call_next();
+ return result;
+ }
}
+ mutable vec<Twork, width> value;
template <size_t N>
- void shift(csize_t<N>) const
+ friend KFR_INTRINSIC vec<T, N> get_elements(const generator& self, const shape<1>& index,
+ const axis_params<0, N>&)
{
- const vec<T, width> oldvalue = value;
- call_next();
- value = slice<N, width>(oldvalue, value);
+ return self.template generate<N>();
}
- template <size_t N, KFR_ENABLE_IF(N == width)>
- KFR_MEM_INTRINSIC vec<T, N> generate(vec_shape<T, N>) const
- {
- const vec<T, N> result = value;
- call_next();
- return result;
- }
+private:
+ KFR_MEM_INTRINSIC void call_next() const { ptr_cast<Class>(this)->next(); }
- template <size_t N, KFR_ENABLE_IF(N < width)>
- KFR_MEM_INTRINSIC vec<T, N> generate(vec_shape<T, N>) const
- {
- const vec<T, N> result = narrow<N>(value);
- call_shift(csize_t<N>());
- return result;
- }
+ KFR_MEM_INTRINSIC vec<T, width> call_get_value() const { return ptr_cast<Class>(this)->get_value(); }
- template <size_t N, KFR_ENABLE_IF(N > width)>
- KFR_MEM_INTRINSIC vec<T, N> generate(vec_shape<T, N> x) const
+ KFR_MEM_INTRINSIC std::enable_if_t<std::is_same_v<T, Twork>, vec<T, width>> get_value() const
{
- const auto lo = generate(low(x));
- const auto hi = generate(high(x));
- return concat(lo, hi);
+ return value;
}
-
- mutable vec<T, width> value;
};
-template <typename T, size_t width = vector_width<T>* bitness_const(1, 2)>
-struct generator_linear : generator<T, width, generator_linear<T, width>>
+template <typename T, size_t VecWidth = internal::generator_width<T>(1)>
+struct generator_linear : public generator<T, VecWidth, generator_linear<T, VecWidth>>
{
- generator_linear(T start, T step) CMT_NOEXCEPT : step(step), vstep(step* width) { this->resync(start); }
+ generator_linear(T start, T step) CMT_NOEXCEPT : vstep{ step * VecWidth } { sync(start); }
KFR_MEM_INTRINSIC void sync(T start) const CMT_NOEXCEPT
{
- this->value = start + enumerate<T, width>() * step;
+ this->value = start + enumerate(vec_shape<T, VecWidth>{}, vstep / VecWidth);
}
KFR_MEM_INTRINSIC void next() const CMT_NOEXCEPT { this->value += vstep; }
-protected:
- T step;
T vstep;
};
-template <typename T, size_t width = vector_width<T>* bitness_const(1, 2)>
-struct generator_exp : generator<T, width, generator_exp<T, width>>
+template <typename T, size_t VecWidth = internal::generator_width<T>(1)>
+struct generator_exp : public generator<T, VecWidth, generator_exp<T, VecWidth>>
{
- generator_exp(T start, T step) CMT_NOEXCEPT : step(step), vstep(exp(make_vector(step* width))[0] - 1)
+ generator_exp(T start, T step) CMT_NOEXCEPT : step{ step },
+ vstep{ exp(make_vector(step * VecWidth)).front() - 1 }
{
this->resync(start);
}
KFR_MEM_INTRINSIC void sync(T start) const CMT_NOEXCEPT
{
- this->value = exp(start + enumerate<T, width>() * step);
+ this->value = exp(start + enumerate<T, VecWidth>() * step);
}
KFR_MEM_INTRINSIC void next() const CMT_NOEXCEPT { this->value += this->value * vstep; }
@@ -136,14 +144,14 @@ protected:
T vstep;
};
-template <typename T, size_t width = vector_width<T>* bitness_const(1, 2),
- std::enable_if_t<std::is_same<complex<deep_subtype<T>>, T>::value, int> = 0>
-struct generator_expj : generator<T, width, generator_expj<T, width>>
+template <typename T, size_t VecWidth = internal::generator_width<T>(2)>
+struct generator_expj : public generator<T, VecWidth, generator_expj<T, VecWidth>>
{
using ST = deep_subtype<T>;
+ static_assert(std::is_same_v<complex<deep_subtype<T>>, T>, "generator_expj requires complex type");
generator_expj(ST start_, ST step_)
- : step(step_), alpha(2 * sqr(sin(width * step / 2))), beta(-sin(width * step))
+ : step(step_), alpha(2 * sqr(sin(VecWidth * step / 2))), beta(-sin(VecWidth * step))
{
this->resync(T(start_));
}
@@ -156,26 +164,27 @@ struct generator_expj : generator<T, width, generator_expj<T, width>>
}
protected:
- ST const step;
- ST const alpha;
- ST const beta;
- CMT_NOINLINE static vec<T, width> init_cossin(ST w, ST phase)
+ ST step;
+ ST alpha;
+ ST beta;
+ CMT_NOINLINE static vec<T, VecWidth> init_cossin(ST w, ST phase)
{
- return ccomp(cossin(dup(phase + enumerate<ST, width>() * w)));
+ return ccomp(cossin(dup(phase + enumerate<ST, VecWidth>() * w)));
}
};
-template <typename T, size_t width = vector_width<T>* bitness_const(1, 2)>
-struct generator_exp2 : generator<T, width, generator_exp2<T, width>>
+template <typename T, size_t VecWidth = internal::generator_width<T>(1)>
+struct generator_exp2 : public generator<T, VecWidth, generator_exp2<T, VecWidth>>
{
- generator_exp2(T start, T step) CMT_NOEXCEPT : step(step), vstep(exp2(make_vector(step* width))[0] - 1)
+ generator_exp2(T start, T step) CMT_NOEXCEPT : step{ step },
+ vstep{ exp2(make_vector(step * VecWidth))[0] - 1 }
{
this->resync(start);
}
KFR_MEM_INTRINSIC void sync(T start) const CMT_NOEXCEPT
{
- this->value = exp2(start + enumerate<T, width>() * step);
+ this->value = exp2(start + enumerate(vec_shape<T, VecWidth>{}, step));
}
KFR_MEM_INTRINSIC void next() const CMT_NOEXCEPT { this->value += this->value * vstep; }
@@ -185,11 +194,12 @@ protected:
T vstep;
};
-template <typename T, size_t width = vector_width<T>* bitness_const(1, 2)>
-struct generator_cossin : generator<T, width, generator_cossin<T, width>>
+template <typename T, size_t VecWidth = internal::generator_width<T>(1)>
+struct generator_cossin : public generator<T, VecWidth, generator_cossin<T, VecWidth>>
{
+ static_assert(VecWidth % 2 == 0);
generator_cossin(T start, T step)
- : step(step), alpha(2 * sqr(sin(width / 2 * step / 2))), beta(-sin(width / 2 * step))
+ : step(step), alpha(2 * sqr(sin(VecWidth / 2 * step / 2))), beta(-sin(VecWidth / 2 * step))
{
this->resync(start);
}
@@ -204,56 +214,47 @@ protected:
T step;
T alpha;
T beta;
- CMT_NOINLINE static vec<T, width> init_cossin(T w, T phase)
+ CMT_NOINLINE static vec<T, VecWidth> init_cossin(T w, T phase)
{
- return cossin(dup(phase + enumerate<T, width / 2>() * w));
+ return cossin(dup(phase + enumerate(vec_shape<T, VecWidth / 2>{}, w)));
}
};
-template <typename T, size_t width = vector_width<T>* bitness_const(2, 4)>
-struct generator_sin : generator<T, width, generator_sin<T, width>>
+template <typename T, size_t VecWidth = internal::generator_width<T>(2)>
+struct generator_sin : public generator<T, VecWidth, generator_sin<T, VecWidth>, vec<T, 2>>
{
generator_sin(T start, T step)
- : step(step), alpha(2 * sqr(sin(width * step / 2))), beta(sin(width * step))
+ : step(step), alpha(2 * sqr(sin(VecWidth * step / 2))), beta(sin(VecWidth * step))
{
this->resync(start);
}
KFR_MEM_INTRINSIC void sync(T start) const CMT_NOEXCEPT
{
- const vec<T, width* 2> cs = splitpairs(cossin(dup(start + enumerate<T, width>() * step)));
- this->cos_value = low(cs);
- this->value = high(cs);
+ const vec<T, 2 * VecWidth> cs = cossin(dup(start + enumerate(vec_shape<T, VecWidth>{}, step)));
+ this->value = vec<vec<T, 2>, VecWidth>::from_flatten(cs);
}
KFR_MEM_INTRINSIC void next() const CMT_NOEXCEPT
{
- const vec<T, width> c = this->cos_value;
- const vec<T, width> s = this->value;
+ const vec<T, 2 * VecWidth> cs = flatten(this->value);
- const vec<T, width> cc = alpha * c + beta * s;
- const vec<T, width> ss = alpha * s - beta * c;
+ cs = cs - addsub(alpha * cs, beta * swap<2>(cs));
- this->cos_value = c - cc;
- this->value = s - ss;
- }
+ this->value = vec<vec<T, 2>, VecWidth>::from_flatten(cs);
- template <size_t N>
- void shift(csize_t<N>) const CMT_NOEXCEPT
- {
- const vec<T, width> oldvalue = this->value;
- const vec<T, width> oldcosvalue = this->cos_value;
- next();
- this->value = slice<N, width>(oldvalue, this->value);
- this->cos_value = slice<N, width>(oldcosvalue, this->cos_value);
+ // const vec<T, VecWidth> c = even(flatten(this->value));
+ // const vec<T, VecWidth> s = odd(flatten(this->value));
+ // const vec<T, VecWidth> cc = alpha * c + beta * s;
+ // const vec<T, VecWidth> ss = alpha * s - beta * c;
+ // this->cos_value = c - cc;
+ // this->value = s - ss;
}
protected:
T step;
T alpha;
T beta;
- mutable vec<T, width> cos_value;
};
-} // namespace internal
/**
* @brief Returns template expression that generates values starting from the start and using the step as the
@@ -263,10 +264,10 @@ protected:
x_i = start + i \cdot step
\f]
*/
-template <typename T1, typename T2, typename TF = ftype<common_type<T1, T2>>>
-KFR_FUNCTION internal::generator_linear<TF> gen_linear(T1 start, T2 step)
+template <typename T1, typename T2, typename TF = ftype<std::common_type_t<T1, T2>>>
+KFR_FUNCTION generator_linear<TF> gen_linear(T1 start, T2 step)
{
- return internal::generator_linear<TF>(start, step);
+ return generator_linear<TF>(start, step);
}
/**
@@ -275,10 +276,10 @@ KFR_FUNCTION internal::generator_linear<TF> gen_linear(T1 start, T2 step)
x_i = e^{ start + i \cdot step }
\f]
*/
-template <typename T1, typename T2, typename TF = ftype<common_type<T1, T2>>>
-KFR_FUNCTION internal::generator_exp<TF> gen_exp(T1 start, T2 step)
+template <typename T1, typename T2, typename TF = ftype<std::common_type_t<T1, T2>>>
+KFR_FUNCTION generator_exp<TF> gen_exp(T1 start, T2 step)
{
- return internal::generator_exp<TF>(start, step);
+ return generator_exp<TF>(start, step);
}
/**
@@ -287,10 +288,10 @@ KFR_FUNCTION internal::generator_exp<TF> gen_exp(T1 start, T2 step)
x_i = e^{ j ( start + i \cdot step ) }
\f]
*/
-template <typename T1, typename T2, typename TF = complex<ftype<common_type<T1, T2>>>>
-KFR_FUNCTION internal::generator_expj<TF> gen_expj(T1 start, T2 step)
+template <typename T1, typename T2, typename TF = complex<ftype<std::common_type_t<T1, T2>>>>
+KFR_FUNCTION generator_expj<TF> gen_expj(T1 start, T2 step)
{
- return internal::generator_expj<TF>(start, step);
+ return generator_expj<TF>(start, step);
}
/**
@@ -299,10 +300,10 @@ KFR_FUNCTION internal::generator_expj<TF> gen_expj(T1 start, T2 step)
x_i = 2^{ start + i \cdot step }
\f]
*/
-template <typename T1, typename T2, typename TF = ftype<common_type<T1, T2>>>
-KFR_FUNCTION internal::generator_exp2<TF> gen_exp2(T1 start, T2 step)
+template <typename T1, typename T2, typename TF = ftype<std::common_type_t<T1, T2>>>
+KFR_FUNCTION generator_exp2<TF> gen_exp2(T1 start, T2 step)
{
- return internal::generator_exp2<TF>(start, step);
+ return generator_exp2<TF>(start, step);
}
/**
@@ -315,10 +316,10 @@ KFR_FUNCTION internal::generator_exp2<TF> gen_exp2(T1 start, T2 step)
\end{cases}
\f]
*/
-template <typename T1, typename T2, typename TF = ftype<common_type<T1, T2>>>
-KFR_FUNCTION internal::generator_cossin<TF> gen_cossin(T1 start, T2 step)
+template <typename T1, typename T2, typename TF = ftype<std::common_type_t<T1, T2>>>
+KFR_FUNCTION generator_cossin<TF> gen_cossin(T1 start, T2 step)
{
- return internal::generator_cossin<TF>(start, step);
+ return generator_cossin<TF>(start, step);
}
/**
@@ -327,10 +328,10 @@ KFR_FUNCTION internal::generator_cossin<TF> gen_cossin(T1 start, T2 step)
x_i = \sin( start + i \cdot step )
\f]
*/
-template <typename T1, typename T2, typename TF = ftype<common_type<T1, T2>>>
-KFR_FUNCTION internal::generator_sin<TF> gen_sin(T1 start, T2 step)
+template <typename T1, typename T2, typename TF = ftype<std::common_type_t<T1, T2>>>
+KFR_FUNCTION generator_sin<TF> gen_sin(T1 start, T2 step)
{
- return internal::generator_sin<TF>(start, step);
+ return generator_sin<TF>(start, step);
}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/base/handle.hpp b/include/kfr/base/handle.hpp
@@ -0,0 +1,412 @@
+/** @addtogroup base
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../cometa/memory.hpp"
+#include "../simd/vec.hpp"
+#include "basic_expressions.hpp"
+#include <memory>
+
+namespace kfr
+{
+
+template <typename T, index_t Dims>
+struct expression_handle;
+
+template <typename T>
+constexpr size_t maximum_expression_width = vector_width_for<T, cpu_t::highest> * 2;
+
+template <typename T, template <T...> typename Tpl, typename Pack>
+struct expand_cvals;
+
+template <typename T, template <T...> typename Tpl, T... vals>
+struct expand_cvals<T, Tpl, cvals_t<T, vals...>>
+{
+ using type = Tpl<vals...>;
+};
+
+inline namespace CMT_ARCH_NAME
+{
+
+namespace internal
+{
+
+template <typename Expression, typename T, index_t Dims, size_t key = 0>
+KFR_INTRINSIC bool invoke_substitute(Expression& expr, expression_handle<T, Dims> new_handle,
+ csize_t<key> = {});
+}
+} // namespace CMT_ARCH_NAME
+
+template <typename T, index_t Dims>
+struct expression_vtable
+{
+ constexpr static const size_t Nsizes = 1 + ilog2(maximum_expression_width<T>);
+ constexpr static const size_t Nmax = 1 << Nsizes;
+
+ using func_get = void (*)(void*, shape<Dims>, T*);
+ using func_set = void (*)(void*, shape<Dims>, const T*);
+ using func_shapeof = void (*)(void*, shape<Dims>&);
+ using func_substitute = bool (*)(void*, expression_handle<T, Dims>);
+ using func_pass = void (*)(void*, shape<Dims>, shape<Dims>);
+
+ func_shapeof fn_shapeof;
+ func_substitute fn_substitute;
+ func_pass fn_begin_pass;
+ func_pass fn_end_pass;
+ std::array<std::array<func_get, Nsizes>, Dims> fn_get_elements;
+ std::array<std::array<func_set, Nsizes>, Dims> fn_set_elements;
+
+ template <typename Expression>
+ KFR_MEM_INTRINSIC expression_vtable(ctype_t<Expression> t)
+ {
+ fn_shapeof = &static_shapeof<Expression>;
+ fn_substitute = &static_substitute<Expression>;
+ fn_begin_pass = &static_begin_pass<Expression>;
+ fn_end_pass = &static_end_pass<Expression>;
+ cforeach(csizeseq<Nsizes>,
+ [&](auto size_) CMT_INLINE_LAMBDA
+ {
+ cforeach(csizeseq<Dims>,
+ [&](auto axis_) CMT_INLINE_LAMBDA
+ {
+ constexpr size_t size = decltype(size_)::value;
+ constexpr size_t axis = decltype(axis_)::value;
+ fn_get_elements[axis][size] =
+ &static_get_elements<Expression, 1 << size, axis>;
+ fn_set_elements[axis][size] =
+ &static_set_elements<Expression, 1 << size, axis>;
+ });
+ });
+ }
+
+ template <typename Expression, size_t N, index_t VecAxis>
+ static void static_get_elements(void* instance, shape<Dims> index, T* dest)
+ {
+ if constexpr (is_input_expression<Expression>)
+ {
+ write(dest, get_elements(*static_cast<Expression*>(instance), index, axis_params_v<VecAxis, N>));
+ }
+ else
+ {
+ }
+ }
+ template <typename Expression, size_t N, index_t VecAxis>
+ static void static_set_elements(void* instance, shape<Dims> index, const T* src)
+ {
+ if constexpr (is_output_expression<Expression>)
+ {
+ set_elements(*static_cast<Expression*>(instance), index, axis_params_v<VecAxis, N>, read<N>(src));
+ }
+ else
+ {
+ }
+ }
+ template <typename Expression>
+ static void static_shapeof(void* instance, shape<Dims>& result)
+ {
+ result = expression_traits<Expression>::get_shape(*static_cast<Expression*>(instance));
+ }
+ template <typename Expression>
+ static bool static_substitute(void* instance, expression_handle<T, Dims> ptr)
+ {
+ return internal::invoke_substitute(*static_cast<Expression*>(instance), std::move(ptr));
+ }
+ template <typename Expression>
+ static void static_begin_pass(void* instance, shape<Dims> start, shape<Dims> stop)
+ {
+ begin_pass(*static_cast<Expression*>(instance), start, stop);
+ }
+ template <typename Expression>
+ static void static_end_pass(void* instance, shape<Dims> start, shape<Dims> stop)
+ {
+ end_pass(*static_cast<Expression*>(instance), start, stop);
+ }
+};
+
+struct expression_resource
+{
+ virtual ~expression_resource() {}
+ virtual void* instance() { return nullptr; }
+};
+
+template <typename E>
+struct expression_resource_impl : expression_resource
+{
+ expression_resource_impl(E&& e) CMT_NOEXCEPT : e(std::move(e)) {}
+ virtual ~expression_resource_impl() {}
+ KFR_INTRINSIC virtual void* instance() override final { return &e; }
+
+public:
+#ifdef __cpp_aligned_new
+ static void operator delete(void* p, std::align_val_t al) noexcept { details::aligned_release(p); }
+#endif
+
+private:
+ E e;
+};
+
+template <typename E>
+KFR_INTRINSIC std::shared_ptr<expression_resource> make_resource(E&& e)
+{
+ using T = expression_resource_impl<std::decay_t<E>>;
+ return std::static_pointer_cast<expression_resource>(std::shared_ptr<T>(
+ new (aligned_allocate<T>()) T(std::move(e)), [](T* pi) { aligned_deallocate<T>(pi); }));
+}
+
+template <typename T, index_t Dims = 1>
+struct expression_handle
+{
+ void* instance;
+ const expression_vtable<T, Dims>* vtable;
+ std::shared_ptr<expression_resource> resource;
+
+ expression_handle() CMT_NOEXCEPT : instance(nullptr), vtable(nullptr) {}
+ expression_handle(const void* instance, const expression_vtable<T, Dims>* vtable,
+ std::shared_ptr<expression_resource> resource = nullptr)
+ : instance(const_cast<void*>(instance)), vtable(vtable), resource(std::move(resource))
+ {
+ }
+
+ explicit operator bool() const { return instance != nullptr; }
+
+ bool substitute(expression_handle<T, Dims> new_handle)
+ {
+ return vtable->fn_substitute(instance, std::move(new_handle));
+ }
+};
+
+template <typename T, index_t Dims>
+struct expression_traits<expression_handle<T, Dims>> : expression_traits_defaults
+{
+ using value_type = T;
+ constexpr static size_t dims = Dims;
+ constexpr static shape<dims> get_shape(const expression_handle<T, Dims>& self)
+ {
+ shape<dims> result;
+ self.vtable->fn_shapeof(self.instance, result);
+ return result;
+ }
+ constexpr static shape<dims> get_shape() { return shape<dims>(undefined_size); }
+
+ constexpr static inline bool random_access = false;
+};
+
+inline namespace CMT_ARCH_NAME
+{
+
+template <typename T, index_t NDims>
+KFR_INTRINSIC void begin_pass(const expression_handle<T, NDims>& self, shape<NDims> start, shape<NDims> stop)
+{
+ self.vtable->fn_begin_pass(self.instance, start, stop);
+}
+template <typename T, index_t NDims>
+KFR_INTRINSIC void end_pass(const expression_handle<T, NDims>& self, shape<NDims> start, shape<NDims> stop)
+{
+ self.vtable->fn_end_pass(self.instance, start, stop);
+}
+
+template <typename T, index_t NDims, index_t Axis, size_t N>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_handle<T, NDims>& self, const shape<NDims>& index,
+ const axis_params<Axis, N>& sh)
+{
+ static_assert(is_poweroftwo(N) && N >= 1);
+ constexpr size_t Nsize = ilog2(N);
+ if constexpr (Nsize >= expression_vtable<T, NDims>::Nsizes)
+ {
+ constexpr size_t Nhalf = N / 2;
+ auto low = get_elements(self, index, axis_params_v<Axis, Nhalf>);
+ auto high = get_elements(self, index.add_at(Nhalf, cval<index_t, Axis>), axis_params_v<Axis, Nhalf>);
+ return concat(low, high);
+ }
+ else
+ {
+ portable_vec<T, N> result;
+ self.vtable->fn_get_elements[Axis][Nsize](self.instance, index, result.elem);
+ return result;
+ }
+}
+
+template <typename T, index_t NDims, index_t Axis, size_t N>
+KFR_INTRINSIC void set_elements(const expression_handle<T, NDims>& self, const shape<NDims>& index,
+ const axis_params<Axis, N>& sh, const identity<vec<T, N>>& value)
+{
+ static_assert(is_poweroftwo(N) && N >= 1);
+ constexpr size_t Nsize = ilog2(N);
+ if constexpr (Nsize >= expression_vtable<T, NDims>::Nsizes)
+ {
+ constexpr size_t Nhalf = N / 2;
+ set_elements(self, index, axis_params_v<Axis, Nhalf>, slice<0, Nhalf>(value));
+ set_elements(self, index.add_at(Nhalf, cval<index_t, Axis>), axis_params_v<Axis, Nhalf>,
+ slice<Nhalf, Nhalf>(value));
+ }
+ else
+ {
+ self.vtable->fn_set_elements[Axis][Nsize](self.instance, index, &value.front());
+ }
+}
+} // namespace CMT_ARCH_NAME
+
+inline namespace CMT_ARCH_NAME
+{
+
+namespace internal
+{
+
+template <typename T, index_t Dims, typename E>
+KFR_INTRINSIC expression_vtable<T, Dims>* make_expression_vtable()
+{
+ static expression_vtable<T, Dims> vtable{ ctype_t<std::decay_t<E>>{} };
+ return &vtable;
+}
+} // namespace internal
+
+} // namespace CMT_ARCH_NAME
+
+/** @brief Converts the given expression into an opaque object.
+ * This overload takes reference to the expression.
+ * @warning Use with caution with local variables.
+ */
+template <typename E, typename T = expression_value_type<E>, index_t Dims = expression_dims<E>>
+KFR_INTRINSIC expression_handle<T, Dims> to_handle(E& expr)
+{
+ return expression_handle<T>(std::addressof(expr), internal::make_expression_vtable<T, Dims, E>());
+}
+
+/** @brief Converts the given expression into an opaque object.
+ * This overload takes ownership of the expression (Move semantics).
+ * @note Use std::move to force use of this overload.
+ */
+template <typename E, typename T = expression_value_type<E>, index_t Dims = expression_dims<E>>
+KFR_INTRINSIC expression_handle<T, Dims> to_handle(E&& expr)
+{
+ std::shared_ptr<expression_resource> ptr = make_resource(std::move(expr));
+ void* instance = ptr->instance();
+ return expression_handle<T, Dims>(instance, internal::make_expression_vtable<T, Dims, E>(),
+ std::move(ptr));
+}
+
+template <typename T, index_t Dims = 1, size_t Key = 0>
+struct expression_placeholder
+{
+public:
+ using value_type = T;
+ expression_placeholder() CMT_NOEXCEPT = default;
+ expression_handle<T, Dims> handle;
+};
+
+template <typename T, index_t Dims, size_t Key>
+struct expression_traits<expression_placeholder<T, Dims, Key>> : public expression_traits_defaults
+{
+ using value_type = T;
+ constexpr static size_t dims = Dims;
+ constexpr static shape<dims> get_shape(const expression_placeholder<T, Dims, Key>& self)
+ {
+ return self.handle ? ::kfr::get_shape(self.handle) : shape<dims>(infinite_size);
+ }
+ constexpr static shape<dims> get_shape() { return shape<dims>(undefined_size); }
+};
+
+inline namespace CMT_ARCH_NAME
+{
+
+template <typename T, index_t Dims, size_t Key, index_t VecAxis, size_t N>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_placeholder<T, Dims, Key>& self, shape<Dims> index,
+ axis_params<VecAxis, N> sh)
+{
+ return self.handle ? get_elements(self.handle, index, sh) : 0;
+}
+} // namespace CMT_ARCH_NAME
+
+template <typename T, index_t Dims = 1, size_t Key = 0>
+KFR_INTRINSIC expression_placeholder<T, Dims, Key> placeholder(csize_t<Key> = csize_t<Key>{})
+{
+ return expression_placeholder<T, Dims, Key>();
+}
+
+template <typename... Args>
+KFR_INTRINSIC bool substitute(const internal_generic::anything&, Args&&...)
+{
+ return false;
+}
+
+inline namespace CMT_ARCH_NAME
+{
+namespace internal
+{
+template <typename... Args, typename T, index_t Dims, size_t Key, size_t... indices>
+KFR_INTRINSIC bool substitute_helper(expression_with_arguments<Args...>& expr,
+ expression_handle<T, Dims> new_handle, csize_t<Key>,
+ csizes_t<indices...>);
+}
+} // namespace CMT_ARCH_NAME
+
+template <typename T, index_t Dims, size_t Key = 0>
+KFR_INTRINSIC bool substitute(expression_placeholder<T, Dims, Key>& expr,
+ expression_handle<T, Dims> new_handle, csize_t<Key> = csize_t<Key>{})
+{
+ expr.handle = std::move(new_handle);
+ return true;
+}
+
+template <typename... Args, typename T, index_t Dims, size_t Key = 0>
+KFR_INTRINSIC bool substitute(expression_with_arguments<Args...>& expr, expression_handle<T, Dims> new_handle,
+ csize_t<Key> = csize_t<Key>{})
+{
+ return internal::substitute_helper(expr, std::move(new_handle), csize_t<Key>{}, indicesfor_t<Args...>{});
+}
+
+template <typename T, index_t Dims, size_t Key = 0>
+KFR_INTRINSIC bool substitute(expression_handle<T, Dims>& expr, expression_handle<T, Dims> new_handle,
+ csize_t<Key> = csize_t<Key>{})
+{
+ static_assert(Key == 0, "expression_handle supports only Key = 0");
+ return expr.substitute(std::move(new_handle));
+}
+
+inline namespace CMT_ARCH_NAME
+{
+namespace internal
+{
+
+template <typename... Args, typename T, index_t Dims, size_t Key, size_t... indices>
+KFR_INTRINSIC bool substitute_helper(expression_with_arguments<Args...>& expr,
+ expression_handle<T, Dims> new_handle, csize_t<Key>,
+ csizes_t<indices...>)
+{
+ return (substitute(std::get<indices>(expr.args), std::move(new_handle), csize_t<Key>()) || ...);
+}
+
+template <typename Expression, typename T, index_t Dims, size_t Key>
+KFR_INTRINSIC bool invoke_substitute(Expression& expr, expression_handle<T, Dims> new_handle, csize_t<Key>)
+{
+ return kfr::substitute(expr, std::move(new_handle), csize_t<Key>{});
+}
+
+} // namespace internal
+
+} // namespace CMT_ARCH_NAME
+
+} // namespace kfr
diff --git a/include/kfr/base/impl/static_array.hpp b/include/kfr/base/impl/static_array.hpp
@@ -0,0 +1,230 @@
+/** @addtogroup expressions
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../../cometa.hpp"
+#include "../../kfr.h"
+
+namespace kfr
+{
+using namespace cometa;
+
+template <typename T, size_t>
+using type_for = T;
+
+template <typename T, typename indices_t>
+struct static_array_base;
+
+template <typename T, size_t Size>
+using static_array_of_size = static_array_base<T, csizeseq_t<Size>>;
+
+template <typename T, size_t... indices>
+struct static_array_base<T, csizes_t<indices...>>
+{
+ using value_type = T;
+ using size_type = size_t;
+ using difference_type = ptrdiff_t;
+ using reference = value_type&;
+ using pointer = value_type*;
+ using iterator = pointer;
+ using const_reference = const value_type&;
+ using const_pointer = const value_type*;
+ using const_iterator = const_pointer;
+
+ constexpr static size_t static_size = sizeof...(indices);
+
+ constexpr static_array_base() noexcept : array{ (static_cast<void>(indices), 0)... } {}
+ constexpr static_array_base(const static_array_base&) noexcept = default;
+ constexpr static_array_base(static_array_base&&) noexcept = default;
+
+ KFR_MEM_INTRINSIC constexpr static_array_base(type_for<value_type, indices>... args) noexcept
+ : array{ args... }
+ {
+ }
+
+ template <typename U, typename otherindices_t>
+ friend struct static_array_base;
+
+ template <size_t... idx1, size_t... idx2>
+ KFR_MEM_INTRINSIC constexpr static_array_base(
+ const static_array_base<T, csizes_t<idx1...>>& first,
+ const static_array_base<T, csizes_t<idx2...>>& second) noexcept
+ : array{ (indices >= sizeof...(idx1) ? second.array[indices - sizeof...(idx1)]
+ : first.array[indices])... }
+ {
+ static_assert(sizeof...(idx1) + sizeof...(idx2) == static_size);
+ }
+
+ template <size_t... idx>
+ constexpr static_array_base<T, csizeseq_t<sizeof...(idx)>> shuffle(csizes_t<idx...>) const noexcept
+ {
+ return static_array_base<T, csizeseq_t<sizeof...(idx)>>{ array[idx]... };
+ }
+ template <size_t... idx>
+ constexpr static_array_base<T, csizeseq_t<sizeof...(idx)>> shuffle(csizes_t<idx...>,
+ T filler) const noexcept
+ {
+ return static_array_base<T, csizeseq_t<sizeof...(idx)>>{ (idx >= static_size ? filler
+ : array[idx])... };
+ }
+
+ template <size_t start, size_t size>
+ constexpr static_array_base<T, csizeseq_t<size>> slice() const noexcept
+ {
+ return shuffle(csizeseq<size, start>);
+ }
+
+ constexpr static_array_base& operator=(const static_array_base&) = default;
+ constexpr static_array_base& operator=(static_array_base&&) = default;
+
+ template <int dummy = 0, CMT_ENABLE_IF(dummy == 0 && static_size > 1)>
+ KFR_MEM_INTRINSIC constexpr explicit static_array_base(value_type value) noexcept
+ : array{ (static_cast<void>(indices), value)... }
+ {
+ }
+
+ KFR_MEM_INTRINSIC constexpr const value_type* data() const noexcept { return std::data(array); }
+ KFR_MEM_INTRINSIC constexpr value_type* data() noexcept { return std::data(array); }
+
+ KFR_MEM_INTRINSIC constexpr const_iterator begin() const noexcept { return std::begin(array); }
+ KFR_MEM_INTRINSIC constexpr iterator begin() noexcept { return std::begin(array); }
+ KFR_MEM_INTRINSIC constexpr const_iterator cbegin() const noexcept { return std::begin(array); }
+
+ KFR_MEM_INTRINSIC constexpr const_iterator end() const noexcept { return std::end(array); }
+ KFR_MEM_INTRINSIC constexpr iterator end() noexcept { return std::end(array); }
+ KFR_MEM_INTRINSIC constexpr const_iterator cend() const noexcept { return std::end(array); }
+
+ KFR_MEM_INTRINSIC constexpr const_reference operator[](size_t index) const noexcept
+ {
+ return array[index];
+ }
+ KFR_MEM_INTRINSIC constexpr reference operator[](size_t index) noexcept { return array[index]; }
+
+ KFR_MEM_INTRINSIC constexpr const_reference front() const noexcept { return array[0]; }
+ KFR_MEM_INTRINSIC constexpr reference front() noexcept { return array[0]; }
+
+ KFR_MEM_INTRINSIC constexpr const_reference back() const noexcept { return array[static_size - 1]; }
+ KFR_MEM_INTRINSIC constexpr reference back() noexcept { return array[static_size - 1]; }
+
+ KFR_MEM_INTRINSIC constexpr bool empty() const noexcept { return false; }
+
+ KFR_MEM_INTRINSIC constexpr size_t size() const noexcept { return std::size(array); }
+
+ KFR_MEM_INTRINSIC constexpr bool operator==(const static_array_base& other) const noexcept
+ {
+ return ((array[indices] == other.array[indices]) && ...);
+ }
+ KFR_MEM_INTRINSIC constexpr bool operator!=(const static_array_base& other) const noexcept
+ {
+ return !operator==(other);
+ }
+ constexpr T minof() const noexcept
+ {
+ T result = std::numeric_limits<T>::max();
+ (static_cast<void>(result = std::min(result, array[indices])), ...);
+ return result;
+ }
+ constexpr T maxof() const noexcept
+ {
+ T result = std::numeric_limits<T>::lowest();
+ (static_cast<void>(result = std::max(result, array[indices])), ...);
+ return result;
+ }
+ constexpr T sum() const noexcept
+ {
+ T result = 0;
+ (static_cast<void>(result += array[indices]), ...);
+ return result;
+ }
+ constexpr T product() const noexcept
+ {
+ T result = 1;
+ (static_cast<void>(result *= array[indices]), ...);
+ return result;
+ }
+
+ constexpr static_array_base min(const static_array_base& y) const noexcept
+ {
+ return static_array_base{ std::min(array[indices], y.array[indices])... };
+ }
+ constexpr static_array_base max(const static_array_base& y) const noexcept
+ {
+ return static_array_base{ std::max(array[indices], y.array[indices])... };
+ }
+ template <typename Fn>
+ constexpr static_array_base bin(const static_array_base& y, Fn&& fn) const noexcept
+ {
+ return static_array_base{ fn(array[indices], y.array[indices])... };
+ }
+ template <typename Fn>
+ constexpr static_array_base un(Fn&& fn) const noexcept
+ {
+ return static_array_base{ fn(array[indices])... };
+ }
+ template <typename U>
+ constexpr static_array_base<U, csizes_t<indices...>> cast() const noexcept
+ {
+ return static_array_base<U, csizes_t<indices...>>{ static_cast<U>(array[indices])... };
+ }
+
+ constexpr static_array_base operator+(const static_array_base& y) const noexcept
+ {
+ return static_array_base{ (array[indices] + y.array[indices])... };
+ }
+ constexpr static_array_base operator-(const static_array_base& y) const noexcept
+ {
+ return static_array_base{ (array[indices] - y.array[indices])... };
+ }
+ constexpr static_array_base operator*(const static_array_base& y) const noexcept
+ {
+ return static_array_base{ (array[indices] * y.array[indices])... };
+ }
+ constexpr static_array_base operator&(const static_array_base& y) const noexcept
+ {
+ return static_array_base{ (array[indices] & y.array[indices])... };
+ }
+ constexpr static_array_base operator|(const static_array_base& y) const noexcept
+ {
+ return static_array_base{ (array[indices] | y.array[indices])... };
+ }
+ constexpr static_array_base operator^(const static_array_base& y) const noexcept
+ {
+ return static_array_base{ (array[indices] ^ y.array[indices])... };
+ }
+ constexpr static_array_base operator+(const T& y) const noexcept
+ {
+ return static_array_base{ (array[indices] + y)... };
+ }
+ constexpr static_array_base operator-(const T& y) const noexcept
+ {
+ return static_array_base{ (array[indices] - y)... };
+ }
+ constexpr T dot(const static_array_base& y) const noexcept { return (operator*(y)).sum(); }
+
+private:
+ T array[static_size];
+};
+} // namespace kfr
diff --git a/include/kfr/base/math_expressions.hpp b/include/kfr/base/math_expressions.hpp
@@ -0,0 +1,516 @@
+/** @addtogroup base
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../math.hpp"
+#include "basic_expressions.hpp"
+#include "expression.hpp"
+
+namespace kfr
+{
+
+/**
+ * @brief Returns the trigonometric sine of x. Accepts and returns expressions.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::sin, E1> sin(E1&& x)
+{
+ return { fn::sin(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns the trigonometric cosine of x. Accepts and returns expressions.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::cos, E1> cos(E1&& x)
+{
+ return { fn::cos(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns an approximation of the trigonometric sine of x. Accepts and returns expressions.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::fastsin, E1> fastsin(E1&& x)
+{
+ return { fn::fastsin(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns an approximation of the trigonometric cosine of x. Accepts and returns expressions.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::fastcos, E1> fastcos(E1&& x)
+{
+ return { fn::fastcos(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns the trigonometric sine of the even elements of the x and
+ * cosine of the odd elements. x must be a vector. Accepts and returns expressions.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::sincos, E1> sincos(E1&& x)
+{
+ return { fn::sincos(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns the trigonometric cosine of the even elements of the x and
+ * sine of the odd elements. x must be a vector. Accepts and returns expressions.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::cossin, E1> cossin(E1&& x)
+{
+ return { fn::cossin(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns the trigonometric sine of the x (expressed in degrees). Accepts and returns expressions.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::sindeg, E1> sindeg(E1&& x)
+{
+ return { fn::sindeg(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns the trigonometric cosine of the x (expressed in degrees). Accepts and returns expressions.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::cosdeg, E1> cosdeg(E1&& x)
+{
+ return { fn::cosdeg(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns an approximation of the trigonometric sine of the x
+ * (expressed in degrees). Accepts and returns expressions.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::fastsindeg, E1> fastsindeg(E1&& x)
+{
+ return { fn::fastsindeg(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns an approximation of the trigonometric cosine of the x
+ * (expressed in degrees). Accepts and returns expressions.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::fastcosdeg, E1> fastcosdeg(E1&& x)
+{
+ return { fn::fastcosdeg(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns the trigonometric sine of the even elements of the x and
+ * cosine of the odd elements. x must be expressed in degrees. Accepts and returns expressions.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::sincosdeg, E1> sincosdeg(E1&& x)
+{
+ return { fn::sincosdeg(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns the trigonometric cosine of the even elements of the x and
+ * sine of the odd elements. x must be expressed in degrees. Accepts and returns expressions.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::cossindeg, E1> cossindeg(E1&& x)
+{
+ return { fn::cossindeg(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns the sinc function of x. Accepts and returns expressions.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::sinc, E1> sinc(E1&& x)
+{
+ return { fn::sinc(), std::forward<E1>(x) };
+}
+
+/// @brief Creates expression that returns the approximate gamma function of an argument
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::gamma, E1> gamma(E1&& x)
+{
+ return { fn::gamma(), std::forward<E1>(x) };
+}
+
+/// @brief Creates expression that returns the approximate factorial of an argument
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::factorial_approx, E1> factorial_approx(E1&& x)
+{
+ return { fn::factorial_approx(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns template expression that returns the positive square root of the x. \f$\sqrt{x}\f$
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::sqrt, E1> sqrt(E1&& x)
+{
+ return { fn::sqrt(), std::forward<E1>(x) };
+}
+
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::tan, E1> tan(E1&& x)
+{
+ return { fn::tan(), std::forward<E1>(x) };
+}
+
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::tandeg, E1> tandeg(E1&& x)
+{
+ return { fn::tandeg(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns template expression that returns the arc sine of x.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_INTRINSIC expression_function<fn::asin, E1> asin(E1&& x)
+{
+ return { fn::asin(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns template expression that returns the arc cosine of x.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_INTRINSIC expression_function<fn::acos, E1> acos(E1&& x)
+{
+ return { fn::acos(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the sine of the the complex value x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::csin, E1> csin(E1&& x)
+{
+ return { fn::csin(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the hyperbolic sine of the complex number x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::csinh, E1> csinh(E1&& x)
+{
+ return { fn::csinh(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the cosine of the the complex value x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::ccos, E1> ccos(E1&& x)
+{
+ return { fn::ccos(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the hyperbolic cosine of the the complex value x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::ccosh, E1> ccosh(E1&& x)
+{
+ return { fn::ccosh(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the squared absolute value (magnitude squared) of the
+/// complex number x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::cabssqr, E1> cabssqr(E1&& x)
+{
+ return { fn::cabssqr(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the absolute value (magnitude) of the complex number x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::cabs, E1> cabs(E1&& x)
+{
+ return { fn::cabs(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the phase angle (argument) of the complex number x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::carg, E1> carg(E1&& x)
+{
+ return { fn::carg(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the natural logarithm of the complex number x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::clog, E1> clog(E1&& x)
+{
+ return { fn::clog(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the binary (base-2) logarithm of the complex number x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::clog2, E1> clog2(E1&& x)
+{
+ return { fn::clog2(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the common (base-10) logarithm of the complex number x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::clog10, E1> clog10(E1&& x)
+{
+ return { fn::clog10(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns \f$e\f$ raised to the complex number x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::cexp, E1> cexp(E1&& x)
+{
+ return { fn::cexp(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns 2 raised to the complex number x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::cexp2, E1> cexp2(E1&& x)
+{
+ return { fn::cexp2(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns 10 raised to the complex number x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::cexp10, E1> cexp10(E1&& x)
+{
+ return { fn::cexp10(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that converts complex number to polar
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::polar, E1> polar(E1&& x)
+{
+ return { fn::polar(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that converts complex number to cartesian
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::cartesian, E1> cartesian(E1&& x)
+{
+ return { fn::cartesian(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns square root of the complex number x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::csqrt, E1> csqrt(E1&& x)
+{
+ return { fn::csqrt(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns square of the complex number x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::csqr, E1> csqr(E1&& x)
+{
+ return { fn::csqr(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns template expression that returns the arc tangent of x.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::atan, E1> atan(E1&& x)
+{
+ return { fn::atan(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns template expression that returns the arc tangent of the x, expressed in degrees.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::atandeg, E1> atandeg(E1&& x)
+{
+ return { fn::atandeg(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns template expression that returns the arc tangent of y/x.
+ */
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_FUNCTION expression_function<fn::atan2, E1, E2> atan2(E1&& x, E2&& y)
+{
+ return { fn::atan2(), std::forward<E1>(x), std::forward<E2>(y) };
+}
+
+/**
+ * @brief Returns template expression that returns the arc tangent of y/x (expressed in degrees).
+ */
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_FUNCTION expression_function<fn::atan2deg, E1, E2> atan2deg(E1&& x, E2&& y)
+{
+ return { fn::atan2deg(), std::forward<E1>(x), std::forward<E2>(y) };
+}
+
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::modzerobessel, E1> modzerobessel(E1&& x)
+{
+ return { fn::modzerobessel(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the hyperbolic sine of the x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::sinh, E1> sinh(E1&& x)
+{
+ return { fn::sinh(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the hyperbolic cosine of the x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::cosh, E1> cosh(E1&& x)
+{
+ return { fn::cosh(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the hyperbolic tangent of the x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::tanh, E1> tanh(E1&& x)
+{
+ return { fn::tanh(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the hyperbolic cotangent of the x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::coth, E1> coth(E1&& x)
+{
+ return { fn::coth(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the hyperbolic sine of the even elements of the x and the
+/// hyperbolic cosine of the odd elements of the x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::sinhcosh, E1> sinhcosh(E1&& x)
+{
+ return { fn::sinhcosh(), std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the hyperbolic cosine of the even elements of the x and
+/// the hyperbolic sine of the odd elements of the x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::coshsinh, E1> coshsinh(E1&& x)
+{
+ return { fn::coshsinh(), std::forward<E1>(x) };
+}
+
+/// @brief Returns e raised to the given power x. Accepts and returns expressions.
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::exp, E1> exp(E1&& x)
+{
+ return { fn::exp(), std::forward<E1>(x) };
+}
+
+/// @brief Returns 2 raised to the given power x. Accepts and returns expressions.
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::exp2, E1> exp2(E1&& x)
+{
+ return { fn::exp2(), std::forward<E1>(x) };
+}
+
+/// @brief Returns 10 raised to the given power x. Accepts and returns expressions.
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::exp10, E1> exp10(E1&& x)
+{
+ return { fn::exp10(), std::forward<E1>(x) };
+}
+
+/// @brief Returns the natural logarithm of the x. Accepts and returns expressions.
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::log, E1> log(E1&& x)
+{
+ return { fn::log(), std::forward<E1>(x) };
+}
+
+/// @brief Returns the binary (base-2) logarithm of the x. Accepts and returns expressions.
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::log2, E1> log2(E1&& x)
+{
+ return { fn::log2(), std::forward<E1>(x) };
+}
+
+/// @brief Returns the common (base-10) logarithm of the x. Accepts and returns expressions.
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::log10, E1> log10(E1&& x)
+{
+ return { fn::log10(), std::forward<E1>(x) };
+}
+
+/// @brief Returns the rounded binary (base-2) logarithm of the x. Version that accepts and returns
+/// expressions.
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::logb, E1> logb(E1&& x)
+{
+ return { fn::logb(), std::forward<E1>(x) };
+}
+
+/// @brief Returns the logarithm of the x with base y. Accepts and returns expressions.
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_FUNCTION expression_function<fn::logn, E1, E2> logn(E1&& x, E2&& y)
+{
+ return { fn::logn(), std::forward<E1>(x), std::forward<E2>(y) };
+}
+
+/// @brief Returns log(x) * y. Accepts and returns expressions.
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_FUNCTION expression_function<fn::logm, E1, E2> logm(E1&& x, E2&& y)
+{
+ return { fn::logm(), std::forward<E1>(x), std::forward<E2>(y) };
+}
+
+/// @brief Returns exp(x * m + a). Accepts and returns expressions.
+template <typename E1, typename E2, typename E3, KFR_ACCEPT_EXPRESSIONS(E1, E2, E3)>
+KFR_FUNCTION expression_function<fn::exp_fmadd, E1, E2, E3> exp_fmadd(E1&& x, E2&& y, E3&& z)
+{
+ return { fn::exp_fmadd(), std::forward<E1>(x), std::forward<E2>(y), std::forward<E3>(z) };
+}
+
+/// @brief Returns log(x) * m + a. Accepts and returns expressions.
+template <typename E1, typename E2, typename E3, KFR_ACCEPT_EXPRESSIONS(E1, E2, E3)>
+KFR_FUNCTION expression_function<fn::log_fmadd, E1, E2, E3> log_fmadd(E1&& x, E2&& y, E3&& z)
+{
+ return { fn::log_fmadd(), std::forward<E1>(x), std::forward<E2>(y), std::forward<E3>(z) };
+}
+
+/// @brief Returns the x raised to the given power y. Accepts and returns expressions.
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_FUNCTION expression_function<fn::pow, E1, E2> pow(E1&& x, E2&& y)
+{
+ return { fn::pow(), std::forward<E1>(x), std::forward<E2>(y) };
+}
+
+/// @brief Returns the real nth root of the x. Accepts and returns expressions.
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_FUNCTION expression_function<fn::root, E1, E2> root(E1&& x, E2&& y)
+{
+ return { fn::root(), std::forward<E1>(x), std::forward<E2>(y) };
+}
+
+/// @brief Returns the cube root of the x. Accepts and returns expressions.
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::cbrt, E1> cbrt(E1&& x)
+{
+ return { fn::cbrt(), std::forward<E1>(x) };
+}
+
+} // namespace kfr
diff --git a/include/kfr/base/memory.hpp b/include/kfr/base/memory.hpp
@@ -1,4 +1,4 @@
-/** @addtogroup memory
+/** @addtogroup base
* @{
*/
/*
diff --git a/include/kfr/base/pointer.hpp b/include/kfr/base/pointer.hpp
@@ -1,310 +0,0 @@
-/** @addtogroup expressions
- * @{
- */
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "../simd/vec.hpp"
-#include "basic_expressions.hpp"
-#include <memory>
-
-namespace kfr
-{
-
-template <typename T, bool enable_resource = true>
-struct expression_pointer;
-
-template <typename T>
-constexpr size_t maximum_expression_width = vector_width_for<T, cpu_t::highest> * 2;
-
-inline namespace CMT_ARCH_NAME
-{
-
-namespace internal
-{
-
-template <typename Expression, typename T, size_t key = 0>
-KFR_INTRINSIC bool invoke_substitute(Expression& expr, expression_pointer<T>&& new_pointer,
- csize_t<key> = {});
-}
-} // namespace CMT_ARCH_NAME
-
-template <typename T, size_t N = maximum_expression_width<T>>
-struct expression_vtable : expression_vtable<T, N / 2>
-{
- using func_get = void (*)(void*, size_t, vec<T, N>&);
- func_get get;
-
- template <typename Expression>
- expression_vtable(ctype_t<Expression> t)
- : expression_vtable<T, N / 2>(t), get(&expression_vtable<T, N>::template static_get<Expression>)
- {
- }
-
- template <typename Expression>
- static void static_get(void* instance, size_t index, vec<T, N>& result)
- {
- result = get_elements(*static_cast<Expression*>(instance), cinput, index, vec_shape<T, N>());
- }
-};
-
-template <typename T>
-struct expression_vtable<T, 0>
-{
- using func_size = size_t (*)(void* p);
- using func_begin_block = void (*)(void*, size_t);
- using func_end_block = void (*)(void*, size_t);
- using func_substitute = bool (*)(void*, expression_pointer<T>&&);
-
- func_size size;
- func_begin_block begin_block;
- func_end_block end_block;
- func_substitute substitute;
-
- template <typename Expression>
- expression_vtable(ctype_t<Expression>)
- : size(&expression_vtable<T, 0>::template static_size<Expression>),
- begin_block(&expression_vtable<T, 0>::template static_begin_block<Expression>),
- end_block(&expression_vtable<T, 0>::template static_end_block<Expression>),
- substitute(&expression_vtable<T, 0>::template static_substitute<Expression>)
- {
- }
-
- template <typename Expression>
- static size_t static_size(void* instance)
- {
- return static_cast<Expression*>(instance)->size();
- }
- template <typename Expression>
- static void static_begin_block(void* instance, size_t size)
- {
- return static_cast<Expression*>(instance)->begin_block(cinput, size);
- }
- template <typename Expression>
- static void static_end_block(void* instance, size_t size)
- {
- return static_cast<Expression*>(instance)->end_block(cinput, size);
- }
- template <typename Expression>
- static bool static_substitute(void* instance, expression_pointer<T>&& ptr)
- {
- return internal::invoke_substitute(*static_cast<Expression*>(instance), std::move(ptr));
- }
-};
-
-struct expression_resource
-{
- virtual ~expression_resource() {}
- virtual void* instance() { return nullptr; }
-};
-
-template <typename E>
-struct expression_resource_impl : expression_resource
-{
- expression_resource_impl(E&& e) CMT_NOEXCEPT : e(std::move(e)) {}
- virtual ~expression_resource_impl() {}
- virtual void* instance() override final { return &e; }
-
-public:
-#ifdef __cpp_aligned_new
- static void operator delete(void* p, std::align_val_t al) noexcept { details::aligned_release(p); }
-#endif
-
-private:
- E e;
-};
-
-template <typename E>
-KFR_INTRINSIC std::shared_ptr<expression_resource> make_resource(E&& e)
-{
- using T = expression_resource_impl<decay<E>>;
- return std::static_pointer_cast<expression_resource>(std::shared_ptr<T>(
- new (aligned_allocate<T>()) T(std::move(e)), [](T* pi) { aligned_deallocate<T>(pi); }));
-}
-
-template <typename T, bool enable_resource>
-struct expression_pointer : input_expression
-{
- using value_type = T;
-
- expression_pointer() CMT_NOEXCEPT : instance(nullptr), vtable(nullptr) {}
- expression_pointer(const void* instance, const expression_vtable<T>* vtable,
- std::shared_ptr<expression_resource> resource = nullptr)
- : instance(const_cast<void*>(instance)), vtable(vtable), resource(std::move(resource))
- {
- }
- template <size_t N, KFR_ENABLE_IF(N <= maximum_expression_width<T>)>
- friend KFR_INTRINSIC vec<T, N> get_elements(const expression_pointer& self, cinput_t, size_t index,
- vec_shape<T, N>)
- {
- static_assert(is_poweroftwo(N), "N must be a power of two");
- vec<T, N> result;
- static_cast<const expression_vtable<T, N>*>(self.vtable)->get(self.instance, index, result);
- return result;
- }
- template <size_t N, KFR_ENABLE_IF(N > maximum_expression_width<T>)>
- friend KFR_INTRINSIC vec<T, N> get_elements(const expression_pointer& self, cinput_t cinput, size_t index,
- vec_shape<T, N>)
- {
- static_assert(is_poweroftwo(N), "N must be a power of two");
- const vec<T, N / 2> r1 = get_elements(self, cinput, index, vec_shape<T, N / 2>());
- const vec<T, N / 2> r2 = get_elements(self, cinput, index + N / 2, vec_shape<T, N / 2>());
- return concat(r1, r2);
- }
- KFR_MEM_INTRINSIC void begin_block(cinput_t, size_t size) const { vtable->begin_block(instance, size); }
- KFR_MEM_INTRINSIC void end_block(cinput_t, size_t size) const { vtable->end_block(instance, size); }
- KFR_MEM_INTRINSIC size_t size() const { return vtable->size(instance); }
-
- KFR_MEM_INTRINSIC bool substitute(expression_pointer<T>&& new_pointer, csize_t<0> = csize_t<0>{}) const
- {
- return vtable->substitute(instance, std::move(new_pointer));
- }
-
- explicit operator bool() const { return instance != nullptr; }
-
-private:
- void* instance;
- const expression_vtable<T>* vtable;
- std::shared_ptr<expression_resource> resource;
-};
-
-inline namespace CMT_ARCH_NAME
-{
-
-namespace internal
-{
-
-template <typename T, typename E>
-KFR_INTRINSIC expression_vtable<T>* make_expression_vtable()
-{
- static_assert(is_input_expression<E>, "E must be an expression");
- static expression_vtable<T> vtable{ ctype_t<decay<E>>{} };
- return &vtable;
-}
-} // namespace internal
-
-/** @brief Converts the given expression into an opaque object.
- * This overload takes reference to the expression.
- * @warning Use with caution with local variables.
- */
-template <typename E, typename T = value_type_of<E>>
-KFR_INTRINSIC expression_pointer<T> to_pointer(E& expr)
-{
- static_assert(is_input_expression<E>, "E must be an expression");
- return expression_pointer<T>(std::addressof(expr), internal::make_expression_vtable<T, E>());
-}
-
-/** @brief Converts the given expression into an opaque object.
- * This overload takes ownership of the expression (Move semantics).
- * @note Use std::move to force use of this overload.
- */
-template <typename E, typename T = value_type_of<E>>
-KFR_INTRINSIC expression_pointer<T> to_pointer(E&& expr)
-{
- static_assert(is_input_expression<E>, "E must be an expression");
- std::shared_ptr<expression_resource> ptr = make_resource(std::move(expr));
- void* instance = ptr->instance();
- return expression_pointer<T>(instance, internal::make_expression_vtable<T, E>(), std::move(ptr));
-}
-
-template <typename T, size_t key>
-class expression_placeholder : public input_expression
-{
-public:
- using value_type = T;
- expression_placeholder() CMT_NOEXCEPT = default;
- template <typename U, size_t N>
- friend KFR_INTRINSIC vec<U, N> get_elements(const expression_placeholder& self, cinput_t, size_t index,
- vec_shape<U, N>)
- {
- return self.pointer ? elemcast<U>(get_elements(self.pointer, cinput, index, vec_shape<T, N>())) : 0;
- }
- expression_pointer<T> pointer;
-};
-
-template <typename T, size_t key = 0>
-KFR_INTRINSIC expression_placeholder<T, key> placeholder(csize_t<key> = csize_t<key>{})
-{
- return expression_placeholder<T, key>();
-}
-
-template <typename... Args>
-KFR_INTRINSIC bool substitute(input_expression&, Args&&...)
-{
- return false;
-}
-
-namespace internal
-{
-template <typename... Args, typename T, size_t key, size_t... indices>
-KFR_INTRINSIC bool substitute(internal::expression_with_arguments<Args...>& expr,
- expression_pointer<T>&& new_pointer, csize_t<key>, csizes_t<indices...>);
-}
-
-template <typename T, size_t key = 0>
-KFR_INTRINSIC bool substitute(expression_placeholder<T, key>& expr, expression_pointer<T>&& new_pointer,
- csize_t<key> = csize_t<key>{})
-{
- expr.pointer = std::move(new_pointer);
- return true;
-}
-
-template <typename... Args, typename T, size_t key = 0>
-KFR_INTRINSIC bool substitute(internal::expression_with_arguments<Args...>& expr,
- expression_pointer<T>&& new_pointer, csize_t<key> = csize_t<key>{})
-{
- return internal::substitute(expr, std::move(new_pointer), csize_t<key>{}, indicesfor_t<Args...>{});
-}
-
-template <typename T, size_t key = 0>
-KFR_INTRINSIC bool substitute(expression_pointer<T>& expr, expression_pointer<T>&& new_pointer,
- csize_t<key> = csize_t<key>{})
-{
- return expr.substitute(std::move(new_pointer), csize_t<key>{});
-}
-
-namespace internal
-{
-
-template <typename... Args, typename T, size_t key, size_t... indices>
-KFR_INTRINSIC bool substitute(internal::expression_with_arguments<Args...>& expr,
- expression_pointer<T>&& new_pointer, csize_t<key>, csizes_t<indices...>)
-{
- return (substitute(std::get<indices>(expr.args), std::move(new_pointer), csize_t<key>()) || ...);
-}
-
-} // namespace internal
-
-namespace internal
-{
-
-template <typename Expression, typename T, size_t key>
-KFR_INTRINSIC bool invoke_substitute(Expression& expr, expression_pointer<T>&& new_pointer, csize_t<key>)
-{
- return kfr::substitute(expr, std::move(new_pointer), csize_t<key>{});
-}
-
-} // namespace internal
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/include/kfr/base/random.hpp b/include/kfr/base/random.hpp
@@ -25,214 +25,218 @@
*/
#pragma once
-#include "../simd/impl/function.hpp"
-#include "../simd/operators.hpp"
-#include "../simd/shuffle.hpp"
-#include "../simd/vec.hpp"
-#include <functional>
-
-#ifdef CMT_ARCH_ARM
-#define KFR_DISABLE_READCYCLECOUNTER
-#endif
+#include "../math/log_exp.hpp"
+#include "../math/sin_cos.hpp"
+#include "../math/sqrt.hpp"
+#include "random_bits.hpp"
+#include "state_holder.hpp"
namespace kfr
{
-#ifndef KFR_DISABLE_READCYCLECOUNTER
-struct seed_from_rdtsc_t
-{
-};
-
-constexpr seed_from_rdtsc_t seed_from_rdtsc{};
-#endif
-
inline namespace CMT_ARCH_NAME
{
-using random_state = u32x4;
-
-#ifndef KFR_DISABLE_READCYCLECOUNTER
-#ifdef CMT_COMPILER_CLANG
-#define KFR_builtin_readcyclecounter() \
- static_cast<u64>(__builtin_readcyclecounter()) // Intel C++ requires cast here
-#else
-#define KFR_builtin_readcyclecounter() static_cast<u64>(__rdtsc())
-#endif
-#endif
-
-struct random_bit_generator
-{
-#ifndef KFR_DISABLE_READCYCLECOUNTER
- KFR_MEM_INTRINSIC random_bit_generator(seed_from_rdtsc_t) CMT_NOEXCEPT
- : state(bitcast<u32>(make_vector(KFR_builtin_readcyclecounter(),
- (KFR_builtin_readcyclecounter() << 11) ^ 0x710686d615e2257bull)))
- {
- (void)operator()();
- }
-#endif
- KFR_MEM_INTRINSIC random_bit_generator(u32 x0, u32 x1, u32 x2, u32 x3) CMT_NOEXCEPT
- : state(x0, x1, x2, x3)
- {
- (void)operator()();
- }
- KFR_MEM_INTRINSIC random_bit_generator(u64 x0, u64 x1) CMT_NOEXCEPT
- : state(bitcast<u32>(make_vector(x0, x1)))
- {
- (void)operator()();
- }
-
- KFR_MEM_INTRINSIC random_state operator()()
- {
- const static random_state mul{ 214013u, 17405u, 214013u, 69069u };
- const static random_state add{ 2531011u, 10395331u, 13737667u, 1u };
- state = bitcast<u32>(rotateright<3>(bitcast<u8>(fmadd(state, mul, add))));
- return state;
- }
-
-protected:
- random_state state;
-};
-
-static_assert(sizeof(random_state) == 16, "sizeof(random_state) == 16");
-
-template <size_t N, KFR_ENABLE_IF(N <= sizeof(random_state))>
-KFR_INTRINSIC vec<u8, N> random_bits(random_bit_generator& gen)
-{
- return narrow<N>(bitcast<u8>(gen()));
-}
-
-template <size_t N, KFR_ENABLE_IF(N > sizeof(random_state))>
-KFR_INTRINSIC vec<u8, N> random_bits(random_bit_generator& gen)
-{
- constexpr size_t N2 = prev_poweroftwo(N - 1);
- const vec<u8, N2> bits1 = random_bits<N2>(gen);
- const vec<u8, N - N2> bits2 = random_bits<N - N2>(gen);
- return concat(bits1, bits2);
-}
-
-template <typename T, size_t N, KFR_ENABLE_IF(is_integral<T>)>
-KFR_INTRINSIC vec<T, N> random_uniform(random_bit_generator& gen)
+template <typename T, size_t N, KFR_ENABLE_IF(std::is_integral_v<T>)>
+KFR_INTRINSIC vec<T, N> random_uniform(random_state& state)
{
- return bitcast<T>(random_bits<N * sizeof(T)>(gen));
+ return bitcast<T>(random_bits<N * sizeof(T)>(state));
}
-template <typename T, size_t N, KFR_ENABLE_IF(is_same<T, f32>)>
-KFR_INTRINSIC vec<f32, N> randommantissa(random_bit_generator& gen)
+template <typename T, size_t N, KFR_ENABLE_IF(std::is_same_v<T, f32>)>
+KFR_INTRINSIC vec<f32, N> randommantissa(random_state& state)
{
- return bitcast<f32>((random_uniform<u32, N>(gen) & u32(0x7FFFFFu)) | u32(0x3f800000u)) + 0.0f;
+ return bitcast<f32>((random_uniform<u32, N>(state) & u32(0x7FFFFFu)) | u32(0x3f800000u)) + 0.0f;
}
-template <typename T, size_t N, KFR_ENABLE_IF(is_same<T, f64>)>
-KFR_INTRINSIC vec<f64, N> randommantissa(random_bit_generator& gen)
+template <typename T, size_t N, KFR_ENABLE_IF(std::is_same_v<T, f64>)>
+KFR_INTRINSIC vec<f64, N> randommantissa(random_state& state)
{
- return bitcast<f64>((random_uniform<u64, N>(gen) & u64(0x000FFFFFFFFFFFFFull)) |
+ return bitcast<f64>((random_uniform<u64, N>(state) & u64(0x000FFFFFFFFFFFFFull)) |
u64(0x3FF0000000000000ull)) +
0.0;
}
template <typename T, size_t N, KFR_ENABLE_IF(is_f_class<T>)>
-KFR_INTRINSIC vec<T, N> random_uniform(random_bit_generator& gen)
+KFR_INTRINSIC vec<T, N> random_uniform(random_state& state)
{
- return randommantissa<T, N>(gen) - 1.f;
+ return randommantissa<T, N>(state) - 1.f;
}
template <size_t N, typename T, KFR_ENABLE_IF(is_f_class<T>)>
-KFR_INTRINSIC vec<T, N> random_range(random_bit_generator& gen, T min, T max)
+KFR_INTRINSIC vec<T, N> random_range(random_state& state, T min, T max)
{
- return mix(random_uniform<T, N>(gen), min, max);
+ return mix(random_uniform<T, N>(state), min, max);
}
template <size_t N, typename T, KFR_ENABLE_IF(!is_f_class<T>)>
-KFR_INTRINSIC vec<T, N> random_range(random_bit_generator& gen, T min, T max)
+KFR_INTRINSIC vec<T, N> random_range(random_state& state, T min, T max)
{
using big_type = findinttype<sqr(std::numeric_limits<T>::min()), sqr(std::numeric_limits<T>::max())>;
- vec<T, N> u = random_uniform<T, N>(gen);
+ vec<T, N> u = random_uniform<T, N>(state);
const vec<big_type, N> tmp = u;
return (tmp * (max - min) + min) >> typebits<T>::bits;
}
-namespace internal
+template <size_t N, typename T>
+KFR_INTRINSIC vec<T, N> random_normal(random_state& state, T mu, T sigma)
{
-template <typename T, typename Gen = random_bit_generator>
-struct expression_random_uniform : input_expression
+ static_assert(std::is_floating_point_v<T>, "random_normal requires floating point type");
+
+ constexpr size_t M = align_up(N, 2); // round up to 2
+
+ vec<T, M> u = random_uniform<T, M>(state);
+
+ vec<T, M / 2> mag = sigma * sqrt(T(-2.0) * log(even(u)));
+ vec<T, M> z = dup(mag) * cossin(c_pi<T, 2> * dupodd(u)) + mu;
+ return slice<0, N>(z);
+}
+
+template <typename T, index_t Dims, bool Reference = false>
+struct expression_random_uniform : expression_traits_defaults
{
- using value_type = T;
- constexpr expression_random_uniform(Gen gen) CMT_NOEXCEPT : gen(gen) {}
- template <size_t N>
- friend vec<T, N> get_elements(const expression_random_uniform& self, cinput_t, size_t, vec_shape<T, N>)
+ using value_type = T;
+ constexpr static size_t dims = Dims;
+ constexpr static shape<dims> get_shape(const expression_random_uniform&)
+ {
+ return shape<dims>(infinite_size);
+ }
+ constexpr static shape<dims> get_shape() { return shape<dims>(infinite_size); }
+
+ mutable state_holder<random_state, Reference> state;
+
+ template <size_t N, index_t VecAxis>
+ friend KFR_INTRINSIC vec<T, N> get_elements(const expression_random_uniform& self, shape<Dims>,
+ axis_params<VecAxis, N>)
+ {
+ return random_uniform<N, T>(*self.state);
+ }
+};
+
+template <typename T, index_t Dims, bool Reference = false>
+struct expression_random_range : expression_traits_defaults
+{
+ using value_type = T;
+ constexpr static size_t dims = Dims;
+ constexpr static shape<dims> get_shape(const expression_random_range&)
+ {
+ return shape<dims>(infinite_size);
+ }
+ constexpr static shape<dims> get_shape() { return shape<dims>(infinite_size); }
+
+ mutable state_holder<random_state, Reference> state;
+ T min;
+ T max;
+
+ template <size_t N, index_t VecAxis>
+ friend KFR_INTRINSIC vec<T, N> get_elements(const expression_random_range& self, shape<Dims>,
+ axis_params<VecAxis, N>)
{
- return random_uniform<T, N>(self.gen);
+ return random_range<N, T>(*self.state, self.min, self.max);
}
- mutable Gen gen;
};
-template <typename T, typename Gen = random_bit_generator>
-struct expression_random_range : input_expression
+template <typename T, index_t Dims, bool Reference = false>
+struct expression_random_normal : expression_traits_defaults
{
- using value_type = T;
- constexpr expression_random_range(Gen gen, T min, T max) CMT_NOEXCEPT : gen(gen), min(min), max(max) {}
+ using value_type = T;
+ constexpr static size_t dims = Dims;
+ constexpr static shape<dims> get_shape(const expression_random_normal&)
+ {
+ return shape<dims>(infinite_size);
+ }
+ constexpr static shape<dims> get_shape() { return shape<dims>(infinite_size); }
- template <size_t N>
- friend vec<T, N> get_elements(const expression_random_range& self, cinput_t, size_t, vec_shape<T, N>)
+ mutable state_holder<random_state, Reference> state;
+ T sigma{ 1 };
+ T mu{ 0 };
+
+ template <size_t N, index_t VecAxis>
+ friend KFR_INTRINSIC vec<T, N> get_elements(const expression_random_normal& self, shape<Dims>,
+ axis_params<VecAxis, N>)
{
- return random_range<N, T>(self.gen, self.min, self.max);
+ return random_normal<N, T>(*self.state, self.mu, self.sigma);
}
- mutable Gen gen;
- const T min;
- const T max;
};
-} // namespace internal
-/// @brief Returns expression that returns pseudo random values. Copies the given generator
-template <typename T>
-KFR_FUNCTION internal::expression_random_uniform<T> gen_random_uniform(const random_bit_generator& gen)
+/// @brief Returns expression that returns pseudorandom values. Copies the given generator
+template <typename T, index_t Dims = 1>
+KFR_FUNCTION expression_random_uniform<T, Dims> gen_random_uniform(const random_state& state)
{
- return internal::expression_random_uniform<T>(gen);
+ return { {}, state };
}
-/// @brief Returns expression that returns pseudo random values. References the given
+/// @brief Returns expression that returns pseudorandom values. References the given
/// generator. Use std::ref(gen) to force this overload
-template <typename T>
-KFR_FUNCTION internal::expression_random_uniform<T, std::reference_wrapper<random_bit_generator>>
-gen_random_uniform(std::reference_wrapper<random_bit_generator> gen)
+template <typename T, index_t Dims = 1>
+KFR_FUNCTION expression_random_range<T, Dims, true> gen_random_uniform(
+ std::reference_wrapper<random_state> state)
{
- return internal::expression_random_uniform<T, std::reference_wrapper<random_bit_generator>>(gen);
+ return { {}, state };
}
#ifndef KFR_DISABLE_READCYCLECOUNTER
-/// @brief Returns expression that returns pseudo random values
-template <typename T>
-KFR_FUNCTION internal::expression_random_uniform<T> gen_random_uniform()
+/// @brief Returns expression that returns pseudorandom values
+template <typename T, index_t Dims = 1>
+KFR_FUNCTION expression_random_range<T, Dims> gen_random_uniform()
{
- return internal::expression_random_uniform<T>(random_bit_generator(seed_from_rdtsc));
+ return expression_random_uniform<T, Dims>{ random_init() };
}
#endif
-/// @brief Returns expression that returns pseudo random values of the given range. Copies the given generator
-template <typename T>
-KFR_FUNCTION internal::expression_random_range<T> gen_random_range(const random_bit_generator& gen, T min,
- T max)
+/// @brief Returns expression that returns pseudorandom values of the given range. Copies the given generator
+template <typename T, index_t Dims = 1>
+KFR_FUNCTION expression_random_range<T, Dims> gen_random_range(const random_state& state, T min, T max)
{
- return internal::expression_random_range<T>(gen, min, max);
+ return { {}, state, min, max };
}
-/// @brief Returns expression that returns pseudo random values of the given range. References the given
+/// @brief Returns expression that returns pseudorandom values of the given range. References the given
/// generator. Use std::ref(gen) to force this overload
-template <typename T>
-KFR_FUNCTION internal::expression_random_range<T, std::reference_wrapper<random_bit_generator>>
-gen_random_range(std::reference_wrapper<random_bit_generator> gen, T min, T max)
+template <typename T, index_t Dims = 1>
+KFR_FUNCTION expression_random_range<T, Dims, true> gen_random_range(
+ std::reference_wrapper<random_state> state, T min, T max)
{
- return internal::expression_random_range<T, std::reference_wrapper<random_bit_generator>>(gen, min, max);
+ return { {}, state, min, max };
}
#ifndef KFR_DISABLE_READCYCLECOUNTER
-/// @brief Returns expression that returns pseudo random values of the given range
-template <typename T>
-KFR_FUNCTION internal::expression_random_range<T> gen_random_range(T min, T max)
+/// @brief Returns expression that returns pseudorandom values of the given range
+template <typename T, index_t Dims = 1>
+KFR_FUNCTION expression_random_range<T, Dims> gen_random_range(T min, T max)
{
- return internal::expression_random_range<T>(random_bit_generator(seed_from_rdtsc), min, max);
+ return { {}, random_init(), min, max };
}
#endif
+
+/// @brief Returns expression that returns pseudorandom values from normal (gaussian) distribution. Copies the
+/// given generator
+template <typename T, index_t Dims = 1>
+KFR_FUNCTION expression_random_normal<T, Dims> gen_random_normal(const random_state& state, T sigma = 1,
+ T mu = 0)
+{
+ return { {}, state, sigma, mu };
+}
+
+/// @brief Returns expression that returns pseudorandom values from normal (gaussian) distribution. References
+/// the given generator. Use std::ref(gen) to force this overload
+template <typename T, index_t Dims = 1>
+KFR_FUNCTION expression_random_normal<T, Dims, true> gen_random_normal(
+ std::reference_wrapper<random_state> state, T sigma = 1, T mu = 0)
+{
+ return { {}, state, sigma, mu };
+}
+
+#ifndef KFR_DISABLE_READCYCLECOUNTER
+/// @brief Returns expression that returns pseudorandom values from normal (gaussian) distribution
+template <typename T, index_t Dims = 1>
+KFR_FUNCTION expression_random_normal<T, Dims> gen_random_normal(T sigma = 1, T mu = 0)
+{
+ return { {}, random_init(), sigma, mu };
+}
+#endif
+
} // namespace CMT_ARCH_NAME
+
} // namespace kfr
diff --git a/include/kfr/base/random_bits.hpp b/include/kfr/base/random_bits.hpp
@@ -0,0 +1,127 @@
+/** @addtogroup random
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../simd/impl/function.hpp"
+#include "../simd/operators.hpp"
+#include "../simd/shuffle.hpp"
+#include "../simd/vec.hpp"
+#include "expression.hpp"
+#include <functional>
+
+#ifdef CMT_ARCH_ARM
+#define KFR_DISABLE_READCYCLECOUNTER
+#endif
+
+namespace kfr
+{
+
+#ifndef KFR_DISABLE_READCYCLECOUNTER
+struct seed_from_rdtsc_t
+{
+};
+
+constexpr seed_from_rdtsc_t seed_from_rdtsc{};
+#endif
+
+struct random_state
+{
+ constexpr random_state() : v{ 0, 0, 0, 0 } {}
+ constexpr random_state(random_state&&) = default;
+ constexpr random_state(const random_state&) = default;
+ constexpr random_state& operator=(random_state&&) = default;
+ constexpr random_state& operator=(const random_state&) = default;
+ // internal field
+ portable_vec<u32, 4> v;
+};
+
+#ifndef KFR_DISABLE_READCYCLECOUNTER
+#ifdef CMT_COMPILER_CLANG
+#define KFR_builtin_readcyclecounter() \
+ static_cast<u64>(__builtin_readcyclecounter()) // Intel C++ requires cast here
+#else
+#define KFR_builtin_readcyclecounter() static_cast<u64>(__rdtsc())
+#endif
+#endif
+
+static_assert(sizeof(random_state) == 16, "sizeof(random_state) == 16");
+
+inline namespace CMT_ARCH_NAME
+{
+
+KFR_INTRINSIC void random_next(random_state& state)
+{
+ constexpr static portable_vec<u32, 4> mul{ 214013u, 17405u, 214013u, 69069u };
+ constexpr static portable_vec<u32, 4> add{ 2531011u, 10395331u, 13737667u, 1u };
+ state.v = bitcast<u32>(rotateright<3>(
+ bitcast<u8>(fmadd(static_cast<u32x4>(state.v), static_cast<u32x4>(mul), static_cast<u32x4>(add)))));
+}
+
+#ifndef KFR_DISABLE_READCYCLECOUNTER
+KFR_INTRINSIC random_state random_init()
+{
+ random_state state;
+ state.v = portable_vec<u32, 4>{ bitcast<u32>(make_vector(
+ KFR_builtin_readcyclecounter(), (KFR_builtin_readcyclecounter() << 11) ^ 0x710686d615e2257bull)) };
+ random_next(state);
+ return state;
+}
+#endif
+
+KFR_INTRINSIC random_state random_init(u32 x0, u32 x1, u32 x2, u32 x3)
+{
+ random_state state;
+ state.v = portable_vec<u32, 4>{ x0, x1, x2, x3 };
+ random_next(state);
+ return state;
+}
+
+KFR_INTRINSIC random_state random_init(u64 x0, u64 x1)
+{
+ random_state state;
+ state.v = portable_vec<u32, 4>{ static_cast<u32>(x0), static_cast<u32>(x0 >> 32), static_cast<u32>(x1),
+ static_cast<u32>(x1 >> 32) };
+ random_next(state);
+ return state;
+}
+
+template <size_t N, KFR_ENABLE_IF(N <= sizeof(random_state))>
+KFR_INTRINSIC vec<u8, N> random_bits(random_state& state)
+{
+ random_next(state);
+ return narrow<N>(bitcast<u8>(u32x4(state.v)));
+}
+
+template <size_t N, KFR_ENABLE_IF(N > sizeof(random_state))>
+KFR_INTRINSIC vec<u8, N> random_bits(random_state& state)
+{
+ constexpr size_t N2 = prev_poweroftwo(N - 1);
+ const vec<u8, N2> bits1 = random_bits<N2>(state);
+ const vec<u8, N - N2> bits2 = random_bits<N - N2>(state);
+ return concat(bits1, bits2);
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/include/kfr/base/reduce.hpp b/include/kfr/base/reduce.hpp
@@ -1,4 +1,4 @@
-/** @addtogroup array
+/** @addtogroup reducing
* @{
*/
/*
@@ -25,12 +25,13 @@
*/
#pragma once
-#include "../math/min_max.hpp"
#include "../simd/horizontal.hpp"
#include "../simd/impl/function.hpp"
+#include "../simd/min_max.hpp"
#include "../simd/operators.hpp"
#include "../simd/vec.hpp"
#include "basic_expressions.hpp"
+#include "simd_expressions.hpp"
namespace kfr
{
@@ -47,30 +48,31 @@ KFR_FN(final_mean)
template <typename T>
KFR_INTRINSIC T final_rootmean(T value, size_t size)
{
- return builtin_sqrt(value / T(size));
+ return sqrt(value / T(size));
}
KFR_FN(final_rootmean)
-namespace internal
-{
-template <typename FinalFn, typename T, KFR_ENABLE_IF(is_callable<FinalFn, T, size_t>)>
+template <typename FinalFn, typename T, KFR_ENABLE_IF(std::is_invocable_v<FinalFn, T, size_t>)>
KFR_INTRINSIC auto reduce_call_final(FinalFn&& finalfn, size_t size, T value)
{
return finalfn(value, size);
}
-template <typename FinalFn, typename T, KFR_ENABLE_IF(!is_callable<FinalFn, T, size_t>)>
+template <typename FinalFn, typename T, KFR_ENABLE_IF(std::is_invocable_v<FinalFn, size_t>)>
KFR_INTRINSIC auto reduce_call_final(FinalFn&& finalfn, size_t, T value)
{
return finalfn(value);
}
-template <typename Tout, typename Twork, typename Tin, typename ReduceFn, typename TransformFn,
+template <typename Tout, index_t Dims, typename Twork, typename Tin, typename ReduceFn, typename TransformFn,
typename FinalFn>
-struct expression_reduce : output_expression
+struct expression_reduce : public expression_traits_defaults
{
- constexpr static size_t width = vector_width<Tin> * bitness_const(1, 2);
+ using value_type = Tin;
+ constexpr static size_t dims = Dims;
+ constexpr static shape<dims> get_shape(const expression_reduce&) { return shape<dims>(infinite_size); }
+ constexpr static shape<dims> get_shape() { return shape<dims>(infinite_size); }
- using value_type = Tin;
+ constexpr static size_t width = vector_width<Tin> * bitness_const(1, 2);
expression_reduce(ReduceFn&& reducefn, TransformFn&& transformfn, FinalFn&& finalfn)
: counter(0), reducefn(std::move(reducefn)), transformfn(std::move(transformfn)),
@@ -78,16 +80,14 @@ struct expression_reduce : output_expression
{
}
- template <size_t N>
- KFR_MEM_INTRINSIC void operator()(coutput_t, size_t, const vec<Tin, N>& x) const
- {
- counter += N;
- process(x);
- }
+ KFR_MEM_INTRINSIC Tout get() { return reduce_call_final(finalfn, counter, horizontal(value, reducefn)); }
- KFR_MEM_INTRINSIC Tout get()
+ template <size_t N, index_t VecAxis>
+ friend KFR_INTRINSIC void set_elements(expression_reduce& self, shape<Dims>, axis_params<VecAxis, N>,
+ const identity<vec<Tin, N>>& x)
{
- return internal::reduce_call_final(finalfn, counter, horizontal(value, reducefn));
+ self.counter += N;
+ self.process(x);
}
protected:
@@ -116,12 +116,11 @@ protected:
FinalFn finalfn;
mutable vec<Twork, width> value;
};
-} // namespace internal
template <typename ReduceFn, typename TransformFn = fn_generic::pass_through,
- typename FinalFn = fn_generic::pass_through, typename E1, typename Tin = value_type_of<E1>,
- typename Twork = decay<decltype(std::declval<TransformFn>()(std::declval<Tin>()))>,
- typename Tout = decay<decltype(internal::reduce_call_final(
+ typename FinalFn = fn_generic::pass_through, typename E1, typename Tin = expression_value_type<E1>,
+ typename Twork = std::decay_t<decltype(std::declval<TransformFn>()(std::declval<Tin>()))>,
+ typename Tout = std::decay_t<decltype(reduce_call_final(
std::declval<FinalFn>(), std::declval<size_t>(), std::declval<Twork>()))>,
KFR_ENABLE_IF(is_input_expression<E1>)>
KFR_INTRINSIC Tout reduce(const E1& e1, ReduceFn&& reducefn,
@@ -129,8 +128,8 @@ KFR_INTRINSIC Tout reduce(const E1& e1, ReduceFn&& reducefn,
FinalFn&& finalfn = fn_generic::pass_through())
{
static_assert(!is_infinite<E1>, "e1 must be a sized expression (use slice())");
- using reducer_t =
- internal::expression_reduce<Tout, Twork, Tin, decay<ReduceFn>, decay<TransformFn>, decay<FinalFn>>;
+ using reducer_t = expression_reduce<Tout, expression_dims<E1>, Twork, Tin, std::decay_t<ReduceFn>,
+ std::decay_t<TransformFn>, std::decay_t<FinalFn>>;
reducer_t red(std::forward<ReduceFn>(reducefn), std::forward<TransformFn>(transformfn),
std::forward<FinalFn>(finalfn));
process(red, e1);
@@ -139,9 +138,9 @@ KFR_INTRINSIC Tout reduce(const E1& e1, ReduceFn&& reducefn,
}
template <typename ReduceFn, typename TransformFn = fn_generic::pass_through,
- typename FinalFn = fn_generic::pass_through, typename E1, typename Tin = value_type_of<E1>,
- typename Twork = decay<decltype(std::declval<TransformFn>()(std::declval<Tin>()))>,
- typename Tout = decay<decltype(internal::reduce_call_final(
+ typename FinalFn = fn_generic::pass_through, typename E1, typename Tin = expression_value_type<E1>,
+ typename Twork = std::decay_t<decltype(std::declval<TransformFn>()(std::declval<Tin>()))>,
+ typename Tout = std::decay_t<decltype(reduce_call_final(
std::declval<FinalFn>(), std::declval<size_t>(), std::declval<Twork>()))>,
KFR_ENABLE_IF(!is_input_expression<E1>)>
KFR_INTRINSIC Tout reduce(const E1& e1, ReduceFn&& reducefn,
@@ -155,10 +154,70 @@ KFR_INTRINSIC Tout reduce(const E1& e1, ReduceFn&& reducefn,
result = reducefn(result, transformfn(in));
++counter;
}
- return internal::reduce_call_final(finalfn, counter, result);
+ return reduce_call_final(finalfn, counter, result);
}
-KFR_FN(reduce)
+template <size_t Bins = 0, typename TCount = uint32_t>
+struct histogram_data
+{
+ using vector_type = univector<TCount, Bins == 0 ? tag_dynamic_vector : 2 + Bins>;
+
+ KFR_MEM_INTRINSIC histogram_data(size_t steps)
+ {
+ if constexpr (Bins == 0)
+ {
+ m_values = vector_type(2 + steps, 0);
+ }
+ }
+
+ KFR_MEM_INTRINSIC TCount operator[](size_t n) const
+ {
+ KFR_LOGIC_CHECK(n < size() - 2, "n is outside histogram size");
+ return m_values[1 + n];
+ }
+ KFR_MEM_INTRINSIC TCount below() const { return m_values.front(); }
+ KFR_MEM_INTRINSIC TCount above() const { return m_values.back(); }
+ KFR_MEM_INTRINSIC size_t size() const { return m_values.size() - 2; }
+ KFR_MEM_INTRINSIC univector_ref<const TCount> values() const { return m_values.slice(1, size()); }
+
+ template <typename T>
+ KFR_MEM_INTRINSIC void put(T value)
+ {
+ const T x = 1 + value * size();
+ ++m_values[std::floor(clamp(x, 0, size() + 1))];
+ }
+
+private:
+ vector_type m_values{};
+};
+
+template <size_t Bins, typename E, typename TCount = uint32_t>
+struct expression_histogram : public expression_with_traits<E>
+{
+ mutable histogram_data<Bins, TCount> data{};
+
+ using expression_with_traits<E>::expression_with_traits;
+
+ KFR_MEM_INTRINSIC expression_histogram(E&& e, size_t steps)
+ : expression_with_traits<E>{ std::forward<E>(e) }, data(steps)
+ {
+ }
+
+ using value_type = typename expression_with_traits<E>::value_type;
+
+ template <index_t Axis, size_t N>
+ friend KFR_INTRINSIC vec<value_type, N> get_elements(const expression_histogram& self,
+ const shape<expression_with_traits<E>::dims>& index,
+ const axis_params<Axis, N>& sh)
+ {
+ vec<value_type, N> v = get_elements(self.first(), index, sh);
+ for (size_t i = 0; i < N; ++i)
+ {
+ self.data.template put<value_type>(v[i]);
+ }
+ return v;
+ }
+};
/**
* @brief Returns the sum of all the elements in x.
@@ -168,7 +227,7 @@ KFR_FN(reduce)
* x_0 + x_1 + \ldots + x_{N-1}
* \f]
*/
-template <typename E1, typename T = value_type_of<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
+template <typename E1, typename T = expression_value_type<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
KFR_FUNCTION T sum(const E1& x)
{
static_assert(!is_infinite<E1>, "e1 must be a sized expression (use slice())");
@@ -183,7 +242,7 @@ KFR_FUNCTION T sum(const E1& x)
* \frac{1}{N}(x_0 + x_1 + \ldots + x_{N-1})
* \f]
*/
-template <typename E1, typename T = value_type_of<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
+template <typename E1, typename T = expression_value_type<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
KFR_FUNCTION T mean(const E1& x)
{
static_assert(!is_infinite<E1>, "e1 must be a sized expression (use slice())");
@@ -195,7 +254,7 @@ KFR_FUNCTION T mean(const E1& x)
*
* x must have its size and type specified.
*/
-template <typename E1, typename T = value_type_of<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
+template <typename E1, typename T = expression_value_type<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
KFR_FUNCTION T minof(const E1& x)
{
static_assert(!is_infinite<E1>, "e1 must be a sized expression (use slice())");
@@ -207,7 +266,7 @@ KFR_FUNCTION T minof(const E1& x)
*
* x must have its size and type specified.
*/
-template <typename E1, typename T = value_type_of<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
+template <typename E1, typename T = expression_value_type<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
KFR_FUNCTION T maxof(const E1& x)
{
static_assert(!is_infinite<E1>, "e1 must be a sized expression (use slice())");
@@ -219,7 +278,7 @@ KFR_FUNCTION T maxof(const E1& x)
*
* x must have its size and type specified.
*/
-template <typename E1, typename T = value_type_of<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
+template <typename E1, typename T = expression_value_type<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
KFR_FUNCTION T absminof(const E1& x)
{
static_assert(!is_infinite<E1>, "e1 must be a sized expression (use slice())");
@@ -231,7 +290,7 @@ KFR_FUNCTION T absminof(const E1& x)
*
* x must have its size and type specified.
*/
-template <typename E1, typename T = value_type_of<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
+template <typename E1, typename T = expression_value_type<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
KFR_FUNCTION T absmaxof(const E1& x)
{
static_assert(!is_infinite<E1>, "e1 must be a sized expression (use slice())");
@@ -247,8 +306,8 @@ KFR_FUNCTION T absmaxof(const E1& x)
* \f]
*/
template <typename E1, typename E2,
- typename T = value_type_of<decltype(std::declval<E1>() * std::declval<E2>())>,
- KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
+ typename T = expression_value_type<decltype(std::declval<E1>() * std::declval<E2>())>,
+ KFR_ACCEPT_EXPRESSIONS(E1, E2)>
KFR_FUNCTION T dotproduct(E1&& x, E2&& y)
{
auto m = std::forward<E1>(x) * std::forward<E2>(y);
@@ -265,7 +324,7 @@ KFR_FUNCTION T dotproduct(E1&& x, E2&& y)
\sqrt{\frac{1}{N}( x_0^2 + x_1^2 + \ldots + x_{N-1}^2)}
\f]
*/
-template <typename E1, typename T = value_type_of<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
+template <typename E1, typename T = expression_value_type<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
KFR_FUNCTION T rms(const E1& x)
{
static_assert(!is_infinite<E1>, "e1 must be a sized expression (use slice())");
@@ -280,7 +339,7 @@ KFR_FUNCTION T rms(const E1& x)
x_0^2 + x_1^2 + \ldots + x_{N-1}^2
\f]
*/
-template <typename E1, typename T = value_type_of<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
+template <typename E1, typename T = expression_value_type<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
KFR_FUNCTION T sumsqr(const E1& x)
{
static_assert(!is_infinite<E1>, "e1 must be a sized expression (use slice())");
@@ -295,12 +354,52 @@ KFR_FUNCTION T sumsqr(const E1& x)
x_0 \cdot x_1 \cdot \ldots \cdot x_{N-1}
\f]
*/
-template <typename E1, typename T = value_type_of<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
+template <typename E1, typename T = expression_value_type<E1>, KFR_ENABLE_IF(is_input_expression<E1>)>
KFR_FUNCTION T product(const E1& x)
{
static_assert(!is_infinite<E1>, "e1 must be a sized expression (use slice())");
return reduce(x, fn::mul());
}
+/**
+ * @brief Returns expression that computes histogram as data flows through it.
+ * Number of bins defined at runtime
+ */
+template <typename E, typename TCount = uint32_t>
+KFR_FUNCTION expression_histogram<0, E, TCount> histogram_expression(E&& expr, size_t bins)
+{
+ return { std::forward<E>(expr), bins };
+}
+
+/**
+ * @brief Returns expression that computes histogram as data flows through it.
+ * Number of bins defined at compile time
+ */
+template <size_t Bins, typename E, typename TCount = uint32_t>
+KFR_FUNCTION expression_histogram<Bins, E, TCount> histogram_expression(E&& expr)
+{
+ return { std::forward<E>(expr), Bins };
+}
+
+/**
+ * @brief Returns histogram of the expression data.
+ * Number of bins defined at runtime
+ */
+template <typename E, typename TCount = uint32_t>
+KFR_FUNCTION histogram_data<0, TCount> histogram(E&& expr, size_t bins)
+{
+ return sink(histogram_expression(std::forward<E>(expr), bins)).data;
+}
+
+/**
+ * @brief Returns histogram of the expression data.
+ * Number of bins defined at compile time
+ */
+template <size_t Bins, typename E, typename TCount = uint32_t>
+KFR_FUNCTION histogram_data<Bins, TCount> histogram(E&& expr)
+{
+ return sink(histogram_expression(std::forward<E>(expr), Bins)).data;
+}
+
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/base/shape.hpp b/include/kfr/base/shape.hpp
@@ -0,0 +1,834 @@
+/** @addtogroup types
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../except.hpp"
+#include "impl/static_array.hpp"
+
+#include "../cometa/string.hpp"
+#include "../simd/logical.hpp"
+#include "../simd/min_max.hpp"
+#include "../simd/shuffle.hpp"
+#include "../simd/types.hpp"
+
+#include <bitset>
+#include <optional>
+
+namespace kfr
+{
+
+#ifndef KFR_32BIT_INDICES
+#if SIZE_MAX == UINT64_MAX
+using index_t = uint64_t;
+using signed_index_t = int64_t;
+#else
+using index_t = uint32_t;
+using signed_index_t = int32_t;
+#endif
+#else
+using index_t = uint32_t;
+using signed_index_t = int32_t;
+#endif
+constexpr inline index_t max_index_t = std::numeric_limits<index_t>::max();
+constexpr inline signed_index_t max_sindex_t = std::numeric_limits<signed_index_t>::max();
+
+template <index_t val>
+using cindex_t = cval_t<index_t, val>;
+
+template <index_t val>
+constexpr inline cindex_t<val> cindex{};
+
+constexpr inline index_t infinite_size = max_index_t;
+
+constexpr inline index_t undefined_size = 0;
+
+constexpr inline index_t maximum_dims = 8;
+CMT_INTRINSIC constexpr size_t size_add(size_t x, size_t y)
+{
+ return (x == infinite_size || y == infinite_size) ? infinite_size : x + y;
+}
+
+CMT_INTRINSIC constexpr size_t size_sub(size_t x, size_t y)
+{
+ return (x == infinite_size || y == infinite_size) ? infinite_size : (x > y ? x - y : 0);
+}
+
+CMT_INTRINSIC constexpr size_t size_min(size_t x) CMT_NOEXCEPT { return x; }
+
+template <typename... Ts>
+CMT_INTRINSIC constexpr size_t size_min(size_t x, size_t y, Ts... rest) CMT_NOEXCEPT
+{
+ return size_min(x < y ? x : y, rest...);
+}
+
+using dimset = static_array_of_size<i8, maximum_dims>; // std::array<i8, maximum_dims>;
+
+template <index_t dims>
+struct shape;
+
+namespace internal_generic
+{
+template <index_t dims>
+KFR_INTRINSIC bool increment_indices(shape<dims>& indices, const shape<dims>& start, const shape<dims>& stop,
+ index_t dim = dims - 1);
+} // namespace internal_generic
+
+template <index_t dims>
+struct shape : static_array_base<index_t, csizeseq_t<dims>>
+{
+ using base = static_array_base<index_t, csizeseq_t<dims>>;
+
+ using base::base;
+
+ constexpr shape(const base& a) : base(a) {}
+
+ static_assert(dims < maximum_dims);
+
+ template <int dummy = 0, KFR_ENABLE_IF(dummy == 0 && dims == 1)>
+ operator index_t() const
+ {
+ return this->front();
+ }
+
+ template <typename TI>
+ static constexpr shape from_std_array(const std::array<TI, dims>& a)
+ {
+ shape result;
+ std::copy(a.begin(), a.end(), result.begin());
+ return result;
+ }
+
+ template <typename TI = index_t>
+ constexpr std::array<TI, dims> to_std_array() const
+ {
+ std::array<TI, dims> result{};
+ std::copy(this->begin(), this->end(), result.begin());
+ return result;
+ }
+
+ bool ge(const shape& other) const
+ {
+ if constexpr (dims == 1)
+ {
+ return this->front() >= other.front();
+ }
+ else
+ {
+ return all(**this >= *other);
+ }
+ }
+
+ index_t trailing_zeros() const
+ {
+ for (index_t i = 0; i < dims; ++i)
+ {
+ if (revindex(i) != 0)
+ return i;
+ }
+ return dims;
+ }
+
+ bool le(const shape& other) const
+ {
+ if constexpr (dims == 1)
+ {
+ return this->front() <= other.front();
+ }
+ else
+ {
+ return all(**this <= *other);
+ }
+ }
+
+ constexpr shape add(index_t value) const
+ {
+ shape result = *this;
+ result.back() += value;
+ return result;
+ }
+ template <index_t Axis>
+ constexpr shape add_at(index_t value, cval_t<index_t, Axis> = {}) const
+ {
+ shape result = *this;
+ result[Axis] += value;
+ return result;
+ }
+ constexpr shape add(const shape& other) const { return **this + *other; }
+ constexpr shape sub(const shape& other) const { return **this - *other; }
+ constexpr index_t sum() const { return (*this)->sum(); }
+
+ constexpr bool has_infinity() const
+ {
+ for (index_t i = 0; i < dims; ++i)
+ {
+ if (CMT_UNLIKELY(this->operator[](i) == infinite_size))
+ return true;
+ }
+ return false;
+ }
+
+ friend constexpr shape add_shape(const shape& lhs, const shape& rhs)
+ {
+ return lhs.bin(rhs, [](index_t x, index_t y) { return std::max(std::max(x, y), x + y); });
+ }
+ friend constexpr shape sub_shape(const shape& lhs, const shape& rhs)
+ {
+ return lhs.bin(rhs, [](index_t x, index_t y)
+ { return std::max(x, y) == infinite_size ? infinite_size : x - y; });
+ }
+ friend constexpr shape add_shape_undef(const shape& lhs, const shape& rhs)
+ {
+ return lhs.bin(rhs,
+ [](index_t x, index_t y)
+ {
+ bool inf = std::max(x, y) == infinite_size;
+ bool undef = std::min(x, y) == undefined_size;
+ return inf ? infinite_size : undef ? undefined_size : x + y;
+ });
+ }
+ friend constexpr shape sub_shape_undef(const shape& lhs, const shape& rhs)
+ {
+ return lhs.bin(rhs,
+ [](index_t x, index_t y)
+ {
+ bool inf = std::max(x, y) == infinite_size;
+ bool undef = std::min(x, y) == undefined_size;
+ return inf ? infinite_size : undef ? undefined_size : x - y;
+ });
+ }
+
+ friend constexpr shape min(const shape& x, const shape& y) { return x->min(*y); }
+
+ constexpr const base& operator*() const { return static_cast<const base&>(*this); }
+
+ constexpr const base* operator->() const { return static_cast<const base*>(this); }
+
+ KFR_MEM_INTRINSIC constexpr size_t to_flat(const shape<dims>& indices) const
+ {
+ if constexpr (dims == 1)
+ {
+ return indices[0];
+ }
+ else if constexpr (dims == 2)
+ {
+ return (*this)[1] * indices[0] + indices[1];
+ }
+ else
+ {
+ size_t result = 0;
+ size_t scale = 1;
+ CMT_LOOP_UNROLL
+ for (size_t i = 0; i < dims; ++i)
+ {
+ result += scale * indices[dims - 1 - i];
+ scale *= (*this)[dims - 1 - i];
+ }
+ return result;
+ }
+ }
+ KFR_MEM_INTRINSIC constexpr shape<dims> from_flat(size_t index) const
+ {
+ if constexpr (dims == 1)
+ {
+ return { static_cast<index_t>(index) };
+ }
+ else if constexpr (dims == 2)
+ {
+ index_t sz = (*this)[1];
+ return { static_cast<index_t>(index / sz), static_cast<index_t>(index % sz) };
+ }
+ else
+ {
+ shape<dims> indices;
+ CMT_LOOP_UNROLL
+ for (size_t i = 0; i < dims; ++i)
+ {
+ size_t sz = (*this)[dims - 1 - i];
+ indices[dims - 1 - i] = index % sz;
+ index /= sz;
+ }
+ return indices;
+ }
+ }
+
+ KFR_MEM_INTRINSIC constexpr index_t dot(const shape& other) const { return (*this)->dot(*other); }
+
+ template <index_t indims>
+ KFR_MEM_INTRINSIC constexpr shape adapt(const shape<indims>& other) const
+ {
+ static_assert(indims >= dims);
+ return other.template trim<dims>()->min(**this - 1);
+ }
+
+ KFR_MEM_INTRINSIC constexpr index_t product() const { return (*this)->product(); }
+
+ KFR_MEM_INTRINSIC constexpr dimset tomask() const
+ {
+ dimset result(0);
+ for (index_t i = 0; i < dims; ++i)
+ {
+ result[i + maximum_dims - dims] = this->operator[](i) == 1 ? 0 : -1;
+ }
+ return result;
+ }
+
+ template <index_t new_dims>
+ constexpr KFR_MEM_INTRINSIC shape<new_dims> extend(index_t value = infinite_size) const
+ {
+ static_assert(new_dims >= dims);
+ if constexpr (new_dims == dims)
+ return *this;
+ else
+ return shape<new_dims>{ shape<new_dims - dims>(value), *this };
+ }
+
+ template <index_t odims>
+ constexpr shape<odims> trim() const
+ {
+ static_assert(odims <= dims);
+ if constexpr (odims > 0)
+ {
+ return this->template slice<dims - odims, odims>();
+ }
+ else
+ {
+ return {};
+ }
+ }
+
+ constexpr KFR_MEM_INTRINSIC shape<dims - 1> trunc() const
+ {
+ if constexpr (dims > 1)
+ {
+ return this->template slice<0, dims - 1>();
+ }
+ else
+ {
+ return {};
+ }
+ }
+
+ KFR_MEM_INTRINSIC constexpr index_t revindex(size_t index) const
+ {
+ return index < dims ? this->operator[](dims - 1 - index) : 1;
+ }
+ KFR_MEM_INTRINSIC constexpr void set_revindex(size_t index, index_t val)
+ {
+ if (CMT_LIKELY(index < dims))
+ this->operator[](dims - 1 - index) = val;
+ }
+};
+
+template <>
+struct shape<0>
+{
+ static constexpr size_t static_size = 0;
+
+ static constexpr size_t size() { return static_size; }
+
+ constexpr shape() = default;
+ constexpr shape(index_t value) {}
+
+ constexpr bool has_infinity() const { return false; }
+
+ KFR_MEM_INTRINSIC size_t to_flat(const shape<0>& indices) const { return 0; }
+ KFR_MEM_INTRINSIC shape<0> from_flat(size_t index) const { return {}; }
+
+ template <index_t odims>
+ KFR_MEM_INTRINSIC shape<0> adapt(const shape<odims>& other) const
+ {
+ return {};
+ }
+
+ index_t trailing_zeros() const { return 0; }
+
+ KFR_MEM_INTRINSIC index_t dot(const shape& other) const { return 0; }
+
+ KFR_MEM_INTRINSIC index_t product() const { return 0; }
+
+ KFR_MEM_INTRINSIC dimset tomask() const { return dimset(-1); }
+
+ template <index_t new_dims>
+ constexpr KFR_MEM_INTRINSIC shape<new_dims> extend(index_t value = infinite_size) const
+ {
+ if constexpr (new_dims == 0)
+ return *this;
+ else
+ return shape<new_dims>{ value };
+ }
+
+ template <index_t new_dims>
+ constexpr shape<new_dims> trim() const
+ {
+ static_assert(new_dims == 0);
+ return {};
+ }
+
+ KFR_MEM_INTRINSIC constexpr bool operator==(const shape<0>& other) const { return true; }
+ KFR_MEM_INTRINSIC constexpr bool operator!=(const shape<0>& other) const { return false; }
+
+ KFR_MEM_INTRINSIC constexpr index_t revindex(size_t index) const { return 1; }
+ KFR_MEM_INTRINSIC void set_revindex(size_t index, index_t val) {}
+};
+
+template <typename... Args>
+shape(Args&&... args) -> shape<sizeof...(Args)>;
+
+namespace internal_generic
+{
+
+template <index_t outdims, index_t indims>
+KFR_MEM_INTRINSIC shape<outdims> adapt(const shape<indims>& in, const dimset& set)
+{
+ static_assert(indims >= outdims);
+ if constexpr (outdims == 0)
+ {
+ return {};
+ }
+ else
+ {
+ const static_array_of_size<index_t, maximum_dims> eset = set.template cast<index_t>();
+ return in->template slice<indims - outdims, outdims>() &
+ eset.template slice<maximum_dims - outdims, outdims>();
+ }
+}
+template <index_t outdims>
+KFR_MEM_INTRINSIC shape<outdims> adapt(const shape<0>& in, const dimset& set)
+{
+ static_assert(outdims == 0);
+ return {};
+}
+} // namespace internal_generic
+
+template <size_t Dims>
+struct cursor
+{
+ shape<Dims> current;
+ shape<Dims> minimum;
+ shape<Dims> maximum;
+};
+
+using opt_index_t = std::optional<signed_index_t>;
+
+struct tensor_range
+{
+ opt_index_t start;
+ opt_index_t stop;
+ opt_index_t step;
+};
+
+constexpr KFR_INTRINSIC tensor_range trange(std::optional<signed_index_t> start = std::nullopt,
+ std::optional<signed_index_t> stop = std::nullopt,
+ std::optional<signed_index_t> step = std::nullopt)
+{
+ return { start, stop, step };
+}
+
+constexpr KFR_INTRINSIC tensor_range tall() { return trange(); }
+constexpr KFR_INTRINSIC tensor_range tstart(signed_index_t start, signed_index_t step = 1)
+{
+ return trange(start, std::nullopt, step);
+}
+constexpr KFR_INTRINSIC tensor_range tstop(signed_index_t stop, signed_index_t step = 1)
+{
+ return trange(std::nullopt, stop, step);
+}
+constexpr KFR_INTRINSIC tensor_range tstep(signed_index_t step = 1)
+{
+ return trange(std::nullopt, std::nullopt, step);
+}
+
+namespace internal_generic
+{
+
+constexpr inline index_t null_index = max_index_t;
+
+template <index_t dims>
+constexpr KFR_INTRINSIC shape<dims> strides_for_shape(const shape<dims>& sh, index_t stride = 1)
+{
+ shape<dims> strides;
+ if constexpr (dims > 0)
+ {
+ index_t n = stride;
+ for (index_t i = 0; i < dims; ++i)
+ {
+ strides[dims - 1 - i] = n;
+ n *= sh[dims - 1 - i];
+ }
+ }
+ return strides;
+}
+
+template <size_t dims, size_t outdims, bool... ranges>
+constexpr KFR_INTRINSIC shape<outdims> compact_shape(const shape<dims>& in)
+{
+ shape<outdims> result;
+ constexpr std::array flags{ ranges... };
+ size_t j = 0;
+ for (size_t i = 0; i < dims; ++i)
+ {
+ if (CMT_LIKELY(i >= flags.size() || flags[i]))
+ {
+ result[j++] = in[i];
+ }
+ }
+ return result;
+}
+
+template <index_t dims1, index_t dims2, index_t outdims = const_max(dims1, dims2)>
+constexpr bool can_assign_from(const shape<dims1>& dst_shape, const shape<dims2>& src_shape)
+{
+ if constexpr (dims2 == 0)
+ {
+ return true;
+ }
+ else
+ {
+ for (size_t i = 0; i < outdims; ++i)
+ {
+ index_t dst_size = dst_shape.revindex(i);
+ index_t src_size = src_shape.revindex(i);
+ if (CMT_LIKELY(src_size == 1 || src_size == infinite_size || src_size == dst_size ||
+ dst_size == infinite_size))
+ {
+ }
+ else
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+}
+
+template <bool checked = false, index_t dims>
+constexpr shape<dims> common_shape(const shape<dims>& shape)
+{
+ return shape;
+}
+
+template <bool checked = false, index_t dims1, index_t dims2, index_t outdims = const_max(dims1, dims2)>
+KFR_MEM_INTRINSIC constexpr shape<outdims> common_shape(const shape<dims1>& shape1,
+ const shape<dims2>& shape2)
+{
+ shape<outdims> result;
+ for (size_t i = 0; i < outdims; ++i)
+ {
+ index_t size1 = shape1.revindex(i);
+ index_t size2 = shape2.revindex(i);
+ if (CMT_UNLIKELY(!size1 || !size2))
+ {
+ result[outdims - 1 - i] = 0;
+ continue;
+ }
+
+ if (CMT_UNLIKELY(size1 == infinite_size))
+ {
+ if (CMT_UNLIKELY(size2 == infinite_size))
+ {
+ result[outdims - 1 - i] = infinite_size;
+ }
+ else
+ {
+ result[outdims - 1 - i] = size2 == 1 ? infinite_size : size2;
+ }
+ }
+ else
+ {
+ if (CMT_UNLIKELY(size2 == infinite_size))
+ {
+ result[outdims - 1 - i] = size1 == 1 ? infinite_size : size1;
+ }
+ else
+ {
+ if (CMT_LIKELY(size1 == 1 || size2 == 1 || size1 == size2))
+ {
+ result[outdims - 1 - i] = std::max(size1, size2);
+ }
+ else
+ {
+ // broadcast failed
+ if constexpr (checked)
+ {
+ KFR_LOGIC_CHECK(false, "invalid or incompatible shapes: ", shape1, " and ", shape2);
+ }
+ else
+ {
+ result = shape<outdims>(0);
+ return result;
+ }
+ }
+ }
+ }
+ }
+ return result;
+}
+
+template <bool checked = false>
+KFR_MEM_INTRINSIC constexpr shape<0> common_shape(const shape<0>& shape1, const shape<0>& shape2)
+{
+ return {};
+}
+
+template <bool checked = false, index_t dims1, index_t dims2, index_t... dims,
+ index_t outdims = const_max(dims1, dims2, dims...)>
+KFR_MEM_INTRINSIC constexpr shape<outdims> common_shape(const shape<dims1>& shape1,
+ const shape<dims2>& shape2,
+ const shape<dims>&... shapes)
+{
+ return common_shape<checked>(shape1, common_shape(shape2, shapes...));
+}
+
+template <index_t dims1, index_t dims2>
+KFR_MEM_INTRINSIC bool same_layout(const shape<dims1>& x, const shape<dims2>& y)
+{
+ for (index_t i = 0, j = 0;;)
+ {
+ while (i < dims1 && x[i] == 1)
+ ++i;
+ while (j < dims2 && y[j] == 1)
+ ++j;
+ if (i == dims1 && j == dims2)
+ {
+ return true;
+ }
+ if (i < dims1 && j < dims2)
+ {
+ if (x[i] != y[j])
+ return false;
+ }
+ else
+ {
+ return false;
+ }
+ ++i;
+ ++j;
+ }
+}
+
+#ifdef KFR_VEC_INDICES
+template <size_t step, index_t dims>
+KFR_INTRINSIC vec<index_t, dims> increment_indices(vec<index_t, dims> indices,
+ const vec<index_t, dims>& start,
+ const vec<index_t, dims>& stop)
+{
+ indices = indices + make_vector(cconcat(cvalseq<index_t, dims - 1 - step, 0, 0>, cvalseq<index_t, 1, 1>,
+ cvalseq<index_t, step, 0, 0>));
+
+ if constexpr (step + 1 < dims)
+ {
+ vec<bit<index_t>, dims> mask = indices >= stop;
+ if (CMT_LIKELY(!any(mask)))
+ return indices;
+ indices = blend(indices, start, cconcat(csizeseq<dims - step - 1, 0, 0>, csizeseq<step + 1, 1, 0>));
+
+ return increment_indices<step + 1>(indices, stop);
+ }
+ else
+ {
+ return indices;
+ }
+}
+#endif
+
+template <index_t dims>
+KFR_INTRINSIC bool compare_indices(const shape<dims>& indices, const shape<dims>& stop,
+ index_t dim = dims - 1)
+{
+ CMT_LOOP_UNROLL
+ for (int i = dim; i >= 0; --i)
+ {
+ if (CMT_UNLIKELY(indices[i] >= stop[i]))
+ return false;
+ }
+ return true;
+}
+
+template <index_t dims>
+KFR_INTRINSIC bool increment_indices(shape<dims>& indices, const shape<dims>& start, const shape<dims>& stop,
+ index_t dim)
+{
+#ifdef KFR_VEC_INDICES
+ vec<index_t, dims> idx = increment_indices<0>(*indices, *start, *stop);
+ indices = idx;
+ if (any(idx == *stop))
+ return false;
+ return true;
+#else
+ if constexpr (dims > 0)
+ {
+ indices[dim] += 1;
+ CMT_LOOP_UNROLL
+ for (int i = dim; i >= 0;)
+ {
+ if (CMT_LIKELY(indices[i] < stop[i]))
+ return true;
+ // carry
+ indices[i] = start[i];
+ --i;
+ if (i < 0)
+ {
+ return false;
+ }
+ indices[i] += 1;
+ }
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+#endif
+}
+
+template <index_t dims>
+KFR_INTRINSIC shape<dims> increment_indices_return(const shape<dims>& indices, const shape<dims>& start,
+ const shape<dims>& stop, index_t dim = dims - 1)
+{
+ shape<dims> result = indices;
+ if (CMT_LIKELY(increment_indices(result, start, stop, dim)))
+ {
+ return result;
+ }
+ else
+ {
+ return shape<dims>(null_index);
+ }
+}
+
+template <typename... Index>
+constexpr KFR_INTRINSIC size_t count_dimensions()
+{
+ return ((std::is_same_v<std::decay_t<Index>, tensor_range> ? 1 : 0) + ...);
+}
+
+template <typename U>
+struct type_of_list
+{
+ using value_type = U;
+};
+
+template <typename U>
+struct type_of_list<std::initializer_list<U>>
+{
+ using value_type = typename type_of_list<U>::value_type;
+};
+
+template <typename U>
+using type_of_list_t = typename type_of_list<U>::value_type;
+
+template <typename U>
+constexpr KFR_INTRINSIC shape<1> shape_of_list(const std::initializer_list<U>& list)
+{
+ return list.size();
+}
+
+template <typename U>
+constexpr KFR_INTRINSIC auto shape_of_list(const std::initializer_list<std::initializer_list<U>>& list)
+{
+ return shape_of_list(*list.begin());
+}
+
+template <typename U>
+constexpr KFR_INTRINSIC U list_get(const std::initializer_list<U>& list, const shape<1>& idx)
+{
+ return list[idx.front()];
+}
+
+template <typename U, index_t dims>
+constexpr KFR_INTRINSIC auto list_get(const std::initializer_list<std::initializer_list<U>>& list,
+ const shape<dims>& idx)
+{
+ return list_get(list[idx[0]], idx.template trim<dims - 1>());
+}
+
+template <typename U, typename T>
+KFR_FUNCTION T* list_copy_recursively(const std::initializer_list<U>& list, T* dest)
+{
+ for (const auto& value : list)
+ *dest++ = static_cast<T>(value);
+ return dest;
+}
+
+template <typename U, typename T>
+KFR_FUNCTION T* list_copy_recursively(const std::initializer_list<std::initializer_list<U>>& list, T* dest)
+{
+ for (const auto& sublist : list)
+ dest = list_copy_recursively(sublist, dest);
+ return dest;
+}
+
+} // namespace internal_generic
+
+template <index_t dims>
+constexpr KFR_INTRINSIC index_t size_of_shape(const shape<dims>& shape)
+{
+ index_t n = 1;
+ if constexpr (dims > 0)
+ {
+ for (index_t i = 0; i < dims; ++i)
+ {
+ n *= shape[i];
+ }
+ }
+ return n;
+}
+
+template <index_t Axis, size_t N>
+struct axis_params
+{
+ constexpr static index_t axis = Axis;
+ constexpr static index_t width = N;
+ constexpr static index_t value = N;
+
+ constexpr axis_params() = default;
+};
+
+template <index_t Axis, size_t N>
+constexpr inline const axis_params<Axis, N> axis_params_v{};
+
+} // namespace kfr
+
+namespace cometa
+{
+template <kfr::index_t dims>
+struct representation<kfr::shape<dims>>
+{
+ using type = std::string;
+ static std::string get(const kfr::shape<dims>& value)
+ {
+ if constexpr (dims == 0)
+ {
+ return "shape{}";
+ }
+ else
+ {
+ return "shape" + array_to_string(dims, value.data());
+ }
+ }
+};
+
+} // namespace cometa
diff --git a/include/kfr/base/simd_expressions.hpp b/include/kfr/base/simd_expressions.hpp
@@ -0,0 +1,489 @@
+/** @addtogroup expressions
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../simd/abs.hpp"
+#include "../simd/clamp.hpp"
+#include "../simd/comparison.hpp"
+#include "../simd/complex.hpp"
+#include "../simd/min_max.hpp"
+#include "../simd/operators.hpp"
+#include "../simd/round.hpp"
+#include "../simd/saturation.hpp"
+#include "../simd/select.hpp"
+#include "../simd/vec.hpp"
+#include "expression.hpp"
+#include "univector.hpp"
+#include <algorithm>
+
+namespace kfr
+{
+
+inline namespace CMT_ARCH_NAME
+{
+
+/**
+ * @brief Returns template expression that returns sum of all the arguments passed to a function.
+ */
+template <typename... E, KFR_ACCEPT_EXPRESSIONS(E...)>
+KFR_INTRINSIC expression_function<fn::add, E...> add(E&&... x)
+{
+ return { fn::add(), std::forward<E>(x)... };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::sub, E1, E2> sub(E1&& x, E2&& y)
+{
+ return { fn::sub(), std::forward<E1>(x), std::forward<E2>(y) };
+}
+
+/**
+ * @brief Returns template expression that returns product of all the arguments passed to a function.
+ */
+template <typename... E, KFR_ACCEPT_EXPRESSIONS(E...)>
+KFR_INTRINSIC expression_function<fn::mul, E...> mul(E&&... x)
+{
+ return { fn::mul(), std::forward<E>(x)... };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::ipow, E1, E2> ipow(E1&& x, E2&& b)
+{
+ return { fn::ipow(), std::forward<E1>(x), std::forward<E2>(b) };
+}
+
+template <typename E1, typename E2, typename E3, KFR_ACCEPT_EXPRESSIONS(E1, E2, E3)>
+KFR_INTRINSIC expression_function<fn::mix, E1, E2, E3> mix(E1&& c, E2&& x, E3&& y)
+{
+ return { fn::mix(), std::forward<E1>(c), std::forward<E2>(x), std::forward<E3>(y) };
+}
+
+template <typename E1, typename E2, typename E3, KFR_ACCEPT_EXPRESSIONS(E1, E2, E3)>
+KFR_INTRINSIC expression_function<fn::mixs, E1, E2, E3> mixs(E1&& c, E2&& x, E3&& y)
+{
+ return { fn::mixs(), std::forward<E1>(c), std::forward<E2>(x), std::forward<E3>(y) };
+}
+
+template <typename... E, KFR_ACCEPT_EXPRESSIONS(E...)>
+KFR_INTRINSIC expression_function<fn::horner, E...> horner(E&&... x)
+{
+ return { fn::horner(), std::forward<E>(x)... };
+}
+
+template <typename... E, KFR_ACCEPT_EXPRESSIONS(E...)>
+KFR_INTRINSIC expression_function<fn::horner_even, E...> horner_even(E&&... x)
+{
+ return { fn::horner_even(), std::forward<E>(x)... };
+}
+
+template <typename... E, KFR_ACCEPT_EXPRESSIONS(E...)>
+KFR_INTRINSIC expression_function<fn::horner_odd, E...> horner_odd(E&&... x)
+{
+ return { fn::horner_odd(), std::forward<E>(x)... };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::add, E1, E2> operator+(E1&& e1, E2&& e2)
+{
+ return { fn::add(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::sub, E1, E2> operator-(E1&& e1, E2&& e2)
+{
+ return { fn::sub(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::mul, E1, E2> operator*(E1&& e1, E2&& e2)
+{
+ return { fn::mul(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::div, E1, E2> operator/(E1&& e1, E2&& e2)
+{
+ return { fn::div(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::mod, E1, E2> operator%(E1&& e1, E2&& e2)
+{
+ return { fn::mod(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::bitwiseand, E1, E2> operator&(E1&& e1, E2&& e2)
+{
+ return { fn::bitwiseand(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::bitwiseor, E1, E2> operator|(E1&& e1, E2&& e2)
+{
+ return { fn::bitwiseor(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::bitwisexor, E1, E2> operator^(E1&& e1, E2&& e2)
+{
+ return { fn::bitwisexor(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::shl, E1, E2> operator<<(E1&& e1, E2&& e2)
+{
+ return { fn::shl(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::shr, E1, E2> operator>>(E1&& e1, E2&& e2)
+{
+ return { fn::shr(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+/**
+ * @brief Returns template expression that returns square of x.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_INTRINSIC expression_function<fn::sqr, E1> sqr(E1&& x)
+{
+ return { fn::sqr(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns template expression that returns cube of x.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_INTRINSIC expression_function<fn::cub, E1> cub(E1&& x)
+{
+ return { fn::cub(), std::forward<E1>(x) };
+}
+
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_INTRINSIC expression_function<fn::pow2, E1> pow2(E1&& x)
+{
+ return { fn::pow2(), std::forward<E1>(x) };
+}
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_INTRINSIC expression_function<fn::pow3, E1> pow3(E1&& x)
+{
+ return { fn::pow3(), std::forward<E1>(x) };
+}
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_INTRINSIC expression_function<fn::pow4, E1> pow4(E1&& x)
+{
+ return { fn::pow4(), std::forward<E1>(x) };
+}
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_INTRINSIC expression_function<fn::pow5, E1> pow5(E1&& x)
+{
+ return { fn::pow5(), std::forward<E1>(x) };
+}
+
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_INTRINSIC expression_function<fn::neg, E1> operator-(E1&& e1)
+{
+ return { fn::neg(), std::forward<E1>(e1) };
+}
+
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_INTRINSIC expression_function<fn::bitwisenot, E1> operator~(E1&& e1)
+{
+ return { fn::bitwisenot(), std::forward<E1>(e1) };
+}
+
+/// @brief Constructs complex value from real and imaginary parts
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::make_complex, E1, E2> make_complex(E1&& re, E2&& im)
+{
+ return { fn::make_complex{}, std::forward<E1>(re), std::forward<E2>(im) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::equal, E1, E2> operator==(E1&& e1, E2&& e2)
+{
+ return { fn::equal(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::notequal, E1, E2> operator!=(E1&& e1, E2&& e2)
+{
+ return { fn::notequal(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::less, E1, E2> operator<(E1&& e1, E2&& e2)
+{
+ return { fn::less(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::greater, E1, E2> operator>(E1&& e1, E2&& e2)
+{
+ return { fn::greater(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::lessorequal, E1, E2> operator<=(E1&& e1, E2&& e2)
+{
+ return { fn::lessorequal(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::greaterorequal, E1, E2> operator>=(E1&& e1, E2&& e2)
+{
+ return { fn::greaterorequal(), std::forward<E1>(e1), std::forward<E2>(e2) };
+}
+
+/// @brief Returns the real part of the complex value
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_INTRINSIC expression_function<fn::real, E1> real(E1&& x)
+{
+ return { fn::real{}, std::forward<E1>(x) };
+}
+
+/// @brief Returns the imaginary part of the complex value
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_INTRINSIC expression_function<fn::imag, E1> imag(E1&& x)
+{
+ return { fn::imag{}, std::forward<E1>(x) };
+}
+
+/// @brief Returns template expression that returns the complex conjugate of the complex number x
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::cconj, E1> cconj(E1&& x)
+{
+ return { fn::cconj(), std::forward<E1>(x) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+CMT_INTRINSIC expression_function<fn::interleave, E1, E2> interleave(E1&& x, E2&& y)
+{
+ return { fn::interleave(), std::forward<E1>(x), std::forward<E2>(y) };
+}
+
+/**
+ * @brief Returns template expression that returns x if m is true, otherwise return y. Order of the arguments
+ * is same as in ternary operator.
+ */
+template <typename E1, typename E2, typename E3, KFR_ACCEPT_EXPRESSIONS(E1, E2, E3)>
+KFR_FUNCTION expression_function<fn::select, E1, E2, E3> select(E1&& m, E2&& x, E3&& y)
+{
+ return { fn::select(), std::forward<E1>(m), std::forward<E2>(x), std::forward<E3>(y) };
+}
+
+/**
+ * @brief Returns template expression that returns the absolute value of x.
+ */
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::abs, E1> abs(E1&& x)
+{
+ return { fn::abs(), std::forward<E1>(x) };
+}
+
+/**
+ * @brief Returns the smaller of two values. Accepts and returns expressions.
+ */
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_FUNCTION expression_function<fn::min, E1, E2> min(E1&& x, E2&& y)
+{
+ return { fn::min(), std::forward<E1>(x), std::forward<E2>(y) };
+}
+
+/**
+ * @brief Returns the greater of two values. Accepts and returns expressions.
+ */
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_FUNCTION expression_function<fn::max, E1, E2> max(E1&& x, E2&& y)
+{
+ return { fn::max(), std::forward<E1>(x), std::forward<E2>(y) };
+}
+
+/**
+ * @brief Returns the smaller in magnitude of two values. Accepts and returns expressions.
+ */
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_FUNCTION expression_function<fn::absmin, E1, E2> absmin(E1&& x, E2&& y)
+{
+ return { fn::absmin(), std::forward<E1>(x), std::forward<E2>(y) };
+}
+
+/**
+ * @brief Returns the greater in magnitude of two values. Accepts and returns expressions.
+ */
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_FUNCTION expression_function<fn::absmax, E1, E2> absmax(E1&& x, E2&& y)
+{
+ return { fn::absmax(), std::forward<E1>(x), std::forward<E2>(y) };
+}
+
+/// @brief Returns the largest integer value not greater than x. Accepts and returns expressions.
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::floor, E1> floor(E1&& x)
+{
+ return { fn::floor(), std::forward<E1>(x) };
+}
+
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::ceil, E1> ceil(E1&& x)
+{
+ return { fn::ceil(), std::forward<E1>(x) };
+}
+
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::round, E1> round(E1&& x)
+{
+ return { fn::round(), std::forward<E1>(x) };
+}
+
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::trunc, E1> trunc(E1&& x)
+{
+ return { fn::trunc(), std::forward<E1>(x) };
+}
+
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::fract, E1> fract(E1&& x)
+{
+ return { fn::fract(), std::forward<E1>(x) };
+}
+
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::ifloor, E1> ifloor(E1&& x)
+{
+ return { fn::ifloor(), std::forward<E1>(x) };
+}
+
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::iceil, E1> iceil(E1&& x)
+{
+ return { fn::iceil(), std::forward<E1>(x) };
+}
+
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::iround, E1> iround(E1&& x)
+{
+ return { fn::iround(), std::forward<E1>(x) };
+}
+
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::itrunc, E1> itrunc(E1&& x)
+{
+ return { fn::itrunc(), std::forward<E1>(x) };
+}
+
+/// @brief Creates an expression that returns the first argument clamped to a range [lo, hi]
+template <typename E1, typename E2, typename E3, KFR_ACCEPT_EXPRESSIONS(E1, E2, E3)>
+KFR_FUNCTION expression_function<fn::clamp, E1, E2, E3> clamp(E1&& x, E2&& lo, E3&& hi)
+{
+ return { fn::clamp(), std::forward<E1>(x), std::forward<E2>(lo), std::forward<E3>(hi) };
+}
+
+/// @brief Creates an expression that returns the first argument clamped to a range [0, hi]
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_FUNCTION expression_function<fn::clamp, E1, E2> clamp(E1&& x, E2&& hi)
+{
+ return { fn::clamp(), std::forward<E1>(x), std::forward<E2>(hi) };
+}
+
+/// @brief Creates an expression that adds two arguments using saturation
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::satadd, E1, E2> satadd(E1&& x, E2&& y)
+{
+ return { fn::satadd(), std::forward<E1>(x), std::forward<E2>(y) };
+}
+
+/// @brief Creates an expression that subtracts two arguments using saturation
+template <typename E1, typename E2, KFR_ACCEPT_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC expression_function<fn::satsub, E1, E2> satsub(E1&& x, E2&& y)
+{
+ return { fn::satsub(), std::forward<E1>(x), std::forward<E2>(y) };
+}
+
+template <typename E1, typename E2, KFR_ACCEPT_ASGN_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC E1& operator+=(E1&& e1, E2&& e2)
+{
+ process(e1, operator+(e1, e2));
+ return e1;
+}
+template <typename E1, typename E2, KFR_ACCEPT_ASGN_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC E1& operator-=(E1&& e1, E2&& e2)
+{
+ process(e1, operator-(e1, e2));
+ return e1;
+}
+template <typename E1, typename E2, KFR_ACCEPT_ASGN_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC E1& operator*=(E1&& e1, E2&& e2)
+{
+ process(e1, operator*(e1, e2));
+ return e1;
+}
+template <typename E1, typename E2, KFR_ACCEPT_ASGN_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC E1& operator/=(E1&& e1, E2&& e2)
+{
+ process(e1, operator/(e1, e2));
+ return e1;
+}
+template <typename E1, typename E2, KFR_ACCEPT_ASGN_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC E1& operator%=(E1&& e1, E2&& e2)
+{
+ process(e1, operator%(e1, e2));
+ return e1;
+}
+template <typename E1, typename E2, KFR_ACCEPT_ASGN_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC E1& operator|=(E1&& e1, E2&& e2)
+{
+ process(e1, operator|(e1, e2));
+ return e1;
+}
+template <typename E1, typename E2, KFR_ACCEPT_ASGN_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC E1& operator&=(E1&& e1, E2&& e2)
+{
+ process(e1, operator&(e1, e2));
+ return e1;
+}
+template <typename E1, typename E2, KFR_ACCEPT_ASGN_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC E1& operator^=(E1&& e1, E2&& e2)
+{
+ process(e1, operator^(e1, e2));
+ return e1;
+}
+template <typename E1, typename E2, KFR_ACCEPT_ASGN_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC E1& operator<<=(E1&& e1, E2&& e2)
+{
+ process(e1, operator<<(e1, e2));
+ return e1;
+}
+template <typename E1, typename E2, KFR_ACCEPT_ASGN_EXPRESSIONS(E1, E2)>
+KFR_INTRINSIC E1& operator>>=(E1&& e1, E2&& e2)
+{
+ process(e1, operator>>(e1, e2));
+ return e1;
+}
+
+} // namespace CMT_ARCH_NAME
+
+} // namespace kfr
diff --git a/include/kfr/base/sort.hpp b/include/kfr/base/sort.hpp
@@ -1,103 +0,0 @@
-/** @addtogroup utility
- * @{
- */
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "../math/min_max.hpp"
-#include "../simd/shuffle.hpp"
-#include "../simd/vec.hpp"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-
-/**
- * @brief Sort the elements in the vector in ascending order
- * @param x input vector
- * @return sorted vector
- * @code
- * CHECK(sort(make_vector(1000, 1, 2, -10)) == make_vector(-10, 1, 2, 1000));
- * @endcode
- */
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> sort(const vec<T, N>& x)
-{
- constexpr size_t Nhalf = N / 2;
- vec<T, Nhalf> e = low(x);
- vec<T, Nhalf> o = high(x);
- constexpr auto blend0 = cconcat(csizes<1>, csizeseq<Nhalf - 1, 0, 0>);
- for (size_t i = 0; i < Nhalf; i++)
- {
- vec<T, Nhalf> t;
- t = min(e, o);
- o = max(e, o);
- o = rotateright<1>(o);
- e = t;
- t = max(e, o);
- o = min(e, o);
- e = t;
- t = blend(e, o, blend0);
- o = blend(o, e, blend0);
- o = rotateleft<1>(o);
- e = t;
- }
- return interleavehalves(concat(e, o));
-}
-
-/**
- * @brief Sort the elements in the vector in descending order
- * @param x input vector
- * @return sorted vector
- * @code
- * CHECK(sort(make_vector(1000, 1, 2, -10)) == make_vector(1000, 2, 1, -10));
- * @endcode
- */
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> sortdesc(const vec<T, N>& x)
-{
- constexpr size_t Nhalf = N / 2;
- vec<T, Nhalf> e = low(x);
- vec<T, Nhalf> o = high(x);
- constexpr auto blend0 = cconcat(csizes<1>, csizeseq<Nhalf - 1, 0, 0>);
- for (size_t i = 0; i < Nhalf; i++)
- {
- vec<T, Nhalf> t;
- t = max(e, o);
- o = min(e, o);
- o = rotateright<1>(o);
- e = t;
- t = min(e, o);
- o = max(e, o);
- e = t;
- t = blend(e, o, blend0);
- o = blend(o, e, blend0);
- o = rotateleft<1>(o);
- e = t;
- }
- return interleavehalves(concat(e, o));
-}
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/include/kfr/base/state_holder.hpp b/include/kfr/base/state_holder.hpp
@@ -0,0 +1,49 @@
+/** @addtogroup filter
+ * @{
+ */
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+#pragma once
+
+#include "../cident.h"
+#include <functional>
+
+namespace kfr
+{
+
+template <typename T, bool Stateless>
+struct state_holder
+{
+ constexpr state_holder() = delete;
+ constexpr state_holder(const state_holder&) = default;
+ constexpr state_holder(state_holder&&) = default;
+ constexpr state_holder(const T& state) CMT_NOEXCEPT : s(state) {}
+ constexpr state_holder(std::reference_wrapper<const T> state) CMT_NOEXCEPT : s(state) {}
+ T s;
+
+ const T* operator->() const { return &s; }
+ T* operator->() { return &s; }
+ const T& operator*() const { return s; }
+ T& operator*() { return s; }
+};
+
+template <typename T>
+struct state_holder<T, true>
+{
+ constexpr state_holder() = delete;
+ constexpr state_holder(const state_holder&) = default;
+ constexpr state_holder(state_holder&&) = default;
+ constexpr state_holder(T& state) CMT_NOEXCEPT : s(state) {}
+ constexpr state_holder(std::reference_wrapper<T> state) CMT_NOEXCEPT : s(state) {}
+ T& s;
+
+ const T* operator->() const { return &s; }
+ T* operator->() { return &s; }
+ const T& operator*() const { return s; }
+ T& operator*() { return s; }
+};
+
+} // namespace kfr
diff --git a/include/kfr/base/tensor.hpp b/include/kfr/base/tensor.hpp
@@ -0,0 +1,969 @@
+/** @addtogroup tensor
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include <optional>
+
+#include "../cometa/array.hpp"
+
+#include "../simd/horizontal.hpp"
+#include "../simd/impl/function.hpp"
+#include "../simd/logical.hpp"
+#include "../simd/min_max.hpp"
+#include "../simd/read_write.hpp"
+#include "../simd/types.hpp"
+#include "expression.hpp"
+#include "memory.hpp"
+#include "shape.hpp"
+
+CMT_PRAGMA_MSVC(warning(push))
+CMT_PRAGMA_MSVC(warning(disable : 4324))
+
+namespace kfr
+{
+
+namespace internal_generic
+{
+struct memory_finalizer_base
+{
+ virtual ~memory_finalizer_base() {}
+};
+template <typename Data>
+struct memory_finalizer_data : public memory_finalizer_base
+{
+ constexpr KFR_INTRINSIC memory_finalizer_data(Data&& data) : data(std::move(data)) {}
+ Data data;
+};
+template <typename Func>
+struct memory_finalizer_func : public memory_finalizer_data<Func>
+{
+ using memory_finalizer_data<Func>::memory_finalizer_data;
+ KFR_INTRINSIC ~memory_finalizer_func() { this->data(); }
+};
+} // namespace internal_generic
+
+using memory_finalizer = std::shared_ptr<internal_generic::memory_finalizer_base>;
+
+template <typename Fn>
+memory_finalizer KFR_INTRINSIC make_memory_finalizer(Fn&& fn)
+{
+ return memory_finalizer(new internal_generic::memory_finalizer_func<Fn>{ std::move(fn) });
+}
+
+template <typename T, typename Derived, typename Dims>
+struct tensor_subscript;
+
+template <typename T, typename Derived, index_t... Dims>
+struct tensor_subscript<T, Derived, std::integer_sequence<index_t, Dims...>>
+{
+ constexpr static inline size_t dims = sizeof...(Dims);
+
+ using reference = T&;
+ using const_reference = const T&;
+
+ reference KFR_MEM_INTRINSIC operator()(type_for<index_t, Dims>... idx) const
+ {
+ return static_cast<const Derived&>(*this).access(shape<dims>{ idx... });
+ }
+};
+
+/// @brief tensor holds or references multidimensional data and
+/// provides a way to access individual elements and perform complex operations on the data.
+///
+/// The number of elements in each axis of the array is defined by its shape.
+/// @tparam T element type
+/// @tparam NDims number of dimensions
+template <typename T, index_t NDims>
+struct tensor : public tensor_subscript<T, tensor<T, NDims>, std::make_integer_sequence<index_t, NDims>>
+{
+public:
+ using value_type = T;
+ using pointer = T* CMT_RESTRICT;
+ using const_pointer = const T* CMT_RESTRICT;
+ using reference = T&;
+ using const_reference = const T&;
+ using size_type = index_t;
+
+ constexpr static inline index_t dims = NDims;
+
+ using shape_type = kfr::shape<dims>;
+
+ /// @brief Tensor iterator. Iterates through flattened array
+ struct tensor_iterator
+ {
+ using iterator_category = std::forward_iterator_tag;
+ using difference_type = std::ptrdiff_t;
+ using value_type = T;
+ using pointer = T*;
+ using reference = T&;
+
+ const tensor* src;
+ shape_type indices;
+
+ KFR_MEM_INTRINSIC intptr_t flat_index() const { return src->calc_index(indices); }
+
+ KFR_MEM_INTRINSIC bool is_end() const { return indices.front() == internal_generic::null_index; }
+
+ KFR_MEM_INTRINSIC T& operator*() { return src->m_data[flat_index()]; }
+ KFR_MEM_INTRINSIC T* operator->() { return &operator*(); }
+
+ // prefix
+ KFR_MEM_INTRINSIC tensor_iterator& operator++()
+ {
+ if (!internal_generic::increment_indices(indices, shape_type(0), src->m_shape))
+ {
+ indices = shape_type(internal_generic::null_index);
+ }
+ return *this;
+ }
+
+ // postfix
+ KFR_MEM_INTRINSIC tensor_iterator operator++(int)
+ {
+ tensor_iterator temp = *this;
+ ++*this;
+ return temp;
+ }
+
+ KFR_MEM_INTRINSIC bool operator==(const tensor_iterator& it) const
+ {
+ return src == it.src && indices == it.indices;
+ }
+ KFR_MEM_INTRINSIC bool operator!=(const tensor_iterator& it) const { return !operator==(it); }
+ };
+
+ using iterator = tensor_iterator;
+ using const_iterator = tensor_iterator;
+
+ using contiguous_iterator = pointer;
+ using const_contiguous_iterator = pointer;
+
+ /// @brief Default constructor. Creates tensor with null shape
+ KFR_MEM_INTRINSIC constexpr tensor()
+ : m_data(0), m_size(0), m_is_contiguous(false), m_shape{}, m_strides{}
+ {
+ }
+
+ /// @brief Construct from external pointer, shape, strides and finalizer
+ KFR_MEM_INTRINSIC tensor(T* data, const shape_type& shape, const shape_type& strides,
+ memory_finalizer finalizer)
+ : m_data(data), m_size(size_of_shape(shape)),
+ m_is_contiguous(strides == internal_generic::strides_for_shape(shape)), m_shape(shape),
+ m_strides(strides), m_finalizer(std::move(finalizer))
+ {
+ }
+
+ /// @brief Construct from external pointer, shape and finalizer with default strides
+ KFR_MEM_INTRINSIC tensor(T* data, const shape_type& shape, memory_finalizer finalizer)
+ : m_data(data), m_size(size_of_shape(shape)), m_is_contiguous(true), m_shape(shape),
+ m_strides(internal_generic::strides_for_shape(shape)), m_finalizer(std::move(finalizer))
+ {
+ }
+
+ KFR_INTRINSIC static T* allocate(size_t size) { return aligned_allocate<T>(size, 64); }
+
+ KFR_INTRINSIC static void deallocate(T* ptr) { aligned_deallocate(ptr); }
+
+ /// @brief Construct from shape and allocate memory
+ KFR_INTRINSIC explicit tensor(const shape_type& shape)
+ : m_size(size_of_shape(shape)), m_is_contiguous(true), m_shape(shape),
+ m_strides(internal_generic::strides_for_shape(shape))
+ {
+ T* ptr = allocate(m_size);
+ m_data = ptr;
+ m_finalizer = make_memory_finalizer([ptr]() { deallocate(ptr); });
+ }
+
+ /// @brief Construct from shape, strides and allocate memory
+ KFR_INTRINSIC tensor(const shape_type& shape, const shape_type& strides)
+ : m_size(size_of_shape(shape)),
+ m_is_contiguous(strides == internal_generic::strides_for_shape(shape)), m_shape(shape),
+ m_strides(strides)
+ {
+ T* ptr = allocate(m_size);
+ m_data = ptr;
+ m_finalizer = make_memory_finalizer([ptr]() { deallocate(ptr); });
+ }
+
+ /// @brief Construct from shape, allocate memory and fill with value
+ KFR_INTRINSIC tensor(const shape_type& shape, T value) : tensor(shape)
+ {
+ std::fill(contiguous_begin_unsafe(), contiguous_end_unsafe(), value);
+ }
+
+ /// @brief Construct from shape, strides, allocate memory and fill with value
+ KFR_INTRINSIC tensor(const shape_type& shape, const shape_type& strides, T value) : tensor(shape, strides)
+ {
+ std::fill(begin(), end(), value);
+ }
+
+ /// @brief Construct from shape, allocate memory and fill with flat list
+ KFR_INTRINSIC tensor(const shape_type& shape, const std::initializer_list<T>& values) : tensor(shape)
+ {
+ if (values.size() != m_size)
+ KFR_REPORT_LOGIC_ERROR("Invalid initializer provided for kfr::tensor");
+ std::copy(values.begin(), values.end(), contiguous_begin_unsafe());
+ }
+
+ /// @brief Initialize with braced list. Defined for 1D tensor only
+ template <typename U, KFR_ENABLE_IF(std::is_convertible_v<U, T>&& dims == 1)>
+ KFR_INTRINSIC tensor(const std::initializer_list<U>& values) : tensor(shape_type(values.size()))
+ {
+ internal_generic::list_copy_recursively(values, contiguous_begin_unsafe());
+ }
+
+ /// @brief Initialize with braced list. Defined for 2D tensor only
+ template <typename U, KFR_ENABLE_IF(std::is_convertible_v<U, T>&& dims == 2)>
+ KFR_INTRINSIC tensor(const std::initializer_list<std::initializer_list<U>>& values)
+ : tensor(shape_type(values.size(), values.begin()->size()))
+ {
+ internal_generic::list_copy_recursively(values, contiguous_begin_unsafe());
+ }
+
+ /// @brief Initialize with braced list. Defined for 3D tensor only
+ template <typename U, KFR_ENABLE_IF(std::is_convertible_v<U, T>&& dims == 3)>
+ KFR_INTRINSIC tensor(const std::initializer_list<std::initializer_list<std::initializer_list<U>>>& values)
+ : tensor(shape_type(values.size(), values.begin()->size(), values.begin()->begin()->size()))
+ {
+ internal_generic::list_copy_recursively(values, contiguous_begin_unsafe());
+ }
+
+ /// @brief Initialize with braced list. Defined for 4D tensor only
+ template <typename U, KFR_ENABLE_IF(std::is_convertible_v<U, T>&& dims == 4)>
+ KFR_INTRINSIC tensor(
+ const std::initializer_list<std::initializer_list<std::initializer_list<std::initializer_list<U>>>>&
+ values)
+ : tensor(shape_type(values.size(), values.begin()->size(), values.begin()->begin()->size(),
+ values.begin()->begin()->begin()->size()))
+ {
+ internal_generic::list_copy_recursively(values, contiguous_begin_unsafe());
+ }
+
+ KFR_INTRINSIC tensor(const shape_type& shape, const shape_type& strides, std::initializer_list<T> values)
+ : tensor(shape, strides)
+ {
+ if (values.size() != m_size)
+ KFR_REPORT_LOGIC_ERROR("Invalid initializer provided for kfr::tensor");
+ std::copy(values.begin(), values.end(), begin());
+ }
+
+ template <typename Input, KFR_ACCEPT_EXPRESSIONS(Input)>
+ KFR_MEM_INTRINSIC tensor(Input&& input) : tensor(get_shape(input))
+ {
+ static_assert(expression_traits<Input>::dims == dims);
+ process(*this, input);
+ }
+
+ KFR_INTRINSIC pointer data() const { return m_data; }
+
+ KFR_INTRINSIC size_type size() const { return m_size; }
+
+ KFR_INTRINSIC bool empty() const { return m_size == 0; }
+
+ KFR_INTRINSIC tensor_iterator begin() const
+ {
+ if (empty())
+ return tensor_iterator{ this, shape_type(internal_generic::null_index) };
+ else
+ return tensor_iterator{ this, shape_type(0) };
+ }
+ KFR_INTRINSIC tensor_iterator end() const
+ {
+ return tensor_iterator{ this, shape_type(internal_generic::null_index) };
+ }
+
+ KFR_INTRINSIC void require_contiguous() const
+ {
+ if (!m_is_contiguous)
+ KFR_REPORT_LOGIC_ERROR("Contiguous array is required");
+ }
+
+ KFR_INTRINSIC contiguous_iterator contiguous_begin() const
+ {
+ require_contiguous();
+ return m_data;
+ }
+ KFR_INTRINSIC contiguous_iterator contiguous_end() const
+ {
+ require_contiguous();
+ return m_data + m_size;
+ }
+
+ KFR_INTRINSIC contiguous_iterator contiguous_begin_unsafe() const { return m_data; }
+ KFR_INTRINSIC contiguous_iterator contiguous_end_unsafe() const { return m_data + m_size; }
+
+ KFR_MEM_INTRINSIC intptr_t calc_index(const shape_type& indices) const
+ {
+ return static_cast<intptr_t>(static_cast<signed_index_t>(indices.dot(m_strides)));
+ }
+
+ KFR_MEM_INTRINSIC reference access(const shape_type& indices) const
+ {
+ return m_data[calc_index(indices)];
+ }
+
+ KFR_MEM_INTRINSIC reference operator[](index_t flat_index) const { return m_data[flat_index]; }
+
+ KFR_MEM_INTRINSIC tensor operator()(const shape_type& start, const shape_type& stop) const
+ {
+ return tensor{
+ m_data + calc_index(start),
+ stop - start,
+ m_strides,
+ m_finalizer,
+ };
+ }
+
+#if defined(CMT_COMPILER_IS_MSVC)
+ tensor(const tensor& other)
+ : m_data(other.m_data), m_size(other.m_size), m_is_contiguous(other.m_is_contiguous),
+ m_shape(other.m_shape), m_strides(other.m_strides), m_finalizer(other.m_finalizer)
+ {
+ }
+ tensor(tensor&& other)
+ : m_data(other.m_data), m_size(other.m_size), m_is_contiguous(other.m_is_contiguous),
+ m_shape(other.m_shape), m_strides(other.m_strides), m_finalizer(std::move(other.m_finalizer))
+ {
+ }
+ tensor(tensor& other) : tensor(const_cast<const tensor&>(other)) {}
+ tensor(const tensor&& other) : tensor(static_cast<const tensor&>(other)) {}
+#else
+ tensor(const tensor&) = default;
+ tensor(tensor&&) = default;
+ tensor(tensor& other) : tensor(const_cast<const tensor&>(other)) {}
+ tensor(const tensor&& other) : tensor(static_cast<const tensor&>(other)) {}
+#endif
+
+#if defined(CMT_COMPILER_IS_MSVC)
+ tensor& operator=(const tensor& src) &
+ {
+ this->~tensor();
+ new (this) tensor(src);
+ }
+ tensor& operator=(tensor&& src) &
+ {
+ this->~tensor();
+ new (this) tensor(std::move(src));
+ }
+#else
+ tensor& operator=(const tensor& src) & = default;
+ tensor& operator=(tensor&& src) & = default;
+#endif
+
+ KFR_MEM_INTRINSIC const tensor& operator=(const tensor& src) const&
+ {
+ assign(src);
+ return *this;
+ }
+ KFR_MEM_INTRINSIC tensor& operator=(const tensor& src) &&
+ {
+ assign(src);
+ return *this;
+ }
+ KFR_MEM_INTRINSIC const tensor& operator=(const T& scalar) const&
+ {
+ assign(scalar);
+ return *this;
+ }
+ KFR_MEM_INTRINSIC tensor& operator=(const T& scalar) &&
+ {
+ assign(scalar);
+ return *this;
+ }
+
+ KFR_MEM_INTRINSIC void assign(const tensor& src) const
+ {
+ if (src.shape() != m_shape)
+ KFR_REPORT_LOGIC_ERROR("Tensors must have same shape");
+ std::copy(src.begin(), src.end(), begin());
+ }
+ KFR_MEM_INTRINSIC void assign(const T& scalar) const { std::fill(begin(), end(), scalar); }
+
+ template <typename... Index>
+ static constexpr bool has_tensor_range = (std::is_same_v<Index, tensor_range> || ...);
+
+ KFR_MEM_INTRINSIC static void get_range(index_t& start, index_t& shape, index_t& step,
+ signed_index_t tsize, index_t iidx)
+ {
+ signed_index_t tstart = iidx;
+ tstart = tstart < 0 ? tsize + tstart : tstart;
+ start = tstart;
+ shape = tstart < tsize ? 1 : 0;
+ step = 1;
+ }
+
+ KFR_MEM_INTRINSIC static void get_range(index_t& start, index_t& shape, index_t& step,
+ signed_index_t tsize, const tensor_range& iidx)
+ {
+ signed_index_t tstep = iidx.step.value_or(1);
+ signed_index_t tstart;
+ signed_index_t tstop;
+ if (tstep >= 0)
+ {
+ tstart = iidx.start.value_or(0);
+ tstop = iidx.stop.value_or(tsize);
+ }
+ else
+ {
+ tstart = iidx.start ? *iidx.start + 1 : tsize;
+ tstop = iidx.stop ? *iidx.stop + 1 : 0;
+ }
+ tstart = tstart < 0 ? tsize + tstart : tstart;
+ tstart = std::max(std::min(tstart, tsize), signed_index_t(0));
+ if (tstep == 0)
+ {
+ start = tstart;
+ shape = tstop - tstart;
+ step = 0;
+ }
+ else
+ {
+ tstop = tstop < 0 ? tsize + tstop : tstop;
+ tstop = std::max(std::min(tstop, tsize), signed_index_t(0));
+ if (tstep >= 0)
+ {
+ tstop = std::max(tstop, tstart);
+ start = tstart;
+ shape = (tstop - tstart + tstep - 1) / tstep;
+ step = tstep;
+ }
+ else
+ {
+ tstart = std::max(tstart, tstop);
+ shape = (tstart - tstop + -tstep - 1) / -tstep;
+ start = tstart - 1;
+ step = tstep;
+ }
+ }
+ }
+
+ template <index_t... Num, typename... Index>
+ KFR_MEM_INTRINSIC void get_ranges(shape_type& start, shape_type& shape, shape_type& step,
+ cvals_t<index_t, Num...> indices, const std::tuple<Index...>& idx) const
+ {
+ cforeach(indices,
+ [&](auto i_) CMT_INLINE_LAMBDA
+ {
+ constexpr index_t i = val_of(decltype(i_)());
+ signed_index_t tsize = static_cast<signed_index_t>(m_shape[i]);
+ if constexpr (i < sizeof...(Index))
+ {
+ get_range(start[i], shape[i], step[i], tsize, std::get<i>(idx));
+ }
+ else
+ {
+ start[i] = 0;
+ shape[i] = tsize;
+ step[i] = 1;
+ }
+ });
+ }
+
+ template <typename... Index,
+ size_t ndimOut = internal_generic::count_dimensions<Index...>() + (dims - sizeof...(Index)),
+ std::enable_if_t<has_tensor_range<Index...> || (sizeof...(Index) < dims)>* = nullptr>
+ KFR_MEM_INTRINSIC tensor<T, ndimOut> operator()(const Index&... idx) const
+ {
+ shape_type start;
+ shape_type shape;
+ shape_type step;
+ get_ranges(start, shape, step, cvalseq<index_t, dims>, std::make_tuple(idx...));
+ shape_type strides = *step * *m_strides;
+ // shape_type absstep = abs(*step);
+
+ T* data = m_data + calc_index(start);
+ // shape_type shape = ((*stop - *start) + (*absstep - 1)) / *absstep;
+
+ return tensor<T, ndimOut>{
+ data,
+ internal_generic::compact_shape<dims, ndimOut, std::is_same_v<Index, tensor_range>...>(shape),
+ internal_generic::compact_shape<dims, ndimOut, std::is_same_v<Index, tensor_range>...>(strides),
+ m_finalizer,
+ };
+ }
+
+ using tensor_subscript<T, tensor<T, NDims>, std::make_integer_sequence<index_t, NDims>>::operator();
+
+ template <index_t dims>
+ KFR_MEM_INTRINSIC tensor<T, dims> reshape_may_copy(const kfr::shape<dims>& new_shape,
+ bool allow_copy = false) const
+ {
+ if (size_of_shape(new_shape) != m_size)
+ {
+ KFR_REPORT_LOGIC_ERROR("Invalid shape provided");
+ }
+ /*
+ TODO: reshape must be possible with non-contiguous arrays:
+ [256, 256, 1] -> [256, 256]
+ [256, 256] -> [256, 256, 1]
+ [256, 256] -> [256, 1, 256]
+ */
+ if (!is_contiguous())
+ {
+ if (allow_copy)
+ {
+ tensor<T, dims> result(new_shape);
+ std::copy(begin(), end(), result.contiguous_begin());
+ return result;
+ }
+ else
+ {
+ KFR_REPORT_LOGIC_ERROR("reshape requires contiguous array");
+ }
+ }
+ return tensor<T, dims>{
+ m_data,
+ new_shape,
+ internal_generic::strides_for_shape(new_shape),
+ m_finalizer,
+ };
+ }
+
+ template <index_t dims>
+ KFR_MEM_INTRINSIC tensor<T, dims> reshape(const kfr::shape<dims>& new_shape) const
+ {
+ return reshape_may_copy(new_shape, false);
+ }
+
+ KFR_MEM_INTRINSIC tensor<T, 1> flatten() const { return reshape(kfr::shape<1>{ m_size }, false); }
+
+ KFR_MEM_INTRINSIC tensor<T, 1> flatten_may_copy(bool allow_copy = false) const
+ {
+ return reshape_may_copy(kfr::shape<1>{ m_size }, allow_copy);
+ }
+
+ KFR_MEM_INTRINSIC tensor copy() const
+ {
+ tensor result(m_shape);
+ std::copy(begin(), end(), result.contiguous_begin());
+ return result;
+ }
+
+ KFR_MEM_INTRINSIC void copy_from(const tensor& other) { std::copy(other.begin(), other.end(), begin()); }
+
+ template <typename Fn>
+ KFR_MEM_INTRINSIC void iterate(Fn&& fn) const
+ {
+ auto it = begin();
+ while (it != end())
+ {
+ fn(*it, it.indices);
+ ++it;
+ }
+ }
+
+ template <typename Fn, typename Tout = std::invoke_result_t<Fn, T>>
+ KFR_MEM_INTRINSIC tensor<Tout, dims> map(Fn&& fn) const
+ {
+ return unary(std::forward<Fn>(fn));
+ }
+
+ template <typename Fn, typename Tout = std::invoke_result_t<Fn, T>>
+ KFR_MEM_INTRINSIC tensor<Tout, dims> unary(Fn&& fn) const
+ {
+ tensor<Tout, dims> result(m_shape);
+ auto dst = result.contiguous_begin_unsafe();
+ if (is_contiguous())
+ {
+ auto src = contiguous_begin_unsafe();
+ while (src != contiguous_end_unsafe())
+ {
+ *dst = fn(*src);
+ ++src;
+ ++dst;
+ }
+ }
+ else
+ {
+ auto src = begin();
+ while (src != end())
+ {
+ *dst = fn(*src);
+ ++src;
+ ++dst;
+ }
+ }
+ return result;
+ }
+
+ template <typename Fn>
+ KFR_MEM_INTRINSIC const tensor& unary_inplace(Fn&& fn) const
+ {
+ if (is_contiguous())
+ {
+ auto it = contiguous_begin_unsafe();
+ while (it != contiguous_end_unsafe())
+ {
+ *it = fn(*it);
+ ++it;
+ }
+ }
+ else
+ {
+ auto it = begin();
+ while (it != end())
+ {
+ *it = fn(*it);
+ ++it;
+ }
+ }
+ return *this;
+ }
+
+ template <typename Fn>
+ KFR_MEM_INTRINSIC T reduce(Fn&& fn, T initial = T{}) const
+ {
+ T result = initial;
+ if (is_contiguous())
+ {
+ auto src = contiguous_begin_unsafe();
+ while (src != contiguous_end_unsafe())
+ {
+ result = fn(*src, result);
+ ++src;
+ }
+ }
+ else
+ {
+ auto src = begin();
+ while (src != end())
+ {
+ result = fn(*src, result);
+ ++src;
+ }
+ }
+ return result;
+ }
+
+ template <typename Fn, typename U, typename Tout = std::invoke_result_t<Fn, T, U>>
+ KFR_MEM_INTRINSIC tensor<Tout, dims> binary(const tensor<U, dims>& rhs, Fn&& fn) const
+ {
+ tensor<Tout, dims> result(m_shape);
+ if (is_contiguous() && rhs.is_contiguous())
+ {
+ auto src1 = contiguous_begin_unsafe();
+ auto src2 = rhs.contiguous_begin_unsafe();
+ auto dst = result.contiguous_begin_unsafe();
+ while (src1 != contiguous_end_unsafe())
+ {
+ *dst = fn(*src1, *src2);
+ ++src1;
+ ++src2;
+ ++dst;
+ }
+ }
+ else
+ {
+ auto src1 = begin();
+ auto src2 = rhs.begin();
+ auto dst = result.contiguous_begin();
+ while (src1 != end())
+ {
+ *dst = fn(*src1, *src2);
+ ++src1;
+ ++src2;
+ ++dst;
+ }
+ }
+ return result;
+ }
+
+ template <typename Fn, typename U>
+ KFR_MEM_INTRINSIC const tensor& binary_inplace(const tensor<U, dims>& rhs, Fn&& fn) const
+ {
+ if (is_contiguous() && rhs.is_contiguous())
+ {
+ auto it = contiguous_begin_unsafe();
+ auto src2 = rhs.contiguous_begin_unsafe();
+ while (it != contiguous_end_unsafe())
+ {
+ *it = fn(*it, *src2);
+ ++it;
+ ++src2;
+ }
+ }
+ else
+ {
+ auto it = begin();
+ auto src2 = rhs.begin();
+ while (it != end())
+ {
+ *it = fn(*it, *src2);
+ ++it;
+ ++src2;
+ }
+ }
+ return *this;
+ }
+
+ template <typename U>
+ KFR_MEM_INTRINSIC tensor<U, dims> astype() const
+ {
+ return unary([](T value) { return static_cast<U>(value); });
+ }
+
+ template <size_t Nout>
+ KFR_MEM_INTRINSIC std::array<T, Nout> to_array() const
+ {
+ if (m_size != Nout)
+ KFR_REPORT_LOGIC_ERROR("Nout != m_size");
+ std::array<T, Nout> result;
+ if (is_contiguous())
+ std::copy(contiguous_begin(), contiguous_end(), result.begin());
+ else
+ std::copy(begin(), end(), result.begin());
+ return result;
+ }
+ struct nested_iterator_t
+ {
+ using iterator_category = std::forward_iterator_tag;
+ using difference_type = std::ptrdiff_t;
+ using value_type = tensor<T, dims - 1>;
+ using pointer = const value_type*;
+ using reference = const value_type&;
+
+ const tensor* src;
+ size_t index;
+
+ KFR_MEM_INTRINSIC value_type operator*() { return src->operator()(index); }
+ KFR_MEM_INTRINSIC pointer operator->() { return &operator*(); }
+
+ // prefix
+ KFR_MEM_INTRINSIC nested_iterator_t& operator++()
+ {
+ ++index;
+ return *this;
+ }
+
+ // postfix
+ KFR_MEM_INTRINSIC nested_iterator_t operator++(int)
+ {
+ nested_iterator_t temp = *this;
+ ++*this;
+ return temp;
+ }
+
+ KFR_MEM_INTRINSIC bool operator==(const nested_iterator_t& it) const
+ {
+ return src == it.src && index == it.index;
+ }
+ KFR_MEM_INTRINSIC bool operator!=(const nested_iterator_t& it) const { return !operator==(it); }
+ };
+
+ using nested_iterator = std::conditional_t<dims == 1, tensor_iterator, nested_iterator_t>;
+
+ KFR_MEM_INTRINSIC nested_iterator nested_begin() const
+ {
+ if constexpr (dims == 1)
+ return begin();
+ else
+ return { this, 0 };
+ }
+ KFR_MEM_INTRINSIC nested_iterator nested_end() const
+ {
+ if constexpr (dims == 1)
+ return end();
+ else
+ return { this, m_shape[0] };
+ }
+
+ KFR_MEM_INTRINSIC memory_finalizer finalizer() const { return m_finalizer; }
+
+ template <typename Input, KFR_ACCEPT_EXPRESSIONS(Input)>
+ KFR_MEM_INTRINSIC const tensor& operator=(Input&& input) const&
+ {
+ process(*this, input);
+ return *this;
+ }
+ template <typename Input, KFR_ACCEPT_EXPRESSIONS(Input)>
+ KFR_MEM_INTRINSIC tensor& operator=(Input&& input) &&
+ {
+ process(*this, input);
+ return *this;
+ }
+ template <typename Input, KFR_ACCEPT_EXPRESSIONS(Input)>
+ KFR_MEM_INTRINSIC tensor& operator=(Input&& input) &
+ {
+ process(*this, input);
+ return *this;
+ }
+
+ bool operator==(const tensor& other) const
+ {
+ return shape() == other.shape() && std::equal(begin(), end(), other.begin());
+ }
+ bool operator!=(const tensor& other) const { return !operator==(other); }
+
+ KFR_MEM_INTRINSIC const shape_type& shape() const { return m_shape; }
+ KFR_MEM_INTRINSIC const shape_type& strides() const { return m_strides; }
+
+ KFR_MEM_INTRINSIC bool is_contiguous() const { return m_is_contiguous; }
+
+ KFR_MEM_INTRINSIC bool is_last_contiguous() const { return m_strides.back() == 1; }
+
+ template <typename Fmt = void>
+ std::string to_string(int max_columns = 16, int max_dimensions = INT_MAX, std::string separator = ", ",
+ std::string open = "{", std::string close = "}") const
+ {
+ if constexpr (dims == 0)
+ {
+ if (empty())
+ return {};
+ else
+ return as_string(wrap_fmt(access(shape_type{}), cometa::ctype<Fmt>));
+ }
+ else
+ {
+ return cometa::array_to_string<Fmt>(
+ m_shape.template to_std_array<size_t>(),
+ [this](std::array<size_t, dims> index) CMT_INLINE_LAMBDA
+ { return access(shape_type::from_std_array(index)); },
+ max_columns, max_dimensions, std::move(separator), std::move(open), std::move(close));
+ }
+ }
+
+private:
+ template <typename Input>
+ KFR_MEM_INTRINSIC void assign_expr(Input&& input) const
+ {
+ process(*this, std::forward<Input>(input));
+ }
+
+ T* m_data;
+ const index_t m_size;
+ const bool m_is_contiguous;
+ const shape_type m_shape;
+ const shape_type m_strides;
+ memory_finalizer m_finalizer;
+};
+
+// template <typename T>
+// struct tensor<T, 0>
+// {
+// private:
+// };
+
+template <typename Container, CMT_ENABLE_IF(kfr::has_data_size<Container>),
+ typename T = typename Container::value_type>
+KFR_INTRINSIC tensor<T, 1> tensor_from_container(Container container)
+{
+ using container_finalizer = internal_generic::memory_finalizer_data<Container>;
+ memory_finalizer mem = memory_finalizer(new container_finalizer{ std::move(container) });
+
+ Container* ptr = &static_cast<container_finalizer*>(mem.get())->data;
+
+ return tensor<T, 1>(ptr->data(), shape<1>(ptr->size()), std::move(mem));
+}
+
+template <typename T, index_t Dims>
+struct expression_traits<tensor<T, Dims>> : expression_traits_defaults
+{
+ using value_type = T;
+ constexpr static size_t dims = Dims;
+
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape(const tensor<T, Dims>& self)
+ {
+ return self.shape();
+ }
+ KFR_MEM_INTRINSIC constexpr static shape<dims> get_shape() { return shape<dims>{ undefined_size }; }
+};
+
+inline namespace CMT_ARCH_NAME
+{
+
+template <typename T, index_t NDims, index_t Axis, size_t N>
+KFR_INTRINSIC vec<T, N> get_elements(const tensor<T, NDims>& self, const shape<NDims>& index,
+ const axis_params<Axis, N>&)
+{
+ static_assert(Axis < NDims || NDims == 0);
+ const T* data = self.data() + self.calc_index(index);
+ if constexpr (NDims == 0)
+ {
+ static_assert(N == 1);
+ return *data;
+ }
+ else
+ {
+ if (self.strides()[Axis] == 1)
+ return read<N>(data);
+ return gather_stride<N>(data, self.strides()[Axis]);
+ }
+}
+
+template <typename T, index_t NDims, index_t Axis, size_t N>
+KFR_INTRINSIC void set_elements(const tensor<T, NDims>& self, const shape<NDims>& index,
+ const axis_params<Axis, N>&, const identity<vec<T, N>>& value)
+{
+ static_assert(Axis < NDims || NDims == 0);
+ T* data = self.data() + self.calc_index(index);
+ if constexpr (NDims == 0)
+ {
+ static_assert(N == 1);
+ *data = value.front();
+ }
+ else
+ {
+ if (self.strides()[Axis] == 1)
+ return write(data, value);
+ scatter_stride(data, value, self.strides()[Axis]);
+ }
+}
+
+template <size_t width = 0, index_t Axis = infinite_size, typename E, typename Traits = expression_traits<E>>
+tensor<typename Traits::value_type, Traits::dims> trender(const E& expr)
+{
+ static_assert(!Traits::get_shape().has_infinity());
+ shape sh = Traits::get_shape(expr);
+ tensor<typename Traits::value_type, Traits::dims> result(sh);
+ process<width, Axis>(result, expr);
+ return result;
+}
+
+template <size_t width = 0, index_t Axis = infinite_size, typename E, typename Traits = expression_traits<E>>
+tensor<typename Traits::value_type, Traits::dims> trender(const E& expr, shape<Traits::dims> size)
+{
+ shape sh = min(Traits::get_shape(expr), size);
+ tensor<typename Traits::value_type, Traits::dims> result(sh);
+ process<width, Axis>(result, expr, shape<Traits::dims>{ 0 }, sh);
+ return result;
+}
+
+} // namespace CMT_ARCH_NAME
+
+} // namespace kfr
+
+namespace cometa
+{
+template <typename T, kfr::index_t dims>
+struct representation<kfr::tensor<T, dims>>
+{
+ using type = std::string;
+ static std::string get(const kfr::tensor<T, dims>& value) { return value.to_string(); }
+};
+
+} // namespace cometa
+
+CMT_PRAGMA_MSVC(warning(pop))
diff --git a/include/kfr/base/univector.hpp b/include/kfr/base/univector.hpp
@@ -1,4 +1,4 @@
-/** @addtogroup expressions
+/** @addtogroup univector
* @{
*/
/*
@@ -26,10 +26,10 @@
#pragma once
#include "../cometa/array.hpp"
-
#include "../simd/impl/function.hpp"
#include "../simd/read_write.hpp"
#include "../simd/types.hpp"
+#include "expression.hpp"
#include "memory.hpp"
CMT_PRAGMA_MSVC(warning(push))
@@ -56,9 +56,9 @@ struct abstract_vector : std::array<T, Size>
};
template <typename T>
-struct abstract_vector<T, tag_dynamic_vector> : std::vector<T, allocator<T>>
+struct abstract_vector<T, tag_dynamic_vector> : std::vector<T, data_allocator<T>>
{
- using std::vector<T, allocator<T>>::vector;
+ using std::vector<T, data_allocator<T>>::vector;
};
template <typename T>
@@ -92,47 +92,17 @@ template <typename T, typename Class, bool is_expression>
struct univector_base;
template <typename T, typename Class>
-struct univector_base<T, Class, true> : input_expression, output_expression
+struct univector_base<T, Class, true>
{
- using input_expression::begin_block;
- using input_expression::end_block;
- using output_expression::begin_block;
- using output_expression::end_block;
-
- template <typename U, size_t N>
- KFR_MEM_INTRINSIC void operator()(coutput_t, size_t index, const vec<U, N>& value)
- {
- T* data = derived_cast<Class>(this)->data();
- write(ptr_cast<T>(data) + index, vec<T, N>(value));
- }
-
- template <typename Input, KFR_ENABLE_IF(is_input_expression<Input>)>
+ template <typename Input, KFR_ACCEPT_EXPRESSIONS(Input)>
KFR_MEM_INTRINSIC Class& operator=(Input&& input)
{
+ constexpr index_t dims = expression_dims<Input>;
+ static_assert(dims <= 1, "univector accepts only expressions with dims <= 1");
assign_expr(std::forward<Input>(input));
return *derived_cast<Class>(this);
}
-#define KFR_UVEC_ASGN_OP(aop, op) \
- template <typename Input> \
- KFR_MEM_INTRINSIC Class& aop(Input&& input) \
- { \
- assign_expr(*derived_cast<Class>(this) op std::forward<Input>(input)); \
- return *derived_cast<Class>(this); \
- }
- KFR_UVEC_ASGN_OP(operator+=, +)
- KFR_UVEC_ASGN_OP(operator-=, -)
- KFR_UVEC_ASGN_OP(operator*=, *)
- KFR_UVEC_ASGN_OP(operator/=, /)
- KFR_UVEC_ASGN_OP(operator%=, %)
-
- KFR_UVEC_ASGN_OP(operator&=, &)
- KFR_UVEC_ASGN_OP(operator|=, |)
- KFR_UVEC_ASGN_OP(operator^=, ^)
-
- KFR_UVEC_ASGN_OP(operator<<=, <<)
- KFR_UVEC_ASGN_OP(operator>>=, >>)
-
/// @brief Returns subrange of the vector.
/// If start is greater or equal to this->size, returns empty univector
/// If requested size is greater than this->size, returns only available elements
@@ -192,7 +162,7 @@ struct univector_base<T, Class, true> : input_expression, output_expression
void ringbuf_write(size_t& cursor, const T* src, size_t srcsize)
{
- if (srcsize == 0)
+ if (CMT_UNLIKELY(srcsize == 0))
return;
// skip redundant data
const size_t size = get_size();
@@ -204,7 +174,7 @@ struct univector_base<T, Class, true> : input_expression, output_expression
}
const size_t fsize = size - cursor;
// one fragment
- if (srcsize <= fsize)
+ if (CMT_LIKELY(srcsize <= fsize))
{
copy(data + cursor, src, srcsize);
}
@@ -245,7 +215,7 @@ struct univector_base<T, Class, true> : input_expression, output_expression
}
void ringbuf_read(size_t& cursor, T* dest, size_t destsize) const
{
- if (destsize == 0)
+ if (CMT_UNLIKELY(destsize == 0))
return;
// skip redundant data
const size_t size = get_size();
@@ -257,7 +227,7 @@ struct univector_base<T, Class, true> : input_expression, output_expression
}
const size_t fsize = size - cursor;
// one fragment
- if (destsize <= fsize)
+ if (CMT_LIKELY(destsize <= fsize))
{
copy(dest, data + cursor, destsize);
}
@@ -310,7 +280,7 @@ struct univector_base<T, Class, false>
return array_ref<const T>(data, size);
}
- template <typename Input, KFR_ENABLE_IF(is_input_expression<Input>)>
+ template <typename Input, KFR_ACCEPT_EXPRESSIONS(Input)>
KFR_MEM_INTRINSIC Class& operator=(Input&& input)
{
static_assert(sizeof(Input) == 0, "Can't assign expression to non-expression");
@@ -335,7 +305,7 @@ struct alignas(platform<>::maximum_vector_alignment) univector
#endif
univector(const univector& v) = default;
univector(univector&&) noexcept = default;
- template <typename Input, KFR_ENABLE_IF(is_input_expression<Input>)>
+ template <typename Input, KFR_ACCEPT_EXPRESSIONS(Input)>
univector(Input&& input)
{
this->assign_expr(std::forward<Input>(input));
@@ -348,13 +318,14 @@ struct alignas(platform<>::maximum_vector_alignment) univector
constexpr univector() CMT_NOEXCEPT_SPEC(noexcept(std::array<T, Size>())) = default;
constexpr univector(size_t, const T& value) { std::fill(this->begin(), this->end(), value); }
- constexpr static bool size_known = true;
- constexpr static bool is_array = true;
- constexpr static bool is_array_ref = false;
- constexpr static bool is_vector = false;
- constexpr static bool is_aligned = true;
- constexpr static bool is_pod = kfr::is_pod<T>;
- using value_type = T;
+ constexpr static bool size_known = true;
+ constexpr static size_t static_size = Size;
+ constexpr static bool is_array = true;
+ constexpr static bool is_array_ref = false;
+ constexpr static bool is_vector = false;
+ constexpr static bool is_aligned = true;
+ constexpr static bool is_pod_like = kfr::is_pod_like<T>;
+ using value_type = T;
value_type get(size_t index, value_type fallback_value) const CMT_NOEXCEPT
{
@@ -388,21 +359,28 @@ struct univector<T, tag_array_ref> : array_ref<T>,
constexpr univector(univector<T, Tag>& other) : array_ref<T>(other.data(), other.size())
{
}
- template <typename U, univector_tag Tag, KFR_ENABLE_IF(is_same<remove_const<T>, U>&& is_const<T>)>
+ template <typename U, univector_tag Tag,
+ KFR_ENABLE_IF(std::is_same_v<std::remove_const_t<T>, U>&& std::is_const_v<T>)>
constexpr univector(const univector<U, Tag>& other) : array_ref<T>(other.data(), other.size())
{
}
- template <typename U, univector_tag Tag, KFR_ENABLE_IF(is_same<remove_const<T>, U>&& is_const<T>)>
+ template <typename U, univector_tag Tag,
+ KFR_ENABLE_IF(std::is_same_v<std::remove_const_t<T>, U>&& std::is_const_v<T>)>
constexpr univector(univector<U, Tag>& other) : array_ref<T>(other.data(), other.size())
{
}
+ template <typename U, univector_tag Tag,
+ KFR_ENABLE_IF(std::is_same_v<std::remove_const_t<T>, U>&& std::is_const_v<T>)>
+ constexpr univector(univector<U, Tag>&& other) : array_ref<T>(other.data(), other.size())
+ {
+ }
void resize(size_t) CMT_NOEXCEPT {}
constexpr static bool size_known = false;
constexpr static bool is_array = false;
constexpr static bool is_array_ref = true;
constexpr static bool is_vector = false;
constexpr static bool is_aligned = false;
- using value_type = remove_const<T>;
+ using value_type = std::remove_const_t<T>;
value_type get(size_t index, value_type fallback_value) const CMT_NOEXCEPT
{
@@ -415,33 +393,44 @@ struct univector<T, tag_array_ref> : array_ref<T>,
template <typename T>
struct univector<T, tag_dynamic_vector>
- : std::vector<T, allocator<T>>, univector_base<T, univector<T, tag_dynamic_vector>, is_vec_element<T>>
+ : std::vector<T, data_allocator<T>>,
+ univector_base<T, univector<T, tag_dynamic_vector>, is_vec_element<T>>
{
- using std::vector<T, allocator<T>>::size;
- using std::vector<T, allocator<T>>::vector;
+ using std::vector<T, data_allocator<T>>::size;
+ using std::vector<T, data_allocator<T>>::vector;
using size_type = size_t;
#if !defined CMT_COMPILER_MSVC || defined CMT_COMPILER_CLANG
univector(univector& v) : univector(const_cast<const univector&>(v)) {}
#endif
univector(const univector& v) = default;
univector(univector&&) noexcept = default;
- template <typename Input, KFR_ENABLE_IF(is_input_expression<Input>)>
+ template <typename Input, KFR_ACCEPT_EXPRESSIONS(Input)>
univector(Input&& input)
{
static_assert(!is_infinite<Input>, "Dynamically sized vector requires finite input expression");
- this->resize(input.size());
+ constexpr index_t dims = expression_dims<Input>;
+ static_assert(dims <= 1, "univector accepts only expressions with dims <= 1");
+ if constexpr (dims > 0)
+ {
+ this->resize(get_shape(input).front());
+ }
this->assign_expr(std::forward<Input>(input));
}
- constexpr univector() CMT_NOEXCEPT_SPEC(noexcept(std::vector<T, allocator<T>>())) = default;
- constexpr univector(const std::vector<T, allocator<T>>& other) : std::vector<T, allocator<T>>(other) {}
- constexpr univector(std::vector<T, allocator<T>>&& other) : std::vector<T, allocator<T>>(std::move(other))
+ constexpr univector() CMT_NOEXCEPT_SPEC(noexcept(std::vector<T, data_allocator<T>>())) = default;
+ constexpr univector(const std::vector<T, data_allocator<T>>& other)
+ : std::vector<T, data_allocator<T>>(other)
{
}
- constexpr univector(const array_ref<T>& other) : std::vector<T, allocator<T>>(other.begin(), other.end())
+ constexpr univector(std::vector<T, data_allocator<T>>&& other)
+ : std::vector<T, data_allocator<T>>(std::move(other))
+ {
+ }
+ constexpr univector(const array_ref<T>& other)
+ : std::vector<T, data_allocator<T>>(other.begin(), other.end())
{
}
constexpr univector(const array_ref<const T>& other)
- : std::vector<T, allocator<T>>(other.begin(), other.end())
+ : std::vector<T, data_allocator<T>>(other.begin(), other.end())
{
}
template <typename Allocator>
@@ -461,16 +450,47 @@ struct univector<T, tag_dynamic_vector>
}
using univector_base<T, univector, is_vec_element<T>>::operator=;
univector& operator=(const univector&) = default;
- template <typename Input, KFR_ENABLE_IF(is_input_expression<Input>)>
+ template <typename Input, KFR_ACCEPT_EXPRESSIONS(Input)>
KFR_MEM_INTRINSIC univector& operator=(Input&& input)
{
- if (input.size() != infinite_size)
- this->resize(input.size());
+ constexpr index_t dims = expression_dims<Input>;
+ static_assert(dims <= 1, "univector accepts only expressions with dims <= 1");
+ if constexpr (dims > 0)
+ {
+ if (get_shape(input).front() != infinite_size)
+ this->resize(get_shape(input).front());
+ }
this->assign_expr(std::forward<Input>(input));
return *this;
}
};
+template <typename T, univector_tag Tag>
+struct expression_traits<univector<T, Tag>> : public expression_traits_defaults
+{
+ using value_type = std::remove_const_t<T>;
+ constexpr static size_t dims = 1;
+ constexpr static shape<dims> get_shape(const univector<T, Tag>& u) { return shape<1>(u.size()); }
+ constexpr static shape<dims> get_shape()
+ {
+ if constexpr (univector<T, Tag>::size_known)
+ return shape<1>{ univector<T, Tag>::static_size };
+ else
+ return shape<1>{ undefined_size };
+ }
+};
+
+template <typename T, univector_tag T1, univector_tag T2>
+KFR_FUNCTION bool operator==(const univector<T, T1>& x, const univector<T, T2>& y)
+{
+ return std::equal(x.begin(), x.end(), y.begin(), y.end());
+}
+template <typename T, univector_tag T1, univector_tag T2>
+KFR_FUNCTION bool operator!=(const univector<T, T1>& x, const univector<T, T2>& y)
+{
+ return !operator==(x, y);
+}
+
/// @brief Alias for ``univector<T, tag_array_ref>``;
template <typename T>
using univector_ref = univector<T, tag_array_ref>;
@@ -597,27 +617,37 @@ private:
inline namespace CMT_ARCH_NAME
{
-template <typename T, univector_tag Tag, typename U, size_t N>
-KFR_INTRINSIC vec<U, N> get_elements(const univector<T, Tag>& self, cinput_t, size_t index, vec_shape<U, N>)
+template <typename T, univector_tag Tag, size_t N>
+KFR_INTRINSIC vec<std::remove_const_t<T>, N> get_elements(const univector<T, Tag>& self,
+ const shape<1>& index, const axis_params<0, N>&)
{
const T* data = self.data();
- return static_cast<vec<U, N>>(read<N>(ptr_cast<T>(data) + index));
+ return read<N>(ptr_cast<T>(data) + index.front());
+}
+
+template <typename T, univector_tag Tag, size_t N, KFR_ENABLE_IF(!std::is_const_v<T>)>
+KFR_INTRINSIC void set_elements(univector<T, Tag>& self, const shape<1>& index, const axis_params<0, N>&,
+ const identity<vec<T, N>>& value)
+{
+ T* data = self.data();
+ write(ptr_cast<T>(data) + index.front(), value);
}
/// @brief Converts an expression to univector
-template <typename Expr, typename T = value_type_of<Expr>>
+template <typename Expr, typename T = expression_value_type<Expr>>
KFR_INTRINSIC univector<T> render(Expr&& expr)
{
+ static_assert(expression_dims<Expr> == 1);
static_assert(!is_infinite<Expr>,
"render: Can't process infinite expressions. Pass size as a second argument to render.");
univector<T> result;
- result.resize(expr.size());
+ result.resize(get_shape(expr).front());
result = expr;
return result;
}
/// @brief Converts an expression to univector
-template <typename Expr, typename T = value_type_of<Expr>>
+template <typename Expr, typename T = expression_value_type<Expr>>
KFR_INTRINSIC univector<T> render(Expr&& expr, size_t size, size_t offset = 0)
{
univector<T> result;
@@ -627,7 +657,7 @@ KFR_INTRINSIC univector<T> render(Expr&& expr, size_t size, size_t offset = 0)
}
/// @brief Converts an expression to univector
-template <typename Expr, size_t Size, typename T = value_type_of<Expr>>
+template <typename Expr, size_t Size, typename T = expression_value_type<Expr>>
KFR_INTRINSIC univector<T, Size> render(Expr&& expr, csize_t<Size>)
{
univector<T, Size> result;
@@ -637,4 +667,28 @@ KFR_INTRINSIC univector<T, Size> render(Expr&& expr, csize_t<Size>)
} // namespace CMT_ARCH_NAME
} // namespace kfr
+namespace cometa
+{
+template <typename T, kfr::univector_tag Tag>
+struct representation<kfr::univector<T, Tag>>
+{
+ using type = std::string;
+ static std::string get(const kfr::univector<T, Tag>& value)
+ {
+ return array_to_string(value.size(), value.data());
+ }
+};
+
+template <char t, int width, int prec, typename T, kfr::univector_tag Tag>
+struct representation<fmt_t<kfr::univector<T, Tag>, t, width, prec>>
+{
+ using type = std::string;
+ static std::string get(const fmt_t<kfr::univector<T, Tag>, t, width, prec>& value)
+ {
+ return array_to_string<fmt_t<T, t, width, prec>>(value.size(), value.data());
+ }
+};
+
+} // namespace cometa
+
CMT_PRAGMA_MSVC(warning(pop))
diff --git a/include/kfr/capi.h b/include/kfr/capi.h
@@ -238,7 +238,7 @@ typedef double kfr_c64;
size_t size);
KFR_API_SPEC void kfr_filter_process_f64(KFR_FILTER_F64* plan, kfr_f64* output, const kfr_f64* input,
size_t size);
-
+
KFR_API_SPEC void kfr_filter_reset_f32(KFR_FILTER_F32* plan);
KFR_API_SPEC void kfr_filter_reset_f64(KFR_FILTER_F64* plan);
diff --git a/include/kfr/cident.h b/include/kfr/cident.h
@@ -306,6 +306,7 @@ extern char* gets(char* __s);
#define CMT_COMPILER_MSVC 1
#define CMT_MSVC_ATTRIBUTES 1
#define CMT_MSC_VER _MSC_VER
+#define CMT_COMPILER_IS_MSVC 1
#else
#define CMT_MSC_VER 0
#endif
@@ -343,31 +344,74 @@ extern char* gets(char* __s);
#endif
#endif
+#if defined _MSC_VER && !defined(__clang__) && !defined(CMT_FORCE_INLINE_MSVC)
+#define CMT_NO_FORCE_INLINE 1
+#endif
+
+#if defined(CMT_COMPILER_INTEL) || defined(CMT_COMPILER_CLANG)
+#ifdef CMT_COMPILER_IS_MSVC
+#undef CMT_COMPILER_IS_MSVC
+#endif
+#endif
+
#if defined(CMT_GNU_ATTRIBUTES)
#define CMT_NODEBUG
-// __attribute__((__nodebug__))
-// GCC 9 broke attributes on lambdas.
-#if defined(NDEBUG) && (!defined(__GNUC__) || __GNUC__ != 9)
+#ifndef CMT_NO_FORCE_INLINE
#define CMT_ALWAYS_INLINE __attribute__((__always_inline__))
#else
#define CMT_ALWAYS_INLINE
#endif
-#define CMT_INLINE __inline__ CMT_ALWAYS_INLINE
-#define CMT_INLINE_MEMBER CMT_ALWAYS_INLINE
+
+#ifdef NDEBUG
+#define CMT_INLINE_IN_RELEASE CMT_ALWAYS_INLINE
+#else
+#define CMT_INLINE_IN_RELEASE
+#endif
+
+#define CMT_INLINE __inline__ CMT_INLINE_IN_RELEASE
+#define CMT_INLINE_MEMBER CMT_INLINE_IN_RELEASE
+#if defined(CMT_COMPILER_GCC) && \
+ (CMT_GCC_VERSION >= 900 && CMT_GCC_VERSION < 904 || CMT_GCC_VERSION >= 1000 && CMT_GCC_VERSION < 1002)
+// Workaround for GCC 9/10 bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90333
+#define CMT_INLINE_LAMBDA
+#else
#define CMT_INLINE_LAMBDA CMT_INLINE_MEMBER
+#endif
#define CMT_NOINLINE __attribute__((__noinline__))
+#ifndef CMT_NO_FORCE_INLINE
#define CMT_FLATTEN __attribute__((__flatten__))
+#else
+#define CMT_FLATTEN
+#endif
#define CMT_RESTRICT __restrict__
+#define CMT_LIKELY(...) __builtin_expect(!!(__VA_ARGS__), 1)
+#define CMT_UNLIKELY(...) __builtin_expect(!!(__VA_ARGS__), 0)
+
#elif defined(CMT_MSVC_ATTRIBUTES)
+#ifndef CMT_NO_FORCE_INLINE
+#if _MSC_VER >= 1927 && _MSVC_LANG >= 202002L
+#define CMT_ALWAYS_INLINE [[msvc::forceinline]]
+#else
#define CMT_ALWAYS_INLINE __forceinline
+#endif
+#else
+#define CMT_ALWAYS_INLINE
+#endif
+
+#ifdef NDEBUG
+#define CMT_INLINE_IN_RELEASE CMT_ALWAYS_INLINE
+#else
+#define CMT_INLINE_IN_RELEASE
+#endif
+
#define CMT_NODEBUG
-#define CMT_INLINE /*inline*/ __forceinline
-#define CMT_INLINE_MEMBER __forceinline
-#if _MSC_VER >= 1927
+#define CMT_INLINE inline CMT_INLINE_IN_RELEASE
+#define CMT_INLINE_MEMBER CMT_INLINE_IN_RELEASE
+#if _MSC_VER >= 1927 && _MSVC_LANG >= 202002L
#define CMT_INLINE_LAMBDA [[msvc::forceinline]]
#else
#define CMT_INLINE_LAMBDA
@@ -376,6 +420,9 @@ extern char* gets(char* __s);
#define CMT_FLATTEN
#define CMT_RESTRICT __restrict
+#define CMT_LIKELY(...) (__VA_ARGS__)
+#define CMT_UNLIKELY(...) (__VA_ARGS__)
+
#endif
#define CMT_INTRINSIC CMT_INLINE CMT_NODEBUG
@@ -426,13 +473,15 @@ extern char* gets(char* __s);
#define CMT_HAS_BUILTIN(builtin) 0
#endif
-#if CMT_HAS_BUILTIN(CMT_ASSUME)
-#define CMT_ASSUME(x) __builtin_assume(x)
-#else
-#define CMT_ASSUME(x) \
+#define CMT_NOOP \
do \
{ \
} while (0)
+
+#if CMT_HAS_BUILTIN(CMT_ASSUME)
+#define CMT_ASSUME(x) __builtin_assume(x)
+#else
+#define CMT_ASSUME(x) CMT_NOOP
#endif
#if CMT_HAS_BUILTIN(CMT_ASSUME)
@@ -552,6 +601,8 @@ extern char* gets(char* __s);
#endif
#endif
+#define CMT_PRAGMA(...) _Pragma(#__VA_ARGS__)
+
#if defined(CMT_GNU_ATTRIBUTES)
#define CMT_FAST_CC __attribute__((fastcall))
#define CMT_UNUSED __attribute__((unused))
@@ -780,4 +831,4 @@ extern char* gets(char* __s);
{ \
__VA_ARGS__ \
}
-#endif
-\ No newline at end of file
+#endif
diff --git a/include/kfr/cometa.hpp b/include/kfr/cometa.hpp
@@ -23,6 +23,7 @@ CMT_PRAGMA_GNU(GCC diagnostic ignored "-Wdeprecated-declarations")
CMT_PRAGMA_MSVC(warning(push))
CMT_PRAGMA_MSVC(warning(disable : 4814))
+CMT_PRAGMA_MSVC(warning(disable : 4308))
CMT_PRAGMA_MSVC(warning(disable : 4014))
namespace cometa
@@ -31,62 +32,50 @@ namespace cometa
using std::ptrdiff_t;
using std::size_t;
-#if __cplusplus >= 201103L || CMT_MSC_VER >= 1900 || CMT_HAS_FEATURE(cxx_constexpr)
-
template <typename T, size_t N>
-constexpr inline static size_t arraysize(const T (&)[N]) CMT_NOEXCEPT
+constexpr CMT_INTRINSIC static size_t arraysize(const T (&)[N]) CMT_NOEXCEPT
{
return N;
}
template <typename T, size_t N>
-constexpr inline static std::integral_constant<size_t, N> carraysize(const T (&)[N]) CMT_NOEXCEPT
+constexpr CMT_INTRINSIC static std::integral_constant<size_t, N> carraysize(const T (&)[N]) CMT_NOEXCEPT
{
return {};
}
-#define CMT_ARRAYSIZE(arr) decltype(carraysize(arr))::value
-#elif CMT_COMPILER_MSVC
-#define CMT_ARRAYSIZE(arr) _countof(arr)
-#elif __cplusplus >= 199711L && \
- (defined(__INTEL_COMPILER) || defined(__clang__) || \
- (defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))))
-template <typename T, size_t N>
-char (&COUNTOF_REQUIRES_ARRAY_ARGUMENT(T (&)[N]))[N];
-#define CMT_ARRAYSIZE(x) sizeof(COUNTOF_REQUIRES_ARRAY_ARGUMENT(x))
-#else
-#define CMT_ARRAYSIZE(arr) sizeof(arr) / sizeof(arr[0])
-#endif
-
using pvoid = void*;
using pconstvoid = const void*;
+#ifdef CMT_CPP17_DEFINITIONS
template <typename...>
using void_t = void;
+#endif
namespace details
{
-constexpr inline bool args_or() { return false; }
+constexpr CMT_INTRINSIC bool args_or() { return false; }
template <typename... Ts>
-constexpr inline bool args_or(bool x, Ts... rest)
+constexpr CMT_INTRINSIC bool args_or(bool x, Ts... rest)
{
return x || args_or(rest...);
}
-constexpr inline bool args_and() { return true; }
+constexpr CMT_INTRINSIC bool args_and() { return true; }
template <typename... Ts>
-constexpr inline bool args_and(bool x, Ts... rest)
+constexpr CMT_INTRINSIC bool args_and(bool x, Ts... rest)
{
return x && args_and(rest...);
}
template <typename T, typename Enable = void>
-struct is_pod_impl : std::false_type
+struct is_pod_like_impl : std::false_type
{
};
template <typename T>
-struct is_pod_impl<T, void_t<decltype(T::is_pod)>> : std::integral_constant<bool, T::is_pod>
+struct is_pod_like_impl<T, std::void_t<decltype(T::is_pod_like)>>
+ : std::integral_constant<bool, T::is_pod_like>
{
};
@@ -114,6 +103,7 @@ struct and_t_impl<T, Ts...> : std::integral_constant<bool, T::value && and_t_imp
constexpr size_t max_size_t = size_t(-1);
+#ifdef CMT_CPP17_DEFINITIONS
template <typename... T>
using common_type = typename std::common_type<T...>::type;
@@ -150,9 +140,6 @@ template <typename T>
using underlying_type = typename std::underlying_type<T>::type;
template <typename T>
-constexpr inline bool is_pod = std::is_pod<T>::value || details::is_pod_impl<T>::value;
-
-template <typename T>
constexpr inline bool is_class = std::is_class<T>::value;
template <typename T>
@@ -200,10 +187,18 @@ constexpr inline bool is_template_arg = std::is_integral<T>::value || std::is_en
template <typename T>
using decay = typename std::decay<T>::type;
+#endif
+
+template <typename T1, typename T2>
+using or_type = std::conditional_t<std::is_same_v<T1, void>, T2, T1>;
+
+template <typename T>
+constexpr inline bool is_pod_like = std::is_pod_v<T> || details::is_pod_like_impl<T>::value;
+
template <typename T1, typename T2 = void, typename... Ts>
constexpr size_t typeindex()
{
- return is_same<T1, T2>() ? 0 : 1 + typeindex<T1, Ts...>();
+ return std::is_same_v<T1, T2>() ? 0 : 1 + typeindex<T1, Ts...>();
}
template <typename T>
@@ -221,7 +216,7 @@ struct compound_type_traits
template <typename U>
using deep_rebind = U;
- CMT_INLINE static constexpr const subtype& at(const T& value, size_t /*index*/) { return value; }
+ CMT_MEM_INTRINSIC static constexpr const subtype& at(const T& value, size_t /*index*/) { return value; }
};
template <typename T>
@@ -232,11 +227,11 @@ constexpr size_t widthof(T)
template <typename T>
constexpr size_t widthof()
{
- return compound_type_traits<decay<T>>::width;
+ return compound_type_traits<std::decay_t<T>>::width;
}
template <typename T>
-constexpr inline bool is_compound = !compound_type_traits<decay<T>>::is_scalar;
+constexpr inline bool is_compound_type = !compound_type_traits<std::decay_t<T>>::is_scalar;
template <typename T>
using subtype = typename compound_type_traits<T>::subtype;
@@ -244,13 +239,6 @@ using subtype = typename compound_type_traits<T>::subtype;
template <typename T>
using deep_subtype = typename compound_type_traits<T>::deep_subtype;
-/*template <typename T, typename SubType>
-using rebind_subtype = typename compound_type_traits<T>::template rebind<SubType>;
-
-template <typename T, typename SubType>
-using deep_rebind = typename compound_type_traits<T>::template deep_rebind<SubType>;
- */
-
template <typename T>
struct compound_type_traits<std::pair<T, T>>
{
@@ -267,7 +255,8 @@ struct compound_type_traits<std::pair<T, T>>
using deep_rebind = std::pair<typename compound_type_traits<subtype>::template deep_rebind<U>,
typename compound_type_traits<subtype>::template deep_rebind<U>>;
- CMT_INLINE static constexpr const subtype& at(const std::pair<subtype, subtype>& value, size_t index)
+ CMT_MEM_INTRINSIC static constexpr const subtype& at(const std::pair<subtype, subtype>& value,
+ size_t index)
{
return index == 0 ? value.first : value.second;
}
@@ -277,35 +266,35 @@ template <typename T, T val>
struct cval_t
{
constexpr static T value = val;
- constexpr cval_t() CMT_NOEXCEPT {}
- constexpr cval_t(const cval_t&) CMT_NOEXCEPT = default;
- constexpr cval_t(cval_t&&) CMT_NOEXCEPT = default;
+ constexpr CMT_MEM_INTRINSIC cval_t() CMT_NOEXCEPT {}
+ constexpr CMT_MEM_INTRINSIC cval_t(const cval_t&) CMT_NOEXCEPT = default;
+ constexpr CMT_MEM_INTRINSIC cval_t(cval_t&&) CMT_NOEXCEPT = default;
typedef T value_type;
typedef cval_t type;
- constexpr operator value_type() const { return value; }
- constexpr value_type operator()() const { return value; }
+ constexpr CMT_MEM_INTRINSIC operator value_type() const { return value; }
+ constexpr CMT_MEM_INTRINSIC value_type operator()() const { return value; }
};
template <typename T, T value>
-constexpr inline T val_of(cval_t<T, value>)
+constexpr CMT_INTRINSIC T val_of(cval_t<T, value>)
{
return value;
}
template <typename T>
-constexpr inline T val_of(T value)
+constexpr CMT_INTRINSIC T val_of(T value)
{
return value;
}
template <typename T>
-constexpr inline bool is_constant_val(T)
+constexpr CMT_INTRINSIC bool is_constant_val(T)
{
return false;
}
template <typename T, T value>
-constexpr inline bool is_constant_val(cval_t<T, value>)
+constexpr CMT_INTRINSIC bool is_constant_val(cval_t<T, value>)
{
return true;
}
@@ -324,7 +313,7 @@ struct is_inheritable_impl : std::false_type
};
template <typename T>
-struct is_inheritable_impl<T, void_t<inherit<T>>> : std::true_type
+struct is_inheritable_impl<T, std::void_t<inherit<T>>> : std::true_type
{
};
@@ -402,33 +391,33 @@ struct get_nth_type<index>
template <typename T, T... values>
struct cvals_t
{
- constexpr cvals_t() CMT_NOEXCEPT = default;
+ constexpr CMT_MEM_INTRINSIC cvals_t() CMT_NOEXCEPT = default;
using type = cvals_t<T, values...>;
- constexpr static size_t size() { return sizeof...(values); }
+ constexpr CMT_MEM_INTRINSIC static size_t size() { return sizeof...(values); }
template <size_t index>
- constexpr T operator[](csize_t<index>) const
+ constexpr CMT_MEM_INTRINSIC T operator[](csize_t<index>) const
{
return get(csize_t<index>());
}
template <size_t index>
- constexpr static T get(csize_t<index> = csize_t<index>())
+ constexpr CMT_MEM_INTRINSIC static T get(csize_t<index> = csize_t<index>())
{
return details::get_nth<index, T, values...>::value;
}
- constexpr static T front() { return get(csize_t<0>()); }
- constexpr static T back() { return get(csize_t<size() - 1>()); }
+ constexpr CMT_MEM_INTRINSIC static T front() { return get(csize_t<0>()); }
+ constexpr CMT_MEM_INTRINSIC static T back() { return get(csize_t<size() - 1>()); }
- static const T* begin() { return array(); }
- static const T* end() { return array() + size(); }
+ static CMT_MEM_INTRINSIC const T* begin() { return array(); }
+ static CMT_MEM_INTRINSIC const T* end() { return array() + size(); }
- static const T* array()
+ static CMT_MEM_INTRINSIC const T* array()
{
static const T arr[] = { values... };
return &arr[0];
}
template <size_t... indices>
- constexpr cvals_t<T, details::get_nth_e<indices, type>::value...> operator[](
+ constexpr CMT_MEM_INTRINSIC cvals_t<T, details::get_nth_e<indices, type>::value...> operator[](
cvals_t<size_t, indices...>) const
{
// static_assert(sizeof(T)==0, "+++++++++++++++++++++++++++++");
@@ -437,20 +426,20 @@ struct cvals_t
// MSVC requires static_cast<T> here:
template <typename Fn>
- constexpr auto map(Fn&&) const -> cvals_t<T, static_cast<T>(Fn()(values))...>
+ constexpr CMT_MEM_INTRINSIC auto map(Fn&&) const -> cvals_t<T, static_cast<T>(Fn()(values))...>
{
return {};
}
- constexpr bool equal(cvals_t<T, values...>) const noexcept { return true; }
+ constexpr CMT_MEM_INTRINSIC bool equal(cvals_t<T, values...>) const noexcept { return true; }
template <T... values2>
- constexpr bool equal(cvals_t<T, values2...>) const noexcept
+ constexpr CMT_MEM_INTRINSIC bool equal(cvals_t<T, values2...>) const noexcept
{
return false;
}
template <T... values2>
- constexpr bool notequal(cvals_t<T, values...> ind) const noexcept
+ constexpr CMT_MEM_INTRINSIC bool notequal(cvals_t<T, values...> ind) const noexcept
{
return !equal(ind);
}
@@ -460,11 +449,18 @@ template <typename T>
struct cvals_t<T>
{
using type = cvals_t<T>;
- constexpr static size_t size() { return 0; }
+ constexpr CMT_MEM_INTRINSIC static size_t size() { return 0; }
- static const T* array() { return nullptr; }
+ static CMT_MEM_INTRINSIC const T* array() { return nullptr; }
};
+template <typename T, bool... flags, T... values1, T... values2>
+constexpr cvals_t<T, (flags ? values1 : values2)...> select(cvals_t<bool, flags...>, cvals_t<T, values1...>,
+ cvals_t<T, values2...>)
+{
+ return {};
+}
+
namespace details
{
template <size_t index, typename T, T... vals>
@@ -495,25 +491,25 @@ template <size_t... values>
using elements_t = cvals_t<size_t, values...>;
template <typename T>
-constexpr inline T csum(cvals_t<T> = cvals_t<T>())
+constexpr CMT_INTRINSIC T csum(cvals_t<T> = cvals_t<T>())
{
return 0;
}
template <typename T, T first, T... rest>
-constexpr inline T csum(cvals_t<T, first, rest...> = cvals_t<T, first, rest...>())
+constexpr CMT_INTRINSIC T csum(cvals_t<T, first, rest...> = cvals_t<T, first, rest...>())
{
return first + csum(cvals_t<T, rest...>());
}
template <typename T>
-constexpr inline T cprod(cvals_t<T>)
+constexpr CMT_INTRINSIC T cprod(cvals_t<T>)
{
return 1;
}
template <typename T, T first, T... rest>
-constexpr inline T cprod(cvals_t<T, first, rest...>)
+constexpr CMT_INTRINSIC T cprod(cvals_t<T, first, rest...>)
{
return first * cprod(cvals_t<T, rest...>());
}
@@ -574,6 +570,7 @@ struct concat_impl<T1, T2, T3, Ts...>
using type = typename concat_impl<typename concat_impl<T1, T2>::type, T3, Ts...>::type;
};
+#ifdef CMT_CPP17_DEFINITIONS
template <typename Fn, typename Args, typename enable = void>
struct is_invocable_impl : std::false_type
{
@@ -594,19 +591,22 @@ template <typename Ret, typename Fn, typename... Args>
struct is_invocable_r_impl<Ret, Fn, ctypes_t<Args...>,
void_t<decltype(std::declval<Fn>()(std::declval<Args>()...))>>
{
- static constexpr bool value = is_convertible<decltype(std::declval<Fn>()(std::declval<Args>()...)), Ret>;
+ static constexpr bool value =
+ std::is_convertible_v<decltype(std::declval<Fn>()(std::declval<Args>()...)), Ret>;
};
+#endif
} // namespace details
template <typename T1, typename... Ts>
-using concat_lists = typename details::concat_impl<decay<T1>, decay<Ts>...>::type;
+using concat_lists = typename details::concat_impl<std::decay_t<T1>, std::decay_t<Ts>...>::type;
template <typename T1, typename... Ts>
-constexpr inline concat_lists<T1, Ts...> cconcat(T1, Ts...)
+constexpr CMT_INTRINSIC concat_lists<T1, Ts...> cconcat(T1, Ts...)
{
return {};
}
+#ifdef CMT_CPP17_DEFINITIONS
#ifdef __cpp_lib_is_invocable
template <typename Fn, typename... Args>
constexpr inline bool is_invocable = std::is_invocable<Fn, Args...>::value;
@@ -620,6 +620,7 @@ constexpr inline bool is_invocable = details::is_invocable_impl<Fn, ctypes_t<Arg
template <typename Ret, typename Fn, typename... Args>
constexpr inline bool is_invocable_r = details::is_invocable_r_impl<Ret, Fn, ctypes_t<Args...>>::value;
#endif
+#endif
namespace details
{
@@ -661,7 +662,7 @@ template <typename T, T value, T... values, bool flag, bool... flags>
struct filter_impl<cvals_t<T, value, values...>, cvals_t<bool, flag, flags...>>
{
using filtered = typename filter_impl<cvals_t<T, values...>, cvals_t<bool, flags...>>::type;
- using type = conditional<flag, concat_lists<cvals_t<T, value>, filtered>, filtered>;
+ using type = std::conditional_t<flag, concat_lists<cvals_t<T, value>, filtered>, filtered>;
};
} // namespace details
@@ -672,11 +673,11 @@ template <typename Fn>
using function_result = typename details::function_arguments_impl<decltype(&Fn::operator())>::result;
template <typename T1, typename T2>
-using cfilter_t = typename details::filter_impl<decay<T1>, decay<T2>>::type;
+using cfilter_t = typename details::filter_impl<std::decay_t<T1>, std::decay_t<T2>>::type;
template <typename T, T... vals, bool... flags,
typename Ret = cfilter_t<cvals_t<T, vals...>, cvals_t<bool, flags...>>>
-constexpr inline Ret cfilter(cvals_t<T, vals...>, cvals_t<bool, flags...>)
+constexpr CMT_INTRINSIC Ret cfilter(cvals_t<T, vals...>, cvals_t<bool, flags...>)
{
return Ret{};
}
@@ -684,12 +685,12 @@ constexpr inline Ret cfilter(cvals_t<T, vals...>, cvals_t<bool, flags...>)
#define CMT_UN_OP(op) \
template <typename T1, T1... vals1, \
typename Ret = cvals_t<decltype(op std::declval<T1>()), (op vals1)...>> \
- constexpr inline Ret operator op(cvals_t<T1, vals1...>) \
+ constexpr CMT_INTRINSIC Ret operator op(cvals_t<T1, vals1...>) \
{ \
return Ret{}; \
} \
template <typename T1, T1 val1, typename Ret = cval_t<decltype(op std::declval<T1>()), (op val1)>> \
- constexpr inline Ret operator op(cval_t<T1, val1>) \
+ constexpr CMT_INTRINSIC Ret operator op(cval_t<T1, val1>) \
{ \
return Ret{}; \
}
@@ -698,25 +699,25 @@ constexpr inline Ret cfilter(cvals_t<T, vals...>, cvals_t<bool, flags...>)
template <typename T1, T1... vals1, typename T2, T2... vals2, \
typename Ret = \
cvals_t<decltype(std::declval<T1>() op std::declval<T2>()), (vals1 op vals2)...>> \
- constexpr inline Ret operator op(cvals_t<T1, vals1...>, cvals_t<T2, vals2...>) \
+ constexpr CMT_INTRINSIC Ret operator op(cvals_t<T1, vals1...>, cvals_t<T2, vals2...>) \
{ \
return Ret{}; \
} \
template <typename T1, T1... vals1, typename T2, T2 val2, \
typename Ret = \
cvals_t<decltype(std::declval<T1>() op std::declval<T2>()), (vals1 op val2)...>> \
- constexpr inline Ret operator op(cvals_t<T1, vals1...>, cval_t<T2, val2>) \
+ constexpr CMT_INTRINSIC Ret operator op(cvals_t<T1, vals1...>, cval_t<T2, val2>) \
{ \
return Ret{}; \
} \
template <typename T1, T1 val1, typename T2, T2... vals2, \
typename Ret = \
cvals_t<decltype(std::declval<T1>() op std::declval<T2>()), (val1 op vals2)...>> \
- constexpr inline Ret operator op(cval_t<T1, val1>, cvals_t<T2, vals2...>) \
+ constexpr CMT_INTRINSIC Ret operator op(cval_t<T1, val1>, cvals_t<T2, vals2...>) \
{ \
return Ret{}; \
}
-
+
// clang-format off
CMT_UN_OP(-)
CMT_UN_OP(+)
@@ -743,7 +744,6 @@ CMT_BIN_OP(|)
CMT_BIN_OP(^)
// clang-format on
-
namespace details
{
@@ -799,14 +799,14 @@ template <typename... List>
using indicesfor_t = cvalseq_t<size_t, sizeof...(List), 0>;
template <size_t group, size_t... indices, size_t N = group * sizeof...(indices)>
-constexpr inline auto scale(csizes_t<indices...>) CMT_NOEXCEPT
+constexpr CMT_INTRINSIC auto scale(csizes_t<indices...>) CMT_NOEXCEPT
{
using Tlist = typename details::concat_impl<csizeseq_t<group, group * indices>...>::type;
return Tlist{};
}
template <size_t group, size_t... indices, size_t N = group * sizeof...(indices)>
-constexpr inline auto scale() CMT_NOEXCEPT
+constexpr CMT_INTRINSIC auto scale() CMT_NOEXCEPT
{
using Tlist = typename details::concat_impl<csizeseq_t<group, group * indices>...>::type;
return Tlist{};
@@ -815,34 +815,35 @@ constexpr inline auto scale() CMT_NOEXCEPT
namespace details
{
-template <typename Ret, typename T, typename enable = void_t<>>
+template <typename Ret, typename T, typename enable = std::void_t<>>
struct is_returning_type_impl : std::false_type
{
};
template <typename Ret, typename Fn, typename... Args>
-struct is_returning_type_impl<Ret, Fn(Args...), void_t<invoke_result<Fn, Args...>>>
- : std::is_same<Ret, invoke_result<Fn, Args...>>
+struct is_returning_type_impl<Ret, Fn(Args...), std::void_t<std::invoke_result_t<Fn, Args...>>>
+ : std::is_same<Ret, std::invoke_result_t<Fn, Args...>>
{
};
-template <typename Fn, typename Args, typename enable = void_t<>>
+template <typename Fn, typename Args, typename enable = std::void_t<>>
struct is_callable_impl : std::false_type
{
};
template <typename Fn, typename... Args>
-struct is_callable_impl<Fn, ctypes_t<Args...>, void_t<invoke_result<Fn, Args...>>> : std::true_type
+struct is_callable_impl<Fn, ctypes_t<Args...>, std::void_t<std::invoke_result_t<Fn, Args...>>>
+ : std::true_type
{
};
-template <typename T, typename enable = void_t<>>
+template <typename T, typename enable = std::void_t<>>
struct is_enabled_impl : std::true_type
{
};
template <typename Fn>
-struct is_enabled_impl<Fn, void_t<decltype(Fn::disabled)>> : std::integral_constant<bool, !Fn::disabled>
+struct is_enabled_impl<Fn, std::void_t<decltype(Fn::disabled)>> : std::integral_constant<bool, !Fn::disabled>
{
};
@@ -873,80 +874,84 @@ struct unique_enum_impl
template <typename T>
constexpr inline bool is_enabled = details::is_enabled_impl<T>::value;
+#ifdef CMT_CPP17_DEFINITIONS
+
template <typename Fn, typename... Args>
constexpr inline bool is_callable = details::is_callable_impl<Fn, ctypes_t<Args...>>::value;
template <typename Ret, typename T>
constexpr inline bool is_returning_type = details::is_returning_type_impl<Ret, T>::value;
+#endif
+
namespace details
{
-template <typename Fn, CMT_ENABLE_IF(is_callable<Fn()>)>
-inline auto call_if_callable(Fn&& fn)
+template <typename Fn, CMT_ENABLE_IF(std::is_invocable_v<Fn>)>
+CMT_INTRINSIC auto call_if_callable(Fn&& fn)
{
return fn();
}
-template <typename Fn, CMT_ENABLE_IF(!is_callable<Fn()>)>
-inline auto call_if_callable(Fn&& fn)
+template <typename Fn, CMT_ENABLE_IF(!std::is_invocable_v<Fn>)>
+CMT_INTRINSIC auto call_if_callable(Fn&& fn)
{
return std::forward<Fn>(fn);
}
} // namespace details
template <typename Fn, typename... Args>
-inline auto bind_func(Fn&& fn, Args&&... args)
+CMT_INTRINSIC auto bind_func(Fn&& fn, Args&&... args)
{
return [=]() CMT_INLINE_LAMBDA { return fn(details::call_if_callable(std::forward<Args>(args))...); };
}
template <typename T>
-constexpr inline bool is_even(T x)
+constexpr CMT_INTRINSIC bool is_even(T x)
{
return (x % 2) == 0;
}
template <typename T>
-constexpr inline bool is_odd(T x)
+constexpr CMT_INTRINSIC bool is_odd(T x)
{
return !is_even(x);
}
template <typename T>
-constexpr inline bool is_poweroftwo(T x)
+constexpr CMT_INTRINSIC bool is_poweroftwo(T x)
{
return ((x != 0) && !(x & (x - 1)));
}
template <typename T>
-constexpr inline unsigned ilog2(T n, unsigned p = 0)
+constexpr CMT_INTRINSIC unsigned ilog2(T n, unsigned p = 0)
{
return (n <= 1) ? p : ilog2(n / 2, p + 1);
}
/// @brief Returns a nearest power of two that is greater or equal than n
template <typename T>
-constexpr inline T next_poweroftwo(T n)
+constexpr CMT_INTRINSIC T next_poweroftwo(T n)
{
return n > 2 ? T(1) << (ilog2(n - 1) + 1) : n;
}
/// @brief Returns a nearest power of two that is less or equal than n
template <typename T>
-constexpr inline T prev_poweroftwo(T n)
+constexpr CMT_INTRINSIC T prev_poweroftwo(T n)
{
return n > 2 ? T(1) << (ilog2(n)) : n;
}
template <typename T>
-constexpr inline bool is_divisible(T x, T divisor)
+constexpr CMT_INTRINSIC bool is_divisible(T x, T divisor)
{
return x % divisor == 0;
}
/// @brief Greatest common divisor
template <typename T>
-constexpr inline T gcd(T a)
+constexpr CMT_INTRINSIC T gcd(T a)
{
return a;
}
@@ -960,33 +965,33 @@ constexpr inline T gcd(T a, T b)
/// @brief Greatest common divisor
template <typename T, typename... Ts>
-constexpr inline T gcd(T a, T b, T c, Ts... rest)
+constexpr CMT_INTRINSIC T gcd(T a, T b, T c, Ts... rest)
{
return gcd(a, gcd(b, c, rest...));
}
/// @brief Least common multiple
template <typename T>
-constexpr inline T lcm(T a)
+constexpr CMT_INTRINSIC T lcm(T a)
{
return a;
}
/// @brief Least common multiple
template <typename T>
-constexpr inline T lcm(T a, T b)
+constexpr CMT_INTRINSIC T lcm(T a, T b)
{
return a * b / gcd(a, b);
}
/// @brief Least common multiple
template <typename T, typename... Ts>
-constexpr inline T lcm(T a, T b, T c, Ts... rest)
+constexpr CMT_INTRINSIC T lcm(T a, T b, T c, Ts... rest)
{
return lcm(a, lcm(b, c, rest...));
}
-inline std::lldiv_t floor_div(long long a, long long b)
+CMT_INTRINSIC std::lldiv_t floor_div(long long a, long long b)
{
std::lldiv_t d = std::lldiv(a, b);
if (d.rem < 0)
@@ -1000,68 +1005,75 @@ inline std::lldiv_t floor_div(long long a, long long b)
namespace details
{
-template <size_t bits>
-struct float_type_impl;
-template <size_t bits>
-struct int_type_impl;
-template <size_t bits>
-struct unsigned_type_impl;
+template <typename T>
+constexpr inline char typekind = std::is_floating_point_v<T> ? 'f'
+ : std::is_integral_v<T> ? (std::is_unsigned_v<T> ? 'u' : 'i')
+ : '?';
+
+template <char kind, size_t bits>
+struct bits_to_type_impl;
template <>
-struct float_type_impl<32>
+struct bits_to_type_impl<'f', 32>
{
using type = float;
static_assert(sizeof(type) * 8 == 32, "float must represent IEEE single precision value");
};
template <>
-struct float_type_impl<64>
+struct bits_to_type_impl<'f', 64>
{
using type = double;
static_assert(sizeof(type) * 8 == 64, "double must represent IEEE double precision value");
};
template <>
-struct int_type_impl<8>
+struct bits_to_type_impl<'i', 8>
{
using type = std::int8_t;
};
template <>
-struct int_type_impl<16>
+struct bits_to_type_impl<'i', 16>
{
using type = std::int16_t;
};
template <>
-struct int_type_impl<32>
+struct bits_to_type_impl<'i', 32>
{
using type = std::int32_t;
};
template <>
-struct int_type_impl<64>
+struct bits_to_type_impl<'i', 64>
{
using type = std::int64_t;
};
template <>
-struct unsigned_type_impl<8>
+struct bits_to_type_impl<'u', 8>
{
using type = std::uint8_t;
};
template <>
-struct unsigned_type_impl<16>
+struct bits_to_type_impl<'u', 16>
{
using type = std::uint16_t;
};
template <>
-struct unsigned_type_impl<32>
+struct bits_to_type_impl<'u', 32>
{
using type = std::uint32_t;
};
template <>
-struct unsigned_type_impl<64>
+struct bits_to_type_impl<'u', 64>
{
using type = std::uint64_t;
};
+template <char kind, size_t bits>
+using bits_to_type = typename bits_to_type_impl<kind, bits>::type;
+
+template <char kind, size_t bytes>
+using bytes_to_type = typename bits_to_type_impl<kind, bytes * 8>::type;
+
template <int64_t min, int64_t max, typename... Types>
struct findinttype_impl
{
@@ -1069,8 +1081,9 @@ struct findinttype_impl
template <int64_t min, int64_t max, typename T, typename... Types>
struct findinttype_impl<min, max, T, Types...>
{
- using type = conditional<(std::numeric_limits<T>::min() <= min && std::numeric_limits<T>::max() >= max),
- T, typename findinttype_impl<min, max, Types...>::type>;
+ using type =
+ std::conditional_t<(std::numeric_limits<T>::min() <= min && std::numeric_limits<T>::max() >= max), T,
+ typename findinttype_impl<min, max, Types...>::type>;
};
template <int64_t min, int64_t max>
struct findinttype_impl<min, max>
@@ -1085,21 +1098,29 @@ using is_number_impl =
} // namespace details
template <size_t bits>
-using float_type = typename details::float_type_impl<bits>::type;
+using float_type = typename details::bits_to_type_impl<'f', bits>::type;
template <size_t bits>
-using int_type = typename details::int_type_impl<bits>::type;
+using int_type = typename details::bits_to_type_impl<'i', bits>::type;
template <size_t bits>
-using unsigned_type = typename details::unsigned_type_impl<bits>::type;
+using unsigned_type = typename details::bits_to_type_impl<'u', bits>::type;
template <int64_t min, int64_t max>
using findinttype = typename details::findinttype_impl<min, max, uint8_t, int8_t, uint16_t, int16_t, uint32_t,
int32_t, uint64_t, int64_t>::type;
template <typename T>
-constexpr inline bool is_number = details::is_number_impl<decay<T>>::value;
+constexpr inline bool is_number = details::is_number_impl<std::decay_t<T>>::value;
+
+template <typename... Ts>
+constexpr inline bool is_numbers = (details::is_number_impl<std::decay_t<Ts>>::value && ...);
+
+/// @brief Check if the type argument is a number or a vector of numbers
+template <typename T>
+constexpr inline bool is_numeric = is_number<deep_subtype<T>>;
+/// @brief Check if the type arguments are a numbers or a vectors of numbers
template <typename... Ts>
-constexpr inline bool is_numbers = (details::is_number_impl<decay<Ts>>::value && ...);
+constexpr inline bool is_numeric_args = (is_numeric<Ts> && ...);
namespace details
{
@@ -1144,7 +1165,7 @@ struct carray<T, 1>
CMT_MEM_INTRINSIC constexpr carray() CMT_NOEXCEPT = default;
CMT_MEM_INTRINSIC constexpr carray(T val) CMT_NOEXCEPT : val(val) {}
- template <typename Fn, size_t index = 0, CMT_ENABLE_IF(is_callable<Fn, csize_t<index>>)>
+ template <typename Fn, size_t index = 0, CMT_ENABLE_IF(std::is_invocable_v<Fn, csize_t<index>>)>
CMT_MEM_INTRINSIC constexpr carray(Fn&& fn, csize_t<index> = csize_t<index>{}) CMT_NOEXCEPT
: val(static_cast<T>(fn(csize_t<index>())))
{
@@ -1383,7 +1404,8 @@ struct has_begin_end_impl : std::false_type
};
template <typename T>
-struct has_begin_end_impl<T, void_t<decltype(std::declval<T>().begin()), decltype(std::declval<T>().end())>>
+struct has_begin_end_impl<T,
+ std::void_t<decltype(std::declval<T>().begin()), decltype(std::declval<T>().end())>>
: std::true_type
{
};
@@ -1394,7 +1416,7 @@ struct has_value_type_impl : std::false_type
};
template <typename T>
-struct has_value_type_impl<T, void_t<typename T::value_type>> : std::true_type
+struct has_value_type_impl<T, std::void_t<typename T::value_type>> : std::true_type
{
};
@@ -1404,7 +1426,8 @@ struct has_data_size_impl : std::false_type
};
template <typename T>
-struct has_data_size_impl<T, void_t<decltype(std::declval<T>().size()), decltype(std::declval<T>().data())>>
+struct has_data_size_impl<T,
+ std::void_t<decltype(std::declval<T>().size()), decltype(std::declval<T>().data())>>
: std::true_type
{
};
@@ -1416,20 +1439,20 @@ struct value_type_impl
};
template <typename T, typename Fallback>
-struct value_type_impl<T, Fallback, void_t<typename T::value_type>>
+struct value_type_impl<T, Fallback, std::void_t<typename T::value_type>>
{
using type = typename T::value_type;
};
} // namespace details
template <typename T>
-constexpr inline bool has_begin_end = details::has_begin_end_impl<decay<T>>::value;
+constexpr inline bool has_begin_end = details::has_begin_end_impl<std::decay_t<T>>::value;
template <typename T>
-constexpr inline bool has_data_size = details::has_data_size_impl<decay<T>>::value;
+constexpr inline bool has_data_size = details::has_data_size_impl<std::decay_t<T>>::value;
template <typename T>
-using value_type_of = typename decay<T>::value_type;
+using value_type_of = typename std::decay_t<T>::value_type;
#ifndef CMT_COMPILER_CLANG
namespace details
@@ -1595,46 +1618,46 @@ CMT_INTRINSIC decltype(auto) cswitch(cvals_t<T, v0, values...>, identity<T> valu
namespace details
{
template <typename T, typename Fn1, typename Fn2, typename... Fns>
-inline decltype(auto) cmatch_impl(T&& value, Fn1&& first, Fn2&& second, Fns&&... rest);
+CMT_INTRINSIC decltype(auto) cmatch_impl(T&& value, Fn1&& first, Fn2&& second, Fns&&... rest);
template <typename T, typename Fn, typename... Ts>
-inline decltype(auto) cmatch_impl(T&& value, Fn&& last);
+CMT_INTRINSIC decltype(auto) cmatch_impl(T&& value, Fn&& last);
template <typename T, typename Fn, typename... Fns>
-inline decltype(auto) cmatch_impl2(cbool_t<true>, T&& value, Fn&& fn, Fns&&...)
+CMT_INTRINSIC decltype(auto) cmatch_impl2(cbool_t<true>, T&& value, Fn&& fn, Fns&&...)
{
return fn(std::forward<T>(value));
}
template <typename T, typename Fn, typename... Fns>
-inline decltype(auto) cmatch_impl2(cbool_t<false>, T&& value, Fn&&, Fns&&... rest)
+CMT_INTRINSIC decltype(auto) cmatch_impl2(cbool_t<false>, T&& value, Fn&&, Fns&&... rest)
{
return cmatch_impl(std::forward<T>(value), std::forward<Fns>(rest)...);
}
template <typename T, typename Fn1, typename Fn2, typename... Fns>
-inline decltype(auto) cmatch_impl(T&& value, Fn1&& first, Fn2&& second, Fns&&... rest)
+CMT_INTRINSIC decltype(auto) cmatch_impl(T&& value, Fn1&& first, Fn2&& second, Fns&&... rest)
{
using first_arg = typename function_arguments<Fn1>::template nth<0>;
- constexpr bool is_same = cometa::is_same<decay<T>, decay<first_arg>>;
+ constexpr bool is_same = std::is_same_v<std::decay_t<T>, std::decay_t<first_arg>>;
return cmatch_impl2(cbool_t<is_same>(), std::forward<T>(value), std::forward<Fn1>(first),
std::forward<Fn2>(second), std::forward<Fns>(rest)...);
}
template <typename T, typename Fn, typename... Ts>
-inline decltype(auto) cmatch_impl(T&& value, Fn&& last)
+CMT_INTRINSIC decltype(auto) cmatch_impl(T&& value, Fn&& last)
{
return last(std::forward<T>(value));
}
} // namespace details
template <typename T, typename Fn, typename... Args>
-inline decltype(auto) cmatch(T&& value, Fn&& fn, Args... args)
+CMT_INTRINSIC decltype(auto) cmatch(T&& value, Fn&& fn, Args... args)
{
return details::cmatch_impl(std::forward<T>(value), std::forward<Fn>(fn), std::forward<Args>(args)...);
}
template <typename T, T... values>
-inline size_t cfind(cvals_t<T, values...>, identity<T> value)
+CMT_INTRINSIC size_t cfind(cvals_t<T, values...>, identity<T> value)
{
static constexpr T temp[] = { values... };
static constexpr size_t size = sizeof...(values);
@@ -1647,7 +1670,7 @@ inline size_t cfind(cvals_t<T, values...>, identity<T> value)
}
template <typename Fn, typename... Args>
-CMT_UNUSED CMT_NOINLINE static invoke_result<Fn, Args...> noinline(Fn&& fn, Args&&... args)
+CMT_UNUSED CMT_NOINLINE static std::invoke_result_t<Fn, Args...> noinline(Fn&& fn, Args&&... args)
{
return fn(std::forward<Args>(args)...);
}
@@ -1656,7 +1679,7 @@ template <typename Fn>
struct fn_noinline
{
template <typename... Args>
- CMT_MEM_INTRINSIC invoke_result<Fn, Args...> operator()(Args&&... args) const
+ CMT_MEM_INTRINSIC std::invoke_result_t<Fn, Args...> operator()(Args&&... args) const
{
return noinline(Fn{}, std::forward<Args>(args)...);
}
@@ -1670,13 +1693,13 @@ CMT_INTRINSIC NonMemFn make_nonmember(const Fn&)
}
template <typename T>
-constexpr inline T choose_const()
+constexpr CMT_INTRINSIC T choose_const()
{
static_assert(sizeof(T) != 0, "T not found in the list of template arguments");
return T();
}
template <typename T, typename C1>
-constexpr inline T choose_const_fallback(C1 c1)
+constexpr CMT_INTRINSIC T choose_const_fallback(C1 c1)
{
return static_cast<T>(c1);
}
@@ -1688,21 +1711,21 @@ constexpr inline T choose_const_fallback(C1 c1)
* CHECK( choose_const<f64>( 32.0f, 64.0 ) == 64.0 );
* @endcode
*/
-template <typename T, typename C1, typename... Cs, CMT_ENABLE_IF(is_same<T, C1>)>
-constexpr inline T choose_const(C1 c1, Cs...)
+template <typename T, typename C1, typename... Cs, CMT_ENABLE_IF(std::is_same_v<T, C1>)>
+constexpr CMT_INTRINSIC T choose_const(C1 c1, Cs...)
{
return static_cast<T>(c1);
}
-template <typename T, typename C1, typename... Cs, CMT_ENABLE_IF(!is_same<T, C1>)>
-constexpr inline T choose_const(C1, Cs... constants)
+template <typename T, typename C1, typename... Cs, CMT_ENABLE_IF(!std::is_same_v<T, C1>)>
+constexpr CMT_INTRINSIC T choose_const(C1, Cs... constants)
{
return choose_const<T>(constants...);
}
template <typename T, typename C1, typename... Cs>
-constexpr inline T choose_const_fallback(C1 c1, Cs... constants)
+constexpr CMT_INTRINSIC T choose_const_fallback(C1 c1, Cs... constants)
{
- return is_same<T, C1> ? static_cast<T>(c1) : choose_const_fallback<T>(constants...);
+ return std::is_same_v<T, C1> ? static_cast<T>(c1) : choose_const_fallback<T>(constants...);
}
template <typename Tfrom>
@@ -1732,7 +1755,7 @@ struct signed_type_impl
using type = T;
};
template <typename T>
-struct signed_type_impl<T, void_t<enable_if<is_unsigned<T>>>>
+struct signed_type_impl<T, std::void_t<std::enable_if_t<std::is_unsigned_v<T>>>>
{
using type = findinttype<std::numeric_limits<T>::min(), std::numeric_limits<T>::max()>;
};
@@ -1742,38 +1765,38 @@ template <typename T>
using signed_type = typename details::signed_type_impl<T>::type;
template <typename T>
-constexpr inline T align_down(T x, identity<T> alignment)
+constexpr CMT_INTRINSIC T align_down(T x, identity<T> alignment)
{
return (x) & ~(alignment - 1);
}
template <typename T>
-constexpr inline T* align_down(T* x, size_t alignment)
+constexpr CMT_INTRINSIC T* align_down(T* x, size_t alignment)
{
return reinterpret_cast<T*>(align_down(reinterpret_cast<size_t>(x), alignment));
}
template <typename T>
-constexpr inline T align_up(T x, identity<T> alignment)
+constexpr CMT_INTRINSIC T align_up(T x, identity<T> alignment)
{
return (x + alignment - 1) & ~(alignment - 1);
}
template <typename T>
-constexpr inline T* align_up(T* x, size_t alignment)
+constexpr CMT_INTRINSIC T* align_up(T* x, size_t alignment)
{
return reinterpret_cast<T*>(align_up(reinterpret_cast<size_t>(x), alignment));
}
template <typename T>
-constexpr inline T* advance(T* x, ptrdiff_t offset)
+constexpr CMT_INTRINSIC T* advance(T* x, ptrdiff_t offset)
{
return x + offset;
}
-constexpr inline void* advance(void* x, ptrdiff_t offset)
+constexpr CMT_INTRINSIC void* advance(void* x, ptrdiff_t offset)
{
return advance(static_cast<unsigned char*>(x), offset);
}
-constexpr inline ptrdiff_t distance(const void* x, const void* y)
+constexpr CMT_INTRINSIC ptrdiff_t distance(const void* x, const void* y)
{
return static_cast<const unsigned char*>(x) - static_cast<const unsigned char*>(y);
}
@@ -1834,20 +1857,20 @@ CMT_INTRINSIC constexpr static T implicit_cast(U&& value)
namespace details
{
template <size_t start, size_t count>
-constexpr std::true_type test_sequence(csizeseq_t<count, start>)
+constexpr CMT_INTRINSIC std::true_type test_sequence(csizeseq_t<count, start>)
{
return {};
}
template <size_t, size_t>
-constexpr std::false_type test_sequence(...)
+constexpr CMT_INTRINSIC std::false_type test_sequence(...)
{
return {};
}
} // namespace details
template <size_t number, size_t... numbers>
-constexpr bool is_sequence(csizes_t<number, numbers...>)
+constexpr CMT_INTRINSIC bool is_sequence(csizes_t<number, numbers...>)
{
return details::test_sequence<number, 1 + sizeof...(numbers)>(csizes_t<number, numbers...>()).value;
}
@@ -1920,36 +1943,48 @@ constexpr cvalseq_t<unsigned, size, start, step> cuintseq{};
template <typename... List>
constexpr indicesfor_t<List...> indicesfor{};
-// Workaround for GCC 4.8
template <typename T>
-constexpr conditional<is_scalar<T>, T, const T&> const_max(const T& x, const T& y)
+constexpr CMT_INTRINSIC T const_max(T x)
{
- return x > y ? x : y;
+ return x;
+}
+template <typename T1, typename T2, typename... Ts>
+constexpr CMT_INTRINSIC std::common_type_t<T1, T2, Ts...> const_max(T1 x, T2 y, Ts... z)
+{
+ auto yz = const_max(y, z...);
+ return x > yz ? x : yz;
}
+
template <typename T>
-constexpr conditional<is_scalar<T>, T, const T&> const_min(const T& x, const T& y)
+constexpr CMT_INTRINSIC T const_min(T x)
{
- return x < y ? x : y;
+ return x;
+}
+template <typename T1, typename T2, typename... Ts>
+constexpr CMT_INTRINSIC std::common_type_t<T1, T2, Ts...> const_min(T1 x, T2 y, Ts... z)
+{
+ auto yz = const_min(y, z...);
+ return x < yz ? x : yz;
}
template <typename T>
-constexpr T cminof(cvals_t<T>)
+constexpr CMT_INTRINSIC T cminof(cvals_t<T>)
{
return std::numeric_limits<T>::max();
}
template <typename T, T val, T... vals>
-constexpr T cminof(cvals_t<T, val, vals...>)
+constexpr CMT_INTRINSIC T cminof(cvals_t<T, val, vals...>)
{
T m = cminof(cvals<T, vals...>);
return val < m ? val : m;
}
template <typename T>
-constexpr T cmaxof(cvals_t<T>)
+constexpr CMT_INTRINSIC T cmaxof(cvals_t<T>)
{
return std::numeric_limits<T>::min();
}
template <typename T, T val, T... vals>
-constexpr T cmaxof(cvals_t<T, val, vals...>)
+constexpr CMT_INTRINSIC T cmaxof(cvals_t<T, val, vals...>)
{
T m = cmaxof(cvals<T, vals...>);
return val > m ? val : m;
@@ -2049,17 +2084,19 @@ using overload_generic = overload_priority<0>;
#define CMT_GEN_LIST(c, m, ...) CMT_GEN_LIST##c(m, __VA_ARGS__)
template <typename Tout, typename Tin>
-CMT_INLINE Tout bitcast_anything(const Tin& in)
+CMT_INTRINSIC Tout bitcast_anything(const Tin& in)
{
static_assert(sizeof(Tin) == sizeof(Tout), "Invalid arguments for bitcast_anything");
#if defined CMT_COMPILER_INTEL
- const union {
+ const union
+ {
const Tin in;
Tout out;
} u{ in };
return u.out;
#else
- union {
+ union
+ {
Tin in;
Tout out;
} u{ in };
@@ -2068,13 +2105,13 @@ CMT_INLINE Tout bitcast_anything(const Tin& in)
}
template <typename T>
-constexpr T dont_deduce(T x)
+CMT_INTRINSIC constexpr T dont_deduce(T x)
{
return x;
}
template <typename Ty, typename T>
-constexpr T just_value(T value)
+CMT_INTRINSIC constexpr T just_value(T value)
{
return value;
}
@@ -2092,6 +2129,9 @@ CMT_INTRINSIC constexpr Tout pack_elements(Arg x, Args... args)
(pack_elements<Tout, Arg>(args...) << (sizeof(Arg) * 8));
}
+template <typename T, bool reference>
+using value_or_ref = std::conditional_t<reference, const T&, T>;
+
enum class special_constant
{
default_constructed,
@@ -2172,7 +2212,8 @@ struct special_value
template <typename T>
static T random_bits()
{
- union {
+ union
+ {
uint32_t bits[(sizeof(T) + sizeof(uint32_t) - 1) / sizeof(uint32_t)];
T value;
} u;
diff --git a/include/kfr/cometa/array.hpp b/include/kfr/cometa/array.hpp
@@ -102,14 +102,14 @@ inline array_ref<T> make_array_ref(T* data, std::size_t size)
}
template <typename Container, CMT_ENABLE_IF(has_data_size<Container>),
- typename T = remove_pointer<decltype(std::declval<Container>().data())>>
+ typename T = std::remove_pointer_t<decltype(std::declval<Container>().data())>>
inline array_ref<T> make_array_ref(Container& cont)
{
return array_ref<T>(cont.data(), cont.size());
}
template <typename Container, CMT_ENABLE_IF(has_data_size<Container>),
- typename T = remove_pointer<decltype(std::declval<Container>().data())>>
+ typename T = std::remove_pointer_t<decltype(std::declval<Container>().data())>>
inline array_ref<const T> make_array_ref(const Container& cont)
{
return array_ref<const T>(cont.data(), cont.size());
diff --git a/include/kfr/cometa/cstring.hpp b/include/kfr/cometa/cstring.hpp
@@ -32,7 +32,7 @@ struct cstring
constexpr size_type size() const CMT_NOEXCEPT { return N; }
template <size_t start, size_t count>
- constexpr cstring<count> slice(csize_t<start>, csize_t<count>) const CMT_NOEXCEPT
+ constexpr cstring<count + 1> slice(csize_t<start>, csize_t<count>) const CMT_NOEXCEPT
{
return slice_impl(csizeseq<count, start>);
}
@@ -104,9 +104,9 @@ CMT_INTRINSIC cstring<N1 - Nfrom + Nto> str_replace_impl(size_t pos, const cstri
{
if (pos == size_t(-1))
stop_constexpr();
- return { { (indices < pos
- ? str[indices]
- : (indices < pos + Nto - 1) ? to[indices - pos] : str[indices - Nto + Nfrom])...,
+ return { { (indices < pos ? str[indices]
+ : (indices < pos + Nto - 1) ? to[indices - pos]
+ : str[indices - Nto + Nfrom])...,
0 } };
}
} // namespace details
diff --git a/include/kfr/cometa/function.hpp b/include/kfr/cometa/function.hpp
@@ -94,9 +94,9 @@ struct function<R(Args...)>
function(std::nullptr_t) noexcept {}
- template <typename Fn,
- typename = enable_if<is_invocable_r<R, Fn, Args...> && !is_same<decay<Fn>, function>>>
- function(Fn fn) : impl(new details::function_impl<decay<Fn>, R, Args...>(std::move(fn)))
+ template <typename Fn, typename = std::enable_if_t<std::is_invocable_r_v<R, Fn, Args...> &&
+ !std::is_same_v<std::decay_t<Fn>, function>>>
+ function(Fn fn) : impl(new details::function_impl<std::decay_t<Fn>, R, Args...>(std::move(fn)))
{
}
@@ -145,8 +145,8 @@ inline function<Ret(Args...)> cdispatch(cvals_t<T, v0, values...>, identity<T> v
{
if (value == v0)
{
- return [=](Args... args)
- CMT_INLINE_LAMBDA -> Ret { return fn(cval_t<T, v0>(), std::forward<Args>(args)...); };
+ return [=](Args... args) CMT_INLINE_LAMBDA -> Ret
+ { return fn(cval_t<T, v0>(), std::forward<Args>(args)...); };
}
else
{
diff --git a/include/kfr/cometa/memory.hpp b/include/kfr/cometa/memory.hpp
@@ -1,4 +1,4 @@
-/** @addtogroup cometa
+/** @addtogroup memory
* @{
*/
#pragma once
@@ -188,13 +188,13 @@ struct autofree
#ifdef KFR_USE_STD_ALLOCATION
template <typename T>
-using allocator = std::allocator<T>;
+using data_allocator = std::allocator<T>;
#else
/// @brief Aligned allocator
template <typename T>
-struct allocator
+struct data_allocator
{
using value_type = T;
using pointer = T*;
@@ -207,12 +207,12 @@ struct allocator
template <typename U>
struct rebind
{
- using other = allocator<U>;
+ using other = data_allocator<U>;
};
- constexpr allocator() CMT_NOEXCEPT = default;
- constexpr allocator(const allocator&) CMT_NOEXCEPT = default;
+ constexpr data_allocator() CMT_NOEXCEPT = default;
+ constexpr data_allocator(const data_allocator&) CMT_NOEXCEPT = default;
template <typename U>
- constexpr allocator(const allocator<U>&) CMT_NOEXCEPT
+ constexpr data_allocator(const data_allocator<U>&) CMT_NOEXCEPT
{
}
pointer allocate(size_type n) const
@@ -226,12 +226,12 @@ struct allocator
};
template <typename T1, typename T2>
-constexpr inline bool operator==(const allocator<T1>&, const allocator<T2>&) CMT_NOEXCEPT
+constexpr inline bool operator==(const data_allocator<T1>&, const data_allocator<T2>&) CMT_NOEXCEPT
{
return true;
}
template <typename T1, typename T2>
-constexpr inline bool operator!=(const allocator<T1>&, const allocator<T2>&) CMT_NOEXCEPT
+constexpr inline bool operator!=(const data_allocator<T1>&, const data_allocator<T2>&) CMT_NOEXCEPT
{
return false;
}
@@ -269,4 +269,4 @@ public:
\
private: \
mutable std::atomic_uintptr_t m_refcount = ATOMIC_VAR_INIT(0);
-} // namespace cometa
-\ No newline at end of file
+} // namespace cometa
diff --git a/include/kfr/cometa/numeric.hpp b/include/kfr/cometa/numeric.hpp
@@ -113,24 +113,22 @@ enum class datatype : int
constexpr inline datatype operator|(datatype x, datatype y)
{
- using type = underlying_type<datatype>;
+ using type = std::underlying_type_t<datatype>;
return static_cast<datatype>(static_cast<type>(x) | static_cast<type>(y));
}
constexpr inline datatype operator&(datatype x, datatype y)
{
- using type = underlying_type<datatype>;
+ using type = std::underlying_type_t<datatype>;
return static_cast<datatype>(static_cast<type>(x) & static_cast<type>(y));
}
template <typename T>
-constexpr inline datatype typeclass = is_floating_point<typename compound_type_traits<T>::subtype>
- ? datatype::f
- : is_integral<typename compound_type_traits<T>::subtype>
- ? (is_unsigned<typename compound_type_traits<T>::subtype>
- ? datatype::u
- : datatype::i)
- : datatype();
+constexpr inline datatype typeclass =
+ std::is_floating_point_v<typename compound_type_traits<T>::subtype> ? datatype::f
+ : std::is_integral_v<typename compound_type_traits<T>::subtype>
+ ? (std::is_unsigned_v<typename compound_type_traits<T>::subtype> ? datatype::u : datatype::i)
+ : datatype();
template <typename T>
constexpr inline bool is_f_class = typeclass<T> == datatype::f;
@@ -158,7 +156,7 @@ using utype =
typename compound_type_traits<T>::template deep_rebind<unsigned_type<typebits<deep_subtype<T>>::bits>>;
template <typename T>
-using uitype = conditional<is_i_class<deep_subtype<T>>, T, utype<T>>;
+using uitype = std::conditional_t<is_i_class<deep_subtype<T>>, T, utype<T>>;
template <typename T>
using fsubtype = ftype<subtype<T>>;
@@ -171,7 +169,7 @@ namespace details
template <typename T>
struct flt_type_impl
{
- using type = conditional<sizeof(T) <= 2, float, fbase>;
+ using type = std::conditional_t<sizeof(T) <= 2, float, fbase>;
};
template <>
diff --git a/include/kfr/cometa/result.hpp b/include/kfr/cometa/result.hpp
@@ -25,7 +25,7 @@ struct result
constexpr result(ErrEnum error) CMT_NOEXCEPT : m_error(error) {}
- template <typename ValueInit, CMT_ENABLE_IF(is_constructible<value_type, ValueInit>)>
+ template <typename ValueInit, CMT_ENABLE_IF(std::is_constructible_v<value_type, ValueInit>)>
constexpr result(ValueInit&& value) CMT_NOEXCEPT : m_value(std::forward<ValueInit>(value)),
m_error(OkValue)
{
diff --git a/include/kfr/cometa/string.hpp b/include/kfr/cometa/string.hpp
@@ -8,10 +8,14 @@
#include "ctti.hpp"
#include "named_arg.hpp"
#include <array>
+#include <climits>
#include <cstdio>
#include <memory>
+#include <numeric>
#include <string>
+#include <string_view>
#include <utility>
+#include <vector>
CMT_PRAGMA_GNU(GCC diagnostic push)
CMT_PRAGMA_GNU(GCC diagnostic ignored "-Wpragmas")
@@ -24,11 +28,7 @@ namespace cometa
{
template <typename T>
-struct representation
-{
- using type = T;
- static constexpr const T& get(const T& value) CMT_NOEXCEPT { return value; }
-};
+struct representation;
template <typename T>
using repr_type = typename representation<T>::type;
@@ -36,14 +36,15 @@ using repr_type = typename representation<T>::type;
template <typename... Args>
CMT_INLINE std::string as_string(const Args&... args);
-namespace details
-{
template <typename T, char t = static_cast<char>(-1), int width = -1, int prec = -1>
struct fmt_t
{
const T& value;
};
+namespace details
+{
+
template <int number, CMT_ENABLE_IF(number >= 0 && number < 10)>
constexpr cstring<2> itoa()
{
@@ -237,19 +238,26 @@ CMT_INLINE const std::string& build_fmt(const std::string& str, ctypes_t<>) { re
template <typename Arg, typename... Args>
CMT_INLINE auto build_fmt(const std::string& str, ctypes_t<Arg, Args...>)
{
- constexpr auto fmt = value_fmt(ctype_t<decay<Arg>>());
+ constexpr auto fmt = value_fmt(ctype_t<std::decay_t<Arg>>());
return build_fmt(replace_one(str, "{}", std::string(fmt.data())), ctypes_t<Args...>());
}
} // namespace details
+template <typename T>
+struct representation
+{
+ using type = T;
+ static constexpr auto get(const T& value) CMT_NOEXCEPT { return details::pack_value(value); }
+};
+
template <char t, int width = -1, int prec = -1, typename T>
-CMT_INLINE details::fmt_t<T, t, width, prec> fmt(const T& value)
+CMT_INLINE fmt_t<T, t, width, prec> fmt(const T& value)
{
return { value };
}
template <int width = -1, int prec = -1, typename T>
-CMT_INLINE details::fmt_t<T, static_cast<char>(-1), width, prec> fmtwidth(const T& value)
+CMT_INLINE fmt_t<T, static_cast<char>(-1), width, prec> fmtwidth(const T& value)
{
return { value };
}
@@ -263,7 +271,7 @@ constexpr auto build_fmt_str(cchars_t<>, ctypes_t<>) { return make_cstring("");
template <char... chars, typename Arg, typename... Args>
constexpr auto build_fmt_str(cchars_t<'@', chars...>, ctypes_t<Arg, Args...>)
{
- return concat_cstring(details::value_fmt(ctype_t<decay<Arg>>()),
+ return concat_cstring(details::value_fmt(ctype_t<std::decay_t<Arg>>()),
build_fmt_str(cchars_t<chars...>(), ctypes_t<Args...>()));
}
@@ -365,7 +373,7 @@ namespace details
template <typename T>
constexpr auto get_value_fmt()
{
- return details::value_fmt(ctype_t<decay<repr_type<T>>>());
+ return details::value_fmt(ctype_t<std::decay_t<repr_type<T>>>());
}
} // namespace details
@@ -512,6 +520,171 @@ struct representation<std::shared_ptr<T1>>
return as_string(type_name<std::shared_ptr<T1>>(), "(nullptr)");
}
};
+
+template <>
+struct representation<std::shared_ptr<void>>
+{
+ using type = std::string;
+ static std::string get(const std::shared_ptr<void>& value)
+ {
+ if (value)
+ return as_string(type_name<std::shared_ptr<void>>(), "(", value.get(), ")");
+ else
+ return as_string(type_name<std::shared_ptr<void>>(), "(nullptr)");
+ }
+};
+
+namespace details
+{
+
+template <size_t dims>
+CMT_INTRINSIC size_t trailing_zeros(const std::array<size_t, dims>& indices)
+{
+ for (size_t i = 0; i < dims; ++i)
+ {
+ if (indices[dims - 1 - i] != 0)
+ return i;
+ }
+ return dims;
+}
+
+template <size_t dims>
+CMT_INTRINSIC bool increment_indices(std::array<size_t, dims>& indices, const std::array<size_t, dims>& stop)
+{
+ indices[dims - 1] += 1;
+ CMT_PRAGMA_GNU(clang diagnostic push)
+#if CMT_HAS_WARNING("-Wpass-failed")
+ CMT_PRAGMA_GNU(clang diagnostic ignored "-Wpass-failed")
+#endif
+ CMT_LOOP_UNROLL
+ for (int i = dims - 1; i >= 0;)
+ {
+ if (CMT_LIKELY(indices[i] < stop[i]))
+ return true;
+ // carry
+ indices[i] = 0;
+ --i;
+ if (i < 0)
+ {
+ return false;
+ }
+ indices[i] += 1;
+ }
+ CMT_PRAGMA_GNU(clang diagnostic pop)
+ return true;
+}
+} // namespace details
+
+template <typename U, typename Fmt>
+CMT_INTRINSIC Fmt wrap_fmt(const U& val, ctype_t<Fmt>)
+{
+ return Fmt{ val };
+}
+template <typename U>
+CMT_INTRINSIC U wrap_fmt(const U& val, ctype_t<void>)
+{
+ return val;
+}
+
+template <typename Fmt = void, size_t Dims, typename Getter>
+std::string array_to_string(const std::array<size_t, Dims>& shape, Getter&& getter, int max_columns = 16,
+ int max_dimensions = INT_MAX, std::string_view separator = ", ",
+ std::string_view open = "{", std::string_view close = "}")
+{
+ using shape_type = std::array<size_t, Dims>;
+ using index_t = size_t;
+
+ if (max_columns == 0)
+ max_columns = INT_MAX;
+ std::string ss;
+ for (index_t i = 0; i < Dims; ++i)
+ ss += open;
+
+ bool isempty = std::accumulate(shape.begin(), shape.end(), size_t(1), std::multiplies<size_t>{}) == 0;
+ if (!isempty)
+ {
+ shape_type index{ 0 };
+ std::string open_filler(open.size(), ' ');
+ std::string_view separator_trimmed = separator.substr(0, 1 + separator.find_last_not_of(" \t"));
+ int columns = 0;
+ do
+ {
+ std::string str = as_string(wrap_fmt(getter(index), cometa::ctype<Fmt>));
+ index_t z = details::trailing_zeros(index);
+ if ((z > 0 && columns > 0) || columns >= max_columns)
+ {
+ for (index_t i = 0; i < z; ++i)
+ ss += close;
+
+ if (z > max_dimensions || columns >= max_columns)
+ {
+ if (columns > 0)
+ ss += separator_trimmed;
+ ss += "\n";
+ for (index_t i = 0; i < Dims - z; ++i)
+ ss += open_filler;
+ }
+ else
+ {
+ if (columns > 0)
+ ss += separator;
+ }
+ for (index_t i = 0; i < z; ++i)
+ ss += open;
+
+ columns = 0;
+ }
+ else
+ {
+ if (columns > 0)
+ ss += separator;
+ }
+ ss += str;
+ ++columns;
+ } while (details::increment_indices<Dims>(index, shape));
+ }
+ for (index_t i = 0; i < Dims; ++i)
+ ss += close;
+ return ss;
+}
+
+template <typename Fmt = void, typename Getter>
+std::string array_to_string(size_t size, Getter&& getter, int max_columns = 16, int max_dimensions = INT_MAX,
+ std::string_view separator = ", ", std::string_view open = "{",
+ std::string_view close = "}")
+{
+ return array_to_string(std::array<size_t, 1>{ size }, std::forward<Getter>(getter), max_columns,
+ max_dimensions, std::move(separator), std::move(open), std::move(close));
+}
+template <typename Fmt = void, typename T>
+std::string array_to_string(size_t size, T* data, int max_columns = 16, int max_dimensions = INT_MAX,
+ std::string_view separator = ", ", std::string_view open = "{",
+ std::string_view close = "}")
+{
+ return array_to_string(
+ std::array<size_t, 1>{ size }, [data](std::array<size_t, 1> i) { return data[i.front()]; },
+ max_columns, max_dimensions, std::move(separator), std::move(open), std::move(close));
+}
+
+template <typename T, size_t Size>
+struct representation<std::array<T, Size>>
+{
+ using type = std::string;
+ static std::string get(const std::array<T, Size>& value)
+ {
+ return array_to_string(value.size(), value.data());
+ }
+};
+template <typename T, typename Allocator>
+struct representation<std::vector<T, Allocator>>
+{
+ using type = std::string;
+ static std::string get(const std::vector<T, Allocator>& value)
+ {
+ return array_to_string(value.size(), value.data());
+ }
+};
+
} // namespace cometa
CMT_PRAGMA_GNU(GCC diagnostic pop)
diff --git a/include/kfr/dft/convolution.hpp b/include/kfr/dft/convolution.hpp
@@ -80,18 +80,18 @@ namespace internal
{
/// @brief Utility class to abstract real/complex differences
template <typename T>
-struct dft_conv_plan: public dft_plan_real<T>
+struct dft_conv_plan : public dft_plan_real<T>
{
dft_conv_plan(size_t size) : dft_plan_real<T>(size, dft_pack_format::Perm) {}
-
+
size_t csize() const { return this->size / 2; }
};
template <typename T>
-struct dft_conv_plan<complex<T>>: public dft_plan<T>
+struct dft_conv_plan<complex<T>> : public dft_plan<T>
{
dft_conv_plan(size_t size) : dft_plan<T>(size) {}
-
+
size_t csize() const { return this->size; }
};
} // namespace internal
@@ -109,7 +109,7 @@ public:
size_t input_block_size() const { return block_size; }
protected:
- void process_expression(T* dest, const expression_pointer<T>& src, size_t size) final
+ void process_expression(T* dest, const expression_handle<T>& src, size_t size) final
{
univector<T> input = truncate(src, size);
process_buffer(dest, input.data(), input.size());
@@ -118,7 +118,7 @@ protected:
using ST = subtype<T>;
static constexpr auto real_fft = !std::is_same<T, complex<ST>>::value;
- using plan_t = internal::dft_conv_plan<T>;
+ using plan_t = internal::dft_conv_plan<T>;
// Length of filter data.
size_t data_size;
diff --git a/include/kfr/dft/fft.hpp b/include/kfr/dft/fft.hpp
@@ -75,7 +75,7 @@ struct dft_stage
virtual void dump() const
{
- printf("%s: \n\t%5zu,%5zu,%5zu,%5zu,%5zu,%5zu,%5zu, %d, %d, %d, %d\n", name ? name : "unnamed", radix,
+ printf("%s: %zu, %zu, %zu, %zu, %zu, %zu, %zu, %d, %d, %d, %d\n", name ? name : "unnamed", radix,
stage_size, data_size, temp_size, repeats, out_offset, blocks, recursion, can_inplace, inplace,
to_scratch);
}
@@ -139,7 +139,7 @@ struct dft_plan
#ifdef KFR_DFT_MULTI
explicit dft_plan(cpu_t cpu, size_t size, dft_order order = dft_order::normal)
- : size(size), temp_size(0), data_size(0)
+ : size(size), temp_size(0), data_size(0), arblen(false)
{
if (cpu == cpu_t::runtime)
cpu = get_cpu();
@@ -163,18 +163,17 @@ struct dft_plan
}
}
explicit dft_plan(size_t size, dft_order order = dft_order::normal)
- :dft_plan(cpu_t::runtime, size, order)
+ : dft_plan(cpu_t::runtime, size, order)
{
}
#else
explicit dft_plan(size_t size, dft_order order = dft_order::normal)
- : size(size), temp_size(0), data_size(0)
+ : size(size), temp_size(0), data_size(0), arblen(false)
{
dft_initialize(*this);
}
#endif
-
void dump() const
{
for (const std::unique_ptr<dft_stage<T>>& s : stages)
@@ -218,13 +217,14 @@ struct dft_plan
autofree<u8> data;
size_t data_size;
std::vector<dft_stage_ptr<T>> stages;
+ bool arblen;
protected:
struct noinit
{
};
explicit dft_plan(noinit, size_t size, dft_order order = dft_order::normal)
- : size(size), temp_size(0), data_size(0)
+ : size(size), temp_size(0), data_size(0), arblen(false)
{
}
const complex<T>* select_in(size_t stage, const complex<T>* out, const complex<T>* in,
@@ -291,11 +291,11 @@ protected:
}
else
{
- size_t offset = 0;
+ size_t offset = 0;
while (offset < this->size)
{
stages[depth]->execute(cbool<inverse>, select_out(depth, out, scratch) + offset,
- select_in(depth, out, in, scratch, in_scratch) + offset, temp);
+ select_in(depth, out, in, scratch, in_scratch) + offset, temp);
offset += stages[depth]->stage_size;
}
depth++;
diff --git a/include/kfr/dft/impl/bitrev.hpp b/include/kfr/dft/impl/bitrev.hpp
@@ -273,13 +273,13 @@ KFR_INTRINSIC void fft_reorder_swap_n4(T* inout, size_t i, size_t j, size_t N4,
template <typename T>
KFR_INTRINSIC void fft_reorder(complex<T>* inout, size_t log2n, ctrue_t use_br2)
{
- const size_t N = 1 << log2n;
+ const size_t N = size_t(1) << log2n;
const size_t N4 = N / 4;
const size_t iend = N / 16 * 4 * 2;
constexpr size_t istep = 2 * 4;
const size_t jstep1 = (1 << (log2n - 5)) * 4 * 2;
- const size_t jstep2 = size_t(1 << (log2n - 5)) * 4 * 2 - size_t(1 << (log2n - 6)) * 4 * 2;
- T* io = ptr_cast<T>(inout);
+ const size_t jstep2 = size_t(size_t(1) << (log2n - 5)) * 4 * 2 - size_t(size_t(1) << (log2n - 6)) * 4 * 2;
+ T* io = ptr_cast<T>(inout);
for (size_t i = 0; i < iend;)
{
diff --git a/include/kfr/dft/impl/convolution-impl.cpp b/include/kfr/dft/impl/convolution-impl.cpp
@@ -23,6 +23,8 @@
disclosing the source code of your own applications.
See https://www.kfrlib.com for details.
*/
+#include "../../base/simd_expressions.hpp"
+#include "../../simd/complex.hpp"
#include "../convolution.hpp"
namespace kfr
@@ -49,7 +51,7 @@ univector<T> convolve(const univector_ref<const T>& src1, const univector_ref<co
dft->execute(src2padded, src2padded, temp);
src1padded = src1padded * src2padded;
dft->execute(src1padded, src1padded, temp, true);
- const ST invsize = reciprocal<ST>(size);
+ const ST invsize = reciprocal<ST>(static_cast<ST>(size));
return truncate(real(src1padded), src1.size() + src2.size() - 1) * invsize;
}
@@ -68,7 +70,7 @@ univector<T> correlate(const univector_ref<const T>& src1, const univector_ref<c
dft->execute(src2padded, src2padded, temp);
src1padded = src1padded * src2padded;
dft->execute(src1padded, src1padded, temp, true);
- const ST invsize = reciprocal<ST>(size);
+ const ST invsize = reciprocal<ST>(static_cast<ST>(size));
return truncate(real(src1padded), src1.size() + src2.size() - 1) * invsize;
}
@@ -105,7 +107,7 @@ void convolve_filter<T>::set_data(const univector_ref<const T>& data)
segments.resize((data_size + block_size - 1) / block_size);
ir_segments.resize(segments.size());
univector<T> input(fft.size);
- const ST ifftsize = reciprocal(ST(fft.size));
+ const ST ifftsize = reciprocal(static_cast<ST>(fft.size));
for (size_t i = 0; i < ir_segments.size(); i++)
{
segments[i].resize(fft.csize());
@@ -184,7 +186,7 @@ void convolve_filter<T>::process_buffer(T* output, const T* input, size_t size)
// z_k = y_k + overlap
process(make_univector(output + processed, processing),
- scratch2.slice(input_position) + overlap.slice(input_position));
+ scratch2.slice(input_position, processing) + overlap.slice(input_position, processing));
input_position += processing;
processed += processing;
diff --git a/include/kfr/dft/impl/dft-fft.hpp b/include/kfr/dft/impl/dft-fft.hpp
@@ -36,6 +36,32 @@
namespace kfr
{
+inline namespace CMT_ARCH_NAME
+{
+namespace intrinsics
+{
+struct name_test_impl
+{
+};
+} // namespace intrinsics
+} // namespace CMT_ARCH_NAME
+
+template <typename T, cpu_t cpu>
+struct dft_name_impl
+{
+};
+
+template <typename Class>
+inline const char* dft_name(Class*)
+{
+ constexpr static size_t prefix_len = ctype_name<intrinsics::name_test_impl>().length() - 14;
+ static constexpr cstring full_name = ctype_name<std::decay_t<Class>>();
+ static constexpr cstring name_arch =
+ concat_cstring(full_name.slice(csize<prefix_len>), make_cstring("("),
+ make_cstring(CMT_STRINGIFY(CMT_ARCH_NAME)), make_cstring(")"));
+ return name_arch.c_str();
+}
+
#define DFT_STAGE_FN \
KFR_MEM_INTRINSIC void do_execute(cdirect_t, complex<T>* out, const complex<T>* in, u8* temp) final \
{ \
diff --git a/include/kfr/dft/impl/dft-impl.hpp b/include/kfr/dft/impl/dft-impl.hpp
@@ -25,6 +25,8 @@
*/
#pragma once
+#include "../../base/math_expressions.hpp"
+#include "../../base/simd_expressions.hpp"
#include "dft-fft.hpp"
CMT_PRAGMA_GNU(GCC diagnostic push)
@@ -82,7 +84,7 @@ struct dft_stage_fixed_impl : dft_stage<T>
{
dft_stage_fixed_impl(size_t, size_t iterations, size_t blocks)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
this->radix = fixed_radix;
this->blocks = blocks;
this->repeats = iterations;
@@ -94,9 +96,9 @@ struct dft_stage_fixed_impl : dft_stage<T>
constexpr static size_t rradix = fixed_radix;
- constexpr static size_t width = fixed_radix >= 7
- ? fft_vector_width<T> / 2
- : fixed_radix >= 4 ? fft_vector_width<T> : fft_vector_width<T> * 2;
+ constexpr static size_t width = fixed_radix >= 7 ? fft_vector_width<T> / 2
+ : fixed_radix >= 4 ? fft_vector_width<T>
+ : fft_vector_width<T> * 2;
virtual void do_initialize(size_t) override final { dft_stage_fixed_initialize(this, width); }
DFT_STAGE_FN
@@ -122,7 +124,7 @@ struct dft_stage_fixed_final_impl : dft_stage<T>
{
dft_stage_fixed_final_impl(size_t, size_t iterations, size_t blocks)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
this->radix = fixed_radix;
this->blocks = blocks;
this->repeats = iterations;
@@ -130,9 +132,9 @@ struct dft_stage_fixed_final_impl : dft_stage<T>
this->recursion = false;
this->can_inplace = false;
}
- constexpr static size_t width = fixed_radix >= 7
- ? fft_vector_width<T> / 2
- : fixed_radix >= 4 ? fft_vector_width<T> : fft_vector_width<T> * 2;
+ constexpr static size_t width = fixed_radix >= 7 ? fft_vector_width<T> / 2
+ : fixed_radix >= 4 ? fft_vector_width<T>
+ : fft_vector_width<T> * 2;
DFT_STAGE_FN
template <bool inverse>
@@ -158,32 +160,30 @@ inline auto apply_conj(E& e, ctrue_t)
/// [0, N - 1, N - 2, N - 3, ..., 3, 2, 1]
template <typename E>
-struct fft_inverse : internal::expression_with_arguments<E>
+struct fft_inverse : expression_with_traits<E>
{
- using value_type = value_type_of<E>;
+ using value_type = typename expression_with_traits<E>::value_type;
- KFR_MEM_INTRINSIC fft_inverse(E&& expr) CMT_NOEXCEPT
- : internal::expression_with_arguments<E>(std::forward<E>(expr))
- {
- }
+ KFR_MEM_INTRINSIC fft_inverse(E&& expr) CMT_NOEXCEPT : expression_with_traits<E>(std::forward<E>(expr)) {}
- friend KFR_INTRINSIC vec<value_type, 1> get_elements(const fft_inverse& self, cinput_t input,
- size_t index, vec_shape<value_type, 1>)
+ friend KFR_INTRINSIC vec<value_type, 1> get_elements(const fft_inverse& self, shape<1> index,
+ axis_params<0, 1>)
{
- return self.argument_first(input, index == 0 ? 0 : self.size() - index, vec_shape<value_type, 1>());
+ const size_t size = get_shape(self).front();
+ return get_elements(self.first(), index.front() == 0 ? 0 : size - index, axis_params<0, 1>());
}
template <size_t N>
- friend KFR_MEM_INTRINSIC vec<value_type, N> get_elements(const fft_inverse& self, cinput_t input,
- size_t index, vec_shape<value_type, N>)
+ friend KFR_MEM_INTRINSIC vec<value_type, N> get_elements(const fft_inverse& self, shape<1> index,
+ axis_params<0, N>)
{
- if (index == 0)
+ const size_t size = get_shape(self).front();
+ if (index.front() == 0)
{
- return concat(
- self.argument_first(input, index, vec_shape<value_type, 1>()),
- reverse(self.argument_first(input, self.size() - (N - 1), vec_shape<value_type, N - 1>())));
+ return concat(get_elements(self.first(), index, axis_params<0, 1>()),
+ reverse(get_elements(self.first(), size - (N - 1), axis_params<0, N - 1>())));
}
- return reverse(self.argument_first(input, self.size() - index - (N - 1), vec_shape<value_type, N>()));
+ return reverse(get_elements(self.first(), size - index - (N - 1), axis_params<0, N>()));
}
};
@@ -199,7 +199,7 @@ struct dft_arblen_stage_impl : dft_stage<T>
dft_arblen_stage_impl(size_t size)
: size(size), fftsize(next_poweroftwo(size) * 2), plan(fftsize, dft_order::internal)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
this->radix = size;
this->blocks = 1;
this->repeats = 1;
@@ -208,7 +208,7 @@ struct dft_arblen_stage_impl : dft_stage<T>
this->temp_size = plan.temp_size;
this->stage_size = size;
- chirp_ = render(cexp(sqr(linspace(T(1) - size, size - T(1), size * 2 - 1, true, true)) *
+ chirp_ = render(cexp(sqr(linspace(T(1) - size, size - T(1), size * 2 - 1, true, ctrue)) *
complex<T>(0, -1) * c_pi<T> / size));
ichirpp_ = render(truncate(padded(1 / slice(chirp_, 0, 2 * size - 1)), fftsize));
@@ -238,7 +238,7 @@ struct dft_arblen_stage_impl : dft_stage<T>
xp_fft = xp_fft * ichirpp_;
plan.execute(xp_fft.data(), xp_fft.data(), temp, ctrue);
- make_univector(out, n) = xp_fft.slice(n - 1) * slice(chirp, n - 1) * invN2;
+ make_univector(out, n) = xp_fft.slice(n - 1, n) * slice(chirp, n - 1, n) * invN2;
}
const size_t size;
@@ -256,7 +256,7 @@ struct dft_special_stage_impl : dft_stage<T>
{
dft_special_stage_impl() : stage1(radix1, size / radix1, 1), stage2(radix2, 1, size / radix2)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
this->radix = size;
this->blocks = 1;
this->repeats = 1;
@@ -298,7 +298,7 @@ struct dft_stage_generic_impl : dft_stage<T>
{
dft_stage_generic_impl(size_t radix, size_t iterations, size_t blocks)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
this->radix = radix;
this->blocks = blocks;
this->repeats = iterations;
@@ -404,7 +404,7 @@ struct dft_reorder_stage_impl : dft_stage<T>
{
dft_reorder_stage_impl(const int* radices, size_t count) : count(count)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
this->can_inplace = false;
this->data_size = 0;
std::copy(radices, radices + count, this->radices);
@@ -432,7 +432,8 @@ protected:
{
cswitch(
dft_radices, radices[0],
- [&](auto first_radix) {
+ [&](auto first_radix)
+ {
if (count == 3)
{
dft_permute(out, in, radices[2], radices[1], first_radix);
@@ -447,7 +448,8 @@ protected:
}
}
},
- [&]() {
+ [&]()
+ {
if (count == 3)
{
dft_permute(out, in, radices[2], radices[1], radices[0]);
@@ -471,14 +473,14 @@ void prepare_dft_stage(dft_plan<T>* self, size_t radix, size_t iterations, size_
{
return cswitch(
dft_radices, radix,
- [self, iterations, blocks](auto radix) CMT_INLINE_LAMBDA {
- add_stage<conditional<is_final, intrinsics::dft_stage_fixed_final_impl<T, val_of(radix)>,
- intrinsics::dft_stage_fixed_impl<T, val_of(radix)>>>(self, radix,
- iterations, blocks);
+ [self, iterations, blocks](auto radix) CMT_INLINE_LAMBDA
+ {
+ add_stage<std::conditional_t<is_final, intrinsics::dft_stage_fixed_final_impl<T, val_of(radix)>,
+ intrinsics::dft_stage_fixed_impl<T, val_of(radix)>>>(
+ self, radix, iterations, blocks);
},
- [self, radix, iterations, blocks]() {
- add_stage<intrinsics::dft_stage_generic_impl<T, is_final>>(self, radix, iterations, blocks);
- });
+ [self, radix, iterations, blocks]()
+ { add_stage<intrinsics::dft_stage_generic_impl<T, is_final>>(self, radix, iterations, blocks); });
}
template <typename T>
@@ -500,17 +502,20 @@ void init_dft(dft_plan<T>* self, size_t size, dft_order)
int radices[32] = { 0 };
size_t radices_size = 0;
- cforeach(dft_radices[csizeseq<dft_radices.size(), dft_radices.size() - 1, -1>], [&](auto radix) {
- while (cur_size && cur_size % val_of(radix) == 0)
- {
- count[val_of(radix)]++;
- cur_size /= val_of(radix);
- }
- });
+ cforeach(dft_radices[csizeseq<dft_radices.size(), dft_radices.size() - 1, -1>],
+ [&](auto radix)
+ {
+ while (cur_size && cur_size % val_of(radix) == 0)
+ {
+ count[val_of(radix)]++;
+ cur_size /= val_of(radix);
+ }
+ });
if (cur_size >= 101)
{
add_stage<intrinsics::dft_arblen_stage_impl<T>>(self, size);
+ self->arblen = true;
}
else
{
@@ -522,7 +527,7 @@ void init_dft(dft_plan<T>* self, size_t size, dft_order)
for (size_t i = 0; i < count[r]; i++)
{
iterations /= r;
- radices[radices_size++] = r;
+ radices[radices_size++] = static_cast<int>(r);
if (iterations == 1)
prepare_dft_stage(self, r, iterations, blocks, ctrue);
else
@@ -534,7 +539,7 @@ void init_dft(dft_plan<T>* self, size_t size, dft_order)
if (cur_size > 1)
{
iterations /= cur_size;
- radices[radices_size++] = cur_size;
+ radices[radices_size++] = static_cast<int>(cur_size);
if (iterations == 1)
prepare_dft_stage(self, cur_size, iterations, blocks, ctrue);
else
diff --git a/include/kfr/dft/impl/fft-impl.hpp b/include/kfr/dft/impl/fft-impl.hpp
@@ -432,7 +432,7 @@ struct fft_stage_impl : dft_stage<T>
{
fft_stage_impl(size_t stage_size)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
this->radix = 4;
this->stage_size = stage_size;
this->repeats = 4;
@@ -471,7 +471,7 @@ struct fft_final_stage_impl : dft_stage<T>
{
fft_final_stage_impl(size_t)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
this->radix = size;
this->stage_size = size;
this->out_offset = size;
@@ -515,7 +515,7 @@ struct fft_final_stage_impl : dft_stage<T>
final_stage<inverse>(csize<size>, 1, cbool<splitin>, out, in, twiddle);
}
- template <bool inverse, typename U = T, KFR_ENABLE_IF(is_same<U, float>)>
+ template <bool inverse, typename U = T, KFR_ENABLE_IF(std::is_same_v<U, float>)>
KFR_MEM_INTRINSIC void final_stage(csize_t<32>, size_t invN, cfalse_t, complex<T>* out, const complex<T>*,
const complex<T>*& twiddle)
{
@@ -523,7 +523,7 @@ struct fft_final_stage_impl : dft_stage<T>
cbool_t<prefetch>(), cbool_t<inverse>(), cbool_t<aligned>(), out, out, twiddle);
}
- template <bool inverse, typename U = T, KFR_ENABLE_IF(is_same<U, float>)>
+ template <bool inverse, typename U = T, KFR_ENABLE_IF(std::is_same_v<U, float>)>
KFR_MEM_INTRINSIC void final_stage(csize_t<16>, size_t invN, cfalse_t, complex<T>* out, const complex<T>*,
const complex<T>*& twiddle)
{
@@ -568,7 +568,7 @@ struct fft_reorder_stage_impl : dft_stage<T>
{
fft_reorder_stage_impl(size_t stage_size)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
this->stage_size = stage_size;
this->user = ilog2(stage_size);
this->data_size = 0;
@@ -590,7 +590,7 @@ struct fft_specialization;
template <typename T>
struct fft_specialization<T, 1> : dft_stage<T>
{
- fft_specialization(size_t) { this->name = type_name<decltype(*this)>(); }
+ fft_specialization(size_t) { this->name = dft_name(this); }
constexpr static bool aligned = false;
DFT_STAGE_FN
@@ -607,7 +607,7 @@ struct fft_specialization<T, 1> : dft_stage<T>
template <typename T>
struct fft_specialization<T, 2> : dft_stage<T>
{
- fft_specialization(size_t) { this->name = type_name<decltype(*this)>(); }
+ fft_specialization(size_t) { this->name = dft_name(this); }
constexpr static bool aligned = false;
DFT_STAGE_FN
@@ -624,7 +624,7 @@ struct fft_specialization<T, 2> : dft_stage<T>
template <typename T>
struct fft_specialization<T, 3> : dft_stage<T>
{
- fft_specialization(size_t) { this->name = type_name<decltype(*this)>(); }
+ fft_specialization(size_t) { this->name = dft_name(this); }
constexpr static bool aligned = false;
DFT_STAGE_FN
@@ -640,7 +640,7 @@ struct fft_specialization<T, 3> : dft_stage<T>
template <typename T>
struct fft_specialization<T, 4> : dft_stage<T>
{
- fft_specialization(size_t) { this->name = type_name<decltype(*this)>(); }
+ fft_specialization(size_t) { this->name = dft_name(this); }
constexpr static bool aligned = false;
DFT_STAGE_FN
@@ -656,7 +656,7 @@ struct fft_specialization<T, 4> : dft_stage<T>
template <typename T>
struct fft_specialization<T, 5> : dft_stage<T>
{
- fft_specialization(size_t) { this->name = type_name<decltype(*this)>(); }
+ fft_specialization(size_t) { this->name = dft_name(this); }
constexpr static bool aligned = false;
DFT_STAGE_FN
@@ -672,7 +672,7 @@ struct fft_specialization<T, 5> : dft_stage<T>
template <typename T>
struct fft_specialization<T, 6> : dft_stage<T>
{
- fft_specialization(size_t) { this->name = type_name<decltype(*this)>(); }
+ fft_specialization(size_t) { this->name = dft_name(this); }
constexpr static bool aligned = false;
DFT_STAGE_FN
@@ -689,7 +689,7 @@ struct fft_specialization<double, 7> : dft_stage<double>
using T = double;
fft_specialization(size_t)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
this->stage_size = 128;
this->data_size = align_up(sizeof(complex<T>) * 128 * 3 / 2, platform<>::native_cache_alignment);
}
@@ -730,7 +730,7 @@ struct fft_specialization<float, 7> : dft_stage<float>
using T = float;
fft_specialization(size_t)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
this->stage_size = 128;
this->data_size = align_up(sizeof(complex<T>) * 128 * 3 / 2, platform<>::native_cache_alignment);
}
@@ -769,7 +769,7 @@ struct fft_specialization<float, 8> : dft_stage<float>
{
fft_specialization(size_t)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
this->temp_size = sizeof(complex<float>) * 256;
}
@@ -812,7 +812,7 @@ struct fft_specialization<double, 8> : fft_final_stage_impl<double, false, 256>
using T = double;
fft_specialization(size_t stage_size) : fft_final_stage_impl<double, false, 256>(stage_size)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
}
DFT_STAGE_FN
@@ -830,7 +830,7 @@ struct fft_specialization<T, 9> : fft_final_stage_impl<T, false, 512>
{
fft_specialization(size_t stage_size) : fft_final_stage_impl<T, false, 512>(stage_size)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
}
DFT_STAGE_FN
@@ -848,7 +848,7 @@ struct fft_specialization<T, 10> : fft_final_stage_impl<T, false, 1024>
{
fft_specialization(size_t stage_size) : fft_final_stage_impl<T, false, 1024>(stage_size)
{
- this->name = type_name<decltype(*this)>();
+ this->name = dft_name(this);
}
DFT_STAGE_FN
@@ -951,17 +951,21 @@ KFR_INTRINSIC void init_fft(dft_plan<T>* self, size_t size, dft_order)
const size_t log2n = ilog2(size);
cswitch(
csizes_t<1, 2, 3, 4, 5, 6, 7, 8, 9, 10>(), log2n,
- [&](auto log2n) {
+ [&](auto log2n)
+ {
(void)log2n;
constexpr size_t log2nv = val_of(decltype(log2n)());
add_stage<intrinsics::fft_specialization<T, log2nv>>(self, size);
},
- [&]() {
- cswitch(cfalse_true, is_even(log2n), [&](auto is_even) {
- make_fft(self, size, is_even, ctrue);
- constexpr size_t is_evenv = val_of(decltype(is_even)());
- add_stage<intrinsics::fft_reorder_stage_impl<T, is_evenv>>(self, size);
- });
+ [&]()
+ {
+ cswitch(cfalse_true, is_even(log2n),
+ [&](auto is_even)
+ {
+ make_fft(self, size, is_even, ctrue);
+ constexpr size_t is_evenv = val_of(decltype(is_even)());
+ add_stage<intrinsics::fft_reorder_stage_impl<T, is_evenv>>(self, size);
+ });
});
}
@@ -970,15 +974,19 @@ KFR_INTRINSIC void generate_real_twiddles(dft_plan_real<T>* self, size_t size)
{
using namespace intrinsics;
constexpr size_t width = vector_width<T> * 2;
- block_process(size / 4, csizes_t<width, 1>(), [=](size_t i, auto w) {
- constexpr size_t width = val_of(decltype(w)());
- cwrite<width>(self->rtwiddle.data() + i,
- cossin(dup(-constants<T>::pi * ((enumerate<T, width>() + i + size / 4) / (size / 2)))));
- });
+ block_process(size / 4, csizes_t<width, 1>(),
+ [=](size_t i, auto w)
+ {
+ constexpr size_t width = val_of(decltype(w)());
+ cwrite<width>(self->rtwiddle.data() + i,
+ cossin(dup(-constants<T>::pi *
+ ((enumerate<T, width>() + i + size / 4) / (size / 2)))));
+ });
}
template <typename T>
-#if (defined CMT_ARCH_X32 && defined CMT_ARCH_X86 && defined __clang__) && ((defined __APPLE__) || (__clang_major__ == 8))
+#if (defined CMT_ARCH_X32 && defined CMT_ARCH_X86 && defined __clang__) && \
+ ((defined __APPLE__) || (__clang_major__ == 8))
// Fix for Clang 8.0 bug (x32 with FMA instructions)
// Xcode has different versions but x86 is very rare on macOS these days,
// so disable inlining and FMA for x32 macOS and Clang 8.x
@@ -997,20 +1005,22 @@ to_fmt(size_t real_size, const complex<T>* rtwiddle, complex<T>* out, const comp
const cvec<T, 1> dc = cread<1>(out);
const size_t count = csize / 2;
- block_process(count - 1, csizes_t<width, 1>(), [&](size_t i, auto w) {
- i++;
- constexpr size_t width = val_of(decltype(w)());
- constexpr size_t widthm1 = width - 1;
- const cvec<T, width> tw = cread<width>(rtwiddle + i);
- const cvec<T, width> fpk = cread<width>(in + i);
- const cvec<T, width> fpnk = reverse<2>(negodd(cread<width>(in + csize - i - widthm1)));
+ block_process(count - 1, csizes_t<width, 1>(),
+ [&](size_t i, auto w)
+ {
+ i++;
+ constexpr size_t width = val_of(decltype(w)());
+ constexpr size_t widthm1 = width - 1;
+ const cvec<T, width> tw = cread<width>(rtwiddle + i);
+ const cvec<T, width> fpk = cread<width>(in + i);
+ const cvec<T, width> fpnk = reverse<2>(negodd(cread<width>(in + csize - i - widthm1)));
- const cvec<T, width> f1k = fpk + fpnk;
- const cvec<T, width> f2k = fpk - fpnk;
- const cvec<T, width> t = cmul(f2k, tw);
- cwrite<width>(out + i, T(0.5) * (f1k + t));
- cwrite<width>(out + csize - i - widthm1, reverse<2>(negodd(T(0.5) * (f1k - t))));
- });
+ const cvec<T, width> f1k = fpk + fpnk;
+ const cvec<T, width> f2k = fpk - fpnk;
+ const cvec<T, width> t = cmul(f2k, tw);
+ cwrite<width>(out + i, T(0.5) * (f1k + t));
+ cwrite<width>(out + csize - i - widthm1, reverse<2>(negodd(T(0.5) * (f1k - t))));
+ });
{
size_t k = csize / 2;
@@ -1030,7 +1040,8 @@ to_fmt(size_t real_size, const complex<T>* rtwiddle, complex<T>* out, const comp
}
template <typename T>
-#if (defined CMT_ARCH_X32 && defined CMT_ARCH_X86 && defined __clang__) && ((defined __APPLE__) || (__clang_major__ == 8))
+#if (defined CMT_ARCH_X32 && defined CMT_ARCH_X86 && defined __clang__) && \
+ ((defined __APPLE__) || (__clang_major__ == 8))
// Fix for Clang 8.0 bug (x32 with FMA instructions)
// Xcode has different versions but x86 is very rare on macOS these days,
// so disable inlining and FMA for x32 macOS and Clang 8.x
@@ -1059,20 +1070,22 @@ void from_fmt(size_t real_size, complex<T>* rtwiddle, complex<T>* out, const com
constexpr size_t width = vector_width<T> * 2;
const size_t count = csize / 2;
- block_process(count - 1, csizes_t<width, 1>(), [&](size_t i, auto w) {
- i++;
- constexpr size_t width = val_of(decltype(w)());
- constexpr size_t widthm1 = width - 1;
- const cvec<T, width> tw = cread<width>(rtwiddle + i);
- const cvec<T, width> fpk = cread<width>(in + i);
- const cvec<T, width> fpnk = reverse<2>(negodd(cread<width>(in + csize - i - widthm1)));
+ block_process(count - 1, csizes_t<width, 1>(),
+ [&](size_t i, auto w)
+ {
+ i++;
+ constexpr size_t width = val_of(decltype(w)());
+ constexpr size_t widthm1 = width - 1;
+ const cvec<T, width> tw = cread<width>(rtwiddle + i);
+ const cvec<T, width> fpk = cread<width>(in + i);
+ const cvec<T, width> fpnk = reverse<2>(negodd(cread<width>(in + csize - i - widthm1)));
- const cvec<T, width> f1k = fpk + fpnk;
- const cvec<T, width> f2k = fpk - fpnk;
- const cvec<T, width> t = cmul_conj(f2k, tw);
- cwrite<width>(out + i, f1k + t);
- cwrite<width>(out + csize - i - widthm1, reverse<2>(negodd(f1k - t)));
- });
+ const cvec<T, width> f1k = fpk + fpnk;
+ const cvec<T, width> f2k = fpk - fpnk;
+ const cvec<T, width> t = cmul_conj(f2k, tw);
+ cwrite<width>(out + i, f1k + t);
+ cwrite<width>(out + csize - i - widthm1, reverse<2>(negodd(f1k - t)));
+ });
{
size_t k = csize / 2;
@@ -1093,12 +1106,14 @@ KFR_INTRINSIC void initialize_stages(dft_plan<T>* self)
{
init_fft(self, self->size, dft_order::normal);
}
-#ifndef KFR_DFT_NO_NPo2
else
{
+#ifndef KFR_DFT_NO_NPo2
init_dft(self, self->size, dft_order::normal);
- }
+#else
+ KFR_REPORT_LOGIC_ERROR("Non-power of 2 FFT is disabled but ", self->size, " size is requested");
#endif
+ }
}
template <typename T>
@@ -1125,12 +1140,15 @@ public:
constexpr size_t width = vector_width<T> * 2;
size_t real_size = this->stage_size;
complex<T>* rtwiddle = ptr_cast<complex<T>>(this->data);
- block_process(real_size / 4, csizes_t<width, 1>(), [=](size_t i, auto w) {
- constexpr size_t width = val_of(decltype(w)());
- cwrite<width>(rtwiddle + i,
- cossin(dup(-constants<T>::pi *
- ((enumerate<T, width>() + i + real_size / 4) / (real_size / 2)))));
- });
+ block_process(real_size / 4, csizes_t<width, 1>(),
+ [=](size_t i, auto w)
+ {
+ constexpr size_t width = val_of(decltype(w)());
+ cwrite<width>(
+ rtwiddle + i,
+ cossin(dup(-constants<T>::pi *
+ ((enumerate<T, width>() + i + real_size / 4) / (real_size / 2)))));
+ });
}
void do_execute(cdirect_t, complex<T>* out, const complex<T>* in, u8* temp) override
{
diff --git a/include/kfr/dft/impl/ft.hpp b/include/kfr/dft/impl/ft.hpp
@@ -1092,19 +1092,19 @@ template <typename T, bool inverse = false>
static constexpr KFR_INTRINSIC cvec<T, 1> tw9_1()
{
return { T(0.76604444311897803520239265055541),
- (inverse ? -1 : 1) * T(-0.64278760968653932632264340990727) };
+ (inverse ? -1 : 1) * T(-0.64278760968653932632264340990727) };
}
template <typename T, bool inverse = false>
static constexpr KFR_INTRINSIC cvec<T, 1> tw9_2()
{
return { T(0.17364817766693034885171662676931),
- (inverse ? -1 : 1) * T(-0.98480775301220805936674302458952) };
+ (inverse ? -1 : 1) * T(-0.98480775301220805936674302458952) };
}
template <typename T, bool inverse = false>
static constexpr KFR_INTRINSIC cvec<T, 1> tw9_4()
{
return { T(-0.93969262078590838405410927732473),
- (inverse ? -1 : 1) * T(-0.34202014332566873304409961468226) };
+ (inverse ? -1 : 1) * T(-0.34202014332566873304409961468226) };
}
template <size_t N, bool inverse = false, typename T>
@@ -1205,7 +1205,7 @@ KFR_INTRINSIC void butterfly7(cvec<T, N> a00, cvec<T, N> a01, cvec<T, N> a02, cv
const cvec<T, N> d1 =
dif1 * tw7i1<T, N, inverse>() + dif2 * tw7i2<T, N, inverse>() + dif3 * tw7i3<T, N, inverse>();
const cvec<T, N> d2 =
- dif1 * tw7i2<T, N, inverse>() - dif2 * tw7i3<T, N, inverse>()- dif3 * tw7i1<T, N, inverse>();
+ dif1 * tw7i2<T, N, inverse>() - dif2 * tw7i3<T, N, inverse>() - dif3 * tw7i1<T, N, inverse>();
const cvec<T, N> d3 =
dif1 * tw7i3<T, N, inverse>() - dif2 * tw7i1<T, N, inverse>() + dif3 * tw7i2<T, N, inverse>();
@@ -1729,15 +1729,18 @@ template <typename T, bool inverse, typename Tstride = csize_t<1>>
KFR_INTRINSIC void generic_butterfly(size_t radix, cbool_t<inverse>, complex<T>* out, const complex<T>* in,
complex<T>*, const complex<T>* twiddle, Tstride ostride = {})
{
- cswitch(csizes_t<11, 13>(), radix,
- [&](auto radix_) CMT_INLINE_LAMBDA {
- constexpr size_t width = vector_width<T>;
- spec_generic_butterfly_w<width>(radix_, cbool_t<inverse>(), out, in, twiddle, ostride);
- },
- [&]() CMT_INLINE_LAMBDA {
- constexpr size_t width = vector_width<T>;
- generic_butterfly_w<width>(radix, cbool_t<inverse>(), out, in, twiddle, ostride);
- });
+ cswitch(
+ csizes_t<11, 13>(), radix,
+ [&](auto radix_) CMT_INLINE_LAMBDA
+ {
+ constexpr size_t width = vector_width<T>;
+ spec_generic_butterfly_w<width>(radix_, cbool_t<inverse>(), out, in, twiddle, ostride);
+ },
+ [&]() CMT_INLINE_LAMBDA
+ {
+ constexpr size_t width = vector_width<T>;
+ generic_butterfly_w<width>(radix, cbool_t<inverse>(), out, in, twiddle, ostride);
+ });
}
template <typename T, size_t N>
@@ -1809,4 +1812,3 @@ KFR_INTRINSIC void cdigitreverse4_write<false, f64, 32>(complex<f64>* dest, cons
} // namespace kfr
CMT_PRAGMA_MSVC(warning(pop))
-
diff --git a/include/kfr/dsp/biquad.hpp b/include/kfr/dsp/biquad.hpp
@@ -26,7 +26,7 @@
#pragma once
#include "../base/filter.hpp"
-#include "../base/pointer.hpp"
+#include "../base/handle.hpp"
#include "../simd/impl/function.hpp"
#include "../simd/operators.hpp"
#include "../simd/vec.hpp"
@@ -62,9 +62,9 @@ struct biquad_params
b2(static_cast<T>(bq.b2))
{
}
- constexpr static bool is_pod = true;
+ constexpr static bool is_pod_like = true;
- static_assert(is_floating_point<T>, "T must be a floating point type");
+ static_assert(std::is_floating_point_v<T>, "T must be a floating point type");
constexpr biquad_params() CMT_NOEXCEPT : a0(1), a1(0), a2(0), b0(1), b1(0), b2(0) {}
constexpr biquad_params(T a0, T a1, T a2, T b0, T b1, T b2) CMT_NOEXCEPT : a0(a0),
a1(a1),
@@ -93,8 +93,6 @@ struct biquad_params
inline namespace CMT_ARCH_NAME
{
-namespace internal
-{
template <typename T, size_t filters>
struct biquad_state
{
@@ -143,125 +141,126 @@ struct biquad_block
};
template <size_t filters, typename T, typename E1>
-struct expression_biquads_l : public expression_with_arguments<E1>
+struct expression_biquads_l : public expression_with_traits<E1>
{
using value_type = T;
expression_biquads_l(const biquad_block<T, filters>& bq, E1&& e1)
- : expression_with_arguments<E1>(std::forward<E1>(e1)), bq(bq)
+ : expression_with_traits<E1>(std::forward<E1>(e1)), bq(bq)
{
}
- template <size_t width>
- friend KFR_INTRINSIC vec<T, width> get_elements(const expression_biquads_l& self, cinput_t cinput,
- size_t index, vec_shape<T, width> t)
- {
- const vec<T, width> in = self.argument_first(cinput, index, t);
- vec<T, width> out;
+ biquad_block<T, filters> bq;
+ mutable biquad_state<T, filters> state;
+};
- CMT_LOOP_UNROLL
- for (size_t i = 0; i < width; i++)
- {
- self.state.out = process(self.bq, self.state, insertleft(in[i], self.state.out));
- out[i] = self.state.out[filters - 1];
- }
+template <size_t filters, typename T, typename E1>
+struct expression_biquads : expression_with_traits<E1>
+{
+ using value_type = T;
- return out;
- }
- static KFR_MEM_INTRINSIC vec<T, filters> process(const biquad_block<T, filters>& bq,
- biquad_state<T, filters>& state,
- const vec<T, filters>& in)
+ expression_biquads(const biquad_block<T, filters>& bq, E1&& e1)
+ : expression_with_traits<E1>(std::forward<E1>(e1)), bq(bq), block_end(0)
{
- const vec<T, filters> out = bq.b0 * in + state.s1;
- state.s1 = state.s2 + bq.b1 * in - bq.a1 * out;
- state.s2 = bq.b2 * in - bq.a2 * out;
- return out;
}
+
biquad_block<T, filters> bq;
+
mutable biquad_state<T, filters> state;
+ mutable biquad_state<T, filters> saved_state;
+ mutable size_t block_end;
};
-template <size_t filters, typename T, typename E1>
-struct expression_biquads : expression_with_arguments<E1>
+template <size_t filters, typename T>
+KFR_INTRINSIC vec<T, filters> biquad_process(const biquad_block<T, filters>& bq,
+ biquad_state<T, filters>& state, const vec<T, filters>& in)
{
- using value_type = T;
+ const vec<T, filters> out = bq.b0 * in + state.s1;
+ state.s1 = state.s2 + bq.b1 * in - bq.a1 * out;
+ state.s2 = bq.b2 * in - bq.a2 * out;
+ return out;
+}
- expression_biquads(const biquad_block<T, filters>& bq, E1&& e1)
- : expression_with_arguments<E1>(std::forward<E1>(e1)), bq(bq), block_end(0)
+template <size_t filters, typename T, typename E1, size_t N>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_biquads_l<filters, T, E1>& self, shape<1> index,
+ axis_params<0, N> t)
+{
+ const vec<T, N> in = get_elements(self.first(), index, t);
+ vec<T, N> out;
+
+ CMT_LOOP_UNROLL
+ for (size_t i = 0; i < N; i++)
{
+ self.state.out = biquad_process(self.bq, self.state, insertleft(in[i], self.state.out));
+ out[i] = self.state.out[filters - 1];
}
- void begin_block(cinput_t cinput, size_t size) const
+ return out;
+}
+
+template <size_t filters, typename T, typename E1>
+KFR_INTRINSIC void begin_pass(const expression_biquads<filters, T, E1>& self, shape<1> start, shape<1> stop)
+{
+ size_t size = stop.front();
+ self.block_end = size;
+ for (index_t i = 0; i < filters - 1; i++)
{
- block_end = size;
- for (size_t i = 0; i < filters - 1; i++)
+ const vec<T, 1> in = i < size ? get_elements(self.first(), shape<1>{ i }, axis_params_v<0, 1>) : 0;
+ self.state.out = biquad_process(self.bq, self.state, insertleft(in[0], self.state.out));
+ }
+}
+template <size_t filters, typename T, typename E1>
+KFR_INTRINSIC void end_pass(const expression_biquads<filters, T, E1>& self, shape<1> start, shape<1> stop)
+{
+ self.state = self.saved_state;
+}
+
+template <size_t filters, typename T, typename E1, size_t N>
+KFR_INTRINSIC vec<T, N> get_elements(const expression_biquads<filters, T, E1>& self, shape<1> index,
+ axis_params<0, N> t)
+{
+ index.front() += filters - 1;
+ vec<T, N> out{};
+ if (index.front() + N <= self.block_end)
+ {
+ const vec<T, N> in = get_elements(self.first(), shape<1>{ index.front() }, t);
+
+ CMT_LOOP_UNROLL
+ for (size_t i = 0; i < N; i++)
{
- const vec<T, 1> in = i < size ? this->argument_first(cinput, i, vec_shape<T, 1>()) : 0;
- state.out = process(bq, state, insertleft(in[0], state.out));
+ self.state.out = biquad_process(self.bq, self.state, insertleft(in[i], self.state.out));
+ out[i] = self.state.out[filters - 1];
}
+ if (index.front() + N == self.block_end)
+ self.saved_state = self.state;
}
- void end_block(cinput_t, size_t) const { state = saved_state; }
-
- template <size_t width>
- friend KFR_INTRINSIC vec<T, width> get_elements(const expression_biquads& self, cinput_t cinput,
- size_t index, vec_shape<T, width> t)
+ else if (index.front() >= self.block_end)
{
- index += filters - 1;
- vec<T, width> out{};
- if (index + width <= self.block_end)
+ CMT_LOOP_UNROLL
+ for (size_t i = 0; i < N; i++)
{
- const vec<T, width> in = self.argument_first(cinput, index, t);
-
- CMT_LOOP_UNROLL
- for (size_t i = 0; i < width; i++)
- {
- self.state.out = process(self.bq, self.state, insertleft(in[i], self.state.out));
- out[i] = self.state.out[filters - 1];
- }
- if (index + width == self.block_end)
- self.saved_state = self.state;
+ self.state.out = biquad_process(self.bq, self.state, insertleft(T(0), self.state.out));
+ out[i] = self.state.out[filters - 1];
}
- else if (index >= self.block_end)
+ }
+ else
+ {
+ size_t i = 0;
+ for (; i < std::min(N, self.block_end - static_cast<size_t>(index.front())); i++)
{
- CMT_LOOP_UNROLL
- for (size_t i = 0; i < width; i++)
- {
- self.state.out = process(self.bq, self.state, insertleft(T(0), self.state.out));
- out[i] = self.state.out[filters - 1];
- }
+ const vec<T, 1> in =
+ get_elements(self.first(), index.add_at(i, cval<index_t, 0>), axis_params_v<0, 1>);
+ self.state.out = biquad_process(self.bq, self.state, insertleft(in[0], self.state.out));
+ out[i] = self.state.out[filters - 1];
}
- else
+ self.saved_state = self.state;
+ for (; i < N; i++)
{
- size_t i = 0;
- for (; i < std::min(width, self.block_end - index); i++)
- {
- const vec<T, 1> in = self.argument_first(cinput, index + i, vec_shape<T, 1>());
- self.state.out = process(self.bq, self.state, insertleft(in[0], self.state.out));
- out[i] = self.state.out[filters - 1];
- }
- self.saved_state = self.state;
- for (; i < width; i++)
- {
- self.state.out = process(self.bq, self.state, insertleft(T(0), self.state.out));
- out[i] = self.state.out[filters - 1];
- }
+ self.state.out = biquad_process(self.bq, self.state, insertleft(T(0), self.state.out));
+ out[i] = self.state.out[filters - 1];
}
- return out;
- }
- static KFR_MEM_INTRINSIC vec<T, filters> process(const biquad_block<T, filters>& bq,
- biquad_state<T, filters>& state, vec<T, filters> in)
- {
- const vec<T, filters> out = bq.b0 * in + state.s1;
- state.s1 = state.s2 + bq.b1 * in - bq.a1 * out;
- state.s2 = bq.b2 * in - bq.a2 * out;
- return out;
}
- biquad_block<T, filters> bq;
-
- mutable biquad_state<T, filters> state;
- mutable biquad_state<T, filters> saved_state;
- mutable size_t block_end;
-};
-} // namespace internal
+ return out;
+}
/**
* @brief Returns template expressions that applies biquad filter to the input.
@@ -269,10 +268,10 @@ struct expression_biquads : expression_with_arguments<E1>
* @param e1 Input expression
*/
template <typename T, typename E1>
-KFR_FUNCTION internal::expression_biquads<1, T, E1> biquad(const biquad_params<T>& bq, E1&& e1)
+KFR_FUNCTION expression_biquads<1, T, E1> biquad(const biquad_params<T>& bq, E1&& e1)
{
const biquad_params<T> bqs[1] = { bq };
- return internal::expression_biquads<1, T, E1>(bqs, std::forward<E1>(e1));
+ return expression_biquads<1, T, E1>(bqs, std::forward<E1>(e1));
}
/**
@@ -282,10 +281,9 @@ KFR_FUNCTION internal::expression_biquads<1, T, E1> biquad(const biquad_params<T
* @note This implementation introduces delay of N - 1 samples, where N is the filter count.
*/
template <size_t filters, typename T, typename E1>
-KFR_FUNCTION internal::expression_biquads_l<filters, T, E1> biquad_l(const biquad_params<T> (&bq)[filters],
- E1&& e1)
+KFR_FUNCTION expression_biquads_l<filters, T, E1> biquad_l(const biquad_params<T> (&bq)[filters], E1&& e1)
{
- return internal::expression_biquads_l<filters, T, E1>(bq, std::forward<E1>(e1));
+ return expression_biquads_l<filters, T, E1>(bq, std::forward<E1>(e1));
}
/**
@@ -295,10 +293,9 @@ KFR_FUNCTION internal::expression_biquads_l<filters, T, E1> biquad_l(const biqua
* @note This implementation has zero latency
*/
template <size_t filters, typename T, typename E1>
-KFR_FUNCTION internal::expression_biquads<filters, T, E1> biquad(const biquad_params<T> (&bq)[filters],
- E1&& e1)
+KFR_FUNCTION expression_biquads<filters, T, E1> biquad(const biquad_params<T> (&bq)[filters], E1&& e1)
{
- return internal::expression_biquads<filters, T, E1>(bq, std::forward<E1>(e1));
+ return expression_biquads<filters, T, E1>(bq, std::forward<E1>(e1));
}
/**
@@ -308,21 +305,22 @@ KFR_FUNCTION internal::expression_biquads<filters, T, E1> biquad(const biquad_pa
* @note This implementation has zero latency
*/
template <size_t maxfiltercount = 4, typename T, typename E1>
-KFR_FUNCTION expression_pointer<T> biquad(const biquad_params<T>* bq, size_t count, E1&& e1)
+KFR_FUNCTION expression_handle<T, 1> biquad(const biquad_params<T>* bq, size_t count, E1&& e1)
{
constexpr csizes_t<1, 2, 4, 8, 16, 32, 64> sizes;
return cswitch(
cfilter(sizes, sizes <= csize_t<maxfiltercount>{}), next_poweroftwo(count),
- [&](auto x) {
+ [&](auto x)
+ {
constexpr size_t filters = x;
- return to_pointer(internal::expression_biquads<filters, T, E1>(
- internal::biquad_block<T, filters>(bq, count), std::forward<E1>(e1)));
+ return to_handle(expression_biquads<filters, T, E1>(biquad_block<T, filters>(bq, count),
+ std::forward<E1>(e1)));
},
- [&] { return to_pointer(zeros<T>()); });
+ [&] { return to_handle(fixshape(zeros<T>(), fixed_shape<infinite_size>)); });
}
template <size_t maxfiltercount = 4, typename T, typename E1>
-KFR_FUNCTION expression_pointer<T> biquad(const std::vector<biquad_params<T>>& bq, E1&& e1)
+KFR_FUNCTION expression_handle<T, 1> biquad(const std::vector<biquad_params<T>>& bq, E1&& e1)
{
return biquad<maxfiltercount>(bq.data(), bq.size(), std::forward<E1>(e1));
}
@@ -341,11 +339,7 @@ public:
{
}
- biquad_filter(const std::vector<biquad_params<T>>& bq)
- : biquad_filter(bq.data(), bq.size())
- {
- }
-
+ biquad_filter(const std::vector<biquad_params<T>>& bq) : biquad_filter(bq.data(), bq.size()) {}
};
} // namespace CMT_ARCH_NAME
diff --git a/include/kfr/dsp/dcremove.hpp b/include/kfr/dsp/dcremove.hpp
@@ -30,14 +30,12 @@
namespace kfr
{
-inline namespace CMT_ARCH_NAME
-{
-template <typename E1, typename T = flt_type<value_type_of<E1>>>
-KFR_INTRINSIC internal::expression_biquads<1, T, E1> dcremove(E1&& e1, double cutoff = 0.00025)
+template <typename E1, typename T = flt_type<expression_value_type<E1>>>
+KFR_INTRINSIC expression_biquads<1, T, E1> dcremove(E1&& e1, double cutoff = 0.00025)
{
const biquad_params<T> bqs[1] = { biquad_highpass(cutoff, 0.5) };
- return internal::expression_biquads<1, T, E1>(bqs, std::forward<E1>(e1));
+ return expression_biquads<1, T, E1>(bqs, std::forward<E1>(e1));
}
-} // namespace CMT_ARCH_NAME
+
} // namespace kfr
diff --git a/include/kfr/dsp/delay.hpp b/include/kfr/dsp/delay.hpp
@@ -27,8 +27,8 @@
#include "../base/basic_expressions.hpp"
#include "../base/expression.hpp"
+#include "../base/state_holder.hpp"
#include "../base/univector.hpp"
-#include "state_holder.hpp"
namespace kfr
{
@@ -58,14 +58,21 @@ struct delay_state<T, 1, 1>
mutable T data = T(0);
};
-namespace internal
-{
-
template <size_t delay, typename E, bool stateless, univector_tag STag>
-struct expression_delay : expression_with_arguments<E>
+struct expression_delay : expression_with_arguments<E>, public expression_traits_defaults
{
- using value_type = value_type_of<E>;
- using T = value_type;
+ using ArgTraits = expression_traits<E>;
+ static_assert(ArgTraits::dims == 1, "expression_delay requires argument with dims == 1");
+ using value_type = typename ArgTraits::value_type;
+ constexpr static size_t dims = 1;
+ constexpr static shape<dims> get_shape(const expression_delay& self)
+ {
+ return ArgTraits::get_shape(self.first());
+ }
+ constexpr static shape<dims> get_shape() { return ArgTraits::get_shape(); }
+ constexpr static inline bool random_access = false;
+
+ using T = value_type;
using expression_with_arguments<E>::expression_with_arguments;
expression_delay(E&& e, const delay_state<T, delay, STag>& state)
@@ -74,46 +81,54 @@ struct expression_delay : expression_with_arguments<E>
}
template <size_t N, KFR_ENABLE_IF(N <= delay)>
- friend KFR_INTRINSIC vec<T, N> get_elements(const expression_delay& self, cinput_t cinput, size_t index,
- vec_shape<T, N>)
+ friend KFR_INTRINSIC vec<T, N> get_elements(const expression_delay& self, shape<1> index,
+ axis_params<0, N> sh)
{
vec<T, N> out;
- size_t c = self.state.s.cursor;
- self.state.s.data.ringbuf_read(c, out);
- const vec<T, N> in = self.argument_first(cinput, index, vec_shape<T, N>());
- self.state.s.data.ringbuf_write(self.state.s.cursor, in);
+ size_t c = self.state->cursor;
+ self.state->data.ringbuf_read(c, out);
+ const vec<T, N> in = get_elements(self.first(), index, sh);
+ self.state->data.ringbuf_write(self.state->cursor, in);
return out;
}
- friend vec<T, 1> get_elements(const expression_delay& self, cinput_t cinput, size_t index,
- vec_shape<T, 1>)
+ friend vec<T, 1> get_elements(const expression_delay& self, shape<1> index, axis_params<0, 1> sh)
{
T out;
- size_t c = self.state.s.cursor;
- self.state.s.data.ringbuf_read(c, out);
- const T in = self.argument_first(cinput, index, vec_shape<T, 1>())[0];
- self.state.s.data.ringbuf_write(self.state.s.cursor, in);
+ size_t c = self.state->cursor;
+ self.state->data.ringbuf_read(c, out);
+ const T in = get_elements(self.first(), index, sh).front();
+ self.state->data.ringbuf_write(self.state->cursor, in);
return out;
}
template <size_t N, KFR_ENABLE_IF(N > delay)>
- friend vec<T, N> get_elements(const expression_delay& self, cinput_t cinput, size_t index,
- vec_shape<T, N>)
+ friend vec<T, N> get_elements(const expression_delay& self, shape<1> index, axis_params<0, N> sh)
{
vec<T, delay> out;
- size_t c = self.state.s.cursor;
- self.state.s.data.ringbuf_read(c, out);
- const vec<T, N> in = self.argument_first(cinput, index, vec_shape<T, N>());
- self.state.s.data.ringbuf_write(self.state.s.cursor, slice<N - delay, delay>(in));
+ size_t c = self.state->cursor;
+ self.state->data.ringbuf_read(c, out);
+ const vec<T, N> in = get_elements(self.first(), index, sh);
+ self.state->data.ringbuf_write(self.state->cursor, slice<N - delay, delay>(in));
return concat_and_slice<0, N>(out, in);
}
- state_holder<delay_state<T, delay, STag>, stateless> state;
+ state_holder<const delay_state<T, delay, STag>, stateless> state;
};
template <typename E, bool stateless, univector_tag STag>
-struct expression_delay<1, E, stateless, STag> : expression_with_arguments<E>
+struct expression_delay<1, E, stateless, STag> : expression_with_arguments<E>, expression_traits_defaults
{
- using value_type = value_type_of<E>;
- using T = value_type;
+ using ArgTraits = expression_traits<E>;
+ static_assert(ArgTraits::dims == 1, "expression_delay requires argument with dims == 1");
+ using value_type = typename ArgTraits::value_type;
+ constexpr static size_t dims = 1;
+ constexpr static shape<dims> get_shape(const expression_delay& self)
+ {
+ return ArgTraits::get_shape(self.first());
+ }
+ constexpr static shape<dims> get_shape() { return ArgTraits::get_shape(); }
+ constexpr static inline bool random_access = false;
+
+ using T = value_type;
using expression_with_arguments<E>::expression_with_arguments;
expression_delay(E&& e, const delay_state<T, 1, STag>& state)
@@ -122,17 +137,16 @@ struct expression_delay<1, E, stateless, STag> : expression_with_arguments<E>
}
template <size_t N>
- friend KFR_INTRINSIC vec<T, N> get_elements(const expression_delay& self, cinput_t cinput, size_t index,
- vec_shape<T, N>)
+ friend KFR_INTRINSIC vec<T, N> get_elements(const expression_delay& self, shape<1> index,
+ axis_params<0, N> sh)
{
- const vec<T, N> in = self.argument_first(cinput, index, vec_shape<T, N>());
- const vec<T, N> out = insertleft(self.state.s.data, in);
- self.state.s.data = in[N - 1];
+ const vec<T, N> in = get_elements(self.first(), index, sh);
+ const vec<T, N> out = insertleft(self.state->data, in);
+ self.state->data = in[N - 1];
return out;
}
- state_holder<delay_state<T, 1, STag>, stateless> state;
+ state_holder<const delay_state<T, 1, STag>, stateless> state;
};
-} // namespace internal
/**
* @brief Returns template expression that applies delay to the input (uses ring buffer internally)
@@ -143,12 +157,11 @@ struct expression_delay<1, E, stateless, STag> : expression_with_arguments<E>
* auto d = delay(v, csize<4>);
* @endcode
*/
-template <size_t samples = 1, typename E1, typename T = value_type_of<E1>>
-KFR_INTRINSIC internal::expression_delay<samples, E1, false, samples> delay(E1&& e1)
+template <size_t samples = 1, typename E1, typename T = expression_value_type<E1>>
+KFR_INTRINSIC expression_delay<samples, E1, false, samples> delay(E1&& e1)
{
static_assert(samples >= 1 && samples < 1024, "");
- return internal::expression_delay<samples, E1, false, samples>(std::forward<E1>(e1),
- delay_state<T, samples>());
+ return expression_delay<samples, E1, false, samples>(std::forward<E1>(e1), delay_state<T, samples>());
}
/**
@@ -162,11 +175,10 @@ KFR_INTRINSIC internal::expression_delay<samples, E1, false, samples> delay(E1&&
* @endcode
*/
template <size_t samples, typename T, typename E1, univector_tag STag>
-KFR_INTRINSIC internal::expression_delay<samples, E1, true, STag> delay(delay_state<T, samples, STag>& state,
- E1&& e1)
+KFR_INTRINSIC expression_delay<samples, E1, true, STag> delay(delay_state<T, samples, STag>& state, E1&& e1)
{
static_assert(STag == tag_dynamic_vector || (samples >= 1 && samples < 1024), "");
- return internal::expression_delay<samples, E1, true, STag>(std::forward<E1>(e1), state);
+ return expression_delay<samples, E1, true, STag>(std::forward<E1>(e1), state);
}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/dsp/ebu.hpp b/include/kfr/dsp/ebu.hpp
@@ -62,7 +62,7 @@ struct integrated_vec : public univector<T>
private:
void compute() const
{
- const T z_total = mean(*this);
+ const T z_total = mean(static_cast<const univector<T>&>(*this));
T relative_gate = energy_to_loudness(z_total) - 10;
T z = 0;
@@ -130,7 +130,7 @@ private:
static const T PRC_LOW = T(0.10);
static const T PRC_HIGH = T(0.95);
- const T z_total = mean(*this);
+ const T z_total = mean(static_cast<const univector<T>&>(*this));
const T relative_gate = energy_to_loudness(z_total) - 20;
if (this->size() < 2)
@@ -184,13 +184,13 @@ private:
};
template <typename T>
-KFR_INTRINSIC expression_pointer<T> make_kfilter(int samplerate)
+KFR_INTRINSIC expression_handle<T, 1> make_kfilter(int samplerate)
{
const biquad_params<T> bq[] = {
biquad_highshelf(T(1681.81 / samplerate), T(+4.0)),
biquad_highpass(T(38.1106678246655 / samplerate), T(0.5)).normalized_all()
};
- return to_pointer(biquad(bq, placeholder<T>()));
+ return to_handle(biquad(bq, placeholder<T>()));
}
template <typename T>
@@ -232,7 +232,7 @@ public:
void process_packet(const T* src)
{
- substitute(m_kfilter, to_pointer(make_univector(src, m_packet_size) * m_input_gain));
+ substitute(m_kfilter, to_handle(make_univector(src, m_packet_size) * m_input_gain));
const T filtered_sum_of_squares = sumsqr(truncate(m_kfilter, m_packet_size));
m_short_sum_of_squares.ringbuf_write(m_short_sum_of_squares_cursor, filtered_sum_of_squares);
@@ -245,7 +245,7 @@ private:
const Speaker m_speaker;
const T m_input_gain;
const size_t m_packet_size;
- expression_pointer<T> m_kfilter;
+ expression_handle<T, 1> m_kfilter;
univector<T> m_short_sum_of_squares;
univector<T> m_momentary_sum_of_squares;
T m_output_energy_gain;
@@ -264,6 +264,10 @@ public:
: m_sample_rate(sample_rate), m_running(true), m_need_reset(false),
m_packet_size(sample_rate / 10 / packet_size_factor)
{
+ KFR_LOGIC_CHECK(!channels.empty(), "channels must not be empty");
+ KFR_LOGIC_CHECK(sample_rate > 0, "sample_rate must be greater than 0");
+ KFR_LOGIC_CHECK(packet_size_factor >= 1 && packet_size_factor <= 3,
+ "packet_size_factor must be in range [1..3]");
for (Speaker sp : channels)
{
m_channels.emplace_back(sample_rate, sp, packet_size_factor, T(1));
diff --git a/include/kfr/dsp/fir.hpp b/include/kfr/dsp/fir.hpp
@@ -29,9 +29,10 @@
#include "../base/filter.hpp"
#include "../base/memory.hpp"
#include "../base/reduce.hpp"
+#include "../base/simd_expressions.hpp"
+#include "../base/state_holder.hpp"
#include "../base/univector.hpp"
#include "../simd/vec.hpp"
-#include "state_holder.hpp"
namespace kfr
{
@@ -86,115 +87,122 @@ struct moving_sum_state<U, tag_dynamic_vector>
mutable size_t head_cursor, tail_cursor;
};
-namespace internal
-{
-
template <size_t tapcount, typename T, typename U, typename E1, bool stateless = false>
-struct expression_short_fir : expression_with_arguments<E1>
+struct expression_short_fir : expression_with_traits<E1>
{
- using value_type = U;
+ using value_type = U; // override value_type
+
+ static_assert(expression_traits<E1>::dims == 1, "expression_short_fir requires input with dims == 1");
+ constexpr static inline bool random_access = false;
expression_short_fir(E1&& e1, const short_fir_state<tapcount, T, U>& state)
- : expression_with_arguments<E1>(std::forward<E1>(e1)), state(state)
+ : expression_with_traits<E1>(std::forward<E1>(e1)), state(state)
{
}
template <size_t N>
- KFR_INTRINSIC friend vec<U, N> get_elements(const expression_short_fir& self, cinput_t cinput,
- size_t index, vec_shape<U, N> x)
+ KFR_INTRINSIC friend vec<U, N> get_elements(const expression_short_fir& self, shape<1> index,
+ axis_params<0, N> sh)
{
- vec<U, N> in = self.argument_first(cinput, index, x);
+ vec<U, N> in = get_elements(self.first(), index, sh);
- vec<U, N> out = in * self.state.s.taps.front();
- cforeach(csizeseq<tapcount - 1, 1>, [&](auto I) {
- out = out +
- concat_and_slice<tapcount - 1 - I, N>(self.state.s.delayline, in) * self.state.s.taps[I];
- });
- self.state.s.delayline = concat_and_slice<N, tapcount - 1>(self.state.s.delayline, in);
+ vec<U, N> out = in * self.state->taps.front();
+ cforeach(csizeseq<tapcount - 1, 1>,
+ [&](auto I) {
+ out = out + concat_and_slice<tapcount - 1 - I, N>(self.state->delayline, in) *
+ self.state->taps[I];
+ });
+ self.state->delayline = concat_and_slice<N, tapcount - 1>(self.state->delayline, in);
return out;
}
- state_holder<short_fir_state<tapcount, T, U>, stateless> state;
+ state_holder<const short_fir_state<tapcount, T, U>, stateless> state;
};
template <typename T, typename U, typename E1, bool stateless = false>
-struct expression_fir : expression_with_arguments<E1>
+struct expression_fir : expression_with_traits<E1>
{
- using value_type = U;
+ using value_type = U; // override value_type
+
+ static_assert(expression_traits<E1>::dims == 1, "expression_fir requires input with dims == 1");
+ constexpr static inline bool random_access = false;
expression_fir(E1&& e1, const fir_state<T, U>& state)
- : expression_with_arguments<E1>(std::forward<E1>(e1)), state(state)
+ : expression_with_traits<E1>(std::forward<E1>(e1)), state(state)
{
}
template <size_t N>
- KFR_INTRINSIC friend vec<U, N> get_elements(const expression_fir& self, cinput_t cinput, size_t index,
- vec_shape<U, N> x)
+ KFR_INTRINSIC friend vec<U, N> get_elements(const expression_fir& self, shape<1> index,
+ axis_params<0, N> sh)
{
- const size_t tapcount = self.state.s.taps.size();
- const vec<U, N> input = self.argument_first(cinput, index, x);
+ const size_t tapcount = self.state->taps.size();
+ const vec<U, N> input = get_elements(self.first(), index, sh);
vec<U, N> output;
- size_t cursor = self.state.s.delayline_cursor;
+ size_t cursor = self.state->delayline_cursor;
CMT_LOOP_NOUNROLL
for (size_t i = 0; i < N; i++)
{
- self.state.s.delayline.ringbuf_write(cursor, input[i]);
- output[i] =
- dotproduct(self.state.s.taps, self.state.s.delayline.slice(cursor) /*, tapcount - cursor*/) +
- dotproduct(self.state.s.taps.slice(tapcount - cursor), self.state.s.delayline /*, cursor*/);
+ self.state->delayline.ringbuf_write(cursor, input[i]);
+ U v =
+ dotproduct(self.state->taps.slice(0, tapcount - cursor), self.state->delayline.slice(cursor));
+ if (cursor > 0)
+ v = v + dotproduct(self.state->taps.slice(tapcount - cursor),
+ self.state->delayline.slice(0, cursor));
+ output[i] = v;
}
- self.state.s.delayline_cursor = cursor;
+ self.state->delayline_cursor = cursor;
return output;
}
- state_holder<fir_state<T, U>, stateless> state;
+ state_holder<const fir_state<T, U>, stateless> state;
};
template <typename U, typename E1, univector_tag STag, bool stateless = false>
-struct expression_moving_sum : expression_with_arguments<E1>
+struct expression_moving_sum : expression_with_traits<E1>
{
- using value_type = U;
+ using value_type = U; // override value_type
+
+ static_assert(expression_traits<E1>::dims == 1, "expression_moving_sum requires input with dims == 1");
+ constexpr static inline bool random_access = false;
expression_moving_sum(E1&& e1, const moving_sum_state<U, STag>& state)
- : expression_with_arguments<E1>(std::forward<E1>(e1)), state(state)
+ : expression_with_traits<E1>(std::forward<E1>(e1)), state(state)
{
}
template <size_t N>
- KFR_INTRINSIC friend vec<U, N> get_elements(const expression_moving_sum& self, cinput_t cinput,
- size_t index, vec_shape<U, N> x)
+ KFR_INTRINSIC friend vec<U, N> get_elements(const expression_moving_sum& self, shape<1> index,
+ axis_params<0, N> sh)
{
- static_assert(N >= 1, "");
-
- const vec<U, N> input = self.argument_first(cinput, index, x);
+ const vec<U, N> input = get_elements(self.first(), index, sh);
vec<U, N> output;
- size_t wcursor = self.state.s.head_cursor;
- size_t rcursor = self.state.s.tail_cursor;
+ size_t wcursor = self.state->head_cursor;
+ size_t rcursor = self.state->tail_cursor;
// initial summation
- self.state.s.delayline.ringbuf_write(wcursor, input[0]);
- auto s = sum(self.state.s.delayline);
+ self.state->delayline.ringbuf_write(wcursor, input[0]);
+ auto s = sum(self.state->delayline);
output[0] = s;
CMT_LOOP_NOUNROLL
for (size_t i = 1; i < N; i++)
{
U nextout;
- self.state.s.delayline.ringbuf_read(rcursor, nextout);
- U const nextin = input[i];
- self.state.s.delayline.ringbuf_write(wcursor, nextin);
+ self.state->delayline.ringbuf_read(rcursor, nextout);
+ const U nextin = input[i];
+ self.state->delayline.ringbuf_write(wcursor, nextin);
s += nextin - nextout;
output[i] = s;
}
- self.state.s.delayline.ringbuf_step(rcursor, 1);
- self.state.s.head_cursor = wcursor;
- self.state.s.tail_cursor = rcursor;
+ self.state->delayline.ringbuf_step(rcursor, 1);
+ self.state->head_cursor = wcursor;
+ self.state->tail_cursor = rcursor;
return output;
}
- state_holder<moving_sum_state<U, STag>, stateless> state;
+ state_holder<const moving_sum_state<U, STag>, stateless> state;
};
-} // namespace internal
/**
* @brief Returns template expression that applies FIR filter to the input
@@ -202,9 +210,9 @@ struct expression_moving_sum : expression_with_arguments<E1>
* @param taps coefficients for the FIR filter
*/
template <typename T, typename E1, univector_tag Tag>
-KFR_INTRINSIC internal::expression_fir<T, value_type_of<E1>, E1> fir(E1&& e1, const univector<T, Tag>& taps)
+KFR_INTRINSIC expression_fir<T, expression_value_type<E1>, E1> fir(E1&& e1, const univector<T, Tag>& taps)
{
- return internal::expression_fir<T, value_type_of<E1>, E1>(std::forward<E1>(e1), taps.ref());
+ return expression_fir<T, expression_value_type<E1>, E1>(std::forward<E1>(e1), taps.ref());
}
/**
@@ -213,21 +221,20 @@ KFR_INTRINSIC internal::expression_fir<T, value_type_of<E1>, E1> fir(E1&& e1, co
* @param e1 an input expression
*/
template <typename T, typename U, typename E1>
-KFR_INTRINSIC internal::expression_fir<T, U, E1, true> fir(fir_state<T, U>& state, E1&& e1)
+KFR_INTRINSIC expression_fir<T, U, E1, true> fir(fir_state<T, U>& state, E1&& e1)
{
- return internal::expression_fir<T, U, E1, true>(std::forward<E1>(e1), state);
+ return expression_fir<T, U, E1, true>(std::forward<E1>(e1), state);
}
/**
* @brief Returns template expression that performs moving sum on the input
- * @param state moving sum state
* @param e1 an input expression
*/
template <size_t sum_length, typename E1>
-KFR_INTRINSIC internal::expression_moving_sum<value_type_of<E1>, E1, tag_dynamic_vector> moving_sum(E1&& e1)
+KFR_INTRINSIC expression_moving_sum<expression_value_type<E1>, E1, tag_dynamic_vector> moving_sum(E1&& e1)
{
- return internal::expression_moving_sum<value_type_of<E1>, E1, tag_dynamic_vector>(std::forward<E1>(e1),
- sum_length);
+ return expression_moving_sum<expression_value_type<E1>, E1, tag_dynamic_vector>(std::forward<E1>(e1),
+ sum_length);
}
/**
@@ -236,10 +243,9 @@ KFR_INTRINSIC internal::expression_moving_sum<value_type_of<E1>, E1, tag_dynamic
* @param e1 an input expression
*/
template <typename U, typename E1, univector_tag STag>
-KFR_INTRINSIC internal::expression_moving_sum<U, E1, STag, true> moving_sum(moving_sum_state<U, STag>& state,
- E1&& e1)
+KFR_INTRINSIC expression_moving_sum<U, E1, STag, true> moving_sum(moving_sum_state<U, STag>& state, E1&& e1)
{
- return internal::expression_moving_sum<U, E1, STag, true>(std::forward<E1>(e1), state);
+ return expression_moving_sum<U, E1, STag, true>(std::forward<E1>(e1), state);
}
/**
@@ -249,11 +255,11 @@ KFR_INTRINSIC internal::expression_moving_sum<U, E1, STag, true> moving_sum(movi
* @param taps coefficients for the FIR filter
*/
template <typename T, size_t TapCount, typename E1>
-KFR_INTRINSIC internal::expression_short_fir<next_poweroftwo(TapCount - 1) + 1, T, value_type_of<E1>, E1>
+KFR_INTRINSIC expression_short_fir<next_poweroftwo(TapCount - 1) + 1, T, expression_value_type<E1>, E1>
short_fir(E1&& e1, const univector<T, TapCount>& taps)
{
static_assert(TapCount >= 2 && TapCount <= 33, "Use short_fir only for small FIR filters");
- return internal::expression_short_fir<next_poweroftwo(TapCount - 1) + 1, T, value_type_of<E1>, E1>(
+ return expression_short_fir<next_poweroftwo(TapCount - 1) + 1, T, expression_value_type<E1>, E1>(
std::forward<E1>(e1), taps);
}
@@ -264,12 +270,11 @@ short_fir(E1&& e1, const univector<T, TapCount>& taps)
* @param e1 an input expression
*/
template <size_t TapCount, typename T, typename U, typename E1>
-KFR_INTRINSIC internal::expression_short_fir<next_poweroftwo(TapCount - 1) + 1, T, value_type_of<E1>, E1,
- true>
- short_fir(short_fir_state<next_poweroftwo(TapCount - 1) + 1, T, U>& state, E1&& e1)
+KFR_INTRINSIC expression_short_fir<next_poweroftwo(TapCount - 1) + 1, T, expression_value_type<E1>, E1, true>
+short_fir(short_fir_state<next_poweroftwo(TapCount - 1) + 1, T, U>& state, E1&& e1)
{
static_assert(TapCount >= 2 && TapCount <= 33, "Use short_fir only for small FIR filters");
- return internal::expression_short_fir<next_poweroftwo(TapCount - 1) + 1, T, value_type_of<E1>, E1, true>(
+ return expression_short_fir<next_poweroftwo(TapCount - 1) + 1, T, expression_value_type<E1>, E1, true>(
std::forward<E1>(e1), state);
}
@@ -293,7 +298,7 @@ protected:
{
make_univector(dest, size) = fir(state, make_univector(src, size));
}
- void process_expression(U* dest, const expression_pointer<U>& src, size_t size) final
+ void process_expression(U* dest, const expression_handle<U, 1>& src, size_t size) final
{
make_univector(dest, size) = fir(state, src);
}
diff --git a/include/kfr/dsp/fir_design.hpp b/include/kfr/dsp/fir_design.hpp
@@ -36,11 +36,10 @@ inline namespace CMT_ARCH_NAME
namespace internal
{
template <typename T>
-void fir_lowpass(univector_ref<T> taps, T cutoff, const expression_pointer<T>& window, bool normalize = true)
+void fir_lowpass(univector_ref<T> taps, T cutoff, const expression_handle<T>& window, bool normalize = true)
{
const T scale = 2.0 * cutoff;
- taps = bind_expression(fn::sinc(),
- symmlinspace<T, true>((taps.size() - 1) * cutoff * c_pi<T>, taps.size(), true)) *
+ taps = bind_expression(fn::sinc(), symmlinspace<T>((taps.size() - 1) * cutoff * c_pi<T>, taps.size())) *
scale * window;
if (is_odd(taps.size()))
@@ -53,11 +52,10 @@ void fir_lowpass(univector_ref<T> taps, T cutoff, const expression_pointer<T>& w
}
}
template <typename T>
-void fir_highpass(univector_ref<T> taps, T cutoff, const expression_pointer<T>& window, bool normalize = true)
+void fir_highpass(univector_ref<T> taps, T cutoff, const expression_handle<T>& window, bool normalize = true)
{
const T scale = 2.0 * -cutoff;
- taps = bind_expression(fn::sinc(),
- symmlinspace<T, true>((taps.size() - 1) * cutoff * c_pi<T>, taps.size(), true)) *
+ taps = bind_expression(fn::sinc(), symmlinspace<T>((taps.size() - 1) * cutoff * c_pi<T>, taps.size())) *
scale * window;
if (is_odd(taps.size()))
@@ -71,7 +69,7 @@ void fir_highpass(univector_ref<T> taps, T cutoff, const expression_pointer<T>&
}
template <typename T>
-void fir_bandpass(univector_ref<T> taps, T frequency1, T frequency2, const expression_pointer<T>& window,
+void fir_bandpass(univector_ref<T> taps, T frequency1, T frequency2, const expression_handle<T>& window,
bool normalize = true)
{
const T scale1 = 2.0 * frequency1;
@@ -80,8 +78,8 @@ void fir_bandpass(univector_ref<T> taps, T frequency1, T frequency2, const expre
const T start1 = sc * frequency1;
const T start2 = sc * frequency2;
- taps = (bind_expression(fn::sinc(), symmlinspace<T, true>(start2, taps.size(), true)) * scale2 -
- bind_expression(fn::sinc(), symmlinspace<T, true>(start1, taps.size(), true)) * scale1) *
+ taps = (bind_expression(fn::sinc(), symmlinspace<T>(start2, taps.size())) * scale2 -
+ bind_expression(fn::sinc(), symmlinspace<T>(start1, taps.size())) * scale1) *
window;
if (is_odd(taps.size()))
@@ -95,7 +93,7 @@ void fir_bandpass(univector_ref<T> taps, T frequency1, T frequency2, const expre
}
template <typename T>
-void fir_bandstop(univector_ref<T> taps, T frequency1, T frequency2, const expression_pointer<T>& window,
+void fir_bandstop(univector_ref<T> taps, T frequency1, T frequency2, const expression_handle<T>& window,
bool normalize = true)
{
const T scale1 = 2.0 * frequency1;
@@ -104,8 +102,8 @@ void fir_bandstop(univector_ref<T> taps, T frequency1, T frequency2, const expre
const T start1 = sc * frequency1;
const T start2 = sc * frequency2;
- taps = (bind_expression(fn::sinc(), symmlinspace<T, true>(start1, taps.size(), true)) * scale1 -
- bind_expression(fn::sinc(), symmlinspace<T, true>(start2, taps.size(), true)) * scale2) *
+ taps = (bind_expression(fn::sinc(), symmlinspace<T>(start1, taps.size())) * scale1 -
+ bind_expression(fn::sinc(), symmlinspace<T>(start2, taps.size())) * scale2) *
window;
if (is_odd(taps.size()))
@@ -132,7 +130,7 @@ KFR_I_FN_FULL(fir_bandstop, internal::fir_bandstop)
*/
template <typename T, univector_tag Tag>
KFR_INTRINSIC void fir_lowpass(univector<T, Tag>& taps, identity<T> cutoff,
- const expression_pointer<T>& window, bool normalize = true)
+ const expression_handle<T>& window, bool normalize = true)
{
return internal::fir_lowpass(taps.slice(), cutoff, window, normalize);
}
@@ -146,7 +144,7 @@ KFR_INTRINSIC void fir_lowpass(univector<T, Tag>& taps, identity<T> cutoff,
*/
template <typename T, univector_tag Tag>
KFR_INTRINSIC void fir_highpass(univector<T, Tag>& taps, identity<T> cutoff,
- const expression_pointer<T>& window, bool normalize = true)
+ const expression_handle<T>& window, bool normalize = true)
{
return internal::fir_highpass(taps.slice(), cutoff, window, normalize);
}
@@ -161,7 +159,7 @@ KFR_INTRINSIC void fir_highpass(univector<T, Tag>& taps, identity<T> cutoff,
*/
template <typename T, univector_tag Tag>
KFR_INTRINSIC void fir_bandpass(univector<T, Tag>& taps, identity<T> frequency1, identity<T> frequency2,
- const expression_pointer<T>& window, bool normalize = true)
+ const expression_handle<T>& window, bool normalize = true)
{
return internal::fir_bandpass(taps.slice(), frequency1, frequency2, window, normalize);
}
@@ -176,7 +174,7 @@ KFR_INTRINSIC void fir_bandpass(univector<T, Tag>& taps, identity<T> frequency1,
*/
template <typename T, univector_tag Tag>
KFR_INTRINSIC void fir_bandstop(univector<T, Tag>& taps, identity<T> frequency1, identity<T> frequency2,
- const expression_pointer<T>& window, bool normalize = true)
+ const expression_handle<T>& window, bool normalize = true)
{
return internal::fir_bandstop(taps.slice(), frequency1, frequency2, window, normalize);
}
@@ -186,7 +184,7 @@ KFR_INTRINSIC void fir_bandstop(univector<T, Tag>& taps, identity<T> frequency1,
*/
template <typename T>
KFR_INTRINSIC void fir_lowpass(const univector_ref<T>& taps, identity<T> cutoff,
- const expression_pointer<T>& window, bool normalize = true)
+ const expression_handle<T>& window, bool normalize = true)
{
return internal::fir_lowpass(taps, cutoff, window, normalize);
}
@@ -196,7 +194,7 @@ KFR_INTRINSIC void fir_lowpass(const univector_ref<T>& taps, identity<T> cutoff,
*/
template <typename T>
KFR_INTRINSIC void fir_highpass(const univector_ref<T>& taps, identity<T> cutoff,
- const expression_pointer<T>& window, bool normalize = true)
+ const expression_handle<T>& window, bool normalize = true)
{
return internal::fir_highpass(taps, cutoff, window, normalize);
}
@@ -206,7 +204,7 @@ KFR_INTRINSIC void fir_highpass(const univector_ref<T>& taps, identity<T> cutoff
*/
template <typename T>
KFR_INTRINSIC void fir_bandpass(const univector_ref<T>& taps, identity<T> frequency1, identity<T> frequency2,
- const expression_pointer<T>& window, bool normalize = true)
+ const expression_handle<T>& window, bool normalize = true)
{
return internal::fir_bandpass(taps, frequency1, frequency2, window, normalize);
}
@@ -216,7 +214,7 @@ KFR_INTRINSIC void fir_bandpass(const univector_ref<T>& taps, identity<T> freque
*/
template <typename T>
KFR_INTRINSIC void fir_bandstop(const univector_ref<T>& taps, identity<T> frequency1, identity<T> frequency2,
- const expression_pointer<T>& window, bool normalize = true)
+ const expression_handle<T>& window, bool normalize = true)
{
return internal::fir_bandstop(taps, frequency1, frequency2, window, normalize);
}
diff --git a/include/kfr/dsp/fracdelay.hpp b/include/kfr/dsp/fracdelay.hpp
@@ -34,12 +34,12 @@ inline namespace CMT_ARCH_NAME
{
template <typename T, typename E1>
-KFR_INTRINSIC internal::expression_short_fir<2, T, value_type_of<E1>, E1> fracdelay(E1&& e1, T delay)
+KFR_INTRINSIC expression_short_fir<2, T, expression_value_type<E1>, E1> fracdelay(E1&& e1, T delay)
{
- if (delay < 0)
+ if (CMT_UNLIKELY(delay < 0))
delay = 0;
univector<T, 2> taps({ 1 - delay, delay });
- return internal::expression_short_fir<2, T, value_type_of<E1>, E1>(std::forward<E1>(e1), taps);
+ return expression_short_fir<2, T, expression_value_type<E1>, E1>(std::forward<E1>(e1), taps);
}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/dsp/goertzel.hpp b/include/kfr/dsp/goertzel.hpp
@@ -35,12 +35,11 @@ namespace kfr
inline namespace CMT_ARCH_NAME
{
-namespace internal
-{
-
template <typename T>
-struct expression_goertzel : output_expression
+struct expression_goertzel : expression_traits_defaults
{
+ using value_type = accepts_any;
+
expression_goertzel(complex<T>& result, T omega)
: result(result), omega(omega), coeff(2 * cos(omega)), q0(), q1(), q2()
{
@@ -51,15 +50,15 @@ struct expression_goertzel : output_expression
result.imag(q2 * sin(omega));
}
template <typename U, size_t N>
- KFR_MEM_INTRINSIC void operator()(coutput_t, size_t, const vec<U, N>& x)
+ KFR_INTRINSIC friend void set_elements(expression_goertzel& self, shape<1>, const vec<U, N>& x)
{
vec<T, N> in = x;
CMT_LOOP_UNROLL
for (size_t i = 0; i < N; i++)
{
- q0 = coeff * q1 - q2 + in[i];
- q2 = q1;
- q1 = q0;
+ self.q0 = self.coeff * self.q1 - self.q2 + in[i];
+ self.q2 = self.q1;
+ self.q1 = self.q0;
}
}
complex<T>& result;
@@ -71,8 +70,10 @@ struct expression_goertzel : output_expression
};
template <typename T, size_t width>
-struct expression_parallel_goertzel : output_expression
+struct expression_parallel_goertzel : expression_traits_defaults
{
+ using value_type = accepts_any;
+
expression_parallel_goertzel(complex<T> result[], vec<T, width> omega)
: result(result), omega(omega), coeff(cos(omega)), q0(), q1(), q2()
{
@@ -88,15 +89,15 @@ struct expression_parallel_goertzel : output_expression
}
}
template <typename U, size_t N>
- KFR_MEM_INTRINSIC void operator()(coutput_t, size_t, const vec<U, N>& x)
+ KFR_INTRINSIC friend void set_elements(expression_parallel_goertzel& self, shape<1>, const vec<U, N>& x)
{
const vec<T, N> in = x;
CMT_LOOP_UNROLL
for (size_t i = 0; i < N; i++)
{
- q0 = coeff * q1 - q2 + in[i];
- q2 = q1;
- q1 = q0;
+ self.q0 = self.coeff * self.q1 - self.q2 + in[i];
+ self.q2 = self.q1;
+ self.q1 = self.q0;
}
}
complex<T>* result;
@@ -106,19 +107,18 @@ struct expression_parallel_goertzel : output_expression
vec<T, width> q1;
vec<T, width> q2;
};
-} // namespace internal
template <typename T>
-KFR_INTRINSIC internal::expression_goertzel<T> goertzel(complex<T>& result, identity<T> omega)
+KFR_INTRINSIC expression_goertzel<T> goertzel(complex<T>& result, identity<T> omega)
{
- return internal::expression_goertzel<T>(result, omega);
+ return expression_goertzel<T>(result, omega);
}
template <typename T, size_t width>
-KFR_INTRINSIC internal::expression_parallel_goertzel<T, width> goertzel(complex<T> (&result)[width],
- const T (&omega)[width])
+KFR_INTRINSIC expression_parallel_goertzel<T, width> goertzel(complex<T> (&result)[width],
+ const T (&omega)[width])
{
- return internal::expression_parallel_goertzel<T, width>(result, read<width>(omega));
+ return expression_parallel_goertzel<T, width>(result, read<width>(omega));
}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/dsp/iir_design.hpp b/include/kfr/dsp/iir_design.hpp
@@ -26,8 +26,9 @@
#pragma once
#include "../base/filter.hpp"
-#include "../base/pointer.hpp"
+#include "../base/handle.hpp"
#include "../math/hyperbolic.hpp"
+#include "../simd/complex.hpp"
#include "../simd/impl/function.hpp"
#include "../simd/operators.hpp"
#include "../simd/vec.hpp"
@@ -59,7 +60,7 @@ KFR_FUNCTION zpk<T> chebyshev1(int N, identity<T> rp)
T eps = sqrt(exp10(0.1 * rp) - 1.0);
T mu = 1.0 / N * std::asinh(1 / eps);
- univector<T> m = linspace(-N + 1, N + 1, N, false, true);
+ univector<T> m = linspace(-N + 1, N + 1, N, false, ctrue);
univector<T> theta = c_pi<T> * m / (2 * N);
univector<complex<T>> p = -csinh(make_complex(mu, theta));
@@ -84,17 +85,17 @@ KFR_FUNCTION zpk<T> chebyshev2(int N, identity<T> rs)
if (N % 2)
{
- m = concatenate(linspace(-N + 1, -2, N / 2, true, true), linspace(2, N - 1, N / 2, true, true));
+ m = concatenate(linspace(-N + 1, -2, N / 2, true, ctrue), linspace(2, N - 1, N / 2, true, ctrue));
}
else
{
- m = linspace(-N + 1, N + 1, N, false, true);
+ m = linspace(-N + 1, N + 1, N, false, ctrue);
}
univector<complex<T>> z = -cconj(complex<T>(0, 1) / sin(m * c_pi<T> / (2.0 * N)));
univector<complex<T>> p =
- -cexp(complex<T>(0, 1) * c_pi<T> * linspace(-N + 1, N + 1, N, false, true) / (2 * N));
+ -cexp(complex<T>(0, 1) * c_pi<T> * linspace(-N + 1, N + 1, N, false, ctrue) / (2 * N));
p = make_complex(sinh(mu) * real(p), cosh(mu) * imag(p));
p = 1.0 / p;
@@ -897,7 +898,8 @@ template <typename T>
KFR_FUNCTION univector<complex<T>> cplxreal(const univector<complex<T>>& list)
{
univector<complex<T>> x = list;
- std::sort(x.begin(), x.end(), [](const complex<T>& a, const complex<T>& b) { return a.real() < b.real(); });
+ std::sort(x.begin(), x.end(),
+ [](const complex<T>& a, const complex<T>& b) { return a.real() < b.real(); });
T tol = std::numeric_limits<T>::epsilon() * 100;
univector<complex<T>> result = x;
for (size_t i = result.size(); i > 1; i--)
@@ -1213,4 +1215,4 @@ KFR_FUNCTION std::vector<biquad_params<T>> to_sos(const zpk<T>& filter)
}
} // namespace CMT_ARCH_NAME
-} // namespace kfr
-\ No newline at end of file
+} // namespace kfr
diff --git a/include/kfr/dsp/mixdown.hpp b/include/kfr/dsp/mixdown.hpp
@@ -36,13 +36,11 @@ inline namespace CMT_ARCH_NAME
* @brief Returns template expression that returns the sum of all the inputs
*/
template <typename... E>
-internal::expression_function<fn::add, E...> mixdown(E&&... e)
+expression_function<fn::add, E...> mixdown(E&&... e)
{
- return internal::expression_function<fn::add, E...>(fn::add(), std::forward<E>(e)...);
+ return expression_function<fn::add, E...>(fn::add(), std::forward<E>(e)...);
}
-namespace internal
-{
struct stereo_matrix
{
template <typename T, size_t N>
@@ -57,7 +55,6 @@ struct stereo_matrix
}
const f64x2x2 matrix;
};
-} // namespace internal
template <int = 0>
CMT_GNU_CONSTEXPR f64x2x2 matrix_sum_diff()
@@ -75,12 +72,10 @@ CMT_GNU_CONSTEXPR f64x2x2 matrix_halfsum_halfdiff()
* channels
*/
template <typename Left, typename Right,
- typename Result =
- internal::expression_function<internal::stereo_matrix, internal::expression_pack<Left, Right>>>
+ typename Result = expression_function<stereo_matrix, expression_pack<Left, Right>>>
Result mixdown_stereo(Left&& left, Right&& right, const f64x2x2& matrix)
{
- return Result(internal::stereo_matrix{ matrix },
- pack(std::forward<Left>(left), std::forward<Right>(right)));
+ return Result(stereo_matrix{ matrix }, pack(std::forward<Left>(left), std::forward<Right>(right)));
}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/dsp/oscillators.hpp b/include/kfr/dsp/oscillators.hpp
@@ -26,7 +26,9 @@
#pragma once
#include "../base/basic_expressions.hpp"
+#include "../base/simd_expressions.hpp"
#include "../math/sin_cos.hpp"
+#include "../simd/round.hpp"
namespace kfr
{
@@ -143,9 +145,9 @@ KFR_FUNCTION T1 rawsine(const T1& x)
return intrinsics::rawsine(x);
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::rawsine, E1> rawsine(E1&& x)
+KFR_FUNCTION expression_function<fn::rawsine, E1> rawsine(E1&& x)
{
- return { fn::rawsine(), std::forward<E1>(x) };
+ return { std::forward<E1>(x) };
}
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 sine(const T1& x)
@@ -153,9 +155,9 @@ KFR_FUNCTION T1 sine(const T1& x)
return intrinsics::sine(x);
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::sine, E1> sine(E1&& x)
+KFR_FUNCTION expression_function<fn::sine, E1> sine(E1&& x)
{
- return { fn::sine(), std::forward<E1>(x) };
+ return { std::forward<E1>(x) };
}
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 sinenorm(const T1& x)
@@ -163,7 +165,7 @@ KFR_FUNCTION T1 sinenorm(const T1& x)
return intrinsics::sinenorm(x);
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::sinenorm, E1> sinenorm(E1&& x)
+KFR_FUNCTION expression_function<fn::sinenorm, E1> sinenorm(E1&& x)
{
return { fn::sinenorm(), std::forward<E1>(x) };
}
@@ -173,7 +175,7 @@ KFR_FUNCTION T1 rawsquare(const T1& x)
return intrinsics::rawsquare(x);
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::rawsquare, E1> rawsquare(E1&& x)
+KFR_FUNCTION expression_function<fn::rawsquare, E1> rawsquare(E1&& x)
{
return { fn::rawsquare(), std::forward<E1>(x) };
}
@@ -183,7 +185,7 @@ KFR_FUNCTION T1 square(const T1& x)
return intrinsics::square(x);
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::square, E1> square(E1&& x)
+KFR_FUNCTION expression_function<fn::square, E1> square(E1&& x)
{
return { fn::square(), std::forward<E1>(x) };
}
@@ -193,7 +195,7 @@ KFR_FUNCTION T1 squarenorm(const T1& x)
return intrinsics::squarenorm(x);
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::squarenorm, E1> squarenorm(E1&& x)
+KFR_FUNCTION expression_function<fn::squarenorm, E1> squarenorm(E1&& x)
{
return { fn::squarenorm(), std::forward<E1>(x) };
}
@@ -203,7 +205,7 @@ KFR_FUNCTION T1 rawtriangle(const T1& x)
return intrinsics::rawtriangle(x);
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::rawtriangle, E1> rawtriangle(E1&& x)
+KFR_FUNCTION expression_function<fn::rawtriangle, E1> rawtriangle(E1&& x)
{
return { fn::rawtriangle(), std::forward<E1>(x) };
}
@@ -213,7 +215,7 @@ KFR_FUNCTION T1 triangle(const T1& x)
return intrinsics::triangle(x);
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::triangle, E1> triangle(E1&& x)
+KFR_FUNCTION expression_function<fn::triangle, E1> triangle(E1&& x)
{
return { fn::triangle(), std::forward<E1>(x) };
}
@@ -223,7 +225,7 @@ KFR_FUNCTION T1 trianglenorm(const T1& x)
return intrinsics::trianglenorm(x);
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::trianglenorm, E1> trianglenorm(E1&& x)
+KFR_FUNCTION expression_function<fn::trianglenorm, E1> trianglenorm(E1&& x)
{
return { fn::trianglenorm(), std::forward<E1>(x) };
}
@@ -233,7 +235,7 @@ KFR_FUNCTION T1 rawsawtooth(const T1& x)
return intrinsics::rawsawtooth(x);
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::rawsawtooth, E1> rawsawtooth(E1&& x)
+KFR_FUNCTION expression_function<fn::rawsawtooth, E1> rawsawtooth(E1&& x)
{
return { fn::rawsawtooth(), std::forward<E1>(x) };
}
@@ -243,7 +245,7 @@ KFR_FUNCTION T1 sawtooth(const T1& x)
return intrinsics::sawtooth(x);
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::sawtooth, E1> sawtooth(E1&& x)
+KFR_FUNCTION expression_function<fn::sawtooth, E1> sawtooth(E1&& x)
{
return { fn::sawtooth(), std::forward<E1>(x) };
}
@@ -253,7 +255,7 @@ KFR_FUNCTION T1 sawtoothnorm(const T1& x)
return intrinsics::sawtoothnorm(x);
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::sawtoothnorm, E1> sawtoothnorm(E1&& x)
+KFR_FUNCTION expression_function<fn::sawtoothnorm, E1> sawtoothnorm(E1&& x)
{
return { fn::sawtoothnorm(), std::forward<E1>(x) };
}
@@ -263,7 +265,7 @@ KFR_FUNCTION T1 isawtooth(const T1& x)
return intrinsics::isawtooth(x);
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::isawtooth, E1> isawtooth(E1&& x)
+KFR_FUNCTION expression_function<fn::isawtooth, E1> isawtooth(E1&& x)
{
return { fn::isawtooth(), std::forward<E1>(x) };
}
@@ -273,7 +275,7 @@ KFR_FUNCTION T1 isawtoothnorm(const T1& x)
return intrinsics::isawtoothnorm(x);
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::isawtoothnorm, E1> isawtoothnorm(E1&& x)
+KFR_FUNCTION expression_function<fn::isawtoothnorm, E1> isawtoothnorm(E1&& x)
{
return { fn::isawtoothnorm(), std::forward<E1>(x) };
}
diff --git a/include/kfr/dsp/sample_rate_conversion.hpp b/include/kfr/dsp/sample_rate_conversion.hpp
@@ -27,6 +27,9 @@
#include "../base/memory.hpp"
#include "../base/reduce.hpp"
+#include "../base/univector.hpp"
+#include "../math/modzerobessel.hpp"
+#include "../math/sqrt.hpp"
#include "../simd/impl/function.hpp"
#include "../simd/vec.hpp"
#include "window.hpp"
@@ -203,14 +206,16 @@ public:
}
else if (input_start >= input_position)
{
- output[i] = dotproduct(input.slice(input_start - input_position, depth), tap_ptr);
+ output[i] =
+ dotproduct(input.slice(input_start - input_position, depth), tap_ptr.truncate(depth));
}
else
{
const itype prev_count = input_position - input_start;
- output[i] = dotproduct(delay.slice(size_t(depth - prev_count)), tap_ptr) +
- dotproduct(input.slice(0, size_t(depth - prev_count)),
- tap_ptr.slice(size_t(prev_count), size_t(depth - prev_count)));
+ output[i] =
+ dotproduct(delay.slice(size_t(depth - prev_count)), tap_ptr.truncate(prev_count)) +
+ dotproduct(input.truncate(size_t(depth - prev_count)),
+ tap_ptr.slice(size_t(prev_count), size_t(depth - prev_count)));
}
}
@@ -254,28 +259,28 @@ template <size_t factor, size_t offset, typename E>
struct expression_downsample;
template <typename E>
-struct expression_upsample<2, E> : expression_with_arguments<E>
+struct expression_upsample<2, E> : expression_with_arguments<E>, expression_traits_defaults
{
using expression_with_arguments<E>::expression_with_arguments;
- using value_type = value_type_of<E>;
+ using value_type = expression_value_type<E>;
using T = value_type;
KFR_MEM_INTRINSIC size_t size() const CMT_NOEXCEPT { return expression_with_arguments<E>::size() * 2; }
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_upsample& self, cinput_t cinput,
- size_t index, vec_shape<T, N>)
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_upsample& self, index_t index,
+ axis_params<0, N>)
{
- const vec<T, N / 2> x = self.argument_first(cinput, index / 2, vec_shape<T, N / 2>());
+ const vec<T, N / 2> x = get_elements(self.first(), index / 2, axis_params<0, N / 2>());
return interleave(x, zerovector(x));
}
- KFR_INTRINSIC friend vec<T, 1> get_elements(const expression_upsample& self, cinput_t cinput,
- size_t index, vec_shape<T, 1>)
+ KFR_INTRINSIC friend vec<T, 1> get_elements(const expression_upsample& self, index_t index,
+ axis_params<0, 1>)
{
if (index & 1)
return 0;
else
- return self.argument_first(cinput, index / 2, vec_shape<T, 1>());
+ return get_elements(self.first(), index / 2, axis_params<0, 1>());
}
};
@@ -283,39 +288,39 @@ template <typename E>
struct expression_upsample<4, E> : expression_with_arguments<E>
{
using expression_with_arguments<E>::expression_with_arguments;
- using value_type = value_type_of<E>;
+ using value_type = expression_value_type<E>;
using T = value_type;
KFR_MEM_INTRINSIC size_t size() const CMT_NOEXCEPT { return expression_with_arguments<E>::size() * 4; }
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_upsample& self, cinput_t cinput,
- size_t index, vec_shape<T, N>) CMT_NOEXCEPT
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_upsample& self, index_t index,
+ axis_params<0, N>) CMT_NOEXCEPT
{
- const vec<T, N / 4> x = self.argument_first(cinput, index / 4, vec_shape<T, N / 4>());
+ const vec<T, N / 4> x = get_elements(self.first(), index / 4, axis_params<0, N / 4>());
const vec<T, N / 2> xx = interleave(x, zerovector(x));
return interleave(xx, zerovector(xx));
}
- KFR_INTRINSIC friend vec<T, 2> get_elements(const expression_upsample& self, cinput_t cinput,
- size_t index, vec_shape<T, 2>) CMT_NOEXCEPT
+ KFR_INTRINSIC friend vec<T, 2> get_elements(const expression_upsample& self, index_t index,
+ axis_params<0, 2>) CMT_NOEXCEPT
{
switch (index & 3)
{
case 0:
- return interleave(self.argument_first(cinput, index / 4, vec_shape<T, 1>()), zerovector<T, 1>());
+ return interleave(get_elements(self.first(), index / 4, axis_params<0, 1>()), zerovector<T, 1>());
case 3:
- return interleave(zerovector<T, 1>(), self.argument_first(cinput, index / 4, vec_shape<T, 1>()));
+ return interleave(zerovector<T, 1>(), get_elements(self.first(), index / 4, axis_params<0, 1>()));
default:
return 0;
}
}
- KFR_INTRINSIC friend vec<T, 1> get_elements(const expression_upsample& self, cinput_t cinput,
- size_t index, vec_shape<T, 1>) CMT_NOEXCEPT
+ KFR_INTRINSIC friend vec<T, 1> get_elements(const expression_upsample& self, index_t index,
+ axis_params<0, 1>) CMT_NOEXCEPT
{
if (index & 3)
return 0;
else
- return self.argument_first(cinput, index / 4, vec_shape<T, 1>());
+ return get_elements(self.first(), index / 4, axis_params<0, 1>());
}
};
@@ -323,16 +328,16 @@ template <typename E, size_t offset>
struct expression_downsample<2, offset, E> : expression_with_arguments<E>
{
using expression_with_arguments<E>::expression_with_arguments;
- using value_type = value_type_of<E>;
+ using value_type = expression_value_type<E>;
using T = value_type;
KFR_MEM_INTRINSIC size_t size() const CMT_NOEXCEPT { return expression_with_arguments<E>::size() / 2; }
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_downsample& self, cinput_t cinput,
- size_t index, vec_shape<T, N>) CMT_NOEXCEPT
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_downsample& self, size_t index,
+ axis_params<0, N>) CMT_NOEXCEPT
{
- const vec<T, N* 2> x = self.argument_first(cinput, index * 2, vec_shape<T, N * 2>());
+ const vec<T, N* 2> x = get_elements(self.first(), index * 2, axis_params<0, N * 2>());
return x.shuffle(csizeseq<N, offset, 2>);
}
};
@@ -341,16 +346,16 @@ template <typename E, size_t offset>
struct expression_downsample<4, offset, E> : expression_with_arguments<E>
{
using expression_with_arguments<E>::expression_with_arguments;
- using value_type = value_type_of<E>;
+ using value_type = expression_value_type<E>;
using T = value_type;
KFR_MEM_INTRINSIC size_t size() const CMT_NOEXCEPT { return expression_with_arguments<E>::size() / 4; }
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_downsample& self, cinput_t cinput,
- size_t index, vec_shape<T, N>) CMT_NOEXCEPT
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_downsample& self, index_t index,
+ axis_params<0, N>) CMT_NOEXCEPT
{
- const vec<T, N* 4> x = self.argument_first(cinput, index * 4, vec_shape<T, N * 4>());
+ const vec<T, N* 4> x = get_elements(self.first(), index * 4, axis_params<0, N * 4>());
return x.shuffle(csizeseq<N, offset, 4>);
}
};
diff --git a/include/kfr/dsp/special.hpp b/include/kfr/dsp/special.hpp
@@ -40,12 +40,15 @@ inline namespace CMT_ARCH_NAME
template <typename T = int>
auto unitimpulse()
{
- return lambda<T>([](cinput_t, size_t index, auto x) {
- if (index == 0)
- return onoff(x);
- else
- return zerovector(x);
- });
+ return lambda<T>(
+ [](shape<1> index, auto x)
+ {
+ vec_shape<T, decltype(x)::value> sh{};
+ if (CMT_UNLIKELY(index[0] == 0))
+ return onoff(sh);
+ else
+ return zerovector(sh);
+ });
}
template <typename T = fbase>
diff --git a/include/kfr/dsp/state_holder.hpp b/include/kfr/dsp/state_holder.hpp
@@ -1,41 +0,0 @@
-/** @addtogroup fir
- * @{
- */
-/**
- * KFR (http://kfrlib.com)
- * Copyright (C) 2016-2022 Fractalium Ltd
- * See LICENSE.txt for details
- */
-#pragma once
-
-#include "../cident.h"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-namespace internal
-{
-
-template <typename T, bool stateless>
-struct state_holder
-{
- state_holder() = delete;
- state_holder(const state_holder&) = default;
- state_holder(state_holder&&) = default;
- constexpr state_holder(const T& state) CMT_NOEXCEPT : s(state) {}
- T s;
-};
-
-template <typename T>
-struct state_holder<T, true>
-{
- state_holder() = delete;
- state_holder(const state_holder&) = default;
- state_holder(state_holder&&) = default;
- constexpr state_holder(const T& state) CMT_NOEXCEPT : s(state) {}
- const T& s;
-};
-} // namespace internal
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/include/kfr/dsp/units.hpp b/include/kfr/dsp/units.hpp
@@ -26,8 +26,8 @@
#pragma once
#include "../base/basic_expressions.hpp"
-#include "../math/abs.hpp"
#include "../math/log_exp.hpp"
+#include "../simd/abs.hpp"
#include "../simd/vec.hpp"
namespace kfr
@@ -40,7 +40,7 @@ using sample_rate_t = double;
namespace intrinsics
{
template <typename T1, typename T2>
-KFR_INTRINSIC common_type<T1, T2> fix_nans(const T1& val, const T2& replacement)
+KFR_INTRINSIC std::common_type_t<T1, T2> fix_nans(const T1& val, const T2& replacement)
{
return select(val != val, replacement, val);
}
@@ -86,7 +86,7 @@ KFR_INTRINSIC Tout power_to_dB(const T& x)
template <typename T, typename Tout = flt_type<T>>
KFR_INTRINSIC Tout dB_to_power(const T& x)
{
- if (x == -c_infinity<Tout>)
+ if (CMT_UNLIKELY(x == -c_infinity<Tout>))
return 0.0;
else
return exp(x * (c_log_10<Tout> / 10.0));
@@ -108,7 +108,7 @@ KFR_INTRINSIC TF hertz_to_note(const T& hertz)
return intrinsics::log_fmadd(hertz, subtype<TF>(17.312340490667560888319096172023), offset);
}
-template <typename T1, typename T2, typename T3, typename Tc = flt_type<common_type<T1, T2, T3, f32>>>
+template <typename T1, typename T2, typename T3, typename Tc = flt_type<std::common_type_t<T1, T2, T3, f32>>>
KFR_INTRINSIC Tc note_to_hertz(const T1& note, const T2& tunenote, const T3& tunehertz)
{
const Tc offset = log(tunehertz) - tunenote * subtype<Tc>(0.05776226504666210911810267678818);
@@ -116,7 +116,7 @@ KFR_INTRINSIC Tc note_to_hertz(const T1& note, const T2& tunenote, const T3& tun
return intrinsics::exp_fmadd(note, subtype<Tc>(0.05776226504666210911810267678818), offset);
}
-template <typename T1, typename T2, typename T3, typename Tc = flt_type<common_type<T1, T2, T3, f32>>>
+template <typename T1, typename T2, typename T3, typename Tc = flt_type<std::common_type_t<T1, T2, T3, f32>>>
KFR_INTRINSIC Tc hertz_to_note(const T1& hertz, const T2& tunenote, const T3& tunehertz)
{
const Tc offset = tunenote - log(tunehertz) * subtype<Tc>(17.312340490667560888319096172023);
@@ -137,8 +137,8 @@ KFR_FUNCTION flt_type<T1> note_to_hertz(const T1& x)
return intrinsics::note_to_hertz(x);
}
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::note_to_hertz, E1> note_to_hertz(E1&& x)
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::note_to_hertz, E1> note_to_hertz(E1&& x)
{
return { fn::note_to_hertz(), std::forward<E1>(x) };
}
@@ -149,8 +149,8 @@ KFR_FUNCTION flt_type<T1> hertz_to_note(const T1& x)
return intrinsics::hertz_to_note(x);
}
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::hertz_to_note, E1> hertz_to_note(E1&& x)
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::hertz_to_note, E1> hertz_to_note(E1&& x)
{
return { fn::hertz_to_note(), std::forward<E1>(x) };
}
@@ -161,8 +161,8 @@ KFR_FUNCTION flt_type<T1> amp_to_dB(const T1& x)
return intrinsics::amp_to_dB(x);
}
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::amp_to_dB, E1> amp_to_dB(E1&& x)
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::amp_to_dB, E1> amp_to_dB(E1&& x)
{
return { fn::amp_to_dB(), std::forward<E1>(x) };
}
@@ -173,8 +173,8 @@ KFR_FUNCTION flt_type<T1> dB_to_amp(const T1& x)
return intrinsics::dB_to_amp(x);
}
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::dB_to_amp, E1> dB_to_amp(E1&& x)
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::dB_to_amp, E1> dB_to_amp(E1&& x)
{
return { fn::dB_to_amp(), std::forward<E1>(x) };
}
@@ -185,8 +185,8 @@ KFR_FUNCTION flt_type<T1> power_to_dB(const T1& x)
return intrinsics::power_to_dB(x);
}
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::power_to_dB, E1> power_to_dB(E1&& x)
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::power_to_dB, E1> power_to_dB(E1&& x)
{
return { fn::power_to_dB(), std::forward<E1>(x) };
}
@@ -197,8 +197,8 @@ KFR_FUNCTION flt_type<T1> dB_to_power(const T1& x)
return intrinsics::dB_to_power(x);
}
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::dB_to_power, E1> dB_to_power(E1&& x)
+template <typename E1, KFR_ACCEPT_EXPRESSIONS(E1)>
+KFR_FUNCTION expression_function<fn::dB_to_power, E1> dB_to_power(E1&& x)
{
return { fn::dB_to_power(), std::forward<E1>(x) };
}
diff --git a/include/kfr/dsp/waveshaper.hpp b/include/kfr/dsp/waveshaper.hpp
@@ -25,8 +25,9 @@
*/
#pragma once
-#include "../math/clamp.hpp"
+#include "../base/expression.hpp"
#include "../math/hyperbolic.hpp"
+#include "../simd/clamp.hpp"
#include "../simd/operators.hpp"
namespace kfr
@@ -63,13 +64,13 @@ KFR_FUNCTION flt_type<T1> saturate_II(const T1& x)
KFR_FN(saturate_II)
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::saturate_II, E1> saturate_I(E1&& x)
+KFR_FUNCTION expression_function<fn::saturate_II, E1> saturate_I(E1&& x)
{
return { fn::saturate_I(), std::forward<E1>(x) };
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::saturate_II, E1> saturate_II(E1&& x)
+KFR_FUNCTION expression_function<fn::saturate_II, E1> saturate_II(E1&& x)
{
return { fn::saturate_II(), std::forward<E1>(x) };
}
diff --git a/include/kfr/dsp/weighting.hpp b/include/kfr/dsp/weighting.hpp
@@ -25,6 +25,7 @@
*/
#pragma once
+#include "../base/expression.hpp"
#include "../math/sqrt.hpp"
#include "../simd/operators.hpp"
@@ -103,7 +104,7 @@ KFR_INTRINSIC T1 aweighting(const T1& x)
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::aweighting, E1> aweighting(E1&& x)
+KFR_INTRINSIC expression_function<fn::aweighting, E1> aweighting(E1&& x)
{
return { fn::aweighting(), std::forward<E1>(x) };
}
@@ -115,7 +116,7 @@ KFR_INTRINSIC T1 bweighting(const T1& x)
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::bweighting, E1> bweighting(E1&& x)
+KFR_INTRINSIC expression_function<fn::bweighting, E1> bweighting(E1&& x)
{
return { fn::bweighting(), std::forward<E1>(x) };
}
@@ -127,7 +128,7 @@ KFR_INTRINSIC T1 cweighting(const T1& x)
}
template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::cweighting, E1> cweighting(E1&& x)
+KFR_INTRINSIC expression_function<fn::cweighting, E1> cweighting(E1&& x)
{
return { fn::cweighting(), std::forward<E1>(x) };
}
diff --git a/include/kfr/dsp/window.hpp b/include/kfr/dsp/window.hpp
@@ -25,7 +25,7 @@
*/
#pragma once
-#include "../base/pointer.hpp"
+#include "../base/handle.hpp"
#include "../math/log_exp.hpp"
#include "../math/modzerobessel.hpp"
#include "../math/sin_cos.hpp"
@@ -51,6 +51,7 @@ enum class window_type
flattop = 12,
gaussian = 13,
lanczos = 14,
+ cosine_np = 15,
};
template <window_type type>
@@ -68,324 +69,280 @@ enum class window_symmetry
inline namespace CMT_ARCH_NAME
{
-namespace internal
+enum class window_metrics
{
+ metrics_0_1,
+ metrics_m1_1,
+ metrics_mpi_pi,
+ metrics_m1_1_trunc,
+ metrics_m1_1_trunc2,
+};
template <typename T>
-struct window_linspace_0_1 : expression_linspace<T>
+struct window_linspace : expression_linspace<T>
{
- window_linspace_0_1(size_t size, window_symmetry symmetry)
- : expression_linspace<T>(0, 1, size, symmetry == window_symmetry::symmetric)
+ window_linspace(cval_t<window_metrics, window_metrics::metrics_0_1>, size_t size,
+ window_symmetry symmetry)
+ : expression_linspace<T>{ 0, 1, size, symmetry == window_symmetry::symmetric }
{
}
-};
-
-template <typename T>
-struct window_linspace_m1_1 : expression_linspace<T>
-{
- window_linspace_m1_1(size_t size, window_symmetry symmetry)
- : expression_linspace<T>(-1, 1, size, symmetry == window_symmetry::symmetric)
+ window_linspace(cval_t<window_metrics, window_metrics::metrics_m1_1>, size_t size,
+ window_symmetry symmetry)
+ : expression_linspace<T>{ -1, 1, size, symmetry == window_symmetry::symmetric }
{
}
-};
-
-template <typename T>
-struct window_linspace_mpi_pi : expression_linspace<T>
-{
- window_linspace_mpi_pi(size_t size, window_symmetry symmetry)
- : expression_linspace<T>(-c_pi<T>, +c_pi<T>, size, symmetry == window_symmetry::symmetric)
+ window_linspace(cval_t<window_metrics, window_metrics::metrics_mpi_pi>, size_t size,
+ window_symmetry symmetry)
+ : expression_linspace<T>{ -c_pi<T>, +c_pi<T>, size, symmetry == window_symmetry::symmetric }
{
}
-};
-
-template <typename T>
-struct window_linspace_m1_1_trunc : expression_linspace<T>
-{
- window_linspace_m1_1_trunc(size_t size, window_symmetry symmetry)
- : expression_linspace<T>(-T(size - 1) / size, T(size - 1) / size, size,
- symmetry == window_symmetry::symmetric)
+ window_linspace(cval_t<window_metrics, window_metrics::metrics_m1_1_trunc>, size_t size,
+ window_symmetry symmetry)
+ : expression_linspace<T>{ symmetric_linspace, calc_p(size, symmetry == window_symmetry::symmetric),
+ size, symmetry == window_symmetry::symmetric }
+ {
+ }
+ window_linspace(cval_t<window_metrics, window_metrics::metrics_m1_1_trunc2>, size_t size,
+ window_symmetry symmetry)
+ : expression_linspace<T>{ symmetric_linspace, calc_p2(size, symmetry == window_symmetry::symmetric),
+ size, symmetry == window_symmetry::symmetric }
{
}
+ static T calc_p(size_t size, bool sym)
+ {
+ if (!sym)
+ ++size;
+ return T(size - 1) / (size);
+ }
+ static T calc_p2(size_t size, bool sym)
+ {
+ if (!sym)
+ ++size;
+ return (size & 1) ? T(size - 1) / T(size + 1) : T(size - 1) / (size);
+ }
};
template <typename T>
-struct window_linspace_m1_1_trunc2 : expression_linspace<T>
+struct expression_window : expression_traits_defaults
{
- window_linspace_m1_1_trunc2(size_t size, window_symmetry symmetry)
- : expression_linspace<T>(symmetric_linspace,
- (size & 1) ? T(size - 1) / T(size + 1) : T(size - 1) / (size), size,
- symmetry == window_symmetry::symmetric)
+ using value_type = T;
+ constexpr static size_t dims = 1;
+ constexpr static shape<dims> get_shape(const expression_window<T>& self)
{
+ return shape<dims>(self.m_size);
}
+ constexpr static shape<dims> get_shape() { return shape<1>(undefined_size); }
+
+ constexpr expression_window(size_t size) : m_size(size) {}
+
+ size_t m_size;
+ size_t size() const { return m_size; }
};
template <typename T>
-struct expression_rectangular : input_expression
+struct expression_rectangular : expression_window<T>
{
- using value_type = T;
-
- expression_rectangular(size_t size, T = T(), window_symmetry = window_symmetry::symmetric) : m_size(size)
+ expression_rectangular(size_t size, T = T(), window_symmetry symmetry = window_symmetry::symmetric)
+ : expression_window<T>(size)
{
}
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_rectangular& self, cinput_t, size_t index,
- vec_shape<T, N>)
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_rectangular& self, shape<1> index,
+ axis_params<0, N>)
{
using TI = utype<T>;
- const vec<TI, N> i = enumerate(vec_shape<TI, N>()) + static_cast<TI>(index);
+ const vec<TI, N> i = enumerate(vec_shape<TI, N>()) + static_cast<TI>(index.front());
return select(i < static_cast<TI>(self.m_size), T(1), T(0));
}
- size_t size() const { return m_size; }
-
-private:
- size_t m_size;
};
-template <typename T>
-struct expression_triangular : input_expression
+template <typename T, window_metrics metrics>
+struct expression_window_with_metrics : expression_window<T>
{
- using value_type = T;
-
- expression_triangular(size_t size, T = T(), window_symmetry symmetry = window_symmetry::symmetric)
- : linspace(size, symmetry), m_size(size)
- {
- }
- template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_triangular& self, cinput_t cinput,
- size_t index, vec_shape<T, N> y)
+ expression_window_with_metrics(size_t size, T arg = T(),
+ window_symmetry symmetry = window_symmetry::symmetric)
+ : expression_window<T>(size), linspace(cval<window_metrics, metrics>, size, symmetry), arg(arg)
{
- return 1 - abs(get_elements(self.linspace, cinput, index, y));
}
- size_t size() const { return m_size; }
-private:
- window_linspace_m1_1_trunc2<T> linspace;
- size_t m_size;
+protected:
+ window_linspace<T> linspace;
+ T arg;
};
template <typename T>
-struct expression_bartlett : input_expression
+struct expression_triangular : expression_window_with_metrics<T, window_metrics::metrics_m1_1_trunc2>
{
- using value_type = T;
+ using expression_window_with_metrics<T,
+ window_metrics::metrics_m1_1_trunc2>::expression_window_with_metrics;
- expression_bartlett(size_t size, T = T(), window_symmetry symmetry = window_symmetry::symmetric)
- : linspace(size, symmetry), m_size(size)
+ template <size_t N>
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_triangular& self, shape<1> index,
+ axis_params<0, N> sh)
{
+ return 1 - abs(get_elements(self.linspace, index, sh));
}
+};
+
+template <typename T>
+struct expression_bartlett : expression_window_with_metrics<T, window_metrics::metrics_m1_1>
+{
+ using expression_window_with_metrics<T, window_metrics::metrics_m1_1>::expression_window_with_metrics;
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_bartlett& self, cinput_t cinput,
- size_t index, vec_shape<T, N> y)
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_bartlett& self, shape<1> index,
+ axis_params<0, N> sh)
{
- return 1 - abs(get_elements(self.linspace, cinput, index, y));
+ return 1 - abs(get_elements(self.linspace, index, sh));
}
- size_t size() const { return m_size; }
-
-private:
- window_linspace_m1_1<T> linspace;
- size_t m_size;
};
template <typename T>
-struct expression_cosine : input_expression
+struct expression_cosine : expression_window_with_metrics<T, window_metrics::metrics_0_1>
{
- using value_type = T;
+ using expression_window_with_metrics<T, window_metrics::metrics_0_1>::expression_window_with_metrics;
- expression_cosine(size_t size, T = T(), window_symmetry symmetry = window_symmetry::symmetric)
- : linspace(size, symmetry), m_size(size)
+ template <size_t N>
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_cosine& self, shape<1> index,
+ axis_params<0, N> sh)
{
+ return sin(c_pi<T> * (get_elements(self.linspace, index, sh)));
}
+};
+template <typename T>
+struct expression_cosine_np : expression_window_with_metrics<T, window_metrics::metrics_m1_1_trunc>
+{
+ using expression_window_with_metrics<T,
+ window_metrics::metrics_m1_1_trunc>::expression_window_with_metrics;
+
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_cosine& self, cinput_t cinput, size_t index,
- vec_shape<T, N> y)
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_cosine_np& self, shape<1> index,
+ axis_params<0, N> sh)
{
- return sin(c_pi<T> * get_elements(self.linspace, cinput, index, y));
+ return sin(c_pi<T, 1, 2> * (1 + get_elements(self.linspace, index, sh)));
}
- size_t size() const { return m_size; }
-
-private:
- window_linspace_0_1<T> linspace;
- size_t m_size;
};
template <typename T>
-struct expression_hann : input_expression
+struct expression_hann : expression_window_with_metrics<T, window_metrics::metrics_0_1>
{
- using value_type = T;
+ using expression_window_with_metrics<T, window_metrics::metrics_0_1>::expression_window_with_metrics;
- expression_hann(size_t size, T = T(), window_symmetry symmetry = window_symmetry::symmetric)
- : linspace(size, symmetry), m_size(size)
- {
- }
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_hann& self, cinput_t cinput, size_t index,
- vec_shape<T, N> y)
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_hann& self, shape<1> index,
+ axis_params<0, N> sh)
{
- return T(0.5) * (T(1) - cos(c_pi<T, 2> * get_elements(self.linspace, cinput, index, y)));
+ return T(0.5) * (T(1) - cos(c_pi<T, 2> * get_elements(self.linspace, index, sh)));
}
- size_t size() const { return m_size; }
-
-private:
- window_linspace_0_1<T> linspace;
- size_t m_size;
};
template <typename T>
-struct expression_bartlett_hann : input_expression
+struct expression_bartlett_hann : expression_window_with_metrics<T, window_metrics::metrics_0_1>
{
- using value_type = T;
+ using expression_window_with_metrics<T, window_metrics::metrics_0_1>::expression_window_with_metrics;
- expression_bartlett_hann(size_t size, T = T(), window_symmetry symmetry = window_symmetry::symmetric)
- : linspace(size, symmetry), m_size(size)
- {
- }
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_bartlett_hann& self, cinput_t cinput,
- size_t index, vec_shape<T, N> y)
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_bartlett_hann& self, shape<1> index,
+ axis_params<0, N> sh)
{
- const vec<T, N> xx = get_elements(self.linspace, cinput, index, y);
+ const vec<T, N> xx = get_elements(self.linspace, index, sh);
return T(0.62) - T(0.48) * abs(xx - T(0.5)) + T(0.38) * cos(c_pi<T, 2> * (xx - T(0.5)));
}
- size_t size() const { return m_size; }
-
-private:
- window_linspace_0_1<T> linspace;
- size_t m_size;
};
template <typename T>
-struct expression_hamming : input_expression
+struct expression_hamming : expression_window_with_metrics<T, window_metrics::metrics_0_1>
{
- using value_type = T;
-
expression_hamming(size_t size, T alpha = 0.54, window_symmetry symmetry = window_symmetry::symmetric)
- : linspace(size, symmetry), alpha(alpha), m_size(size)
+ : expression_window_with_metrics<T, window_metrics::metrics_0_1>(size, alpha, symmetry)
{
}
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_hamming& self, cinput_t cinput, size_t index,
- vec_shape<T, N> y)
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_hamming& self, shape<1> index,
+ axis_params<0, N> sh)
{
- return self.alpha -
- (T(1.0) - self.alpha) * (cos(c_pi<T, 2> * get_elements(self.linspace, cinput, index, y)));
+ return self.arg - (T(1.0) - self.arg) * (cos(c_pi<T, 2> * get_elements(self.linspace, index, sh)));
}
- size_t size() const { return m_size; }
-
-private:
- window_linspace_0_1<T> linspace;
- T alpha;
- size_t m_size;
};
template <typename T>
-struct expression_bohman : input_expression
+struct expression_bohman : expression_window_with_metrics<T, window_metrics::metrics_m1_1>
{
- using value_type = T;
+ using expression_window_with_metrics<T, window_metrics::metrics_m1_1>::expression_window_with_metrics;
- expression_bohman(size_t size, T = T(), window_symmetry symmetry = window_symmetry::symmetric)
- : linspace(size, symmetry), m_size(size)
- {
- }
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_bohman& self, cinput_t cinput, size_t index,
- vec_shape<T, N> y)
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_bohman& self, shape<1> index,
+ axis_params<0, N> sh)
{
- const vec<T, N> n = abs(get_elements(self.linspace, cinput, index, y));
+ const vec<T, N> n = abs(get_elements(self.linspace, index, sh));
return (T(1) - n) * cos(c_pi<T> * n) + (T(1) / c_pi<T>)*sin(c_pi<T> * n);
}
- size_t size() const { return m_size; }
-
-private:
- window_linspace_m1_1<T> linspace;
- size_t m_size;
};
template <typename T>
-struct expression_blackman : input_expression
+struct expression_blackman : expression_window_with_metrics<T, window_metrics::metrics_0_1>
{
- using value_type = T;
+ using expression_window_with_metrics<T, window_metrics::metrics_0_1>::expression_window_with_metrics;
expression_blackman(size_t size, T alpha = 0.16, window_symmetry symmetry = window_symmetry::symmetric)
- : linspace(size, symmetry), a0((1 - alpha) * 0.5), a1(0.5), a2(alpha * 0.5), m_size(size)
+ : expression_window_with_metrics<T, window_metrics::metrics_0_1>(size, alpha, symmetry),
+ a0((1 - alpha) * 0.5), a1(0.5), a2(alpha * 0.5)
{
}
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_blackman& self, cinput_t cinput,
- size_t index, vec_shape<T, N> y)
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_blackman& self, shape<1> index,
+ axis_params<0, N> sh)
{
- const vec<T, N> n = get_elements(self.linspace, cinput, index, y);
+ const vec<T, N> n = get_elements(self.linspace, index, sh);
return self.a0 - self.a1 * cos(c_pi<T, 2> * n) + self.a2 * cos(c_pi<T, 4> * n);
}
- size_t size() const { return m_size; }
private:
- window_linspace_0_1<T> linspace;
T a0, a1, a2;
- size_t m_size;
};
template <typename T>
-struct expression_blackman_harris : input_expression
+struct expression_blackman_harris : expression_window_with_metrics<T, window_metrics::metrics_0_1>
{
- using value_type = T;
+ using expression_window_with_metrics<T, window_metrics::metrics_0_1>::expression_window_with_metrics;
- expression_blackman_harris(size_t size, T = T(), window_symmetry symmetry = window_symmetry::symmetric)
- : linspace(size, symmetry), m_size(size)
- {
- }
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_blackman_harris& self, cinput_t cinput,
- size_t index, vec_shape<T, N> y)
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_blackman_harris& self, shape<1> index,
+ axis_params<0, N> sh)
{
- const vec<T, N> n = get_elements(self.linspace, cinput, index, y) * c_pi<T, 2>;
+ const vec<T, N> n = get_elements(self.linspace, index, sh) * c_pi<T, 2>;
return T(0.35875) - T(0.48829) * cos(n) + T(0.14128) * cos(2 * n) - T(0.01168) * cos(3 * n);
}
- size_t size() const { return m_size; }
-
-private:
- window_linspace_0_1<T> linspace;
- size_t m_size;
};
template <typename T>
-struct expression_kaiser : input_expression
+struct expression_kaiser : expression_window_with_metrics<T, window_metrics::metrics_m1_1>
{
- using value_type = T;
-
expression_kaiser(size_t size, T beta = 0.5, window_symmetry symmetry = window_symmetry::symmetric)
- : linspace(size, symmetry), beta(beta), m(reciprocal(modzerobessel(make_vector(beta))[0])),
- m_size(size)
+ : expression_window_with_metrics<T, window_metrics::metrics_m1_1>(size, beta, symmetry),
+ m(reciprocal(modzerobessel(make_vector(beta))[0]))
{
}
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_kaiser& self, cinput_t cinput, size_t index,
- vec_shape<T, N> y)
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_kaiser& self, shape<1> index,
+ axis_params<0, N> sh)
{
- return modzerobessel(self.beta * sqrt(1 - sqr(get_elements(self.linspace, cinput, index, y)))) *
- self.m;
+ return modzerobessel(self.arg * sqrt(1 - sqr(get_elements(self.linspace, index, sh)))) * self.m;
}
- size_t size() const { return m_size; }
private:
- window_linspace_m1_1<T> linspace;
- T beta;
T m;
- size_t m_size;
};
template <typename T>
-struct expression_flattop : input_expression
+struct expression_flattop : expression_window_with_metrics<T, window_metrics::metrics_0_1>
{
- using value_type = T;
+ using expression_window_with_metrics<T, window_metrics::metrics_0_1>::expression_window_with_metrics;
- expression_flattop(size_t size, T = T(), window_symmetry symmetry = window_symmetry::symmetric)
- : linspace(size, symmetry), m_size(size)
- {
- }
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_flattop& self, cinput_t cinput, size_t index,
- vec_shape<T, N> y)
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_flattop& self, shape<1> index,
+ axis_params<0, N> sh)
{
- const vec<T, N> n = get_elements(self.linspace, cinput, index, y) * c_pi<T, 2>;
+ const vec<T, N> n = get_elements(self.linspace, index, sh) * c_pi<T, 2>;
constexpr T a0 = 0.21557895;
constexpr T a1 = 0.41663158;
constexpr T a2 = 0.277263158;
@@ -393,58 +350,34 @@ struct expression_flattop : input_expression
constexpr T a4 = 0.006947368;
return a0 - a1 * cos(n) + a2 * cos(2 * n) - a3 * cos(3 * n) + a4 * cos(4 * n);
}
- size_t size() const { return m_size; }
-
-private:
- window_linspace_0_1<T> linspace;
- size_t m_size;
};
template <typename T>
-struct expression_gaussian : input_expression
+struct expression_gaussian : expression_window_with_metrics<T, window_metrics::metrics_m1_1_trunc>
{
- using value_type = T;
-
+ /// alpha = std / 2N
expression_gaussian(size_t size, T alpha = 2.5, window_symmetry symmetry = window_symmetry::symmetric)
- : linspace(size, symmetry), alpha(alpha), m_size(size)
+ : expression_window_with_metrics<T, window_metrics::metrics_m1_1_trunc>(size, alpha, symmetry)
{
}
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_gaussian& self, cinput_t cinput,
- size_t index, vec_shape<T, N> y)
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_gaussian& self, shape<1> index,
+ axis_params<0, N> sh)
{
- return exp(T(-0.5) * sqr(self.alpha * get_elements(self.linspace, cinput, index, y)));
+ return exp(T(-0.5) * sqr(self.arg * get_elements(self.linspace, index, sh)));
}
-
- size_t size() const { return m_size; }
-
-private:
- window_linspace_m1_1_trunc<T> linspace;
- T alpha;
- size_t m_size;
};
template <typename T>
-struct expression_lanczos : input_expression
+struct expression_lanczos : expression_window_with_metrics<T, window_metrics::metrics_mpi_pi>
{
- using value_type = T;
-
- expression_lanczos(size_t size, T alpha = 2.5, window_symmetry symmetry = window_symmetry::symmetric)
- : linspace(size, symmetry), alpha(alpha), m_size(size)
- {
- }
+ using expression_window_with_metrics<T, window_metrics::metrics_mpi_pi>::expression_window_with_metrics;
template <size_t N>
- KFR_INTRINSIC friend vec<T, N> get_elements(const expression_lanczos& self, cinput_t cinput, size_t index,
- vec_shape<T, N> y)
+ KFR_INTRINSIC friend vec<T, N> get_elements(const expression_lanczos& self, shape<1> index,
+ axis_params<0, N> sh)
{
- return sinc(get_elements(self.linspace, cinput, index, y));
+ return sinc(get_elements(self.linspace, index, sh));
}
- size_t size() const { return m_size; }
-
-private:
- window_linspace_mpi_pi<T> linspace;
- T alpha;
- size_t m_size;
};
template <window_type>
@@ -471,62 +404,70 @@ KFR_WINDOW_BY_TYPE(kaiser)
KFR_WINDOW_BY_TYPE(flattop)
KFR_WINDOW_BY_TYPE(gaussian)
KFR_WINDOW_BY_TYPE(lanczos)
+KFR_WINDOW_BY_TYPE(cosine_np)
#undef KFR_WINDOW_BY_TYPE
-} // namespace internal
/**
* @brief Returns template expression that generates Rrectangular window of length @c size
*/
template <typename T = fbase>
-KFR_FUNCTION internal::expression_rectangular<T> window_rectangular(size_t size, ctype_t<T> = ctype_t<T>())
+KFR_FUNCTION expression_rectangular<T> window_rectangular(size_t size, ctype_t<T> = ctype_t<T>())
{
- return internal::expression_rectangular<T>(size, T());
+ return expression_rectangular<T>(size, T());
}
/**
* @brief Returns template expression that generates Triangular window of length @c size
*/
template <typename T = fbase>
-KFR_FUNCTION internal::expression_triangular<T> window_triangular(size_t size, ctype_t<T> = ctype_t<T>())
+KFR_FUNCTION expression_triangular<T> window_triangular(size_t size, ctype_t<T> = ctype_t<T>())
{
- return internal::expression_triangular<T>(size);
+ return expression_triangular<T>(size);
}
/**
* @brief Returns template expression that generates Bartlett window of length @c size
*/
template <typename T = fbase>
-KFR_FUNCTION internal::expression_bartlett<T> window_bartlett(size_t size, ctype_t<T> = ctype_t<T>())
+KFR_FUNCTION expression_bartlett<T> window_bartlett(size_t size, ctype_t<T> = ctype_t<T>())
{
- return internal::expression_bartlett<T>(size);
+ return expression_bartlett<T>(size);
}
/**
* @brief Returns template expression that generates Cosine window of length @c size
*/
template <typename T = fbase>
-KFR_FUNCTION internal::expression_cosine<T> window_cosine(size_t size, ctype_t<T> = ctype_t<T>())
+KFR_FUNCTION expression_cosine<T> window_cosine(size_t size, ctype_t<T> = ctype_t<T>())
+{
+ return expression_cosine<T>(size);
+}
+
+/**
+ * @brief Returns template expression that generates Cosine window (numpy compatible) of length @c size
+ */
+template <typename T = fbase>
+KFR_FUNCTION expression_cosine_np<T> window_cosine_np(size_t size, ctype_t<T> = ctype_t<T>())
{
- return internal::expression_cosine<T>(size);
+ return expression_cosine_np<T>(size);
}
/**
* @brief Returns template expression that generates Hann window of length @c size
*/
template <typename T = fbase>
-KFR_FUNCTION internal::expression_hann<T> window_hann(size_t size, ctype_t<T> = ctype_t<T>())
+KFR_FUNCTION expression_hann<T> window_hann(size_t size, ctype_t<T> = ctype_t<T>())
{
- return internal::expression_hann<T>(size);
+ return expression_hann<T>(size);
}
/**
* @brief Returns template expression that generates Bartlett-Hann window of length @c size
*/
template <typename T = fbase>
-KFR_FUNCTION internal::expression_bartlett_hann<T> window_bartlett_hann(size_t size,
- ctype_t<T> = ctype_t<T>())
+KFR_FUNCTION expression_bartlett_hann<T> window_bartlett_hann(size_t size, ctype_t<T> = ctype_t<T>())
{
- return internal::expression_bartlett_hann<T>(size);
+ return expression_bartlett_hann<T>(size);
}
/**
@@ -534,19 +475,19 @@ KFR_FUNCTION internal::expression_bartlett_hann<T> window_bartlett_hann(size_t s
* alpha
*/
template <typename T = fbase>
-KFR_FUNCTION internal::expression_hamming<T> window_hamming(size_t size, identity<T> alpha = 0.54,
- ctype_t<T> = ctype_t<T>())
+KFR_FUNCTION expression_hamming<T> window_hamming(size_t size, identity<T> alpha = 0.54,
+ ctype_t<T> = ctype_t<T>())
{
- return internal::expression_hamming<T>(size, alpha);
+ return expression_hamming<T>(size, alpha);
}
/**
* @brief Returns template expression that generates Bohman window of length @c size
*/
template <typename T = fbase>
-KFR_FUNCTION internal::expression_bohman<T> window_bohman(size_t size, ctype_t<T> = ctype_t<T>())
+KFR_FUNCTION expression_bohman<T> window_bohman(size_t size, ctype_t<T> = ctype_t<T>())
{
- return internal::expression_bohman<T>(size);
+ return expression_bohman<T>(size);
}
/**
@@ -554,21 +495,21 @@ KFR_FUNCTION internal::expression_bohman<T> window_bohman(size_t size, ctype_t<T
* alpha
*/
template <typename T = fbase>
-KFR_FUNCTION internal::expression_blackman<T> window_blackman(
- size_t size, identity<T> alpha = 0.16, window_symmetry symmetry = window_symmetry::symmetric,
- ctype_t<T> = ctype_t<T>())
+KFR_FUNCTION expression_blackman<T> window_blackman(size_t size, identity<T> alpha = 0.16,
+ window_symmetry symmetry = window_symmetry::symmetric,
+ ctype_t<T> = ctype_t<T>())
{
- return internal::expression_blackman<T>(size, alpha, symmetry);
+ return expression_blackman<T>(size, alpha, symmetry);
}
/**
* @brief Returns template expression that generates Blackman-Harris window of length @c size
*/
template <typename T = fbase>
-KFR_FUNCTION internal::expression_blackman_harris<T> window_blackman_harris(
+KFR_FUNCTION expression_blackman_harris<T> window_blackman_harris(
size_t size, window_symmetry symmetry = window_symmetry::symmetric, ctype_t<T> = ctype_t<T>())
{
- return internal::expression_blackman_harris<T>(size, T(), symmetry);
+ return expression_blackman_harris<T>(size, T(), symmetry);
}
/**
@@ -576,19 +517,19 @@ KFR_FUNCTION internal::expression_blackman_harris<T> window_blackman_harris(
* beta
*/
template <typename T = fbase>
-KFR_FUNCTION internal::expression_kaiser<T> window_kaiser(size_t size, identity<T> beta = T(0.5),
- ctype_t<T> = ctype_t<T>())
+KFR_FUNCTION expression_kaiser<T> window_kaiser(size_t size, identity<T> beta = T(0.5),
+ ctype_t<T> = ctype_t<T>())
{
- return internal::expression_kaiser<T>(size, beta);
+ return expression_kaiser<T>(size, beta);
}
/**
* @brief Returns template expression that generates Flat top window of length @c size
*/
template <typename T = fbase>
-KFR_FUNCTION internal::expression_flattop<T> window_flattop(size_t size, ctype_t<T> = ctype_t<T>())
+KFR_FUNCTION expression_flattop<T> window_flattop(size_t size, ctype_t<T> = ctype_t<T>())
{
- return internal::expression_flattop<T>(size);
+ return expression_flattop<T>(size);
}
/**
@@ -596,23 +537,23 @@ KFR_FUNCTION internal::expression_flattop<T> window_flattop(size_t size, ctype_t
* alpha
*/
template <typename T = fbase>
-KFR_FUNCTION internal::expression_gaussian<T> window_gaussian(size_t size, identity<T> alpha = 2.5,
- ctype_t<T> = ctype_t<T>())
+KFR_FUNCTION expression_gaussian<T> window_gaussian(size_t size, identity<T> alpha = 2.5,
+ ctype_t<T> = ctype_t<T>())
{
- return internal::expression_gaussian<T>(size, alpha);
+ return expression_gaussian<T>(size, alpha);
}
/**
* @brief Returns template expression that generates Lanczos window of length @c size
*/
template <typename T = fbase>
-KFR_FUNCTION internal::expression_lanczos<T> window_lanczos(size_t size, ctype_t<T> = ctype_t<T>())
+KFR_FUNCTION expression_lanczos<T> window_lanczos(size_t size, ctype_t<T> = ctype_t<T>())
{
- return internal::expression_lanczos<T>(size);
+ return expression_lanczos<T>(size);
}
template <typename T = fbase, window_type type,
- typename window_expr = typename internal::window_by_type<type>::template type<T>>
+ typename window_expr = typename window_by_type<type>::template type<T>>
CMT_NOINLINE window_expr window(size_t size, cval_t<window_type, type>, identity<T> win_param = T(),
window_symmetry symmetry = window_symmetry::symmetric,
ctype_t<T> = ctype_t<T>())
@@ -621,22 +562,22 @@ CMT_NOINLINE window_expr window(size_t size, cval_t<window_type, type>, identity
}
template <typename T = fbase>
-CMT_NOINLINE expression_pointer<T> window(size_t size, window_type type, identity<T> win_param,
- window_symmetry symmetry = window_symmetry::symmetric,
- ctype_t<T> = ctype_t<T>())
+CMT_NOINLINE expression_handle<T> window(size_t size, window_type type, identity<T> win_param,
+ window_symmetry symmetry = window_symmetry::symmetric,
+ ctype_t<T> = ctype_t<T>())
{
return cswitch(
cvals_t<window_type, window_type::rectangular, window_type::triangular, window_type::bartlett,
window_type::cosine, window_type::hann, window_type::bartlett_hann, window_type::hamming,
window_type::bohman, window_type::blackman, window_type::blackman_harris, window_type::kaiser,
- window_type::flattop, window_type::gaussian, window_type::lanczos>(),
+ window_type::flattop, window_type::gaussian, window_type::lanczos, window_type::cosine_np>(),
type,
- [size, win_param, symmetry](auto win) {
+ [size, win_param, symmetry](auto win)
+ {
constexpr window_type window = val_of(decltype(win)());
- return to_pointer(
- typename internal::window_by_type<window>::template type<T>(size, win_param, symmetry));
+ return to_handle(typename window_by_type<window>::template type<T>(size, win_param, symmetry));
},
- fn_generic::returns<expression_pointer<T>>());
+ fn_generic::returns<expression_handle<T>>());
}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/except.hpp b/include/kfr/except.hpp
@@ -0,0 +1,99 @@
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+#include "cident.h"
+#include "cometa/string.hpp"
+#include <exception>
+
+namespace kfr
+{
+
+class exception : public std::exception
+{
+public:
+ using std::exception::exception;
+ exception(std::string str) : m_what(std::move(str)) {}
+
+ const char* what() const noexcept final { return m_what.c_str(); }
+
+private:
+ std::string m_what;
+};
+class logic_error : public exception
+{
+public:
+ using exception::exception;
+};
+class runtime_error : public exception
+{
+public:
+ using exception::exception;
+};
+
+#ifndef KFR_THROW_EXCEPTION
+#define KFR_THROW_EXCEPTION(kind, ...) \
+ do \
+ { \
+ throw ::kfr::CMT_CONCAT(kind, _error)(kfr::as_string(__VA_ARGS__)); \
+ } while (0)
+#endif
+
+#define KFR_PRINT_AND_ABORT(kind, ...) \
+ do \
+ { \
+ std::string s = kfr::as_string(__VA_ARGS__); \
+ std::fprintf(stderr, "KFR " CMT_STRINGIFY(kind) " error: %s\n", s.c_str()); \
+ std::fflush(stderr); \
+ std::abort(); \
+ } while (0)
+
+#if defined __cpp_exceptions || defined _HAS_EXCEPTIONS || defined _EXCEPTIONS
+#define KFR_REPORT_ERROR KFR_THROW_EXCEPTION
+#else
+#define KFR_REPORT_ERROR KFR_PRINT_AND_ABORT
+#endif
+
+#define KFR_CHECK_IMPL(cond, kind, ...) \
+ do \
+ { \
+ if (CMT_UNLIKELY(!(cond))) \
+ KFR_REPORT_ERROR(kind, __VA_ARGS__); \
+ } while (0)
+
+#define KFR_REPORT_RUNTIME_ERROR(...) KFR_REPORT_ERROR(runtime, __VA_ARGS__)
+
+#define KFR_REPORT_LOGIC_ERROR(...) KFR_REPORT_ERROR(logic, __VA_ARGS__)
+
+#if !defined(KFR_DISABLE_CHECKS)
+
+#define KFR_RUNTIME_CHECK(cond, ...) KFR_CHECK_IMPL(cond, runtime, __VA_ARGS__)
+
+#define KFR_LOGIC_CHECK(cond, ...) KFR_CHECK_IMPL(cond, logic, __VA_ARGS__)
+
+#else
+#define KFR_RUNTIME_CHECK(cond, ...) CMT_NOOP
+#define KFR_LOGIC_CHECK(cond, ...) CMT_NOOP
+
+#endif
+
+} // namespace kfr
diff --git a/include/kfr/graphics.hpp b/include/kfr/graphics.hpp
@@ -25,4 +25,4 @@
#include "math.hpp"
#include "graphics/color.hpp"
-#include "graphics/geometry.hpp"
-\ No newline at end of file
+#include "graphics/geometry.hpp"
diff --git a/include/kfr/graphics/color.hpp b/include/kfr/graphics/color.hpp
@@ -25,7 +25,7 @@
*/
#pragma once
-#include "scaled.hpp"
+#include "impl/scaled.hpp"
namespace kfr
{
@@ -40,7 +40,8 @@ struct color
using vec_type = vec<T, 4>;
- static_assert(is_floating_point<T> || is_same<T, uint8_t> || is_same<T, uint16_t>, "Incorrect type");
+ static_assert(std::is_floating_point_v<T> || std::is_same_v<T, uint8_t> || std::is_same_v<T, uint16_t>,
+ "Incorrect type");
constexpr color(int) = delete;
constexpr explicit color(T grey, T alpha = maximum) : v(grey, grey, grey, alpha) {}
@@ -78,7 +79,7 @@ struct color
constexpr T lightness() const
{
- using Tcommon = conditional<is_floating_point<T>, T, findinttype<min * 3, max * 3>>;
+ using Tcommon = std::conditional_t<std::is_floating_point_v<T>, T, findinttype<min * 3, max * 3>>;
return (Tcommon(r) + g + b) / 3;
}
diff --git a/include/kfr/graphics/geometry.hpp b/include/kfr/graphics/geometry.hpp
@@ -25,7 +25,7 @@
*/
#pragma once
-#include "scaled.hpp"
+#include "impl/scaled.hpp"
namespace kfr
{
@@ -64,7 +64,8 @@ struct point
constexpr point ceil() const { return kfr::ceil(v); }
constexpr point trunc() const { return kfr::trunc(v); }
- union {
+ union
+ {
struct
{
T x;
@@ -114,7 +115,8 @@ struct size
constexpr bool operator==(const size& c) const { return all(v == c.v); }
constexpr bool operator!=(const size& c) const { return !operator==(c); }
- union {
+ union
+ {
struct
{
T x;
@@ -159,7 +161,8 @@ struct border
constexpr bool operator==(const border& c) const { return all(v == c.v); }
constexpr bool operator!=(const border& c) const { return !(operator==(c)); }
- union {
+ union
+ {
struct
{
T x1;
@@ -187,7 +190,8 @@ struct vector4
constexpr bool operator==(const vector4& c) const { return all(v == c.v); }
constexpr bool operator!=(const vector4& c) const { return !operator==(c); }
- union {
+ union
+ {
struct
{
T x;
@@ -378,7 +382,8 @@ struct rectangle
rectangle& operator&=(const rectangle& c) { return *this = *this & c; }
rectangle& operator|=(const rectangle& c) { return *this = *this | c; }
- union {
+ union
+ {
struct
{
T x1;
@@ -422,7 +427,8 @@ CMT_INTRINSIC size<T> max(const size<T>& a, const size<T>& b)
template <typename T>
struct matrix
{
- union {
+ union
+ {
vec<T, 6> v;
struct
{
diff --git a/include/kfr/graphics/impl/scaled.hpp b/include/kfr/graphics/impl/scaled.hpp
@@ -0,0 +1,58 @@
+/** @addtogroup basic_math
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../../cometa/string.hpp"
+#include "../../math.hpp"
+
+namespace kfr
+{
+
+template <typename Tout, int Mout, int Min, typename Tin, size_t N,
+ KFR_ENABLE_IF(Mout != Min &&
+ (std::is_floating_point<Tin>::value || std::is_floating_point<Tout>::value))>
+KFR_INTRINSIC vec<Tout, N> convert_scaled(const vec<Tin, N>& value)
+{
+ using Tcommon = std::common_type_t<Tin, Tout>;
+ return static_cast<vec<Tout, N>>(static_cast<vec<Tcommon, N>>(value) * Mout / Min);
+}
+
+template <typename Tout, int Mout, int Min, typename Tin, size_t N,
+ KFR_ENABLE_IF(Mout != Min &&
+ !(std::is_floating_point<Tin>::value || std::is_floating_point<Tout>::value))>
+KFR_INTRINSIC vec<Tout, N> convert_scaled(const vec<Tin, N>& value)
+{
+ using Tcommon =
+ findinttype<std::numeric_limits<Tin>::min() * Mout, std::numeric_limits<Tin>::max() * Mout>;
+ return static_cast<vec<Tout, N>>(static_cast<vec<Tcommon, N>>(value) * Mout / Min);
+}
+
+template <typename Tout, int Mout, int Min, typename Tin, size_t N, KFR_ENABLE_IF(Mout == Min)>
+KFR_INTRINSIC vec<Tout, N> convert_scaled(const vec<Tin, N>& value)
+{
+ return static_cast<vec<Tout, N>>(value);
+}
+} // namespace kfr
diff --git a/include/kfr/graphics/scaled.hpp b/include/kfr/graphics/scaled.hpp
@@ -1,58 +0,0 @@
-/** @addtogroup basic_math
- * @{
- */
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "../cometa/string.hpp"
-#include "../math.hpp"
-
-namespace kfr
-{
-
-template <typename Tout, int Mout, int Min, typename Tin, size_t N,
- KFR_ENABLE_IF(Mout != Min &&
- (std::is_floating_point<Tin>::value || std::is_floating_point<Tout>::value))>
-KFR_INTRINSIC vec<Tout, N> convert_scaled(const vec<Tin, N>& value)
-{
- using Tcommon = common_type<Tin, Tout>;
- return static_cast<vec<Tout, N>>(static_cast<vec<Tcommon, N>>(value) * Mout / Min);
-}
-
-template <typename Tout, int Mout, int Min, typename Tin, size_t N,
- KFR_ENABLE_IF(Mout != Min &&
- !(std::is_floating_point<Tin>::value || std::is_floating_point<Tout>::value))>
-KFR_INTRINSIC vec<Tout, N> convert_scaled(const vec<Tin, N>& value)
-{
- using Tcommon =
- findinttype<std::numeric_limits<Tin>::min() * Mout, std::numeric_limits<Tin>::max() * Mout>;
- return static_cast<vec<Tout, N>>(static_cast<vec<Tcommon, N>>(value) * Mout / Min);
-}
-
-template <typename Tout, int Mout, int Min, typename Tin, size_t N, KFR_ENABLE_IF(Mout == Min)>
-KFR_INTRINSIC vec<Tout, N> convert_scaled(const vec<Tin, N>& value)
-{
- return static_cast<vec<Tout, N>>(value);
-}
-} // namespace kfr
-\ No newline at end of file
diff --git a/include/kfr/io/file.hpp b/include/kfr/io/file.hpp
@@ -126,7 +126,10 @@ struct abstract_reader : abstract_stream<T>
this->read(result);
return result;
}
- bool read(conditional<is_void<T>, internal_generic::empty, T>& data) { return read(&data, 1) == 1; }
+ bool read(std::conditional_t<std::is_void_v<T>, internal_generic::empty, T>& data)
+ {
+ return read(&data, 1) == 1;
+ }
};
/// @brief Base class for all typed writers
@@ -141,7 +144,7 @@ struct abstract_writer : abstract_stream<T>
return write(data.data(), data.size());
}
size_t write(univector_ref<const T>&& data) { return write(data.data(), data.size()); }
- bool write(const conditional<is_void<T>, internal_generic::empty, T>& data)
+ bool write(const std::conditional_t<std::is_void_v<T>, internal_generic::empty, T>& data)
{
return write(&data, 1) == 1;
}
diff --git a/include/kfr/io/python_plot.hpp b/include/kfr/io/python_plot.hpp
@@ -69,12 +69,12 @@ void python(const std::string& name, const std::string& code)
}
CMT_PRAGMA_GNU(GCC diagnostic pop)
-template <typename T, KFR_ENABLE_IF(is_floating_point<T>)>
+template <typename T, KFR_ENABLE_IF(std::is_floating_point_v<T>)>
inline T flush_to_zero(T value)
{
return std::isfinite(value) ? value : 0;
}
-template <typename T, KFR_ENABLE_IF(!is_floating_point<T>)>
+template <typename T, KFR_ENABLE_IF(!std::is_floating_point_v<T>)>
inline T flush_to_zero(T value)
{
return static_cast<double>(value);
diff --git a/include/kfr/io/tostring.hpp b/include/kfr/io/tostring.hpp
@@ -146,27 +146,6 @@ inline std::string array_to_string(const kfr::complex<T>* source, size_t N)
}
} // namespace details
-template <typename T>
-struct representation<kfr::complex<T>>
-{
- using type = std::string;
- static std::string get(const kfr::complex<T>& value)
- {
- return as_string(value.real()) + " + " + as_string(value.imag()) + "j";
- }
-};
-
-template <char t, int width, int prec, typename T>
-struct representation<details::fmt_t<kfr::complex<T>, t, width, prec>>
-{
- using type = std::string;
- static std::string get(const details::fmt_t<kfr::complex<T>, t, width, prec>& value)
- {
- return as_string(fmt<t, width, prec>(value.value.real())) + " + " +
- as_string(fmt<t, width, prec>(value.value.imag())) + "j";
- }
-};
-
template <>
struct representation<kfr::cpu_t>
{
@@ -174,107 +153,10 @@ struct representation<kfr::cpu_t>
static std::string get(kfr::cpu_t value) { return kfr::cpu_name(value); }
};
-template <typename T, size_t N>
-struct representation<kfr::vec<T, N>>
-{
- using type = std::string;
- static std::string get(const kfr::vec<T, N>& value)
- {
- return details::array_to_string(ptr_cast<T>(&value), value.size());
- }
-};
-
-template <typename T, size_t N>
-struct representation<kfr::mask<T, N>>
-{
- using type = std::string;
- static std::string get(const kfr::mask<T, N>& value)
- {
- bool values[N];
- for (size_t i = 0; i < N; i++)
- values[i] = value[i];
- return details::array_to_string(values, N);
- }
-};
-
-template <typename T, kfr::univector_tag Tag>
-struct representation<kfr::univector<T, Tag>>
-{
- using type = std::string;
- static std::string get(const kfr::univector<T, Tag>& value)
- {
- return details::array_to_string(value.data(), value.size());
- }
-};
-template <typename T, size_t Size>
-struct representation<std::array<T, Size>>
-{
- using type = std::string;
- static std::string get(const std::array<T, Size>& value)
- {
- return details::array_to_string(value.data(), value.size());
- }
-};
-template <typename T, typename Allocator>
-struct representation<std::vector<T, Allocator>>
-{
- using type = std::string;
- static std::string get(const std::vector<T, Allocator>& value)
- {
- return details::array_to_string(value.data(), value.size());
- }
-};
} // namespace cometa
namespace kfr
{
-inline namespace CMT_ARCH_NAME
-{
-
-namespace internal
-{
-struct expression_printer : output_expression
-{
- template <typename T, size_t N>
- void operator()(coutput_t, size_t index, const vec<T, N>& value)
- {
- for (size_t i = 0; i < N; i++)
- {
- if (index + i != 0)
- print(", ");
- print(value[i]);
- }
- }
- template <typename InputExpr>
- InputExpr& operator=(const InputExpr& input)
- {
- process(*this, input);
- return input;
- }
-};
-
-struct expression_debug_printer : output_expression
-{
- template <typename T, size_t N>
- void operator()(coutput_t, size_t index, const vec<T, N>& value)
- {
- println(fmtwidth<7>(index), ": (", value, ")");
- }
- template <typename InputExpr>
- InputExpr& operator=(const InputExpr& input)
- {
- process(*this, input);
- return input;
- }
-};
-} // namespace internal
-
-/// @brief Returns an output expression that prints the values
-inline internal::expression_printer printer() { return internal::expression_printer(); }
-
-/// @brief Returns an output expression that prints the values with their types (used for debug)
-inline internal::expression_debug_printer debug_printer() { return internal::expression_debug_printer(); }
-} // namespace CMT_ARCH_NAME
/// @brief Converts dB value to string (uses oo for infinity symbol)
template <typename T>
diff --git a/include/kfr/kfr.h b/include/kfr/kfr.h
@@ -1,3 +1,25 @@
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
/** @addtogroup utility
* @{
*/
@@ -10,8 +32,8 @@
#include "cident.h"
-#define KFR_VERSION_MAJOR 4
-#define KFR_VERSION_MINOR 3
+#define KFR_VERSION_MAJOR 5
+#define KFR_VERSION_MINOR 0
#define KFR_VERSION_PATCH 0
#define KFR_VERSION_LABEL ""
@@ -72,14 +94,15 @@ constexpr inline const char version_full[] = KFR_VERSION_FULL;
#ifdef KFR_FUNCTION_IS_INTRINSIC
#define KFR_FUNCTION CMT_INTRINSIC
#else
-#define KFR_FUNCTION
+#define KFR_FUNCTION
#endif
#ifdef CMT_NATIVE_F64
#define KFR_NATIVE_F64 CMT_NATIVE_F64
#endif
#if defined CMT_ARCH_ARM && !defined CMT_ARCH_NEON && !defined CMT_FORCE_GENERIC_CPU
-#error "ARM builds require NEON support. Add -march=native for native build or skip the check with CMT_FORCE_GENERIC_CPU=1"
+#error \
+ "ARM builds require NEON support. Add -march=native for native build or skip the check with CMT_FORCE_GENERIC_CPU=1"
#endif
#if defined CMT_ARCH_ARM && !defined CMT_COMPILER_CLANG && !defined CMT_FORCE_NON_CLANG
diff --git a/include/kfr/math.hpp b/include/kfr/math.hpp
@@ -24,22 +24,15 @@
#include "simd.hpp"
-#include "math/abs.hpp"
#include "math/asin_acos.hpp"
#include "math/atan.hpp"
-#include "math/clamp.hpp"
#include "math/compiletime.hpp"
#include "math/complex_math.hpp"
#include "math/gamma.hpp"
#include "math/hyperbolic.hpp"
#include "math/interpolation.hpp"
#include "math/log_exp.hpp"
-#include "math/logical.hpp"
-#include "math/min_max.hpp"
#include "math/modzerobessel.hpp"
-#include "math/round.hpp"
-#include "math/saturation.hpp"
-#include "math/select.hpp"
#include "math/sin_cos.hpp"
#include "math/sqrt.hpp"
#include "math/tan.hpp"
diff --git a/include/kfr/math/abs.hpp b/include/kfr/math/abs.hpp
@@ -1,54 +0,0 @@
-/** @addtogroup basic_math
- * @{
- */
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "impl/abs.hpp"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-
-/**
- * @brief Returns the absolute value of x.
- */
-template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
-KFR_INTRINSIC T1 abs(const T1& x)
-{
- return intrinsics::abs(x);
-}
-
-/**
- * @brief Returns template expression that returns the absolute value of x.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::abs, E1> abs(E1&& x)
-{
- return { fn::abs(), std::forward<E1>(x) };
-}
-} // namespace CMT_ARCH_NAME
-
-} // namespace kfr
diff --git a/include/kfr/math/asin_acos.hpp b/include/kfr/math/asin_acos.hpp
@@ -40,15 +40,6 @@ KFR_INTRINSIC flt_type<T1> asin(const T1& x)
{
return intrinsics::asin(x);
}
-
-/**
- * @brief Returns template expression that returns the arc sine of x.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::asin, E1> asin(E1&& x)
-{
- return { fn::asin(), std::forward<E1>(x) };
-}
/**
* @brief Returns the arc cosine of x. The returned angle is in the range 0 through \f$\pi\f$.
*/
@@ -57,15 +48,6 @@ KFR_INTRINSIC flt_type<T1> acos(const T1& x)
{
return intrinsics::acos(x);
}
-
-/**
- * @brief Returns template expression that returns the arc cosine of x.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::acos, E1> acos(E1&& x)
-{
- return { fn::acos(), std::forward<E1>(x) };
-}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/math/atan.hpp b/include/kfr/math/atan.hpp
@@ -43,15 +43,6 @@ KFR_FUNCTION flt_type<T1> atan(const T1& x)
}
/**
- * @brief Returns template expression that returns the arc tangent of x.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::atan, E1> atan(E1&& x)
-{
- return { fn::atan(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns the arc tangent of the x, expressed in degrees. The returned angle is in the range -90
* through 90.
*/
@@ -62,49 +53,22 @@ KFR_FUNCTION flt_type<T1> atandeg(const T1& x)
}
/**
- * @brief Returns template expression that returns the arc tangent of the x, expressed in degrees.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::atandeg, E1> atandeg(E1&& x)
-{
- return { fn::atandeg(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns the arc tangent of y/x using the signs of arguments to determine the correct quadrant.
*/
template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>)>
-KFR_FUNCTION common_type<T1, T2> atan2(const T1& x, const T2& y)
+KFR_FUNCTION std::common_type_t<T1, T2> atan2(const T1& x, const T2& y)
{
return intrinsics::atan2(x, y);
}
/**
- * @brief Returns template expression that returns the arc tangent of y/x.
- */
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_FUNCTION internal::expression_function<fn::atan2, E1, E2> atan2(E1&& x, E2&& y)
-{
- return { fn::atan2(), std::forward<E1>(x), std::forward<E2>(y) };
-}
-
-/**
* @brief Returns the arc tangent of y/x (expressed in degrees) using the signs of arguments to determine the
* correct quadrant.
*/
template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>)>
-KFR_FUNCTION common_type<T1, T2> atan2deg(const T1& x, const T2& y)
+KFR_FUNCTION std::common_type_t<T1, T2> atan2deg(const T1& x, const T2& y)
{
return intrinsics::atan2deg(x, y);
}
-
-/**
- * @brief Returns template expression that returns the arc tangent of y/x (expressed in degrees).
- */
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_FUNCTION internal::expression_function<fn::atan2deg, E1, E2> atan2deg(E1&& x, E2&& y)
-{
- return { fn::atan2deg(), std::forward<E1>(x), std::forward<E2>(y) };
-}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/math/clamp.hpp b/include/kfr/math/clamp.hpp
@@ -1,65 +0,0 @@
-/** @addtogroup basic_math
- * @{
- */
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "impl/clamp.hpp"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-
-/// @brief Returns the first argument clamped to a range [lo, hi]
-template <typename T1, typename T2, typename T3, KFR_ENABLE_IF(is_numeric_args<T1, T2, T3>),
- typename Tout = common_type<T1, T2, T3>>
-KFR_INTRINSIC Tout clamp(const T1& x, const T2& lo, const T3& hi)
-{
- return intrinsics::clamp(static_cast<Tout>(x), static_cast<Tout>(lo), static_cast<Tout>(hi));
-}
-
-/// @brief Creates an expression that returns the first argument clamped to a range [lo, hi]
-template <typename E1, typename E2, typename E3, KFR_ENABLE_IF(is_input_expressions<E1, E2, E3>)>
-KFR_INTRINSIC internal::expression_function<fn::clamp, E1, E2, E3> clamp(E1&& x, E2&& lo, E3&& hi)
-{
- return { fn::clamp(), std::forward<E1>(x), std::forward<E2>(lo), std::forward<E3>(hi) };
-}
-
-/// @brief Returns the first argument clamped to a range [0, hi]
-template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>),
- typename Tout = common_type<T1, T2>>
-KFR_INTRINSIC Tout clamp(const T1& x, const T2& hi)
-{
- return intrinsics::clamp(static_cast<Tout>(x), static_cast<Tout>(hi));
-}
-
-/// @brief Creates an expression that returns the first argument clamped to a range [0, hi]
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::clamp, E1, E2> clamp(E1&& x, E2&& hi)
-{
- return { fn::clamp(), std::forward<E1>(x), std::forward<E2>(hi) };
-}
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/include/kfr/math/complex_math.hpp b/include/kfr/math/complex_math.hpp
@@ -25,13 +25,13 @@
*/
#pragma once
+#include "../simd/abs.hpp"
#include "../simd/complex.hpp"
-#include "abs.hpp"
+#include "../simd/min_max.hpp"
+#include "../simd/select.hpp"
#include "atan.hpp"
#include "hyperbolic.hpp"
#include "log_exp.hpp"
-#include "min_max.hpp"
-#include "select.hpp"
#include "sin_cos.hpp"
#include "sqrt.hpp"
@@ -223,13 +223,6 @@ KFR_FUNCTION T1 csin(const T1& x)
return intrinsics::csin(x);
}
-/// @brief Returns template expression that returns the sine of the the complex value x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::csin, E1> csin(E1&& x)
-{
- return { fn::csin(), std::forward<E1>(x) };
-}
-
/// @brief Returns the hyperbolic sine of the complex number x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 csinh(const T1& x)
@@ -237,13 +230,6 @@ KFR_FUNCTION T1 csinh(const T1& x)
return intrinsics::csinh(x);
}
-/// @brief Returns template expression that returns the hyperbolic sine of the complex number x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::csinh, E1> csinh(E1&& x)
-{
- return { fn::csinh(), std::forward<E1>(x) };
-}
-
/// @brief Returns the cosine of the complex number x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 ccos(const T1& x)
@@ -251,13 +237,6 @@ KFR_FUNCTION T1 ccos(const T1& x)
return intrinsics::ccos(x);
}
-/// @brief Returns template expression that returns the cosine of the the complex value x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::ccos, E1> ccos(E1&& x)
-{
- return { fn::ccos(), std::forward<E1>(x) };
-}
-
/// @brief Returns the hyperbolic cosine of the complex number x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 ccosh(const T1& x)
@@ -265,13 +244,6 @@ KFR_FUNCTION T1 ccosh(const T1& x)
return intrinsics::ccosh(x);
}
-/// @brief Returns template expression that returns the hyperbolic cosine of the the complex value x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::ccosh, E1> ccosh(E1&& x)
-{
- return { fn::ccosh(), std::forward<E1>(x) };
-}
-
/// @brief Returns the squared absolute value (magnitude squared) of the complex number x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION realtype<T1> cabssqr(const T1& x)
@@ -279,14 +251,6 @@ KFR_FUNCTION realtype<T1> cabssqr(const T1& x)
return intrinsics::cabssqr(x);
}
-/// @brief Returns template expression that returns the squared absolute value (magnitude squared) of the
-/// complex number x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::cabssqr, E1> cabssqr(E1&& x)
-{
- return { fn::cabssqr(), std::forward<E1>(x) };
-}
-
/// @brief Returns the absolute value (magnitude) of the complex number x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION realtype<T1> cabs(const T1& x)
@@ -294,13 +258,6 @@ KFR_FUNCTION realtype<T1> cabs(const T1& x)
return intrinsics::cabs(x);
}
-/// @brief Returns template expression that returns the absolute value (magnitude) of the complex number x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::cabs, E1> cabs(E1&& x)
-{
- return { fn::cabs(), std::forward<E1>(x) };
-}
-
/// @brief Returns the phase angle (argument) of the complex number x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION realtype<T1> carg(const T1& x)
@@ -308,13 +265,6 @@ KFR_FUNCTION realtype<T1> carg(const T1& x)
return intrinsics::carg(x);
}
-/// @brief Returns template expression that returns the phase angle (argument) of the complex number x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::carg, E1> carg(E1&& x)
-{
- return { fn::carg(), std::forward<E1>(x) };
-}
-
/// @brief Returns the natural logarithm of the complex number x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 clog(const T1& x)
@@ -322,13 +272,6 @@ KFR_FUNCTION T1 clog(const T1& x)
return intrinsics::clog(x);
}
-/// @brief Returns template expression that returns the natural logarithm of the complex number x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::clog, E1> clog(E1&& x)
-{
- return { fn::clog(), std::forward<E1>(x) };
-}
-
/// @brief Returns the binary (base-2) logarithm of the complex number x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 clog2(const T1& x)
@@ -336,13 +279,6 @@ KFR_FUNCTION T1 clog2(const T1& x)
return intrinsics::clog2(x);
}
-/// @brief Returns template expression that returns the binary (base-2) logarithm of the complex number x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::clog2, E1> clog2(E1&& x)
-{
- return { fn::clog2(), std::forward<E1>(x) };
-}
-
/// @brief Returns the common (base-10) logarithm of the complex number x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 clog10(const T1& x)
@@ -350,13 +286,6 @@ KFR_FUNCTION T1 clog10(const T1& x)
return intrinsics::clog10(x);
}
-/// @brief Returns template expression that returns the common (base-10) logarithm of the complex number x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::clog10, E1> clog10(E1&& x)
-{
- return { fn::clog10(), std::forward<E1>(x) };
-}
-
/// @brief Returns \f$e\f$ raised to the complex number x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 cexp(const T1& x)
@@ -364,13 +293,6 @@ KFR_FUNCTION T1 cexp(const T1& x)
return intrinsics::cexp(x);
}
-/// @brief Returns template expression that returns \f$e\f$ raised to the complex number x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::cexp, E1> cexp(E1&& x)
-{
- return { fn::cexp(), std::forward<E1>(x) };
-}
-
/// @brief Returns 2 raised to the complex number x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 cexp2(const T1& x)
@@ -378,13 +300,6 @@ KFR_FUNCTION T1 cexp2(const T1& x)
return intrinsics::cexp2(x);
}
-/// @brief Returns template expression that returns 2 raised to the complex number x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::cexp2, E1> cexp2(E1&& x)
-{
- return { fn::cexp2(), std::forward<E1>(x) };
-}
-
/// @brief Returns 10 raised to the complex number x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 cexp10(const T1& x)
@@ -392,13 +307,6 @@ KFR_FUNCTION T1 cexp10(const T1& x)
return intrinsics::cexp10(x);
}
-/// @brief Returns template expression that returns 10 raised to the complex number x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::cexp10, E1> cexp10(E1&& x)
-{
- return { fn::cexp10(), std::forward<E1>(x) };
-}
-
/// @brief Converts complex number to polar
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 polar(const T1& x)
@@ -406,13 +314,6 @@ KFR_FUNCTION T1 polar(const T1& x)
return intrinsics::polar(x);
}
-/// @brief Returns template expression that converts complex number to polar
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::polar, E1> polar(E1&& x)
-{
- return { fn::polar(), std::forward<E1>(x) };
-}
-
/// @brief Converts complex number to cartesian
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 cartesian(const T1& x)
@@ -420,13 +321,6 @@ KFR_FUNCTION T1 cartesian(const T1& x)
return intrinsics::cartesian(x);
}
-/// @brief Returns template expression that converts complex number to cartesian
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::cartesian, E1> cartesian(E1&& x)
-{
- return { fn::cartesian(), std::forward<E1>(x) };
-}
-
/// @brief Returns square root of the complex number x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 csqrt(const T1& x)
@@ -434,13 +328,6 @@ KFR_FUNCTION T1 csqrt(const T1& x)
return intrinsics::csqrt(x);
}
-/// @brief Returns template expression that returns square root of the complex number x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::csqrt, E1> csqrt(E1&& x)
-{
- return { fn::csqrt(), std::forward<E1>(x) };
-}
-
/// @brief Returns square of the complex number x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION T1 csqr(const T1& x)
@@ -448,12 +335,5 @@ KFR_FUNCTION T1 csqr(const T1& x)
return intrinsics::csqr(x);
}
-/// @brief Returns template expression that returns square of the complex number x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::csqr, E1> csqr(E1&& x)
-{
- return { fn::csqr(), std::forward<E1>(x) };
-}
-
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/math/gamma.hpp b/include/kfr/math/gamma.hpp
@@ -39,13 +39,6 @@ KFR_FUNCTION flt_type<T1> gamma(const T1& x)
return intrinsics::gamma(x);
}
-/// @brief Creates expression that returns the approximate gamma function of an argument
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::gamma, E1> gamma(E1&& x)
-{
- return { fn::gamma(), std::forward<E1>(x) };
-}
-
/// @brief Returns the approximate factorial of an argument
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION flt_type<T1> factorial_approx(const T1& x)
@@ -53,13 +46,6 @@ KFR_FUNCTION flt_type<T1> factorial_approx(const T1& x)
return intrinsics::factorial_approx(x);
}
-/// @brief Creates expression that returns the approximate factorial of an argument
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::factorial_approx, E1> factorial_approx(E1&& x)
-{
- return { fn::factorial_approx(), std::forward<E1>(x) };
-}
-
constexpr inline uint64_t factorial_table[21] = {
0,
1,
@@ -87,7 +73,7 @@ constexpr inline uint64_t factorial_table[21] = {
/// @brief Returns the factorial of an argument. Returns max(uint64_t) if does not fit to uint64_t
constexpr uint64_t factorial(int n)
{
- if (n < 0 || n > 20)
+ if (CMT_LIKELY(n < 0 || n > 20))
return std::numeric_limits<uint64_t>::max();
return factorial_table[n];
}
diff --git a/include/kfr/math/hyperbolic.hpp b/include/kfr/math/hyperbolic.hpp
@@ -39,13 +39,6 @@ KFR_FUNCTION flt_type<T1> sinh(const T1& x)
return intrinsics::sinh(x);
}
-/// @brief Returns template expression that returns the hyperbolic sine of the x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::sinh, E1> sinh(E1&& x)
-{
- return { fn::sinh(), std::forward<E1>(x) };
-}
-
/// @brief Returns the hyperbolic cosine of the x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION flt_type<T1> cosh(const T1& x)
@@ -53,13 +46,6 @@ KFR_FUNCTION flt_type<T1> cosh(const T1& x)
return intrinsics::cosh(x);
}
-/// @brief Returns template expression that returns the hyperbolic cosine of the x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::cosh, E1> cosh(E1&& x)
-{
- return { fn::cosh(), std::forward<E1>(x) };
-}
-
/// @brief Returns the hyperbolic tangent of the x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION flt_type<T1> tanh(const T1& x)
@@ -67,13 +53,6 @@ KFR_FUNCTION flt_type<T1> tanh(const T1& x)
return intrinsics::tanh(x);
}
-/// @brief Returns template expression that returns the hyperbolic tangent of the x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::tanh, E1> tanh(E1&& x)
-{
- return { fn::tanh(), std::forward<E1>(x) };
-}
-
/// @brief Returns the hyperbolic cotangent of the x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION flt_type<T1> coth(const T1& x)
@@ -81,13 +60,6 @@ KFR_FUNCTION flt_type<T1> coth(const T1& x)
return intrinsics::coth(x);
}
-/// @brief Returns template expression that returns the hyperbolic cotangent of the x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::coth, E1> coth(E1&& x)
-{
- return { fn::coth(), std::forward<E1>(x) };
-}
-
/// @brief Returns the hyperbolic sine of the even elements of the x and the hyperbolic cosine of the odd
/// elements of the x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
@@ -96,14 +68,6 @@ KFR_FUNCTION flt_type<T1> sinhcosh(const T1& x)
return intrinsics::sinhcosh(x);
}
-/// @brief Returns template expression that returns the hyperbolic sine of the even elements of the x and the
-/// hyperbolic cosine of the odd elements of the x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::sinhcosh, E1> sinhcosh(E1&& x)
-{
- return { fn::sinhcosh(), std::forward<E1>(x) };
-}
-
/// @brief Returns the hyperbolic cosine of the even elements of the x and the hyperbolic sine of the odd
/// elements of the x
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
@@ -111,13 +75,5 @@ KFR_FUNCTION flt_type<T1> coshsinh(const T1& x)
{
return intrinsics::coshsinh(x);
}
-
-/// @brief Returns template expression that returns the hyperbolic cosine of the even elements of the x and
-/// the hyperbolic sine of the odd elements of the x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::coshsinh, E1> coshsinh(E1&& x)
-{
- return { fn::coshsinh(), std::forward<E1>(x) };
-}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/math/impl/abs.hpp b/include/kfr/math/impl/abs.hpp
@@ -1,138 +0,0 @@
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "../../math/select.hpp"
-#include "../../simd/impl/function.hpp"
-#include "../../simd/operators.hpp"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-
-namespace intrinsics
-{
-
-#if defined CMT_ARCH_SSSE3 && defined KFR_NATIVE_INTRINSICS
-
-// floating point
-template <typename T, size_t N, KFR_ENABLE_IF(is_f_class<T>)>
-KFR_INTRINSIC vec<T, N> abs(const vec<T, N>& x) CMT_NOEXCEPT
-{
- return x & special_constants<T>::invhighbitmask();
-}
-
-KFR_INTRINSIC i64sse abs(const i64sse& x) CMT_NOEXCEPT
-{
- const __m128i sh = _mm_srai_epi32(x.v, 31);
- const __m128i msk = _mm_shuffle_epi32(sh, _MM_SHUFFLE(3, 3, 1, 1));
- return _mm_sub_epi64(_mm_xor_si128(x.v, msk), msk);
-}
-KFR_INTRINSIC i32sse abs(const i32sse& x) CMT_NOEXCEPT { return _mm_abs_epi32(x.v); }
-KFR_INTRINSIC i16sse abs(const i16sse& x) CMT_NOEXCEPT { return _mm_abs_epi16(x.v); }
-KFR_INTRINSIC i8sse abs(const i8sse& x) CMT_NOEXCEPT { return _mm_abs_epi8(x.v); }
-KFR_INTRINSIC u64sse abs(const u64sse& x) CMT_NOEXCEPT { return x; }
-KFR_INTRINSIC u32sse abs(const u32sse& x) CMT_NOEXCEPT { return x; }
-KFR_INTRINSIC u16sse abs(const u16sse& x) CMT_NOEXCEPT { return x; }
-KFR_INTRINSIC u8sse abs(const u8sse& x) CMT_NOEXCEPT { return x; }
-
-#if defined CMT_ARCH_AVX2
-KFR_INTRINSIC i64avx abs(const i64avx& x) CMT_NOEXCEPT
-{
- const __m256i sh = _mm256_srai_epi32(x.v, 31);
- const __m256i msk = _mm256_shuffle_epi32(sh, _MM_SHUFFLE(3, 3, 1, 1));
- return _mm256_sub_epi64(_mm256_xor_si256(x.v, msk), msk);
-}
-KFR_INTRINSIC i32avx abs(const i32avx& x) CMT_NOEXCEPT { return _mm256_abs_epi32(x.v); }
-KFR_INTRINSIC i16avx abs(const i16avx& x) CMT_NOEXCEPT { return _mm256_abs_epi16(x.v); }
-KFR_INTRINSIC i8avx abs(const i8avx& x) CMT_NOEXCEPT { return _mm256_abs_epi8(x.v); }
-KFR_INTRINSIC u64avx abs(const u64avx& x) CMT_NOEXCEPT { return x; }
-KFR_INTRINSIC u32avx abs(const u32avx& x) CMT_NOEXCEPT { return x; }
-KFR_INTRINSIC u16avx abs(const u16avx& x) CMT_NOEXCEPT { return x; }
-KFR_INTRINSIC u8avx abs(const u8avx& x) CMT_NOEXCEPT { return x; }
-#endif
-
-#if defined CMT_ARCH_AVX512
-KFR_INTRINSIC i64avx512 abs(const i64avx512& x) CMT_NOEXCEPT { return _mm512_abs_epi64(x.v); }
-KFR_INTRINSIC i32avx512 abs(const i32avx512& x) CMT_NOEXCEPT { return _mm512_abs_epi32(x.v); }
-KFR_INTRINSIC i16avx512 abs(const i16avx512& x) CMT_NOEXCEPT { return _mm512_abs_epi16(x.v); }
-KFR_INTRINSIC i8avx512 abs(const i8avx512& x) CMT_NOEXCEPT { return _mm512_abs_epi8(x.v); }
-KFR_INTRINSIC u64avx512 abs(const u64avx512& x) CMT_NOEXCEPT { return x; }
-KFR_INTRINSIC u32avx512 abs(const u32avx512& x) CMT_NOEXCEPT { return x; }
-KFR_INTRINSIC u16avx512 abs(const u16avx512& x) CMT_NOEXCEPT { return x; }
-KFR_INTRINSIC u8avx512 abs(const u8avx512& x) CMT_NOEXCEPT { return x; }
-#endif
-
-KFR_HANDLE_ALL_SIZES_1_IF(abs, !is_f_class<T>)
-
-#elif defined CMT_ARCH_NEON && defined KFR_NATIVE_INTRINSICS
-
-KFR_INTRINSIC i8neon abs(const i8neon& x) CMT_NOEXCEPT { return vabsq_s8(x.v); }
-KFR_INTRINSIC i16neon abs(const i16neon& x) CMT_NOEXCEPT { return vabsq_s16(x.v); }
-KFR_INTRINSIC i32neon abs(const i32neon& x) CMT_NOEXCEPT { return vabsq_s32(x.v); }
-#if defined CMT_ARCH_NEON64
-KFR_INTRINSIC i64neon abs(const i64neon& x) CMT_NOEXCEPT { return vabsq_s64(x.v); }
-#else
-KFR_INTRINSIC i64neon abs(const i64neon& x) CMT_NOEXCEPT { return select(x >= 0, x, -x); }
-#endif
-
-KFR_INTRINSIC u8neon abs(const u8neon& x) CMT_NOEXCEPT { return x; }
-KFR_INTRINSIC u16neon abs(const u16neon& x) CMT_NOEXCEPT { return x; }
-KFR_INTRINSIC u32neon abs(const u32neon& x) CMT_NOEXCEPT { return x; }
-KFR_INTRINSIC u64neon abs(const u64neon& x) CMT_NOEXCEPT { return x; }
-
-KFR_INTRINSIC f32neon abs(const f32neon& x) CMT_NOEXCEPT { return vabsq_f32(x.v); }
-#if defined CMT_ARCH_NEON64
-KFR_INTRINSIC f64neon abs(const f64neon& x) CMT_NOEXCEPT { return vabsq_f64(x.v); }
-#else
-KFR_INTRINSIC f64neon abs(const f64neon& x) CMT_NOEXCEPT
-{
- return x & special_constants<f64>::invhighbitmask();
-}
-#endif
-
-KFR_HANDLE_ALL_SIZES_1(abs)
-
-#else
-
-// floating point
-template <typename T, size_t N, KFR_ENABLE_IF(is_f_class<T>)>
-KFR_INTRINSIC vec<T, N> abs(const vec<T, N>& x) CMT_NOEXCEPT
-{
- return x & special_constants<T>::invhighbitmask();
-}
-
-// fallback
-template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)>
-KFR_INTRINSIC vec<T, N> abs(const vec<T, N>& x) CMT_NOEXCEPT
-{
- return select(x >= T(0), x, -x);
-}
-#endif
-KFR_HANDLE_SCALAR(abs)
-} // namespace intrinsics
-
-KFR_I_FN(abs)
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/include/kfr/math/impl/asin_acos.hpp b/include/kfr/math/impl/asin_acos.hpp
@@ -22,10 +22,10 @@
*/
#pragma once
-#include "../../math/atan.hpp"
-#include "../../math/select.hpp"
-#include "../../math/sqrt.hpp"
#include "../../simd/impl/function.hpp"
+#include "../../simd/select.hpp"
+#include "../atan.hpp"
+#include "../sqrt.hpp"
namespace kfr
{
diff --git a/include/kfr/math/impl/atan.hpp b/include/kfr/math/impl/atan.hpp
@@ -21,12 +21,12 @@
See https://www.kfrlib.com for details.
*/
#pragma once
-#include "../../math/abs.hpp"
-#include "../../math/select.hpp"
-#include "../../math/sin_cos.hpp"
+#include "../../simd/abs.hpp"
#include "../../simd/constants.hpp"
#include "../../simd/impl/function.hpp"
#include "../../simd/operators.hpp"
+#include "../../simd/select.hpp"
+#include "../sin_cos.hpp"
namespace kfr
{
@@ -59,7 +59,7 @@ KFR_INTRINSIC vec<f32, N> atan2k(const vec<f32, N>& yy, const vec<f32, N>& xx)
u = fmadd(u, t, 0.199926957488059997558594f);
u = fmadd(u, t, -0.333331018686294555664062f);
t = u * t * s + s;
- t = innercast<f32>(q) * 1.5707963267948966192313216916398f + t;
+ t = broadcastto<f32>(q) * 1.5707963267948966192313216916398f + t;
return t;
}
@@ -98,7 +98,7 @@ KFR_INTRINSIC vec<f64, N> atan2k(const vec<f64, N>& yy, const vec<f64, N>& xx)
u = fmadd(u, t, 0.199999999996591265594148);
u = fmadd(u, t, -0.333333333333311110369124);
t = u * t * s + s;
- t = innercast<f64>(q) * 1.5707963267948966192313216916398 + t;
+ t = broadcastto<f64>(q) * 1.5707963267948966192313216916398 + t;
return t;
}
diff --git a/include/kfr/math/impl/clamp.hpp b/include/kfr/math/impl/clamp.hpp
@@ -1,55 +0,0 @@
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "../../math/min_max.hpp"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-
-namespace intrinsics
-{
-
-template <typename T>
-KFR_INTRINSIC T clamp(const T& x, const T& lo, const T& hi)
-{
- return max(min(x, hi), lo);
-}
-
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> clamp(const vec<T, N>& x, const vec<T, N>& lo, const vec<T, N>& hi)
-{
- return max(min(x, hi), lo);
-}
-
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> clamp(const vec<T, N>& x, const vec<T, N>& hi)
-{
- return max(min(x, hi), zerovector<T, N>());
-}
-} // namespace intrinsics
-KFR_I_FN(clamp)
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/include/kfr/math/impl/gamma.hpp b/include/kfr/math/impl/gamma.hpp
@@ -50,7 +50,7 @@ KFR_INTRINSIC vec<T, N> gamma(const vec<T, N>& z)
vec<T, N> accm = gamma_precalc<T>[0];
CMT_LOOP_UNROLL
for (size_t k = 1; k < Count; k++)
- accm += gamma_precalc<T>[k] / (z + innercast<utype<T>>(k));
+ accm += gamma_precalc<T>[k] / (z + broadcastto<utype<T>>(k));
accm *= exp(-(z + Count)) * pow(z + Count, z + 0.5);
return accm / z;
}
diff --git a/include/kfr/math/impl/hyperbolic.hpp b/include/kfr/math/impl/hyperbolic.hpp
@@ -22,13 +22,13 @@
*/
#pragma once
-#include "../../math/abs.hpp"
-#include "../../math/log_exp.hpp"
-#include "../../math/min_max.hpp"
-#include "../../math/select.hpp"
+#include "../../simd/abs.hpp"
#include "../../simd/constants.hpp"
#include "../../simd/impl/function.hpp"
+#include "../../simd/min_max.hpp"
#include "../../simd/operators.hpp"
+#include "../../simd/select.hpp"
+#include "../log_exp.hpp"
namespace kfr
{
diff --git a/include/kfr/math/impl/log_exp.hpp b/include/kfr/math/impl/log_exp.hpp
@@ -22,14 +22,14 @@
*/
#pragma once
-#include "../../math/abs.hpp"
-#include "../../math/clamp.hpp"
-#include "../../math/min_max.hpp"
-#include "../../math/round.hpp"
-#include "../../math/select.hpp"
+#include "../../simd/abs.hpp"
+#include "../../simd/clamp.hpp"
#include "../../simd/constants.hpp"
#include "../../simd/impl/function.hpp"
+#include "../../simd/min_max.hpp"
#include "../../simd/operators.hpp"
+#include "../../simd/round.hpp"
+#include "../../simd/select.hpp"
#include "../../simd/shuffle.hpp"
namespace kfr
@@ -65,8 +65,8 @@ KFR_INTRINSIC vec<f32, N> vldexpk(const vec<f32, N>& x, const vec<i32, N>& q)
m = (((m + q) >> 6) - m) << 4;
const vec<i32, N> qq = q - (m << 2);
m = clamp(m + 0x7f, vec<i32, N>(0xff));
- vec<f32, N> u = pow4(bitcast<f32>(innercast<i32>(m) << 23));
- return x * u * bitcast<f32>((innercast<i32>(qq + 0x7f)) << 23);
+ vec<f32, N> u = pow4(bitcast<f32>(broadcastto<i32>(m) << 23));
+ return x * u * bitcast<f32>((broadcastto<i32>(qq + 0x7f)) << 23);
}
template <size_t N>
@@ -76,8 +76,8 @@ KFR_INTRINSIC vec<f64, N> vldexpk(const vec<f64, N>& x, const vec<i64, N>& q)
m = (((m + q) >> 9) - m) << 7;
const vec<i64, N> qq = q - (m << 2);
m = clamp(m + 0x3ff, i64(0x7ff));
- vec<f64, N> u = pow4(bitcast<f64>(innercast<i64>(m) << 52));
- return x * u * bitcast<f64>((innercast<i64>(qq + 0x3ff)) << 52);
+ vec<f64, N> u = pow4(bitcast<f64>(broadcastto<i64>(m) << 52));
+ return x * u * bitcast<f64>((broadcastto<i64>(qq + 0x3ff)) << 52);
}
template <typename T, size_t N>
@@ -98,12 +98,12 @@ KFR_INTRINSIC vec<f32, N> log(const vec<f32, N>& d)
vec<f32, N> sp = select(d < 0, constants<f32>::qnan, constants<f32>::neginfinity);
vec<f32, N> t;
- t = fmadd(0.2371599674224853515625f, x2, 0.285279005765914916992188f);
- t = fmadd(t, x2, 0.400005519390106201171875f);
- t = fmadd(t, x2, 0.666666567325592041015625f);
- t = fmadd(t, x2, 2.0f);
+ t = fmadd(0.2371599674224853515625f, x2, 0.285279005765914916992188f);
+ t = fmadd(t, x2, 0.400005519390106201171875f);
+ t = fmadd(t, x2, 0.666666567325592041015625f);
+ t = fmadd(t, x2, 2.0f);
- x = x * t + c_log_2<f32> * innercast<f32>(e);
+ x = x * t + c_log_2<f32> * broadcastto<f32>(e);
x = select(d > 0, x, sp);
return x;
@@ -120,16 +120,16 @@ KFR_INTRINSIC vec<f64, N> log(const vec<f64, N>& d)
vec<f64, N> sp = select(d < 0, constants<f64>::qnan, constants<f64>::neginfinity);
- vec<f64, N> t;
- t = fmadd(0.148197055177935105296783, x2, 0.153108178020442575739679);
- t = fmadd(t, x2, 0.181837339521549679055568);
- t = fmadd(t, x2, 0.22222194152736701733275);
- t = fmadd(t, x2, 0.285714288030134544449368);
- t = fmadd(t, x2, 0.399999999989941956712869);
- t = fmadd(t, x2, 0.666666666666685503450651);
- t = fmadd(t, x2, 2);
+ vec<f64, N> t;
+ t = fmadd(0.148197055177935105296783, x2, 0.153108178020442575739679);
+ t = fmadd(t, x2, 0.181837339521549679055568);
+ t = fmadd(t, x2, 0.22222194152736701733275);
+ t = fmadd(t, x2, 0.285714288030134544449368);
+ t = fmadd(t, x2, 0.399999999989941956712869);
+ t = fmadd(t, x2, 0.666666666666685503450651);
+ t = fmadd(t, x2, 2);
- x = x * t + constants<f64>::log_2 * innercast<f64>(e);
+ x = x * t + constants<f64>::log_2 * broadcastto<f64>(e);
x = select(d > 0, x, sp);
return x;
@@ -138,12 +138,12 @@ KFR_INTRINSIC vec<f64, N> log(const vec<f64, N>& d)
template <typename T, size_t N, typename Tout = flt_type<T>>
KFR_INTRINSIC vec<Tout, N> log2(const vec<T, N>& x)
{
- return log(innercast<Tout>(x)) * constants<Tout>::recip_log_2;
+ return log(broadcastto<Tout>(x)) * constants<Tout>::recip_log_2;
}
template <typename T, size_t N, typename Tout = flt_type<T>>
KFR_INTRINSIC vec<Tout, N> log10(const vec<T, N>& x)
{
- return log(innercast<Tout>(x)) * constants<Tout>::recip_log_10;
+ return log(broadcastto<Tout>(x)) * constants<Tout>::recip_log_10;
}
template <size_t N>
@@ -152,11 +152,11 @@ KFR_INTRINSIC vec<f32, N> exp(const vec<f32, N>& d)
const f32 ln2_part1 = 0.6931457519f;
const f32 ln2_part2 = 1.4286067653e-6f;
- vec<i32, N> q = innercast<i32>(floor(d * constants<f32>::recip_log_2));
+ vec<i32, N> q = broadcastto<i32>(floor(d * constants<f32>::recip_log_2));
vec<f32, N> s, u;
- s = fmadd(innercast<f32>(q), -ln2_part1, d);
- s = fmadd(innercast<f32>(q), -ln2_part2, s);
+ s = fmadd(broadcastto<f32>(q), -ln2_part1, d);
+ s = fmadd(broadcastto<f32>(q), -ln2_part2, s);
const f32 c2 = 0.4999999105930328369140625f;
const f32 c3 = 0.166668415069580078125f;
@@ -185,11 +185,11 @@ KFR_INTRINSIC vec<f64, N> exp(const vec<f64, N>& d)
const f64 ln2_part1 = 0.69314717501401901245;
const f64 ln2_part2 = 5.545926273775592108e-009;
- vec<i64, N> q = innercast<i64>(floor(d * constants<f64>::recip_log_2));
+ vec<i64, N> q = broadcastto<i64>(floor(d * constants<f64>::recip_log_2));
vec<f64, N> s, u;
- s = fmadd(innercast<f64>(q), -ln2_part1, d);
- s = fmadd(innercast<f64>(q), -ln2_part2, s);
+ s = fmadd(broadcastto<f64>(q), -ln2_part1, d);
+ s = fmadd(broadcastto<f64>(q), -ln2_part2, s);
const f64 c2 = 0.499999999999994948485237955537741072475910186767578;
const f64 c3 = 0.166666666667024204739888659787538927048444747924805;
@@ -235,7 +235,7 @@ KFR_INTRINSIC vec<T, N> pow(const vec<T, N>& a, const vec<T, N>& b)
{
const vec<T, N> t = exp(b * log(abs(a)));
const mask<T, N> isint = floor(b) == b;
- const mask<T, N> iseven = (innercast<itype<T>>(b) & 1) == 0;
+ const mask<T, N> iseven = (broadcastto<itype<T>>(b) & 1) == 0;
return select(
a > T(), t,
select(a == T(), T(), select(isint, select(iseven, t, -t), broadcast<N>(constants<T>::qnan))));
@@ -256,7 +256,7 @@ KFR_INTRINSIC vec<T, N> cbrt(const vec<T, N>& x)
template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>), typename Tout = flt_type<T>>
KFR_INTRINSIC vec<Tout, N> cbrt(const vec<T, N>& x)
{
- return cbrt(innercast<Tout>(x));
+ return cbrt(broadcastto<Tout>(x));
}
KFR_HANDLE_SCALAR_1_T(exp, flt_type<T>)
@@ -289,25 +289,25 @@ KFR_HANDLE_NOT_F_1(root)
KFR_HANDLE_NOT_F_1(cbrt)
template <typename T1, typename T2>
-KFR_INTRINSIC flt_type<common_type<T1, T2>> logn(const T1& a, const T2& b)
+KFR_INTRINSIC flt_type<std::common_type_t<T1, T2>> logn(const T1& a, const T2& b)
{
return log(a) / log(b);
}
template <typename T1, typename T2>
-KFR_INTRINSIC flt_type<common_type<T1, T2>> logm(const T1& a, const T2& b)
+KFR_INTRINSIC flt_type<std::common_type_t<T1, T2>> logm(const T1& a, const T2& b)
{
return log(a) * b;
}
template <typename T1, typename T2, typename T3>
-KFR_INTRINSIC flt_type<common_type<T1, T2, T3>> exp_fmadd(const T1& x, const T2& m, const T3& a)
+KFR_INTRINSIC flt_type<std::common_type_t<T1, T2, T3>> exp_fmadd(const T1& x, const T2& m, const T3& a)
{
return exp(fmadd(x, m, a));
}
template <typename T1, typename T2, typename T3>
-KFR_INTRINSIC flt_type<common_type<T1, T2, T3>> log_fmadd(const T1& x, const T2& m, const T3& a)
+KFR_INTRINSIC flt_type<std::common_type_t<T1, T2, T3>> log_fmadd(const T1& x, const T2& m, const T3& a)
{
return fmadd(log(x), m, a);
}
diff --git a/include/kfr/math/impl/logical.hpp b/include/kfr/math/impl/logical.hpp
@@ -1,284 +0,0 @@
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "../../math/abs.hpp"
-#include "../../simd/impl/function.hpp"
-#include "../../simd/operators.hpp"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-
-namespace intrinsics
-{
-
-#if defined CMT_ARCH_SSE2 && defined KFR_NATIVE_INTRINSICS
-
-#if defined CMT_ARCH_SSE41
-
-// horizontal OR
-KFR_INTRINSIC bool bittestany(const mu8sse& x) { return !_mm_testz_si128(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mu16sse& x) { return !_mm_testz_si128(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mu32sse& x) { return !_mm_testz_si128(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mu64sse& x) { return !_mm_testz_si128(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mi8sse& x) { return !_mm_testz_si128(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mi16sse& x) { return !_mm_testz_si128(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mi32sse& x) { return !_mm_testz_si128(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mi64sse& x) { return !_mm_testz_si128(x.v, x.v); }
-
-// horizontal AND
-KFR_INTRINSIC bool bittestall(const mu8sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mu16sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mu32sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mu64sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mi8sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mi16sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mi32sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mi64sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
-#endif
-
-#if defined CMT_ARCH_AVX
-// horizontal OR
-KFR_INTRINSIC bool bittestany(const mf32sse& x) { return !_mm_testz_ps(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mf64sse& x) { return !_mm_testz_pd(x.v, x.v); }
-
-KFR_INTRINSIC bool bittestany(const mf32avx& x) { return !_mm256_testz_ps(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mf64avx& x) { return !_mm256_testz_pd(x.v, x.v); }
-
-KFR_INTRINSIC bool bittestany(const mu8avx& x) { return !_mm256_testz_si256(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mu16avx& x) { return !_mm256_testz_si256(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mu32avx& x) { return !_mm256_testz_si256(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mu64avx& x) { return !_mm256_testz_si256(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mi8avx& x) { return !_mm256_testz_si256(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mi16avx& x) { return !_mm256_testz_si256(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mi32avx& x) { return !_mm256_testz_si256(x.v, x.v); }
-KFR_INTRINSIC bool bittestany(const mi64avx& x) { return !_mm256_testz_si256(x.v, x.v); }
-
-// horizontal AND
-KFR_INTRINSIC bool bittestall(const mf32sse& x) { return _mm_testc_ps(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mf64sse& x) { return _mm_testc_pd(x.v, allonesvector(x).v); }
-
-KFR_INTRINSIC bool bittestall(const mf32avx& x) { return _mm256_testc_ps(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mf64avx& x) { return _mm256_testc_pd(x.v, allonesvector(x).v); }
-
-KFR_INTRINSIC bool bittestall(const mu8avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mu16avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mu32avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mu64avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mi8avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mi16avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mi32avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
-KFR_INTRINSIC bool bittestall(const mi64avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
-
-#if defined CMT_ARCH_AVX512
-// horizontal OR
-KFR_INTRINSIC bool bittestany(const mf32avx512& x) { return _mm512_movepi32_mask(_mm512_castps_si512(x.v)); }
-KFR_INTRINSIC bool bittestany(const mf64avx512& x) { return _mm512_movepi64_mask(_mm512_castpd_si512(x.v)); }
-KFR_INTRINSIC bool bittestany(const mu8avx512& x) { return _mm512_movepi8_mask(x.v); }
-KFR_INTRINSIC bool bittestany(const mu16avx512& x) { return _mm512_movepi16_mask(x.v); }
-KFR_INTRINSIC bool bittestany(const mu32avx512& x) { return _mm512_movepi32_mask(x.v); }
-KFR_INTRINSIC bool bittestany(const mu64avx512& x) { return _mm512_movepi64_mask(x.v); }
-KFR_INTRINSIC bool bittestany(const mi8avx512& x) { return _mm512_movepi8_mask(x.v); }
-KFR_INTRINSIC bool bittestany(const mi16avx512& x) { return _mm512_movepi16_mask(x.v); }
-KFR_INTRINSIC bool bittestany(const mi32avx512& x) { return _mm512_movepi32_mask(x.v); }
-KFR_INTRINSIC bool bittestany(const mi64avx512& x) { return _mm512_movepi64_mask(x.v); }
-
-// horizontal AND
-KFR_INTRINSIC bool bittestall(const mf32avx512& x)
-{
- return !~_mm512_movepi32_mask(_mm512_castps_si512(x.v));
-}
-KFR_INTRINSIC bool bittestall(const mf64avx512& x)
-{
- return !~_mm512_movepi64_mask(_mm512_castpd_si512(x.v));
-}
-KFR_INTRINSIC bool bittestall(const mu8avx512& x) { return !~_mm512_movepi8_mask(x.v); }
-KFR_INTRINSIC bool bittestall(const mu16avx512& x) { return !~_mm512_movepi16_mask(x.v); }
-KFR_INTRINSIC bool bittestall(const mu32avx512& x) { return !uint16_t(~_mm512_movepi32_mask(x.v)); }
-KFR_INTRINSIC bool bittestall(const mu64avx512& x) { return !uint8_t(~_mm512_movepi64_mask(x.v)); }
-KFR_INTRINSIC bool bittestall(const mi8avx512& x) { return !~_mm512_movepi8_mask(x.v); }
-KFR_INTRINSIC bool bittestall(const mi16avx512& x) { return !~_mm512_movepi16_mask(x.v); }
-KFR_INTRINSIC bool bittestall(const mi32avx512& x) { return !uint16_t(~_mm512_movepi32_mask(x.v)); }
-KFR_INTRINSIC bool bittestall(const mi64avx512& x) { return !uint8_t(~_mm512_movepi64_mask(x.v)); }
-
-#endif
-
-#elif defined CMT_ARCH_SSE41
-KFR_INTRINSIC bool bittestany(const mf32sse& x)
-{
- return !_mm_testz_si128(bitcast<bit<u8>>(x).v, bitcast<bit<u8>>(x).v);
-}
-KFR_INTRINSIC bool bittestany(const mf64sse& x)
-{
- return !_mm_testz_si128(bitcast<bit<u8>>(x).v, bitcast<bit<u8>>(x).v);
-}
-KFR_INTRINSIC bool bittestall(const mf32sse& x)
-{
- return _mm_testc_si128(bitcast<bit<u8>>(x).v, allonesvector(bitcast<bit<u8>>(x)).v);
-}
-KFR_INTRINSIC bool bittestall(const mf64sse& x)
-{
- return _mm_testc_si128(bitcast<bit<u8>>(x).v, allonesvector(bitcast<bit<u8>>(x)).v);
-}
-#endif
-
-#if !defined CMT_ARCH_SSE41
-
-KFR_INTRINSIC bool bittestany(const mf32sse& x) { return _mm_movemask_ps(x.v); }
-KFR_INTRINSIC bool bittestany(const mf64sse& x) { return _mm_movemask_pd(x.v); }
-KFR_INTRINSIC bool bittestany(const mu8sse& x) { return _mm_movemask_epi8(x.v); }
-KFR_INTRINSIC bool bittestany(const mu16sse& x) { return _mm_movemask_epi8(x.v); }
-KFR_INTRINSIC bool bittestany(const mu32sse& x) { return _mm_movemask_epi8(x.v); }
-KFR_INTRINSIC bool bittestany(const mu64sse& x) { return _mm_movemask_epi8(x.v); }
-KFR_INTRINSIC bool bittestany(const mi8sse& x) { return _mm_movemask_epi8(x.v); }
-KFR_INTRINSIC bool bittestany(const mi16sse& x) { return _mm_movemask_epi8(x.v); }
-KFR_INTRINSIC bool bittestany(const mi32sse& x) { return _mm_movemask_epi8(x.v); }
-KFR_INTRINSIC bool bittestany(const mi64sse& x) { return _mm_movemask_epi8(x.v); }
-
-KFR_INTRINSIC bool bittestall(const mf32sse& x) { return !_mm_movemask_ps((~x).v); }
-KFR_INTRINSIC bool bittestall(const mf64sse& x) { return !_mm_movemask_pd((~x).v); }
-KFR_INTRINSIC bool bittestall(const mu8sse& x) { return !_mm_movemask_epi8((~x).v); }
-KFR_INTRINSIC bool bittestall(const mu16sse& x) { return !_mm_movemask_epi8((~x).v); }
-KFR_INTRINSIC bool bittestall(const mu32sse& x) { return !_mm_movemask_epi8((~x).v); }
-KFR_INTRINSIC bool bittestall(const mu64sse& x) { return !_mm_movemask_epi8((~x).v); }
-KFR_INTRINSIC bool bittestall(const mi8sse& x) { return !_mm_movemask_epi8((~x).v); }
-KFR_INTRINSIC bool bittestall(const mi16sse& x) { return !_mm_movemask_epi8((~x).v); }
-KFR_INTRINSIC bool bittestall(const mi32sse& x) { return !_mm_movemask_epi8((~x).v); }
-KFR_INTRINSIC bool bittestall(const mi64sse& x) { return !_mm_movemask_epi8((~x).v); }
-#endif
-
-template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T>)>
-KFR_INTRINSIC bool bittestall(const mask<T, N>& a)
-{
- return bittestall(expand_simd(a, bit<T>(true)));
-}
-template <typename T, size_t N, KFR_ENABLE_IF(N >= vector_width<T>), typename = void>
-KFR_INTRINSIC bool bittestall(const mask<T, N>& a)
-{
- return bittestall(low(a)) && bittestall(high(a));
-}
-
-template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T>)>
-KFR_INTRINSIC bool bittestany(const mask<T, N>& a)
-{
- return bittestany(expand_simd(a, bit<T>(false)));
-}
-template <typename T, size_t N, KFR_ENABLE_IF(N >= vector_width<T>), typename = void>
-KFR_INTRINSIC bool bittestany(const mask<T, N>& a)
-{
- return bittestany(low(a)) || bittestany(high(a));
-}
-
-#elif CMT_ARCH_NEON && defined KFR_NATIVE_INTRINSICS
-
-KFR_INTRINSIC bool bittestall(const mu32neon& a)
-{
- const uint32x2_t tmp = vand_u32(vget_low_u32(a.v), vget_high_u32(a.v));
- return vget_lane_u32(vpmin_u32(tmp, tmp), 0) == 0xFFFFFFFFu;
-}
-
-KFR_INTRINSIC bool bittestany(const mu32neon& a)
-{
- const uint32x2_t tmp = vorr_u32(vget_low_u32(a.v), vget_high_u32(a.v));
- return vget_lane_u32(vpmax_u32(tmp, tmp), 0) != 0;
-}
-KFR_INTRINSIC bool bittestany(const mu8neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
-KFR_INTRINSIC bool bittestany(const mu16neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
-KFR_INTRINSIC bool bittestany(const mu64neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
-KFR_INTRINSIC bool bittestany(const mi8neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
-KFR_INTRINSIC bool bittestany(const mi16neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
-KFR_INTRINSIC bool bittestany(const mi64neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
-KFR_INTRINSIC bool bittestany(const mf32neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
-KFR_INTRINSIC bool bittestany(const mf64neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
-
-KFR_INTRINSIC bool bittestall(const mu8neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
-KFR_INTRINSIC bool bittestall(const mu16neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
-KFR_INTRINSIC bool bittestall(const mu64neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
-KFR_INTRINSIC bool bittestall(const mi8neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
-KFR_INTRINSIC bool bittestall(const mi16neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
-KFR_INTRINSIC bool bittestall(const mi64neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
-KFR_INTRINSIC bool bittestall(const mf32neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
-KFR_INTRINSIC bool bittestall(const mf64neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
-
-template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T>)>
-KFR_INTRINSIC bool bittestall(const mask<T, N>& a)
-{
- return bittestall(expand_simd(a, bit<T>(true)));
-}
-template <typename T, size_t N, KFR_ENABLE_IF(N >= vector_width<T>), typename = void>
-KFR_INTRINSIC bool bittestall(const mask<T, N>& a)
-{
- return bittestall(low(a)) && bittestall(high(a));
-}
-
-template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T>)>
-KFR_INTRINSIC bool bittestany(const mask<T, N>& a)
-{
- return bittestany(expand_simd(a, bit<T>(false)));
-}
-template <typename T, size_t N, KFR_ENABLE_IF(N >= vector_width<T>), typename = void>
-KFR_INTRINSIC bool bittestany(const mask<T, N>& a)
-{
- return bittestany(low(a)) || bittestany(high(a));
-}
-
-#else
-
-template <typename T, size_t N>
-KFR_INTRINSIC bitmask<N> getmask(const mask<T, N>& x)
-{
- typename bitmask<N>::type val = 0;
- for (size_t i = 0; i < N; i++)
- {
- val |= static_cast<int>(x[i]) << i;
- }
- return val;
-}
-
-template <typename T, size_t N>
-KFR_INTRINSIC bool bittestany(const mask<T, N>& x)
-{
- return getmask(x).value;
-}
-template <typename T, size_t N>
-KFR_INTRINSIC bool bittestany(const mask<T, N>& x, const mask<T, N>& y)
-{
- return bittestany(x & y);
-}
-
-template <typename T, size_t N>
-KFR_INTRINSIC bool bittestall(const mask<T, N>& x)
-{
- return !getmask(~x).value;
-}
-template <typename T, size_t N>
-KFR_INTRINSIC bool bittestall(const mask<T, N>& x, const mask<T, N>& y)
-{
- return !bittestany(~x & y);
-}
-#endif
-} // namespace intrinsics
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/include/kfr/math/impl/min_max.hpp b/include/kfr/math/impl/min_max.hpp
@@ -1,236 +0,0 @@
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "../../math/abs.hpp"
-#include "../../math/select.hpp"
-#include "../../simd/impl/function.hpp"
-#include "../../simd/operators.hpp"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-
-namespace intrinsics
-{
-
-#if defined CMT_ARCH_SSE2 && defined KFR_NATIVE_INTRINSICS
-
-KFR_INTRINSIC f32sse min(const f32sse& x, const f32sse& y) { return _mm_min_ps(x.v, y.v); }
-KFR_INTRINSIC f64sse min(const f64sse& x, const f64sse& y) { return _mm_min_pd(x.v, y.v); }
-KFR_INTRINSIC u8sse min(const u8sse& x, const u8sse& y) { return _mm_min_epu8(x.v, y.v); }
-KFR_INTRINSIC i16sse min(const i16sse& x, const i16sse& y) { return _mm_min_epi16(x.v, y.v); }
-
-KFR_INTRINSIC f32sse max(const f32sse& x, const f32sse& y) { return _mm_max_ps(x.v, y.v); }
-KFR_INTRINSIC f64sse max(const f64sse& x, const f64sse& y) { return _mm_max_pd(x.v, y.v); }
-KFR_INTRINSIC u8sse max(const u8sse& x, const u8sse& y) { return _mm_max_epu8(x.v, y.v); }
-KFR_INTRINSIC i16sse max(const i16sse& x, const i16sse& y) { return _mm_max_epi16(x.v, y.v); }
-
-#if defined CMT_ARCH_AVX2
-KFR_INTRINSIC u8avx min(const u8avx& x, const u8avx& y) { return _mm256_min_epu8(x.v, y.v); }
-KFR_INTRINSIC i16avx min(const i16avx& x, const i16avx& y) { return _mm256_min_epi16(x.v, y.v); }
-KFR_INTRINSIC i8avx min(const i8avx& x, const i8avx& y) { return _mm256_min_epi8(x.v, y.v); }
-KFR_INTRINSIC u16avx min(const u16avx& x, const u16avx& y) { return _mm256_min_epu16(x.v, y.v); }
-KFR_INTRINSIC i32avx min(const i32avx& x, const i32avx& y) { return _mm256_min_epi32(x.v, y.v); }
-KFR_INTRINSIC u32avx min(const u32avx& x, const u32avx& y) { return _mm256_min_epu32(x.v, y.v); }
-
-KFR_INTRINSIC u8avx max(const u8avx& x, const u8avx& y) { return _mm256_max_epu8(x.v, y.v); }
-KFR_INTRINSIC i16avx max(const i16avx& x, const i16avx& y) { return _mm256_max_epi16(x.v, y.v); }
-KFR_INTRINSIC i8avx max(const i8avx& x, const i8avx& y) { return _mm256_max_epi8(x.v, y.v); }
-KFR_INTRINSIC u16avx max(const u16avx& x, const u16avx& y) { return _mm256_max_epu16(x.v, y.v); }
-KFR_INTRINSIC i32avx max(const i32avx& x, const i32avx& y) { return _mm256_max_epi32(x.v, y.v); }
-KFR_INTRINSIC u32avx max(const u32avx& x, const u32avx& y) { return _mm256_max_epu32(x.v, y.v); }
-
-#endif
-
-#if defined CMT_ARCH_AVX512
-KFR_INTRINSIC f32avx512 min(const f32avx512& x, const f32avx512& y) { return _mm512_min_ps(x.v, y.v); }
-KFR_INTRINSIC f64avx512 min(const f64avx512& x, const f64avx512& y) { return _mm512_min_pd(x.v, y.v); }
-KFR_INTRINSIC f32avx512 max(const f32avx512& x, const f32avx512& y) { return _mm512_max_ps(x.v, y.v); }
-KFR_INTRINSIC f64avx512 max(const f64avx512& x, const f64avx512& y) { return _mm512_max_pd(x.v, y.v); }
-
-KFR_INTRINSIC u8avx512 min(const u8avx512& x, const u8avx512& y) { return _mm512_min_epu8(x.v, y.v); }
-KFR_INTRINSIC i16avx512 min(const i16avx512& x, const i16avx512& y) { return _mm512_min_epi16(x.v, y.v); }
-KFR_INTRINSIC i8avx512 min(const i8avx512& x, const i8avx512& y) { return _mm512_min_epi8(x.v, y.v); }
-KFR_INTRINSIC u16avx512 min(const u16avx512& x, const u16avx512& y) { return _mm512_min_epu16(x.v, y.v); }
-KFR_INTRINSIC i32avx512 min(const i32avx512& x, const i32avx512& y) { return _mm512_min_epi32(x.v, y.v); }
-KFR_INTRINSIC u32avx512 min(const u32avx512& x, const u32avx512& y) { return _mm512_min_epu32(x.v, y.v); }
-KFR_INTRINSIC u8avx512 max(const u8avx512& x, const u8avx512& y) { return _mm512_max_epu8(x.v, y.v); }
-KFR_INTRINSIC i16avx512 max(const i16avx512& x, const i16avx512& y) { return _mm512_max_epi16(x.v, y.v); }
-KFR_INTRINSIC i8avx512 max(const i8avx512& x, const i8avx512& y) { return _mm512_max_epi8(x.v, y.v); }
-KFR_INTRINSIC u16avx512 max(const u16avx512& x, const u16avx512& y) { return _mm512_max_epu16(x.v, y.v); }
-KFR_INTRINSIC i32avx512 max(const i32avx512& x, const i32avx512& y) { return _mm512_max_epi32(x.v, y.v); }
-KFR_INTRINSIC u32avx512 max(const u32avx512& x, const u32avx512& y) { return _mm512_max_epu32(x.v, y.v); }
-KFR_INTRINSIC i64avx512 min(const i64avx512& x, const i64avx512& y) { return _mm512_min_epi64(x.v, y.v); }
-KFR_INTRINSIC u64avx512 min(const u64avx512& x, const u64avx512& y) { return _mm512_min_epu64(x.v, y.v); }
-KFR_INTRINSIC i64avx512 max(const i64avx512& x, const i64avx512& y) { return _mm512_max_epi64(x.v, y.v); }
-KFR_INTRINSIC u64avx512 max(const u64avx512& x, const u64avx512& y) { return _mm512_max_epu64(x.v, y.v); }
-
-KFR_INTRINSIC i64avx min(const i64avx& x, const i64avx& y) { return _mm256_min_epi64(x.v, y.v); }
-KFR_INTRINSIC u64avx min(const u64avx& x, const u64avx& y) { return _mm256_min_epu64(x.v, y.v); }
-KFR_INTRINSIC i64avx max(const i64avx& x, const i64avx& y) { return _mm256_max_epi64(x.v, y.v); }
-KFR_INTRINSIC u64avx max(const u64avx& x, const u64avx& y) { return _mm256_max_epu64(x.v, y.v); }
-
-KFR_INTRINSIC i64sse min(const i64sse& x, const i64sse& y) { return _mm_min_epi64(x.v, y.v); }
-KFR_INTRINSIC u64sse min(const u64sse& x, const u64sse& y) { return _mm_min_epu64(x.v, y.v); }
-KFR_INTRINSIC i64sse max(const i64sse& x, const i64sse& y) { return _mm_max_epi64(x.v, y.v); }
-KFR_INTRINSIC u64sse max(const u64sse& x, const u64sse& y) { return _mm_max_epu64(x.v, y.v); }
-#else
-KFR_INTRINSIC i64sse min(const i64sse& x, const i64sse& y) { return select(x < y, x, y); }
-KFR_INTRINSIC u64sse min(const u64sse& x, const u64sse& y) { return select(x < y, x, y); }
-KFR_INTRINSIC i64sse max(const i64sse& x, const i64sse& y) { return select(x > y, x, y); }
-KFR_INTRINSIC u64sse max(const u64sse& x, const u64sse& y) { return select(x > y, x, y); }
-KFR_INTRINSIC i64avx min(const i64avx& x, const i64avx& y) { return select(x < y, x, y); }
-KFR_INTRINSIC u64avx min(const u64avx& x, const u64avx& y) { return select(x < y, x, y); }
-KFR_INTRINSIC i64avx max(const i64avx& x, const i64avx& y) { return select(x > y, x, y); }
-KFR_INTRINSIC u64avx max(const u64avx& x, const u64avx& y) { return select(x > y, x, y); }
-#endif
-
-#if defined CMT_ARCH_AVX
-KFR_INTRINSIC f32avx min(const f32avx& x, const f32avx& y) { return _mm256_min_ps(x.v, y.v); }
-KFR_INTRINSIC f64avx min(const f64avx& x, const f64avx& y) { return _mm256_min_pd(x.v, y.v); }
-KFR_INTRINSIC f32avx max(const f32avx& x, const f32avx& y) { return _mm256_max_ps(x.v, y.v); }
-KFR_INTRINSIC f64avx max(const f64avx& x, const f64avx& y) { return _mm256_max_pd(x.v, y.v); }
-#endif
-
-#if defined CMT_ARCH_SSE41
-KFR_INTRINSIC i8sse min(const i8sse& x, const i8sse& y) { return _mm_min_epi8(x.v, y.v); }
-KFR_INTRINSIC u16sse min(const u16sse& x, const u16sse& y) { return _mm_min_epu16(x.v, y.v); }
-KFR_INTRINSIC i32sse min(const i32sse& x, const i32sse& y) { return _mm_min_epi32(x.v, y.v); }
-KFR_INTRINSIC u32sse min(const u32sse& x, const u32sse& y) { return _mm_min_epu32(x.v, y.v); }
-
-KFR_INTRINSIC i8sse max(const i8sse& x, const i8sse& y) { return _mm_max_epi8(x.v, y.v); }
-KFR_INTRINSIC u16sse max(const u16sse& x, const u16sse& y) { return _mm_max_epu16(x.v, y.v); }
-KFR_INTRINSIC i32sse max(const i32sse& x, const i32sse& y) { return _mm_max_epi32(x.v, y.v); }
-KFR_INTRINSIC u32sse max(const u32sse& x, const u32sse& y) { return _mm_max_epu32(x.v, y.v); }
-#else
-KFR_INTRINSIC i8sse min(const i8sse& x, const i8sse& y) { return select(x < y, x, y); }
-KFR_INTRINSIC u16sse min(const u16sse& x, const u16sse& y) { return select(x < y, x, y); }
-KFR_INTRINSIC i32sse min(const i32sse& x, const i32sse& y) { return select(x < y, x, y); }
-KFR_INTRINSIC u32sse min(const u32sse& x, const u32sse& y) { return select(x < y, x, y); }
-
-KFR_INTRINSIC i8sse max(const i8sse& x, const i8sse& y) { return select(x > y, x, y); }
-KFR_INTRINSIC u16sse max(const u16sse& x, const u16sse& y) { return select(x > y, x, y); }
-KFR_INTRINSIC i32sse max(const i32sse& x, const i32sse& y) { return select(x > y, x, y); }
-KFR_INTRINSIC u32sse max(const u32sse& x, const u32sse& y) { return select(x > y, x, y); }
-
-#endif
-
-KFR_HANDLE_ALL_SIZES_2(min)
-KFR_HANDLE_ALL_SIZES_2(max)
-
-#elif defined CMT_ARCH_NEON && defined KFR_NATIVE_INTRINSICS
-
-KFR_INTRINSIC i8neon min(const i8neon& x, const i8neon& y) { return vminq_s8(x.v, y.v); }
-KFR_INTRINSIC u8neon min(const u8neon& x, const u8neon& y) { return vminq_u8(x.v, y.v); }
-KFR_INTRINSIC i16neon min(const i16neon& x, const i16neon& y) { return vminq_s16(x.v, y.v); }
-KFR_INTRINSIC u16neon min(const u16neon& x, const u16neon& y) { return vminq_u16(x.v, y.v); }
-KFR_INTRINSIC i32neon min(const i32neon& x, const i32neon& y) { return vminq_s32(x.v, y.v); }
-KFR_INTRINSIC u32neon min(const u32neon& x, const u32neon& y) { return vminq_u32(x.v, y.v); }
-KFR_INTRINSIC i64neon min(const i64neon& x, const i64neon& y) { return select(x < y, x, y); }
-KFR_INTRINSIC u64neon min(const u64neon& x, const u64neon& y) { return select(x < y, x, y); }
-
-KFR_INTRINSIC i8neon max(const i8neon& x, const i8neon& y) { return vmaxq_s8(x.v, y.v); }
-KFR_INTRINSIC u8neon max(const u8neon& x, const u8neon& y) { return vmaxq_u8(x.v, y.v); }
-KFR_INTRINSIC i16neon max(const i16neon& x, const i16neon& y) { return vmaxq_s16(x.v, y.v); }
-KFR_INTRINSIC u16neon max(const u16neon& x, const u16neon& y) { return vmaxq_u16(x.v, y.v); }
-KFR_INTRINSIC i32neon max(const i32neon& x, const i32neon& y) { return vmaxq_s32(x.v, y.v); }
-KFR_INTRINSIC u32neon max(const u32neon& x, const u32neon& y) { return vmaxq_u32(x.v, y.v); }
-KFR_INTRINSIC i64neon max(const i64neon& x, const i64neon& y) { return select(x > y, x, y); }
-KFR_INTRINSIC u64neon max(const u64neon& x, const u64neon& y) { return select(x > y, x, y); }
-
-KFR_INTRINSIC f32neon min(const f32neon& x, const f32neon& y) { return vminq_f32(x.v, y.v); }
-KFR_INTRINSIC f32neon max(const f32neon& x, const f32neon& y) { return vmaxq_f32(x.v, y.v); }
-#if defined CMT_ARCH_NEON64
-KFR_INTRINSIC f64neon min(const f64neon& x, const f64neon& y) { return vminq_f64(x.v, y.v); }
-KFR_INTRINSIC f64neon max(const f64neon& x, const f64neon& y) { return vmaxq_f64(x.v, y.v); }
-#else
-KFR_INTRINSIC f64neon min(const f64neon& x, const f64neon& y) { return select(x < y, x, y); }
-KFR_INTRINSIC f64neon max(const f64neon& x, const f64neon& y) { return select(x > y, x, y); }
-#endif
-
-KFR_HANDLE_ALL_SIZES_2(min)
-KFR_HANDLE_ALL_SIZES_2(max)
-
-#else
-
-// fallback
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> min(const vec<T, N>& x, const vec<T, N>& y)
-{
- return select(x < y, x, y);
-}
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> max(const vec<T, N>& x, const vec<T, N>& y)
-{
- return select(x > y, x, y);
-}
-#endif
-
-template <typename T>
-KFR_INTRINSIC T min(initialvalue<T>)
-{
- return std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity()
- : std::numeric_limits<T>::max();
-}
-template <typename T>
-KFR_INTRINSIC T max(initialvalue<T>)
-{
- return std::numeric_limits<T>::has_infinity ? -std::numeric_limits<T>::infinity()
- : std::numeric_limits<T>::min();
-}
-template <typename T>
-KFR_INTRINSIC T absmin(initialvalue<T>)
-{
- return std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity()
- : std::numeric_limits<T>::max();
-}
-template <typename T>
-KFR_INTRINSIC T absmax(initialvalue<T>)
-{
- return 0;
-}
-
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> absmin(const vec<T, N>& x, const vec<T, N>& y)
-{
- return min(abs(x), abs(y));
-}
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> absmax(const vec<T, N>& x, const vec<T, N>& y)
-{
- return max(abs(x), abs(y));
-}
-
-KFR_HANDLE_SCALAR(min)
-KFR_HANDLE_SCALAR(max)
-KFR_HANDLE_SCALAR(absmin)
-KFR_HANDLE_SCALAR(absmax)
-} // namespace intrinsics
-KFR_I_FN(min)
-KFR_I_FN(max)
-KFR_I_FN(absmin)
-KFR_I_FN(absmax)
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/include/kfr/math/impl/round.hpp b/include/kfr/math/impl/round.hpp
@@ -1,282 +0,0 @@
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "../../simd/impl/function.hpp"
-#include "../../simd/operators.hpp"
-#include "abs.hpp"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-
-namespace intrinsics
-{
-
-#define KFR_mm_trunc_ps(V) _mm_round_ps((V), _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC)
-#define KFR_mm_roundnearest_ps(V) _mm_round_ps((V), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)
-#define KFR_mm_trunc_pd(V) _mm_round_pd((V), _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC)
-#define KFR_mm_roundnearest_pd(V) _mm_round_pd((V), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)
-
-#define KFR_mm_trunc_ss(V) _mm_round_ss(_mm_setzero_ps(), (V), _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC)
-#define KFR_mm_roundnearest_ss(V) \
- _mm_round_ss(_mm_setzero_ps(), (V), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)
-#define KFR_mm_trunc_sd(V) _mm_round_sd(_mm_setzero_pd(), (V), _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC)
-#define KFR_mm_roundnearest_sd(V) \
- _mm_round_sd(_mm_setzero_pd(), (V), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)
-
-#define KFR_mm_floor_ss(V) _mm_floor_ss(_mm_setzero_ps(), (V))
-#define KFR_mm_floor_sd(V) _mm_floor_sd(_mm_setzero_pd(), (V))
-#define KFR_mm_ceil_ss(V) _mm_ceil_ss(_mm_setzero_ps(), (V))
-#define KFR_mm_ceil_sd(V) _mm_ceil_sd(_mm_setzero_pd(), (V))
-
-#define KFR_mm256_trunc_ps(V) _mm256_round_ps((V), _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC)
-#define KFR_mm256_roundnearest_ps(V) _mm256_round_ps((V), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)
-#define KFR_mm256_trunc_pd(V) _mm256_round_pd((V), _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC)
-#define KFR_mm256_roundnearest_pd(V) _mm256_round_pd((V), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)
-
-#if defined CMT_ARCH_SSE41 && defined KFR_NATIVE_INTRINSICS
-
-KFR_INTRINSIC f32sse floor(const f32sse& value) { return _mm_floor_ps(value.v); }
-KFR_INTRINSIC f32sse ceil(const f32sse& value) { return _mm_ceil_ps(value.v); }
-KFR_INTRINSIC f32sse trunc(const f32sse& value) { return KFR_mm_trunc_ps(value.v); }
-KFR_INTRINSIC f32sse round(const f32sse& value) { return KFR_mm_roundnearest_ps(value.v); }
-KFR_INTRINSIC f64sse floor(const f64sse& value) { return _mm_floor_pd(value.v); }
-KFR_INTRINSIC f64sse ceil(const f64sse& value) { return _mm_ceil_pd(value.v); }
-KFR_INTRINSIC f64sse trunc(const f64sse& value) { return KFR_mm_trunc_pd(value.v); }
-KFR_INTRINSIC f64sse round(const f64sse& value) { return KFR_mm_roundnearest_pd(value.v); }
-KFR_INTRINSIC f32sse fract(const f32sse& x) { return x - floor(x); }
-KFR_INTRINSIC f64sse fract(const f64sse& x) { return x - floor(x); }
-
-#if defined CMT_ARCH_AVX
-
-KFR_INTRINSIC f32avx floor(const f32avx& value) { return _mm256_floor_ps(value.v); }
-KFR_INTRINSIC f32avx ceil(const f32avx& value) { return _mm256_ceil_ps(value.v); }
-KFR_INTRINSIC f32avx trunc(const f32avx& value) { return KFR_mm256_trunc_ps(value.v); }
-KFR_INTRINSIC f32avx round(const f32avx& value) { return KFR_mm256_roundnearest_ps(value.v); }
-KFR_INTRINSIC f64avx floor(const f64avx& value) { return _mm256_floor_pd(value.v); }
-KFR_INTRINSIC f64avx ceil(const f64avx& value) { return _mm256_ceil_pd(value.v); }
-KFR_INTRINSIC f64avx trunc(const f64avx& value) { return KFR_mm256_trunc_pd(value.v); }
-KFR_INTRINSIC f64avx round(const f64avx& value) { return KFR_mm256_roundnearest_pd(value.v); }
-KFR_INTRINSIC f32avx fract(const f32avx& x) { return x - floor(x); }
-KFR_INTRINSIC f64avx fract(const f64avx& x) { return x - floor(x); }
-
-#endif
-
-#if defined CMT_ARCH_AVX512
-
-KFR_INTRINSIC f32avx512 floor(const f32avx512& value)
-{
- return _mm512_roundscale_ps(value.v, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC);
-}
-KFR_INTRINSIC f32avx512 ceil(const f32avx512& value)
-{
- return _mm512_roundscale_ps(value.v, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC);
-}
-KFR_INTRINSIC f32avx512 trunc(const f32avx512& value)
-{
- return _mm512_roundscale_ps(value.v, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC);
-}
-KFR_INTRINSIC f32avx512 round(const f32avx512& value)
-{
- return _mm512_roundscale_ps(value.v, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
-}
-KFR_INTRINSIC f64avx512 floor(const f64avx512& value)
-{
- return _mm512_roundscale_pd(value.v, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC);
-}
-KFR_INTRINSIC f64avx512 ceil(const f64avx512& value)
-{
- return _mm512_roundscale_pd(value.v, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC);
-}
-KFR_INTRINSIC f64avx512 trunc(const f64avx512& value)
-{
- return _mm512_roundscale_pd(value.v, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC);
-}
-KFR_INTRINSIC f64avx512 round(const f64avx512& value)
-{
- return _mm512_roundscale_pd(value.v, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
-}
-KFR_INTRINSIC f32avx512 fract(const f32avx512& x) { return x - floor(x); }
-KFR_INTRINSIC f64avx512 fract(const f64avx512& x) { return x - floor(x); }
-#endif
-
-KFR_HANDLE_ALL_SIZES_1_IF(floor, is_f_class<T>)
-KFR_HANDLE_ALL_SIZES_1_IF(ceil, is_f_class<T>)
-KFR_HANDLE_ALL_SIZES_1_IF(round, is_f_class<T>)
-KFR_HANDLE_ALL_SIZES_1_IF(trunc, is_f_class<T>)
-KFR_HANDLE_ALL_SIZES_1_IF(fract, is_f_class<T>)
-
-#else
-
-// fallback
-
-template <typename T>
-constexpr inline T fp_precision_limit = 4503599627370496.0;
-template <>
-constexpr inline f32 fp_precision_limit<f32> = 16777216.0f;
-
-template <size_t N>
-KFR_INTRINSIC vec<f32, N> floor(const vec<f32, N>& x)
-{
- vec<f32, N> t = innercast<f32>(innercast<i32>(x));
- return select(abs(x) >= fp_precision_limit<f32>, x, t - select(x < t, 1.f, 0.f));
-}
-template <size_t N>
-KFR_INTRINSIC vec<f64, N> floor(const vec<f64, N>& x)
-{
- vec<f64, N> t = innercast<f64>(innercast<i64>(x));
- return select(abs(x) >= fp_precision_limit<f64>, x, t - select(x < t, 1., 0.));
-}
-template <size_t N>
-KFR_INTRINSIC vec<f32, N> ceil(const vec<f32, N>& x)
-{
- vec<f32, N> t = innercast<f32>(innercast<i32>(x));
- return select(abs(x) >= fp_precision_limit<f32>, x, t + select(x > t, 1.f, 0.f));
-}
-template <size_t N>
-KFR_INTRINSIC vec<f64, N> ceil(const vec<f64, N>& x)
-{
- vec<f64, N> t = innercast<f64>(innercast<i64>(x));
- return select(abs(x) >= fp_precision_limit<f64>, x, t + select(x > t, 1., 0.));
-}
-template <size_t N>
-KFR_INTRINSIC vec<f32, N> round(const vec<f32, N>& x)
-{
- return select(abs(x) >= fp_precision_limit<f32>, x,
- innercast<f32>(innercast<i32>(x + mulsign(broadcast<N>(0.5f), x))));
-}
-template <size_t N>
-KFR_INTRINSIC vec<f64, N> round(const vec<f64, N>& x)
-{
- return select(abs(x) >= fp_precision_limit<f64>, x,
- innercast<f64>(innercast<i64>(x + mulsign(broadcast<N>(0.5), x))));
-}
-template <size_t N>
-KFR_INTRINSIC vec<f32, N> trunc(const vec<f32, N>& x)
-{
- return select(abs(x) >= fp_precision_limit<f32>, x, innercast<f32>(innercast<i32>(x)));
-}
-template <size_t N>
-KFR_INTRINSIC vec<f64, N> trunc(const vec<f64, N>& x)
-{
- return select(abs(x) >= fp_precision_limit<f64>, x, innercast<f64>(innercast<i64>(x)));
-}
-template <size_t N>
-KFR_INTRINSIC vec<f32, N> fract(const vec<f32, N>& x)
-{
- return x - floor(x);
-}
-template <size_t N>
-KFR_INTRINSIC vec<f64, N> fract(const vec<f64, N>& x)
-{
- return x - floor(x);
-}
-#endif
-
-template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)>
-KFR_INTRINSIC vec<T, N> floor(const vec<T, N>& value)
-{
- return value;
-}
-template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)>
-KFR_INTRINSIC vec<T, N> ceil(const vec<T, N>& value)
-{
- return value;
-}
-template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)>
-KFR_INTRINSIC vec<T, N> trunc(const vec<T, N>& value)
-{
- return value;
-}
-template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)>
-KFR_INTRINSIC vec<T, N> round(const vec<T, N>& value)
-{
- return value;
-}
-template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)>
-KFR_INTRINSIC vec<T, N> fract(const vec<T, N>&)
-{
- return T(0);
-}
-
-template <typename T, size_t N, typename IT = itype<T>>
-KFR_INTRINSIC vec<IT, N> ifloor(const vec<T, N>& value)
-{
- return innercast<IT>(floor(value));
-}
-template <typename T, size_t N, typename IT = itype<T>>
-KFR_INTRINSIC vec<IT, N> iceil(const vec<T, N>& value)
-{
- return innercast<IT>(ceil(value));
-}
-template <typename T, size_t N, typename IT = itype<T>>
-KFR_INTRINSIC vec<IT, N> itrunc(const vec<T, N>& value)
-{
- return innercast<IT>(trunc(value));
-}
-template <typename T, size_t N, typename IT = itype<T>>
-KFR_INTRINSIC vec<IT, N> iround(const vec<T, N>& value)
-{
- return innercast<IT>(round(value));
-}
-
-KFR_HANDLE_SCALAR(floor)
-KFR_HANDLE_SCALAR(ceil)
-KFR_HANDLE_SCALAR(round)
-KFR_HANDLE_SCALAR(trunc)
-KFR_HANDLE_SCALAR(fract)
-KFR_HANDLE_SCALAR(ifloor)
-KFR_HANDLE_SCALAR(iceil)
-KFR_HANDLE_SCALAR(iround)
-KFR_HANDLE_SCALAR(itrunc)
-} // namespace intrinsics
-KFR_I_FN(floor)
-KFR_I_FN(ceil)
-KFR_I_FN(round)
-KFR_I_FN(trunc)
-KFR_I_FN(fract)
-KFR_I_FN(ifloor)
-KFR_I_FN(iceil)
-KFR_I_FN(iround)
-KFR_I_FN(itrunc)
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
-
-#undef KFR_mm_trunc_ps
-#undef KFR_mm_roundnearest_ps
-#undef KFR_mm_trunc_pd
-#undef KFR_mm_roundnearest_pd
-#undef KFR_mm_trunc_ss
-#undef KFR_mm_roundnearest_ss
-#undef KFR_mm_trunc_sd
-#undef KFR_mm_roundnearest_sd
-#undef KFR_mm_floor_ss
-#undef KFR_mm_floor_sd
-#undef KFR_mm_ceil_ss
-#undef KFR_mm_ceil_sd
-#undef KFR_mm256_trunc_ps
-#undef KFR_mm256_roundnearest_ps
-#undef KFR_mm256_trunc_pd
-#undef KFR_mm256_roundnearest_pd
diff --git a/include/kfr/math/impl/saturation.hpp b/include/kfr/math/impl/saturation.hpp
@@ -1,205 +0,0 @@
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "../../math/select.hpp"
-#include "../../simd/impl/function.hpp"
-#include "../../simd/operators.hpp"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-
-namespace intrinsics
-{
-
-// Generic functions
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> saturated_signed_add(const vec<T, N>& a, const vec<T, N>& b)
-{
- using UT = utype<T>;
- constexpr size_t shift = typebits<UT>::bits - 1;
- vec<UT, N> aa = bitcast<UT>(a);
- vec<UT, N> bb = bitcast<UT>(b);
- const vec<UT, N> sum = aa + bb;
- aa = (aa >> shift) + static_cast<UT>(std::numeric_limits<T>::max());
-
- return select(bitcast<T>((aa ^ bb) | ~(bb ^ sum)) >= T(), a, bitcast<T>(sum));
-}
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> saturated_signed_sub(const vec<T, N>& a, const vec<T, N>& b)
-{
- using UT = utype<T>;
- constexpr size_t shift = typebits<UT>::bits - 1;
- vec<UT, N> aa = bitcast<UT>(a);
- vec<UT, N> bb = bitcast<UT>(b);
- const vec<UT, N> diff = aa - bb;
- aa = (aa >> shift) + static_cast<UT>(std::numeric_limits<T>::max());
-
- return select(bitcast<T>((aa ^ bb) & (aa ^ diff)) < T(), a, bitcast<T>(diff));
-}
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> saturated_unsigned_add(const vec<T, N>& a, const vec<T, N>& b)
-{
- const vec<T, N> t = allonesvector(a);
- return select(a > t - b, t, a + b);
-}
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> saturated_unsigned_sub(const vec<T, N>& a, const vec<T, N>& b)
-{
- return select(a < b, zerovector(a), a - b);
-}
-
-#if defined CMT_ARCH_SSE2 && defined KFR_NATIVE_INTRINSICS
-
-KFR_INTRINSIC u8sse satadd(const u8sse& x, const u8sse& y) { return _mm_adds_epu8(x.v, y.v); }
-KFR_INTRINSIC i8sse satadd(const i8sse& x, const i8sse& y) { return _mm_adds_epi8(x.v, y.v); }
-KFR_INTRINSIC u16sse satadd(const u16sse& x, const u16sse& y) { return _mm_adds_epu16(x.v, y.v); }
-KFR_INTRINSIC i16sse satadd(const i16sse& x, const i16sse& y) { return _mm_adds_epi16(x.v, y.v); }
-
-KFR_INTRINSIC u8sse satsub(const u8sse& x, const u8sse& y) { return _mm_subs_epu8(x.v, y.v); }
-KFR_INTRINSIC i8sse satsub(const i8sse& x, const i8sse& y) { return _mm_subs_epi8(x.v, y.v); }
-KFR_INTRINSIC u16sse satsub(const u16sse& x, const u16sse& y) { return _mm_subs_epu16(x.v, y.v); }
-KFR_INTRINSIC i16sse satsub(const i16sse& x, const i16sse& y) { return _mm_subs_epi16(x.v, y.v); }
-
-KFR_INTRINSIC i32sse satadd(const i32sse& a, const i32sse& b) { return saturated_signed_add(a, b); }
-KFR_INTRINSIC i64sse satadd(const i64sse& a, const i64sse& b) { return saturated_signed_add(a, b); }
-KFR_INTRINSIC u32sse satadd(const u32sse& a, const u32sse& b) { return saturated_unsigned_add(a, b); }
-KFR_INTRINSIC u64sse satadd(const u64sse& a, const u64sse& b) { return saturated_unsigned_add(a, b); }
-
-KFR_INTRINSIC i32sse satsub(const i32sse& a, const i32sse& b) { return saturated_signed_sub(a, b); }
-KFR_INTRINSIC i64sse satsub(const i64sse& a, const i64sse& b) { return saturated_signed_sub(a, b); }
-KFR_INTRINSIC u32sse satsub(const u32sse& a, const u32sse& b) { return saturated_unsigned_sub(a, b); }
-KFR_INTRINSIC u64sse satsub(const u64sse& a, const u64sse& b) { return saturated_unsigned_sub(a, b); }
-
-#if defined CMT_ARCH_AVX2
-KFR_INTRINSIC u8avx satadd(const u8avx& x, const u8avx& y) { return _mm256_adds_epu8(x.v, y.v); }
-KFR_INTRINSIC i8avx satadd(const i8avx& x, const i8avx& y) { return _mm256_adds_epi8(x.v, y.v); }
-KFR_INTRINSIC u16avx satadd(const u16avx& x, const u16avx& y) { return _mm256_adds_epu16(x.v, y.v); }
-KFR_INTRINSIC i16avx satadd(const i16avx& x, const i16avx& y) { return _mm256_adds_epi16(x.v, y.v); }
-
-KFR_INTRINSIC u8avx satsub(const u8avx& x, const u8avx& y) { return _mm256_subs_epu8(x.v, y.v); }
-KFR_INTRINSIC i8avx satsub(const i8avx& x, const i8avx& y) { return _mm256_subs_epi8(x.v, y.v); }
-KFR_INTRINSIC u16avx satsub(const u16avx& x, const u16avx& y) { return _mm256_subs_epu16(x.v, y.v); }
-KFR_INTRINSIC i16avx satsub(const i16avx& x, const i16avx& y) { return _mm256_subs_epi16(x.v, y.v); }
-
-KFR_INTRINSIC i32avx satadd(const i32avx& a, const i32avx& b) { return saturated_signed_add(a, b); }
-KFR_INTRINSIC i64avx satadd(const i64avx& a, const i64avx& b) { return saturated_signed_add(a, b); }
-KFR_INTRINSIC u32avx satadd(const u32avx& a, const u32avx& b) { return saturated_unsigned_add(a, b); }
-KFR_INTRINSIC u64avx satadd(const u64avx& a, const u64avx& b) { return saturated_unsigned_add(a, b); }
-
-KFR_INTRINSIC i32avx satsub(const i32avx& a, const i32avx& b) { return saturated_signed_sub(a, b); }
-KFR_INTRINSIC i64avx satsub(const i64avx& a, const i64avx& b) { return saturated_signed_sub(a, b); }
-KFR_INTRINSIC u32avx satsub(const u32avx& a, const u32avx& b) { return saturated_unsigned_sub(a, b); }
-KFR_INTRINSIC u64avx satsub(const u64avx& a, const u64avx& b) { return saturated_unsigned_sub(a, b); }
-#endif
-
-#if defined CMT_ARCH_AVX512
-KFR_INTRINSIC u8avx512 satadd(const u8avx512& x, const u8avx512& y) { return _mm512_adds_epu8(x.v, y.v); }
-KFR_INTRINSIC i8avx512 satadd(const i8avx512& x, const i8avx512& y) { return _mm512_adds_epi8(x.v, y.v); }
-KFR_INTRINSIC u16avx512 satadd(const u16avx512& x, const u16avx512& y) { return _mm512_adds_epu16(x.v, y.v); }
-KFR_INTRINSIC i16avx512 satadd(const i16avx512& x, const i16avx512& y) { return _mm512_adds_epi16(x.v, y.v); }
-KFR_INTRINSIC u8avx512 satsub(const u8avx512& x, const u8avx512& y) { return _mm512_subs_epu8(x.v, y.v); }
-KFR_INTRINSIC i8avx512 satsub(const i8avx512& x, const i8avx512& y) { return _mm512_subs_epi8(x.v, y.v); }
-KFR_INTRINSIC u16avx512 satsub(const u16avx512& x, const u16avx512& y) { return _mm512_subs_epu16(x.v, y.v); }
-KFR_INTRINSIC i16avx512 satsub(const i16avx512& x, const i16avx512& y) { return _mm512_subs_epi16(x.v, y.v); }
-
-KFR_INTRINSIC i32avx512 satadd(const i32avx512& a, const i32avx512& b) { return saturated_signed_add(a, b); }
-KFR_INTRINSIC i64avx512 satadd(const i64avx512& a, const i64avx512& b) { return saturated_signed_add(a, b); }
-KFR_INTRINSIC u32avx512 satadd(const u32avx512& a, const u32avx512& b)
-{
- return saturated_unsigned_add(a, b);
-}
-KFR_INTRINSIC u64avx512 satadd(const u64avx512& a, const u64avx512& b)
-{
- return saturated_unsigned_add(a, b);
-}
-KFR_INTRINSIC i32avx512 satsub(const i32avx512& a, const i32avx512& b) { return saturated_signed_sub(a, b); }
-KFR_INTRINSIC i64avx512 satsub(const i64avx512& a, const i64avx512& b) { return saturated_signed_sub(a, b); }
-KFR_INTRINSIC u32avx512 satsub(const u32avx512& a, const u32avx512& b)
-{
- return saturated_unsigned_sub(a, b);
-}
-KFR_INTRINSIC u64avx512 satsub(const u64avx512& a, const u64avx512& b)
-{
- return saturated_unsigned_sub(a, b);
-}
-#endif
-
-KFR_HANDLE_ALL_SIZES_2(satadd)
-KFR_HANDLE_ALL_SIZES_2(satsub)
-
-#elif defined CMT_ARCH_NEON && defined KFR_NATIVE_INTRINSICS
-
-KFR_INTRINSIC u8neon satadd(const u8neon& x, const u8neon& y) { return vqaddq_u8(x.v, y.v); }
-KFR_INTRINSIC i8neon satadd(const i8neon& x, const i8neon& y) { return vqaddq_s8(x.v, y.v); }
-KFR_INTRINSIC u16neon satadd(const u16neon& x, const u16neon& y) { return vqaddq_u16(x.v, y.v); }
-KFR_INTRINSIC i16neon satadd(const i16neon& x, const i16neon& y) { return vqaddq_s16(x.v, y.v); }
-KFR_INTRINSIC u32neon satadd(const u32neon& a, const u32neon& b) { return vqaddq_u32(a.v, b.v); }
-KFR_INTRINSIC i32neon satadd(const i32neon& a, const i32neon& b) { return vqaddq_s32(a.v, b.v); }
-KFR_INTRINSIC u64neon satadd(const u64neon& a, const u64neon& b) { return vqaddq_u64(a.v, b.v); }
-KFR_INTRINSIC i64neon satadd(const i64neon& a, const i64neon& b) { return vqaddq_s64(a.v, b.v); }
-
-KFR_INTRINSIC u8neon satsub(const u8neon& x, const u8neon& y) { return vqsubq_u8(x.v, y.v); }
-KFR_INTRINSIC i8neon satsub(const i8neon& x, const i8neon& y) { return vqsubq_s8(x.v, y.v); }
-KFR_INTRINSIC u16neon satsub(const u16neon& x, const u16neon& y) { return vqsubq_u16(x.v, y.v); }
-KFR_INTRINSIC i16neon satsub(const i16neon& x, const i16neon& y) { return vqsubq_s16(x.v, y.v); }
-KFR_INTRINSIC u32neon satsub(const u32neon& a, const u32neon& b) { return vqsubq_u32(a.v, b.v); }
-KFR_INTRINSIC i32neon satsub(const i32neon& a, const i32neon& b) { return vqsubq_s32(a.v, b.v); }
-KFR_INTRINSIC u64neon satsub(const u64neon& a, const u64neon& b) { return vqsubq_u64(a.v, b.v); }
-KFR_INTRINSIC i64neon satsub(const i64neon& a, const i64neon& b) { return vqsubq_s64(a.v, b.v); }
-
-KFR_HANDLE_ALL_SIZES_2(satadd)
-KFR_HANDLE_ALL_SIZES_2(satsub)
-
-#else
-// fallback
-template <typename T, size_t N, KFR_ENABLE_IF(is_signed<T>)>
-KFR_INTRINSIC vec<T, N> satadd(const vec<T, N>& a, const vec<T, N>& b)
-{
- return saturated_signed_add(a, b);
-}
-template <typename T, size_t N, KFR_ENABLE_IF(is_unsigned<T>)>
-KFR_INTRINSIC vec<T, N> satadd(const vec<T, N>& a, const vec<T, N>& b)
-{
- return saturated_unsigned_add(a, b);
-}
-template <typename T, size_t N, KFR_ENABLE_IF(is_signed<T>)>
-KFR_INTRINSIC vec<T, N> satsub(const vec<T, N>& a, const vec<T, N>& b)
-{
- return saturated_signed_sub(a, b);
-}
-template <typename T, size_t N, KFR_ENABLE_IF(is_unsigned<T>)>
-KFR_INTRINSIC vec<T, N> satsub(const vec<T, N>& a, const vec<T, N>& b)
-{
- return saturated_unsigned_sub(a, b);
-}
-#endif
-KFR_HANDLE_SCALAR(satadd)
-KFR_HANDLE_SCALAR(satsub)
-} // namespace intrinsics
-KFR_I_FN(satadd)
-KFR_I_FN(satsub)
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/include/kfr/math/impl/select.hpp b/include/kfr/math/impl/select.hpp
@@ -1,331 +0,0 @@
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "../../simd/impl/function.hpp"
-#include "../../simd/operators.hpp"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-
-namespace intrinsics
-{
-
-#if defined CMT_ARCH_SSE41 && defined KFR_NATIVE_INTRINSICS
-
-KFR_INTRINSIC u8sse select(const mu8sse& m, const u8sse& x, const u8sse& y)
-{
- return _mm_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC u16sse select(const mu16sse& m, const u16sse& x, const u16sse& y)
-{
- return _mm_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC u32sse select(const mu32sse& m, const u32sse& x, const u32sse& y)
-{
- return _mm_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC u64sse select(const mu64sse& m, const u64sse& x, const u64sse& y)
-{
- return _mm_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC i8sse select(const mi8sse& m, const i8sse& x, const i8sse& y)
-{
- return _mm_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC i16sse select(const mi16sse& m, const i16sse& x, const i16sse& y)
-{
- return _mm_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC i32sse select(const mi32sse& m, const i32sse& x, const i32sse& y)
-{
- return _mm_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC i64sse select(const mi64sse& m, const i64sse& x, const i64sse& y)
-{
- return _mm_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC f32sse select(const mf32sse& m, const f32sse& x, const f32sse& y)
-{
- return _mm_blendv_ps(y.v, x.v, m.v);
-}
-KFR_INTRINSIC f64sse select(const mf64sse& m, const f64sse& x, const f64sse& y)
-{
- return _mm_blendv_pd(y.v, x.v, m.v);
-}
-
-#if defined CMT_ARCH_AVX
-KFR_INTRINSIC f64avx select(const mf64avx& m, const f64avx& x, const f64avx& y)
-{
- return _mm256_blendv_pd(y.v, x.v, m.v);
-}
-KFR_INTRINSIC f32avx select(const mf32avx& m, const f32avx& x, const f32avx& y)
-{
- return _mm256_blendv_ps(y.v, x.v, m.v);
-}
-#endif
-
-#if defined CMT_ARCH_AVX2
-KFR_INTRINSIC u8avx select(const mu8avx& m, const u8avx& x, const u8avx& y)
-{
- return _mm256_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC u16avx select(const mu16avx& m, const u16avx& x, const u16avx& y)
-{
- return _mm256_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC u32avx select(const mu32avx& m, const u32avx& x, const u32avx& y)
-{
- return _mm256_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC u64avx select(const mu64avx& m, const u64avx& x, const u64avx& y)
-{
- return _mm256_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC i8avx select(const mi8avx& m, const i8avx& x, const i8avx& y)
-{
- return _mm256_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC i16avx select(const mi16avx& m, const i16avx& x, const i16avx& y)
-{
- return _mm256_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC i32avx select(const mi32avx& m, const i32avx& x, const i32avx& y)
-{
- return _mm256_blendv_epi8(y.v, x.v, m.v);
-}
-KFR_INTRINSIC i64avx select(const mi64avx& m, const i64avx& x, const i64avx& y)
-{
- return _mm256_blendv_epi8(y.v, x.v, m.v);
-}
-#endif
-
-#if defined CMT_ARCH_AVX512
-KFR_INTRINSIC f64avx512 select(const mf64avx512& m, const f64avx512& x, const f64avx512& y)
-{
- return _mm512_mask_blend_pd(_mm512_movepi64_mask(_mm512_castpd_si512(m.v)), y.v, x.v);
-}
-KFR_INTRINSIC f32avx512 select(const mf32avx512& m, const f32avx512& x, const f32avx512& y)
-{
- return _mm512_mask_blend_ps(_mm512_movepi32_mask(_mm512_castps_si512(m.v)), y.v, x.v);
-}
-KFR_INTRINSIC u8avx512 select(const mu8avx512& m, const u8avx512& x, const u8avx512& y)
-{
- return _mm512_mask_blend_epi8(_mm512_movepi8_mask(m.v), y.v, x.v);
-}
-KFR_INTRINSIC u16avx512 select(const mu16avx512& m, const u16avx512& x, const u16avx512& y)
-{
- return _mm512_mask_blend_epi16(_mm512_movepi16_mask(m.v), y.v, x.v);
-}
-KFR_INTRINSIC u32avx512 select(const mu32avx512& m, const u32avx512& x, const u32avx512& y)
-{
- return _mm512_mask_blend_epi32(_mm512_movepi32_mask(m.v), y.v, x.v);
-}
-KFR_INTRINSIC u64avx512 select(const mu64avx512& m, const u64avx512& x, const u64avx512& y)
-{
- return _mm512_mask_blend_epi64(_mm512_movepi64_mask(m.v), y.v, x.v);
-}
-KFR_INTRINSIC i8avx512 select(const mi8avx512& m, const i8avx512& x, const i8avx512& y)
-{
- return _mm512_mask_blend_epi8(_mm512_movepi8_mask(m.v), y.v, x.v);
-}
-KFR_INTRINSIC i16avx512 select(const mi16avx512& m, const i16avx512& x, const i16avx512& y)
-{
- return _mm512_mask_blend_epi16(_mm512_movepi16_mask(m.v), y.v, x.v);
-}
-KFR_INTRINSIC i32avx512 select(const mi32avx512& m, const i32avx512& x, const i32avx512& y)
-{
- return _mm512_mask_blend_epi32(_mm512_movepi32_mask(m.v), y.v, x.v);
-}
-KFR_INTRINSIC i64avx512 select(const mi64avx512& m, const i64avx512& x, const i64avx512& y)
-{
- return _mm512_mask_blend_epi64(_mm512_movepi64_mask(m.v), y.v, x.v);
-}
-#endif
-
-template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T> && !is_simd_size<T>(N))>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const vec<T, N>& b, const vec<T, N>& c)
-{
- constexpr size_t Nout = next_simd_width<T>(N);
- return select(a.shuffle(csizeseq<Nout>), b.shuffle(csizeseq<Nout>), c.shuffle(csizeseq<Nout>))
- .shuffle(csizeseq<N>);
-}
-template <typename T, size_t N, KFR_ENABLE_IF(N > vector_width<T>), typename = void>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const vec<T, N>& b, const vec<T, N>& c)
-{
- return concat(select(low(a), low(b), low(c)), select(high(a), high(b), high(c)));
- // return concat2(select(a.h.low, b.h.low, c.h.low), select(a.h.high, b.h.high, c.h.high));
-}
-
-template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T> && !is_simd_size<T>(N))>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const T& b, const T& c)
-{
- constexpr size_t Nout = next_simd_width<T>(N);
- return select(a.shuffle(csizeseq<Nout>), vec<T, Nout>(b), vec<T, Nout>(c)).shuffle(csizeseq<N>);
-}
-template <typename T, size_t N, KFR_ENABLE_IF(N > vector_width<T>), typename = void>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const T& b, const T& c)
-{
- return concat2(select(a.h.low, b, c), select(a.h.high, b, c));
-}
-
-template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T> && !is_simd_size<T>(N))>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const vec<T, N>& b, const T& c)
-{
- constexpr size_t Nout = next_simd_width<T>(N);
- return select(a.shuffle(csizeseq<Nout>), b.shuffle(csizeseq<Nout>), vec<T, Nout>(c)).shuffle(csizeseq<N>);
-}
-template <typename T, size_t N, KFR_ENABLE_IF(N > vector_width<T>), typename = void>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const vec<T, N>& b, const T& c)
-{
- return concat2(select(a.h.low, b.h.low, c), select(a.h.high, b.h.high, c));
-}
-
-template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T> && !is_simd_size<T>(N))>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const T& b, const vec<T, N>& c)
-{
- constexpr size_t Nout = next_simd_width<T>(N);
- return select(shufflevector(a, csizeseq<Nout>), vec<T, Nout>(b), c.shuffle(csizeseq<Nout>))
- .shuffle(csizeseq<N>);
-}
-template <typename T, size_t N, KFR_ENABLE_IF(N > vector_width<T>), typename = void>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const T& b, const vec<T, N>& c)
-{
- return concat2(select(a.h.low, b, c.h.low), select(a.h.high, b, c.h.high));
-}
-
-#elif defined CMT_ARCH_NEON && defined KFR_NATIVE_INTRINSICS
-
-KFR_INTRINSIC f32neon select(const mf32neon& m, const f32neon& x, const f32neon& y)
-{
- return vbslq_f32(m.v, x.v, y.v);
-}
-KFR_INTRINSIC i8neon select(const mi8neon& m, const i8neon& x, const i8neon& y)
-{
- return vbslq_s8(m.v, x.v, y.v);
-}
-KFR_INTRINSIC u8neon select(const mu8neon& m, const u8neon& x, const u8neon& y)
-{
- return vbslq_u8(m.v, x.v, y.v);
-}
-KFR_INTRINSIC i16neon select(const mi16neon& m, const i16neon& x, const i16neon& y)
-{
- return vbslq_s16(m.v, x.v, y.v);
-}
-KFR_INTRINSIC u16neon select(const mu16neon& m, const u16neon& x, const u16neon& y)
-{
- return vbslq_u16(m.v, x.v, y.v);
-}
-KFR_INTRINSIC i32neon select(const mi32neon& m, const i32neon& x, const i32neon& y)
-{
- return vbslq_s32(m.v, x.v, y.v);
-}
-KFR_INTRINSIC u32neon select(const mu32neon& m, const u32neon& x, const u32neon& y)
-{
- return vbslq_u32(m.v, x.v, y.v);
-}
-KFR_INTRINSIC i64neon select(const mi64neon& m, const i64neon& x, const i64neon& y)
-{
- return vbslq_s64(m.v, x.v, y.v);
-}
-KFR_INTRINSIC u64neon select(const mu64neon& m, const u64neon& x, const u64neon& y)
-{
- return vbslq_u64(m.v, x.v, y.v);
-}
-
-#ifdef CMT_ARCH_NEON64
-KFR_INTRINSIC f64neon select(const mf64neon& m, const f64neon& x, const f64neon& y)
-{
- return vbslq_f64(m.v, x.v, y.v);
-}
-#else
-KFR_INTRINSIC f64neon select(const mf64neon& m, const f64neon& x, const f64neon& y)
-{
- return y ^ ((x ^ y) & m.asvec());
-}
-#endif
-
-template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T> && !is_simd_size<T>(N))>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const vec<T, N>& b, const vec<T, N>& c)
-{
- constexpr size_t Nout = next_simd_width<T>(N);
- return select(a.shuffle(csizeseq<Nout>), b.shuffle(csizeseq<Nout>), c.shuffle(csizeseq<Nout>))
- .shuffle(csizeseq<N>);
-}
-template <typename T, size_t N, KFR_ENABLE_IF(N > vector_width<T>), typename = void>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const vec<T, N>& b, const vec<T, N>& c)
-{
- return concat2(select(a.h.low, b.h.low, c.h.low), select(a.h.high, b.h.high, c.h.high));
-}
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& m, const T& x, const T& y)
-{
- return select(m, vec<T, N>(x), vec<T, N>(y));
-}
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& m, const vec<T, N>& x, const T& y)
-{
- return select(m, x, vec<T, N>(y));
-}
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& m, const T& x, const vec<T, N>& y)
-{
- return select(m, vec<T, N>(x), y);
-}
-
-#else
-
-// fallback
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& m, const vec<T, N>& x, const vec<T, N>& y)
-{
- return y ^ ((x ^ y) & m.asvec());
-}
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& m, const T& x, const T& y)
-{
- return select(m, vec<T, N>(x), vec<T, N>(y));
-}
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& m, const vec<T, N>& x, const T& y)
-{
- return select(m, x, vec<T, N>(y));
-}
-template <typename T, size_t N>
-KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& m, const T& x, const vec<T, N>& y)
-{
- return select(m, vec<T, N>(x), y);
-}
-#endif
-template <typename T1, typename T2>
-KFR_INTRINSIC common_type<T1, T2> select(bool m, const T1& x, const T2& y)
-{
- return m ? x : y;
-}
-
-} // namespace intrinsics
-KFR_I_FN(select)
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/include/kfr/math/impl/sin_cos.hpp b/include/kfr/math/impl/sin_cos.hpp
@@ -22,13 +22,13 @@
*/
#pragma once
-#include "../../math/abs.hpp"
-#include "../../math/min_max.hpp"
-#include "../../math/round.hpp"
-#include "../../math/select.hpp"
+#include "../../simd/abs.hpp"
#include "../../simd/constants.hpp"
#include "../../simd/impl/function.hpp"
+#include "../../simd/min_max.hpp"
#include "../../simd/operators.hpp"
+#include "../../simd/round.hpp"
+#include "../../simd/select.hpp"
#include "../../simd/shuffle.hpp"
#if CMT_HAS_WARNING("-Wc99-extensions")
@@ -62,7 +62,7 @@ KFR_INTRINSIC vec<T, N> trig_fold(const vec<T, N>& x, vec<itype<T>, N>& quadrant
const vec<T, N> xabs = abs(x);
constexpr T div = constants<T>::fold_constant_div;
vec<T, N> y = floor(xabs / div);
- quadrant = innercast<itype<T>>(innercast<int>(y - floor(y * T(1.0 / 16.0)) * T(16.0)));
+ quadrant = broadcastto<itype<T>>(broadcastto<int>(y - floor(y * T(1.0 / 16.0)) * T(16.0)));
const mask<T, N> msk = (quadrant & 1) != 0;
quadrant = kfr::select(msk, quadrant + 1, quadrant);
diff --git a/include/kfr/math/impl/tan.hpp b/include/kfr/math/impl/tan.hpp
@@ -22,12 +22,12 @@
*/
#pragma once
-#include "../../math/abs.hpp"
-#include "../../math/select.hpp"
-#include "../../math/sin_cos.hpp"
+#include "../../simd/abs.hpp"
#include "../../simd/constants.hpp"
#include "../../simd/impl/function.hpp"
#include "../../simd/operators.hpp"
+#include "../../simd/select.hpp"
+#include "../sin_cos.hpp"
namespace kfr
{
@@ -46,7 +46,7 @@ KFR_INTRINSIC vec<T, N> trig_fold_simple(const vec<T, N>& x_full, mask<T, N>& in
vec<T, N> scaled = y / pi_14;
vec<T, N> k_real = floor(scaled);
- vec<IT, N> k = innercast<IT>(k_real);
+ vec<IT, N> k = broadcastto<IT>(k_real);
vec<T, N> x = y - k_real * pi_14;
@@ -143,6 +143,9 @@ KFR_INTRINSIC flt_type<T> tandeg(const T& x)
return tan(x * c_degtorad<flt_type<T>>);
}
} // namespace intrinsics
+namespace fn
+{
+}
KFR_I_FN(tan)
KFR_I_FN(tandeg)
} // namespace CMT_ARCH_NAME
diff --git a/include/kfr/math/interpolation.hpp b/include/kfr/math/interpolation.hpp
@@ -25,7 +25,7 @@
*/
#pragma once
-#include "select.hpp"
+#include "../simd/select.hpp"
#include "sin_cos.hpp"
namespace kfr
diff --git a/include/kfr/math/log_exp.hpp b/include/kfr/math/log_exp.hpp
@@ -39,13 +39,6 @@ KFR_FUNCTION flt_type<T1> exp(const T1& x)
return intrinsics::exp(x);
}
-/// @brief Returns e raised to the given power x. Accepts and returns expressions.
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::exp, E1> exp(E1&& x)
-{
- return { fn::exp(), std::forward<E1>(x) };
-}
-
/// @brief Returns 2 raised to the given power x.
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION flt_type<T1> exp2(const T1& x)
@@ -53,13 +46,6 @@ KFR_FUNCTION flt_type<T1> exp2(const T1& x)
return intrinsics::exp2(x);
}
-/// @brief Returns 2 raised to the given power x. Accepts and returns expressions.
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::exp2, E1> exp2(E1&& x)
-{
- return { fn::exp2(), std::forward<E1>(x) };
-}
-
/// @brief Returns 10 raised to the given power x.
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION flt_type<T1> exp10(const T1& x)
@@ -67,13 +53,6 @@ KFR_FUNCTION flt_type<T1> exp10(const T1& x)
return intrinsics::exp10(x);
}
-/// @brief Returns 10 raised to the given power x. Accepts and returns expressions.
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::exp10, E1> exp10(E1&& x)
-{
- return { fn::exp10(), std::forward<E1>(x) };
-}
-
/// @brief Returns the natural logarithm of the x.
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION flt_type<T1> log(const T1& x)
@@ -81,13 +60,6 @@ KFR_FUNCTION flt_type<T1> log(const T1& x)
return intrinsics::log(x);
}
-/// @brief Returns the natural logarithm of the x. Accepts and returns expressions.
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::log, E1> log(E1&& x)
-{
- return { fn::log(), std::forward<E1>(x) };
-}
-
/// @brief Returns the binary (base-2) logarithm of the x.
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION flt_type<T1> log2(const T1& x)
@@ -95,13 +67,6 @@ KFR_FUNCTION flt_type<T1> log2(const T1& x)
return intrinsics::log2(x);
}
-/// @brief Returns the binary (base-2) logarithm of the x. Accepts and returns expressions.
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::log2, E1> log2(E1&& x)
-{
- return { fn::log2(), std::forward<E1>(x) };
-}
-
/// @brief Returns the common (base-10) logarithm of the x.
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION flt_type<T1> log10(const T1& x)
@@ -109,13 +74,6 @@ KFR_FUNCTION flt_type<T1> log10(const T1& x)
return intrinsics::log10(x);
}
-/// @brief Returns the common (base-10) logarithm of the x. Accepts and returns expressions.
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::log10, E1> log10(E1&& x)
-{
- return { fn::log10(), std::forward<E1>(x) };
-}
-
/// @brief Returns the rounded binary (base-2) logarithm of the x.
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION flt_type<T1> logb(const T1& x)
@@ -123,110 +81,53 @@ KFR_FUNCTION flt_type<T1> logb(const T1& x)
return intrinsics::logb(x);
}
-/// @brief Returns the rounded binary (base-2) logarithm of the x. Version that accepts and returns
-/// expressions.
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::logb, E1> logb(E1&& x)
-{
- return { fn::logb(), std::forward<E1>(x) };
-}
-
/// @brief Returns the logarithm of the x with base y.
template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>)>
-KFR_FUNCTION flt_type<common_type<T1, T2>> logn(const T1& x, const T2& y)
+KFR_FUNCTION flt_type<std::common_type_t<T1, T2>> logn(const T1& x, const T2& y)
{
return intrinsics::logn(x, y);
}
-/// @brief Returns the logarithm of the x with base y. Accepts and returns expressions.
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_FUNCTION internal::expression_function<fn::logn, E1, E2> logn(E1&& x, E2&& y)
-{
- return { fn::logn(), std::forward<E1>(x), std::forward<E2>(y) };
-}
-
/// @brief Returns log(x) * y.
template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>)>
-KFR_FUNCTION flt_type<common_type<T1, T2>> logm(const T1& x, const T2& y)
+KFR_FUNCTION flt_type<std::common_type_t<T1, T2>> logm(const T1& x, const T2& y)
{
return intrinsics::logm(x, y);
}
-/// @brief Returns log(x) * y. Accepts and returns expressions.
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_FUNCTION internal::expression_function<fn::logm, E1, E2> logm(E1&& x, E2&& y)
-{
- return { fn::logm(), std::forward<E1>(x), std::forward<E2>(y) };
-}
-
/// @brief Returns exp(x * m + a).
template <typename T1, typename T2, typename T3, KFR_ENABLE_IF(is_numeric_args<T1, T2, T3>)>
-KFR_FUNCTION flt_type<common_type<T1, T2, T3>> exp_fmadd(const T1& x, const T2& y, const T3& z)
+KFR_FUNCTION flt_type<std::common_type_t<T1, T2, T3>> exp_fmadd(const T1& x, const T2& y, const T3& z)
{
return intrinsics::exp_fmadd(x, y, z);
}
-/// @brief Returns exp(x * m + a). Accepts and returns expressions.
-template <typename E1, typename E2, typename E3, KFR_ENABLE_IF(is_input_expressions<E1, E2, E3>)>
-KFR_FUNCTION internal::expression_function<fn::exp_fmadd, E1, E2, E3> exp_fmadd(E1&& x, E2&& y, E3&& z)
-{
- return { fn::exp_fmadd(), std::forward<E1>(x), std::forward<E2>(y), std::forward<E3>(z) };
-}
-
/// @brief Returns log(x) * m + a.
template <typename T1, typename T2, typename T3, KFR_ENABLE_IF(is_numeric_args<T1, T2, T3>)>
-KFR_FUNCTION flt_type<common_type<T1, T2, T3>> log_fmadd(const T1& x, const T2& y, const T3& z)
+KFR_FUNCTION flt_type<std::common_type_t<T1, T2, T3>> log_fmadd(const T1& x, const T2& y, const T3& z)
{
return intrinsics::log_fmadd(x, y, z);
}
-/// @brief Returns log(x) * m + a. Accepts and returns expressions.
-template <typename E1, typename E2, typename E3, KFR_ENABLE_IF(is_input_expressions<E1, E2, E3>)>
-KFR_FUNCTION internal::expression_function<fn::log_fmadd, E1, E2, E3> log_fmadd(E1&& x, E2&& y, E3&& z)
-{
- return { fn::log_fmadd(), std::forward<E1>(x), std::forward<E2>(y), std::forward<E3>(z) };
-}
-
/// @brief Returns the x raised to the given power y.
template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>)>
-KFR_FUNCTION flt_type<common_type<T1, T2>> pow(const T1& x, const T2& y)
+KFR_FUNCTION flt_type<std::common_type_t<T1, T2>> pow(const T1& x, const T2& y)
{
return intrinsics::pow(x, y);
}
-/// @brief Returns the x raised to the given power y. Accepts and returns expressions.
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_FUNCTION internal::expression_function<fn::pow, E1, E2> pow(E1&& x, E2&& y)
-{
- return { fn::pow(), std::forward<E1>(x), std::forward<E2>(y) };
-}
-
/// @brief Returns the real nth root of the x.
template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>)>
-KFR_FUNCTION flt_type<common_type<T1, T2>> root(const T1& x, const T2& y)
+KFR_FUNCTION flt_type<std::common_type_t<T1, T2>> root(const T1& x, const T2& y)
{
return intrinsics::root(x, y);
}
-/// @brief Returns the real nth root of the x. Accepts and returns expressions.
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_FUNCTION internal::expression_function<fn::root, E1, E2> root(E1&& x, E2&& y)
-{
- return { fn::root(), std::forward<E1>(x), std::forward<E2>(y) };
-}
-
/// @brief Returns the cube root of the x.
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION flt_type<T1> cbrt(const T1& x)
{
return intrinsics::cbrt(x);
}
-
-/// @brief Returns the cube root of the x. Accepts and returns expressions.
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::cbrt, E1> cbrt(E1&& x)
-{
- return { fn::cbrt(), std::forward<E1>(x) };
-}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/math/min_max.hpp b/include/kfr/math/min_max.hpp
@@ -1,111 +0,0 @@
-/** @addtogroup basic_math
- * @{
- */
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "impl/min_max.hpp"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-
-/**
- * @brief Returns the smaller of two values.
- */
-template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>),
- typename Tout = common_type<T1, T2>>
-KFR_INTRINSIC Tout min(const T1& x, const T2& y)
-{
- return intrinsics::min(x, y);
-}
-
-/**
- * @brief Returns the smaller of two values. Accepts and returns expressions.
- */
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::min, E1, E2> min(E1&& x, E2&& y)
-{
- return { fn::min(), std::forward<E1>(x), std::forward<E2>(y) };
-}
-
-/**
- * @brief Returns the greater of two values.
- */
-template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>),
- typename Tout = common_type<T1, T2>>
-KFR_INTRINSIC Tout max(const T1& x, const T2& y)
-{
- return intrinsics::max(x, y);
-}
-
-/**
- * @brief Returns the greater of two values. Accepts and returns expressions.
- */
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::max, E1, E2> max(E1&& x, E2&& y)
-{
- return { fn::max(), std::forward<E1>(x), std::forward<E2>(y) };
-}
-
-/**
- * @brief Returns the smaller in magnitude of two values.
- */
-template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>),
- typename Tout = common_type<T1, T2>>
-KFR_INTRINSIC Tout absmin(const T1& x, const T2& y)
-{
- return intrinsics::absmin(x, y);
-}
-
-/**
- * @brief Returns the smaller in magnitude of two values. Accepts and returns expressions.
- */
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::absmin, E1, E2> absmin(E1&& x, E2&& y)
-{
- return { fn::absmin(), std::forward<E1>(x), std::forward<E2>(y) };
-}
-
-/**
- * @brief Returns the greater in magnitude of two values.
- */
-template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>),
- typename Tout = common_type<T1, T2>>
-KFR_INTRINSIC Tout absmax(const T1& x, const T2& y)
-{
- return intrinsics::absmax(x, y);
-}
-
-/**
- * @brief Returns the greater in magnitude of two values. Accepts and returns expressions.
- */
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::absmax, E1, E2> absmax(E1&& x, E2&& y)
-{
- return { fn::absmax(), std::forward<E1>(x), std::forward<E2>(y) };
-}
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/include/kfr/math/modzerobessel.hpp b/include/kfr/math/modzerobessel.hpp
@@ -37,11 +37,5 @@ KFR_FUNCTION T1 modzerobessel(const T1& x)
{
return intrinsics::modzerobessel(x);
}
-
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::modzerobessel, E1> modzerobessel(E1&& x)
-{
- return { fn::modzerobessel(), std::forward<E1>(x) };
-}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/math/round.hpp b/include/kfr/math/round.hpp
@@ -1,163 +0,0 @@
-/** @addtogroup round
- * @{
- */
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "impl/round.hpp"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-
-/// @brief Returns the largest integer value not greater than x
-template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
-KFR_INTRINSIC T1 floor(const T1& x)
-{
- return intrinsics::floor(x);
-}
-
-/// @brief Returns the largest integer value not greater than x. Accepts and returns expressions.
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::floor, E1> floor(E1&& x)
-{
- return { fn::floor(), std::forward<E1>(x) };
-}
-
-template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
-KFR_INTRINSIC T1 ceil(const T1& x)
-{
- return intrinsics::ceil(x);
-}
-
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::ceil, E1> ceil(E1&& x)
-{
- return { fn::ceil(), std::forward<E1>(x) };
-}
-
-template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
-KFR_INTRINSIC T1 round(const T1& x)
-{
- return intrinsics::round(x);
-}
-
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::round, E1> round(E1&& x)
-{
- return { fn::round(), std::forward<E1>(x) };
-}
-
-template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
-KFR_INTRINSIC T1 trunc(const T1& x)
-{
- return intrinsics::trunc(x);
-}
-
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::trunc, E1> trunc(E1&& x)
-{
- return { fn::trunc(), std::forward<E1>(x) };
-}
-
-template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
-KFR_INTRINSIC T1 fract(const T1& x)
-{
- return intrinsics::fract(x);
-}
-
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::fract, E1> fract(E1&& x)
-{
- return { fn::fract(), std::forward<E1>(x) };
-}
-
-template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
-KFR_INTRINSIC itype<T1> ifloor(const T1& x)
-{
- return intrinsics::ifloor(x);
-}
-
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::ifloor, E1> ifloor(E1&& x)
-{
- return { fn::ifloor(), std::forward<E1>(x) };
-}
-
-template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
-KFR_INTRINSIC itype<T1> iceil(const T1& x)
-{
- return intrinsics::iceil(x);
-}
-
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::iceil, E1> iceil(E1&& x)
-{
- return { fn::iceil(), std::forward<E1>(x) };
-}
-
-template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
-KFR_INTRINSIC itype<T1> iround(const T1& x)
-{
- return intrinsics::iround(x);
-}
-
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::iround, E1> iround(E1&& x)
-{
- return { fn::iround(), std::forward<E1>(x) };
-}
-
-template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
-KFR_INTRINSIC itype<T1> itrunc(const T1& x)
-{
- return intrinsics::itrunc(x);
-}
-
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::itrunc, E1> itrunc(E1&& x)
-{
- return { fn::itrunc(), std::forward<E1>(x) };
-}
-
-template <typename T, KFR_ENABLE_IF(is_f_class<T>)>
-KFR_INTRINSIC T fmod(const T& x, const T& y)
-{
- return x - trunc(x / y) * y;
-}
-KFR_FN(fmod)
-
-template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)>
-constexpr KFR_INTRINSIC vec<T, N> rem(const vec<T, N>& x, const vec<T, N>& y)
-{
- return x % y;
-}
-template <typename T, size_t N, KFR_ENABLE_IF(is_f_class<T>)>
-KFR_INTRINSIC vec<T, N> rem(const vec<T, N>& x, const vec<T, N>& y)
-{
- return fmod(x, y);
-}
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/include/kfr/math/saturation.hpp b/include/kfr/math/saturation.hpp
@@ -1,65 +0,0 @@
-/** @addtogroup saturation
- * @{
- */
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "impl/saturation.hpp"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-
-/// @brief Adds two arguments using saturation
-template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>),
- typename Tout = common_type<T1, T2>>
-KFR_INTRINSIC Tout satadd(const T1& x, const T2& y)
-{
- return intrinsics::satadd(x, y);
-}
-
-/// @brief Creates an expression that adds two arguments using saturation
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::satadd, E1, E2> satadd(E1&& x, E2&& y)
-{
- return { fn::satadd(), std::forward<E1>(x), std::forward<E2>(y) };
-}
-
-/// @brief Subtracts two arguments using saturation
-template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>),
- typename Tout = common_type<T1, T2>>
-KFR_INTRINSIC Tout satsub(const T1& x, const T2& y)
-{
- return intrinsics::satsub(x, y);
-}
-
-/// @brief Creates an expression that subtracts two arguments using saturation
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::satsub, E1, E2> satsub(E1&& x, E2&& y)
-{
- return { fn::satsub(), std::forward<E1>(x), std::forward<E2>(y) };
-}
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/include/kfr/math/select.hpp b/include/kfr/math/select.hpp
@@ -1,59 +0,0 @@
-/** @addtogroup basic_math
- * @{
- */
-/*
- Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
- This file is part of KFR
-
- KFR is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License, or
- (at your option) any later version.
-
- KFR is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with KFR.
-
- If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
- Buying a commercial license is mandatory as soon as you develop commercial activities without
- disclosing the source code of your own applications.
- See https://www.kfrlib.com for details.
- */
-#pragma once
-
-#include "impl/select.hpp"
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-
-/**
- * @brief Returns x if m is true, otherwise return y. Order of the arguments is same as in ternary operator.
- * @code
- * return m ? x : y
- * @endcode
- */
-template <typename T1, size_t N, typename T2, typename T3, KFR_ENABLE_IF(is_numeric_args<T1, T2, T3>),
- typename Tout = subtype<common_type<T2, T3>>>
-KFR_INTRINSIC vec<Tout, N> select(const mask<T1, N>& m, const T2& x, const T3& y)
-{
- static_assert(sizeof(T1) == sizeof(Tout), "select: incompatible types");
- return intrinsics::select(bitcast<Tout>(m.asvec()).asmask(), innercast<Tout>(x), innercast<Tout>(y));
-}
-
-/**
- * @brief Returns template expression that returns x if m is true, otherwise return y. Order of the arguments
- * is same as in ternary operator.
- */
-template <typename E1, typename E2, typename E3, KFR_ENABLE_IF(is_input_expressions<E1, E2, E3>)>
-KFR_INTRINSIC internal::expression_function<fn::select, E1, E2, E3> select(E1&& m, E2&& x, E3&& y)
-{
- return { fn::select(), std::forward<E1>(m), std::forward<E2>(x), std::forward<E3>(y) };
-}
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/include/kfr/math/sin_cos.hpp b/include/kfr/math/sin_cos.hpp
@@ -42,15 +42,6 @@ KFR_FUNCTION flt_type<T1> sin(const T1& x)
}
/**
- * @brief Returns the trigonometric sine of x. Accepts and returns expressions.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::sin, E1> sin(E1&& x)
-{
- return { fn::sin(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns the trigonometric cosine of x.
*/
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
@@ -60,15 +51,6 @@ KFR_FUNCTION flt_type<T1> cos(const T1& x)
}
/**
- * @brief Returns the trigonometric cosine of x. Accepts and returns expressions.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::cos, E1> cos(E1&& x)
-{
- return { fn::cos(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns an approximation of the trigonometric sine of x.
*/
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
@@ -78,15 +60,6 @@ KFR_FUNCTION flt_type<T1> fastsin(const T1& x)
}
/**
- * @brief Returns an approximation of the trigonometric sine of x. Accepts and returns expressions.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::fastsin, E1> fastsin(E1&& x)
-{
- return { fn::fastsin(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns an approximation of the trigonometric cosine of x.
*/
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
@@ -96,15 +69,6 @@ KFR_FUNCTION flt_type<T1> fastcos(const T1& x)
}
/**
- * @brief Returns an approximation of the trigonometric cosine of x. Accepts and returns expressions.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::fastcos, E1> fastcos(E1&& x)
-{
- return { fn::fastcos(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns the trigonometric sine of the even elements of the x and cosine of the odd elements. x must
* be a vector.
*/
@@ -115,16 +79,6 @@ KFR_FUNCTION flt_type<T1> sincos(const T1& x)
}
/**
- * @brief Returns the trigonometric sine of the even elements of the x and
- * cosine of the odd elements. x must be a vector. Accepts and returns expressions.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::sincos, E1> sincos(E1&& x)
-{
- return { fn::sincos(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns the trigonometric cosine of the even elements of the x and sine of the odd elements. x must
* be a vector.
*/
@@ -135,16 +89,6 @@ KFR_FUNCTION flt_type<T1> cossin(const T1& x)
}
/**
- * @brief Returns the trigonometric cosine of the even elements of the x and
- * sine of the odd elements. x must be a vector. Accepts and returns expressions.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::cossin, E1> cossin(E1&& x)
-{
- return { fn::cossin(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns the trigonometric sine of the x (expressed in degrees).
*/
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
@@ -154,15 +98,6 @@ KFR_FUNCTION flt_type<T1> sindeg(const T1& x)
}
/**
- * @brief Returns the trigonometric sine of the x (expressed in degrees). Accepts and returns expressions.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::sindeg, E1> sindeg(E1&& x)
-{
- return { fn::sindeg(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns the trigonometric cosine of the x (expressed in degrees).
*/
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
@@ -172,15 +107,6 @@ KFR_FUNCTION flt_type<T1> cosdeg(const T1& x)
}
/**
- * @brief Returns the trigonometric cosine of the x (expressed in degrees). Accepts and returns expressions.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::cosdeg, E1> cosdeg(E1&& x)
-{
- return { fn::cosdeg(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns an approximation of the trigonometric sine of the x (expressed in degrees).
*/
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
@@ -190,16 +116,6 @@ KFR_FUNCTION flt_type<T1> fastsindeg(const T1& x)
}
/**
- * @brief Returns an approximation of the trigonometric sine of the x
- * (expressed in degrees). Accepts and returns expressions.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::fastsindeg, E1> fastsindeg(E1&& x)
-{
- return { fn::fastsindeg(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns an approximation of the trigonometric cosine of the x (expressed in degrees).
*/
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
@@ -209,16 +125,6 @@ KFR_FUNCTION flt_type<T1> fastcosdeg(const T1& x)
}
/**
- * @brief Returns an approximation of the trigonometric cosine of the x
- * (expressed in degrees). Accepts and returns expressions.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::fastcosdeg, E1> fastcosdeg(E1&& x)
-{
- return { fn::fastcosdeg(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns the trigonometric sine of the even elements of the x and cosine of the odd elements. x must
* be a vector and expressed in degrees.
*/
@@ -229,16 +135,6 @@ KFR_FUNCTION flt_type<T1> sincosdeg(const T1& x)
}
/**
- * @brief Returns the trigonometric sine of the even elements of the x and
- * cosine of the odd elements. x must be expressed in degrees. Accepts and returns expressions.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::sincosdeg, E1> sincosdeg(E1&& x)
-{
- return { fn::sincosdeg(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns the trigonometric cosine of the even elements of the x and sine of the odd elements. x must
* be a vector and expressed in degrees.
*/
@@ -249,16 +145,6 @@ KFR_FUNCTION flt_type<T1> cossindeg(const T1& x)
}
/**
- * @brief Returns the trigonometric cosine of the even elements of the x and
- * sine of the odd elements. x must be expressed in degrees. Accepts and returns expressions.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::cossindeg, E1> cossindeg(E1&& x)
-{
- return { fn::cossindeg(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns the sinc function of x.
* \f[
* sinc(x) = \frac{sin(x)}{x}
@@ -271,15 +157,6 @@ KFR_FUNCTION flt_type<T1> sinc(const T1& x)
}
/**
- * @brief Returns the sinc function of x. Accepts and returns expressions.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::sinc, E1> sinc(E1&& x)
-{
- return { fn::sinc(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns the trigonometric sine of the angle 2x using sin(x) and cos(x).
*/
template <typename T>
diff --git a/include/kfr/math/sqrt.hpp b/include/kfr/math/sqrt.hpp
@@ -40,14 +40,5 @@ KFR_INTRINSIC flt_type<T1> sqrt(const T1& x)
{
return intrinsics::sqrt(x);
}
-
-/**
- * @brief Returns template expression that returns the positive square root of the x. \f$\sqrt{x}\f$
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::sqrt, E1> sqrt(E1&& x)
-{
- return { fn::sqrt(), std::forward<E1>(x) };
-}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/math/tan.hpp b/include/kfr/math/tan.hpp
@@ -38,22 +38,10 @@ KFR_FUNCTION flt_type<T1> tan(const T1& x)
return intrinsics::tan(x);
}
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::tan, E1> tan(E1&& x)
-{
- return { fn::tan(), std::forward<E1>(x) };
-}
-
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
KFR_FUNCTION flt_type<T1> tandeg(const T1& x)
{
return intrinsics::tandeg(x);
}
-
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::tandeg, E1> tandeg(E1&& x)
-{
- return { fn::tandeg(), std::forward<E1>(x) };
-}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/simd.hpp b/include/kfr/simd.hpp
@@ -22,15 +22,24 @@
*/
#pragma once
+#include "simd/abs.hpp"
+#include "simd/clamp.hpp"
#include "simd/comparison.hpp"
#include "simd/complex.hpp"
+#include "simd/complex_type.hpp"
#include "simd/constants.hpp"
#include "simd/digitreverse.hpp"
#include "simd/horizontal.hpp"
+#include "simd/logical.hpp"
#include "simd/mask.hpp"
+#include "simd/min_max.hpp"
#include "simd/operators.hpp"
#include "simd/platform.hpp"
#include "simd/read_write.hpp"
+#include "simd/round.hpp"
+#include "simd/saturation.hpp"
+#include "simd/select.hpp"
#include "simd/shuffle.hpp"
+#include "simd/sort.hpp"
#include "simd/types.hpp"
#include "simd/vec.hpp"
diff --git a/include/kfr/simd/abs.hpp b/include/kfr/simd/abs.hpp
@@ -0,0 +1,45 @@
+/** @addtogroup basic_math
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "impl/abs.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+/**
+ * @brief Returns the absolute value of x.
+ */
+template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
+KFR_INTRINSIC T1 abs(const T1& x)
+{
+ return intrinsics::abs(x);
+}
+} // namespace CMT_ARCH_NAME
+
+} // namespace kfr
diff --git a/include/kfr/simd/clamp.hpp b/include/kfr/simd/clamp.hpp
@@ -0,0 +1,51 @@
+/** @addtogroup basic_math
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "impl/clamp.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+/// @brief Returns the first argument clamped to a range [lo, hi]
+template <typename T1, typename T2, typename T3, KFR_ENABLE_IF(is_numeric_args<T1, T2, T3>),
+ typename Tout = std::common_type_t<T1, T2, T3>>
+KFR_INTRINSIC Tout clamp(const T1& x, const T2& lo, const T3& hi)
+{
+ return intrinsics::clamp(static_cast<Tout>(x), static_cast<Tout>(lo), static_cast<Tout>(hi));
+}
+
+/// @brief Returns the first argument clamped to a range [0, hi]
+template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>),
+ typename Tout = std::common_type_t<T1, T2>>
+KFR_INTRINSIC Tout clamp(const T1& x, const T2& hi)
+{
+ return intrinsics::clamp(static_cast<Tout>(x), static_cast<Tout>(hi));
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/include/kfr/simd/comparison.hpp b/include/kfr/simd/comparison.hpp
@@ -35,32 +35,32 @@ inline namespace CMT_ARCH_NAME
{
template <typename T1, typename T2>
-inline maskfor<common_type<T1, T2>> equal(const T1& x, const T2& y)
+inline maskfor<std::common_type_t<T1, T2>> equal(const T1& x, const T2& y)
{
return x == y;
}
template <typename T1, typename T2>
-inline maskfor<common_type<T1, T2>> notequal(const T1& x, const T2& y)
+inline maskfor<std::common_type_t<T1, T2>> notequal(const T1& x, const T2& y)
{
return x != y;
}
template <typename T1, typename T2>
-inline maskfor<common_type<T1, T2>> less(const T1& x, const T2& y)
+inline maskfor<std::common_type_t<T1, T2>> less(const T1& x, const T2& y)
{
return x < y;
}
template <typename T1, typename T2>
-inline maskfor<common_type<T1, T2>> greater(const T1& x, const T2& y)
+inline maskfor<std::common_type_t<T1, T2>> greater(const T1& x, const T2& y)
{
return x > y;
}
template <typename T1, typename T2>
-inline maskfor<common_type<T1, T2>> lessorequal(const T1& x, const T2& y)
+inline maskfor<std::common_type_t<T1, T2>> lessorequal(const T1& x, const T2& y)
{
return x <= y;
}
template <typename T1, typename T2>
-inline maskfor<common_type<T1, T2>> greaterorequal(const T1& x, const T2& y)
+inline maskfor<std::common_type_t<T1, T2>> greaterorequal(const T1& x, const T2& y)
{
return x >= y;
}
@@ -71,42 +71,6 @@ KFR_FN(greater)
KFR_FN(lessorequal)
KFR_FN(greaterorequal)
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::equal, E1, E2> operator==(E1&& e1, E2&& e2)
-{
- return { fn::equal(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::notequal, E1, E2> operator!=(E1&& e1, E2&& e2)
-{
- return { fn::notequal(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::less, E1, E2> operator<(E1&& e1, E2&& e2)
-{
- return { fn::less(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::greater, E1, E2> operator>(E1&& e1, E2&& e2)
-{
- return { fn::greater(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::lessorequal, E1, E2> operator<=(E1&& e1, E2&& e2)
-{
- return { fn::lessorequal(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::greaterorequal, E1, E2> operator>=(E1&& e1, E2&& e2)
-{
- return { fn::greaterorequal(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
template <typename T, size_t N>
KFR_INTRINSIC mask<T, N> isnan(const vec<T, N>& x)
{
@@ -144,7 +108,7 @@ KFR_INTRINSIC mask<T, N> iszero(const vec<T, N>& x)
}
template <typename T1, typename T2, typename T3>
-KFR_INTRINSIC maskfor<common_type<T1, T2, T3>> inrange(const T1& x, const T2& min, const T3& max)
+KFR_INTRINSIC maskfor<std::common_type_t<T1, T2, T3>> inrange(const T1& x, const T2& min, const T3& max)
{
return x >= min && x <= max;
}
diff --git a/include/kfr/simd/complex.hpp b/include/kfr/simd/complex.hpp
@@ -28,62 +28,11 @@
#include "impl/function.hpp"
#include "operators.hpp"
-#ifdef KFR_STD_COMPLEX
-#include <complex>
-#endif
-
CMT_PRAGMA_MSVC(warning(push))
CMT_PRAGMA_MSVC(warning(disable : 4814))
namespace kfr
{
-#ifdef KFR_STD_COMPLEX
-
-template <typename T>
-using complex = std::complex<T>;
-
-#else
-#ifndef KFR_CUSTOM_COMPLEX
-
-/**
- * @brief Represents the complex numbers. If KFR_STD_COMPLEX is defined, then kfr::complex is an alias for
- * std::complex.
- */
-template <typename T>
-struct complex
-{
- static_assert(is_simd_type<T>, "Incorrect type for complex");
- constexpr static bool is_pod = true;
- constexpr complex() CMT_NOEXCEPT = default;
- KFR_MEM_INTRINSIC constexpr complex(T re) CMT_NOEXCEPT : re(re), im(0) {}
- KFR_MEM_INTRINSIC constexpr complex(T re, T im) CMT_NOEXCEPT : re(re), im(im) {}
- constexpr complex(const complex&) CMT_NOEXCEPT = default;
- constexpr complex(complex&&) CMT_NOEXCEPT = default;
- template <typename U>
- KFR_MEM_INTRINSIC constexpr complex(const complex<U>& other) CMT_NOEXCEPT : re(static_cast<T>(other.real())),
- im(static_cast<T>(other.imag()))
- {
- }
- template <typename U>
- KFR_MEM_INTRINSIC constexpr complex(complex<U>&& other) CMT_NOEXCEPT : re(std::move(other.real())),
- im(std::move(other.imag()))
- {
- }
-#ifdef CMT_COMPILER_GNU
- constexpr complex& operator=(const complex&) CMT_NOEXCEPT = default;
- constexpr complex& operator=(complex&&) CMT_NOEXCEPT = default;
-#else
- complex& operator=(const complex&) = default;
- complex& operator=(complex&&) = default;
-#endif
- KFR_MEM_INTRINSIC constexpr const T& real() const CMT_NOEXCEPT { return re; }
- KFR_MEM_INTRINSIC constexpr const T& imag() const CMT_NOEXCEPT { return im; }
- KFR_MEM_INTRINSIC constexpr void real(T value) CMT_NOEXCEPT { re = value; }
- KFR_MEM_INTRINSIC constexpr void imag(T value) CMT_NOEXCEPT { im = value; }
-private:
- T re;
- T im;
-};
inline namespace CMT_ARCH_NAME
{
@@ -108,44 +57,92 @@ KFR_INTRINSIC complex<T> operator/(const complex<T>& x, const complex<T>& y)
{
return (make_vector(x) / make_vector(y))[0];
}
+template <typename T>
+KFR_INTRINSIC complex<T>& operator+=(complex<T>& x, const complex<T>& y)
+{
+ x = x + y;
+ return x;
+}
+template <typename T>
+KFR_INTRINSIC complex<T>& operator-=(complex<T>& x, const complex<T>& y)
+{
+ x = x - y;
+ return x;
+}
+template <typename T>
+KFR_INTRINSIC complex<T>& operator*=(complex<T>& x, const complex<T>& y)
+{
+ x = x * y;
+ return x;
+}
+template <typename T>
+KFR_INTRINSIC complex<T>& operator/=(complex<T>& x, const complex<T>& y)
+{
+ x = x / y;
+ return x;
+}
-template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = common_type<complex<T>, U>>
+template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = std::common_type_t<complex<T>, U>>
KFR_INTRINSIC C operator+(const complex<T>& x, const U& y)
{
return static_cast<C>(x) + static_cast<C>(y);
}
-template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = common_type<complex<T>, U>>
+template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = std::common_type_t<complex<T>, U>>
KFR_INTRINSIC C operator-(const complex<T>& x, const U& y)
{
return static_cast<C>(x) - static_cast<C>(y);
}
-template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = common_type<complex<T>, U>>
+template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = std::common_type_t<complex<T>, U>>
KFR_INTRINSIC C operator*(const complex<T>& x, const U& y)
{
return static_cast<C>(x) * static_cast<C>(y);
}
-template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = common_type<complex<T>, U>>
+template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = std::common_type_t<complex<T>, U>>
KFR_INTRINSIC C operator/(const complex<T>& x, const U& y)
{
return static_cast<C>(x) / static_cast<C>(y);
}
+template <typename T, typename U, KFR_ENABLE_IF(std::is_convertible_v<U, T>)>
+KFR_INTRINSIC complex<T>& operator+=(complex<T>& x, const U& y)
+{
+ x = x + y;
+ return x;
+}
+template <typename T, typename U, KFR_ENABLE_IF(std::is_convertible_v<U, T>)>
+KFR_INTRINSIC complex<T>& operator-=(complex<T>& x, const U& y)
+{
+ x = x - y;
+ return x;
+}
+template <typename T, typename U, KFR_ENABLE_IF(std::is_convertible_v<U, T>)>
+KFR_INTRINSIC complex<T>& operator*=(complex<T>& x, const U& y)
+{
+ x = x * y;
+ return x;
+}
+template <typename T, typename U, KFR_ENABLE_IF(std::is_convertible_v<U, T>)>
+KFR_INTRINSIC complex<T>& operator/=(complex<T>& x, const U& y)
+{
+ x = x / y;
+ return x;
+}
-template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = common_type<complex<T>, U>>
+template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = std::common_type_t<complex<T>, U>>
KFR_INTRINSIC C operator+(const U& x, const complex<T>& y)
{
return static_cast<C>(x) + static_cast<C>(y);
}
-template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = common_type<complex<T>, U>>
+template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = std::common_type_t<complex<T>, U>>
KFR_INTRINSIC C operator-(const U& x, const complex<T>& y)
{
return static_cast<C>(x) - static_cast<C>(y);
}
-template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = common_type<complex<T>, U>>
+template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = std::common_type_t<complex<T>, U>>
KFR_INTRINSIC C operator*(const U& x, const complex<T>& y)
{
return static_cast<C>(x) * static_cast<C>(y);
}
-template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = common_type<complex<T>, U>>
+template <typename T, typename U, KFR_ENABLE_IF(is_number<U>), typename C = std::common_type_t<complex<T>, U>>
KFR_INTRINSIC C operator/(const U& x, const complex<T>& y)
{
return static_cast<C>(x) / static_cast<C>(y);
@@ -162,8 +159,6 @@ KFR_INTRINSIC complex<T> operator+(const complex<T>& x)
}
} // namespace CMT_ARCH_NAME
-#endif
-#endif
} // namespace kfr
namespace cometa
{
@@ -217,7 +212,7 @@ constexpr inline vec<T, 2> vcomplex(const complex<T>& v)
template <typename T>
constexpr inline simd<T, 2> vvcomplex(const complex<T>& v)
{
- return intrinsics::simd_make(ctype<T>, v.real(), v.imag());
+ return intrinsics::simd_make(cometa::ctype<T>, v.real(), v.imag());
}
} // namespace intrinsics
@@ -328,11 +323,11 @@ struct is_complex_impl<complex<T>> : std::true_type
};
// vector<complex> to vector<complex>
-template <typename To, typename From, size_t N>
-struct conversion<vec<complex<To>, N>, vec<complex<From>, N>>
+template <typename To, typename From, size_t N, conv_t conv>
+struct conversion<1, 1, vec<complex<To>, N>, vec<complex<From>, N>, conv>
{
- static_assert(!is_compound<To>, "");
- static_assert(!is_compound<From>, "");
+ static_assert(!is_compound_type<To>, "");
+ static_assert(!is_compound_type<From>, "");
static vec<complex<To>, N> cast(const vec<complex<From>, N>& value)
{
return vec<To, N * 2>(value.flatten()).v;
@@ -340,11 +335,11 @@ struct conversion<vec<complex<To>, N>, vec<complex<From>, N>>
};
// vector to vector<complex>
-template <typename To, typename From, size_t N>
-struct conversion<vec<complex<To>, N>, vec<From, N>>
+template <typename To, typename From, size_t N, conv_t conv>
+struct conversion<1, 1, vec<complex<To>, N>, vec<From, N>, conv>
{
- static_assert(!is_compound<To>, "");
- static_assert(!is_compound<From>, "");
+ static_assert(!is_compound_type<To>, "");
+ static_assert(!is_compound_type<From>, "");
static vec<complex<To>, N> cast(const vec<From, N>& value)
{
const vec<To, N> casted = static_cast<vec<To, N>>(value);
@@ -382,13 +377,6 @@ using realftype = ftype<decltype(kfr::real(std::declval<T>()))>;
KFR_FN(real)
-/// @brief Returns the real part of the complex value
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::real, E1> real(E1&& x)
-{
- return { fn::real{}, std::forward<E1>(x) };
-}
-
/// @brief Returns the imaginary part of the complex value
template <typename T>
constexpr KFR_INTRINSIC T imag(const complex<T>& value)
@@ -404,37 +392,23 @@ constexpr KFR_INTRINSIC vec<T, N> imag(const vec<complex<T>, N>& value)
}
KFR_FN(imag)
-/// @brief Returns the imaginary part of the complex value
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::imag, E1> imag(E1&& x)
-{
- return { fn::imag{}, std::forward<E1>(x) };
-}
-
/// @brief Constructs complex value from real and imaginary parts
-template <typename T1, typename T2 = T1, size_t N, typename T = common_type<T1, T2>>
+template <typename T1, typename T2 = T1, size_t N, typename T = std::common_type_t<T1, T2>>
constexpr KFR_INTRINSIC vec<complex<T>, N> make_complex(const vec<T1, N>& real,
const vec<T2, N>& imag = T2(0))
{
- return ccomp(interleave(innercast<T>(real), innercast<T>(imag)));
+ return ccomp(interleave(promoteto<T>(real), promoteto<T>(imag)));
}
/// @brief Constructs complex value from real and imaginary parts
-template <typename T1, typename T2 = T1, typename T = common_type<T1, T2>,
+template <typename T1, typename T2 = T1, typename T = std::common_type_t<T1, T2>,
KFR_ENABLE_IF(is_numeric_args<T1, T2>)>
constexpr KFR_INTRINSIC complex<T> make_complex(T1 real, T2 imag = T2(0))
{
- return complex<T>(innercast<T>(real), innercast<T>(imag));
+ return complex<T>(promoteto<T>(real), promoteto<T>(imag));
}
KFR_FN(make_complex)
-/// @brief Constructs complex value from real and imaginary parts
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::make_complex, E1, E2> make_complex(E1&& re, E2&& im)
-{
- return { fn::make_complex{}, std::forward<E1>(re), std::forward<E2>(im) };
-}
-
namespace intrinsics
{
template <typename T, size_t N>
@@ -454,13 +428,6 @@ KFR_INTRINSIC T1 cconj(const T1& x)
return intrinsics::cconj(x);
}
-/// @brief Returns template expression that returns the complex conjugate of the complex number x
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_FUNCTION internal::expression_function<fn::cconj, E1> cconj(E1&& x)
-{
- return { fn::cconj(), std::forward<E1>(x) };
-}
-
template <size_t N>
struct vec_of_complex
{
@@ -468,44 +435,34 @@ struct vec_of_complex
using type = vec<complex<T>, N>;
};
} // namespace CMT_ARCH_NAME
+} // namespace kfr
-template <typename T1, typename T2>
-struct common_type_impl<kfr::complex<T1>, kfr::complex<T2>> : common_type_from_subtypes<T1, T2, kfr::complex>
+namespace std
{
-};
+
template <typename T1, typename T2>
-struct common_type_impl<kfr::complex<T1>, T2> : common_type_from_subtypes<T1, T2, kfr::complex>
+struct common_type<kfr::complex<T1>, kfr::complex<T2>>
+ : kfr::construct_common_type<std::common_type<T1, T2>, kfr::complex>
{
};
template <typename T1, typename T2>
-struct common_type_impl<T1, kfr::complex<T2>> : common_type_from_subtypes<T1, T2, kfr::complex>
+struct common_type<kfr::complex<T1>, T2> : kfr::construct_common_type<std::common_type<T1, T2>, kfr::complex>
{
};
-template <typename T1, typename T2, size_t N>
-struct common_type_impl<kfr::complex<T1>, kfr::vec<kfr::complex<T2>, N>>
- : common_type_from_subtypes<T1, T2, kfr::vec_of_complex<N>::template type>
-{
-};
-template <typename T1, typename T2, size_t N>
-struct common_type_impl<kfr::vec<kfr::complex<T1>, N>, kfr::vec<kfr::complex<T2>, N>>
- : common_type_from_subtypes<T1, T2, kfr::vec_of_complex<N>::template type>
-{
-};
-template <typename T1, typename T2, size_t N>
-struct common_type_impl<kfr::vec<kfr::complex<T1>, N>, kfr::complex<T2>>
- : common_type_from_subtypes<T1, T2, kfr::vec_of_complex<N>::template type>
+template <typename T1, typename T2>
+struct common_type<T1, kfr::complex<T2>> : kfr::construct_common_type<std::common_type<T1, T2>, kfr::complex>
{
};
template <typename T1, typename T2, size_t N>
-struct common_type_impl<kfr::complex<T1>, kfr::vec<T2, N>>
- : common_type_from_subtypes<T1, T2, kfr::vec_of_complex<N>::template type>
+struct common_type<kfr::complex<T1>, kfr::vec<T2, N>>
+ : kfr::construct_common_type<std::common_type<T1, T2>, kfr::vec_of_complex<N>::template type>
{
};
template <typename T1, typename T2, size_t N>
-struct common_type_impl<kfr::vec<T1, N>, kfr::complex<T2>>
- : common_type_from_subtypes<T1, T2, kfr::vec_of_complex<N>::template type>
+struct common_type<kfr::vec<T1, N>, kfr::complex<T2>>
+ : kfr::construct_common_type<std::common_type<T1, T2>, kfr::vec_of_complex<N>::template type>
{
};
-} // namespace kfr
+} // namespace std
CMT_PRAGMA_MSVC(warning(pop))
diff --git a/include/kfr/simd/complex_type.hpp b/include/kfr/simd/complex_type.hpp
@@ -0,0 +1,122 @@
+/** @addtogroup complex
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../cometa/string.hpp"
+#include "constants.hpp"
+
+#ifdef KFR_STD_COMPLEX
+#include <complex>
+#endif
+
+namespace kfr
+{
+#ifdef KFR_STD_COMPLEX
+
+template <typename T>
+using complex = std::complex<T>;
+
+#else
+#ifndef KFR_CUSTOM_COMPLEX
+
+/**
+ * @brief Represents the complex numbers. If KFR_STD_COMPLEX is defined, then kfr::complex is an alias for
+ * std::complex.
+ */
+template <typename T>
+struct complex
+{
+ static_assert(is_simd_type<T>, "Incorrect type for complex");
+ constexpr static bool is_pod_like = true;
+ constexpr complex() CMT_NOEXCEPT = default;
+ KFR_MEM_INTRINSIC constexpr complex(T re) CMT_NOEXCEPT : re(re), im(0) {}
+ KFR_MEM_INTRINSIC constexpr complex(T re, T im) CMT_NOEXCEPT : re(re), im(im) {}
+ constexpr complex(const complex&) CMT_NOEXCEPT = default;
+ constexpr complex(complex&&) CMT_NOEXCEPT = default;
+ template <typename U>
+ KFR_MEM_INTRINSIC constexpr complex(const complex<U>& other) CMT_NOEXCEPT
+ : re(static_cast<T>(other.real())),
+ im(static_cast<T>(other.imag()))
+ {
+ }
+ template <typename U>
+ KFR_MEM_INTRINSIC constexpr complex(complex<U>&& other) CMT_NOEXCEPT : re(std::move(other.real())),
+ im(std::move(other.imag()))
+ {
+ }
+#ifdef CMT_COMPILER_GNU
+ constexpr complex& operator=(const complex&) CMT_NOEXCEPT = default;
+ constexpr complex& operator=(complex&&) CMT_NOEXCEPT = default;
+#else
+ complex& operator=(const complex&) = default;
+ complex& operator=(complex&&) = default;
+#endif
+ KFR_MEM_INTRINSIC constexpr const T& real() const CMT_NOEXCEPT { return re; }
+ KFR_MEM_INTRINSIC constexpr const T& imag() const CMT_NOEXCEPT { return im; }
+ KFR_MEM_INTRINSIC constexpr void real(T value) CMT_NOEXCEPT { re = value; }
+ KFR_MEM_INTRINSIC constexpr void imag(T value) CMT_NOEXCEPT { im = value; }
+
+ KFR_MEM_INTRINSIC constexpr bool operator==(const complex& other) const CMT_NOEXCEPT
+ {
+ return re == other.re && im == other.im;
+ }
+ KFR_MEM_INTRINSIC constexpr bool operator!=(const complex& other) const CMT_NOEXCEPT
+ {
+ return !operator==(other);
+ }
+
+private:
+ T re;
+ T im;
+};
+#endif
+#endif
+
+} // namespace kfr
+
+namespace cometa
+{
+template <typename T>
+struct representation<kfr::complex<T>>
+{
+ using type = std::string;
+ static std::string get(const kfr::complex<T>& value)
+ {
+ return as_string(value.real()) + " + " + as_string(value.imag()) + "j";
+ }
+};
+
+template <char t, int width, int prec, typename T>
+struct representation<fmt_t<kfr::complex<T>, t, width, prec>>
+{
+ using type = std::string;
+ static std::string get(const fmt_t<kfr::complex<T>, t, width, prec>& value)
+ {
+ return as_string(fmt<t, width, prec>(value.value.real())) + " + " +
+ as_string(fmt<t, width, prec>(value.value.imag())) + "j";
+ }
+};
+} // namespace cometa
diff --git a/include/kfr/simd/impl/abs.hpp b/include/kfr/simd/impl/abs.hpp
@@ -0,0 +1,138 @@
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../operators.hpp"
+#include "../select.hpp"
+#include "function.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+namespace intrinsics
+{
+
+#if defined CMT_ARCH_SSSE3 && defined KFR_NATIVE_INTRINSICS
+
+// floating point
+template <typename T, size_t N, KFR_ENABLE_IF(is_f_class<T>)>
+KFR_INTRINSIC vec<T, N> abs(const vec<T, N>& x) CMT_NOEXCEPT
+{
+ return x & special_constants<T>::invhighbitmask();
+}
+
+KFR_INTRINSIC i64sse abs(const i64sse& x) CMT_NOEXCEPT
+{
+ const __m128i sh = _mm_srai_epi32(x.v, 31);
+ const __m128i msk = _mm_shuffle_epi32(sh, _MM_SHUFFLE(3, 3, 1, 1));
+ return _mm_sub_epi64(_mm_xor_si128(x.v, msk), msk);
+}
+KFR_INTRINSIC i32sse abs(const i32sse& x) CMT_NOEXCEPT { return _mm_abs_epi32(x.v); }
+KFR_INTRINSIC i16sse abs(const i16sse& x) CMT_NOEXCEPT { return _mm_abs_epi16(x.v); }
+KFR_INTRINSIC i8sse abs(const i8sse& x) CMT_NOEXCEPT { return _mm_abs_epi8(x.v); }
+KFR_INTRINSIC u64sse abs(const u64sse& x) CMT_NOEXCEPT { return x; }
+KFR_INTRINSIC u32sse abs(const u32sse& x) CMT_NOEXCEPT { return x; }
+KFR_INTRINSIC u16sse abs(const u16sse& x) CMT_NOEXCEPT { return x; }
+KFR_INTRINSIC u8sse abs(const u8sse& x) CMT_NOEXCEPT { return x; }
+
+#if defined CMT_ARCH_AVX2
+KFR_INTRINSIC i64avx abs(const i64avx& x) CMT_NOEXCEPT
+{
+ const __m256i sh = _mm256_srai_epi32(x.v, 31);
+ const __m256i msk = _mm256_shuffle_epi32(sh, _MM_SHUFFLE(3, 3, 1, 1));
+ return _mm256_sub_epi64(_mm256_xor_si256(x.v, msk), msk);
+}
+KFR_INTRINSIC i32avx abs(const i32avx& x) CMT_NOEXCEPT { return _mm256_abs_epi32(x.v); }
+KFR_INTRINSIC i16avx abs(const i16avx& x) CMT_NOEXCEPT { return _mm256_abs_epi16(x.v); }
+KFR_INTRINSIC i8avx abs(const i8avx& x) CMT_NOEXCEPT { return _mm256_abs_epi8(x.v); }
+KFR_INTRINSIC u64avx abs(const u64avx& x) CMT_NOEXCEPT { return x; }
+KFR_INTRINSIC u32avx abs(const u32avx& x) CMT_NOEXCEPT { return x; }
+KFR_INTRINSIC u16avx abs(const u16avx& x) CMT_NOEXCEPT { return x; }
+KFR_INTRINSIC u8avx abs(const u8avx& x) CMT_NOEXCEPT { return x; }
+#endif
+
+#if defined CMT_ARCH_AVX512
+KFR_INTRINSIC i64avx512 abs(const i64avx512& x) CMT_NOEXCEPT { return _mm512_abs_epi64(x.v); }
+KFR_INTRINSIC i32avx512 abs(const i32avx512& x) CMT_NOEXCEPT { return _mm512_abs_epi32(x.v); }
+KFR_INTRINSIC i16avx512 abs(const i16avx512& x) CMT_NOEXCEPT { return _mm512_abs_epi16(x.v); }
+KFR_INTRINSIC i8avx512 abs(const i8avx512& x) CMT_NOEXCEPT { return _mm512_abs_epi8(x.v); }
+KFR_INTRINSIC u64avx512 abs(const u64avx512& x) CMT_NOEXCEPT { return x; }
+KFR_INTRINSIC u32avx512 abs(const u32avx512& x) CMT_NOEXCEPT { return x; }
+KFR_INTRINSIC u16avx512 abs(const u16avx512& x) CMT_NOEXCEPT { return x; }
+KFR_INTRINSIC u8avx512 abs(const u8avx512& x) CMT_NOEXCEPT { return x; }
+#endif
+
+KFR_HANDLE_ALL_SIZES_1_IF(abs, !is_f_class<T>)
+
+#elif defined CMT_ARCH_NEON && defined KFR_NATIVE_INTRINSICS
+
+KFR_INTRINSIC i8neon abs(const i8neon& x) CMT_NOEXCEPT { return vabsq_s8(x.v); }
+KFR_INTRINSIC i16neon abs(const i16neon& x) CMT_NOEXCEPT { return vabsq_s16(x.v); }
+KFR_INTRINSIC i32neon abs(const i32neon& x) CMT_NOEXCEPT { return vabsq_s32(x.v); }
+#if defined CMT_ARCH_NEON64
+KFR_INTRINSIC i64neon abs(const i64neon& x) CMT_NOEXCEPT { return vabsq_s64(x.v); }
+#else
+KFR_INTRINSIC i64neon abs(const i64neon& x) CMT_NOEXCEPT { return select(x >= 0, x, -x); }
+#endif
+
+KFR_INTRINSIC u8neon abs(const u8neon& x) CMT_NOEXCEPT { return x; }
+KFR_INTRINSIC u16neon abs(const u16neon& x) CMT_NOEXCEPT { return x; }
+KFR_INTRINSIC u32neon abs(const u32neon& x) CMT_NOEXCEPT { return x; }
+KFR_INTRINSIC u64neon abs(const u64neon& x) CMT_NOEXCEPT { return x; }
+
+KFR_INTRINSIC f32neon abs(const f32neon& x) CMT_NOEXCEPT { return vabsq_f32(x.v); }
+#if defined CMT_ARCH_NEON64
+KFR_INTRINSIC f64neon abs(const f64neon& x) CMT_NOEXCEPT { return vabsq_f64(x.v); }
+#else
+KFR_INTRINSIC f64neon abs(const f64neon& x) CMT_NOEXCEPT
+{
+ return x & special_constants<f64>::invhighbitmask();
+}
+#endif
+
+KFR_HANDLE_ALL_SIZES_1(abs)
+
+#else
+
+// floating point
+template <typename T, size_t N, KFR_ENABLE_IF(is_f_class<T>)>
+KFR_INTRINSIC vec<T, N> abs(const vec<T, N>& x) CMT_NOEXCEPT
+{
+ return x & special_constants<T>::invhighbitmask();
+}
+
+// fallback
+template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)>
+KFR_INTRINSIC vec<T, N> abs(const vec<T, N>& x) CMT_NOEXCEPT
+{
+ return select(x >= T(0), x, -x);
+}
+#endif
+KFR_HANDLE_SCALAR(abs)
+} // namespace intrinsics
+
+KFR_I_FN(abs)
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/include/kfr/simd/impl/backend_clang.hpp b/include/kfr/simd/impl/backend_clang.hpp
@@ -60,7 +60,7 @@ KFR_INTRINSIC simd<Tout, N> simd_make(ctype_t<Tout>, const Args&... args)
return (simd<Tout, N>){ static_cast<unwrap_bit<Tout>>(args)... };
}
-/// @brief Returns vector with undefined value
+// @brief Returns vector with undefined value
template <typename Tout, size_t N>
KFR_INTRINSIC simd<Tout, N> simd_undefined()
{
@@ -68,21 +68,21 @@ KFR_INTRINSIC simd<Tout, N> simd_undefined()
return x;
}
-/// @brief Returns vector with all zeros
+// @brief Returns vector with all zeros
template <typename Tout, size_t N>
KFR_INTRINSIC simd<Tout, N> simd_zeros()
{
return Tout();
}
-/// @brief Returns vector with all ones
+// @brief Returns vector with all ones
template <typename Tout, size_t N>
KFR_INTRINSIC simd<Tout, N> simd_allones()
{
return special_constants<Tout>::allones();
}
-/// @brief Converts input vector to vector with subtype Tout
+// @brief Converts input vector to vector with subtype Tout
template <typename Tout, typename Tin, size_t N, size_t Nout = (sizeof(Tin) * N / sizeof(Tout))>
KFR_INTRINSIC simd<Tout, Nout> simd_bitcast(simd_cvt_t<Tout, Tin, N>, const simd<Tin, N>& x)
{
@@ -135,11 +135,13 @@ KFR_INTRINSIC simd<T, Nout> simd_shuffle(simd2_t<T, N1, N2>, const simd<T, N1>&
csizes_t<indices...>, overload_generic)
{
constexpr size_t Nmax = (N1 > N2 ? N1 : N2);
- return simd_shuffle(
- simd2_t<T, Nmax, Nmax>{}, simd_shuffle(simd_t<T, N1>{}, x, csizeseq<Nmax>, overload_auto),
- simd_shuffle(simd_t<T, N2>{}, y, csizeseq<Nmax>, overload_auto),
- csizes<(indices < N1 ? indices : indices < N1 + N2 ? indices + (Nmax - N1) : index_undefined)...>,
- overload_auto);
+ return simd_shuffle(simd2_t<T, Nmax, Nmax>{},
+ simd_shuffle(simd_t<T, N1>{}, x, csizeseq<Nmax>, overload_auto),
+ simd_shuffle(simd_t<T, N2>{}, y, csizeseq<Nmax>, overload_auto),
+ csizes<(indices < N1 ? indices
+ : indices < N1 + N2 ? indices + (Nmax - N1)
+ : index_undefined)...>,
+ overload_auto);
}
template <typename T, size_t N1>
@@ -156,14 +158,14 @@ KFR_INTRINSIC simd<T, N1 + N2 + Nscount> simd_concat(const simd<T, N1>& x, const
csizeseq<N1 + N2 + Nscount>, overload_auto);
}
-/// @brief Converts input vector to vector with subtype Tout
+// @brief Converts input vector to vector with subtype Tout
template <typename Tout, typename Tin, size_t N>
KFR_INTRINSIC simd<Tout, N> simd_convert(simd_cvt_t<Tout, Tin, N>, const simd<Tin, N>& x)
{
return __builtin_convertvector(x, simd<Tout, N>);
}
-/// @brief Converts input vector to vector with subtype Tout
+// @brief Converts input vector to vector with subtype Tout
template <typename T, size_t N>
KFR_INTRINSIC simd<T, N> simd_convert(simd_cvt_t<T, T, N>, const simd<T, N>& x)
{
diff --git a/include/kfr/simd/impl/backend_generic.hpp b/include/kfr/simd/impl/backend_generic.hpp
@@ -22,6 +22,8 @@
*/
#pragma once
+#ifndef CMT_CLANG_EXT
+
#include "simd.hpp"
CMT_PRAGMA_GNU(GCC diagnostic push)
@@ -71,10 +73,7 @@ struct shuffle_mask<2, i0, i1>
#if KFR_SHOW_NOT_OPTIMIZED
CMT_PUBLIC_C CMT_DLL_EXPORT void not_optimized(const char* fn) CMT_NOEXCEPT;
#else
-#define not_optimized(...) \
- do \
- { \
- } while (0)
+#define not_optimized(...) CMT_NOOP
#endif
inline namespace CMT_ARCH_NAME
@@ -97,7 +96,7 @@ struct simd_small_array
constexpr static size_t size = N;
using packed_type = U;
-#ifdef _MSC_VER
+#ifdef CMT_COMPILER_IS_MSVC
KFR_INTRINSIC constexpr simd_small_array() CMT_NOEXCEPT = default;
#else
KFR_INTRINSIC simd_small_array() CMT_NOEXCEPT {}
@@ -123,13 +122,13 @@ struct simd_small_array<f32, 2, f64>
constexpr static size_t size = 2;
using packed_type = f64;
-#ifdef _MSC_VER
+#ifdef CMT_COMPILER_IS_MSVC
KFR_MEM_INTRINSIC constexpr simd_small_array() CMT_NOEXCEPT = default;
#else
KFR_MEM_INTRINSIC simd_small_array() CMT_NOEXCEPT {}
#endif
-#ifdef _MSC_VER
+#ifdef CMT_COMPILER_IS_MSVC
// MSVC Internal Compiler Error workaround
KFR_MEM_INTRINSIC constexpr simd_small_array(const simd_small_array& v) CMT_NOEXCEPT : whole(v.whole) {}
KFR_MEM_INTRINSIC constexpr simd_small_array(simd_small_array&& v) CMT_NOEXCEPT : whole(v.whole) {}
@@ -149,7 +148,7 @@ struct simd_small_array<f32, 2, f64>
KFR_MEM_INTRINSIC simd_small_array(f32 x, f32 y) CMT_NOEXCEPT
{
-#ifdef _MSC_VER
+#ifdef CMT_COMPILER_IS_MSVC
#ifdef CMT_ARCH_SSE2
// whole = _mm_cvtsd_f64(_mm_castps_pd(_mm_setr_ps(x, y, x, y)));
whole = _mm_cvtsd_f64(_mm_castps_pd(_mm_unpacklo_ps(_mm_set_ss(x), _mm_set_ss(y))));
@@ -292,7 +291,7 @@ KFR_SIMD_TYPE(f64, 2, float64x2_t);
#endif // CMT_ARCH_NEON64
#endif // CMT_ARCH_NEON
-#if defined CMT_COMPILER_MSVC
+#if defined CMT_COMPILER_IS_MSVC
#define KFR_i8sse_INDEX(x, i) x.m128i_i8[i]
#define KFR_i16sse_INDEX(x, i) x.m128i_i16[i]
#define KFR_i32sse_INDEX(x, i) x.m128i_i32[i]
@@ -455,13 +454,14 @@ KFR_INTRINSIC __m128 KFR_swap_ps(__m128 x) { return _mm_shuffle_ps(x, x, _MM_SHU
#ifndef KFR_f32x2_array
// KFR_INTRIN_SHUFFLE_CONCAT(f32, 2, _mm_castpd_ps(_mm_setr_pd(x.whole, y.whole)))
-KFR_INTRIN_SHUFFLE_SWAP(f32, 2, _mm_cvtsd_f64(_mm_castps_pd(KFR_swap_ps(_mm_castpd_ps(_mm_set1_pd(x.whole))))))
+KFR_INTRIN_SHUFFLE_SWAP(f32, 2,
+ _mm_cvtsd_f64(_mm_castps_pd(KFR_swap_ps(_mm_castpd_ps(_mm_set1_pd(x.whole))))))
#else
KFR_INTRIN_SHUFFLE_CONCAT(f32, 2, _mm_setr_ps(x.low, x.high, y.low, y.high))
KFR_INTRIN_SHUFFLE_SWAP(f32, 2, simd<f32, 2>(x.high, x.low))
#endif
-#if defined CMT_COMPILER_MSVC && !defined CMT_COMPILER_CLANG && defined CMT_ARCH_X32
+#if defined CMT_COMPILER_IS_MSVC && defined CMT_ARCH_X32
KFR_INTRINSIC __m128i _mm_cvtsi64_si128(int64_t u)
{
__m128i r = _mm_setzero_si128();
@@ -583,7 +583,13 @@ KFR_INTRIN_SHUFFLE_LINEAR_START(f32, 2, 4, 2,
KFR_INTRIN_CONVERT(f32, i32, 4, _mm_cvtepi32_ps(x))
KFR_INTRIN_CONVERT(i32, f32, 4, _mm_cvttps_epi32(x))
KFR_INTRIN_CONVERT(i32, f64, 2, simd<i32, 2>::from(_mm_cvtsi128_si64(_mm_cvttpd_epi32(x))))
+#ifdef CMT_COMPILER_IS_MSVC
+KFR_INTRIN_CONVERT(f64, i32, 2,
+ _mm_cvtepi32_pd(_mm_setr_epi32(bitcast_anything<simd_array<i32, 2>>(x).val[0],
+ bitcast_anything<simd_array<i32, 2>>(x).val[1], 0, 0)))
+#else
KFR_INTRIN_CONVERT(f64, i32, 2, _mm_cvtepi32_pd(KFR_mm_setr_epi64x(x.whole, 0)))
+#endif
KFR_INTRIN_CONVERT(i64, f64, 2,
KFR_mm_setr_epi64x(_mm_cvttsd_si64(x), _mm_cvttsd_si64(_mm_unpackhi_pd(x, x))))
KFR_INTRIN_CONVERT(f64, i64, 2,
@@ -1060,7 +1066,7 @@ KFR_INTRINSIC simd_array<T, N> to_simd_array(const simd<T, N>& x) CMT_NOEXCEPT
return bitcast_anything<simd_array<T, N>>(x);
}
-#if defined CMT_COMPILER_MSVC
+#if defined CMT_COMPILER_IS_MSVC
template <typename T, size_t N, KFR_ENABLE_IF(!is_simd_small_array<simd<T, N>>)>
KFR_INTRINSIC simd<T, N> from_simd_array(const simd_array<T, N>& x) CMT_NOEXCEPT
@@ -1088,22 +1094,6 @@ KFR_INTRINSIC simd<T, N> from_simd_array(const simd_array<T, N>& x) CMT_NOEXCEPT
#endif
-#define KFR_COMPONENTWISE_RET(code) \
- vec<T, N> result; \
- for (size_t i = 0; i < N; i++) \
- code; \
- return result;
-
-#define KFR_COMPONENTWISE_RET_I(Tvec, code) \
- Tvec result; \
- for (size_t i = 0; i < result.size(); i++) \
- code; \
- return result;
-
-#define KFR_COMPONENTWISE(code) \
- for (size_t i = 0; i < N; i++) \
- code;
-
template <typename Tout>
KFR_INTRINSIC void simd_make(ctype_t<Tout>) CMT_NOEXCEPT = delete;
@@ -1128,7 +1118,7 @@ template <typename T, size_t... indices, typename... Args, size_t N>
KFR_INTRINSIC simd<T, N> simd_make_helper(csizes_t<indices...>, const Args&... args) CMT_NOEXCEPT
{
const T temp[] = { static_cast<T>(args)... };
- return simd_make(ctype<T>, temp[indices]...);
+ return simd_make(cometa::ctype<T>, temp[indices]...);
}
/// @brief Returns vector with undefined value
@@ -1160,9 +1150,9 @@ KFR_INTRINSIC simd<Tout, N> simd_allones() CMT_NOEXCEPT
/// @brief Converts input vector to vector with subtype Tout
template <typename Tout, typename Tin, size_t N, size_t Nout = (sizeof(Tin) * N / sizeof(Tout))
-#ifdef _MSC_VER
+#ifdef CMT_COMPILER_IS_MSVC
,
- KFR_ENABLE_IF((Nout == 1 || N == 1) && !is_same<Tout, Tin>)
+ KFR_ENABLE_IF((Nout == 1 || N == 1) && !std::is_same_v<Tout, Tin>)
#else
,
KFR_ENABLE_IF(Nout == 1 || N == 1)
@@ -1176,9 +1166,9 @@ KFR_INTRINSIC simd<Tout, Nout> simd_bitcast(simd_cvt_t<Tout, Tin, N>, const simd
/// @brief Converts input vector to vector with subtype Tout
template <typename Tout, typename Tin, size_t N, size_t Nout = (sizeof(Tin) * N / sizeof(Tout))
-#ifdef _MSC_VER
+#ifdef CMT_COMPILER_IS_MSVC
,
- KFR_ENABLE_IF(Nout > 1 && N > 1 && !is_same<Tout, Tin>)
+ KFR_ENABLE_IF(Nout > 1 && N > 1 && !std::is_same_v<Tout, Tin>)
#else
,
KFR_ENABLE_IF(Nout > 1 && N > 1)
@@ -1238,7 +1228,8 @@ KFR_INTRINSIC const simd<T, N2>& simd_shuffle(simd2_t<T, N1, N2>, const simd<T,
// concat()
template <typename T, size_t N,
- KFR_ENABLE_IF(is_poweroftwo(N) && is_same<simd<T, N + N>, simd_halves<unwrap_bit<T>, N + N>>)>
+ KFR_ENABLE_IF(is_poweroftwo(N) &&
+ std::is_same_v<simd<T, N + N>, simd_halves<unwrap_bit<T>, N + N>>)>
KFR_INTRINSIC simd<T, N + N> simd_shuffle(simd2_t<T, N, N>, const simd<T, N>& x, const simd<T, N>& y,
csizeseq_t<N + N>, overload_priority<8>) CMT_NOEXCEPT
{
@@ -1259,7 +1250,7 @@ KFR_INTRINSIC simd<T, N> simd_broadcast(simd_t<T, N>, identity<T> value) CMT_NOE
}
template <typename T, size_t N,
- KFR_ENABLE_IF(is_poweroftwo(N) && is_same<simd<T, N>, simd_halves<unwrap_bit<T>, N>>)>
+ KFR_ENABLE_IF(is_poweroftwo(N) && std::is_same_v<simd<T, N>, simd_halves<unwrap_bit<T>, N>>)>
KFR_INTRINSIC simd<T, N / 2> simd_shuffle(simd_t<T, N>, const simd<T, N>& x, csizeseq_t<N / 2>,
overload_priority<7>) CMT_NOEXCEPT
{
@@ -1267,7 +1258,7 @@ KFR_INTRINSIC simd<T, N / 2> simd_shuffle(simd_t<T, N>, const simd<T, N>& x, csi
}
template <typename T, size_t N,
- KFR_ENABLE_IF(is_poweroftwo(N) && is_same<simd<T, N>, simd_halves<unwrap_bit<T>, N>>)>
+ KFR_ENABLE_IF(is_poweroftwo(N) && std::is_same_v<simd<T, N>, simd_halves<unwrap_bit<T>, N>>)>
KFR_INTRINSIC simd<T, N / 2> simd_shuffle(simd_t<T, N>, const simd<T, N>& x, csizeseq_t<N / 2, N / 2>,
overload_priority<7>) CMT_NOEXCEPT
{
@@ -1313,7 +1304,7 @@ KFR_INTRINSIC simd<T, Nout> simd_shuffle(simd_t<T, N>, const simd<T, N>& x, csiz
overload_generic) CMT_NOEXCEPT
{
not_optimized(CMT_FUNC_SIGNATURE);
-#ifdef CMT_COMPILER_MSVC
+#ifdef CMT_COMPILER_IS_MSVC
const simd_array<T, N> xx = to_simd_array<T, N>(x);
constexpr static unsigned indices_array[] = { static_cast<unsigned>(indices)... };
return from_simd_array<T, Nout>(simd_shuffle_generic<T, Nout, N>(xx, indices_array));
@@ -1329,7 +1320,7 @@ KFR_INTRINSIC simd<T, Nout> simd_shuffle(simd2_t<T, N, N>, const simd<T, N>& x,
{
static_assert(N == N2, "");
not_optimized(CMT_FUNC_SIGNATURE);
-#ifdef CMT_COMPILER_MSVC
+#ifdef CMT_COMPILER_IS_MSVC
const simd_array<T, N> xx = to_simd_array<T, N>(x);
const simd_array<T, N> yy = to_simd_array<T, N>(y);
constexpr static unsigned indices_array[] = { static_cast<unsigned>(indices)... };
@@ -1349,7 +1340,7 @@ KFR_INTRINSIC simd<T, Nout> simd_shuffle(simd2_t<T, N1, N2>, const simd<T, N1>&
{
not_optimized(CMT_FUNC_SIGNATURE);
-#ifdef CMT_COMPILER_MSVC
+#ifdef CMT_COMPILER_IS_MSVC
const simd_array<T, N1> xx = to_simd_array<T, N1>(x);
const simd_array<T, N2> yy = to_simd_array<T, N2>(y);
constexpr static unsigned indices_array[] = { static_cast<unsigned>(indices)... };
@@ -1398,14 +1389,14 @@ template <typename Tout, typename Tin, size_t N, size_t... indices>
KFR_INTRINSIC simd<Tout, N> simd_convert__(const simd<Tin, N>& x, csizes_t<indices...>) CMT_NOEXCEPT
{
const simd_array<Tin, N> xx = to_simd_array<Tin, N>(x);
- return simd_make(ctype<Tout>, static_cast<Tout>(xx.val[indices])...);
+ return simd_make(cometa::ctype<Tout>, static_cast<Tout>(xx.val[indices])...);
}
/// @brief Converts input vector to vector with subtype Tout
template <typename Tout, typename Tin, KFR_ENABLE_IF(!std::is_same<Tout, Tin>::value)>
KFR_INTRINSIC simd<Tout, 1> simd_convert(simd_cvt_t<Tout, Tin, 1>, const simd<Tin, 1>& x) CMT_NOEXCEPT
{
- return simd_make(ctype<Tout>, static_cast<Tout>(x));
+ return simd_make(cometa::ctype<Tout>, static_cast<Tout>(x));
}
/// @brief Converts input vector to vector with subtype Tout
@@ -1469,7 +1460,7 @@ KFR_INTRINSIC simd<T, N> simd_set_element(const simd<T, N>& value, size_t index,
template <typename T, size_t Nout, size_t Nin>
KFR_INTRINSIC simd<T, Nout> simd_from_partial(simd2_t<T, Nout, Nin>, const simd<T, Nin>& x)
{
-#ifdef _MSC_VER
+#ifdef CMT_COMPILER_IS_MSVC
union
{
simd<T, Nin> in;
@@ -1712,10 +1703,10 @@ KFR_INTRINSIC simd<float, 8> simd_vec_shuffle(simd_t<float, 8>, const simd<float
{
return simd_from_halves(simd_t<float, 8>{},
universal_shuffle(simd_t<float, 4>{}, simd_get_low(simd_t<float, 8>{}, x),
- shuffle_mask<8, I0, I1, I2, I3>::value),
+ csizes<I0, I1, I2, I3>),
universal_shuffle(simd_t<float, 4>{},
simd_get_high(simd_t<float, 8>{}, x),
- shuffle_mask<8, I4, I5, I6, I7>::value));
+ csizes<I4, I5, I6, I7>));
}
}
else
@@ -1752,10 +1743,9 @@ KFR_INTRINSIC simd<double, 4> simd_vec_shuffle(simd_t<double, 4>, const simd<dou
{
return simd_from_halves(
simd_t<double, 4>{},
- universal_shuffle(simd_t<double, 2>{}, simd_get_low(simd_t<double, 4>{}, x),
- shuffle_mask<2, I0, I1>::value),
+ universal_shuffle(simd_t<double, 2>{}, simd_get_low(simd_t<double, 4>{}, x), csizes<I0, I1>),
universal_shuffle(simd_t<double, 2>{}, simd_get_high(simd_t<double, 4>{}, x),
- shuffle_mask<2, I2, I3>::value));
+ csizes<I2, I3>));
}
}
else
@@ -1932,3 +1922,4 @@ KFR_INTRINSIC simd<T, Nout> universal_shuffle(simd_t<T, Nin>, const simd<T, Nin>
} // namespace kfr
CMT_PRAGMA_GNU(GCC diagnostic pop)
+#endif
diff --git a/include/kfr/simd/impl/basicoperators_clang.hpp b/include/kfr/simd/impl/basicoperators_clang.hpp
@@ -86,6 +86,12 @@ KFR_INTRINSIC vec<T, N> div(const vec<T, N>& x, const vec<T, N>& y)
return x.v / y.v;
}
KFR_OP_SCALAR2(div, /, , , )
+template <typename T, size_t N, KFR_ENABLE_IF(is_simd_type<T>)>
+KFR_INTRINSIC vec<T, N> mod(const vec<T, N>& x, const vec<T, N>& y)
+{
+ return x.v % y.v;
+}
+KFR_OP_SCALAR2(mod, %, , , )
template <typename T, size_t N, KFR_ENABLE_IF(is_simd_type<T>)>
KFR_INTRINSIC vec<T, N> band(const vec<T, N>& x, const vec<T, N>& y)
diff --git a/include/kfr/simd/impl/basicoperators_complex.hpp b/include/kfr/simd/impl/basicoperators_complex.hpp
@@ -0,0 +1,111 @@
+/** @addtogroup complex
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../complex_type.hpp"
+#include "../operators.hpp"
+#include "../vec.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+namespace intrinsics
+{
+
+template <typename T, size_t N>
+KFR_INTRINSIC vec<complex<T>, N> neg(const vec<complex<T>, N>& x)
+{
+ return neg(x.flatten()).v;
+}
+
+template <typename T, size_t N>
+KFR_INTRINSIC vec<complex<T>, N> add(const vec<complex<T>, N>& x, const vec<complex<T>, N>& y)
+{
+ return add(x.flatten(), y.flatten()).v;
+}
+
+template <typename T, size_t N>
+KFR_INTRINSIC vec<complex<T>, N> sub(const vec<complex<T>, N>& x, const vec<complex<T>, N>& y)
+{
+ return sub(x.flatten(), y.flatten()).v;
+}
+
+template <typename T, size_t N>
+KFR_INTRINSIC vec<complex<T>, N> mul(const vec<complex<T>, N>& x, const vec<complex<T>, N>& y)
+{
+ const vec<T, (N * 2)> xx = x.v;
+ const vec<T, (N * 2)> yy = y.v;
+ return subadd(mul(xx, dupeven(yy)), mul(swap<2>(xx), dupodd(yy))).v;
+}
+
+template <typename T, size_t N>
+KFR_INTRINSIC vec<complex<T>, N> div(const vec<complex<T>, N>& x, const vec<complex<T>, N>& y)
+{
+ const vec<T, (N * 2)> xx = x.v;
+ const vec<T, (N * 2)> yy = y.v;
+ const vec<T, (N * 2)> m = (add(sqr(dupeven(yy)), sqr(dupodd(yy))));
+ return swap<2>(subadd(mul(swap<2>(xx), dupeven(yy)), mul(xx, dupodd(yy))) / m).v;
+}
+
+template <typename T, size_t N>
+KFR_INTRINSIC vec<complex<T>, N> bor(const vec<complex<T>, N>& x, const vec<complex<T>, N>& y)
+{
+ return bor(x.flatten(), y.flatten()).v;
+}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<complex<T>, N> bxor(const vec<complex<T>, N>& x, const vec<complex<T>, N>& y)
+{
+ return bxor(x.flatten(), y.flatten()).v;
+}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<complex<T>, N> band(const vec<complex<T>, N>& x, const vec<complex<T>, N>& y)
+{
+ return band(x.flatten(), y.flatten()).v;
+}
+
+#define KFR_COMPLEX_OP_CVT(fn) \
+ template <typename T, size_t N> \
+ KFR_INTRINSIC vec<complex<T>, N> fn(const vec<complex<T>, N>& x, const complex<T>& y) \
+ { \
+ return fn(x, vec<complex<T>, N>(y)); \
+ } \
+ template <typename T, size_t N> \
+ KFR_INTRINSIC vec<complex<T>, N> fn(const complex<T>& x, const vec<complex<T>, N>& y) \
+ { \
+ return fn(vec<complex<T>, N>(x), y); \
+ }
+
+KFR_COMPLEX_OP_CVT(mul)
+KFR_COMPLEX_OP_CVT(div)
+KFR_COMPLEX_OP_CVT(band)
+KFR_COMPLEX_OP_CVT(bxor)
+KFR_COMPLEX_OP_CVT(bor)
+
+} // namespace intrinsics
+} // namespace CMT_ARCH_NAME
+
+} // namespace kfr
diff --git a/include/kfr/simd/impl/basicoperators_generic.hpp b/include/kfr/simd/impl/basicoperators_generic.hpp
@@ -39,6 +39,16 @@ inline namespace CMT_ARCH_NAME
namespace intrinsics
{
+#define KFR_DIV_MOD_FN(ty) \
+ KFR_INTRINSIC ty div(const ty& x, const ty& y) \
+ { \
+ KFR_COMPONENTWISE_RET_I(ty, result[i] = y[i] ? x[i] / y[i] : 0); \
+ } \
+ KFR_INTRINSIC ty mod(const ty& x, const ty& y) \
+ { \
+ KFR_COMPONENTWISE_RET_I(ty, result[i] = y[i] ? x[i] % y[i] : 0); \
+ }
+
#if defined CMT_ARCH_SSE2 && defined KFR_NATIVE_INTRINSICS
KFR_INTRINSIC __m128 _mm_allones_ps()
@@ -76,17 +86,11 @@ KFR_INTRINSIC f64sse div(const f64sse& x, const f64sse& y) { return f64sse(_mm_d
KFR_INTRINSIC u8sse add(const u8sse& x, const u8sse& y) { return _mm_add_epi8(x.v, y.v); }
KFR_INTRINSIC u8sse sub(const u8sse& x, const u8sse& y) { return _mm_sub_epi8(x.v, y.v); }
-KFR_INTRINSIC u8sse div(const u8sse& x, const u8sse& y)
-{
- KFR_COMPONENTWISE_RET_I(u8sse, result[i] = y[i] ? x[i] / y[i] : 0);
-}
+KFR_DIV_MOD_FN(u8sse)
KFR_INTRINSIC i8sse add(const i8sse& x, const i8sse& y) { return _mm_add_epi8(x.v, y.v); }
KFR_INTRINSIC i8sse sub(const i8sse& x, const i8sse& y) { return _mm_sub_epi8(x.v, y.v); }
-KFR_INTRINSIC i8sse div(const i8sse& x, const i8sse& y)
-{
- KFR_COMPONENTWISE_RET_I(i8sse, result[i] = y[i] ? x[i] / y[i] : 0);
-}
+KFR_DIV_MOD_FN(i8sse)
KFR_INTRINSIC __m128i mul_epi8(const __m128i& x, const __m128i& y)
{
@@ -102,18 +106,12 @@ KFR_INTRINSIC i8sse mul(const i8sse& x, const i8sse& y) { return mul_epi8(x.v, y
KFR_INTRINSIC u16sse add(const u16sse& x, const u16sse& y) { return _mm_add_epi16(x.v, y.v); }
KFR_INTRINSIC u16sse sub(const u16sse& x, const u16sse& y) { return _mm_sub_epi16(x.v, y.v); }
KFR_INTRINSIC u16sse mul(const u16sse& x, const u16sse& y) { return _mm_mullo_epi16(x.v, y.v); }
-KFR_INTRINSIC u16sse div(const u16sse& x, const u16sse& y)
-{
- KFR_COMPONENTWISE_RET_I(u16sse, result[i] = y[i] ? x[i] / y[i] : 0);
-}
+KFR_DIV_MOD_FN(u16sse)
KFR_INTRINSIC i16sse add(const i16sse& x, const i16sse& y) { return _mm_add_epi16(x.v, y.v); }
KFR_INTRINSIC i16sse sub(const i16sse& x, const i16sse& y) { return _mm_sub_epi16(x.v, y.v); }
KFR_INTRINSIC i16sse mul(const i16sse& x, const i16sse& y) { return _mm_mullo_epi16(x.v, y.v); }
-KFR_INTRINSIC i16sse div(const i16sse& x, const i16sse& y)
-{
- KFR_COMPONENTWISE_RET_I(i16sse, result[i] = y[i] ? x[i] / y[i] : 0);
-}
+KFR_DIV_MOD_FN(i16sse)
KFR_INTRINSIC u32sse add(const u32sse& x, const u32sse& y) { return _mm_add_epi32(x.v, y.v); }
KFR_INTRINSIC u32sse sub(const u32sse& x, const u32sse& y) { return _mm_sub_epi32(x.v, y.v); }
@@ -140,14 +138,8 @@ KFR_INTRINSIC i32sse mul(const i32sse& x, const i32sse& y)
_mm_shuffle_epi32(tmp2, _MM_SHUFFLE(0, 0, 2, 0)));
}
#endif
-KFR_INTRINSIC u32sse div(const u32sse& x, const u32sse& y)
-{
- KFR_COMPONENTWISE_RET_I(u32sse, result[i] = y[i] ? x[i] / y[i] : 0);
-}
-KFR_INTRINSIC i32sse div(const i32sse& x, const i32sse& y)
-{
- KFR_COMPONENTWISE_RET_I(i32sse, result[i] = y[i] ? x[i] / y[i] : 0);
-}
+KFR_DIV_MOD_FN(u32sse)
+KFR_DIV_MOD_FN(i32sse)
KFR_INTRINSIC u64sse add(const u64sse& x, const u64sse& y) { return _mm_add_epi64(x.v, y.v); }
KFR_INTRINSIC u64sse sub(const u64sse& x, const u64sse& y) { return _mm_sub_epi64(x.v, y.v); }
@@ -155,10 +147,6 @@ KFR_INTRINSIC u64sse mul(const u64sse& x, const u64sse& y)
{
KFR_COMPONENTWISE_RET_I(u64sse, result[i] = x[i] * y[i]);
}
-KFR_INTRINSIC u64sse div(const u64sse& x, const u64sse& y)
-{
- KFR_COMPONENTWISE_RET_I(u64sse, result[i] = y[i] ? x[i] / y[i] : 0);
-}
KFR_INTRINSIC i64sse add(const i64sse& x, const i64sse& y) { return _mm_add_epi64(x.v, y.v); }
KFR_INTRINSIC i64sse sub(const i64sse& x, const i64sse& y) { return _mm_sub_epi64(x.v, y.v); }
@@ -166,10 +154,8 @@ KFR_INTRINSIC i64sse mul(const i64sse& x, const i64sse& y)
{
KFR_COMPONENTWISE_RET_I(i64sse, result[i] = x[i] * y[i]);
}
-KFR_INTRINSIC i64sse div(const i64sse& x, const i64sse& y)
-{
- KFR_COMPONENTWISE_RET_I(i64sse, result[i] = y[i] ? x[i] / y[i] : 0);
-}
+KFR_DIV_MOD_FN(u64sse)
+KFR_DIV_MOD_FN(i64sse)
KFR_INTRINSIC f32sse shl(const f32sse& x, unsigned y)
{
@@ -516,19 +502,23 @@ KFR_INTRINSIC __m256i _mm256_allones_si256()
{
return _mm256_cmpeq_epi8(_mm256_setzero_si256(), _mm256_setzero_si256());
}
+KFR_INTRINSIC __m256i _mm256_not_si256(const __m256i& x)
+{
+ return _mm256_xor_si256(x, _mm256_allones_si256());
+}
#else
KFR_INTRINSIC __m256i _mm256_allones_si256()
{
return _mm256_castps_si256(_mm256_cmp_ps(_mm256_setzero_ps(), _mm256_setzero_ps(), _CMP_EQ_UQ));
}
+KFR_INTRINSIC __m256i _mm256_not_si256(const __m256i& x)
+{
+ return _mm256_castps_si256(_mm256_xor_ps(_mm256_castsi256_ps(x), _mm256_allones_ps()));
+}
#endif
KFR_INTRINSIC __m256 _mm256_not_ps(const __m256& x) { return _mm256_xor_ps(x, _mm256_allones_ps()); }
KFR_INTRINSIC __m256d _mm256_not_pd(const __m256d& x) { return _mm256_xor_pd(x, _mm256_allones_pd()); }
-KFR_INTRINSIC __m256i _mm256_not_si256(const __m256i& x)
-{
- return _mm256_xor_si256(x, _mm256_allones_si256());
-}
KFR_INTRINSIC __m256i _mm256_highbit_epi8() { return _mm256_set1_epi8(static_cast<char>(0x80)); }
KFR_INTRINSIC __m256i _mm256_highbit_epi16() { return _mm256_set1_epi16(static_cast<short>(0x8000)); }
@@ -600,33 +590,21 @@ KFR_INTRINSIC f64avx shr(const f64avx& x, unsigned y)
KFR_INTRINSIC u8avx add(const u8avx& x, const u8avx& y) { return _mm256_add_epi8(x.v, y.v); }
KFR_INTRINSIC u8avx sub(const u8avx& x, const u8avx& y) { return _mm256_sub_epi8(x.v, y.v); }
-KFR_INTRINSIC u8avx div(const u8avx& x, const u8avx& y)
-{
- KFR_COMPONENTWISE_RET_I(u8avx, result[i] = x[i] / y[i]);
-}
+KFR_DIV_MOD_FN(u8avx)
KFR_INTRINSIC i8avx add(const i8avx& x, const i8avx& y) { return _mm256_add_epi8(x.v, y.v); }
KFR_INTRINSIC i8avx sub(const i8avx& x, const i8avx& y) { return _mm256_sub_epi8(x.v, y.v); }
-KFR_INTRINSIC i8avx div(const i8avx& x, const i8avx& y)
-{
- KFR_COMPONENTWISE_RET_I(i8avx, result[i] = x[i] / y[i]);
-}
+KFR_DIV_MOD_FN(i8avx)
KFR_INTRINSIC u16avx add(const u16avx& x, const u16avx& y) { return _mm256_add_epi16(x.v, y.v); }
KFR_INTRINSIC u16avx sub(const u16avx& x, const u16avx& y) { return _mm256_sub_epi16(x.v, y.v); }
KFR_INTRINSIC u16avx mul(const u16avx& x, const u16avx& y) { return _mm256_mullo_epi16(x.v, y.v); }
-KFR_INTRINSIC u16avx div(const u16avx& x, const u16avx& y)
-{
- KFR_COMPONENTWISE_RET_I(u16avx, result[i] = x[i] / y[i]);
-}
+KFR_DIV_MOD_FN(u16avx)
KFR_INTRINSIC i16avx add(const i16avx& x, const i16avx& y) { return _mm256_add_epi16(x.v, y.v); }
KFR_INTRINSIC i16avx sub(const i16avx& x, const i16avx& y) { return _mm256_sub_epi16(x.v, y.v); }
KFR_INTRINSIC i16avx mul(const i16avx& x, const i16avx& y) { return _mm256_mullo_epi16(x.v, y.v); }
-KFR_INTRINSIC i16avx div(const i16avx& x, const i16avx& y)
-{
- KFR_COMPONENTWISE_RET_I(i16avx, result[i] = x[i] / y[i]);
-}
+KFR_DIV_MOD_FN(i16avx)
KFR_INTRINSIC u32avx add(const u32avx& x, const u32avx& y) { return _mm256_add_epi32(x.v, y.v); }
KFR_INTRINSIC u32avx sub(const u32avx& x, const u32avx& y) { return _mm256_sub_epi32(x.v, y.v); }
@@ -636,14 +614,8 @@ KFR_INTRINSIC i32avx sub(const i32avx& x, const i32avx& y) { return _mm256_sub_e
KFR_INTRINSIC u32avx mul(const u32avx& x, const u32avx& y) { return _mm256_mullo_epi32(x.v, y.v); }
KFR_INTRINSIC i32avx mul(const i32avx& x, const i32avx& y) { return _mm256_mullo_epi32(x.v, y.v); }
-KFR_INTRINSIC u32avx div(const u32avx& x, const u32avx& y)
-{
- KFR_COMPONENTWISE_RET_I(u32avx, result[i] = x[i] / y[i]);
-}
-KFR_INTRINSIC i32avx div(const i32avx& x, const i32avx& y)
-{
- KFR_COMPONENTWISE_RET_I(i32avx, result[i] = x[i] / y[i]);
-}
+KFR_DIV_MOD_FN(u32avx)
+KFR_DIV_MOD_FN(i32avx)
KFR_INTRINSIC u64avx add(const u64avx& x, const u64avx& y) { return _mm256_add_epi64(x.v, y.v); }
KFR_INTRINSIC u64avx sub(const u64avx& x, const u64avx& y) { return _mm256_sub_epi64(x.v, y.v); }
@@ -651,10 +623,6 @@ KFR_INTRINSIC u64avx mul(const u64avx& x, const u64avx& y)
{
KFR_COMPONENTWISE_RET_I(u64avx, result[i] = x[i] * y[i]);
}
-KFR_INTRINSIC u64avx div(const u64avx& x, const u64avx& y)
-{
- KFR_COMPONENTWISE_RET_I(u64avx, result[i] = y[i] ? x[i] / y[i] : 0);
-}
KFR_INTRINSIC i64avx add(const i64avx& x, const i64avx& y) { return _mm256_add_epi64(x.v, y.v); }
KFR_INTRINSIC i64avx sub(const i64avx& x, const i64avx& y) { return _mm256_sub_epi64(x.v, y.v); }
@@ -662,10 +630,8 @@ KFR_INTRINSIC i64avx mul(const i64avx& x, const i64avx& y)
{
KFR_COMPONENTWISE_RET_I(i64avx, result[i] = x[i] * y[i]);
}
-KFR_INTRINSIC i64avx div(const i64avx& x, const i64avx& y)
-{
- KFR_COMPONENTWISE_RET_I(i64avx, result[i] = y[i] ? x[i] / y[i] : 0);
-}
+KFR_DIV_MOD_FN(u64avx)
+KFR_DIV_MOD_FN(i64avx)
KFR_INTRINSIC __m256i mul_epi8(const __m256i& x, const __m256i& y)
{
@@ -1319,38 +1285,14 @@ KFR_INTRINSIC u16avx512 mul(const u16avx512& x, const u16avx512& y) { return _mm
KFR_INTRINSIC u32avx512 mul(const u32avx512& x, const u32avx512& y) { return _mm512_mullo_epi32(x.v, y.v); }
KFR_INTRINSIC u64avx512 mul(const u64avx512& x, const u64avx512& y) { return _mm512_mullo_epi64(x.v, y.v); }
-KFR_INTRINSIC i8avx512 div(const i8avx512& x, const i8avx512& y)
-{
- KFR_COMPONENTWISE_RET_I(u8avx512, result[i] = y[i] ? x[i] / y[i] : 0);
-}
-KFR_INTRINSIC i16avx512 div(const i16avx512& x, const i16avx512& y)
-{
- KFR_COMPONENTWISE_RET_I(u16avx512, result[i] = y[i] ? x[i] / y[i] : 0);
-}
-KFR_INTRINSIC i32avx512 div(const i32avx512& x, const i32avx512& y)
-{
- KFR_COMPONENTWISE_RET_I(u32avx512, result[i] = y[i] ? x[i] / y[i] : 0);
-}
-KFR_INTRINSIC i64avx512 div(const i64avx512& x, const i64avx512& y)
-{
- KFR_COMPONENTWISE_RET_I(u64avx512, result[i] = y[i] ? x[i] / y[i] : 0);
-}
-KFR_INTRINSIC u8avx512 div(const u8avx512& x, const u8avx512& y)
-{
- KFR_COMPONENTWISE_RET_I(u8avx512, result[i] = y[i] ? x[i] / y[i] : 0);
-}
-KFR_INTRINSIC u16avx512 div(const u16avx512& x, const u16avx512& y)
-{
- KFR_COMPONENTWISE_RET_I(u16avx512, result[i] = y[i] ? x[i] / y[i] : 0);
-}
-KFR_INTRINSIC u32avx512 div(const u32avx512& x, const u32avx512& y)
-{
- KFR_COMPONENTWISE_RET_I(u32avx512, result[i] = y[i] ? x[i] / y[i] : 0);
-}
-KFR_INTRINSIC u64avx512 div(const u64avx512& x, const u64avx512& y)
-{
- KFR_COMPONENTWISE_RET_I(u64avx512, result[i] = y[i] ? x[i] / y[i] : 0);
-}
+KFR_DIV_MOD_FN(i8avx512)
+KFR_DIV_MOD_FN(i16avx512)
+KFR_DIV_MOD_FN(i32avx512)
+KFR_DIV_MOD_FN(i64avx512)
+KFR_DIV_MOD_FN(u8avx512)
+KFR_DIV_MOD_FN(u16avx512)
+KFR_DIV_MOD_FN(u32avx512)
+KFR_DIV_MOD_FN(u64avx512)
KFR_INTRINSIC i8avx512 band(const i8avx512& x, const i8avx512& y) { return _mm512_and_si512(x.v, y.v); }
KFR_INTRINSIC i16avx512 band(const i16avx512& x, const i16avx512& y) { return _mm512_and_si512(x.v, y.v); }
@@ -1512,6 +1454,7 @@ KFR_HANDLE_ALL_SIZES_2(add)
KFR_HANDLE_ALL_SIZES_2(sub)
KFR_HANDLE_ALL_SIZES_2(mul)
KFR_HANDLE_ALL_SIZES_2(div)
+KFR_HANDLE_ALL_SIZES_2(mod)
KFR_HANDLE_ALL_SIZES_2(eq)
KFR_HANDLE_ALL_SIZES_2(ne)
@@ -1619,6 +1562,11 @@ KFR_INTRINSIC vec<T, N> div(const vec<T, N>& x, const vec<T, N>& y)
{
KFR_COMPONENTWISE_RET(result[i] = x[i] / y[i]);
}
+template <typename T, size_t N, KFR_ENABLE_IF(is_simd_type<T>)>
+KFR_INTRINSIC vec<T, N> mod(const vec<T, N>& x, const vec<T, N>& y)
+{
+ KFR_COMPONENTWISE_RET(result[i] = x[i] % y[i]);
+}
#define KFR_HANDLE_VEC_SCA(fn) \
template <typename T, size_t N, KFR_ENABLE_IF(is_simd_type<T>)> \
@@ -1636,6 +1584,7 @@ KFR_HANDLE_VEC_SCA(add)
KFR_HANDLE_VEC_SCA(sub)
KFR_HANDLE_VEC_SCA(mul)
KFR_HANDLE_VEC_SCA(div)
+KFR_HANDLE_VEC_SCA(mod)
KFR_HANDLE_VEC_SCA(band)
KFR_HANDLE_VEC_SCA(bor)
KFR_HANDLE_VEC_SCA(bxor)
diff --git a/include/kfr/simd/impl/clamp.hpp b/include/kfr/simd/impl/clamp.hpp
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../min_max.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+namespace intrinsics
+{
+
+template <typename T>
+KFR_INTRINSIC T clamp(const T& x, const T& lo, const T& hi)
+{
+ return max(min(x, hi), lo);
+}
+
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> clamp(const vec<T, N>& x, const vec<T, N>& lo, const vec<T, N>& hi)
+{
+ return max(min(x, hi), lo);
+}
+
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> clamp(const vec<T, N>& x, const vec<T, N>& hi)
+{
+ return max(min(x, hi), zerovector<T, N>());
+}
+} // namespace intrinsics
+KFR_I_FN(clamp)
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/include/kfr/simd/impl/function.hpp b/include/kfr/simd/impl/function.hpp
@@ -22,7 +22,6 @@
*/
#pragma once
-#include "../../base/expression.hpp"
#include "../shuffle.hpp"
#include "../types.hpp"
#include "../vec.hpp"
@@ -39,11 +38,11 @@ inline namespace CMT_ARCH_NAME
template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)> \
KFR_INTRINSIC vec<flt_type<T>, N> fn(const vec<T, N>& a) CMT_NOEXCEPT \
{ \
- return intrinsics::fn(elemcast<flt_type<T>>(a)); \
+ return intrinsics::fn(promoteto<flt_type<T>>(a)); \
}
#define KFR_HANDLE_SCALAR(fn) \
- template <typename T1, typename... Args, typename Tout = ::kfr::common_type<T1, Args...>, \
+ template <typename T1, typename... Args, typename Tout = std::common_type_t<T1, Args...>, \
KFR_ENABLE_IF(!(is_vec<T1> || (is_vec<Args> || ...)))> \
KFR_INTRINSIC Tout fn(const T1& a, const Args&... b) CMT_NOEXCEPT \
{ \
@@ -52,7 +51,7 @@ inline namespace CMT_ARCH_NAME
}
#define KFR_HANDLE_SCALAR_1_T(fn, Tout) \
- template <typename T1, typename... Args, typename T = ::kfr::common_type<T1, Args...>, \
+ template <typename T1, typename... Args, typename T = std::common_type_t<T1, Args...>, \
KFR_ENABLE_IF(!(is_vec<T1> || (is_vec<Args> || ...)))> \
KFR_INTRINSIC Tout fn(const T1& a, const Args&... b) CMT_NOEXCEPT \
{ \
@@ -61,7 +60,7 @@ inline namespace CMT_ARCH_NAME
}
#define KFR_HANDLE_ARGS_T(fn, Tout) \
- template <typename T1, typename... Args, typename T = ::kfr::common_type<T1, Args...>, \
+ template <typename T1, typename... Args, typename T = std::common_type_t<T1, Args...>, \
KFR_ENABLE_IF((is_vec<T1> || (is_vec<Args> || ...)))> \
KFR_INTRINSIC Tout fn(const T1& a, const Args&... b) CMT_NOEXCEPT \
{ \
@@ -318,7 +317,7 @@ KFR_INTRINSIC void intrin(vec<T, N>& result, const T& a, const vec<T, N>& b, Fn&
}
template <typename T>
-using vec1 = conditional<is_vec<T>, T, vec<T, 1>>;
+using vec1 = std::conditional_t<is_vec<T>, T, vec<T, 1>>;
template <typename T>
inline const T& to_scalar(const T& value) CMT_NOEXCEPT
diff --git a/include/kfr/simd/impl/logical.hpp b/include/kfr/simd/impl/logical.hpp
@@ -0,0 +1,284 @@
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../abs.hpp"
+#include "../operators.hpp"
+#include "function.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+namespace intrinsics
+{
+
+#if defined CMT_ARCH_SSE2 && defined KFR_NATIVE_INTRINSICS
+
+#if defined CMT_ARCH_SSE41
+
+// horizontal OR
+KFR_INTRINSIC bool bittestany(const mu8sse& x) { return !_mm_testz_si128(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mu16sse& x) { return !_mm_testz_si128(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mu32sse& x) { return !_mm_testz_si128(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mu64sse& x) { return !_mm_testz_si128(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mi8sse& x) { return !_mm_testz_si128(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mi16sse& x) { return !_mm_testz_si128(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mi32sse& x) { return !_mm_testz_si128(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mi64sse& x) { return !_mm_testz_si128(x.v, x.v); }
+
+// horizontal AND
+KFR_INTRINSIC bool bittestall(const mu8sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mu16sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mu32sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mu64sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mi8sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mi16sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mi32sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mi64sse& x) { return _mm_testc_si128(x.v, allonesvector(x).v); }
+#endif
+
+#if defined CMT_ARCH_AVX
+// horizontal OR
+KFR_INTRINSIC bool bittestany(const mf32sse& x) { return !_mm_testz_ps(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mf64sse& x) { return !_mm_testz_pd(x.v, x.v); }
+
+KFR_INTRINSIC bool bittestany(const mf32avx& x) { return !_mm256_testz_ps(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mf64avx& x) { return !_mm256_testz_pd(x.v, x.v); }
+
+KFR_INTRINSIC bool bittestany(const mu8avx& x) { return !_mm256_testz_si256(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mu16avx& x) { return !_mm256_testz_si256(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mu32avx& x) { return !_mm256_testz_si256(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mu64avx& x) { return !_mm256_testz_si256(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mi8avx& x) { return !_mm256_testz_si256(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mi16avx& x) { return !_mm256_testz_si256(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mi32avx& x) { return !_mm256_testz_si256(x.v, x.v); }
+KFR_INTRINSIC bool bittestany(const mi64avx& x) { return !_mm256_testz_si256(x.v, x.v); }
+
+// horizontal AND
+KFR_INTRINSIC bool bittestall(const mf32sse& x) { return _mm_testc_ps(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mf64sse& x) { return _mm_testc_pd(x.v, allonesvector(x).v); }
+
+KFR_INTRINSIC bool bittestall(const mf32avx& x) { return _mm256_testc_ps(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mf64avx& x) { return _mm256_testc_pd(x.v, allonesvector(x).v); }
+
+KFR_INTRINSIC bool bittestall(const mu8avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mu16avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mu32avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mu64avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mi8avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mi16avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mi32avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
+KFR_INTRINSIC bool bittestall(const mi64avx& x) { return _mm256_testc_si256(x.v, allonesvector(x).v); }
+
+#if defined CMT_ARCH_AVX512
+// horizontal OR
+KFR_INTRINSIC bool bittestany(const mf32avx512& x) { return _mm512_movepi32_mask(_mm512_castps_si512(x.v)); }
+KFR_INTRINSIC bool bittestany(const mf64avx512& x) { return _mm512_movepi64_mask(_mm512_castpd_si512(x.v)); }
+KFR_INTRINSIC bool bittestany(const mu8avx512& x) { return _mm512_movepi8_mask(x.v); }
+KFR_INTRINSIC bool bittestany(const mu16avx512& x) { return _mm512_movepi16_mask(x.v); }
+KFR_INTRINSIC bool bittestany(const mu32avx512& x) { return _mm512_movepi32_mask(x.v); }
+KFR_INTRINSIC bool bittestany(const mu64avx512& x) { return _mm512_movepi64_mask(x.v); }
+KFR_INTRINSIC bool bittestany(const mi8avx512& x) { return _mm512_movepi8_mask(x.v); }
+KFR_INTRINSIC bool bittestany(const mi16avx512& x) { return _mm512_movepi16_mask(x.v); }
+KFR_INTRINSIC bool bittestany(const mi32avx512& x) { return _mm512_movepi32_mask(x.v); }
+KFR_INTRINSIC bool bittestany(const mi64avx512& x) { return _mm512_movepi64_mask(x.v); }
+
+// horizontal AND
+KFR_INTRINSIC bool bittestall(const mf32avx512& x)
+{
+ return !~_mm512_movepi32_mask(_mm512_castps_si512(x.v));
+}
+KFR_INTRINSIC bool bittestall(const mf64avx512& x)
+{
+ return !~_mm512_movepi64_mask(_mm512_castpd_si512(x.v));
+}
+KFR_INTRINSIC bool bittestall(const mu8avx512& x) { return !~_mm512_movepi8_mask(x.v); }
+KFR_INTRINSIC bool bittestall(const mu16avx512& x) { return !~_mm512_movepi16_mask(x.v); }
+KFR_INTRINSIC bool bittestall(const mu32avx512& x) { return !uint16_t(~_mm512_movepi32_mask(x.v)); }
+KFR_INTRINSIC bool bittestall(const mu64avx512& x) { return !uint8_t(~_mm512_movepi64_mask(x.v)); }
+KFR_INTRINSIC bool bittestall(const mi8avx512& x) { return !~_mm512_movepi8_mask(x.v); }
+KFR_INTRINSIC bool bittestall(const mi16avx512& x) { return !~_mm512_movepi16_mask(x.v); }
+KFR_INTRINSIC bool bittestall(const mi32avx512& x) { return !uint16_t(~_mm512_movepi32_mask(x.v)); }
+KFR_INTRINSIC bool bittestall(const mi64avx512& x) { return !uint8_t(~_mm512_movepi64_mask(x.v)); }
+
+#endif
+
+#elif defined CMT_ARCH_SSE41
+KFR_INTRINSIC bool bittestany(const mf32sse& x)
+{
+ return !_mm_testz_si128(bitcast<bit<u8>>(x).v, bitcast<bit<u8>>(x).v);
+}
+KFR_INTRINSIC bool bittestany(const mf64sse& x)
+{
+ return !_mm_testz_si128(bitcast<bit<u8>>(x).v, bitcast<bit<u8>>(x).v);
+}
+KFR_INTRINSIC bool bittestall(const mf32sse& x)
+{
+ return _mm_testc_si128(bitcast<bit<u8>>(x).v, allonesvector(bitcast<bit<u8>>(x)).v);
+}
+KFR_INTRINSIC bool bittestall(const mf64sse& x)
+{
+ return _mm_testc_si128(bitcast<bit<u8>>(x).v, allonesvector(bitcast<bit<u8>>(x)).v);
+}
+#endif
+
+#if !defined CMT_ARCH_SSE41
+
+KFR_INTRINSIC bool bittestany(const mf32sse& x) { return _mm_movemask_ps(x.v); }
+KFR_INTRINSIC bool bittestany(const mf64sse& x) { return _mm_movemask_pd(x.v); }
+KFR_INTRINSIC bool bittestany(const mu8sse& x) { return _mm_movemask_epi8(x.v); }
+KFR_INTRINSIC bool bittestany(const mu16sse& x) { return _mm_movemask_epi8(x.v); }
+KFR_INTRINSIC bool bittestany(const mu32sse& x) { return _mm_movemask_epi8(x.v); }
+KFR_INTRINSIC bool bittestany(const mu64sse& x) { return _mm_movemask_epi8(x.v); }
+KFR_INTRINSIC bool bittestany(const mi8sse& x) { return _mm_movemask_epi8(x.v); }
+KFR_INTRINSIC bool bittestany(const mi16sse& x) { return _mm_movemask_epi8(x.v); }
+KFR_INTRINSIC bool bittestany(const mi32sse& x) { return _mm_movemask_epi8(x.v); }
+KFR_INTRINSIC bool bittestany(const mi64sse& x) { return _mm_movemask_epi8(x.v); }
+
+KFR_INTRINSIC bool bittestall(const mf32sse& x) { return !_mm_movemask_ps((~x).v); }
+KFR_INTRINSIC bool bittestall(const mf64sse& x) { return !_mm_movemask_pd((~x).v); }
+KFR_INTRINSIC bool bittestall(const mu8sse& x) { return !_mm_movemask_epi8((~x).v); }
+KFR_INTRINSIC bool bittestall(const mu16sse& x) { return !_mm_movemask_epi8((~x).v); }
+KFR_INTRINSIC bool bittestall(const mu32sse& x) { return !_mm_movemask_epi8((~x).v); }
+KFR_INTRINSIC bool bittestall(const mu64sse& x) { return !_mm_movemask_epi8((~x).v); }
+KFR_INTRINSIC bool bittestall(const mi8sse& x) { return !_mm_movemask_epi8((~x).v); }
+KFR_INTRINSIC bool bittestall(const mi16sse& x) { return !_mm_movemask_epi8((~x).v); }
+KFR_INTRINSIC bool bittestall(const mi32sse& x) { return !_mm_movemask_epi8((~x).v); }
+KFR_INTRINSIC bool bittestall(const mi64sse& x) { return !_mm_movemask_epi8((~x).v); }
+#endif
+
+template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T>)>
+KFR_INTRINSIC bool bittestall(const mask<T, N>& a)
+{
+ return bittestall(expand_simd(a, bit<T>(true)));
+}
+template <typename T, size_t N, KFR_ENABLE_IF(N >= vector_width<T>), typename = void>
+KFR_INTRINSIC bool bittestall(const mask<T, N>& a)
+{
+ return bittestall(low(a)) && bittestall(high(a));
+}
+
+template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T>)>
+KFR_INTRINSIC bool bittestany(const mask<T, N>& a)
+{
+ return bittestany(expand_simd(a, bit<T>(false)));
+}
+template <typename T, size_t N, KFR_ENABLE_IF(N >= vector_width<T>), typename = void>
+KFR_INTRINSIC bool bittestany(const mask<T, N>& a)
+{
+ return bittestany(low(a)) || bittestany(high(a));
+}
+
+#elif CMT_ARCH_NEON && defined KFR_NATIVE_INTRINSICS
+
+KFR_INTRINSIC bool bittestall(const mu32neon& a)
+{
+ const uint32x2_t tmp = vand_u32(vget_low_u32(a.v), vget_high_u32(a.v));
+ return vget_lane_u32(vpmin_u32(tmp, tmp), 0) == 0xFFFFFFFFu;
+}
+
+KFR_INTRINSIC bool bittestany(const mu32neon& a)
+{
+ const uint32x2_t tmp = vorr_u32(vget_low_u32(a.v), vget_high_u32(a.v));
+ return vget_lane_u32(vpmax_u32(tmp, tmp), 0) != 0;
+}
+KFR_INTRINSIC bool bittestany(const mu8neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
+KFR_INTRINSIC bool bittestany(const mu16neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
+KFR_INTRINSIC bool bittestany(const mu64neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
+KFR_INTRINSIC bool bittestany(const mi8neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
+KFR_INTRINSIC bool bittestany(const mi16neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
+KFR_INTRINSIC bool bittestany(const mi64neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
+KFR_INTRINSIC bool bittestany(const mf32neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
+KFR_INTRINSIC bool bittestany(const mf64neon& a) { return bittestany(bitcast<bit<u32>>(a)); }
+
+KFR_INTRINSIC bool bittestall(const mu8neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
+KFR_INTRINSIC bool bittestall(const mu16neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
+KFR_INTRINSIC bool bittestall(const mu64neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
+KFR_INTRINSIC bool bittestall(const mi8neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
+KFR_INTRINSIC bool bittestall(const mi16neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
+KFR_INTRINSIC bool bittestall(const mi64neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
+KFR_INTRINSIC bool bittestall(const mf32neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
+KFR_INTRINSIC bool bittestall(const mf64neon& a) { return bittestall(bitcast<bit<u32>>(a)); }
+
+template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T>)>
+KFR_INTRINSIC bool bittestall(const mask<T, N>& a)
+{
+ return bittestall(expand_simd(a, bit<T>(true)));
+}
+template <typename T, size_t N, KFR_ENABLE_IF(N >= vector_width<T>), typename = void>
+KFR_INTRINSIC bool bittestall(const mask<T, N>& a)
+{
+ return bittestall(low(a)) && bittestall(high(a));
+}
+
+template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T>)>
+KFR_INTRINSIC bool bittestany(const mask<T, N>& a)
+{
+ return bittestany(expand_simd(a, bit<T>(false)));
+}
+template <typename T, size_t N, KFR_ENABLE_IF(N >= vector_width<T>), typename = void>
+KFR_INTRINSIC bool bittestany(const mask<T, N>& a)
+{
+ return bittestany(low(a)) || bittestany(high(a));
+}
+
+#else
+
+template <typename T, size_t N>
+KFR_INTRINSIC bitmask<N> getmask(const mask<T, N>& x)
+{
+ typename bitmask<N>::type val = 0;
+ for (size_t i = 0; i < N; i++)
+ {
+ val |= static_cast<int>(x[i]) << i;
+ }
+ return val;
+}
+
+template <typename T, size_t N>
+KFR_INTRINSIC bool bittestany(const mask<T, N>& x)
+{
+ return getmask(x).value;
+}
+template <typename T, size_t N>
+KFR_INTRINSIC bool bittestany(const mask<T, N>& x, const mask<T, N>& y)
+{
+ return bittestany(x & y);
+}
+
+template <typename T, size_t N>
+KFR_INTRINSIC bool bittestall(const mask<T, N>& x)
+{
+ return !getmask(~x).value;
+}
+template <typename T, size_t N>
+KFR_INTRINSIC bool bittestall(const mask<T, N>& x, const mask<T, N>& y)
+{
+ return !bittestany(~x & y);
+}
+#endif
+} // namespace intrinsics
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/include/kfr/simd/impl/min_max.hpp b/include/kfr/simd/impl/min_max.hpp
@@ -0,0 +1,236 @@
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../abs.hpp"
+#include "../operators.hpp"
+#include "../select.hpp"
+#include "function.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+namespace intrinsics
+{
+
+#if defined CMT_ARCH_SSE2 && defined KFR_NATIVE_INTRINSICS
+
+KFR_INTRINSIC f32sse min(const f32sse& x, const f32sse& y) { return _mm_min_ps(x.v, y.v); }
+KFR_INTRINSIC f64sse min(const f64sse& x, const f64sse& y) { return _mm_min_pd(x.v, y.v); }
+KFR_INTRINSIC u8sse min(const u8sse& x, const u8sse& y) { return _mm_min_epu8(x.v, y.v); }
+KFR_INTRINSIC i16sse min(const i16sse& x, const i16sse& y) { return _mm_min_epi16(x.v, y.v); }
+
+KFR_INTRINSIC f32sse max(const f32sse& x, const f32sse& y) { return _mm_max_ps(x.v, y.v); }
+KFR_INTRINSIC f64sse max(const f64sse& x, const f64sse& y) { return _mm_max_pd(x.v, y.v); }
+KFR_INTRINSIC u8sse max(const u8sse& x, const u8sse& y) { return _mm_max_epu8(x.v, y.v); }
+KFR_INTRINSIC i16sse max(const i16sse& x, const i16sse& y) { return _mm_max_epi16(x.v, y.v); }
+
+#if defined CMT_ARCH_AVX2
+KFR_INTRINSIC u8avx min(const u8avx& x, const u8avx& y) { return _mm256_min_epu8(x.v, y.v); }
+KFR_INTRINSIC i16avx min(const i16avx& x, const i16avx& y) { return _mm256_min_epi16(x.v, y.v); }
+KFR_INTRINSIC i8avx min(const i8avx& x, const i8avx& y) { return _mm256_min_epi8(x.v, y.v); }
+KFR_INTRINSIC u16avx min(const u16avx& x, const u16avx& y) { return _mm256_min_epu16(x.v, y.v); }
+KFR_INTRINSIC i32avx min(const i32avx& x, const i32avx& y) { return _mm256_min_epi32(x.v, y.v); }
+KFR_INTRINSIC u32avx min(const u32avx& x, const u32avx& y) { return _mm256_min_epu32(x.v, y.v); }
+
+KFR_INTRINSIC u8avx max(const u8avx& x, const u8avx& y) { return _mm256_max_epu8(x.v, y.v); }
+KFR_INTRINSIC i16avx max(const i16avx& x, const i16avx& y) { return _mm256_max_epi16(x.v, y.v); }
+KFR_INTRINSIC i8avx max(const i8avx& x, const i8avx& y) { return _mm256_max_epi8(x.v, y.v); }
+KFR_INTRINSIC u16avx max(const u16avx& x, const u16avx& y) { return _mm256_max_epu16(x.v, y.v); }
+KFR_INTRINSIC i32avx max(const i32avx& x, const i32avx& y) { return _mm256_max_epi32(x.v, y.v); }
+KFR_INTRINSIC u32avx max(const u32avx& x, const u32avx& y) { return _mm256_max_epu32(x.v, y.v); }
+
+#endif
+
+#if defined CMT_ARCH_AVX512
+KFR_INTRINSIC f32avx512 min(const f32avx512& x, const f32avx512& y) { return _mm512_min_ps(x.v, y.v); }
+KFR_INTRINSIC f64avx512 min(const f64avx512& x, const f64avx512& y) { return _mm512_min_pd(x.v, y.v); }
+KFR_INTRINSIC f32avx512 max(const f32avx512& x, const f32avx512& y) { return _mm512_max_ps(x.v, y.v); }
+KFR_INTRINSIC f64avx512 max(const f64avx512& x, const f64avx512& y) { return _mm512_max_pd(x.v, y.v); }
+
+KFR_INTRINSIC u8avx512 min(const u8avx512& x, const u8avx512& y) { return _mm512_min_epu8(x.v, y.v); }
+KFR_INTRINSIC i16avx512 min(const i16avx512& x, const i16avx512& y) { return _mm512_min_epi16(x.v, y.v); }
+KFR_INTRINSIC i8avx512 min(const i8avx512& x, const i8avx512& y) { return _mm512_min_epi8(x.v, y.v); }
+KFR_INTRINSIC u16avx512 min(const u16avx512& x, const u16avx512& y) { return _mm512_min_epu16(x.v, y.v); }
+KFR_INTRINSIC i32avx512 min(const i32avx512& x, const i32avx512& y) { return _mm512_min_epi32(x.v, y.v); }
+KFR_INTRINSIC u32avx512 min(const u32avx512& x, const u32avx512& y) { return _mm512_min_epu32(x.v, y.v); }
+KFR_INTRINSIC u8avx512 max(const u8avx512& x, const u8avx512& y) { return _mm512_max_epu8(x.v, y.v); }
+KFR_INTRINSIC i16avx512 max(const i16avx512& x, const i16avx512& y) { return _mm512_max_epi16(x.v, y.v); }
+KFR_INTRINSIC i8avx512 max(const i8avx512& x, const i8avx512& y) { return _mm512_max_epi8(x.v, y.v); }
+KFR_INTRINSIC u16avx512 max(const u16avx512& x, const u16avx512& y) { return _mm512_max_epu16(x.v, y.v); }
+KFR_INTRINSIC i32avx512 max(const i32avx512& x, const i32avx512& y) { return _mm512_max_epi32(x.v, y.v); }
+KFR_INTRINSIC u32avx512 max(const u32avx512& x, const u32avx512& y) { return _mm512_max_epu32(x.v, y.v); }
+KFR_INTRINSIC i64avx512 min(const i64avx512& x, const i64avx512& y) { return _mm512_min_epi64(x.v, y.v); }
+KFR_INTRINSIC u64avx512 min(const u64avx512& x, const u64avx512& y) { return _mm512_min_epu64(x.v, y.v); }
+KFR_INTRINSIC i64avx512 max(const i64avx512& x, const i64avx512& y) { return _mm512_max_epi64(x.v, y.v); }
+KFR_INTRINSIC u64avx512 max(const u64avx512& x, const u64avx512& y) { return _mm512_max_epu64(x.v, y.v); }
+
+KFR_INTRINSIC i64avx min(const i64avx& x, const i64avx& y) { return _mm256_min_epi64(x.v, y.v); }
+KFR_INTRINSIC u64avx min(const u64avx& x, const u64avx& y) { return _mm256_min_epu64(x.v, y.v); }
+KFR_INTRINSIC i64avx max(const i64avx& x, const i64avx& y) { return _mm256_max_epi64(x.v, y.v); }
+KFR_INTRINSIC u64avx max(const u64avx& x, const u64avx& y) { return _mm256_max_epu64(x.v, y.v); }
+
+KFR_INTRINSIC i64sse min(const i64sse& x, const i64sse& y) { return _mm_min_epi64(x.v, y.v); }
+KFR_INTRINSIC u64sse min(const u64sse& x, const u64sse& y) { return _mm_min_epu64(x.v, y.v); }
+KFR_INTRINSIC i64sse max(const i64sse& x, const i64sse& y) { return _mm_max_epi64(x.v, y.v); }
+KFR_INTRINSIC u64sse max(const u64sse& x, const u64sse& y) { return _mm_max_epu64(x.v, y.v); }
+#else
+KFR_INTRINSIC i64sse min(const i64sse& x, const i64sse& y) { return select(x < y, x, y); }
+KFR_INTRINSIC u64sse min(const u64sse& x, const u64sse& y) { return select(x < y, x, y); }
+KFR_INTRINSIC i64sse max(const i64sse& x, const i64sse& y) { return select(x > y, x, y); }
+KFR_INTRINSIC u64sse max(const u64sse& x, const u64sse& y) { return select(x > y, x, y); }
+KFR_INTRINSIC i64avx min(const i64avx& x, const i64avx& y) { return select(x < y, x, y); }
+KFR_INTRINSIC u64avx min(const u64avx& x, const u64avx& y) { return select(x < y, x, y); }
+KFR_INTRINSIC i64avx max(const i64avx& x, const i64avx& y) { return select(x > y, x, y); }
+KFR_INTRINSIC u64avx max(const u64avx& x, const u64avx& y) { return select(x > y, x, y); }
+#endif
+
+#if defined CMT_ARCH_AVX
+KFR_INTRINSIC f32avx min(const f32avx& x, const f32avx& y) { return _mm256_min_ps(x.v, y.v); }
+KFR_INTRINSIC f64avx min(const f64avx& x, const f64avx& y) { return _mm256_min_pd(x.v, y.v); }
+KFR_INTRINSIC f32avx max(const f32avx& x, const f32avx& y) { return _mm256_max_ps(x.v, y.v); }
+KFR_INTRINSIC f64avx max(const f64avx& x, const f64avx& y) { return _mm256_max_pd(x.v, y.v); }
+#endif
+
+#if defined CMT_ARCH_SSE41
+KFR_INTRINSIC i8sse min(const i8sse& x, const i8sse& y) { return _mm_min_epi8(x.v, y.v); }
+KFR_INTRINSIC u16sse min(const u16sse& x, const u16sse& y) { return _mm_min_epu16(x.v, y.v); }
+KFR_INTRINSIC i32sse min(const i32sse& x, const i32sse& y) { return _mm_min_epi32(x.v, y.v); }
+KFR_INTRINSIC u32sse min(const u32sse& x, const u32sse& y) { return _mm_min_epu32(x.v, y.v); }
+
+KFR_INTRINSIC i8sse max(const i8sse& x, const i8sse& y) { return _mm_max_epi8(x.v, y.v); }
+KFR_INTRINSIC u16sse max(const u16sse& x, const u16sse& y) { return _mm_max_epu16(x.v, y.v); }
+KFR_INTRINSIC i32sse max(const i32sse& x, const i32sse& y) { return _mm_max_epi32(x.v, y.v); }
+KFR_INTRINSIC u32sse max(const u32sse& x, const u32sse& y) { return _mm_max_epu32(x.v, y.v); }
+#else
+KFR_INTRINSIC i8sse min(const i8sse& x, const i8sse& y) { return select(x < y, x, y); }
+KFR_INTRINSIC u16sse min(const u16sse& x, const u16sse& y) { return select(x < y, x, y); }
+KFR_INTRINSIC i32sse min(const i32sse& x, const i32sse& y) { return select(x < y, x, y); }
+KFR_INTRINSIC u32sse min(const u32sse& x, const u32sse& y) { return select(x < y, x, y); }
+
+KFR_INTRINSIC i8sse max(const i8sse& x, const i8sse& y) { return select(x > y, x, y); }
+KFR_INTRINSIC u16sse max(const u16sse& x, const u16sse& y) { return select(x > y, x, y); }
+KFR_INTRINSIC i32sse max(const i32sse& x, const i32sse& y) { return select(x > y, x, y); }
+KFR_INTRINSIC u32sse max(const u32sse& x, const u32sse& y) { return select(x > y, x, y); }
+
+#endif
+
+KFR_HANDLE_ALL_SIZES_2(min)
+KFR_HANDLE_ALL_SIZES_2(max)
+
+#elif defined CMT_ARCH_NEON && defined KFR_NATIVE_INTRINSICS
+
+KFR_INTRINSIC i8neon min(const i8neon& x, const i8neon& y) { return vminq_s8(x.v, y.v); }
+KFR_INTRINSIC u8neon min(const u8neon& x, const u8neon& y) { return vminq_u8(x.v, y.v); }
+KFR_INTRINSIC i16neon min(const i16neon& x, const i16neon& y) { return vminq_s16(x.v, y.v); }
+KFR_INTRINSIC u16neon min(const u16neon& x, const u16neon& y) { return vminq_u16(x.v, y.v); }
+KFR_INTRINSIC i32neon min(const i32neon& x, const i32neon& y) { return vminq_s32(x.v, y.v); }
+KFR_INTRINSIC u32neon min(const u32neon& x, const u32neon& y) { return vminq_u32(x.v, y.v); }
+KFR_INTRINSIC i64neon min(const i64neon& x, const i64neon& y) { return select(x < y, x, y); }
+KFR_INTRINSIC u64neon min(const u64neon& x, const u64neon& y) { return select(x < y, x, y); }
+
+KFR_INTRINSIC i8neon max(const i8neon& x, const i8neon& y) { return vmaxq_s8(x.v, y.v); }
+KFR_INTRINSIC u8neon max(const u8neon& x, const u8neon& y) { return vmaxq_u8(x.v, y.v); }
+KFR_INTRINSIC i16neon max(const i16neon& x, const i16neon& y) { return vmaxq_s16(x.v, y.v); }
+KFR_INTRINSIC u16neon max(const u16neon& x, const u16neon& y) { return vmaxq_u16(x.v, y.v); }
+KFR_INTRINSIC i32neon max(const i32neon& x, const i32neon& y) { return vmaxq_s32(x.v, y.v); }
+KFR_INTRINSIC u32neon max(const u32neon& x, const u32neon& y) { return vmaxq_u32(x.v, y.v); }
+KFR_INTRINSIC i64neon max(const i64neon& x, const i64neon& y) { return select(x > y, x, y); }
+KFR_INTRINSIC u64neon max(const u64neon& x, const u64neon& y) { return select(x > y, x, y); }
+
+KFR_INTRINSIC f32neon min(const f32neon& x, const f32neon& y) { return vminq_f32(x.v, y.v); }
+KFR_INTRINSIC f32neon max(const f32neon& x, const f32neon& y) { return vmaxq_f32(x.v, y.v); }
+#if defined CMT_ARCH_NEON64
+KFR_INTRINSIC f64neon min(const f64neon& x, const f64neon& y) { return vminq_f64(x.v, y.v); }
+KFR_INTRINSIC f64neon max(const f64neon& x, const f64neon& y) { return vmaxq_f64(x.v, y.v); }
+#else
+KFR_INTRINSIC f64neon min(const f64neon& x, const f64neon& y) { return select(x < y, x, y); }
+KFR_INTRINSIC f64neon max(const f64neon& x, const f64neon& y) { return select(x > y, x, y); }
+#endif
+
+KFR_HANDLE_ALL_SIZES_2(min)
+KFR_HANDLE_ALL_SIZES_2(max)
+
+#else
+
+// fallback
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> min(const vec<T, N>& x, const vec<T, N>& y)
+{
+ return select(x < y, x, y);
+}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> max(const vec<T, N>& x, const vec<T, N>& y)
+{
+ return select(x > y, x, y);
+}
+#endif
+
+template <typename T>
+KFR_INTRINSIC T min(initialvalue<T>)
+{
+ return std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity()
+ : std::numeric_limits<T>::max();
+}
+template <typename T>
+KFR_INTRINSIC T max(initialvalue<T>)
+{
+ return std::numeric_limits<T>::has_infinity ? -std::numeric_limits<T>::infinity()
+ : std::numeric_limits<T>::min();
+}
+template <typename T>
+KFR_INTRINSIC T absmin(initialvalue<T>)
+{
+ return std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity()
+ : std::numeric_limits<T>::max();
+}
+template <typename T>
+KFR_INTRINSIC T absmax(initialvalue<T>)
+{
+ return 0;
+}
+
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> absmin(const vec<T, N>& x, const vec<T, N>& y)
+{
+ return min(abs(x), abs(y));
+}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> absmax(const vec<T, N>& x, const vec<T, N>& y)
+{
+ return max(abs(x), abs(y));
+}
+
+KFR_HANDLE_SCALAR(min)
+KFR_HANDLE_SCALAR(max)
+KFR_HANDLE_SCALAR(absmin)
+KFR_HANDLE_SCALAR(absmax)
+} // namespace intrinsics
+KFR_I_FN(min)
+KFR_I_FN(max)
+KFR_I_FN(absmin)
+KFR_I_FN(absmax)
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/include/kfr/simd/impl/operators.hpp b/include/kfr/simd/impl/operators.hpp
@@ -33,83 +33,15 @@
#include "basicoperators_generic.hpp"
#endif
+#include "basicoperators_complex.hpp"
+
namespace kfr
{
inline namespace CMT_ARCH_NAME
{
-
namespace intrinsics
{
-template <typename T, size_t N>
-KFR_INTRINSIC vec<complex<T>, N> neg(const vec<complex<T>, N>& x)
-{
- return neg(x.flatten()).v;
-}
-
-template <typename T, size_t N>
-KFR_INTRINSIC vec<complex<T>, N> add(const vec<complex<T>, N>& x, const vec<complex<T>, N>& y)
-{
- return add(x.flatten(), y.flatten()).v;
-}
-
-template <typename T, size_t N>
-KFR_INTRINSIC vec<complex<T>, N> sub(const vec<complex<T>, N>& x, const vec<complex<T>, N>& y)
-{
- return sub(x.flatten(), y.flatten()).v;
-}
-
-template <typename T, size_t N>
-KFR_INTRINSIC vec<complex<T>, N> mul(const vec<complex<T>, N>& x, const vec<complex<T>, N>& y)
-{
- const vec<T, (N * 2)> xx = x.v;
- const vec<T, (N * 2)> yy = y.v;
- return subadd(mul(xx, dupeven(yy)), mul(swap<2>(xx), dupodd(yy))).v;
-}
-
-template <typename T, size_t N>
-KFR_INTRINSIC vec<complex<T>, N> div(const vec<complex<T>, N>& x, const vec<complex<T>, N>& y)
-{
- const vec<T, (N * 2)> xx = x.v;
- const vec<T, (N * 2)> yy = y.v;
- const vec<T, (N * 2)> m = (add(sqr(dupeven(yy)), sqr(dupodd(yy))));
- return swap<2>(subadd(mul(swap<2>(xx), dupeven(yy)), mul(xx, dupodd(yy))) / m).v;
-}
-
-template <typename T, size_t N>
-KFR_INTRINSIC vec<complex<T>, N> bor(const vec<complex<T>, N>& x, const vec<complex<T>, N>& y)
-{
- return bor(x.flatten(), y.flatten()).v;
-}
-template <typename T, size_t N>
-KFR_INTRINSIC vec<complex<T>, N> bxor(const vec<complex<T>, N>& x, const vec<complex<T>, N>& y)
-{
- return bxor(x.flatten(), y.flatten()).v;
-}
-template <typename T, size_t N>
-KFR_INTRINSIC vec<complex<T>, N> band(const vec<complex<T>, N>& x, const vec<complex<T>, N>& y)
-{
- return band(x.flatten(), y.flatten()).v;
-}
-
-#define KFR_COMPLEX_OP_CVT(fn) \
- template <typename T, size_t N> \
- KFR_INTRINSIC vec<complex<T>, N> fn(const vec<complex<T>, N>& x, const complex<T>& y) \
- { \
- return fn(x, vec<complex<T>, N>(y)); \
- } \
- template <typename T, size_t N> \
- KFR_INTRINSIC vec<complex<T>, N> fn(const complex<T>& x, const vec<complex<T>, N>& y) \
- { \
- return fn(vec<complex<T>, N>(x), y); \
- }
-
-KFR_COMPLEX_OP_CVT(mul)
-KFR_COMPLEX_OP_CVT(div)
-KFR_COMPLEX_OP_CVT(band)
-KFR_COMPLEX_OP_CVT(bxor)
-KFR_COMPLEX_OP_CVT(bor)
-
#define KFR_VECVEC_OP1(fn) \
template <typename T1, size_t N1, size_t N2> \
KFR_INTRINSIC vec<vec<T1, N1>, N2> fn(const vec<vec<T1, N1>, N2>& x) \
@@ -118,91 +50,35 @@ KFR_COMPLEX_OP_CVT(bor)
}
#define KFR_VECVEC_OP2(fn) \
- template <typename T1, typename T2, size_t N1, size_t N2, typename C = common_type<T1, T2>, \
+ template <typename T1, typename T2, size_t N1, size_t N2, typename C = std::common_type_t<T1, T2>, \
KFR_ENABLE_IF(is_simd_type<C>)> \
KFR_INTRINSIC vec<vec<C, N1>, N2> fn(const vec<vec<T1, N1>, N2>& x, const vec<vec<T2, N1>, N2>& y) \
{ \
- return fn(innercast<C>(x.flatten()), innercast<C>(y.flatten())).v; \
+ return fn(broadcastto<C>(x.flatten()), broadcastto<C>(y.flatten())).v; \
} \
- template <typename T1, typename T2, size_t N1, size_t N2, typename C = common_type<T1, T2>, \
+ template <typename T1, typename T2, size_t N1, size_t N2, typename C = std::common_type_t<T1, T2>, \
KFR_ENABLE_IF(is_simd_type<C>)> \
KFR_INTRINSIC vec<vec<C, N1>, N2> fn(const vec<vec<T1, N1>, N2>& x, const T2& y) \
{ \
- return fn(innercast<C>(x.flatten()), innercast<C>(y)).v; \
+ return fn(broadcastto<C>(x.flatten()), broadcastto<C>(y)).v; \
} \
- template <typename T1, typename T2, size_t N1, size_t N2, typename C = common_type<T1, T2>, \
+ template <typename T1, typename T2, size_t N1, size_t N2, typename C = std::common_type_t<T1, T2>, \
KFR_ENABLE_IF(is_simd_type<C>)> \
KFR_INTRINSIC vec<vec<C, N1>, N2> fn(const vec<vec<T1, N1>, N2>& x, const vec<T2, N1>& y) \
{ \
- return fn(innercast<C>(x.flatten()), repeat<N2>(innercast<C>(y.flatten()))).v; \
+ return fn(broadcastto<C>(x.flatten()), repeat<N2>(broadcastto<C>(y.flatten()))).v; \
} \
- template <typename T1, typename T2, size_t N1, size_t N2, typename C = common_type<T1, T2>, \
+ template <typename T1, typename T2, size_t N1, size_t N2, typename C = std::common_type_t<T1, T2>, \
KFR_ENABLE_IF(is_simd_type<C>)> \
KFR_INTRINSIC vec<vec<C, N1>, N2> fn(const T1& x, const vec<vec<T2, N1>, N2>& y) \
{ \
- return fn(innercast<C>(x), innercast<C>(y.flatten())).v; \
+ return fn(broadcastto<C>(x), broadcastto<C>(y.flatten())).v; \
} \
- template <typename T1, typename T2, size_t N1, size_t N2, typename C = common_type<T1, T2>, \
+ template <typename T1, typename T2, size_t N1, size_t N2, typename C = std::common_type_t<T1, T2>, \
KFR_ENABLE_IF(is_simd_type<C>)> \
KFR_INTRINSIC vec<vec<C, N1>, N2> fn(const vec<T1, N1>& x, const vec<vec<T2, N1>, N2>& y) \
{ \
- return fn(repeat<N2>(innercast<C>(x.flatten())), innercast<C>(y.flatten())).v; \
- }
-
-#define KFR_VECVECVEC_OP1(fn) \
- template <typename T1, size_t N1, size_t N2, size_t N3> \
- KFR_INTRINSIC vec<vec<vec<T1, N1>, N2>, N3> fn(const vec<vec<vec<T1, N1>, N2>, N3>& x) \
- { \
- return fn(x.flatten()).v; \
- }
-
-#define KFR_VECVECVEC_OP2(fn) \
- template <typename T1, typename T2, size_t N1, size_t N2, size_t N3, typename C = common_type<T1, T2>, \
- KFR_ENABLE_IF(is_simd_type<C>)> \
- KFR_INTRINSIC vec<vec<vec<C, N1>, N2>, N3> fn(const vec<vec<vec<T1, N1>, N2>, N3>& x, \
- const vec<vec<vec<T2, N1>, N2>, N3>& y) \
- { /* VVV @ VVV */ \
- return fn(innercast<C>(x.flatten()), innercast<C>(y.flatten())).v; \
- } \
- template <typename T1, typename T2, size_t N1, size_t N2, size_t N3, typename C = common_type<T1, T2>, \
- KFR_ENABLE_IF(is_simd_type<C>)> \
- KFR_INTRINSIC vec<vec<vec<C, N1>, N2>, N3> fn(const vec<vec<vec<T1, N1>, N2>, N3>& x, \
- const vec<vec<T2, N1>, N2>& y) \
- { /* VVV @ VV */ \
- return fn(innercast<C>(x.flatten()), repeat<N3>(innercast<C>(y.flatten()))).v; \
- } \
- template <typename T1, typename T2, size_t N1, size_t N2, size_t N3, typename C = common_type<T1, T2>, \
- KFR_ENABLE_IF(is_simd_type<C>)> \
- KFR_INTRINSIC vec<vec<vec<C, N1>, N2>, N3> fn(const vec<vec<T1, N1>, N2>& x, \
- const vec<vec<vec<T2, N1>, N2>, N3>& y) \
- { /* VV @ VVV */ \
- return fn(repeat<N3>(innercast<C>(x.flatten())), innercast<C>(y.flatten())).v; \
- } \
- template <typename T1, typename T2, size_t N1, size_t N2, size_t N3, typename C = common_type<T1, T2>, \
- KFR_ENABLE_IF(is_simd_type<C>)> \
- KFR_INTRINSIC vec<vec<vec<C, N1>, N2>, N3> fn(const vec<vec<vec<T1, N1>, N2>, N3>& x, const T2& y) \
- { /* VVV @ S */ \
- return fn(innercast<C>(x.flatten()), innercast<C>(y)).v; \
- } \
- template <typename T1, typename T2, size_t N1, size_t N2, size_t N3, typename C = common_type<T1, T2>, \
- KFR_ENABLE_IF(is_simd_type<C>)> \
- KFR_INTRINSIC vec<vec<vec<C, N1>, N2>, N3> fn(const vec<vec<vec<T1, N1>, N2>, N3>& x, \
- const vec<T2, N1>& y) \
- { /* VVV @ V */ \
- return fn(innercast<C>(x.flatten()), repeat<N2>(innercast<C>(y.flatten()))).v; \
- } \
- template <typename T1, typename T2, size_t N1, size_t N2, size_t N3, typename C = common_type<T1, T2>, \
- KFR_ENABLE_IF(is_simd_type<C>)> \
- KFR_INTRINSIC vec<vec<vec<C, N1>, N2>, N3> fn(const T1& x, const vec<vec<vec<T2, N1>, N2>, N3>& y) \
- { /* S @ VVV */ \
- return fn(innercast<C>(x), innercast<C>(y.flatten())).v; \
- } \
- template <typename T1, typename T2, size_t N1, size_t N2, size_t N3, typename C = common_type<T1, T2>, \
- KFR_ENABLE_IF(is_simd_type<C>)> \
- KFR_INTRINSIC vec<vec<vec<C, N1>, N2>, N3> fn(const vec<T1, N1>& x, \
- const vec<vec<vec<T2, N1>, N2>, N3>& y) \
- { /* V @ VVV */ \
- return fn(repeat<N2>(innercast<C>(x.flatten())), innercast<C>(y.flatten())).v; \
+ return fn(repeat<N2>(broadcastto<C>(x.flatten())), broadcastto<C>(y.flatten())).v; \
}
KFR_VECVEC_OP1(neg)
@@ -211,20 +87,11 @@ KFR_VECVEC_OP2(add)
KFR_VECVEC_OP2(sub)
KFR_VECVEC_OP2(mul)
KFR_VECVEC_OP2(div)
+KFR_VECVEC_OP2(mod)
KFR_VECVEC_OP2(band)
KFR_VECVEC_OP2(bor)
KFR_VECVEC_OP2(bxor)
-KFR_VECVECVEC_OP1(neg)
-KFR_VECVECVEC_OP1(bnot)
-KFR_VECVECVEC_OP2(add)
-KFR_VECVECVEC_OP2(sub)
-KFR_VECVECVEC_OP2(mul)
-KFR_VECVECVEC_OP2(div)
-KFR_VECVECVEC_OP2(band)
-KFR_VECVECVEC_OP2(bor)
-KFR_VECVECVEC_OP2(bxor)
-
} // namespace intrinsics
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/include/kfr/simd/impl/round.hpp b/include/kfr/simd/impl/round.hpp
@@ -0,0 +1,282 @@
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../operators.hpp"
+#include "abs.hpp"
+#include "function.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+namespace intrinsics
+{
+
+#define KFR_mm_trunc_ps(V) _mm_round_ps((V), _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC)
+#define KFR_mm_roundnearest_ps(V) _mm_round_ps((V), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)
+#define KFR_mm_trunc_pd(V) _mm_round_pd((V), _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC)
+#define KFR_mm_roundnearest_pd(V) _mm_round_pd((V), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)
+
+#define KFR_mm_trunc_ss(V) _mm_round_ss(_mm_setzero_ps(), (V), _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC)
+#define KFR_mm_roundnearest_ss(V) \
+ _mm_round_ss(_mm_setzero_ps(), (V), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)
+#define KFR_mm_trunc_sd(V) _mm_round_sd(_mm_setzero_pd(), (V), _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC)
+#define KFR_mm_roundnearest_sd(V) \
+ _mm_round_sd(_mm_setzero_pd(), (V), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)
+
+#define KFR_mm_floor_ss(V) _mm_floor_ss(_mm_setzero_ps(), (V))
+#define KFR_mm_floor_sd(V) _mm_floor_sd(_mm_setzero_pd(), (V))
+#define KFR_mm_ceil_ss(V) _mm_ceil_ss(_mm_setzero_ps(), (V))
+#define KFR_mm_ceil_sd(V) _mm_ceil_sd(_mm_setzero_pd(), (V))
+
+#define KFR_mm256_trunc_ps(V) _mm256_round_ps((V), _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC)
+#define KFR_mm256_roundnearest_ps(V) _mm256_round_ps((V), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)
+#define KFR_mm256_trunc_pd(V) _mm256_round_pd((V), _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC)
+#define KFR_mm256_roundnearest_pd(V) _mm256_round_pd((V), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)
+
+#if defined CMT_ARCH_SSE41 && defined KFR_NATIVE_INTRINSICS
+
+KFR_INTRINSIC f32sse floor(const f32sse& value) { return _mm_floor_ps(value.v); }
+KFR_INTRINSIC f32sse ceil(const f32sse& value) { return _mm_ceil_ps(value.v); }
+KFR_INTRINSIC f32sse trunc(const f32sse& value) { return KFR_mm_trunc_ps(value.v); }
+KFR_INTRINSIC f32sse round(const f32sse& value) { return KFR_mm_roundnearest_ps(value.v); }
+KFR_INTRINSIC f64sse floor(const f64sse& value) { return _mm_floor_pd(value.v); }
+KFR_INTRINSIC f64sse ceil(const f64sse& value) { return _mm_ceil_pd(value.v); }
+KFR_INTRINSIC f64sse trunc(const f64sse& value) { return KFR_mm_trunc_pd(value.v); }
+KFR_INTRINSIC f64sse round(const f64sse& value) { return KFR_mm_roundnearest_pd(value.v); }
+KFR_INTRINSIC f32sse fract(const f32sse& x) { return x - floor(x); }
+KFR_INTRINSIC f64sse fract(const f64sse& x) { return x - floor(x); }
+
+#if defined CMT_ARCH_AVX
+
+KFR_INTRINSIC f32avx floor(const f32avx& value) { return _mm256_floor_ps(value.v); }
+KFR_INTRINSIC f32avx ceil(const f32avx& value) { return _mm256_ceil_ps(value.v); }
+KFR_INTRINSIC f32avx trunc(const f32avx& value) { return KFR_mm256_trunc_ps(value.v); }
+KFR_INTRINSIC f32avx round(const f32avx& value) { return KFR_mm256_roundnearest_ps(value.v); }
+KFR_INTRINSIC f64avx floor(const f64avx& value) { return _mm256_floor_pd(value.v); }
+KFR_INTRINSIC f64avx ceil(const f64avx& value) { return _mm256_ceil_pd(value.v); }
+KFR_INTRINSIC f64avx trunc(const f64avx& value) { return KFR_mm256_trunc_pd(value.v); }
+KFR_INTRINSIC f64avx round(const f64avx& value) { return KFR_mm256_roundnearest_pd(value.v); }
+KFR_INTRINSIC f32avx fract(const f32avx& x) { return x - floor(x); }
+KFR_INTRINSIC f64avx fract(const f64avx& x) { return x - floor(x); }
+
+#endif
+
+#if defined CMT_ARCH_AVX512
+
+KFR_INTRINSIC f32avx512 floor(const f32avx512& value)
+{
+ return _mm512_roundscale_ps(value.v, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC);
+}
+KFR_INTRINSIC f32avx512 ceil(const f32avx512& value)
+{
+ return _mm512_roundscale_ps(value.v, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC);
+}
+KFR_INTRINSIC f32avx512 trunc(const f32avx512& value)
+{
+ return _mm512_roundscale_ps(value.v, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC);
+}
+KFR_INTRINSIC f32avx512 round(const f32avx512& value)
+{
+ return _mm512_roundscale_ps(value.v, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+KFR_INTRINSIC f64avx512 floor(const f64avx512& value)
+{
+ return _mm512_roundscale_pd(value.v, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC);
+}
+KFR_INTRINSIC f64avx512 ceil(const f64avx512& value)
+{
+ return _mm512_roundscale_pd(value.v, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC);
+}
+KFR_INTRINSIC f64avx512 trunc(const f64avx512& value)
+{
+ return _mm512_roundscale_pd(value.v, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC);
+}
+KFR_INTRINSIC f64avx512 round(const f64avx512& value)
+{
+ return _mm512_roundscale_pd(value.v, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
+}
+KFR_INTRINSIC f32avx512 fract(const f32avx512& x) { return x - floor(x); }
+KFR_INTRINSIC f64avx512 fract(const f64avx512& x) { return x - floor(x); }
+#endif
+
+KFR_HANDLE_ALL_SIZES_1_IF(floor, is_f_class<T>)
+KFR_HANDLE_ALL_SIZES_1_IF(ceil, is_f_class<T>)
+KFR_HANDLE_ALL_SIZES_1_IF(round, is_f_class<T>)
+KFR_HANDLE_ALL_SIZES_1_IF(trunc, is_f_class<T>)
+KFR_HANDLE_ALL_SIZES_1_IF(fract, is_f_class<T>)
+
+#else
+
+// fallback
+
+template <typename T>
+constexpr inline T fp_precision_limit = 4503599627370496.0;
+template <>
+constexpr inline f32 fp_precision_limit<f32> = 16777216.0f;
+
+template <size_t N>
+KFR_INTRINSIC vec<f32, N> floor(const vec<f32, N>& x)
+{
+ vec<f32, N> t = broadcastto<f32>(broadcastto<i32>(x));
+ return select(abs(x) >= fp_precision_limit<f32>, x, t - select(x < t, 1.f, 0.f));
+}
+template <size_t N>
+KFR_INTRINSIC vec<f64, N> floor(const vec<f64, N>& x)
+{
+ vec<f64, N> t = broadcastto<f64>(broadcastto<i64>(x));
+ return select(abs(x) >= fp_precision_limit<f64>, x, t - select(x < t, 1., 0.));
+}
+template <size_t N>
+KFR_INTRINSIC vec<f32, N> ceil(const vec<f32, N>& x)
+{
+ vec<f32, N> t = broadcastto<f32>(broadcastto<i32>(x));
+ return select(abs(x) >= fp_precision_limit<f32>, x, t + select(x > t, 1.f, 0.f));
+}
+template <size_t N>
+KFR_INTRINSIC vec<f64, N> ceil(const vec<f64, N>& x)
+{
+ vec<f64, N> t = broadcastto<f64>(broadcastto<i64>(x));
+ return select(abs(x) >= fp_precision_limit<f64>, x, t + select(x > t, 1., 0.));
+}
+template <size_t N>
+KFR_INTRINSIC vec<f32, N> round(const vec<f32, N>& x)
+{
+ return select(abs(x) >= fp_precision_limit<f32>, x,
+ broadcastto<f32>(broadcastto<i32>(x + mulsign(broadcast<N>(0.5f), x))));
+}
+template <size_t N>
+KFR_INTRINSIC vec<f64, N> round(const vec<f64, N>& x)
+{
+ return select(abs(x) >= fp_precision_limit<f64>, x,
+ broadcastto<f64>(broadcastto<i64>(x + mulsign(broadcast<N>(0.5), x))));
+}
+template <size_t N>
+KFR_INTRINSIC vec<f32, N> trunc(const vec<f32, N>& x)
+{
+ return select(abs(x) >= fp_precision_limit<f32>, x, broadcastto<f32>(broadcastto<i32>(x)));
+}
+template <size_t N>
+KFR_INTRINSIC vec<f64, N> trunc(const vec<f64, N>& x)
+{
+ return select(abs(x) >= fp_precision_limit<f64>, x, broadcastto<f64>(broadcastto<i64>(x)));
+}
+template <size_t N>
+KFR_INTRINSIC vec<f32, N> fract(const vec<f32, N>& x)
+{
+ return x - floor(x);
+}
+template <size_t N>
+KFR_INTRINSIC vec<f64, N> fract(const vec<f64, N>& x)
+{
+ return x - floor(x);
+}
+#endif
+
+template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)>
+KFR_INTRINSIC vec<T, N> floor(const vec<T, N>& value)
+{
+ return value;
+}
+template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)>
+KFR_INTRINSIC vec<T, N> ceil(const vec<T, N>& value)
+{
+ return value;
+}
+template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)>
+KFR_INTRINSIC vec<T, N> trunc(const vec<T, N>& value)
+{
+ return value;
+}
+template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)>
+KFR_INTRINSIC vec<T, N> round(const vec<T, N>& value)
+{
+ return value;
+}
+template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)>
+KFR_INTRINSIC vec<T, N> fract(const vec<T, N>&)
+{
+ return T(0);
+}
+
+template <typename T, size_t N, typename IT = itype<T>>
+KFR_INTRINSIC vec<IT, N> ifloor(const vec<T, N>& value)
+{
+ return broadcastto<IT>(floor(value));
+}
+template <typename T, size_t N, typename IT = itype<T>>
+KFR_INTRINSIC vec<IT, N> iceil(const vec<T, N>& value)
+{
+ return broadcastto<IT>(ceil(value));
+}
+template <typename T, size_t N, typename IT = itype<T>>
+KFR_INTRINSIC vec<IT, N> itrunc(const vec<T, N>& value)
+{
+ return broadcastto<IT>(trunc(value));
+}
+template <typename T, size_t N, typename IT = itype<T>>
+KFR_INTRINSIC vec<IT, N> iround(const vec<T, N>& value)
+{
+ return broadcastto<IT>(round(value));
+}
+
+KFR_HANDLE_SCALAR(floor)
+KFR_HANDLE_SCALAR(ceil)
+KFR_HANDLE_SCALAR(round)
+KFR_HANDLE_SCALAR(trunc)
+KFR_HANDLE_SCALAR(fract)
+KFR_HANDLE_SCALAR(ifloor)
+KFR_HANDLE_SCALAR(iceil)
+KFR_HANDLE_SCALAR(iround)
+KFR_HANDLE_SCALAR(itrunc)
+} // namespace intrinsics
+KFR_I_FN(floor)
+KFR_I_FN(ceil)
+KFR_I_FN(round)
+KFR_I_FN(trunc)
+KFR_I_FN(fract)
+KFR_I_FN(ifloor)
+KFR_I_FN(iceil)
+KFR_I_FN(iround)
+KFR_I_FN(itrunc)
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
+
+#undef KFR_mm_trunc_ps
+#undef KFR_mm_roundnearest_ps
+#undef KFR_mm_trunc_pd
+#undef KFR_mm_roundnearest_pd
+#undef KFR_mm_trunc_ss
+#undef KFR_mm_roundnearest_ss
+#undef KFR_mm_trunc_sd
+#undef KFR_mm_roundnearest_sd
+#undef KFR_mm_floor_ss
+#undef KFR_mm_floor_sd
+#undef KFR_mm_ceil_ss
+#undef KFR_mm_ceil_sd
+#undef KFR_mm256_trunc_ps
+#undef KFR_mm256_roundnearest_ps
+#undef KFR_mm256_trunc_pd
+#undef KFR_mm256_roundnearest_pd
diff --git a/include/kfr/simd/impl/saturation.hpp b/include/kfr/simd/impl/saturation.hpp
@@ -0,0 +1,205 @@
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../operators.hpp"
+#include "../select.hpp"
+#include "function.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+namespace intrinsics
+{
+
+// Generic functions
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> saturated_signed_add(const vec<T, N>& a, const vec<T, N>& b)
+{
+ using UT = utype<T>;
+ constexpr size_t shift = typebits<UT>::bits - 1;
+ vec<UT, N> aa = bitcast<UT>(a);
+ vec<UT, N> bb = bitcast<UT>(b);
+ const vec<UT, N> sum = aa + bb;
+ aa = (aa >> shift) + static_cast<UT>(std::numeric_limits<T>::max());
+
+ return select(bitcast<T>((aa ^ bb) | ~(bb ^ sum)) >= T(), a, bitcast<T>(sum));
+}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> saturated_signed_sub(const vec<T, N>& a, const vec<T, N>& b)
+{
+ using UT = utype<T>;
+ constexpr size_t shift = typebits<UT>::bits - 1;
+ vec<UT, N> aa = bitcast<UT>(a);
+ vec<UT, N> bb = bitcast<UT>(b);
+ const vec<UT, N> diff = aa - bb;
+ aa = (aa >> shift) + static_cast<UT>(std::numeric_limits<T>::max());
+
+ return select(bitcast<T>((aa ^ bb) & (aa ^ diff)) < T(), a, bitcast<T>(diff));
+}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> saturated_unsigned_add(const vec<T, N>& a, const vec<T, N>& b)
+{
+ const vec<T, N> t = allonesvector(a);
+ return select(a > t - b, t, a + b);
+}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> saturated_unsigned_sub(const vec<T, N>& a, const vec<T, N>& b)
+{
+ return select(a < b, zerovector(a), a - b);
+}
+
+#if defined CMT_ARCH_SSE2 && defined KFR_NATIVE_INTRINSICS
+
+KFR_INTRINSIC u8sse satadd(const u8sse& x, const u8sse& y) { return _mm_adds_epu8(x.v, y.v); }
+KFR_INTRINSIC i8sse satadd(const i8sse& x, const i8sse& y) { return _mm_adds_epi8(x.v, y.v); }
+KFR_INTRINSIC u16sse satadd(const u16sse& x, const u16sse& y) { return _mm_adds_epu16(x.v, y.v); }
+KFR_INTRINSIC i16sse satadd(const i16sse& x, const i16sse& y) { return _mm_adds_epi16(x.v, y.v); }
+
+KFR_INTRINSIC u8sse satsub(const u8sse& x, const u8sse& y) { return _mm_subs_epu8(x.v, y.v); }
+KFR_INTRINSIC i8sse satsub(const i8sse& x, const i8sse& y) { return _mm_subs_epi8(x.v, y.v); }
+KFR_INTRINSIC u16sse satsub(const u16sse& x, const u16sse& y) { return _mm_subs_epu16(x.v, y.v); }
+KFR_INTRINSIC i16sse satsub(const i16sse& x, const i16sse& y) { return _mm_subs_epi16(x.v, y.v); }
+
+KFR_INTRINSIC i32sse satadd(const i32sse& a, const i32sse& b) { return saturated_signed_add(a, b); }
+KFR_INTRINSIC i64sse satadd(const i64sse& a, const i64sse& b) { return saturated_signed_add(a, b); }
+KFR_INTRINSIC u32sse satadd(const u32sse& a, const u32sse& b) { return saturated_unsigned_add(a, b); }
+KFR_INTRINSIC u64sse satadd(const u64sse& a, const u64sse& b) { return saturated_unsigned_add(a, b); }
+
+KFR_INTRINSIC i32sse satsub(const i32sse& a, const i32sse& b) { return saturated_signed_sub(a, b); }
+KFR_INTRINSIC i64sse satsub(const i64sse& a, const i64sse& b) { return saturated_signed_sub(a, b); }
+KFR_INTRINSIC u32sse satsub(const u32sse& a, const u32sse& b) { return saturated_unsigned_sub(a, b); }
+KFR_INTRINSIC u64sse satsub(const u64sse& a, const u64sse& b) { return saturated_unsigned_sub(a, b); }
+
+#if defined CMT_ARCH_AVX2
+KFR_INTRINSIC u8avx satadd(const u8avx& x, const u8avx& y) { return _mm256_adds_epu8(x.v, y.v); }
+KFR_INTRINSIC i8avx satadd(const i8avx& x, const i8avx& y) { return _mm256_adds_epi8(x.v, y.v); }
+KFR_INTRINSIC u16avx satadd(const u16avx& x, const u16avx& y) { return _mm256_adds_epu16(x.v, y.v); }
+KFR_INTRINSIC i16avx satadd(const i16avx& x, const i16avx& y) { return _mm256_adds_epi16(x.v, y.v); }
+
+KFR_INTRINSIC u8avx satsub(const u8avx& x, const u8avx& y) { return _mm256_subs_epu8(x.v, y.v); }
+KFR_INTRINSIC i8avx satsub(const i8avx& x, const i8avx& y) { return _mm256_subs_epi8(x.v, y.v); }
+KFR_INTRINSIC u16avx satsub(const u16avx& x, const u16avx& y) { return _mm256_subs_epu16(x.v, y.v); }
+KFR_INTRINSIC i16avx satsub(const i16avx& x, const i16avx& y) { return _mm256_subs_epi16(x.v, y.v); }
+
+KFR_INTRINSIC i32avx satadd(const i32avx& a, const i32avx& b) { return saturated_signed_add(a, b); }
+KFR_INTRINSIC i64avx satadd(const i64avx& a, const i64avx& b) { return saturated_signed_add(a, b); }
+KFR_INTRINSIC u32avx satadd(const u32avx& a, const u32avx& b) { return saturated_unsigned_add(a, b); }
+KFR_INTRINSIC u64avx satadd(const u64avx& a, const u64avx& b) { return saturated_unsigned_add(a, b); }
+
+KFR_INTRINSIC i32avx satsub(const i32avx& a, const i32avx& b) { return saturated_signed_sub(a, b); }
+KFR_INTRINSIC i64avx satsub(const i64avx& a, const i64avx& b) { return saturated_signed_sub(a, b); }
+KFR_INTRINSIC u32avx satsub(const u32avx& a, const u32avx& b) { return saturated_unsigned_sub(a, b); }
+KFR_INTRINSIC u64avx satsub(const u64avx& a, const u64avx& b) { return saturated_unsigned_sub(a, b); }
+#endif
+
+#if defined CMT_ARCH_AVX512
+KFR_INTRINSIC u8avx512 satadd(const u8avx512& x, const u8avx512& y) { return _mm512_adds_epu8(x.v, y.v); }
+KFR_INTRINSIC i8avx512 satadd(const i8avx512& x, const i8avx512& y) { return _mm512_adds_epi8(x.v, y.v); }
+KFR_INTRINSIC u16avx512 satadd(const u16avx512& x, const u16avx512& y) { return _mm512_adds_epu16(x.v, y.v); }
+KFR_INTRINSIC i16avx512 satadd(const i16avx512& x, const i16avx512& y) { return _mm512_adds_epi16(x.v, y.v); }
+KFR_INTRINSIC u8avx512 satsub(const u8avx512& x, const u8avx512& y) { return _mm512_subs_epu8(x.v, y.v); }
+KFR_INTRINSIC i8avx512 satsub(const i8avx512& x, const i8avx512& y) { return _mm512_subs_epi8(x.v, y.v); }
+KFR_INTRINSIC u16avx512 satsub(const u16avx512& x, const u16avx512& y) { return _mm512_subs_epu16(x.v, y.v); }
+KFR_INTRINSIC i16avx512 satsub(const i16avx512& x, const i16avx512& y) { return _mm512_subs_epi16(x.v, y.v); }
+
+KFR_INTRINSIC i32avx512 satadd(const i32avx512& a, const i32avx512& b) { return saturated_signed_add(a, b); }
+KFR_INTRINSIC i64avx512 satadd(const i64avx512& a, const i64avx512& b) { return saturated_signed_add(a, b); }
+KFR_INTRINSIC u32avx512 satadd(const u32avx512& a, const u32avx512& b)
+{
+ return saturated_unsigned_add(a, b);
+}
+KFR_INTRINSIC u64avx512 satadd(const u64avx512& a, const u64avx512& b)
+{
+ return saturated_unsigned_add(a, b);
+}
+KFR_INTRINSIC i32avx512 satsub(const i32avx512& a, const i32avx512& b) { return saturated_signed_sub(a, b); }
+KFR_INTRINSIC i64avx512 satsub(const i64avx512& a, const i64avx512& b) { return saturated_signed_sub(a, b); }
+KFR_INTRINSIC u32avx512 satsub(const u32avx512& a, const u32avx512& b)
+{
+ return saturated_unsigned_sub(a, b);
+}
+KFR_INTRINSIC u64avx512 satsub(const u64avx512& a, const u64avx512& b)
+{
+ return saturated_unsigned_sub(a, b);
+}
+#endif
+
+KFR_HANDLE_ALL_SIZES_2(satadd)
+KFR_HANDLE_ALL_SIZES_2(satsub)
+
+#elif defined CMT_ARCH_NEON && defined KFR_NATIVE_INTRINSICS
+
+KFR_INTRINSIC u8neon satadd(const u8neon& x, const u8neon& y) { return vqaddq_u8(x.v, y.v); }
+KFR_INTRINSIC i8neon satadd(const i8neon& x, const i8neon& y) { return vqaddq_s8(x.v, y.v); }
+KFR_INTRINSIC u16neon satadd(const u16neon& x, const u16neon& y) { return vqaddq_u16(x.v, y.v); }
+KFR_INTRINSIC i16neon satadd(const i16neon& x, const i16neon& y) { return vqaddq_s16(x.v, y.v); }
+KFR_INTRINSIC u32neon satadd(const u32neon& a, const u32neon& b) { return vqaddq_u32(a.v, b.v); }
+KFR_INTRINSIC i32neon satadd(const i32neon& a, const i32neon& b) { return vqaddq_s32(a.v, b.v); }
+KFR_INTRINSIC u64neon satadd(const u64neon& a, const u64neon& b) { return vqaddq_u64(a.v, b.v); }
+KFR_INTRINSIC i64neon satadd(const i64neon& a, const i64neon& b) { return vqaddq_s64(a.v, b.v); }
+
+KFR_INTRINSIC u8neon satsub(const u8neon& x, const u8neon& y) { return vqsubq_u8(x.v, y.v); }
+KFR_INTRINSIC i8neon satsub(const i8neon& x, const i8neon& y) { return vqsubq_s8(x.v, y.v); }
+KFR_INTRINSIC u16neon satsub(const u16neon& x, const u16neon& y) { return vqsubq_u16(x.v, y.v); }
+KFR_INTRINSIC i16neon satsub(const i16neon& x, const i16neon& y) { return vqsubq_s16(x.v, y.v); }
+KFR_INTRINSIC u32neon satsub(const u32neon& a, const u32neon& b) { return vqsubq_u32(a.v, b.v); }
+KFR_INTRINSIC i32neon satsub(const i32neon& a, const i32neon& b) { return vqsubq_s32(a.v, b.v); }
+KFR_INTRINSIC u64neon satsub(const u64neon& a, const u64neon& b) { return vqsubq_u64(a.v, b.v); }
+KFR_INTRINSIC i64neon satsub(const i64neon& a, const i64neon& b) { return vqsubq_s64(a.v, b.v); }
+
+KFR_HANDLE_ALL_SIZES_2(satadd)
+KFR_HANDLE_ALL_SIZES_2(satsub)
+
+#else
+// fallback
+template <typename T, size_t N, KFR_ENABLE_IF(std::is_signed_v<T>)>
+KFR_INTRINSIC vec<T, N> satadd(const vec<T, N>& a, const vec<T, N>& b)
+{
+ return saturated_signed_add(a, b);
+}
+template <typename T, size_t N, KFR_ENABLE_IF(std::is_unsigned_v<T>)>
+KFR_INTRINSIC vec<T, N> satadd(const vec<T, N>& a, const vec<T, N>& b)
+{
+ return saturated_unsigned_add(a, b);
+}
+template <typename T, size_t N, KFR_ENABLE_IF(std::is_signed_v<T>)>
+KFR_INTRINSIC vec<T, N> satsub(const vec<T, N>& a, const vec<T, N>& b)
+{
+ return saturated_signed_sub(a, b);
+}
+template <typename T, size_t N, KFR_ENABLE_IF(std::is_unsigned_v<T>)>
+KFR_INTRINSIC vec<T, N> satsub(const vec<T, N>& a, const vec<T, N>& b)
+{
+ return saturated_unsigned_sub(a, b);
+}
+#endif
+KFR_HANDLE_SCALAR(satadd)
+KFR_HANDLE_SCALAR(satsub)
+} // namespace intrinsics
+KFR_I_FN(satadd)
+KFR_I_FN(satsub)
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/include/kfr/simd/impl/select.hpp b/include/kfr/simd/impl/select.hpp
@@ -0,0 +1,331 @@
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "../operators.hpp"
+#include "function.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+namespace intrinsics
+{
+
+#if defined CMT_ARCH_SSE41 && defined KFR_NATIVE_INTRINSICS
+
+KFR_INTRINSIC u8sse select(const mu8sse& m, const u8sse& x, const u8sse& y)
+{
+ return _mm_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC u16sse select(const mu16sse& m, const u16sse& x, const u16sse& y)
+{
+ return _mm_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC u32sse select(const mu32sse& m, const u32sse& x, const u32sse& y)
+{
+ return _mm_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC u64sse select(const mu64sse& m, const u64sse& x, const u64sse& y)
+{
+ return _mm_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC i8sse select(const mi8sse& m, const i8sse& x, const i8sse& y)
+{
+ return _mm_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC i16sse select(const mi16sse& m, const i16sse& x, const i16sse& y)
+{
+ return _mm_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC i32sse select(const mi32sse& m, const i32sse& x, const i32sse& y)
+{
+ return _mm_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC i64sse select(const mi64sse& m, const i64sse& x, const i64sse& y)
+{
+ return _mm_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC f32sse select(const mf32sse& m, const f32sse& x, const f32sse& y)
+{
+ return _mm_blendv_ps(y.v, x.v, m.v);
+}
+KFR_INTRINSIC f64sse select(const mf64sse& m, const f64sse& x, const f64sse& y)
+{
+ return _mm_blendv_pd(y.v, x.v, m.v);
+}
+
+#if defined CMT_ARCH_AVX
+KFR_INTRINSIC f64avx select(const mf64avx& m, const f64avx& x, const f64avx& y)
+{
+ return _mm256_blendv_pd(y.v, x.v, m.v);
+}
+KFR_INTRINSIC f32avx select(const mf32avx& m, const f32avx& x, const f32avx& y)
+{
+ return _mm256_blendv_ps(y.v, x.v, m.v);
+}
+#endif
+
+#if defined CMT_ARCH_AVX2
+KFR_INTRINSIC u8avx select(const mu8avx& m, const u8avx& x, const u8avx& y)
+{
+ return _mm256_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC u16avx select(const mu16avx& m, const u16avx& x, const u16avx& y)
+{
+ return _mm256_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC u32avx select(const mu32avx& m, const u32avx& x, const u32avx& y)
+{
+ return _mm256_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC u64avx select(const mu64avx& m, const u64avx& x, const u64avx& y)
+{
+ return _mm256_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC i8avx select(const mi8avx& m, const i8avx& x, const i8avx& y)
+{
+ return _mm256_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC i16avx select(const mi16avx& m, const i16avx& x, const i16avx& y)
+{
+ return _mm256_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC i32avx select(const mi32avx& m, const i32avx& x, const i32avx& y)
+{
+ return _mm256_blendv_epi8(y.v, x.v, m.v);
+}
+KFR_INTRINSIC i64avx select(const mi64avx& m, const i64avx& x, const i64avx& y)
+{
+ return _mm256_blendv_epi8(y.v, x.v, m.v);
+}
+#endif
+
+#if defined CMT_ARCH_AVX512
+KFR_INTRINSIC f64avx512 select(const mf64avx512& m, const f64avx512& x, const f64avx512& y)
+{
+ return _mm512_mask_blend_pd(_mm512_movepi64_mask(_mm512_castpd_si512(m.v)), y.v, x.v);
+}
+KFR_INTRINSIC f32avx512 select(const mf32avx512& m, const f32avx512& x, const f32avx512& y)
+{
+ return _mm512_mask_blend_ps(_mm512_movepi32_mask(_mm512_castps_si512(m.v)), y.v, x.v);
+}
+KFR_INTRINSIC u8avx512 select(const mu8avx512& m, const u8avx512& x, const u8avx512& y)
+{
+ return _mm512_mask_blend_epi8(_mm512_movepi8_mask(m.v), y.v, x.v);
+}
+KFR_INTRINSIC u16avx512 select(const mu16avx512& m, const u16avx512& x, const u16avx512& y)
+{
+ return _mm512_mask_blend_epi16(_mm512_movepi16_mask(m.v), y.v, x.v);
+}
+KFR_INTRINSIC u32avx512 select(const mu32avx512& m, const u32avx512& x, const u32avx512& y)
+{
+ return _mm512_mask_blend_epi32(_mm512_movepi32_mask(m.v), y.v, x.v);
+}
+KFR_INTRINSIC u64avx512 select(const mu64avx512& m, const u64avx512& x, const u64avx512& y)
+{
+ return _mm512_mask_blend_epi64(_mm512_movepi64_mask(m.v), y.v, x.v);
+}
+KFR_INTRINSIC i8avx512 select(const mi8avx512& m, const i8avx512& x, const i8avx512& y)
+{
+ return _mm512_mask_blend_epi8(_mm512_movepi8_mask(m.v), y.v, x.v);
+}
+KFR_INTRINSIC i16avx512 select(const mi16avx512& m, const i16avx512& x, const i16avx512& y)
+{
+ return _mm512_mask_blend_epi16(_mm512_movepi16_mask(m.v), y.v, x.v);
+}
+KFR_INTRINSIC i32avx512 select(const mi32avx512& m, const i32avx512& x, const i32avx512& y)
+{
+ return _mm512_mask_blend_epi32(_mm512_movepi32_mask(m.v), y.v, x.v);
+}
+KFR_INTRINSIC i64avx512 select(const mi64avx512& m, const i64avx512& x, const i64avx512& y)
+{
+ return _mm512_mask_blend_epi64(_mm512_movepi64_mask(m.v), y.v, x.v);
+}
+#endif
+
+template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T> && !is_simd_size<T>(N))>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const vec<T, N>& b, const vec<T, N>& c)
+{
+ constexpr size_t Nout = next_simd_width<T>(N);
+ return select(a.shuffle(csizeseq<Nout>), b.shuffle(csizeseq<Nout>), c.shuffle(csizeseq<Nout>))
+ .shuffle(csizeseq<N>);
+}
+template <typename T, size_t N, KFR_ENABLE_IF(N > vector_width<T>), typename = void>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const vec<T, N>& b, const vec<T, N>& c)
+{
+ return concat(select(low(a), low(b), low(c)), select(high(a), high(b), high(c)));
+ // return concat2(select(a.h.low, b.h.low, c.h.low), select(a.h.high, b.h.high, c.h.high));
+}
+
+template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T> && !is_simd_size<T>(N))>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const T& b, const T& c)
+{
+ constexpr size_t Nout = next_simd_width<T>(N);
+ return select(a.shuffle(csizeseq<Nout>), vec<T, Nout>(b), vec<T, Nout>(c)).shuffle(csizeseq<N>);
+}
+template <typename T, size_t N, KFR_ENABLE_IF(N > vector_width<T>), typename = void>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const T& b, const T& c)
+{
+ return concat2(select(a.h.low, b, c), select(a.h.high, b, c));
+}
+
+template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T> && !is_simd_size<T>(N))>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const vec<T, N>& b, const T& c)
+{
+ constexpr size_t Nout = next_simd_width<T>(N);
+ return select(a.shuffle(csizeseq<Nout>), b.shuffle(csizeseq<Nout>), vec<T, Nout>(c)).shuffle(csizeseq<N>);
+}
+template <typename T, size_t N, KFR_ENABLE_IF(N > vector_width<T>), typename = void>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const vec<T, N>& b, const T& c)
+{
+ return concat2(select(a.h.low, b.h.low, c), select(a.h.high, b.h.high, c));
+}
+
+template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T> && !is_simd_size<T>(N))>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const T& b, const vec<T, N>& c)
+{
+ constexpr size_t Nout = next_simd_width<T>(N);
+ return select(shufflevector(a, csizeseq<Nout>), vec<T, Nout>(b), c.shuffle(csizeseq<Nout>))
+ .shuffle(csizeseq<N>);
+}
+template <typename T, size_t N, KFR_ENABLE_IF(N > vector_width<T>), typename = void>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const T& b, const vec<T, N>& c)
+{
+ return concat2(select(a.h.low, b, c.h.low), select(a.h.high, b, c.h.high));
+}
+
+#elif defined CMT_ARCH_NEON && defined KFR_NATIVE_INTRINSICS
+
+KFR_INTRINSIC f32neon select(const mf32neon& m, const f32neon& x, const f32neon& y)
+{
+ return vbslq_f32(m.v, x.v, y.v);
+}
+KFR_INTRINSIC i8neon select(const mi8neon& m, const i8neon& x, const i8neon& y)
+{
+ return vbslq_s8(m.v, x.v, y.v);
+}
+KFR_INTRINSIC u8neon select(const mu8neon& m, const u8neon& x, const u8neon& y)
+{
+ return vbslq_u8(m.v, x.v, y.v);
+}
+KFR_INTRINSIC i16neon select(const mi16neon& m, const i16neon& x, const i16neon& y)
+{
+ return vbslq_s16(m.v, x.v, y.v);
+}
+KFR_INTRINSIC u16neon select(const mu16neon& m, const u16neon& x, const u16neon& y)
+{
+ return vbslq_u16(m.v, x.v, y.v);
+}
+KFR_INTRINSIC i32neon select(const mi32neon& m, const i32neon& x, const i32neon& y)
+{
+ return vbslq_s32(m.v, x.v, y.v);
+}
+KFR_INTRINSIC u32neon select(const mu32neon& m, const u32neon& x, const u32neon& y)
+{
+ return vbslq_u32(m.v, x.v, y.v);
+}
+KFR_INTRINSIC i64neon select(const mi64neon& m, const i64neon& x, const i64neon& y)
+{
+ return vbslq_s64(m.v, x.v, y.v);
+}
+KFR_INTRINSIC u64neon select(const mu64neon& m, const u64neon& x, const u64neon& y)
+{
+ return vbslq_u64(m.v, x.v, y.v);
+}
+
+#ifdef CMT_ARCH_NEON64
+KFR_INTRINSIC f64neon select(const mf64neon& m, const f64neon& x, const f64neon& y)
+{
+ return vbslq_f64(m.v, x.v, y.v);
+}
+#else
+KFR_INTRINSIC f64neon select(const mf64neon& m, const f64neon& x, const f64neon& y)
+{
+ return y ^ ((x ^ y) & m.asvec());
+}
+#endif
+
+template <typename T, size_t N, KFR_ENABLE_IF(N < vector_width<T> && !is_simd_size<T>(N))>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const vec<T, N>& b, const vec<T, N>& c)
+{
+ constexpr size_t Nout = next_simd_width<T>(N);
+ return select(a.shuffle(csizeseq<Nout>), b.shuffle(csizeseq<Nout>), c.shuffle(csizeseq<Nout>))
+ .shuffle(csizeseq<N>);
+}
+template <typename T, size_t N, KFR_ENABLE_IF(N > vector_width<T>), typename = void>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& a, const vec<T, N>& b, const vec<T, N>& c)
+{
+ return concat2(select(a.h.low, b.h.low, c.h.low), select(a.h.high, b.h.high, c.h.high));
+}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& m, const T& x, const T& y)
+{
+ return select(m, vec<T, N>(x), vec<T, N>(y));
+}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& m, const vec<T, N>& x, const T& y)
+{
+ return select(m, x, vec<T, N>(y));
+}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& m, const T& x, const vec<T, N>& y)
+{
+ return select(m, vec<T, N>(x), y);
+}
+
+#else
+
+// fallback
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& m, const vec<T, N>& x, const vec<T, N>& y)
+{
+ return y ^ ((x ^ y) & m.asvec());
+}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& m, const T& x, const T& y)
+{
+ return select(m, vec<T, N>(x), vec<T, N>(y));
+}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& m, const vec<T, N>& x, const T& y)
+{
+ return select(m, x, vec<T, N>(y));
+}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> select(const vec<bit<T>, N>& m, const T& x, const vec<T, N>& y)
+{
+ return select(m, vec<T, N>(x), y);
+}
+#endif
+template <typename T1, typename T2>
+KFR_INTRINSIC std::common_type_t<T1, T2> select(bool m, const T1& x, const T2& y)
+{
+ return m ? x : y;
+}
+
+} // namespace intrinsics
+KFR_I_FN(select)
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/include/kfr/simd/impl/simd.hpp b/include/kfr/simd/impl/simd.hpp
@@ -118,4 +118,21 @@ struct simd_halves
} // namespace intrinsics
} // namespace CMT_ARCH_NAME
+
+#define KFR_COMPONENTWISE_RET(code) \
+ vec<T, N> result; \
+ for (size_t i = 0; i < N; i++) \
+ code; \
+ return result;
+
+#define KFR_COMPONENTWISE_RET_I(Tvec, code) \
+ Tvec result; \
+ for (size_t i = 0; i < result.size(); i++) \
+ code; \
+ return result;
+
+#define KFR_COMPONENTWISE(code) \
+ for (size_t i = 0; i < N; i++) \
+ code;
+
} // namespace kfr
diff --git a/include/kfr/simd/impl/specializations.i b/include/kfr/simd/impl/specializations.hpp
diff --git a/include/kfr/math/logical.hpp b/include/kfr/simd/logical.hpp
diff --git a/include/kfr/simd/min_max.hpp b/include/kfr/simd/min_max.hpp
@@ -0,0 +1,75 @@
+/** @addtogroup basic_math
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "impl/min_max.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+/**
+ * @brief Returns the smaller of two values.
+ */
+template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>),
+ typename Tout = std::common_type_t<T1, T2>>
+KFR_INTRINSIC Tout min(const T1& x, const T2& y)
+{
+ return intrinsics::min(x, y);
+}
+
+/**
+ * @brief Returns the greater of two values.
+ */
+template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>),
+ typename Tout = std::common_type_t<T1, T2>>
+KFR_INTRINSIC Tout max(const T1& x, const T2& y)
+{
+ return intrinsics::max(x, y);
+}
+
+/**
+ * @brief Returns the smaller in magnitude of two values.
+ */
+template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>),
+ typename Tout = std::common_type_t<T1, T2>>
+KFR_INTRINSIC Tout absmin(const T1& x, const T2& y)
+{
+ return intrinsics::absmin(x, y);
+}
+
+/**
+ * @brief Returns the greater in magnitude of two values.
+ */
+template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>),
+ typename Tout = std::common_type_t<T1, T2>>
+KFR_INTRINSIC Tout absmax(const T1& x, const T2& y)
+{
+ return intrinsics::absmax(x, y);
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/include/kfr/simd/operators.hpp b/include/kfr/simd/operators.hpp
@@ -36,39 +36,42 @@ inline namespace CMT_ARCH_NAME
{
#define KFR_VEC_OPERATOR1(op, fn) \
- template <typename T, size_t N> \
+ template <typename T, size_t N /* , KFR_ENABLE_IF(!is_vec<T>) */> \
constexpr KFR_INTRINSIC vec<T, N> operator op(const vec<T, N>& x) \
{ \
return intrinsics::fn(x); \
}
#define KFR_VEC_OPERATOR2(op, asgnop, fn) \
- template <typename T1, typename T2, size_t N> \
+ template <typename T1, typename T2, size_t N, KFR_ENABLE_IF(vec_rank<T1> == vec_rank<T2>)> \
constexpr KFR_INTRINSIC vec<T1, N>& operator asgnop(vec<T1, N>& x, const vec<T2, N>& y) \
{ \
- x = intrinsics::fn(x, elemcast<T1>(y)); \
+ x = intrinsics::fn(x, promoteto<T1>(y)); \
return x; \
} \
- template <typename T1, typename T2, size_t N> \
+ template <typename T1, typename T2, size_t N, KFR_ENABLE_IF(1 + vec_rank<T1> > vec_rank<T2>)> \
constexpr KFR_INTRINSIC vec<T1, N>& operator asgnop(vec<T1, N>& x, const T2& y) \
{ \
x = intrinsics::fn(x, T1(y)); \
return x; \
} \
- template <typename T1, typename T2, size_t N, typename C = common_type<T1, T2>> \
+ template <typename T1, typename T2, size_t N, typename C = std::common_type_t<T1, T2>, \
+ KFR_ENABLE_IF(1 + vec_rank<T1> > vec_rank<T2>)> \
constexpr KFR_INTRINSIC vec<C, N> operator op(const vec<T1, N>& x, const T2& y) \
{ \
- return intrinsics::fn(elemcast<C>(x), C(y)); \
+ return intrinsics::fn(promoteto<C>(x), C(y)); \
} \
- template <typename T1, typename T2, size_t N, typename C = common_type<T1, T2>> \
+ template <typename T1, typename T2, size_t N, typename C = std::common_type_t<T1, T2>, \
+ KFR_ENABLE_IF(vec_rank<T1> < 1 + vec_rank<T2>)> \
constexpr KFR_INTRINSIC vec<C, N> operator op(const T1& x, const vec<T2, N>& y) \
{ \
- return intrinsics::fn(C(x), elemcast<C>(y)); \
+ return intrinsics::fn(C(x), promoteto<C>(y)); \
} \
- template <typename T1, typename T2, size_t N, typename C = common_type<T1, T2>> \
+ template <typename T1, typename T2, size_t N, typename C = std::common_type_t<T1, T2>, \
+ KFR_ENABLE_IF(vec_rank<T1> == vec_rank<T2>)> \
constexpr KFR_INTRINSIC vec<C, N> operator op(const vec<T1, N>& x, const vec<T2, N>& y) \
{ \
- return intrinsics::fn(elemcast<C>(x), elemcast<C>(y)); \
+ return intrinsics::fn(promoteto<C>(x), promoteto<C>(y)); \
}
#define KFR_VEC_SHIFT_OPERATOR(op, asgnop, fn) \
@@ -78,43 +81,46 @@ inline namespace CMT_ARCH_NAME
x = intrinsics::fn(x, y); \
return x; \
} \
- template <typename T1, typename T2, size_t N> \
+ template <typename T1, typename T2, size_t N, KFR_ENABLE_IF(vec_rank<T1> == vec_rank<T2>)> \
constexpr KFR_INTRINSIC vec<T1, N>& operator asgnop(vec<T1, N>& x, const vec<T2, N>& y) \
{ \
- x = intrinsics::fn(x, elemcast<utype<T1>>(y)); \
+ x = intrinsics::fn(x, promoteto<utype<T1>>(y)); \
return x; \
} \
- template <typename T, size_t N> \
- constexpr KFR_INTRINSIC vec<T, N> operator op(const vec<T, N>& x, unsigned y) \
+ template <typename T1, size_t N> \
+ constexpr KFR_INTRINSIC vec<T1, N> operator op(const vec<T1, N>& x, unsigned y) \
{ \
return intrinsics::fn(x, y); \
} \
- template <typename T, typename T2, size_t N> \
- constexpr KFR_INTRINSIC vec<T, N> operator op(const T& x, const vec<T2, N>& y) \
+ template <typename T1, typename T2, size_t N, KFR_ENABLE_IF(vec_rank<T1> < 1 + vec_rank<T2>)> \
+ constexpr KFR_INTRINSIC vec<T1, N> operator op(const T1& x, const vec<T2, N>& y) \
{ \
- return intrinsics::fn(innercast<T>(x), elemcast<utype<T>>(y)); \
+ return intrinsics::fn(broadcastto<T1>(x), promoteto<utype<T1>>(y)); \
} \
- template <typename T, typename T2, size_t N> \
- constexpr KFR_INTRINSIC vec<T, N> operator op(const vec<T, N>& x, const vec<T2, N>& y) \
+ template <typename T1, typename T2, size_t N, KFR_ENABLE_IF(vec_rank<T1> == vec_rank<T2>)> \
+ constexpr KFR_INTRINSIC vec<T1, N> operator op(const vec<T1, N>& x, const vec<T2, N>& y) \
{ \
- return intrinsics::fn(x, elemcast<utype<T>>(y)); \
+ return intrinsics::fn(x, promoteto<utype<T1>>(y)); \
}
#define KFR_VEC_CMP_OPERATOR(op, fn) \
- template <typename T1, typename T2, size_t N, typename C = common_type<T1, T2>> \
+ template <typename T1, typename T2, size_t N, typename C = std::common_type_t<T1, T2>, \
+ KFR_ENABLE_IF(1 + vec_rank<T1> > vec_rank<T2>)> \
constexpr KFR_INTRINSIC mask<C, N> operator op(const vec<T1, N>& x, const T2& y) \
{ \
- return intrinsics::fn(elemcast<C>(x), vec<C, N>(y)).asmask(); \
+ return intrinsics::fn(promoteto<C>(x), vec<C, N>(y)).asmask(); \
} \
- template <typename T1, typename T2, size_t N, typename C = common_type<T1, T2>> \
+ template <typename T1, typename T2, size_t N, typename C = std::common_type_t<T1, T2>, \
+ KFR_ENABLE_IF(vec_rank<T1> < 1 + vec_rank<T2>)> \
constexpr KFR_INTRINSIC mask<C, N> operator op(const T1& x, const vec<T2, N>& y) \
{ \
- return intrinsics::fn(vec<C, N>(x), elemcast<C>(y)).asmask(); \
+ return intrinsics::fn(vec<C, N>(x), promoteto<C>(y)).asmask(); \
} \
- template <typename T1, typename T2, size_t N, typename C = common_type<T1, T2>> \
+ template <typename T1, typename T2, size_t N, typename C = std::common_type_t<T1, T2>, \
+ KFR_ENABLE_IF(vec_rank<T1> == vec_rank<T2>)> \
constexpr KFR_INTRINSIC mask<C, N> operator op(const vec<T1, N>& x, const vec<T2, N>& y) \
{ \
- return intrinsics::fn(elemcast<C>(x), elemcast<C>(y)).asmask(); \
+ return intrinsics::fn(promoteto<C>(x), promoteto<C>(y)).asmask(); \
}
KFR_VEC_OPERATOR1(-, neg)
@@ -124,6 +130,7 @@ KFR_VEC_OPERATOR2(+, +=, add)
KFR_VEC_OPERATOR2(-, -=, sub)
KFR_VEC_OPERATOR2(*, *=, mul)
KFR_VEC_OPERATOR2(/, /=, div)
+KFR_VEC_OPERATOR2(%, %=, mod)
KFR_VEC_OPERATOR2(&, &=, band)
KFR_VEC_OPERATOR2(|, |=, bor)
@@ -138,31 +145,31 @@ KFR_VEC_CMP_OPERATOR(<=, le)
KFR_VEC_CMP_OPERATOR(>, gt)
KFR_VEC_CMP_OPERATOR(<, lt)
-template <typename T1, typename T2, size_t N, typename C = common_type<T1, T2>,
+template <typename T1, typename T2, size_t N, typename C = std::common_type_t<T1, T2>,
KFR_ENABLE_IF(sizeof(T1) == sizeof(T2))>
-KFR_INTRINSIC mask<C, N> operator&(const mask<T1, N>& x, const mask<T2, N>& y)CMT_NOEXCEPT
+KFR_INTRINSIC mask<C, N> operator&(const mask<T1, N>& x, const mask<T2, N>& y) CMT_NOEXCEPT
{
return mask<C, N>((bitcast<C>(vec<T1, N>(x.v)) & bitcast<C>(vec<T2, N>(y.v))).v);
}
-template <typename T1, typename T2, size_t N, typename C = common_type<T1, T2>,
+template <typename T1, typename T2, size_t N, typename C = std::common_type_t<T1, T2>,
KFR_ENABLE_IF(sizeof(T1) == sizeof(T2))>
KFR_INTRINSIC mask<C, N> operator|(const mask<T1, N>& x, const mask<T2, N>& y) CMT_NOEXCEPT
{
return mask<C, N>((bitcast<C>(vec<T1, N>(x.v)) | bitcast<C>(vec<T2, N>(y.v))).v);
}
-template <typename T1, typename T2, size_t N, typename C = common_type<T1, T2>,
+template <typename T1, typename T2, size_t N, typename C = std::common_type_t<T1, T2>,
KFR_ENABLE_IF(sizeof(T1) == sizeof(T2))>
KFR_INTRINSIC mask<C, N> operator&&(const mask<T1, N>& x, const mask<T2, N>& y) CMT_NOEXCEPT
{
return mask<C, N>((bitcast<C>(vec<T1, N>(x.v)) & bitcast<C>(vec<T2, N>(y.v))).v);
}
-template <typename T1, typename T2, size_t N, typename C = common_type<T1, T2>,
+template <typename T1, typename T2, size_t N, typename C = std::common_type_t<T1, T2>,
KFR_ENABLE_IF(sizeof(T1) == sizeof(T2))>
KFR_INTRINSIC mask<C, N> operator||(const mask<T1, N>& x, const mask<T2, N>& y) CMT_NOEXCEPT
{
return mask<C, N>((bitcast<C>(vec<T1, N>(x.v)) | bitcast<C>(vec<T2, N>(y.v))).v);
}
-template <typename T1, typename T2, size_t N, typename C = common_type<T1, T2>,
+template <typename T1, typename T2, size_t N, typename C = std::common_type_t<T1, T2>,
KFR_ENABLE_IF(sizeof(T1) == sizeof(T2))>
KFR_INTRINSIC mask<C, N> operator^(const mask<T1, N>& x, const mask<T2, N>& y) CMT_NOEXCEPT
{
@@ -201,7 +208,7 @@ KFR_FN(bitwisenot)
/// @brief Bitwise And
template <typename T1, typename T2>
-KFR_INTRINSIC common_type<T1, T2> bitwiseand(const T1& x, const T2& y)
+KFR_INTRINSIC std::common_type_t<T1, T2> bitwiseand(const T1& x, const T2& y)
{
return x & y;
}
@@ -214,7 +221,7 @@ KFR_FN(bitwiseand)
/// @brief Bitwise And-Not
template <typename T1, typename T2>
-KFR_INTRINSIC common_type<T1, T2> bitwiseandnot(const T1& x, const T2& y)
+KFR_INTRINSIC std::common_type_t<T1, T2> bitwiseandnot(const T1& x, const T2& y)
{
return x & ~y;
}
@@ -227,7 +234,7 @@ KFR_FN(bitwiseandnot)
/// @brief Bitwise Or
template <typename T1, typename T2>
-KFR_INTRINSIC common_type<T1, T2> bitwiseor(const T1& x, const T2& y)
+KFR_INTRINSIC std::common_type_t<T1, T2> bitwiseor(const T1& x, const T2& y)
{
return x | y;
}
@@ -240,7 +247,7 @@ KFR_FN(bitwiseor)
/// @brief Bitwise Xor (Exclusive Or)
template <typename T1, typename T2>
-KFR_INTRINSIC common_type<T1, T2> bitwisexor(const T1& x, const T2& y)
+KFR_INTRINSIC std::common_type_t<T1, T2> bitwisexor(const T1& x, const T2& y)
{
return x ^ y;
}
@@ -293,7 +300,7 @@ constexpr KFR_INTRINSIC T add(const T& x)
* @brief Returns sum of all the arguments passed to a function.
*/
template <typename T1, typename T2, typename... Ts, KFR_ENABLE_IF(is_numeric_args<T1, T2, Ts...>)>
-constexpr KFR_INTRINSIC common_type<T1, T2, Ts...> add(const T1& x, const T2& y, const Ts&... rest)
+constexpr KFR_INTRINSIC std::common_type_t<T1, T2, Ts...> add(const T1& x, const T2& y, const Ts&... rest)
{
return x + add(y, rest...);
}
@@ -304,17 +311,8 @@ constexpr KFR_INTRINSIC T add(initialvalue<T>)
}
KFR_FN(add)
-/**
- * @brief Returns template expression that returns sum of all the arguments passed to a function.
- */
-template <typename... E, KFR_ENABLE_IF((is_input_expressions<E...>)&&true)>
-KFR_INTRINSIC internal::expression_function<fn::add, E...> add(E&&... x)
-{
- return { fn::add(), std::forward<E>(x)... };
-}
-
template <typename T1, typename T2>
-constexpr KFR_INTRINSIC common_type<T1, T2> sub(const T1& x, const T2& y)
+constexpr KFR_INTRINSIC std::common_type_t<T1, T2> sub(const T1& x, const T2& y)
{
return x - y;
}
@@ -325,12 +323,6 @@ constexpr KFR_INTRINSIC T sub(initialvalue<T>)
}
KFR_FN(sub)
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::sub, E1, E2> sub(E1&& x, E2&& y)
-{
- return { fn::sub(), std::forward<E1>(x), std::forward<E2>(y) };
-}
-
template <typename T1>
constexpr KFR_INTRINSIC T1 mul(const T1& x)
{
@@ -341,7 +333,7 @@ constexpr KFR_INTRINSIC T1 mul(const T1& x)
* @brief Returns product of all the arguments passed to a function.
*/
template <typename T1, typename T2, typename... Ts>
-constexpr KFR_INTRINSIC common_type<T1, T2, Ts...> mul(const T1& x, const T2& y, const Ts&... rest)
+constexpr KFR_INTRINSIC std::common_type_t<T1, T2, Ts...> mul(const T1& x, const T2& y, const Ts&... rest)
{
return x * mul(y, rest...);
}
@@ -354,15 +346,6 @@ constexpr KFR_INTRINSIC T mul(initialvalue<T>)
KFR_FN(mul)
/**
- * @brief Returns template expression that returns product of all the arguments passed to a function.
- */
-template <typename... E, KFR_ENABLE_IF(is_input_expressions<E...>)>
-KFR_INTRINSIC internal::expression_function<fn::mul, E...> mul(E&&... x)
-{
- return { fn::mul(), std::forward<E>(x)... };
-}
-
-/**
* @brief Returns square of x.
*/
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
@@ -373,15 +356,6 @@ constexpr inline T1 sqr(const T1& x)
KFR_FN(sqr)
/**
- * @brief Returns template expression that returns square of x.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::sqr, E1> sqr(E1&& x)
-{
- return { fn::sqr(), std::forward<E1>(x) };
-}
-
-/**
* @brief Returns cube of x.
*/
template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
@@ -391,15 +365,6 @@ constexpr inline T1 cub(const T1& x)
}
KFR_FN(cub)
-/**
- * @brief Returns template expression that returns cube of x.
- */
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::cub, E1> cub(E1&& x)
-{
- return { fn::cub(), std::forward<E1>(x) };
-}
-
template <typename T, KFR_ENABLE_IF(is_numeric_args<T>)>
constexpr KFR_INTRINSIC T pow2(const T& x)
{
@@ -428,27 +393,6 @@ KFR_FN(pow3)
KFR_FN(pow4)
KFR_FN(pow5)
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::pow2, E1> pow2(E1&& x)
-{
- return { fn::pow2(), std::forward<E1>(x) };
-}
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::pow3, E1> pow3(E1&& x)
-{
- return { fn::pow3(), std::forward<E1>(x) };
-}
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::pow4, E1> pow4(E1&& x)
-{
- return { fn::pow4(), std::forward<E1>(x) };
-}
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::pow5, E1> pow5(E1&& x)
-{
- return { fn::pow5(), std::forward<E1>(x) };
-}
-
/// Raise x to the power base \f$ x^{base} \f$
/// @code
/// CHECK( ipow( 10, 3 ) == 1000 );
@@ -470,24 +414,18 @@ constexpr inline T ipow(const T& x, int base)
}
KFR_FN(ipow)
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::ipow, E1, E2> ipow(E1&& x, E2&& b)
-{
- return { fn::ipow(), std::forward<E1>(x), std::forward<E2>(b) };
-}
-
/// Return square of the sum of all arguments
/// @code
/// CHECK(sqrsum(1,2,3) == 36);
/// @endcode
template <typename T1, typename... Ts>
-constexpr inline common_type<T1, Ts...> sqrsum(const T1& x, const Ts&... rest)
+constexpr inline std::common_type_t<T1, Ts...> sqrsum(const T1& x, const Ts&... rest)
{
return sqr(add(x, rest...));
}
template <typename T1, typename T2>
-constexpr inline common_type<T1, T2> sqrdiff(const T1& x, const T2& y)
+constexpr inline std::common_type_t<T1, T2> sqrdiff(const T1& x, const T2& y)
{
return sqr(x - y);
}
@@ -495,15 +433,22 @@ KFR_FN(sqrsum)
KFR_FN(sqrdiff)
/// Division
-template <typename T1, typename T2, typename Tout = common_type<T1, T2>>
+template <typename T1, typename T2, typename Tout = std::common_type_t<T1, T2>>
KFR_INTRINSIC Tout div(const T1& x, const T2& y)
{
return static_cast<Tout>(x) / static_cast<Tout>(y);
}
KFR_FN(div)
+/// Modulo
+template <typename T1, typename T2, typename Tout = std::common_type_t<T1, T2>>
+KFR_INTRINSIC Tout mod(const T1& x, const T2& y)
+{
+ return static_cast<Tout>(x) % static_cast<Tout>(y);
+}
+KFR_FN(mod)
/// Remainder
-template <typename T1, typename T2, typename Tout = common_type<T1, T2>>
+template <typename T1, typename T2, typename Tout = std::common_type_t<T1, T2>>
KFR_INTRINSIC Tout rem(const T1& x, const T2& y)
{
return static_cast<Tout>(x) % static_cast<Tout>(y);
@@ -520,13 +465,13 @@ KFR_FN(neg)
/// @brief Fused Multiply-Add
template <typename T1, typename T2, typename T3>
-KFR_INTRINSIC constexpr common_type<T1, T2, T3> fmadd(const T1& x, const T2& y, const T3& z)
+KFR_INTRINSIC constexpr std::common_type_t<T1, T2, T3> fmadd(const T1& x, const T2& y, const T3& z)
{
return x * y + z;
}
/// @brief Fused Multiply-Sub
template <typename T1, typename T2, typename T3>
-KFR_INTRINSIC constexpr common_type<T1, T2, T3> fmsub(const T1& x, const T2& y, const T3& z)
+KFR_INTRINSIC constexpr std::common_type_t<T1, T2, T3> fmsub(const T1& x, const T2& y, const T3& z)
{
return x * y - z;
}
@@ -536,71 +481,59 @@ KFR_FN(fmsub)
/// @brief Linear blend of `x` and `y` (`c` must be in the range 0...+1)
/// Returns `x + ( y - x ) * c`
template <typename T1, typename T2, typename T3, KFR_ENABLE_IF(is_numeric_args<T1, T2, T3>)>
-KFR_INTRINSIC constexpr common_type<T1, T2, T3> mix(const T1& c, const T2& x, const T3& y)
+KFR_INTRINSIC constexpr std::common_type_t<T1, T2, T3> mix(const T1& c, const T2& x, const T3& y)
{
return fmadd(c, y - x, x);
}
/// @brief Linear blend of `x` and `y` (`c` must be in the range -1...+1)
template <typename T1, typename T2, typename T3, KFR_ENABLE_IF(is_numeric_args<T1, T2, T3>)>
-KFR_INTRINSIC constexpr common_type<T1, T2, T3> mixs(const T1& c, const T2& x, const T3& y)
+KFR_INTRINSIC constexpr std::common_type_t<T1, T2, T3> mixs(const T1& c, const T2& x, const T3& y)
{
return mix(fmadd(c, 0.5, 0.5), x, y);
}
KFR_FN(mix)
KFR_FN(mixs)
-template <typename E1, typename E2, typename E3, KFR_ENABLE_IF(is_input_expressions<E1, E2, E3>)>
-KFR_INTRINSIC internal::expression_function<fn::mix, E1, E2, E3> mix(E1&& c, E2&& x, E3&& y)
-{
- return { fn::mix(), std::forward<E1>(c), std::forward<E2>(x), std::forward<E3>(y) };
-}
-
-template <typename E1, typename E2, typename E3, KFR_ENABLE_IF(is_input_expressions<E1, E2, E3>)>
-KFR_INTRINSIC internal::expression_function<fn::mixs, E1, E2, E3> mixs(E1&& c, E2&& x, E3&& y)
-{
- return { fn::mixs(), std::forward<E1>(c), std::forward<E2>(x), std::forward<E3>(y) };
-}
-
namespace intrinsics
{
template <typename T1, typename T2>
-constexpr KFR_INTRINSIC common_type<T1, T2> horner(const T1&, const T2& c0)
+constexpr KFR_INTRINSIC std::common_type_t<T1, T2> horner(const T1&, const T2& c0)
{
return c0;
}
template <typename T1, typename T2, typename T3, typename... Ts>
-constexpr KFR_INTRINSIC common_type<T1, T2, T3, Ts...> horner(const T1& x, const T2& c0, const T3& c1,
- const Ts&... values)
+constexpr KFR_INTRINSIC std::common_type_t<T1, T2, T3, Ts...> horner(const T1& x, const T2& c0, const T3& c1,
+ const Ts&... values)
{
return fmadd(horner(x, c1, values...), x, c0);
}
template <typename T1, typename T2>
-constexpr KFR_INTRINSIC common_type<T1, T2> horner_even(const T1&, const T2& c0)
+constexpr KFR_INTRINSIC std::common_type_t<T1, T2> horner_even(const T1&, const T2& c0)
{
return c0;
}
template <typename T1, typename T2, typename T3, typename... Ts>
-constexpr KFR_INTRINSIC common_type<T1, T2, T3, Ts...> horner_even(const T1& x, const T2& c0, const T3& c2,
- const Ts&... values)
+constexpr KFR_INTRINSIC std::common_type_t<T1, T2, T3, Ts...> horner_even(const T1& x, const T2& c0,
+ const T3& c2, const Ts&... values)
{
const T1 x2 = x * x;
return fmadd(horner(x2, c2, values...), x2, c0);
}
template <typename T1, typename T2>
-constexpr KFR_INTRINSIC common_type<T1, T2> horner_odd(const T1& x, const T2& c1)
+constexpr KFR_INTRINSIC std::common_type_t<T1, T2> horner_odd(const T1& x, const T2& c1)
{
return c1 * x;
}
template <typename T1, typename T2, typename T3, typename... Ts>
-constexpr KFR_INTRINSIC common_type<T1, T2, T3, Ts...> horner_odd(const T1& x, const T2& c1, const T3& c3,
- const Ts&... values)
+constexpr KFR_INTRINSIC std::common_type_t<T1, T2, T3, Ts...> horner_odd(const T1& x, const T2& c1,
+ const T3& c3, const Ts&... values)
{
const T1 x2 = x * x;
return fmadd(horner(x2, c3, values...), x2, c1) * x;
@@ -611,62 +544,44 @@ constexpr KFR_INTRINSIC common_type<T1, T2, T3, Ts...> horner_odd(const T1& x, c
///
/// ``horner(x, 1, 2, 3)`` is equivalent to \(3x^2 + 2x + 1\)
template <typename T1, typename... Ts, KFR_ENABLE_IF(is_numeric_args<T1, Ts...>)>
-constexpr KFR_INTRINSIC common_type<T1, Ts...> horner(const T1& x, const Ts&... c)
+constexpr KFR_INTRINSIC std::common_type_t<T1, Ts...> horner(const T1& x, const Ts&... c)
{
return intrinsics::horner(x, c...);
}
KFR_FN(horner)
-template <typename... E, KFR_ENABLE_IF(is_input_expressions<E...>)>
-KFR_INTRINSIC internal::expression_function<fn::horner, E...> horner(E&&... x)
-{
- return { fn::horner(), std::forward<E>(x)... };
-}
-
/// @brief Calculate polynomial using Horner's method (even powers)
///
/// ``horner_even(x, 1, 2, 3)`` is equivalent to \(3x^4 + 2x^2 + 1\)
template <typename T1, typename... Ts, KFR_ENABLE_IF(is_numeric_args<T1, Ts...>)>
-constexpr KFR_INTRINSIC common_type<T1, Ts...> horner_even(const T1& x, const Ts&... c)
+constexpr KFR_INTRINSIC std::common_type_t<T1, Ts...> horner_even(const T1& x, const Ts&... c)
{
return intrinsics::horner_even(x, c...);
}
KFR_FN(horner_even)
-template <typename... E, KFR_ENABLE_IF(is_input_expressions<E...>)>
-KFR_INTRINSIC internal::expression_function<fn::horner_even, E...> horner_even(E&&... x)
-{
- return { fn::horner_even(), std::forward<E>(x)... };
-}
-
/// @brief Calculate polynomial using Horner's method (odd powers)
///
/// ``horner_odd(x, 1, 2, 3)`` is equivalent to \(3x^5 + 2x^3 + 1x\)
template <typename T1, typename... Ts, KFR_ENABLE_IF(is_numeric_args<T1, Ts...>)>
-constexpr KFR_INTRINSIC common_type<T1, Ts...> horner_odd(const T1& x, const Ts&... c)
+constexpr KFR_INTRINSIC std::common_type_t<T1, Ts...> horner_odd(const T1& x, const Ts&... c)
{
return intrinsics::horner_odd(x, c...);
}
KFR_FN(horner_odd)
-template <typename... E, KFR_ENABLE_IF(is_input_expressions<E...>)>
-KFR_INTRINSIC internal::expression_function<fn::horner_odd, E...> horner_odd(E&&... x)
-{
- return { fn::horner_odd(), std::forward<E>(x)... };
-}
-
/// @brief Calculate Multiplicative Inverse of `x`
/// Returns `1/x`
template <typename T>
constexpr KFR_INTRINSIC T reciprocal(const T& x)
{
- static_assert(is_floating_point<subtype<T>>, "T must be floating point type");
+ static_assert(std::is_floating_point_v<subtype<T>>, "T must be floating point type");
return subtype<T>(1) / x;
}
KFR_FN(reciprocal)
template <typename T1, typename T2>
-KFR_INTRINSIC common_type<T1, T2> mulsign(const T1& x, const T2& y)
+KFR_INTRINSIC std::common_type_t<T1, T2> mulsign(const T1& x, const T2& y)
{
return bitwisexor(x, bitwiseand(y, special_constants<T2>::highbitmask()));
}
@@ -725,72 +640,6 @@ KFR_INTRINSIC vec<T, N> negodd(const vec<T, N>& x)
return x ^ broadcast<N>(T(), -T());
}
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::neg, E1> operator-(E1&& e1)
-{
- return { fn::neg(), std::forward<E1>(e1) };
-}
-
-template <typename E1, KFR_ENABLE_IF(is_input_expression<E1>)>
-KFR_INTRINSIC internal::expression_function<fn::bitwisenot, E1> operator~(E1&& e1)
-{
- return { fn::bitwisenot(), std::forward<E1>(e1) };
-}
-
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::add, E1, E2> operator+(E1&& e1, E2&& e2)
-{
- return { fn::add(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::sub, E1, E2> operator-(E1&& e1, E2&& e2)
-{
- return { fn::sub(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::mul, E1, E2> operator*(E1&& e1, E2&& e2)
-{
- return { fn::mul(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::div, E1, E2> operator/(E1&& e1, E2&& e2)
-{
- return { fn::div(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::bitwiseand, E1, E2> operator&(E1&& e1, E2&& e2)
-{
- return { fn::bitwiseand(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::bitwiseor, E1, E2> operator|(E1&& e1, E2&& e2)
-{
- return { fn::bitwiseor(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::bitwisexor, E1, E2> operator^(E1&& e1, E2&& e2)
-{
- return { fn::bitwisexor(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::shl, E1, E2> operator<<(E1&& e1, E2&& e2)
-{
- return { fn::shl(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
-template <typename E1, typename E2, KFR_ENABLE_IF(is_input_expressions<E1, E2>)>
-KFR_INTRINSIC internal::expression_function<fn::shr, E1, E2> operator>>(E1&& e1, E2&& e2)
-{
- return { fn::shr(), std::forward<E1>(e1), std::forward<E2>(e2) };
-}
-
template <typename T, size_t N1, size_t... Ns>
vec<vec<T, sizeof...(Ns) + 1>, N1> packtranspose(const vec<T, N1>& x, const vec<T, Ns>&... rest)
{
diff --git a/include/kfr/simd/platform.hpp b/include/kfr/simd/platform.hpp
@@ -103,7 +103,7 @@ CMT_UNUSED static const char* cpu_name(cpu_t set)
#ifdef CMT_ARCH_ARM
static const char* names[] = { "generic", "neon", "neon64" };
#endif
- if (set >= cpu_t::lowest && set <= cpu_t::highest)
+ if (CMT_LIKELY(set >= cpu_t::lowest && set <= cpu_t::highest))
return names[static_cast<size_t>(set)];
return "-";
}
@@ -271,7 +271,7 @@ constexpr static size_t minimum_vector_width =
template <typename T>
constexpr static size_t vector_capacity = platform<>::simd_register_count* vector_width<T>;
-#ifdef CMT_COMPILER_MSVC
+#ifdef CMT_COMPILER_IS_MSVC
template <typename T>
constexpr static size_t maximum_vector_size = const_min(static_cast<size_t>(32), vector_width<T> * 2);
#else
diff --git a/include/kfr/simd/read_write.hpp b/include/kfr/simd/read_write.hpp
@@ -26,6 +26,7 @@
#pragma once
#include "impl/read_write.hpp"
+#include <array>
namespace kfr
{
@@ -95,9 +96,9 @@ KFR_INTRINSIC vec<T, Nout * groupsize> gather_stride(const T* base, size_t strid
if constexpr (Nout > 2)
{
constexpr size_t Nlow = prev_poweroftwo(Nout - 1);
- return concat(
- internal::gather_stride_s<Nlow, groupsize>(base, stride, csizeseq<Nlow>),
- internal::gather_stride_s<Nout - Nlow, groupsize>(base + Nlow * stride, stride, csizeseq<Nout - Nlow>));
+ return concat(internal::gather_stride_s<Nlow, groupsize>(base, stride, csizeseq<Nlow>),
+ internal::gather_stride_s<Nout - Nlow, groupsize>(base + Nlow * stride, stride,
+ csizeseq<Nout - Nlow>));
}
else
return internal::gather_stride_s<Nout, groupsize>(base, stride, csizeseq<Nout>);
@@ -117,7 +118,7 @@ KFR_INTRINSIC vec<T, N * groupsize> gather_helper(const T* base, const vec<IT, N
{
return concat(read<groupsize>(base + groupsize * offset[Indices])...);
}
-}
+} // namespace internal
template <size_t groupsize = 1, typename T, size_t N, typename IT>
KFR_INTRINSIC vec<T, N * groupsize> gather(const T* base, const vec<IT, N>& offset)
{
@@ -185,6 +186,12 @@ struct stride_pointer<const T, groupsize>
}
};
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> to_vec(const std::array<T, N>& a)
+{
+ return read<N>(a.data());
+}
+
template <typename T>
constexpr T partial_masks[] = { constants<T>::allones(),
constants<T>::allones(),
diff --git a/include/kfr/simd/round.hpp b/include/kfr/simd/round.hpp
@@ -0,0 +1,108 @@
+/** @addtogroup round
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "impl/round.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+/// @brief Returns the largest integer value not greater than x
+template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
+KFR_INTRINSIC T1 floor(const T1& x)
+{
+ return intrinsics::floor(x);
+}
+
+template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
+KFR_INTRINSIC T1 ceil(const T1& x)
+{
+ return intrinsics::ceil(x);
+}
+
+template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
+KFR_INTRINSIC T1 round(const T1& x)
+{
+ return intrinsics::round(x);
+}
+
+template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
+KFR_INTRINSIC T1 trunc(const T1& x)
+{
+ return intrinsics::trunc(x);
+}
+
+template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
+KFR_INTRINSIC T1 fract(const T1& x)
+{
+ return intrinsics::fract(x);
+}
+
+template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
+KFR_INTRINSIC itype<T1> ifloor(const T1& x)
+{
+ return intrinsics::ifloor(x);
+}
+
+template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
+KFR_INTRINSIC itype<T1> iceil(const T1& x)
+{
+ return intrinsics::iceil(x);
+}
+
+template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
+KFR_INTRINSIC itype<T1> iround(const T1& x)
+{
+ return intrinsics::iround(x);
+}
+
+template <typename T1, KFR_ENABLE_IF(is_numeric<T1>)>
+KFR_INTRINSIC itype<T1> itrunc(const T1& x)
+{
+ return intrinsics::itrunc(x);
+}
+
+template <typename T, KFR_ENABLE_IF(is_f_class<T>)>
+KFR_INTRINSIC T fmod(const T& x, const T& y)
+{
+ return x - trunc(x / y) * y;
+}
+KFR_FN(fmod)
+
+template <typename T, size_t N, KFR_ENABLE_IF(!is_f_class<T>)>
+constexpr KFR_INTRINSIC vec<T, N> rem(const vec<T, N>& x, const vec<T, N>& y)
+{
+ return x % y;
+}
+template <typename T, size_t N, KFR_ENABLE_IF(is_f_class<T>)>
+KFR_INTRINSIC vec<T, N> rem(const vec<T, N>& x, const vec<T, N>& y)
+{
+ return fmod(x, y);
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/include/kfr/simd/saturation.hpp b/include/kfr/simd/saturation.hpp
@@ -0,0 +1,51 @@
+/** @addtogroup saturation
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "impl/saturation.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+/// @brief Adds two arguments using saturation
+template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>),
+ typename Tout = std::common_type_t<T1, T2>>
+KFR_INTRINSIC Tout satadd(const T1& x, const T2& y)
+{
+ return intrinsics::satadd(x, y);
+}
+
+/// @brief Subtracts two arguments using saturation
+template <typename T1, typename T2, KFR_ENABLE_IF(is_numeric_args<T1, T2>),
+ typename Tout = std::common_type_t<T1, T2>>
+KFR_INTRINSIC Tout satsub(const T1& x, const T2& y)
+{
+ return intrinsics::satsub(x, y);
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/include/kfr/simd/select.hpp b/include/kfr/simd/select.hpp
@@ -0,0 +1,49 @@
+/** @addtogroup basic_math
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "impl/select.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+/**
+ * @brief Returns x if m is true, otherwise return y. Order of the arguments is same as in ternary operator.
+ * @code
+ * return m ? x : y
+ * @endcode
+ */
+template <typename T1, size_t N, typename T2, typename T3, KFR_ENABLE_IF(is_numeric_args<T1, T2, T3>),
+ typename Tout = subtype<std::common_type_t<T2, T3>>>
+KFR_INTRINSIC vec<Tout, N> select(const mask<T1, N>& m, const T2& x, const T3& y)
+{
+ return intrinsics::select(bitcast<Tout>(cast<itype<Tout>>(bitcast<itype<T1>>(m.asvec()))).asmask(),
+ broadcastto<Tout>(x), broadcastto<Tout>(y));
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/include/kfr/simd/shuffle.hpp b/include/kfr/simd/shuffle.hpp
@@ -32,6 +32,9 @@
#include <tuple>
#include <utility>
+CMT_PRAGMA_MSVC(warning(push))
+CMT_PRAGMA_MSVC(warning(disable : 5051))
+
namespace kfr
{
@@ -130,6 +133,14 @@ KFR_INTRINSIC vec<T, N + Ncount> padhigh(const vec<T, N>& x)
{
return x.shuffle(csizeseq<N + Ncount>);
}
+template <size_t Ncount, typename T, size_t N>
+KFR_INTRINSIC vec<T, N + Ncount> padhigh(const vec<T, N>& x, identity<T> newvalue)
+{
+ if constexpr (Ncount == 0)
+ return x;
+ else
+ return concat(x, broadcast<Ncount, T>(newvalue));
+}
KFR_FN(padhigh)
template <size_t Ncount, typename T, size_t N>
@@ -137,6 +148,14 @@ KFR_INTRINSIC vec<T, N + Ncount> padlow(const vec<T, N>& x)
{
return x.shuffle(csizeseq<N + Ncount, 0 - Ncount>);
}
+template <size_t Ncount, typename T, size_t N>
+KFR_INTRINSIC vec<T, N + Ncount> padlow(const vec<T, N>& x, identity<T> newvalue)
+{
+ if constexpr (Ncount == 0)
+ return x;
+ else
+ return concat(broadcast<Ncount, T>(newvalue), x);
+}
KFR_FN(padlow)
template <size_t Nout, typename T>
@@ -566,6 +585,33 @@ constexpr KFR_INTRINSIC vec<T, N> enumerate(vec_shape<T, N>)
{
return generate_vector<T, N, internal::generate_index<start, stride>>();
}
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> enumerate(vec_shape<T, N> sh, identity<T> step)
+{
+ if constexpr (N == 1)
+ {
+ return czeros;
+ }
+ else if constexpr (!is_poweroftwo(N))
+ {
+ return slice<0, N>(enumerate(vec_shape<T, next_poweroftwo(N)>{}, step));
+ }
+ else
+ {
+ vec<T, N> vv = step;
+ vec<T, N> zz(czeros);
+
+ vec<T, N> acc = blend(zz, vv, csizeseq<N> % csize<2>);
+ cfor(csize<0>, csize<ilog2(N) - 1>,
+ [&](auto idx) CMT_INLINE_LAMBDA
+ {
+ vv = vv + vv;
+ acc += blend(zz, vv, csizeseq<N> / (csize<2 << (idx)>) % csize<2>);
+ });
+ return acc;
+ }
+}
+
KFR_FN(enumerate)
template <typename T, size_t N, size_t start = 0, size_t size = 1, int on = 1, int off = 0>
@@ -584,4 +630,6 @@ KFR_FN(onoff)
} // namespace CMT_ARCH_NAME
} // namespace kfr
#define KFR_SHUFFLE_SPECIALIZATIONS 1
-#include "impl/specializations.i"
+#include "impl/specializations.hpp"
+
+CMT_PRAGMA_MSVC(warning(pop))
diff --git a/include/kfr/simd/sort.hpp b/include/kfr/simd/sort.hpp
@@ -0,0 +1,103 @@
+/** @addtogroup sort
+ * @{
+ */
+/*
+ Copyright (C) 2016-2022 Fractalium Ltd (https://www.kfrlib.com)
+ This file is part of KFR
+
+ KFR is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ KFR is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with KFR.
+
+ If GPL is not suitable for your project, you must purchase a commercial license to use KFR.
+ Buying a commercial license is mandatory as soon as you develop commercial activities without
+ disclosing the source code of your own applications.
+ See https://www.kfrlib.com for details.
+ */
+#pragma once
+
+#include "min_max.hpp"
+#include "shuffle.hpp"
+#include "vec.hpp"
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+/**
+ * @brief Sort the elements in the vector in ascending order
+ * @param x input vector
+ * @return sorted vector
+ * @code
+ * CHECK(sort(make_vector(1000, 1, 2, -10)) == make_vector(-10, 1, 2, 1000));
+ * @endcode
+ */
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> sort(const vec<T, N>& x)
+{
+ constexpr size_t Nhalf = N / 2;
+ vec<T, Nhalf> e = low(x);
+ vec<T, Nhalf> o = high(x);
+ constexpr auto blend0 = cconcat(csizes<1>, csizeseq<Nhalf - 1, 0, 0>);
+ for (size_t i = 0; i < Nhalf; i++)
+ {
+ vec<T, Nhalf> t;
+ t = min(e, o);
+ o = max(e, o);
+ o = rotateright<1>(o);
+ e = t;
+ t = max(e, o);
+ o = min(e, o);
+ e = t;
+ t = blend(e, o, blend0);
+ o = blend(o, e, blend0);
+ o = rotateleft<1>(o);
+ e = t;
+ }
+ return interleavehalves(concat(e, o));
+}
+
+/**
+ * @brief Sort the elements in the vector in descending order
+ * @param x input vector
+ * @return sorted vector
+ * @code
+ * CHECK(sort(make_vector(1000, 1, 2, -10)) == make_vector(1000, 2, 1, -10));
+ * @endcode
+ */
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> sortdesc(const vec<T, N>& x)
+{
+ constexpr size_t Nhalf = N / 2;
+ vec<T, Nhalf> e = low(x);
+ vec<T, Nhalf> o = high(x);
+ constexpr auto blend0 = cconcat(csizes<1>, csizeseq<Nhalf - 1, 0, 0>);
+ for (size_t i = 0; i < Nhalf; i++)
+ {
+ vec<T, Nhalf> t;
+ t = max(e, o);
+ o = min(e, o);
+ o = rotateright<1>(o);
+ e = t;
+ t = min(e, o);
+ o = max(e, o);
+ e = t;
+ t = blend(e, o, blend0);
+ o = blend(o, e, blend0);
+ o = rotateleft<1>(o);
+ e = t;
+ }
+ return interleavehalves(concat(e, o));
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/include/kfr/simd/types.hpp b/include/kfr/simd/types.hpp
@@ -57,80 +57,19 @@ using namespace cometa;
using cometa::fbase;
using cometa::fmax;
-// primary template (used for zero types)
template <typename... T>
-struct common_type_impl
-{
-};
-
-template <typename... T>
-using decay_common = decay<common_type_impl<T...>>;
-
-template <typename T1, typename T2, template <typename TT> class result_type, typename = void>
-struct common_type_from_subtypes
-{
-};
-
-template <typename T1, typename T2, template <typename TT> class result_type>
-struct common_type_from_subtypes<T1, T2, result_type, void_t<typename common_type_impl<T1, T2>::type>>
-{
- using type = result_type<typename common_type_impl<T1, T2>::type>;
-};
-
-template <typename T>
-struct common_type_impl<T>
-{
- using type = decay<T>;
-};
-
-template <typename T1, typename T2>
-using common_for_two = decltype(false ? std::declval<T1>() : std::declval<T2>());
-
-template <typename T1, typename T2, typename = void>
-struct common_type_2_default
-{
-};
-
-template <typename T1, typename T2>
-struct common_type_2_default<T1, T2, void_t<common_for_two<T1, T2>>>
-{
- using type = std::decay_t<common_for_two<T1, T2>>;
-};
+using decay_common = std::decay_t<std::common_type_t<T...>>;
-template <typename T1, typename T2, typename D1 = decay<T1>, typename D2 = decay<T2>>
-struct common_type_2_impl : common_type_impl<D1, D2>
+template <typename CT, template <typename T> typename Tpl, typename = void>
+struct construct_common_type
{
};
-
-template <typename D1, typename D2>
-struct common_type_2_impl<D1, D2, D1, D2> : common_type_2_default<D1, D2>
-{
-};
-
-template <typename T1, typename T2>
-struct common_type_impl<T1, T2> : common_type_2_impl<T1, T2>
+template <typename CT, template <typename T> typename Tpl>
+struct construct_common_type<CT, Tpl, std::void_t<typename CT::type>>
{
+ using type = Tpl<typename CT::type>;
};
-template <typename AlwaysVoid, typename T1, typename T2, typename... R>
-struct common_type_multi_impl
-{
-};
-
-template <typename T1, typename T2, typename... R>
-struct common_type_multi_impl<void_t<typename common_type_impl<T1, T2>::type>, T1, T2, R...>
- : common_type_impl<typename common_type_impl<T1, T2>::type, R...>
-{
-};
-
-template <typename T1, typename T2, typename... R>
-struct common_type_impl<T1, T2, R...> : common_type_multi_impl<void, T1, T2, R...>
-{
-};
-
-template <typename... T>
-using common_type = typename common_type_impl<T...>::type;
-
constexpr ctypes_t<i8, i16, i32, i64> signed_types{};
constexpr ctypes_t<u8, u16, u32, u64> unsigned_types{};
constexpr ctypes_t<i8, i16, i32, i64, u8, u16, u32, u64> integer_types{};
@@ -248,8 +187,9 @@ struct f16
template <size_t bits>
struct bitmask
{
- using type = conditional<(bits > 32), uint64_t,
- conditional<(bits > 16), uint32_t, conditional<(bits > 8), uint16_t, uint8_t>>>;
+ using type = std::conditional_t<
+ (bits > 32), uint64_t,
+ std::conditional_t<(bits > 16), uint32_t, std::conditional_t<(bits > 8), uint16_t, uint8_t>>>;
bitmask(type val) : value(val) {}
@@ -401,12 +341,27 @@ struct initialvalue
template <typename T>
constexpr inline bool is_simd_type =
- is_same<T, float> || is_same<T, double> || is_same<T, signed char> || is_same<T, unsigned char> ||
- is_same<T, short> || is_same<T, unsigned short> || is_same<T, int> || is_same<T, unsigned int> ||
- is_same<T, long> || is_same<T, unsigned long> || is_same<T, long long> || is_same<T, unsigned long long>;
+ std::is_same_v<T, float> || std::is_same_v<T, double> || std::is_same_v<T, signed char> ||
+ std::is_same_v<T, unsigned char> || std::is_same_v<T, short> || std::is_same_v<T, unsigned short> ||
+ std::is_same_v<T, int> || std::is_same_v<T, unsigned int> || std::is_same_v<T, long> ||
+ std::is_same_v<T, unsigned long> || std::is_same_v<T, long long> || std::is_same_v<T, unsigned long long>;
+
+template <typename T>
+constexpr inline bool is_simd_float_type = std::is_same_v<T, float> || std::is_same_v<T, double>;
+
+template <typename T>
+constexpr inline bool is_simd_int_type =
+ std::is_same_v<T, signed char> || std::is_same_v<T, unsigned char> || std::is_same_v<T, short> ||
+ std::is_same_v<T, unsigned short> || std::is_same_v<T, int> || std::is_same_v<T, unsigned int> ||
+ std::is_same_v<T, long> || std::is_same_v<T, unsigned long> || std::is_same_v<T, long long> ||
+ std::is_same_v<T, unsigned long long>;
template <typename T>
constexpr inline bool is_simd_type<bit<T>> = is_simd_type<T>;
+template <typename T>
+constexpr inline bool is_simd_float_type<bit<T>> = is_simd_float_type<T>;
+template <typename T>
+constexpr inline bool is_simd_int_type<bit<T>> = is_simd_int_type<T>;
template <typename T, size_t N>
struct vec_shape
diff --git a/include/kfr/simd/vec.hpp b/include/kfr/simd/vec.hpp
@@ -25,6 +25,7 @@
*/
#pragma once
+#include "../cometa/string.hpp"
#include "../version.hpp"
#include "constants.hpp"
#include "impl/backend.hpp"
@@ -88,14 +89,20 @@ CMT_PRAGMA_MSVC(warning(disable : 4814))
namespace kfr
{
-inline namespace CMT_ARCH_NAME
-{
-
template <typename T, size_t N>
struct alignas(next_poweroftwo(sizeof(T)) * next_poweroftwo(N)) portable_vec
{
static constexpr vec_shape<T, N> shape() CMT_NOEXCEPT { return {}; }
+ constexpr portable_vec() = default;
+
+ constexpr portable_vec(T value) : portable_vec(csizeseq<N>, value) {}
+
+ template <typename... Ts, size_t NN = N, KFR_ENABLE_IF(NN >= 2)>
+ constexpr portable_vec(T v1, T v2, Ts... args) : elem{ v1, v2, static_cast<T>(args)... }
+ {
+ }
+
static_assert(N > 0 && N <= 1024, "Invalid vector size");
static_assert(is_simd_type<T> || !compound_type_traits<T>::is_scalar, "Invalid vector type");
@@ -106,11 +113,30 @@ struct alignas(next_poweroftwo(sizeof(T)) * next_poweroftwo(N)) portable_vec
constexpr static size_t size() CMT_NOEXCEPT { return N; }
T elem[N];
+
+ constexpr T operator[](size_t index) const { return elem[index]; }
+ constexpr T& operator[](size_t index) { return elem[index]; }
+ constexpr T front() const { return elem[0]; }
+ constexpr T& front() { return elem[0]; }
+ constexpr T back() const { return elem[N - 1]; }
+ constexpr T& back() { return elem[N - 1]; }
+
+private:
+ template <size_t... indices>
+ constexpr portable_vec(csizes_t<indices...>, T value) : elem{ (static_cast<void>(indices), value)... }
+ {
+ }
};
+inline namespace CMT_ARCH_NAME
+{
+
template <typename T, size_t N>
struct vec;
+template <typename T>
+constexpr inline size_t vec_rank = 0;
+
template <typename T, size_t N>
struct vec_halves
{
@@ -126,12 +152,22 @@ struct vec_halves<T, 1>
namespace internal
{
+enum class conv_t
+{
+ promote,
+ broadcast,
+};
// scalar to scalar
-template <typename To, typename From>
+template <size_t ToRank, size_t FromRank, typename To, typename From, conv_t conv>
struct conversion
{
- static_assert(is_convertible<From, To>, "");
+};
+
+template <typename To, typename From, conv_t conv>
+struct conversion<0, 0, To, From, conv>
+{
+ static_assert(std::is_convertible_v<From, To>);
static To cast(const From& value) { return value; }
};
@@ -160,14 +196,6 @@ struct compoundcast<vec<vec<T, N1>, N2>>
static vec<vec<T, N1>, N2> from_flat(const vec<T, N1 * N2>& x) { return x.v; }
};
-template <typename T, size_t N1, size_t N2, size_t N3>
-struct compoundcast<vec<vec<vec<T, N1>, N2>, N3>>
-{
- static vec<T, N1 * N2 * N3> to_flat(const vec<vec<vec<T, N1>, N2>, N3>& x) { return x.v; }
-
- static vec<vec<vec<T, N1>, N2>, N3> from_flat(const vec<T, N1 * N2 * N3>& x) { return x.v; }
-};
-
template <typename T, size_t N_>
inline constexpr size_t vec_alignment =
const_max(alignof(intrinsics::simd<typename compound_type_traits<T>::deep_subtype,
@@ -207,10 +235,10 @@ struct alignas(internal::vec_alignment<T, N_>) vec
using simd_type = intrinsics::simd<ST, SN>;
using uvalue_type = utype<T>;
- using iuvalue_type = conditional<is_i_class<T>, T, uvalue_type>;
+ using iuvalue_type = std::conditional_t<is_i_class<T>, T, uvalue_type>;
using uscalar_type = utype<ST>;
- using iuscalar_type = conditional<is_i_class<ST>, ST, uscalar_type>;
+ using iuscalar_type = std::conditional_t<is_i_class<ST>, ST, uscalar_type>;
using usimd_type = intrinsics::simd<uscalar_type, SN>;
using iusimd_type = intrinsics::simd<iuscalar_type, SN>;
@@ -221,7 +249,7 @@ struct alignas(internal::vec_alignment<T, N_>) vec
// default
KFR_MEM_INTRINSIC constexpr vec() CMT_NOEXCEPT {}
-#if defined(_MSC_VER) && !defined (__clang__)
+#if defined(_MSC_VER) && !defined(__clang__)
// MSVC Internal Compiler Error workaround
// copy
KFR_MEM_INTRINSIC constexpr vec(const vec& value) CMT_NOEXCEPT : v(value.v) {}
@@ -251,14 +279,16 @@ struct alignas(internal::vec_alignment<T, N_>) vec
#endif
// from scalar
- template <typename U, KFR_ENABLE_IF(is_convertible<U, value_type>&& compound_type_traits<T>::is_scalar)>
+ template <typename U,
+ KFR_ENABLE_IF(std::is_convertible_v<U, value_type>&& compound_type_traits<T>::is_scalar)>
KFR_MEM_INTRINSIC vec(const U& s) CMT_NOEXCEPT
: v(intrinsics::simd_broadcast(intrinsics::simd_t<unwrap_bit<ST>, SN>{},
static_cast<unwrap_bit<ST>>(static_cast<ST>(s))))
{
}
- template <typename U, KFR_ENABLE_IF(is_convertible<U, value_type> && !compound_type_traits<T>::is_scalar)>
+ template <typename U,
+ KFR_ENABLE_IF(std::is_convertible_v<U, value_type> && !compound_type_traits<T>::is_scalar)>
KFR_MEM_INTRINSIC vec(const U& s) CMT_NOEXCEPT
: v(intrinsics::simd_shuffle(intrinsics::simd_t<unwrap_bit<ST>, SW>{},
internal::compoundcast<T>::to_flat(static_cast<T>(s)).v,
@@ -282,7 +312,7 @@ struct alignas(internal::vec_alignment<T, N_>) vec
}
// from vector of another type
- template <typename U, KFR_ENABLE_IF(is_convertible<U, value_type> &&
+ template <typename U, KFR_ENABLE_IF(std::is_convertible_v<U, value_type> &&
(compound_type_traits<T>::is_scalar && !is_bit<U>))>
KFR_MEM_INTRINSIC vec(const vec<U, N>& x) CMT_NOEXCEPT
: v(intrinsics::simd_convert(
@@ -290,15 +320,28 @@ struct alignas(internal::vec_alignment<T, N_>) vec
{
}
- template <typename U, KFR_ENABLE_IF(is_convertible<U, value_type> &&
+ // from lambda
+ template <typename Fn, KFR_ENABLE_IF(std::is_invocable_r_v<T, Fn, size_t>)>
+ KFR_MEM_INTRINSIC vec(Fn&& fn) CMT_NOEXCEPT
+ {
+ for (size_t i = 0; i < N; ++i)
+ {
+ auto v = fn(i);
+ set(i, v);
+ }
+ }
+
+ template <typename U, KFR_ENABLE_IF(std::is_convertible_v<U, value_type> &&
!(compound_type_traits<T>::is_scalar && !is_bit<U>))>
KFR_MEM_INTRINSIC vec(const vec<U, N>& x) CMT_NOEXCEPT
- : v(internal::conversion<vec<T, N>, vec<U, N>>::cast(x).v)
+ : v(internal::conversion<vec_rank<T> + 1, vec_rank<U> + 1, vec<T, N>, vec<U, N>,
+ internal::conv_t::promote>::cast(x)
+ .v)
{
}
// from list of vectors
- template <size_t... Ns, typename = enable_if<csum<size_t, Ns...>() == N>>
+ template <size_t... Ns, typename = std::enable_if_t<csum<size_t, Ns...>() == N>>
KFR_MEM_INTRINSIC vec(const vec<T, Ns>&... vs) CMT_NOEXCEPT
: v(intrinsics::simd_concat<ST, (SW * Ns)...>(vs.v...))
{
@@ -347,9 +390,17 @@ struct alignas(internal::vec_alignment<T, N_>) vec
KFR_MEM_INTRINSIC constexpr element operator[](size_t index) & CMT_NOEXCEPT { return { *this, index }; }
- KFR_MEM_INTRINSIC value_type front() const CMT_NOEXCEPT { return get(csize<0>); }
+ KFR_MEM_INTRINSIC value_type front() const& CMT_NOEXCEPT { return get(csize<0>); }
+
+ KFR_MEM_INTRINSIC value_type back() const& CMT_NOEXCEPT { return get(csize<N - 1>); }
+
+ KFR_MEM_INTRINSIC value_type front() && CMT_NOEXCEPT { return get(csize<0>); }
- KFR_MEM_INTRINSIC value_type back() const CMT_NOEXCEPT { return get(csize<N - 1>); }
+ KFR_MEM_INTRINSIC value_type back() && CMT_NOEXCEPT { return get(csize<N - 1>); }
+
+ KFR_MEM_INTRINSIC element front() & CMT_NOEXCEPT { return { *this, 0 }; }
+
+ KFR_MEM_INTRINSIC element back() & CMT_NOEXCEPT { return { *this, N - 1 }; }
template <int dummy = 0, KFR_ENABLE_IF(dummy == 0 && compound_type_traits<T>::is_scalar)>
KFR_MEM_INTRINSIC constexpr value_type get(size_t index) const CMT_NOEXCEPT
@@ -361,7 +412,8 @@ struct alignas(internal::vec_alignment<T, N_>) vec
KFR_ENABLE_IF(dummy == 0 && !compound_type_traits<T>::is_scalar)>
KFR_MEM_INTRINSIC constexpr value_type get(size_t index) const CMT_NOEXCEPT
{
- union {
+ union
+ {
simd_type v;
T s[N];
} u{ this->v };
@@ -397,7 +449,8 @@ struct alignas(internal::vec_alignment<T, N_>) vec
template <int dummy = 0, KFR_ENABLE_IF(dummy == 0 && !compound_type_traits<T>::is_scalar)>
KFR_MEM_INTRINSIC constexpr void set(size_t index, const value_type& s) CMT_NOEXCEPT
{
- union {
+ union
+ {
simd_type v;
T s[N];
} u{ this->v };
@@ -428,6 +481,49 @@ struct alignas(internal::vec_alignment<T, N_>) vec
return *this;
}
+ KFR_MEM_INTRINSIC element& operator+=(const value_type& s) CMT_NOEXCEPT
+ {
+ v.set(index, v.get(index) + s);
+ return *this;
+ }
+ KFR_MEM_INTRINSIC element& operator-=(const value_type& s) CMT_NOEXCEPT
+ {
+ v.set(index, v.get(index) - s);
+ return *this;
+ }
+ KFR_MEM_INTRINSIC element& operator*=(const value_type& s) CMT_NOEXCEPT
+ {
+ v.set(index, v.get(index) * s);
+ return *this;
+ }
+ KFR_MEM_INTRINSIC element& operator/=(const value_type& s) CMT_NOEXCEPT
+ {
+ v.set(index, v.get(index) / s);
+ return *this;
+ }
+ KFR_MEM_INTRINSIC element& operator++() CMT_NOEXCEPT
+ {
+ v.set(index, v.get(index) + 1);
+ return *this;
+ }
+ KFR_MEM_INTRINSIC element& operator--() CMT_NOEXCEPT
+ {
+ v.set(index, v.get(index) - 1);
+ return *this;
+ }
+ KFR_MEM_INTRINSIC value_type operator++(int) CMT_NOEXCEPT
+ {
+ value_type val = v.get(index) + 1;
+ v.set(index, val);
+ return val;
+ }
+ KFR_MEM_INTRINSIC value_type operator--(int) CMT_NOEXCEPT
+ {
+ value_type val = v.get(index) - 1;
+ v.set(index, val);
+ return val;
+ }
+
KFR_MEM_INTRINSIC element& operator=(const element& s) CMT_NOEXCEPT
{
v.set(index, static_cast<value_type>(s));
@@ -470,7 +566,8 @@ struct alignas(internal::vec_alignment<T, N_>) vec
using simd_element_type = simd<ST, simd_element_size>;
public:
- union {
+ union
+ {
simd_type v;
vec_halves<T, N> h;
// simd_element_type w[simd_element_count];
@@ -478,8 +575,11 @@ public:
};
};
+template <typename... T>
+vec(T&&...) -> vec<std::common_type_t<T...>, sizeof...(T)>;
+
template <typename T>
-constexpr inline bool is_vec_element = is_simd_type<deep_subtype<remove_const<T>>>;
+constexpr inline bool is_vec_element = is_simd_type<deep_subtype<std::remove_const_t<T>>>;
template <typename T, size_t N, size_t... indices>
KFR_INTRINSIC vec<T, sizeof...(indices)> shufflevector(const vec<T, N>& x,
@@ -533,21 +633,21 @@ constexpr KFR_INTRINSIC vec<To, N> builtin_convertvector(const vec<From, N>& val
}
// vector to vector
-template <typename To, typename From, size_t N, size_t N2>
-struct conversion<vec<To, N>, vec<From, N2>>
+template <typename To, typename From, size_t N, size_t N2, conv_t conv>
+struct conversion<1, 1, vec<To, N>, vec<From, N2>, conv>
{
static_assert(N == N2, "");
- static_assert(!is_compound<To>, "");
- static_assert(!is_compound<From>, "");
+ static_assert(!is_compound_type<To>, "");
+ static_assert(!is_compound_type<From>, "");
static vec<To, N> cast(const vec<From, N>& value) { return vec<To, N>(value); }
};
// scalar to vector
-template <typename To, typename From, size_t N>
-struct conversion<vec<To, N>, From>
+template <typename To, typename From, size_t N, conv_t conv>
+struct conversion<1, 0, vec<To, N>, From, conv>
{
- static_assert(is_convertible<From, To>, "");
+ static_assert(std::is_convertible_v<From, To>, "");
static vec<To, N> cast(const From& value) { return broadcast<N>(static_cast<To>(value)); }
};
@@ -573,123 +673,99 @@ constexpr KFR_INTRINSIC Tout cast(const From& value) CMT_NOEXCEPT
return static_cast<Tout>(value);
}
-template <typename Tout, typename Tin, size_t N, KFR_ENABLE_IF(!is_same<Tin, Tout>)>
+template <typename Tout, typename Tin, size_t N, KFR_ENABLE_IF(!std::is_same_v<Tin, Tout>)>
constexpr KFR_INTRINSIC vec<Tout, N> cast(const vec<Tin, N>& value) CMT_NOEXCEPT
{
return vec<Tout, N>(value);
}
-template <typename Tout, typename Tin, size_t N1, size_t N2, KFR_ENABLE_IF(!is_same<Tin, Tout>)>
+template <typename Tout, typename Tin, size_t N1, size_t N2, KFR_ENABLE_IF(!std::is_same_v<Tin, Tout>)>
constexpr KFR_INTRINSIC vec<vec<Tout, N1>, N2> cast(const vec<vec<Tin, N1>, N2>& value) CMT_NOEXCEPT
{
return vec<vec<Tout, N1>, N2>(value);
}
-template <typename Tout, typename Tin, size_t N1, size_t N2, size_t N3, KFR_ENABLE_IF(!is_same<Tin, Tout>)>
-constexpr KFR_INTRINSIC vec<vec<vec<Tout, N1>, N2>, N3> cast(const vec<vec<vec<Tin, N1>, N2>, N3>& value)
- CMT_NOEXCEPT
-{
- return vec<vec<vec<Tout, N1>, N2>, N3>(value);
-}
-
-template <typename Tout, typename Tin, size_t N, KFR_ENABLE_IF(is_same<Tin, Tout>)>
+template <typename Tout, typename Tin, size_t N, KFR_ENABLE_IF(std::is_same_v<Tin, Tout>)>
constexpr KFR_INTRINSIC const vec<Tin, N>& cast(const vec<Tin, N>& value) CMT_NOEXCEPT
{
return value;
}
-template <typename Tout, typename Tin, size_t N1, size_t N2, KFR_ENABLE_IF(is_same<Tin, Tout>)>
+template <typename Tout, typename Tin, size_t N1, size_t N2, KFR_ENABLE_IF(std::is_same_v<Tin, Tout>)>
constexpr KFR_INTRINSIC const vec<vec<Tin, N1>, N2>& cast(const vec<vec<Tin, N1>, N2>& value) CMT_NOEXCEPT
{
return value;
}
-template <typename Tout, typename Tin, size_t N1, size_t N2, size_t N3, KFR_ENABLE_IF(is_same<Tin, Tout>)>
-constexpr KFR_INTRINSIC const vec<vec<vec<Tin, N1>, N2>, N3>& cast(
- const vec<vec<vec<Tin, N1>, N2>, N3>& value) CMT_NOEXCEPT
-{
- return value;
-}
-
//
template <typename To, typename From,
typename Tout = typename compound_type_traits<From>::template deep_rebind<To>>
-constexpr KFR_INTRINSIC Tout innercast(const From& value) CMT_NOEXCEPT
+constexpr KFR_INTRINSIC Tout broadcastto(const From& value) CMT_NOEXCEPT
{
return static_cast<Tout>(value);
}
-template <typename Tout, typename Tin, size_t N, KFR_ENABLE_IF(!is_same<Tin, Tout>)>
-constexpr KFR_INTRINSIC vec<Tout, N> innercast(const vec<Tin, N>& value) CMT_NOEXCEPT
-{
- return vec<Tout, N>(value);
-}
-
-template <typename Tout, typename Tin, size_t N1, size_t N2, KFR_ENABLE_IF(!is_same<Tin, Tout>)>
-constexpr KFR_INTRINSIC vec<vec<Tout, N1>, N2> innercast(const vec<vec<Tin, N1>, N2>& value) CMT_NOEXCEPT
+template <typename Tout, typename Tin, size_t N, KFR_ENABLE_IF(!std::is_same_v<Tin, Tout>)>
+constexpr KFR_INTRINSIC vec<Tout, N> broadcastto(const vec<Tin, N>& value) CMT_NOEXCEPT
{
- return vec<vec<Tout, N1>, N2>(value);
+ return internal::conversion<vec_rank<Tout> + 1, 1, vec<Tout, N>, vec<Tin, N>,
+ internal::conv_t::broadcast>::cast(value);
}
-template <typename Tout, typename Tin, size_t N1, size_t N2, size_t N3, KFR_ENABLE_IF(!is_same<Tin, Tout>)>
-constexpr KFR_INTRINSIC vec<vec<vec<Tout, N1>, N2>, N3> innercast(const vec<vec<vec<Tin, N1>, N2>, N3>& value)
- CMT_NOEXCEPT
+template <typename Tout, typename Tin, size_t N1, size_t N2, KFR_ENABLE_IF(!std::is_same_v<Tin, Tout>)>
+constexpr KFR_INTRINSIC vec<vec<Tout, N1>, N2> broadcastto(const vec<vec<Tin, N1>, N2>& value) CMT_NOEXCEPT
{
- return vec<vec<vec<Tout, N1>, N2>, N3>(value);
+ return internal::conversion<vec_rank<Tout> + 2, 2, vec<vec<Tout, N1>, N2>, vec<vec<Tin, N1>, N2>,
+ internal::conv_t::broadcast>::cast(value);
}
-template <typename Tout, typename Tin, size_t N, KFR_ENABLE_IF(is_same<Tin, Tout>)>
-constexpr KFR_INTRINSIC const vec<Tin, N>& innercast(const vec<Tin, N>& value) CMT_NOEXCEPT
+template <typename Tout, typename Tin, size_t N, KFR_ENABLE_IF(std::is_same_v<Tin, Tout>)>
+constexpr KFR_INTRINSIC const vec<Tin, N>& broadcastto(const vec<Tin, N>& value) CMT_NOEXCEPT
{
return value;
}
-template <typename Tout, typename Tin, size_t N1, size_t N2, KFR_ENABLE_IF(is_same<Tin, Tout>)>
-constexpr KFR_INTRINSIC const vec<vec<Tin, N1>, N2>& innercast(const vec<vec<Tin, N1>, N2>& value)
+template <typename Tout, typename Tin, size_t N1, size_t N2, KFR_ENABLE_IF(std::is_same_v<Tin, Tout>)>
+constexpr KFR_INTRINSIC const vec<vec<Tin, N1>, N2>& broadcastto(const vec<vec<Tin, N1>, N2>& value)
CMT_NOEXCEPT
{
return value;
}
-template <typename Tout, typename Tin, size_t N1, size_t N2, size_t N3, KFR_ENABLE_IF(is_same<Tin, Tout>)>
-constexpr KFR_INTRINSIC const vec<vec<vec<Tin, N1>, N2>, N3>& innercast(
- const vec<vec<vec<Tin, N1>, N2>, N3>& value) CMT_NOEXCEPT
-{
- return value;
-}
-
//
-
-template <typename Tout, typename Tin, size_t N, KFR_ENABLE_IF(!is_same<Tin, Tout>)>
-constexpr KFR_INTRINSIC vec<Tout, N> elemcast(const vec<Tin, N>& value) CMT_NOEXCEPT
-{
- return vec<Tout, N>(value);
-}
-
-template <typename Tout, typename Tin, size_t N, KFR_ENABLE_IF(is_same<Tin, Tout>)>
-constexpr KFR_INTRINSIC const vec<Tin, N>& elemcast(const vec<Tin, N>& value) CMT_NOEXCEPT
+template <typename Tout, typename Tin>
+constexpr KFR_INTRINSIC Tout promoteto(const Tin& value) CMT_NOEXCEPT
{
- return value;
+ return static_cast<Tout>(value);
}
-template <typename Tout, typename Tin, size_t N1, size_t N2, KFR_ENABLE_IF(!is_same<Tin, Tout>)>
-constexpr KFR_INTRINSIC vec<Tout, N2> elemcast(const vec<vec<Tin, N1>, N2>& value) CMT_NOEXCEPT
+template <typename Tout, typename Tin, size_t N>
+constexpr KFR_INTRINSIC vec<Tout, N> promoteto(const vec<Tin, N>& value) CMT_NOEXCEPT
{
- return vec<Tout, N2>(value);
+ if constexpr (std::is_same_v<Tin, Tout>)
+ return value;
+ else
+ return internal::conversion<vec_rank<Tout> + 1, 1, vec<Tout, N>, vec<Tin, N>,
+ internal::conv_t::promote>::cast(value);
}
-template <typename Tout, typename Tin, size_t N1, size_t N2, size_t N3, KFR_ENABLE_IF(!is_same<Tin, Tout>)>
-constexpr KFR_INTRINSIC vec<Tout, N3> elemcast(const vec<vec<vec<Tin, N1>, N2>, N3>& value) CMT_NOEXCEPT
+template <typename Tout, typename Tin, size_t N1, size_t N2>
+constexpr KFR_INTRINSIC vec<Tout, N2> promoteto(const vec<vec<Tin, N1>, N2>& value) CMT_NOEXCEPT
{
- return vec<Tout, N3>(value);
+ if constexpr (std::is_same_v<Tin, Tout>)
+ return value;
+ else
+ return internal::conversion<vec_rank<Tout> + 1, 2, vec<Tout, N2>, vec<vec<Tin, N1>, N2>,
+ internal::conv_t::promote>::cast(value);
}
template <typename To, typename From>
CMT_GNU_CONSTEXPR KFR_INTRINSIC To bitcast(const From& value) CMT_NOEXCEPT
{
static_assert(sizeof(From) == sizeof(To), "bitcast: Incompatible types");
- union {
+ union
+ {
From from;
To to;
} u{ value };
@@ -702,25 +778,25 @@ CMT_GNU_CONSTEXPR KFR_INTRINSIC vec<To, Nout> bitcast(const vec<From, N>& value)
return vec<To, Nout>::frombits(value);
}
-template <typename From, typename To = utype<From>, KFR_ENABLE_IF(!is_compound<From>)>
+template <typename From, typename To = utype<From>, KFR_ENABLE_IF(!is_compound_type<From>)>
constexpr KFR_INTRINSIC To ubitcast(const From& value) CMT_NOEXCEPT
{
return bitcast<To>(value);
}
-template <typename From, typename To = itype<From>, KFR_ENABLE_IF(!is_compound<From>)>
+template <typename From, typename To = itype<From>, KFR_ENABLE_IF(!is_compound_type<From>)>
constexpr KFR_INTRINSIC To ibitcast(const From& value) CMT_NOEXCEPT
{
return bitcast<To>(value);
}
-template <typename From, typename To = ftype<From>, KFR_ENABLE_IF(!is_compound<From>)>
+template <typename From, typename To = ftype<From>, KFR_ENABLE_IF(!is_compound_type<From>)>
constexpr KFR_INTRINSIC To fbitcast(const From& value) CMT_NOEXCEPT
{
return bitcast<To>(value);
}
-template <typename From, typename To = uitype<From>, KFR_ENABLE_IF(!is_compound<From>)>
+template <typename From, typename To = uitype<From>, KFR_ENABLE_IF(!is_compound_type<From>)>
constexpr KFR_INTRINSIC To uibitcast(const From& value) CMT_NOEXCEPT
{
return bitcast<To>(value);
@@ -807,7 +883,7 @@ struct conditional_common;
template <typename Tfallback, typename... Args>
struct conditional_common<true, Tfallback, Args...>
{
- using type = common_type<Args...>;
+ using type = std::common_type_t<Args...>;
};
template <typename Tfallback, typename... Args>
@@ -824,7 +900,7 @@ struct conditional_common<false, Tfallback, Args...>
/// @endcode
template <typename Type = void, typename Arg, typename... Args, size_t N = (sizeof...(Args) + 1),
typename SubType =
- fix_type<typename internal::conditional_common<is_void<Type>, Type, Arg, Args...>::type>>
+ fix_type<typename internal::conditional_common<std::is_void_v<Type>, Type, Arg, Args...>::type>>
constexpr KFR_INTRINSIC vec<SubType, N> make_vector(const Arg& x, const Args&... rest)
{
return internal::make_vector_impl<SubType>(cvalseq_t<size_t, N>(), static_cast<SubType>(x),
@@ -844,7 +920,8 @@ constexpr KFR_INTRINSIC vec<T, N> make_vector(cvals_t<T, Values...>)
}
template <typename Type = void, typename Arg, typename... Args, size_t N = (sizeof...(Args) + 1),
- typename SubType = fix_type<conditional<is_void<Type>, common_type<Arg, Args...>, Type>>,
+ typename SubType =
+ fix_type<std::conditional_t<std::is_void_v<Type>, std::common_type_t<Arg, Args...>, Type>>,
KFR_ENABLE_IF(is_number<subtype<SubType>>)>
constexpr KFR_INTRINSIC vec<SubType, N> pack(const Arg& x, const Args&... rest)
{
@@ -1011,14 +1088,14 @@ namespace internal
{
template <size_t Index, typename T, size_t N, typename Fn, typename... Args,
- typename Tout = invoke_result<Fn, subtype<decay<Args>>...>>
+ typename Tout = std::invoke_result_t<Fn, subtype<std::decay_t<Args>>...>>
constexpr KFR_INTRINSIC Tout applyfn_helper(Fn&& fn, Args&&... args)
{
return fn(args[Index]...);
}
template <typename T, size_t N, typename Fn, typename... Args,
- typename Tout = invoke_result<Fn, subtype<decay<Args>>...>, size_t... Indices>
+ typename Tout = std::invoke_result_t<Fn, subtype<std::decay_t<Args>>...>, size_t... Indices>
constexpr KFR_INTRINSIC vec<Tout, N> apply_helper(Fn&& fn, csizes_t<Indices...>, Args&&... args)
{
return make_vector(applyfn_helper<Indices, T, N>(std::forward<Fn>(fn), std::forward<Args>(args)...)...);
@@ -1032,20 +1109,21 @@ constexpr KFR_INTRINSIC vec<T, N> apply0_helper(Fn&& fn, csizes_t<Indices...>)
} // namespace internal
template <typename T, size_t N, typename Fn, typename... Args,
- typename Tout = invoke_result<Fn, T, subtype<decay<Args>>...>>
+ typename Tout = std::invoke_result_t<Fn, T, subtype<std::decay_t<Args>>...>>
constexpr KFR_INTRINSIC vec<Tout, N> apply(Fn&& fn, const vec<T, N>& arg, Args&&... args)
{
return internal::apply_helper<T, N>(std::forward<Fn>(fn), csizeseq<N>, arg, std::forward<Args>(args)...);
}
-template <typename T, typename Fn, typename... Args, typename Tout = invoke_result<Fn, T, decay<Args>...>,
- KFR_ENABLE_IF(is_same<T, subtype<T>>)>
+template <typename T, typename Fn, typename... Args,
+ typename Tout = std::invoke_result_t<Fn, T, std::decay_t<Args>...>,
+ KFR_ENABLE_IF(std::is_same_v<T, subtype<T>>)>
constexpr KFR_INTRINSIC Tout apply(Fn&& fn, const T& arg, Args&&... args)
{
return fn(arg, args...);
}
-template <size_t N, typename Fn, typename T = invoke_result<Fn>>
+template <size_t N, typename Fn, typename T = std::invoke_result_t<Fn>>
constexpr KFR_INTRINSIC vec<T, N> apply(Fn&& fn)
{
return internal::apply0_helper<T, N>(std::forward<Fn>(fn), csizeseq<N>);
@@ -1106,6 +1184,13 @@ struct vec_template
using type = vec<T, N>;
};
+template <size_t N1, size_t N2>
+struct vecvec_template
+{
+ template <typename T>
+ using type = vec<vec<T, N1>, N2>;
+};
+
#ifdef KFR_TESTING
inline const std::vector<special_value>& special_values()
@@ -1153,136 +1238,139 @@ vec<T, N> test_enumerate(vec_shape<T, N>, csizes_t<indices...>, double start = 0
template <int Cat, typename Fn, typename RefFn, typename IsApplicable = fn_return_constant<bool, true>>
void test_function1(cint_t<Cat> cat, Fn&& fn, RefFn&& reffn, IsApplicable&& isapplicable = IsApplicable{})
{
- testo::matrix(
- named("value") = special_values(), named("type") = test_catogories::types(cat),
- [&](special_value value, auto type) {
- using T = typename decltype(type)::type;
- if (isapplicable(ctype<T>, value))
- {
- const T x(value);
+ testo::matrix(named("value") = special_values(), named("type") = test_catogories::types(cat),
+ [&](special_value value, auto type)
+ {
+ using T = typename decltype(type)::type;
+ if (isapplicable(cometa::ctype<T>, value))
+ {
+ const T x(value);
#if !defined(_MSC_VER) || defined(__clang__)
- // Supress ICE in MSVC
- using RefFnTy = decltype(std::declval<RefFn>()(std::declval<subtype<T>>()));
- CHECK(is_same<decltype(fn(x)), typename compound_type_traits<T>::template rebind<RefFnTy>>);
+ // Supress ICE in MSVC
+ using RefFnTy = decltype(std::declval<RefFn>()(std::declval<subtype<T>>()));
+ CHECK(std::is_same_v<decltype(fn(x)),
+ typename compound_type_traits<T>::template rebind<RefFnTy>>);
#endif
- const auto fn_x = fn(x);
- const auto ref_x = apply(reffn, x);
- ::testo::active_test()->check(testo::deep_is_equal(ref_x, fn_x),
- as_string(fn_x, " == ", ref_x), "fn(x) == apply(reffn, x)");
- // CHECK(fn(x) == apply(reffn, x));
- }
- });
+ const auto fn_x = fn(x);
+ const auto ref_x = apply(reffn, x);
+ ::testo::active_test()->check(testo::deep_is_equal(ref_x, fn_x),
+ as_string(fn_x, " == ", ref_x),
+ "fn(x) == apply(reffn, x)", __FILE__, __LINE__);
+ // CHECK(fn(x) == apply(reffn, x));
+ }
+ });
- testo::matrix(named("type") = test_catogories::types(cint<Cat & ~1>), [&](auto type) {
- using T = typename decltype(type)::type;
- const T x = test_enumerate(T::shape(), csizeseq<T::size()>, 0);
- CHECK(fn(x) == apply(reffn, x));
- });
+ testo::matrix(named("type") = test_catogories::types(cint<Cat & ~1>),
+ [&](auto type)
+ {
+ using T = typename decltype(type)::type;
+ const T x = test_enumerate(T::shape(), csizeseq<T::size()>, 0);
+ CHECK(fn(x) == apply(reffn, x));
+ });
}
-template <int Cat, typename Fn, typename RefFn, typename IsApplicable = fn_return_constant<bool, true>>
-void test_function2(cint_t<Cat> cat, Fn&& fn, RefFn&& reffn, IsApplicable&& isapplicable = IsApplicable{})
+template <int Cat, typename Fn, typename RefFn, typename IsApplicable = fn_return_constant<bool, true>,
+ typename IsDefined = fn_return_constant<bool, true>>
+void test_function2(cint_t<Cat> cat, Fn&& fn, RefFn&& reffn, IsApplicable&& isapplicable = IsApplicable{},
+ IsDefined&& = IsDefined{})
{
- testo::matrix(named("value1") = special_values(), //
- named("value2") = special_values(), named("type") = test_catogories::types(cat),
- [&](special_value value1, special_value value2, auto type) {
- using T = typename decltype(type)::type;
- const T x1(value1);
- const T x2(value2);
- if (isapplicable(ctype<T>, value1, value2))
+
+ testo::matrix(
+ named("value1") = special_values(), //
+ named("value2") = special_values(), named("type") = test_catogories::types(cat),
+ [&](special_value value1, special_value value2, auto type)
+ {
+ using T = typename decltype(type)::type;
+ if constexpr (IsDefined{}(cometa::ctype<T>))
+ {
+ const T x1(value1);
+ const T x2(value2);
+ if (isapplicable(cometa::ctype<T>, value1, value2))
+ {
+ CHECK(std::is_same_v<decltype(fn(x1, x2)),
+ typename compound_type_traits<T>::template rebind<decltype(reffn(
+ std::declval<subtype<T>>(), std::declval<subtype<T>>()))>>);
+ CHECK(fn(x1, x2) == apply(reffn, x1, x2));
+ }
+ }
+ });
+
+ testo::matrix(named("type") = test_catogories::types(cint<Cat & ~1>),
+ [&](auto type)
+ {
+ using T = typename decltype(type)::type;
+ const T x1 = test_enumerate(T::shape(), csizeseq<T::size()>, 0, 1);
+ const T x2 = test_enumerate(T::shape(), csizeseq<T::size()>, 100, -1);
+ if constexpr (IsDefined{}(cometa::ctype<T>))
{
- CHECK(is_same<decltype(fn(x1, x2)),
- typename compound_type_traits<T>::template rebind<decltype(
- reffn(std::declval<subtype<T>>(), std::declval<subtype<T>>()))>>);
CHECK(fn(x1, x2) == apply(reffn, x1, x2));
}
});
-
- testo::matrix(named("type") = test_catogories::types(cint<Cat & ~1>), [&](auto type) {
- using T = typename decltype(type)::type;
- const T x1 = test_enumerate(T::shape(), csizeseq<T::size()>, 0, 1);
- const T x2 = test_enumerate(T::shape(), csizeseq<T::size()>, 100, -1);
- CHECK(fn(x1, x2) == apply(reffn, x1, x2));
- });
}
#endif
namespace internal
{
-// vector to vector<vector>
-template <typename To, typename From, size_t N>
-struct conversion<vec<bit<To>, N>, vec<bit<From>, N>>
+// mask to mask
+template <typename To, typename From, size_t N, conv_t conv>
+struct conversion<1, 1, vec<bit<To>, N>, vec<bit<From>, N>, conv>
{
static vec<bit<To>, N> cast(const vec<bit<From>, N>& value)
{
- return vec<To, N>::frombits(innercast<itype<To>>(vec<itype<From>, N>::frombits(value.asvec())))
+ return vec<To, N>::frombits(broadcastto<itype<To>>(vec<itype<From>, N>::frombits(value.asvec())))
.asmask();
}
};
// vector to vector<vector>
template <typename To, typename From, size_t N1, size_t N2, size_t Ns1>
-struct conversion<vec<vec<To, N1>, N2>, vec<From, Ns1>>
+struct conversion<2, 1, vec<vec<To, N1>, N2>, vec<From, Ns1>, conv_t::broadcast>
{
static_assert(N1 == Ns1, "");
- static_assert(!is_compound<To>, "");
- static_assert(!is_compound<From>, "");
+ static_assert(!is_compound_type<To>, "");
+ static_assert(!is_compound_type<From>, "");
static vec<vec<To, N1>, N2> cast(const vec<From, N1>& value)
{
return vec<vec<To, N1>, N2>::from_flatten(
- kfr::innercast<To>(value.flatten())
+ kfr::broadcastto<To>(value.flatten())
.shuffle(csizeseq<N2 * vec<From, N1>::scalar_size()> % csize<N2>));
}
};
-// vector to vector<vector<vector>>
-template <typename To, typename From, size_t N1, size_t N2, size_t N3, size_t Ns1>
-struct conversion<vec<vec<vec<To, N1>, N2>, N3>, vec<From, Ns1>>
+// vector to vector<vector>
+template <typename To, typename From, size_t N1, size_t N2, size_t Ns1>
+struct conversion<2, 1, vec<vec<To, N1>, N2>, vec<From, Ns1>, conv_t::promote>
{
- static_assert(N1 == Ns1, "");
- static_assert(!is_compound<To>, "");
- static_assert(!is_compound<From>, "");
+ static_assert(N2 == Ns1, "");
+ static_assert(!is_compound_type<To>, "");
+ static_assert(!is_compound_type<From>, "");
- static vec<vec<vec<To, N1>, N2>, N3> cast(const vec<From, N1>& value)
+ static vec<vec<To, N1>, N2> cast(const vec<From, N2>& value)
{
- return vec<vec<vec<To, N1>, N2>, N3>::from_flatten(
- kfr::innercast<To>(value.flatten())
- .shuffle(csizeseq<N2 * vec<From, N1>::scalar_size()> % csize<N2>));
+ return vec<vec<To, N1>, N2>::from_flatten(
+ kfr::broadcastto<To>(value.flatten())
+ .shuffle(csizeseq<N2 * vec<From, N1>::scalar_size()> / csize<vec<From, N1>::scalar_size()> %
+ csize<N2>));
}
};
// vector<vector> to vector<vector>
-template <typename To, typename From, size_t N1, size_t N2, size_t NN1, size_t NN2>
-struct conversion<vec<vec<To, N1>, N2>, vec<vec<From, NN1>, NN2>>
+template <typename To, typename From, size_t N1, size_t N2, size_t NN1, size_t NN2, conv_t conv>
+struct conversion<2, 2, vec<vec<To, N1>, N2>, vec<vec<From, NN1>, NN2>, conv>
{
static_assert(N1 == NN1, "");
static_assert(N2 == NN2, "");
- static_assert(!is_compound<To>, "");
- static_assert(!is_compound<From>, "");
+ static_assert(!is_compound_type<To>, "");
+ static_assert(!is_compound_type<From>, "");
static vec<vec<To, N1>, N2> cast(const vec<vec<From, N1>, N2>& value)
{
- return vec<vec<To, N1>, N2>::from_flatten(kfr::innercast<To>(value.flatten()));
+ return vec<vec<To, N1>, N2>::from_flatten(kfr::broadcastto<To>(value.flatten()));
}
};
-// vector<vector<vector>> to vector<vector<vector>>
-template <typename To, typename From, size_t N1, size_t N2, size_t N3, size_t NN1, size_t NN2, size_t NN3>
-struct conversion<vec<vec<vec<To, N1>, N2>, N3>, vec<vec<vec<From, NN1>, NN2>, NN3>>
-{
- static_assert(N1 == NN1, "");
- static_assert(N2 == NN2, "");
- static_assert(N3 == NN3, "");
- static_assert(!is_compound<To>, "");
- static_assert(!is_compound<From>, "");
-
- static vec<vec<vec<To, N1>, N2>, N3> cast(const vec<vec<vec<From, N1>, N2>, N3>& value)
- {
- return vec<vec<vec<To, N1>, N2>, N3>::from_flatten(kfr::innercast<To>(value.flatten()));
- }
-};
} // namespace internal
template <typename T, size_t N1, size_t N2 = N1>
@@ -1341,46 +1429,89 @@ struct vecx_t<T, N1, N2>
using type = vec<vec<T, N1>, N2>;
};
-template <typename T, size_t N1, size_t N2, size_t N3>
-struct vecx_t<T, N1, N2, N3>
-{
- using type = vec<vec<vec<T, N1>, N2>, N3>;
-};
} // namespace internal
template <typename T, size_t... Ns>
using vecx = typename internal::vecx_t<T, Ns...>::type;
+template <typename T, size_t N>
+constexpr inline size_t vec_rank<vec<T, N>> = 1;
+
+template <typename T, size_t N1, size_t N2>
+constexpr inline size_t vec_rank<vec<vec<T, N1>, N2>> = 2;
+
+template <typename T, size_t N>
+KFR_INTRINSIC vec<T, N> to_vec(const portable_vec<T, N>& pv)
+{
+ return pv;
+}
+
} // namespace CMT_ARCH_NAME
+
+template <typename T1, typename T2, size_t N1, size_t N2, typename = void>
+struct common_type_helper
+{
+};
template <typename T1, typename T2, size_t N>
-struct common_type_impl<kfr::vec<T1, N>, kfr::vec<T2, N>>
- : common_type_from_subtypes<T1, T2, kfr::vec_template<N>::template type>
+struct common_type_helper<T1, T2, N, N>
+ : construct_common_type<std::common_type<T1, T2>, vec_template<N>::template type>
+{
+};
+template <typename T1, typename T2, size_t N1, size_t N2>
+struct common_type_helper<vec<T1, N2>, T2, N1, N2, std::enable_if_t<N1 != N2>>
+ : construct_common_type<std::common_type<T1, T2>, vecvec_template<N2, N1>::template type>
+{
+};
+template <typename T1, typename T2, size_t N1, size_t N2>
+struct common_type_helper<T1, vec<T2, N2>, N1, N2, std::enable_if_t<N1 != N2>>
+ : construct_common_type<std::common_type<T1, T2>, vecvec_template<N2, N1>::template type>
{
};
+
+} // namespace kfr
+
+namespace std
+{
+
+// V x V
+template <typename T1, typename T2, size_t N1, size_t N2>
+struct common_type<kfr::vec<T1, N1>, kfr::vec<T2, N2>> : kfr::common_type_helper<T1, T2, N1, N2>
+{
+};
+// V x S
template <typename T1, typename T2, size_t N>
-struct common_type_impl<kfr::vec<T1, N>, T2>
- : common_type_from_subtypes<T1, T2, kfr::vec_template<N>::template type>
+struct common_type<kfr::vec<T1, N>, T2>
+ : kfr::construct_common_type<std::common_type<T1, T2>, kfr::vec_template<N>::template type>
{
};
+// S x V
template <typename T1, typename T2, size_t N>
-struct common_type_impl<T1, kfr::vec<T2, N>>
- : common_type_from_subtypes<T1, T2, kfr::vec_template<N>::template type>
+struct common_type<T1, kfr::vec<T2, N>>
+ : kfr::construct_common_type<std::common_type<T1, T2>, kfr::vec_template<N>::template type>
{
};
-
+#if 0
+// VV x V
+template <typename T1, typename T2, size_t N1, size_t N2>
+struct common_type<kfr::vec<kfr::vec<T1, N1>, N2>, kfr::vec<T2, N1>>
+ : kfr::construct_common_type<std::common_type<T1, T2>, kfr::vecvec_template<N1, N2>::template type>
+{
+};
+// V x VV
template <typename T1, typename T2, size_t N1, size_t N2>
-struct common_type_impl<kfr::vec<T1, N1>, kfr::vec<kfr::vec<T2, N1>, N2>>
- : common_type_from_subtypes<T1, T2, kfr::vec_vec_template<N1, N2>::template type>
+struct common_type<kfr::vec<T1, N1>, kfr::vec<kfr::vec<T2, N1>, N2>>
+ : kfr::construct_common_type<std::common_type<T1, T2>, kfr::vecvec_template<N1, N2>::template type>
{
- using type = kfr::vec<kfr::vec<typename common_type_impl<T1, T2>::type, N1>, N2>;
};
+// VV x VV
template <typename T1, typename T2, size_t N1, size_t N2>
-struct common_type_impl<kfr::vec<kfr::vec<T1, N1>, N2>, kfr::vec<T2, N1>>
- : common_type_from_subtypes<T1, T2, kfr::vec_vec_template<N1, N2>::template type>
+struct common_type<kfr::vec<kfr::vec<T1, N1>, N2>, kfr::vec<kfr::vec<T2, N1>, N2>>
+ : kfr::construct_common_type<std::common_type<T1, T2>, kfr::vecvec_template<N1, N2>::template type>
{
};
+#endif
-} // namespace kfr
+} // namespace std
namespace cometa
{
@@ -1424,11 +1555,47 @@ struct compound_type_traits<kfr::vec<T, N>>
namespace details
{
template <typename T, size_t N>
-struct flt_type_impl<kfr::vec<T, N>>
+struct flt_type_impl<kfr::CMT_ARCH_NAME::vec<T, N>>
{
- using type = kfr::vec<typename flt_type_impl<T>::type, N>;
+ using type = kfr::CMT_ARCH_NAME::vec<typename flt_type_impl<T>::type, N>;
};
} // namespace details
+
+template <typename T, size_t N>
+struct representation<kfr::CMT_ARCH_NAME::vec<T, N>>
+{
+ using type = std::string;
+ static std::string get(const kfr::CMT_ARCH_NAME::vec<T, N>& value)
+ {
+ kfr::portable_vec<T, N> p = value;
+ return array_to_string(N, ptr_cast<T>(&p.front()));
+ }
+};
+
+template <char t, int width, int prec, typename T, size_t N>
+struct representation<fmt_t<kfr::CMT_ARCH_NAME::vec<T, N>, t, width, prec>>
+{
+ using type = std::string;
+ static std::string get(const fmt_t<kfr::CMT_ARCH_NAME::vec<T, N>, t, width, prec>& value)
+ {
+ kfr::portable_vec<T, N> p = value.value;
+ return array_to_string<fmt_t<T, t, width, prec>>(N, ptr_cast<T>(&p.front()));
+ }
+};
+
+template <typename T, size_t N>
+struct representation<kfr::CMT_ARCH_NAME::mask<T, N>>
+{
+ using type = std::string;
+ static std::string get(const kfr::CMT_ARCH_NAME::mask<T, N>& value)
+ {
+ bool values[N];
+ for (size_t i = 0; i < N; i++)
+ values[i] = value[i];
+ return array_to_string(N, values);
+ }
+};
+
} // namespace cometa
CMT_PRAGMA_GNU(GCC diagnostic pop)
diff --git a/include/kfr/testo/comparison.hpp b/include/kfr/testo/comparison.hpp
@@ -16,6 +16,8 @@ CMT_PRAGMA_GNU(GCC diagnostic ignored "-Wexit-time-destructors")
#endif
CMT_PRAGMA_GNU(GCC diagnostic ignored "-Wpadded")
CMT_PRAGMA_GNU(GCC diagnostic ignored "-Wshadow")
+CMT_PRAGMA_MSVC(warning(push))
+CMT_PRAGMA_MSVC(warning(disable : 4018))
namespace testo
{
@@ -62,9 +64,10 @@ inline T& current_epsilon()
return value;
}
-template <typename T>
+template <typename T = void>
struct eplison_scope
{
+ static_assert(std::is_floating_point_v<T>);
eplison_scope(T scale) { current_epsilon<T>() = std::numeric_limits<T>::epsilon() * scale; }
~eplison_scope() { current_epsilon<T>() = saved; }
T saved = current_epsilon<T>();
@@ -242,4 +245,5 @@ struct make_comparison
};
} // namespace testo
+CMT_PRAGMA_MSVC(warning(pop))
CMT_PRAGMA_GNU(GCC diagnostic pop)
diff --git a/include/kfr/testo/testo.hpp b/include/kfr/testo/testo.hpp
@@ -148,6 +148,8 @@ struct test_case
{
console_color cc(Cyan);
printfmt("[{}]", padcenter(11, std::string("RUN"), '-'));
+ std::fflush(stdout);
+ std::fflush(stderr);
}
printfmt(" {}...\n", name);
time_point start = high_resolution_clock::now();
@@ -174,6 +176,7 @@ struct test_case
console_color cc(s.success ? Green : Red);
printfmt(" {} ", s.success ? "[success]" : "[fail] ");
}
+ printfmt("{}({}) ", s.file, s.line);
printfmt("{}\n", s.text);
}
}
@@ -183,10 +186,10 @@ struct test_case
return !failed;
}
- void check(bool result, const std::string& value, const char* expr)
+ void check(bool result, const std::string& value, const char* expr, const char* file, int line)
{
subtests.push_back(
- subtest{ result, as_string(padleft(22, expr), " | ", value), current_scope_text() });
+ subtest{ result, as_string(padleft(22, expr), " | ", value), current_scope_text(), file, line });
result ? success++ : failed++;
if (show_progress)
{
@@ -204,17 +207,17 @@ struct test_case
}
template <typename Op, typename L, typename R>
- void check(const comparison<Op, L, R>& comparison, const char* expr)
+ void check(const comparison<Op, L, R>& comparison, const char* expr, const char* file, int line)
{
bool result = comparison();
- check(result, as_string(comparison.left, " ", Op::op(), " ", comparison.right), expr);
+ check(result, as_string(comparison.left, " ", Op::op(), " ", comparison.right), expr, file, line);
}
template <typename L>
- void check(const half_comparison<L>& comparison, const char* expr)
+ void check(const half_comparison<L>& comparison, const char* expr, const char* file, int line)
{
bool result = comparison.left ? true : false;
- check(result, as_string(comparison.left), expr);
+ check(result, as_string(comparison.left), expr, file, line);
}
struct subtest
@@ -222,6 +225,8 @@ struct test_case
bool success;
std::string text;
std::string comment;
+ std::string file;
+ int line = 0;
};
void scope_changed()
@@ -308,10 +313,12 @@ struct statistics
template <typename Arg0, typename Fn>
void matrix(named_arg<Arg0>&& arg0, Fn&& fn)
{
- cforeach(std::forward<Arg0>(arg0.value), [&](auto v0) {
- scope s(as_string(arg0.name, " = ", v0));
- fn(v0);
- });
+ cforeach(std::forward<Arg0>(arg0.value),
+ [&](auto v0)
+ {
+ scope s(as_string(arg0.name, " = ", v0));
+ fn(v0);
+ });
if (active_test() && active_test()->show_progress)
println();
}
@@ -319,10 +326,12 @@ void matrix(named_arg<Arg0>&& arg0, Fn&& fn)
template <typename Arg0, typename Arg1, typename Fn>
void matrix(named_arg<Arg0>&& arg0, named_arg<Arg1>&& arg1, Fn&& fn)
{
- cforeach(std::forward<Arg0>(arg0.value), std::forward<Arg1>(arg1.value), [&](auto v0, auto v1) {
- scope s(as_string(arg0.name, " = ", v0, ", ", arg1.name, " = ", v1));
- fn(v0, v1);
- });
+ cforeach(std::forward<Arg0>(arg0.value), std::forward<Arg1>(arg1.value),
+ [&](auto v0, auto v1)
+ {
+ scope s(as_string(arg0.name, " = ", v0, ", ", arg1.name, " = ", v1));
+ fn(v0, v1);
+ });
if (active_test()->show_progress)
println();
}
@@ -331,7 +340,8 @@ template <typename Arg0, typename Arg1, typename Arg2, typename Fn>
void matrix(named_arg<Arg0>&& arg0, named_arg<Arg1>&& arg1, named_arg<Arg2>&& arg2, Fn&& fn)
{
cforeach(std::forward<Arg0>(arg0.value), std::forward<Arg1>(arg1.value), std::forward<Arg2>(arg2.value),
- [&](auto v0, auto v1, auto v2) {
+ [&](auto v0, auto v1, auto v2)
+ {
scope s(
as_string(arg0.name, " = ", v0, ", ", arg1.name, " = ", v1, ", ", arg2.name, " = ", v2));
fn(v0, v1, v2);
@@ -345,7 +355,9 @@ void matrix(named_arg<Arg0>&& arg0, named_arg<Arg1>&& arg1, named_arg<Arg2>&& ar
Fn&& fn)
{
cforeach(std::forward<Arg0>(arg0.value), std::forward<Arg1>(arg1.value), std::forward<Arg2>(arg2.value),
- std::forward<Arg3>(arg3.value), [&](auto v0, auto v1, auto v2, auto v3) {
+ std::forward<Arg3>(arg3.value),
+ [&](auto v0, auto v1, auto v2, auto v3)
+ {
scope s(as_string(arg0.name, " = ", v0, ", ", arg1.name, " = ", v1, ", ", arg2.name, " = ",
v2, arg3.name, " = ", v3));
fn(v0, v1, v2, v3);
@@ -395,12 +407,12 @@ CMT_UNUSED static int run_all(const std::string& name = std::string(), bool show
template <typename T1, typename T2>
void assert_is_same()
{
- static_assert(std::is_same<T1, T2>::value, "");
+ static_assert(std::is_same_v<T1, T2>, "");
}
template <typename T1, typename T2>
void assert_is_same_decay()
{
- static_assert(std::is_same<cometa::decay<T1>, cometa::decay<T2>>::value, "");
+ static_assert(std::is_same_v<std::decay_t<T1>, std::decay_t<T2>>, "");
}
template <typename T, size_t NArgs>
@@ -413,7 +425,8 @@ struct test_data_entry
#define TESTO_CHECK(...) \
do \
{ \
- ::testo::active_test()->check(::testo::make_comparison() <= __VA_ARGS__, #__VA_ARGS__); \
+ ::testo::active_test()->check(::testo::make_comparison() <= __VA_ARGS__, #__VA_ARGS__, __FILE__, \
+ __LINE__); \
} while (0)
#define TESTO_TEST(name) \
diff --git a/requirements.txt b/requirements.txt
@@ -0,0 +1,3 @@
+numpy
+scipy
+matplotlib
diff --git a/sources.cmake b/sources.cmake
@@ -9,6 +9,7 @@ set(
${PROJECT_SOURCE_DIR}/include/kfr/cometa.hpp
${PROJECT_SOURCE_DIR}/include/kfr/dft.hpp
${PROJECT_SOURCE_DIR}/include/kfr/dsp.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/except.hpp
${PROJECT_SOURCE_DIR}/include/kfr/graphics.hpp
${PROJECT_SOURCE_DIR}/include/kfr/io.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math.hpp
@@ -17,21 +18,27 @@ set(
${PROJECT_SOURCE_DIR}/include/kfr/version.hpp
${PROJECT_SOURCE_DIR}/include/kfr/capi.h
${PROJECT_SOURCE_DIR}/include/kfr/cident.h
+ ${PROJECT_SOURCE_DIR}/include/kfr/config.h
${PROJECT_SOURCE_DIR}/include/kfr/kfr.h
${PROJECT_SOURCE_DIR}/include/kfr/base/basic_expressions.hpp
${PROJECT_SOURCE_DIR}/include/kfr/base/conversion.hpp
${PROJECT_SOURCE_DIR}/include/kfr/base/expression.hpp
${PROJECT_SOURCE_DIR}/include/kfr/base/filter.hpp
${PROJECT_SOURCE_DIR}/include/kfr/base/fraction.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/base/function_expressions.hpp
${PROJECT_SOURCE_DIR}/include/kfr/base/generators.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/handle.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/math_expressions.hpp
${PROJECT_SOURCE_DIR}/include/kfr/base/memory.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/base/pointer.hpp
${PROJECT_SOURCE_DIR}/include/kfr/base/random.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/random_bits.hpp
${PROJECT_SOURCE_DIR}/include/kfr/base/reduce.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/shape.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/simd_expressions.hpp
${PROJECT_SOURCE_DIR}/include/kfr/base/small_buffer.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/base/sort.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/state_holder.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/tensor.hpp
${PROJECT_SOURCE_DIR}/include/kfr/base/univector.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/impl/static_array.hpp
${PROJECT_SOURCE_DIR}/include/kfr/cometa/array.hpp
${PROJECT_SOURCE_DIR}/include/kfr/cometa/cstring.hpp
${PROJECT_SOURCE_DIR}/include/kfr/cometa/ctti.hpp
@@ -77,7 +84,7 @@ set(
${PROJECT_SOURCE_DIR}/include/kfr/dsp/window.hpp
${PROJECT_SOURCE_DIR}/include/kfr/graphics/color.hpp
${PROJECT_SOURCE_DIR}/include/kfr/graphics/geometry.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/graphics/scaled.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/graphics/impl/scaled.hpp
${PROJECT_SOURCE_DIR}/include/kfr/io/audiofile.hpp
${PROJECT_SOURCE_DIR}/include/kfr/io/file.hpp
${PROJECT_SOURCE_DIR}/include/kfr/io/python_plot.hpp
@@ -85,67 +92,379 @@ set(
${PROJECT_SOURCE_DIR}/include/kfr/io/dr/dr_flac.h
${PROJECT_SOURCE_DIR}/include/kfr/io/dr/dr_mp3.h
${PROJECT_SOURCE_DIR}/include/kfr/io/dr/dr_wav.h
- ${PROJECT_SOURCE_DIR}/include/kfr/math/abs.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/asin_acos.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/atan.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/math/clamp.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/compiletime.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/complex_math.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/gamma.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/hyperbolic.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/interpolation.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/math/logical.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/log_exp.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/math/min_max.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/modzerobessel.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/math/round.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/math/saturation.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/math/select.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/sin_cos.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/sqrt.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/tan.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/abs.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/impl/asin_acos.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/impl/atan.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/clamp.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/impl/gamma.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/impl/hyperbolic.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/logical.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/impl/log_exp.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/min_max.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/impl/modzerobessel.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/round.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/saturation.hpp
- ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/select.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/impl/sin_cos.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/impl/sqrt.hpp
${PROJECT_SOURCE_DIR}/include/kfr/math/impl/tan.hpp
${PROJECT_SOURCE_DIR}/include/kfr/runtime/cpuid.hpp
${PROJECT_SOURCE_DIR}/include/kfr/runtime/cpuid_auto.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/abs.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/clamp.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/comparison.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/complex.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/complex_type.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/constants.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/digitreverse.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/horizontal.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/logical.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/mask.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/min_max.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/operators.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/platform.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/read_write.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/round.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/saturation.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/select.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/shuffle.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/sort.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/types.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/vec.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/abs.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/backend.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/backend_clang.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/backend_generic.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/basicoperators_clang.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/basicoperators_complex.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/basicoperators_generic.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/clamp.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/function.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/logical.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/min_max.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/operators.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/read_write.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/round.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/saturation.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/select.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/simd.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/specialconstants.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/specializations.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/intrinsics.h
+ ${PROJECT_SOURCE_DIR}/include/kfr/testo/assert.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/testo/comparison.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/testo/console_colors.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/testo/double_double.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/testo/testo.hpp
+)
+
+
+set(
+ KFR_SIMD_SRC
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/abs.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/clamp.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/comparison.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/complex.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/complex_type.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/constants.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/digitreverse.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/horizontal.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/logical.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/mask.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/min_max.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/operators.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/platform.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/read_write.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/round.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/saturation.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/select.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/shuffle.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/sort.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/types.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/vec.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/abs.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/backend.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/backend_clang.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/backend_generic.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/basicoperators_clang.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/basicoperators_complex.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/basicoperators_generic.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/clamp.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/function.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/logical.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/min_max.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/operators.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/read_write.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/round.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/saturation.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/select.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/simd.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/specialconstants.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/specializations.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/intrinsics.h
+)
+
+
+set(
+ KFR_MATH_SRC
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/asin_acos.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/atan.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/compiletime.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/complex_math.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/gamma.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/hyperbolic.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/interpolation.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/log_exp.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/modzerobessel.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/sin_cos.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/sqrt.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/tan.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/asin_acos.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/atan.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/gamma.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/hyperbolic.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/log_exp.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/modzerobessel.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/sin_cos.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/sqrt.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/tan.hpp
+)
+
+
+set(
+ KFR_BASE_SRC
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/basic_expressions.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/conversion.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/expression.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/filter.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/fraction.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/generators.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/handle.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/math_expressions.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/memory.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/random.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/random_bits.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/reduce.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/shape.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/simd_expressions.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/small_buffer.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/state_holder.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/tensor.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/univector.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/impl/static_array.hpp
+)
+
+
+set(
+ KFR_DSP_SRC
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/biquad.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/biquad_design.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/dcremove.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/delay.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/ebu.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/fir.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/fir_design.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/fracdelay.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/goertzel.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/iir_design.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/mixdown.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/oscillators.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/sample_rate_conversion.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/speaker.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/special.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/units.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/waveshaper.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/weighting.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/window.hpp
+)
+
+
+set(
+ KFR_IO_SRC
+ ${PROJECT_SOURCE_DIR}/include/kfr/io/audiofile.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/io/file.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/io/python_plot.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/io/tostring.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/io/dr/dr_flac.h
+ ${PROJECT_SOURCE_DIR}/include/kfr/io/dr/dr_mp3.h
+ ${PROJECT_SOURCE_DIR}/include/kfr/io/dr/dr_wav.h
+)
+
+
+set(
+ KFR_RUNTIME_SRC
+ ${PROJECT_SOURCE_DIR}/include/kfr/runtime/cpuid.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/runtime/cpuid_auto.hpp
+)
+
+
+set(
+ KFR_GRAPHICS_SRC
+ ${PROJECT_SOURCE_DIR}/include/kfr/graphics/color.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/graphics/geometry.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/graphics/impl/scaled.hpp
+)
+
+
+set(
+ KFR_SRC
+ ${PROJECT_SOURCE_DIR}/include/kfr/all.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/cometa.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dft.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/except.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/graphics.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/io.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/runtime.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/version.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/capi.h
+ ${PROJECT_SOURCE_DIR}/include/kfr/cident.h
+ ${PROJECT_SOURCE_DIR}/include/kfr/config.h
+ ${PROJECT_SOURCE_DIR}/include/kfr/kfr.h
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/basic_expressions.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/conversion.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/expression.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/filter.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/fraction.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/generators.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/handle.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/math_expressions.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/memory.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/random.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/random_bits.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/reduce.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/shape.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/simd_expressions.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/small_buffer.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/state_holder.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/tensor.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/univector.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/base/impl/static_array.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/cometa/array.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/cometa/cstring.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/cometa/ctti.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/cometa/function.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/cometa/memory.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/cometa/named_arg.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/cometa/numeric.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/cometa/range.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/cometa/result.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/cometa/string.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/cometa/tuple.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dft/cache.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dft/convolution.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dft/fft.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dft/reference_dft.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dft/data/bitrev.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dft/data/sincos.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/bitrev.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/dft-fft.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/dft-impl.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/dft-templates.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/fft-impl.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/fft-templates.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/ft.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/biquad.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/biquad_design.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/dcremove.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/delay.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/ebu.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/fir.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/fir_design.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/fracdelay.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/goertzel.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/iir_design.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/mixdown.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/oscillators.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/sample_rate_conversion.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/speaker.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/special.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/units.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/waveshaper.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/weighting.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/dsp/window.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/graphics/color.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/graphics/geometry.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/graphics/impl/scaled.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/io/audiofile.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/io/file.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/io/python_plot.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/io/tostring.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/io/dr/dr_flac.h
+ ${PROJECT_SOURCE_DIR}/include/kfr/io/dr/dr_mp3.h
+ ${PROJECT_SOURCE_DIR}/include/kfr/io/dr/dr_wav.h
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/asin_acos.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/atan.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/compiletime.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/complex_math.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/gamma.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/hyperbolic.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/interpolation.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/log_exp.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/modzerobessel.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/sin_cos.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/sqrt.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/tan.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/asin_acos.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/atan.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/gamma.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/hyperbolic.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/log_exp.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/modzerobessel.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/sin_cos.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/sqrt.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/math/impl/tan.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/runtime/cpuid.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/runtime/cpuid_auto.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/abs.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/clamp.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/comparison.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/complex.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/complex_type.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/constants.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/digitreverse.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/horizontal.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/logical.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/mask.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/min_max.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/operators.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/platform.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/read_write.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/round.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/saturation.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/select.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/shuffle.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/sort.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/types.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/vec.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/abs.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/backend.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/backend_clang.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/backend_generic.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/basicoperators_clang.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/basicoperators_complex.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/basicoperators_generic.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/clamp.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/function.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/logical.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/min_max.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/operators.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/read_write.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/round.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/saturation.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/select.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/simd.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/specialconstants.hpp
+ ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/specializations.hpp
${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/intrinsics.h
- ${PROJECT_SOURCE_DIR}/include/kfr/simd/impl/specializations.i
${PROJECT_SOURCE_DIR}/include/kfr/testo/assert.hpp
${PROJECT_SOURCE_DIR}/include/kfr/testo/comparison.hpp
${PROJECT_SOURCE_DIR}/include/kfr/testo/console_colors.hpp
@@ -172,25 +491,43 @@ set(
set(
KFR_UNITTEST_SRC
+ ${PROJECT_SOURCE_DIR}/tests/unit/base/base.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/base/basic_expressions.cpp
${PROJECT_SOURCE_DIR}/tests/unit/base/conversion.cpp
${PROJECT_SOURCE_DIR}/tests/unit/base/fraction.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/base/generators.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/base/handle.cpp
${PROJECT_SOURCE_DIR}/tests/unit/base/random.cpp
${PROJECT_SOURCE_DIR}/tests/unit/base/reduce.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/base/shape.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/base/std_ambiguities.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/base/tensor.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/dsp/biquad.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/dsp/biquad_design.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/dsp/dsp.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/dsp/ebu.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/dsp/fir.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/dsp/sample_rate_conversion.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/dsp/units.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/dsp/window.cpp
${PROJECT_SOURCE_DIR}/tests/unit/graphics/color.cpp
${PROJECT_SOURCE_DIR}/tests/unit/graphics/geometry.cpp
- ${PROJECT_SOURCE_DIR}/tests/unit/math/abs.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/graphics/graphics.cpp
${PROJECT_SOURCE_DIR}/tests/unit/math/asin_acos.cpp
${PROJECT_SOURCE_DIR}/tests/unit/math/atan.cpp
${PROJECT_SOURCE_DIR}/tests/unit/math/hyperbolic.cpp
${PROJECT_SOURCE_DIR}/tests/unit/math/log_exp.cpp
- ${PROJECT_SOURCE_DIR}/tests/unit/math/min_max.cpp
- ${PROJECT_SOURCE_DIR}/tests/unit/math/round.cpp
- ${PROJECT_SOURCE_DIR}/tests/unit/math/select.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/math/math.cpp
${PROJECT_SOURCE_DIR}/tests/unit/math/sin_cos.cpp
${PROJECT_SOURCE_DIR}/tests/unit/math/tan.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/simd/abs.cpp
${PROJECT_SOURCE_DIR}/tests/unit/simd/complex.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/simd/min_max.cpp
${PROJECT_SOURCE_DIR}/tests/unit/simd/operators.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/simd/round.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/simd/select.cpp
${PROJECT_SOURCE_DIR}/tests/unit/simd/shuffle.cpp
+ ${PROJECT_SOURCE_DIR}/tests/unit/simd/simd.cpp
${PROJECT_SOURCE_DIR}/tests/unit/simd/vec.cpp
)
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
@@ -16,7 +16,6 @@
cmake_minimum_required(VERSION 3.10)
-
add_definitions(-DKFR_TESTING=1)
add_definitions(-DKFR_SRC_DIR=\"${CMAKE_SOURCE_DIR}\")
@@ -24,15 +23,15 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-fdiagnostics-absolute-paths)
endif ()
-option(ENABLE_COVERAGE "Enable coverage reporting" OFF)
+option(KFR_ENABLE_COVERAGE "Enable coverage reporting" OFF)
-if (ENABLE_COVERAGE)
+if (KFR_ENABLE_COVERAGE)
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-fprofile-instr-generate -fcoverage-mapping)
endif ()
endif ()
-if (ENABLE_DFT)
+if (KFR_ENABLE_DFT)
add_definitions(-DHAVE_DFT)
endif ()
@@ -48,18 +47,19 @@ endif ()
# Binary output directories
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/bin)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${PROJECT_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/bin)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/tests/cmake/")
-if (ENABLE_CAPI_BUILD)
+if (KFR_ENABLE_CAPI_BUILD)
add_executable(capi_test capi_test.cpp)
target_include_directories(capi_test
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../include)
target_link_libraries(capi_test PUBLIC kfr_capi)
endif ()
-if (ENABLE_ASMTEST)
+if (KFR_ENABLE_ASMTEST)
add_executable(asm_test asm_test.cpp)
target_link_libraries(asm_test kfr)
target_set_arch(asm_test PRIVATE avx2)
@@ -108,36 +108,37 @@ set(ALL_TESTS_CPP
io_test.cpp
${KFR_UNITTEST_SRC})
-if (ENABLE_DFT)
+if (KFR_ENABLE_DFT)
list(APPEND ALL_TESTS_CPP dft_test.cpp)
add_executable(dft_test dft_test.cpp)
endif ()
-find_package(MPFR)
-find_package(GMP)
-
-if (MPFR_FOUND AND GMP_FOUND AND REGENERATE_TESTS)
- message(STATUS "MPFR is found")
- add_executable(generate_data generate_data.cpp)
- target_link_libraries(generate_data kfr)
- target_include_directories(generate_data PRIVATE ${MPFR_INCLUDE_DIR}
- ${GMP_INCLUDE_DIR})
- target_link_libraries(generate_data ${MPFR_LIBRARIES} ${GMP_LIBRARIES})
- if (REGENERATE_TESTS)
- add_custom_command(
- TARGET generate_data
- POST_BUILD
- COMMENT "Generating tests..."
- WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tests/data
- COMMAND generate_data)
+if (KFR_REGENERATE_TESTS)
+ find_package(MPFR)
+ find_package(GMP)
+
+ if (MPFR_FOUND AND GMP_FOUND)
+ add_executable(generate_data generate_data.cpp)
+ target_link_libraries(generate_data kfr)
+ target_include_directories(generate_data PRIVATE ${MPFR_INCLUDE_DIR}
+ ${GMP_INCLUDE_DIR})
+ target_link_libraries(generate_data ${MPFR_LIBRARIES} ${GMP_LIBRARIES})
+ if (KFR_REGENERATE_TESTS)
+ add_custom_command(
+ TARGET generate_data
+ POST_BUILD
+ COMMENT "Generating tests..."
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tests/data
+ COMMAND generate_data)
+ endif ()
endif ()
endif ()
add_executable(all_tests all_tests.cpp ${ALL_TESTS_CPP})
target_compile_definitions(all_tests PRIVATE KFR_NO_MAIN)
target_link_libraries(all_tests kfr use_arch)
-if (ENABLE_DFT)
+if (KFR_ENABLE_DFT)
target_link_libraries(all_tests kfr_dft)
target_link_libraries(dft_test kfr_dft)
endif ()
@@ -152,7 +153,7 @@ function (add_x86_test ARCH)
add_executable(all_tests_${NAME} all_tests.cpp ${ALL_TESTS_CPP}
${KFR_IO_SRC})
- if (ENABLE_DFT)
+ if (KFR_ENABLE_DFT)
target_sources(all_tests_${NAME} PRIVATE ${KFR_DFT_SRC})
endif ()
target_link_libraries(all_tests_${NAME} kfr)
@@ -160,10 +161,10 @@ function (add_x86_test ARCH)
target_compile_definitions(all_tests_${NAME} PRIVATE KFR_NO_MAIN)
target_compile_definitions(all_tests_${NAME} PUBLIC KFR_ENABLE_FLAC=1)
- if (ARCH_TESTS_MULTI)
+ if (KFR_ARCH_TESTS_MULTI)
add_library(all_tests_multiarch_${NAME} STATIC ${ALL_TESTS_MERGED_CPP}
${KFR_IO_SRC})
- if (ENABLE_DFT)
+ if (KFR_ENABLE_DFT)
target_sources(all_tests_multiarch_${NAME} PRIVATE ${KFR_DFT_SRC})
endif ()
target_link_libraries(all_tests_multiarch_${NAME} kfr)
@@ -176,9 +177,7 @@ function (add_x86_test ARCH)
endfunction ()
-message(STATUS "ARCH_TESTS = ${ARCH_TESTS}")
-
-if (ARCH_TESTS AND ARCH_TESTS STREQUAL "ON")
+if (KFR_ARCH_TESTS AND KFR_ARCH_TESTS STREQUAL "ON")
set(ARCH_LIST
generic
sse2
@@ -188,22 +187,20 @@ if (ARCH_TESTS AND ARCH_TESTS STREQUAL "ON")
avx2
avx512)
else ()
- string(REPLACE "," ";" ARCH_LIST "${ARCH_TESTS}")
+ string(REPLACE "," ";" ARCH_LIST "${KFR_ARCH_TESTS}")
endif ()
if (MSVC AND NOT CLANG)
list(REMOVE_ITEM ARCH_LIST generic)
endif ()
-message(STATUS "Testing for ${ARCH_LIST}")
-
-if (ARCH_TESTS)
+if (KFR_ARCH_TESTS)
foreach (A IN LISTS ARCH_LIST)
add_x86_test(${A})
endforeach ()
- if (ARCH_TESTS_MULTI)
+ if (KFR_ARCH_TESTS_MULTI)
add_executable(all_tests_multiarch all_tests.cpp)
target_compile_definitions(all_tests_multiarch PRIVATE KFR_MULTI_ARCH)
foreach (A IN LISTS ARCH_LIST)
@@ -212,7 +209,7 @@ if (ARCH_TESTS)
endif ()
endif ()
-if (USE_SDE)
+if (KFR_USE_SDE)
if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
find_program(SDE NAMES "sde64" "sde")
else ()
@@ -236,22 +233,22 @@ set(SDE_ARCH_avx -snb)
set(SDE_ARCH_avx2 -hsw)
set(SDE_ARCH_avx512 -skx)
-if (NOT SKIP_TESTS)
+if (NOT KFR_SKIP_TESTS)
enable_testing()
if (X86)
add_test(NAME multiarch COMMAND ${EMULATOR}
${PROJECT_BINARY_DIR}/bin/multiarch)
- if (ENABLE_CAPI_BUILD)
+ if (KFR_ENABLE_CAPI_BUILD)
add_test(NAME capi_test COMMAND ${EMULATOR}
${PROJECT_BINARY_DIR}/bin/capi_test)
endif ()
endif ()
- if (ARCH_TESTS)
+ if (KFR_ARCH_TESTS)
foreach (A IN LISTS ARCH_LIST)
- if (USE_SDE)
+ if (KFR_USE_SDE)
add_test(NAME all_tests_${A}
COMMAND ${SDE} ${SDE_ARCH_${A}} -chip_check_exe_only
-- ${PROJECT_BINARY_DIR}/bin/all_tests_${A})
@@ -262,11 +259,13 @@ if (NOT SKIP_TESTS)
endif ()
endforeach ()
endif ()
- if (USE_SDE)
- add_test(NAME all_tests COMMAND ${SDE} ${SDE_ARCH_${CPU_ARCH}} -chip_check_exe_only
- -- ${PROJECT_BINARY_DIR}/bin/all_tests)
- add_test(NAME all_tests_on_avx512 COMMAND ${SDE} ${SDE_ARCH_avx512} -chip_check_exe_only
- -- ${PROJECT_BINARY_DIR}/bin/all_tests)
+ if (KFR_USE_SDE)
+ add_test(NAME all_tests
+ COMMAND ${SDE} ${SDE_ARCH_${KFR_ARCH}} -chip_check_exe_only --
+ ${PROJECT_BINARY_DIR}/bin/all_tests)
+ add_test(NAME all_tests_on_avx512
+ COMMAND ${SDE} ${SDE_ARCH_avx512} -chip_check_exe_only --
+ ${PROJECT_BINARY_DIR}/bin/all_tests)
else ()
add_test(NAME all_tests COMMAND ${PROJECT_BINARY_DIR}/bin/all_tests)
endif ()
diff --git a/tests/asm_test.cpp b/tests/asm_test.cpp
@@ -143,7 +143,7 @@ using namespace kfr;
{ \
r = kfr::fn<n, true>(x); \
} \
- KFR_PUBLIC void asm__test__##fn##__##ty##__##n##__unaligned(vec<ty, n> & __restrict r, \
+ KFR_PUBLIC void asm__test__##fn##__##ty##__##n##__unaligned(vec<ty, n>& __restrict r, \
const ty* __restrict x) \
{ \
r = kfr::fn<n, false>(x); \
@@ -154,7 +154,7 @@ using namespace kfr;
{ \
kfr::fn<true>(p, x); \
} \
- KFR_PUBLIC void asm__test__##fn##__##ty##__##n##__unaligned(ty * __restrict p, const vec<ty, n>& x) \
+ KFR_PUBLIC void asm__test__##fn##__##ty##__##n##__unaligned(ty* __restrict p, const vec<ty, n>& x) \
{ \
kfr::fn<false>(p, x); \
}
diff --git a/tests/base_test.cpp b/tests/base_test.cpp
@@ -6,8 +6,8 @@
#include <kfr/testo/testo.hpp>
-#include <kfr/io.hpp>
-#include <kfr/simd.hpp>
+// #include <kfr/io.hpp>
+#include <kfr/base.hpp>
using namespace kfr;
@@ -92,23 +92,7 @@ TEST(test_basic)
CHECK(inrange(pack(1, 2, 3), 1, 1) == make_mask<int>(true, false, false));
}
-TEST(test_gen_expj)
-{
- kfr::univector<cbase> v = kfr::truncate(kfr::gen_expj(0.f, constants<float>::pi_s(2) * 0.1f), 1000);
- CHECK(rms(cabs(v.slice(990) -
- univector<cbase>({ cbase(1., +0.00000000e+00), cbase(0.80901699, +5.87785252e-01),
- cbase(0.30901699, +9.51056516e-01), cbase(-0.30901699, +9.51056516e-01),
- cbase(-0.80901699, +5.87785252e-01), cbase(-1., +1.22464680e-16),
- cbase(-0.80901699, -5.87785252e-01),
- cbase(-0.30901699, -9.51056516e-01), cbase(0.30901699, -9.51056516e-01),
- cbase(0.80901699, -5.87785252e-01) }))) < 0.00006); // error here depends on vector width
- // In most cases error is much lower (less than 0.00001)
-}
-
-TEST(ctti)
-{
- CHECK(cometa::type_name<float>() == std::string("float"));
-}
+TEST(ctti) { CHECK(cometa::type_name<float>() == std::string("float")); }
} // namespace CMT_ARCH_NAME
diff --git a/tests/complex_test.cpp b/tests/complex_test.cpp
@@ -192,9 +192,9 @@ TEST(complex_function_expressions)
CHECK(uv3[1] == 2.f);
CHECK(uv3[2] == 8.f);
CHECK(uv3[3] == 18.f);
- testo::assert_is_same<c32, value_type_of<decltype(uv2)>>();
- testo::assert_is_same<f32, value_type_of<decltype(uv3)>>();
- testo::assert_is_same<f32, value_type_of<decltype(real(uv2))>>();
+ testo::assert_is_same<c32, expression_value_type<decltype(uv2)>>();
+ testo::assert_is_same<f32, expression_value_type<decltype(uv3)>>();
+ testo::assert_is_same<f32, expression_value_type<decltype(real(uv2))>>();
}
TEST(static_tests)
@@ -219,11 +219,7 @@ TEST(static_tests)
testo::assert_is_same<ftype<vec<complex<i32>, 4>>, vec<complex<f32>, 4>>();
testo::assert_is_same<ftype<vec<complex<i64>, 8>>, vec<complex<f64>, 8>>();
- testo::assert_is_same<kfr::internal::arg<int>, kfr::internal::expression_scalar<int>>();
- testo::assert_is_same<kfr::internal::arg<complex<int>>,
- kfr::internal::expression_scalar<kfr::complex<int>>>();
-
- testo::assert_is_same<kfr::common_type<complex<int>, double>, complex<double>>();
+ testo::assert_is_same<std::common_type_t<complex<int>, double>, complex<double>>();
}
} // namespace CMT_ARCH_NAME
diff --git a/tests/dft_test.cpp b/tests/dft_test.cpp
@@ -24,17 +24,31 @@ constexpr ctypes_t<float, double> dft_float_types{};
constexpr ctypes_t<float> dft_float_types{};
#endif
-#if defined(__clang__) && defined(CMT_ARCH_X86)
+#if defined(CMT_ARCH_X86)
-static void full_barrier() { asm volatile("mfence" ::: "memory"); }
-static void dont_optimize(const void* in) { asm volatile("" : "+m"(in)); }
+static void full_barrier()
+{
+#ifdef CMT_COMPILER_GNU
+ asm volatile("mfence" ::: "memory");
+#else
+ _ReadWriteBarrier();
+#endif
+}
+static CMT_NOINLINE void dont_optimize(const void* in)
+{
+#ifdef CMT_COMPILER_GNU
+ asm volatile("" : "+m"(in));
+#else
+ volatile uint8_t a = *reinterpret_cast<const uint8_t*>(in);
+#endif
+}
template <typename T>
static void perf_test_t(int size)
{
print("[PERFORMANCE] DFT ", fmt<'s', 6>(type_name<T>()), " ", fmt<'d', 6>(size), "...");
- random_bit_generator gen1(2247448713, 915890490, 864203735, 2982561);
- random_bit_generator gen2(2982561, 2247448713, 915890490, 864203735);
+ random_state gen1 = random_init(2247448713, 915890490, 864203735, 2982561);
+ random_state gen2 = random_init(2982561, 2247448713, 915890490, 864203735);
std::chrono::high_resolution_clock::duration duration(0);
dft_plan<T> dft(size);
univector<u8> tmp(dft.temp_size);
@@ -69,10 +83,12 @@ TEST(test_performance)
perf_test(size);
}
+#ifndef KFR_DFT_NO_NPo2
perf_test(210);
perf_test(3150);
perf_test(211);
perf_test(3163);
+#endif
}
#endif
@@ -149,7 +165,7 @@ constexpr size_t dft_stopsize = 257;
TEST(fft_real)
{
using float_type = double;
- random_bit_generator gen(2247448713, 915890490, 864203735, 2982561);
+ random_state gen = random_init(2247448713, 915890490, 864203735, 2982561);
constexpr size_t size = 64;
@@ -161,8 +177,10 @@ TEST(fft_real)
TEST(fft_accuracy)
{
+#ifdef DEBUG_DFT_PROGRESS
testo::active_test()->show_progress = true;
- random_bit_generator gen(2247448713, 915890490, 864203735, 2982561);
+#endif
+ random_state gen = random_init(2247448713, 915890490, 864203735, 2982561);
std::set<size_t> size_set;
univector<size_t> sizes = truncate(1 + counter(), fft_stopsize - 1);
sizes = round(pow(2.0, sizes));
@@ -175,7 +193,9 @@ TEST(fft_accuracy)
sizes.push_back(s);
}
#endif
+#ifdef DEBUG_DFT_PROGRESS
println(sizes);
+#endif
testo::matrix(named("type") = dft_float_types, //
named("size") = sizes, //
@@ -193,9 +213,12 @@ TEST(fft_accuracy)
univector<complex<float_type>> refout = out;
univector<complex<float_type>> outo = in;
const dft_plan<float_type> dft(size);
+ double min_prec2 = dft.arblen ? 2 * min_prec : min_prec;
if (!inverse)
{
+#if DEBUG_DFT_PROGRESS
dft.dump();
+#endif
}
univector<u8> temp(dft.temp_size);
@@ -204,9 +227,9 @@ TEST(fft_accuracy)
dft.execute(out, out, temp, inverse);
const float_type rms_diff_inplace = rms(cabs(refout - out));
- CHECK(rms_diff_inplace < min_prec);
+ CHECK(rms_diff_inplace < min_prec2);
const float_type rms_diff_outofplace = rms(cabs(refout - outo));
- CHECK(rms_diff_outofplace < min_prec);
+ CHECK(rms_diff_outofplace < min_prec2);
}
if (size >= 4 && is_poweroftwo(size))
@@ -214,8 +237,8 @@ TEST(fft_accuracy)
univector<float_type> in =
truncate(gen_random_range<float_type>(gen, -1.0, +1.0), size);
- univector<complex<float_type>> out = truncate(scalar(qnan), size);
- univector<complex<float_type>> refout = truncate(scalar(qnan), size);
+ univector<complex<float_type>> out = truncate(dimensions<1>(scalar(qnan)), size);
+ univector<complex<float_type>> refout = truncate(dimensions<1>(scalar(qnan)), size);
const dft_plan_real<float_type> dft(size);
univector<u8> temp(dft.temp_size);
@@ -246,21 +269,21 @@ TEST(dct)
univector<u8> tmp(plan.temp_size);
plan.execute(out, in, tmp, false);
- univector<float, size> refout = { 120., -51.79283109806667, 0., -5.6781471211595695,
- 0., -1.9843883778092053, 0., -0.9603691873838152,
- 0., -0.5308329190495176, 0., -0.3030379000702155,
- 0., -0.1584982220313824, 0., -0.0494839805703826 };
+ univector<float, size> refout = { 120.f, -51.79283109806667f, 0.f, -5.6781471211595695f,
+ 0.f, -1.9843883778092053f, 0.f, -0.9603691873838152f,
+ 0.f, -0.5308329190495176f, 0.f, -0.3030379000702155f,
+ 0.f, -0.1584982220313824f, 0.f, -0.0494839805703826f };
CHECK(rms(refout - out) < 0.00001f);
plan.execute(outinv, in, tmp, true);
- univector<float, size> refoutinv = { 59.00747544192212, -65.54341437693878, 27.70332758523579,
- -24.56124678824279, 15.546989102481612, -14.293082621965974,
- 10.08224348063459, -9.38097406470581, 6.795411054455922,
- -6.320715753372687, 4.455202292297903, -4.0896421269390455,
- 2.580439536964837, -2.2695816108369176, 0.9311870090070382,
- -0.643618159997807 };
+ univector<float, size> refoutinv = { 59.00747544192212f, -65.54341437693878f, 27.70332758523579f,
+ -24.56124678824279f, 15.546989102481612f, -14.293082621965974f,
+ 10.08224348063459f, -9.38097406470581f, 6.795411054455922f,
+ -6.320715753372687f, 4.455202292297903f, -4.0896421269390455f,
+ 2.580439536964837f, -2.2695816108369176f, 0.9311870090070382f,
+ -0.643618159997807f };
CHECK(rms(refoutinv - outinv) < 0.00001f);
}
diff --git a/tests/dsp_test.cpp b/tests/dsp_test.cpp
@@ -18,269 +18,6 @@ using namespace kfr;
namespace CMT_ARCH_NAME
{
-struct TestFragment
-{
- float gain; // dB
- float duration; // seconds
- float frequency; // Hz
-};
-
-struct TestFragmentMultichannel
-{
- float gain_L_R; // dB
- float gain_C; // dB
- float gain_Ls_Rs; // dB
- float duration; // seconds
- float frequency; // Hz
-};
-
-template <typename T>
-static void ebu_test_stereo(int sample_rate, const std::initializer_list<TestFragment>& fragments, T refM,
- T refS, T refI, T refLRA)
-{
- ebu_r128<T> loudness(sample_rate, { Speaker::Left, Speaker::Right });
-
- size_t total_length = 0;
- for (const TestFragment& f : fragments)
- {
- total_length += static_cast<size_t>(f.duration * sample_rate);
- }
-
- univector<T> left_right(total_length);
- size_t pos = 0;
- for (const TestFragment& f : fragments)
- {
- const size_t len = static_cast<size_t>(f.duration * sample_rate);
- left_right.slice(pos, len) = dB_to_amp(f.gain) * sinenorm(phasor<float>(f.frequency, sample_rate));
- pos += len;
- }
-
- for (size_t i = 0; i < total_length / loudness.packet_size(); i++)
- {
- loudness.process_packet({ left_right.slice(i * loudness.packet_size(), loudness.packet_size()),
- left_right.slice(i * loudness.packet_size(), loudness.packet_size()) });
- }
- T M, S, I, RL, RH;
- loudness.get_values(M, S, I, RL, RH);
- if (!std::isnan(refM))
- CHECK(std::abs(M - refM) < 0.05f);
- if (!std::isnan(refS))
- CHECK(std::abs(S - refS) < 0.05f);
- if (!std::isnan(refI))
- CHECK(std::abs(I - refI) < 0.05f);
- if (!std::isnan(refLRA))
- CHECK(std::abs((RH - RL) - refLRA) < 0.05f);
-}
-
-template <typename T>
-static void ebu_test_multichannel(int sample_rate,
- const std::initializer_list<TestFragmentMultichannel>& fragments, T refM,
- T refS, T refI, T refLRA)
-{
- ebu_r128<T> loudness(sample_rate, { Speaker::Left, Speaker::Right, Speaker::Center, Speaker::LeftSurround,
- Speaker::RightSurround });
-
- size_t total_length = 0;
- for (const TestFragmentMultichannel& f : fragments)
- {
- total_length += static_cast<size_t>(f.duration * sample_rate);
- }
-
- univector<T> left_right(total_length);
- univector<T> center(total_length);
- univector<T> surround(total_length);
- size_t pos = 0;
- for (const TestFragmentMultichannel& f : fragments)
- {
- const size_t len = static_cast<size_t>(f.duration * sample_rate);
- left_right.slice(pos, len) =
- dB_to_amp(f.gain_L_R) * sinenorm(phasor<float>(f.frequency, sample_rate));
- center.slice(pos, len) = dB_to_amp(f.gain_C) * sinenorm(phasor<float>(f.frequency, sample_rate));
- surround.slice(pos, len) =
- dB_to_amp(f.gain_Ls_Rs) * sinenorm(phasor<float>(f.frequency, sample_rate));
- pos += len;
- }
-
- for (size_t i = 0; i < total_length / loudness.packet_size(); i++)
- {
- loudness.process_packet({ left_right.slice(i * loudness.packet_size(), loudness.packet_size()),
- left_right.slice(i * loudness.packet_size(), loudness.packet_size()),
- center.slice(i * loudness.packet_size(), loudness.packet_size()),
- surround.slice(i * loudness.packet_size(), loudness.packet_size()),
- surround.slice(i * loudness.packet_size(), loudness.packet_size()) });
- }
- T M, S, I, RL, RH;
- loudness.get_values(M, S, I, RL, RH);
- if (!std::isnan(refM))
- CHECK(std::abs(M - refM) < 0.05f);
- if (!std::isnan(refS))
- CHECK(std::abs(S - refS) < 0.05f);
- if (!std::isnan(refI))
- CHECK(std::abs(I - refI) < 0.05f);
- if (!std::isnan(refLRA))
- CHECK(std::abs((RH - RL) - refLRA) < 0.05f);
-}
-
-TEST(ebu_stereo_1_and_2)
-{
- testo::matrix(named("type") = ctypes_t<float, double>{},
- named("sample_rate") = std::vector<int>{ 44100, 48000 }, [](auto type, int sample_rate) {
- using T = typename decltype(type)::type;
-
- ebu_test_stereo<T>(sample_rate, { { -23.f, 20.f, 1000.f } }, -23.f, -23.f, -23.f, NAN);
- ebu_test_stereo<T>(sample_rate, { { -33.f, 20.f, 1000.f } }, -33.f, -33.f, -33.f, NAN);
- });
-}
-
-TEST(ebu_stereo_3_4_and_5)
-{
- testo::matrix(named("type") = ctypes_t<float, double>{},
- named("sample_rate") = std::vector<int>{ 44100, 48000 }, [](auto type, int sample_rate) {
- using T = typename decltype(type)::type;
-
- ebu_test_stereo<T>(
- sample_rate,
- { { -36.f, 10.f, 1000.f }, { -23.f, 60.f, 1000.f }, { -36.f, 10.f, 1000.f } }, NAN,
- NAN, -23.f, NAN);
- ebu_test_stereo<T>(sample_rate,
- { { -72.f, 10.f, 1000.f },
- { -36.f, 10.f, 1000.f },
- { -23.f, 60.f, 1000.f },
- { -36.f, 10.f, 1000.f },
- { -72.f, 10.f, 1000.f } },
- NAN, NAN, -23.f, NAN);
- });
-}
-
-TEST(ebu_multichannel_6)
-{
- testo::matrix(named("type") = ctypes_t<float, double>{},
- named("sample_rate") = std::vector<int>{ 44100, 48000 }, [](auto type, int sample_rate) {
- using T = typename decltype(type)::type;
-
- ebu_test_multichannel<T>(sample_rate, { { -28.f, -24.f, -30.f, 20.f, 1000.f } }, NAN,
- NAN, -23.f, NAN);
- });
-}
-
-TEST(ebu_stereo_9)
-{
- testo::matrix(named("type") = ctypes_t<float, double>{},
- named("sample_rate") = std::vector<int>{ 44100, 48000 }, [](auto type, int sample_rate) {
- using T = typename decltype(type)::type;
-
- ebu_test_stereo<T>(sample_rate,
- { { -20.f, 1.34f, 1000.f },
- { -30.f, 1.66f, 1000.f },
- { -20.f, 1.34f, 1000.f },
- { -30.f, 1.66f, 1000.f },
- { -20.f, 1.34f, 1000.f },
- { -30.f, 1.66f, 1000.f },
- { -20.f, 1.34f, 1000.f },
- { -30.f, 1.66f, 1000.f },
- { -20.f, 1.34f, 1000.f },
- { -30.f, 1.66f, 1000.f } },
- NAN, -23.f, NAN, NAN);
- });
-}
-
-TEST(ebu_stereo_12)
-{
- testo::matrix(named("type") = ctypes_t<float, double>{},
- named("sample_rate") = std::vector<int>{ 44100, 48000 }, [](auto type, int sample_rate) {
- using T = typename decltype(type)::type;
-
- ebu_test_stereo<T>(
- sample_rate,
- { { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
- { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
- { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
- { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
- { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
- { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
- { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
- { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
- { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
- { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
- { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
- { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
- { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
- { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
- { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
- { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
- { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f } },
- -23.f, NAN, NAN, NAN);
- });
-}
-
-TEST(ebu_lra_1_2_3_and_4)
-{
- testo::matrix(named("type") = ctypes_t<float, double>{},
- named("sample_rate") = std::vector<int>{ 44100, 48000 }, [](auto type, int sample_rate) {
- using T = typename decltype(type)::type;
-
- ebu_test_stereo<T>(sample_rate, { { -20.f, 20.f, 1000.f }, { -30.f, 20.f, 1000.f } },
- NAN, NAN, NAN, 10.f);
-
- ebu_test_stereo<T>(sample_rate, { { -20.f, 20.f, 1000.f }, { -15.f, 20.f, 1000.f } },
- NAN, NAN, NAN, 5.f);
-
- ebu_test_stereo<T>(sample_rate, { { -40.f, 20.f, 1000.f }, { -20.f, 20.f, 1000.f } },
- NAN, NAN, NAN, 20.f);
-
- ebu_test_stereo<T>(sample_rate,
- { { -50.f, 20.f, 1000.f },
- { -35.f, 20.f, 1000.f },
- { -20.f, 20.f, 1000.f },
- { -35.f, 20.f, 1000.f },
- { -50.f, 20.f, 1000.f } },
- NAN, NAN, NAN, 15.f);
- });
-}
-
-TEST(note_to_hertz)
-{
- testo::eplison_scope<void> eps(2000);
- CHECK(kfr::note_to_hertz(60) == fbase(261.6255653005986346778499935233));
- CHECK(kfr::note_to_hertz(pack(60)) == pack(fbase(261.6255653005986346778499935233)));
-
- CHECK(kfr::note_to_hertz(69) == fbase(440.0));
- CHECK(kfr::note_to_hertz(pack(69)) == pack(fbase(440)));
-}
-
-TEST(hertz_to_note)
-{
- testo::eplison_scope<void> eps(1000);
- CHECK(kfr::hertz_to_note(261.6255653005986346778499935233) == fbase(60));
- CHECK(kfr::hertz_to_note(pack(261.6255653005986346778499935233)) == pack(fbase(60)));
-
- CHECK(kfr::hertz_to_note(440) == fbase(69));
- CHECK(kfr::hertz_to_note(pack(440)) == pack(fbase(69)));
-}
-
-TEST(amp_to_dB)
-{
- testo::eplison_scope<void> eps(1000);
-
- CHECK(kfr::amp_to_dB(fbase(2.0)) == fbase(6.0205999132796239042747778944899));
- CHECK(kfr::amp_to_dB(fbase(-2.0)) == fbase(6.0205999132796239042747778944899));
- CHECK(kfr::amp_to_dB(fbase(1.0)) == fbase(0));
- CHECK(kfr::amp_to_dB(fbase(-1.0)) == fbase(0));
- CHECK(kfr::amp_to_dB(fbase(0.5)) == fbase(-6.0205999132796239042747778944899));
- CHECK(kfr::amp_to_dB(fbase(-0.5)) == fbase(-6.0205999132796239042747778944899));
- CHECK(kfr::amp_to_dB(fbase(0.0)) == fbase(-HUGE_VAL));
-}
-
-TEST(dB_to_amp)
-{
- testo::eplison_scope<void> eps(1000);
-
- CHECK(kfr::dB_to_amp(fbase(-HUGE_VAL)) == fbase(0.0));
- CHECK(kfr::dB_to_amp(fbase(0.0)) == fbase(1.0));
- CHECK(kfr::dB_to_amp(fbase(6.0205999132796239042747778944899)) == fbase(2.0));
- CHECK(kfr::dB_to_amp(fbase(-6.0205999132796239042747778944899)) == fbase(0.5));
-}
-
TEST(delay)
{
const univector<float, 33> v1 = counter() + 100;
@@ -337,316 +74,14 @@ TEST(phasor)
CHECK(rms(v1 - v2) < 1.e-5);
}
-TEST(fir)
-{
-#ifdef CMT_COMPILER_MSVC
- // testo::matrix causes error in MSVC
- {
- using T = float;
-
- const univector<T, 100> data = counter() + sequence(1, 2, -10, 100) + sequence(0, -7, 0.5);
- const univector<T, 6> taps{ 1, 2, -2, 0.5, 0.0625, 4 };
-
- CHECK_EXPRESSION(fir(data, taps), 100, [&](size_t index) -> T {
- T result = 0;
- for (size_t i = 0; i < taps.size(); i++)
- result += data.get(index - i, 0) * taps[i];
- return result;
- });
-
- CHECK_EXPRESSION(short_fir(data, taps), 100, [&](size_t index) -> T {
- T result = 0;
- for (size_t i = 0; i < taps.size(); i++)
- result += data.get(index - i, 0) * taps[i];
- return result;
- });
- }
- {
- using T = double;
-
- const univector<T, 100> data = counter() + sequence(1, 2, -10, 100) + sequence(0, -7, 0.5);
- const univector<T, 6> taps{ 1, 2, -2, 0.5, 0.0625, 4 };
-
- CHECK_EXPRESSION(fir(data, taps), 100, [&](size_t index) -> T {
- T result = 0;
- for (size_t i = 0; i < taps.size(); i++)
- result += data.get(index - i, 0) * taps[i];
- return result;
- });
-
- CHECK_EXPRESSION(short_fir(data, taps), 100, [&](size_t index) -> T {
- T result = 0;
- for (size_t i = 0; i < taps.size(); i++)
- result += data.get(index - i, 0) * taps[i];
- return result;
- });
- }
-#else
- testo::matrix(named("type") = ctypes_t<float
-#ifdef CMT_NATIVE_F64
- ,
- double
-#endif
- >{},
- [](auto type) {
- using T = typename decltype(type)::type;
-
- const univector<T, 100> data =
- counter() + sequence(1, 2, -10, 100) + sequence(0, -7, 0.5);
- const univector<T, 6> taps{ 1, 2, -2, 0.5, 0.0625, 4 };
-
- CHECK_EXPRESSION(fir(data, taps), 100, [&](size_t index) -> T {
- T result = 0;
- for (size_t i = 0; i < taps.size(); i++)
- result += data.get(index - i, 0) * taps[i];
- return result;
- });
-
- fir_state<T> state(taps.ref());
-
- CHECK_EXPRESSION(fir(state, data), 100, [&](size_t index) -> T {
- T result = 0;
- for (size_t i = 0; i < taps.size(); i++)
- result += data.get(index - i, 0) * taps[i];
- return result;
- });
-
- CHECK_EXPRESSION(short_fir(data, taps), 100, [&](size_t index) -> T {
- T result = 0;
- for (size_t i = 0; i < taps.size(); i++)
- result += data.get(index - i, 0) * taps[i];
- return result;
- });
-
- short_fir_state<9, T> state2(taps);
-
- CHECK_EXPRESSION(short_fir<taps.size()>(state2, data), 100, [&](size_t index) -> T {
- T result = 0;
- for (size_t i = 0; i < taps.size(); i++)
- result += data.get(index - i, 0) * taps[i];
- return result;
- });
-
- CHECK_EXPRESSION(moving_sum<taps.size()>(data), 100, [&](size_t index) -> T {
- T result = 0;
- for (size_t i = 0; i < taps.size(); i++)
- result += data.get(index - i, 0);
- return result;
- });
-
- moving_sum_state<T, 131> msstate1;
-
- CHECK_EXPRESSION(moving_sum(msstate1, data), 100, [&](size_t index) -> T {
- T result = 0;
- for (size_t i = 0; i < msstate1.delayline.size(); i++)
- result += data.get(index - i, 0);
- return result;
- });
-
- moving_sum_state<T> msstate2(133);
-
- CHECK_EXPRESSION(moving_sum(msstate2, data), 100, [&](size_t index) -> T {
- T result = 0;
- for (size_t i = 0; i < msstate2.delayline.size(); i++)
- result += data.get(index - i, 0);
- return result;
- });
- });
-#endif
-}
-
-#ifdef CMT_NATIVE_F64
-TEST(fir_different)
-{
- const univector<float, 100> data = counter() + sequence(1, 2, -10, 100) + sequence(0, -7, 0.5f);
- // const univector<double, 6> taps{ 1, 2, -2, 0.5, 0.0625, 4 };
- const univector<double, 4> taps{ 1, 2, 3, 4 };
-
- CHECK_EXPRESSION(fir(data, taps), 100, [&](size_t index) -> float {
- double result = 0.0;
- for (size_t i = 0; i < taps.size(); i++)
- result += data.get(index - i, 0.0) * taps[i];
- return float(result);
- });
-
- CHECK_EXPRESSION(short_fir(data, taps), 100, [&](size_t index) -> float {
- double result = 0.0;
- for (size_t i = 0; i < taps.size(); i++)
- result += data.get(index - i, 0.0) * taps[i];
- return float(result);
- });
-}
-#endif
-
-#ifdef KFR_STD_COMPLEX
-template <typename T>
-inline std::complex<T> to_std(const std::complex<T>& c)
-{
- return c;
-}
-template <typename T>
-inline std::complex<T> from_std(const std::complex<T>& c)
-{
- return c;
-}
-#else
-template <typename T>
-inline std::complex<T> to_std(const kfr::complex<T>& c)
-{
- return { c.real(), c.imag() };
-}
-
-template <typename T>
-inline kfr::complex<T> from_std(const std::complex<T>& c)
-{
- return { c.real(), c.imag() };
-}
-#endif
-
-TEST(fir_complex)
-{
- const univector<complex<float>, 100> data =
- counter() * complex<float>{ 0.f, 1.f } + sequence(1, 2, -10, 100) + sequence(0, -7, 0.5f);
- const univector<float, 6> taps{ 1, 2, -2, 0.5, 0.0625, 4 };
-
- CHECK_EXPRESSION(fir(data, taps), 100, [&](size_t index) -> complex<float> {
- std::complex<float> result = 0.0;
- for (size_t i = 0; i < taps.size(); i++)
- result = result + to_std(data.get(index - i, 0.0)) * taps[i];
- return from_std(result);
- });
-
- CHECK_EXPRESSION(short_fir(data, taps), 100, [&](size_t index) -> complex<float> {
- std::complex<float> result = 0.0;
- for (size_t i = 0; i < taps.size(); i++)
- result = result + to_std(data.get(index - i, 0.0)) * taps[i];
- return from_std(result);
- });
-}
-
template <typename E, typename T, size_t size>
void test_ir(E&& e, const univector<T, size>& test_vector)
{
- substitute(e, to_pointer(unitimpulse<T>()));
+ substitute(e, to_handle(unitimpulse<T>()));
const univector<T, size> ir = e;
println(absmaxof(ir - test_vector));
}
-template <typename T, typename... Ts, univector_tag Tag>
-inline const univector<T, Tag>& choose_array(const univector<T, Tag>& array, const univector<Ts, Tag>&...)
-{
- return array;
-}
-
-template <typename T, typename T2, typename... Ts, univector_tag Tag, KFR_ENABLE_IF(!is_same<T, T2>)>
-inline const univector<T, Tag>& choose_array(const univector<T2, Tag>&, const univector<Ts, Tag>&... arrays)
-{
- return choose_array<T>(arrays...);
-}
-
-TEST(biquad_lowpass1)
-{
- testo::matrix(named("type") = ctypes_t<float, double>{}, [](auto type) {
- using T = typename decltype(type)::type;
-
- const biquad_params<T> bq = biquad_lowpass<T>(0.1, 0.7);
-
- constexpr size_t size = 32;
-
- const univector<float, size> test_vector_f32{
- +0x8.9bce2p-7, +0xd.8383ep-6, +0x8.f908dp-5, +0xe.edc21p-6, +0x9.ae104p-6, +0x9.dcc24p-7,
- +0xd.50584p-9, -0xf.2668p-13, -0xd.09ca1p-10, -0xe.15995p-10, -0xa.b90d2p-10, -0xc.edea4p-11,
- -0xb.f14eap-12, -0xc.2cb44p-14, +0xb.4a4dep-15, +0xb.685dap-14, +0xa.b181fp-14, +0xf.0cb2bp-15,
- +0x8.695d6p-15, +0xd.bedd4p-17, +0xf.5474p-20, -0xd.bb266p-19, -0x9.63ca1p-18, -0xf.ca567p-19,
- -0xa.5231p-19, -0xa.9e934p-20, -0xe.ab52p-22, +0xa.3c4cp-26, +0xd.721ffp-23, +0xe.ccc1ap-23,
- +0xb.5f248p-23, +0xd.d2c9ap-24,
- };
-
- const univector<double, size> test_vector_f64{
- +0x8.9bce2bf3663e8p-7, +0xd.8384010fdf1dp-6, +0x8.f908e7a36df6p-5, +0xe.edc2332a6d0bp-6,
- +0x9.ae104af1da9ap-6, +0x9.dcc235ef68e7p-7, +0xd.5057ee425e05p-9, -0xf.266e42a99aep-13,
- -0xd.09cad73642208p-10, -0xe.1599f32a83dp-10, -0xa.b90d8910a117p-10, -0xc.edeaabb890948p-11,
- -0xb.f14edbb55383p-12, -0xc.2cb39b86f2dap-14, +0xb.4a506ecff055p-15, +0xb.685edfdb55358p-14,
- +0xa.b182e32f8e298p-14, +0xf.0cb3dfd894b2p-15, +0x8.695df725b4438p-15, +0xd.beddc3606b9p-17,
- +0xf.547004d20874p-20, -0xd.bb29b25b49b6p-19, -0x9.63cb9187da1dp-18, -0xf.ca588634fc618p-19,
- -0xa.52322d320da78p-19, -0xa.9e9420154e4p-20, -0xe.ab51f7b0335ap-22, +0xa.3c6479980e1p-26,
- +0xd.7223836599fp-23, +0xe.ccc47ddd18678p-23, +0xb.5f265b1be1728p-23, +0xd.d2cb83f8483f8p-24,
- };
-
- const univector<T, size> ir = biquad(bq, unitimpulse<T>());
-
- CHECK(absmaxof(choose_array<T>(test_vector_f32, test_vector_f64) - ir) == 0);
- });
-}
-
-TEST(biquad_lowpass2)
-{
- testo::matrix(named("type") = ctypes_t<float, double>{}, [](auto type) {
- using T = typename decltype(type)::type;
-
- const biquad_params<T> bq = biquad_lowpass<T>(0.45, 0.2);
-
- constexpr size_t size = 32;
-
- const univector<float, size> test_vector_f32{
- +0x8.ce416p-4, +0x8.2979p-4, -0x8.a9d04p-7, +0xe.aeb3p-11, +0x8.204f8p-13, -0x8.20d78p-12,
- +0x8.3379p-12, -0xf.83d81p-13, +0xe.8b5c4p-13, -0xd.9ddadp-13, +0xc.bedfcp-13, -0xb.ee123p-13,
- +0xb.2a9e5p-13, -0xa.73ac4p-13, +0x9.c86f6p-13, -0x9.2828p-13, +0x8.92229p-13, -0x8.05b7p-13,
- +0xf.048ffp-14, -0xe.0e849p-14, +0xd.28384p-14, -0xc.50a9p-14, +0xb.86e56p-14, -0xa.ca0b6p-14,
- +0xa.19476p-14, -0x9.73d38p-14, +0x8.d8f64p-14, -0x8.48024p-14, +0xf.80aa2p-15, -0xe.82ad8p-15,
- +0xd.94f22p-15, -0xc.b66d9p-15,
- };
-
- const univector<double, size> test_vector_f64{
- +0x8.ce416c0d31e88p-4, +0x8.2978efe51dafp-4, -0x8.a9d088b81da6p-7, +0xe.aeb56c029358p-11,
- +0x8.20492639873ap-13, -0x8.20d4e21aab538p-12, +0x8.3376b2d53b4a8p-12, -0xf.83d3d1c17343p-13,
- +0xe.8b584f0dd5ac8p-13, -0xd.9dd740ceaacf8p-13, +0xc.bedc85e7a621p-13, -0xb.ee0f472bf8968p-13,
- +0xb.2a9baed1fe6cp-13, -0xa.73a9d1670f4ep-13, +0x9.c86d29d297798p-13, -0x9.2825f4d894088p-13,
- +0x8.9220a956d651p-13, -0x8.05b539fdd79e8p-13, +0xf.048cb5194cfa8p-14, -0xe.0e819fa128938p-14,
- +0xd.2835957d684cp-14, -0xc.50a69c2a8dc18p-14, +0xb.86e33bbaf3cbp-14, -0xa.ca097058af2cp-14,
- +0xa.1945ad1703dcp-14, -0x9.73d1eef7d8b68p-14, +0x8.d8f4df1bb3efp-14, -0x8.48010323c6f7p-14,
- +0xf.80a7f5baeeb2p-15, -0xe.82ab94bb68a8p-15, +0xd.94f05f80af008p-15, -0xc.b66c0799b21a8p-15,
- };
-
- const univector<T, size> ir = biquad(bq, unitimpulse<T>());
-
- CHECK(absmaxof(choose_array<T>(test_vector_f32, test_vector_f64) - ir) == 0);
- });
-}
-
-TEST(resampler_test)
-{
- const int in_sr = 44100;
- const int out_sr = 48000;
- const int freq = 100;
- auto resampler = sample_rate_converter<fbase>(resample_quality::draft, out_sr, in_sr);
- double delay = resampler.get_fractional_delay();
- univector<fbase> out(out_sr / 10);
- univector<fbase> in = truncate(sin(c_pi<fbase> * phasor<fbase>(freq, in_sr, 0)), in_sr / 10);
- univector<fbase> ref = truncate(
- sin(c_pi<fbase> * phasor<fbase>(freq, out_sr, -delay * (static_cast<double>(freq) / out_sr))),
- out_sr / 10);
- resampler.process(out, in);
-
- CHECK(rms(slice(out - ref, static_cast<size_t>(ceil(delay * 2)))) < 0.005f);
-}
-TEST(resampler_test_complex)
-{
- using type = complex<fbase>;
- const int in_sr = 44100;
- const int out_sr = 48000;
- const int freq = 100;
- auto resampler = sample_rate_converter<type>(resample_quality::draft, out_sr, in_sr);
- double delay = resampler.get_fractional_delay();
- univector<type> out(out_sr / 10);
- univector<type> in = truncate(sin(c_pi<fbase> * phasor<fbase>(freq, in_sr, 0)), in_sr / 10);
- univector<type> ref = truncate(
- sin(c_pi<fbase> * phasor<fbase>(freq, out_sr, -delay * (static_cast<double>(freq) / out_sr))),
- out_sr / 10);
- resampler.process(out, in);
-
- CHECK(rms(cabs(slice(out - ref, static_cast<size_t>(ceil(delay * 2))))) < 0.005f);
-}
} // namespace CMT_ARCH_NAME
#ifndef KFR_NO_MAIN
diff --git a/tests/expression_test.cpp b/tests/expression_test.cpp
@@ -16,95 +16,6 @@ using namespace kfr;
namespace CMT_ARCH_NAME
{
-TEST(pack)
-{
- static_assert(is_same<vec<f32x2, 1>, invoke_result<fn::reverse, vec<f32x2, 1>>>);
- const univector<float, 21> v1 = 1 + counter();
- const univector<float, 21> v2 = v1 * 11;
-
- CHECK_EXPRESSION(pack(v1, v2), 21, [](float i) { return f32x2{ 1 + i, (1 + i) * 11 }; });
-
- CHECK_EXPRESSION(bind_expression(fn::reverse(), pack(v1, v2)), 21, [](float i) {
- return f32x2{ (1 + i) * 11, 1 + i };
- });
-}
-
-TEST(adjacent)
-{
- CHECK_EXPRESSION(adjacent(fn::mul(), counter()), infinite_size,
- [](size_t i) { return i > 0 ? i * (i - 1) : 0; });
-}
-
-TEST(padded)
-{
- static_assert(is_infinite<decltype(padded(counter()))>, "");
- static_assert(is_infinite<decltype(padded(truncate(counter(), 100)))>, "");
-
- CHECK_EXPRESSION(padded(truncate(counter(), 6), -1), infinite_size,
- [](size_t i) { return i >= 6 ? -1 : i; });
-
- CHECK_EXPRESSION(padded(truncate(counter(), 0), -1), infinite_size, [](size_t i) { return -1; });
-
- CHECK_EXPRESSION(padded(truncate(counter(), 501), -1), infinite_size,
- [](size_t i) { return i >= 501 ? -1 : i; });
-}
-
-TEST(rebind)
-{
- auto c_minus_two = counter() - 2;
- auto four_minus_c = rebind(c_minus_two, 4, counter());
- CHECK_EXPRESSION(c_minus_two, infinite_size, [](size_t i) { return i - 2; });
- CHECK_EXPRESSION(four_minus_c, infinite_size, [](size_t i) { return 4 - i; });
-}
-
-TEST(test_arg_access)
-{
- univector<float> v1(10);
- v1 = counter();
- auto e1 = std::move(v1) + 10;
- std::get<0>(e1.args)[0] = 100;
- std::get<1>(e1.args).val = 1;
-
- CHECK_EXPRESSION(e1, 10, [](size_t i) { return (i == 0 ? 100 : i) + 1; });
-}
-
-TEST(to_pointer)
-{
- auto e1 = to_pointer(counter<float>());
-
- CHECK_EXPRESSION(e1, infinite_size, [](size_t i) { return static_cast<float>(i); });
-
- auto e2 = to_pointer(gen_linear(0.f, 1.f));
-
- CHECK_EXPRESSION(e2, infinite_size, [](size_t i) { return static_cast<float>(i); });
-}
-
-TEST(test_arg_replace)
-{
- univector<float, 10> v1 = counter();
- univector<float, 10> v2 = -counter();
- auto e1 = to_pointer(v1) * 10;
- std::get<0>(e1.args) = to_pointer(v2);
-
- CHECK_EXPRESSION(e1, 10, [](size_t i) { return i * -10.0; });
-}
-
-TEST(placeholders)
-{
- auto expr = 100 * placeholder<float>();
- CHECK_EXPRESSION(expr, infinite_size, [](size_t) { return 0.f; });
- substitute(expr, to_pointer(counter<float>()));
- CHECK_EXPRESSION(expr, infinite_size, [](size_t i) { return 100.f * i; });
-}
-
-TEST(placeholders_pointer)
-{
- expression_pointer<float> expr = to_pointer(10 * placeholder<float>());
- CHECK_EXPRESSION(expr, infinite_size, [](size_t) { return 0.f; });
- substitute(expr, to_pointer(counter<float>()));
- CHECK_EXPRESSION(expr, infinite_size, [](size_t i) { return 10.f * i; });
-}
-
TEST(univector_assignment)
{
univector<int> x = truncate(counter(), 10);
@@ -115,28 +26,12 @@ TEST(univector_assignment)
CHECK(y.size() == 10u);
}
-TEST(size_calc)
-{
- auto a = counter();
- CHECK(a.size() == infinite_size);
- auto b = slice(counter(), 100);
- CHECK(b.size() == infinite_size);
- auto c = slice(counter(), 100, 1000);
- CHECK(c.size() == 1000u);
- auto d = slice(c, 100);
- CHECK(d.size() == 900u);
-}
-
-TEST(reverse)
-{
- CHECK_EXPRESSION(reverse(truncate(counter(), 21)), 21, [](size_t i) { return 20 - i; });
-}
-
TEST(mix)
{
- CHECK_EXPRESSION(mix(sequence(0, 0.5f, 1, 0.5f), counter(), counter() * 10), infinite_size, [](size_t i) {
- return mix(std::array<float, 4>{ 0, 0.5f, 1, 0.5f }[i % 4], i, i * 10);
- });
+ CHECK_EXPRESSION(mix(sequence(0, 0.5f, 1, 0.5f), counter(), counter() * 10), infinite_size,
+ [](size_t i) {
+ return mix(std::array<float, 4>{ 0, 0.5f, 1, 0.5f }[i % 4], i, i * 10);
+ });
}
TEST(expression_mask)
@@ -146,42 +41,6 @@ TEST(expression_mask)
x = select(x > y, 0.5f, 0.1f) * (y - x) + x;
}
-constexpr inline size_t fast_range_sum(size_t stop) { return stop * (stop + 1) / 2; }
-
-TEST(partition)
-{
- {
- univector<double, 385> output = zeros();
- auto result = partition(output, counter(), 5, 1);
- CHECK(result.count == 5u);
- CHECK(result.chunk_size == 80u);
-
- result(0);
- CHECK(sum(output) >= fast_range_sum(80 - 1));
- result(1);
- CHECK(sum(output) >= fast_range_sum(160 - 1));
- result(2);
- CHECK(sum(output) >= fast_range_sum(240 - 1));
- result(3);
- CHECK(sum(output) >= fast_range_sum(320 - 1));
- result(4);
- CHECK(sum(output) == fast_range_sum(385 - 1));
- }
-
- {
- univector<double, 385> output = zeros();
- auto result = partition(output, counter(), 5, 160);
- CHECK(result.count == 3u);
- CHECK(result.chunk_size == 160u);
-
- result(0);
- CHECK(sum(output) >= fast_range_sum(160 - 1));
- result(1);
- CHECK(sum(output) >= fast_range_sum(320 - 1));
- result(2);
- CHECK(sum(output) == fast_range_sum(385 - 1));
- }
-}
} // namespace CMT_ARCH_NAME
#ifndef KFR_NO_MAIN
diff --git a/tests/intrinsic_test.cpp b/tests/intrinsic_test.cpp
@@ -107,7 +107,8 @@ TEST(intrin_sqrt)
CHECK(kfr::sqrt(make_vector(9)) == make_vector<fbase>(3.0));
CHECK(kfr::sqrt(make_vector(-9)) == make_vector<fbase>(qnan));
testo::matrix(named("type") = float_vector_types<vec>, named("value") = std::vector<int>{ 0, 2, 65536 },
- [](auto type, int value) {
+ [](auto type, int value)
+ {
using T = typename decltype(type)::type;
const T x(value);
CHECK(kfr::sqrt(x) == apply([](auto x) -> decltype(x) { return std::sqrt(x); }, x));
@@ -117,7 +118,8 @@ TEST(intrin_sqrt)
TEST(intrin_satadd_satsub)
{
testo::matrix(named("type") = cconcat(signed_vector_types<vec>, unsigned_vector_types<vec>),
- [](auto type) {
+ [](auto type)
+ {
using T = typename decltype(type)::type;
using Tsub = subtype<T>;
const T min = std::numeric_limits<Tsub>::min();
@@ -144,23 +146,25 @@ TEST(intrin_satadd_satsub)
TEST(intrin_any_all)
{
- testo::matrix(named("type") = unsigned_vector_types<vec>, [](auto type) {
- using T = typename decltype(type)::type;
- constexpr size_t width = widthof<T>();
- using Tsub = subtype<T>;
- const auto x = enumerate<Tsub, width>() == Tsub(0);
- CHECK(any(x) == true);
- if (width == 1)
- CHECK(all(x) == true);
- else
- CHECK(all(x) == false);
- const auto y = zerovector<Tsub, width>() == Tsub(127);
- CHECK(all(y) == false);
- CHECK(any(y) == false);
- const auto z = zerovector<Tsub, width>() == Tsub(0);
- CHECK(all(z) == true);
- CHECK(any(z) == true);
- });
+ testo::matrix(named("type") = unsigned_vector_types<vec>,
+ [](auto type)
+ {
+ using T = typename decltype(type)::type;
+ constexpr size_t width = widthof<T>();
+ using Tsub = subtype<T>;
+ const auto x = enumerate<Tsub, width>() == Tsub(0);
+ CHECK(any(x) == true);
+ if (width == 1)
+ CHECK(all(x) == true);
+ else
+ CHECK(all(x) == false);
+ const auto y = zerovector<Tsub, width>() == Tsub(127);
+ CHECK(all(y) == false);
+ CHECK(any(y) == false);
+ const auto z = zerovector<Tsub, width>() == Tsub(0);
+ CHECK(all(z) == true);
+ CHECK(any(z) == true);
+ });
}
} // namespace CMT_ARCH_NAME
diff --git a/tests/numeric_tests.hpp b/tests/numeric_tests.hpp
@@ -10,6 +10,8 @@
namespace kfr
{
+inline bool show_measured_accuracy = false;
+
using testo::test_data_entry;
inline namespace CMT_ARCH_NAME
@@ -55,7 +57,7 @@ uint64_t ulps(vec<T, N> x, vec<T, N> y)
inline const char* tname(ctype_t<f32>) { return "float"; }
inline const char* tname(ctype_t<f64>) { return "double"; }
-#define CHECK_DIFF(x_arg, y_arg, threshold) \
+#define CHECK_DIFF(x_arg, y_arg, threshold, file, line) \
do \
{ \
++checks_count; \
@@ -67,57 +69,67 @@ inline const char* tname(ctype_t<f64>) { return "double"; }
::testo::active_test()->check( \
arg_diff <= threshold, \
::cometa::as_string(x_arg_value, " ~= ", y_arg_value, " (", arg_diff, " <= ", threshold, ")"), \
- #x_arg " ~= " #y_arg); \
+ #x_arg " ~= " #y_arg, file, line); \
} while (0)
#define KFR_AUTO_TEST_1(fn, datafile, maxulps, avgulps) \
TEST(fn##_##datafile) \
{ \
- testo::matrix(named("type") = vector_types(), [&](auto type) { \
- using T = typename decltype(type)::type; \
- using Tsub = subtype<T>; \
- double error_sum = 0.0; \
- uint64_t error_peak = 0; \
- uint64_t checks_count = 0; \
- std::shared_ptr<file_reader<test_data_entry<Tsub, 1>>> reader = \
- open_file_for_reading<test_data_entry<Tsub, 1>>( \
- std::string(KFR_SRC_DIR "/tests/data/" #fn "_") + tname(ctype<Tsub>) + "_" #datafile); \
- test_data_entry<Tsub, 1> entry; \
- while (reader->read(entry)) \
- { \
- testo::scope s(as_string(entry.arguments[0])); \
- CHECK_DIFF(kfr::fn(entry.arguments[0]), entry.result, maxulps); \
- } \
- CHECK(checks_count > 0u); \
- CHECK(error_sum / checks_count <= avgulps); \
- println("measured accuracy: ", tname(ctype<Tsub>), " ", error_sum / checks_count, "(peak ", \
- error_peak, ")"); \
- }); \
+ testo::matrix(named("type") = vector_types(), \
+ [&](auto type) \
+ { \
+ using T = typename decltype(type)::type; \
+ using Tsub = subtype<T>; \
+ double error_sum = 0.0; \
+ uint64_t error_peak = 0; \
+ uint64_t checks_count = 0; \
+ std::shared_ptr<file_reader<test_data_entry<Tsub, 1>>> reader = \
+ open_file_for_reading<test_data_entry<Tsub, 1>>( \
+ std::string(KFR_SRC_DIR "/tests/data/" #fn "_") + \
+ tname(cometa::ctype<Tsub>) + "_" #datafile); \
+ test_data_entry<Tsub, 1> entry; \
+ while (reader->read(entry)) \
+ { \
+ testo::scope s(as_string(entry.arguments[0])); \
+ CHECK_DIFF(kfr::fn(entry.arguments[0]), entry.result, maxulps, __FILE__, \
+ __LINE__); \
+ } \
+ CHECK(checks_count > 0u); \
+ CHECK(error_sum / checks_count <= avgulps); \
+ if (show_measured_accuracy) \
+ println("measured accuracy: ", tname(cometa::ctype<Tsub>), " ", \
+ error_sum / checks_count, "(peak ", error_peak, ")"); \
+ }); \
}
#define KFR_AUTO_TEST_2(fn, datafile, maxulps, avgulps) \
TEST(fn##_##datafile) \
{ \
- testo::matrix(named("type") = vector_types(), [&](auto type) { \
- using T = typename decltype(type)::type; \
- using Tsub = subtype<T>; \
- double error_sum = 0.0; \
- uint64_t error_peak = 0; \
- uint64_t checks_count = 0; \
- std::shared_ptr<file_reader<test_data_entry<Tsub, 2>>> reader = \
- open_file_for_reading<test_data_entry<Tsub, 2>>( \
- std::string(KFR_SRC_DIR "/tests/data/" #fn "_") + tname(ctype<Tsub>) + "_" #datafile); \
- test_data_entry<Tsub, 2> entry; \
- while (reader->read(entry)) \
- { \
- testo::scope s(as_string(entry.arguments[0], entry.arguments[1])); \
- CHECK_DIFF(kfr::fn(entry.arguments[0], entry.arguments[1]), entry.result, maxulps); \
- } \
- CHECK(checks_count > 0u); \
- CHECK(error_sum / checks_count <= avgulps); \
- println("measured accuracy: ", tname(ctype<Tsub>), " ", error_sum / checks_count, "(peak ", \
- error_peak, ")"); \
- }); \
+ testo::matrix(named("type") = vector_types(), \
+ [&](auto type) \
+ { \
+ using T = typename decltype(type)::type; \
+ using Tsub = subtype<T>; \
+ double error_sum = 0.0; \
+ uint64_t error_peak = 0; \
+ uint64_t checks_count = 0; \
+ std::shared_ptr<file_reader<test_data_entry<Tsub, 2>>> reader = \
+ open_file_for_reading<test_data_entry<Tsub, 2>>( \
+ std::string(KFR_SRC_DIR "/tests/data/" #fn "_") + \
+ tname(cometa::ctype<Tsub>) + "_" #datafile); \
+ test_data_entry<Tsub, 2> entry; \
+ while (reader->read(entry)) \
+ { \
+ testo::scope s(as_string(entry.arguments[0], entry.arguments[1])); \
+ CHECK_DIFF(kfr::fn(entry.arguments[0], entry.arguments[1]), entry.result, \
+ maxulps, __FILE__, __LINE__); \
+ } \
+ CHECK(checks_count > 0u); \
+ CHECK(error_sum / checks_count <= avgulps); \
+ if (show_measured_accuracy) \
+ println("measured accuracy: ", tname(cometa::ctype<Tsub>), " ", \
+ error_sum / checks_count, "(peak ", error_peak, ")"); \
+ }); \
}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/tests/tensor_test.cpp b/tests/tensor_test.cpp
@@ -0,0 +1,14 @@
+#include "kfr/runtime.hpp"
+#include "kfr/testo/testo.hpp"
+#include "kfr/version.hpp"
+
+using namespace kfr;
+
+#ifndef KFR_NO_MAIN
+int main()
+{
+ println(library_version(), " running on ", cpu_runtime());
+
+ return testo::run_all("", false);
+}
+#endif
diff --git a/tests/unit/base/base.cpp b/tests/unit/base/base.cpp
@@ -0,0 +1,7 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/base.hpp>
diff --git a/tests/unit/base/basic_expressions.cpp b/tests/unit/base/basic_expressions.cpp
@@ -0,0 +1,157 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/base/basic_expressions.hpp>
+#include <kfr/base/simd_expressions.hpp>
+#include <kfr/base/univector.hpp>
+#include <kfr/io/tostring.hpp>
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+TEST(linspace)
+{
+ testo::eplison_scope<> eps(10);
+ CHECK_EXPRESSION(linspace(0.0, 1.0, 5, true, ctrue), { 0.0, 0.25, 0.50, 0.75, 1.0 });
+ CHECK_EXPRESSION(linspace(0.0, 1.0, 4, false, ctrue), { 0.0, 0.25, 0.50, 0.75 });
+ CHECK(get_shape(linspace(0.0, 1.0, 5, true, cfalse)) == shape{ infinite_size });
+ CHECK_EXPRESSION(linspace(0.0, 1.0, 4, false, ctrue), { 0.0, 0.25, 0.50, 0.75 });
+ CHECK_EXPRESSION(symmlinspace(3.0, 4, ctrue), { -3.0, -1.00, 1.00, 3.00 });
+
+ CHECK_EXPRESSION(linspace(1, 21, 4, false, ctrue), { 1, 6, 11, 16 });
+ CHECK_EXPRESSION(linspace(1, 21, 4, true, ctrue), { 1, 7.66666667f, 14.3333333f, 21 });
+}
+
+TEST(counter_shape)
+{
+ CHECK(get_shape(1) == shape{});
+ CHECK(get_shape(counter()) == shape{ infinite_size });
+ CHECK(get_shape(counter() + 1) == shape{ infinite_size });
+ CHECK(get_shape(counter(0, 1, 1)) == shape{ infinite_size, infinite_size });
+}
+
+TEST(pack)
+{
+ static_assert(std::is_same_v<vec<f32x2, 1>, std::invoke_result_t<fn::reverse, vec<f32x2, 1>>>);
+ const univector<float, 21> v1 = 1 + counter();
+ const univector<float, 21> v2 = v1 * 11;
+
+ CHECK_EXPRESSION(pack(v1, v2), 21, [](float i) { return f32x2{ 1 + i, (1 + i) * 11 }; });
+
+ CHECK_EXPRESSION(bind_expression(fn::reverse(), pack(v1, v2)), 21,
+ [](float i) {
+ return f32x2{ (1 + i) * 11, 1 + i };
+ });
+}
+
+TEST(adjacent)
+{
+ CHECK_EXPRESSION(adjacent(fn::mul(), counter()), infinite_size,
+ [](size_t i) { return i > 0 ? i * (i - 1) : 0; });
+}
+
+TEST(dimensions)
+{
+ static_assert(expression_dims<decltype(scalar(0))> == 0);
+ static_assert(expression_dims<decltype(dimensions<1>(scalar(0)))> == 1);
+
+ static_assert(get_shape<decltype(scalar(0))>() == shape{});
+ static_assert(get_shape<decltype(dimensions<1>(scalar(0)))>() == shape{ infinite_size });
+ static_assert(get_shape<decltype(dimensions<2>(dimensions<1>(scalar(0))))>() ==
+ shape{ infinite_size, infinite_size });
+ CHECK_EXPRESSION(truncate(dimensions<1>(scalar(1)), 10), { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
+}
+
+TEST(padded)
+{
+ static_assert(is_infinite<decltype(padded(counter()))>, "");
+ static_assert(is_infinite<decltype(padded(truncate(counter(), 100)))>, "");
+
+ CHECK_EXPRESSION(padded(truncate(counter(), 6), -1), infinite_size,
+ [](size_t i) { return i >= 6 ? -1 : i; });
+
+ CHECK_EXPRESSION(padded(truncate(counter(), 0), -1), infinite_size, [](size_t i) { return -1; });
+
+ CHECK_EXPRESSION(padded(truncate(counter(), 501), -1), infinite_size,
+ [](size_t i) { return i >= 501 ? -1 : i; });
+}
+
+TEST(concatenate)
+{
+ CHECK_EXPRESSION(concatenate(truncate(counter(5, 0), 5), truncate(counter(10, 0), 5)),
+ { 5, 5, 5, 5, 5, 10, 10, 10, 10, 10 });
+}
+
+TEST(rebind)
+{
+ auto c_minus_two = counter() - 2;
+ auto four_minus_c = rebind(c_minus_two, 4, counter());
+ CHECK_EXPRESSION(counter(), infinite_size, [](size_t i) { return i; });
+ CHECK_EXPRESSION(c_minus_two, infinite_size, [](size_t i) { return i - 2; });
+ CHECK_EXPRESSION(four_minus_c, infinite_size, [](size_t i) { return 4 - i; });
+}
+
+TEST(test_arg_access)
+{
+ univector<float> v1(10);
+ v1 = counter();
+ auto e1 = std::move(v1) + 10;
+ std::get<0>(e1.args)[0] = 100;
+ std::get<1>(e1.args) = 1;
+
+ CHECK_EXPRESSION(e1, 10, [](size_t i) { return (i == 0 ? 100 : i) + 1; });
+}
+
+TEST(size_calc)
+{
+ auto a = counter();
+ CHECK(get_shape(a) == shape{ infinite_size });
+ auto b = slice(counter(), 100);
+ CHECK(get_shape(b) == shape{ infinite_size });
+ auto c = slice(counter(), 100, 1000);
+ CHECK(get_shape(c) == shape{ 1000 });
+ auto d = slice(c, 100);
+ CHECK(get_shape(d) == shape{ 900 });
+}
+
+TEST(reverse_expression)
+{
+ CHECK_EXPRESSION(reverse(truncate(counter(), 21)), 21, [](size_t i) { return 20 - i; });
+}
+
+TEST(sequence)
+{
+ CHECK_EXPRESSION(sequence(0, 0.5f, 1, 0.5f), infinite_size,
+ [](size_t i) {
+ return std::array<float, 4>{ 0, 0.5f, 1, 0.5f }[i % 4];
+ });
+}
+
+TEST(assign_expression)
+{
+ univector<float> f = truncate(counter(0, 1), 10);
+ f *= 10;
+ CHECK_EXPRESSION(f, { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 });
+
+ univector<float> a = truncate(counter(0, 1), 10);
+ univector<float> b = truncate(counter(100, 1), 10);
+ pack(a, b) *= broadcast<2>(10.f);
+ CHECK_EXPRESSION(a, { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 });
+ CHECK_EXPRESSION(b, { 1000, 1010, 1020, 1030, 1040, 1050, 1060, 1070, 1080, 1090 });
+
+ static_assert(std::is_same_v<std::common_type_t<f32x2x2, f32x2x2>, f32x2x2>);
+ static_assert(
+ std::is_same_v<std::common_type_t<vec<vec<double, 2>, 1>, vec<double, 2>>, vec<vec<double, 2>, 1>>);
+}
+
+TEST(trace) { render(trace(counter()), 44); }
+
+TEST(get_element) { CHECK(get_element(counter(0, 1, 10, 100), { 1, 2, 3 }) == 321); }
+
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/tests/unit/base/conversion.cpp b/tests/unit/base/conversion.cpp
@@ -7,6 +7,7 @@
#include <kfr/base/conversion.hpp>
#include <kfr/base/basic_expressions.hpp>
+#include <kfr/base/simd_expressions.hpp>
#include <kfr/base/reduce.hpp>
diff --git a/tests/unit/base/generators.cpp b/tests/unit/base/generators.cpp
@@ -0,0 +1,33 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/base/basic_expressions.hpp>
+#include <kfr/base/generators.hpp>
+#include <kfr/base/math_expressions.hpp>
+#include <kfr/base/reduce.hpp>
+#include <kfr/base/simd_expressions.hpp>
+#include <kfr/base/univector.hpp>
+
+using namespace kfr;
+
+namespace CMT_ARCH_NAME
+{
+
+TEST(test_gen_expj)
+{
+ univector<cbase> v = truncate(gen_expj(0.f, constants<float>::pi_s(2) * 0.1f), 1000);
+ CHECK(rms(cabs(
+ v.slice(990) -
+ univector<cbase>({ cbase(1., +0.00000000e+00), cbase(0.80901699, +5.87785252e-01),
+ cbase(0.30901699, +9.51056516e-01), cbase(-0.30901699, +9.51056516e-01),
+ cbase(-0.80901699, +5.87785252e-01), cbase(-1., +1.22464680e-16),
+ cbase(-0.80901699, -5.87785252e-01), cbase(-0.30901699, -9.51056516e-01),
+ cbase(0.30901699, -9.51056516e-01), cbase(0.80901699, -5.87785252e-01) }))) <
+ 0.00006); // error here depends on vector width
+ // In most cases error is much lower (less than 0.00001)
+}
+
+} // namespace CMT_ARCH_NAME
diff --git a/tests/unit/base/handle.cpp b/tests/unit/base/handle.cpp
@@ -0,0 +1,57 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/base/generators.hpp>
+#include <kfr/base/handle.hpp>
+#include <kfr/base/simd_expressions.hpp>
+#include <kfr/base/univector.hpp>
+#include <kfr/io/tostring.hpp>
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+TEST(to_handle)
+{
+ auto e1 = to_handle(counter<float>());
+
+ CHECK_EXPRESSION(e1, infinite_size, [](size_t i) { return static_cast<float>(i); });
+
+ auto e2 = to_handle(gen_linear(0.f, 1.f));
+
+ CHECK_EXPRESSION(e2, infinite_size, [](size_t i) { return static_cast<float>(i); });
+}
+
+TEST(test_arg_replace)
+{
+ univector<float, 10> v1 = counter();
+ univector<float, 10> v2 = -counter();
+ auto e1 = to_handle(v1) * 10;
+ std::get<0>(e1.args) = to_handle(v2);
+
+ CHECK_EXPRESSION(e1, 10, [](size_t i) { return i * -10.0; });
+}
+
+TEST(placeholders)
+{
+ auto expr1 = placeholder<float>();
+ CHECK_EXPRESSION(expr1, infinite_size, [](size_t) { return 0.f; });
+ auto expr2 = 100 * placeholder<float>();
+ CHECK_EXPRESSION(expr2, infinite_size, [](size_t) { return 0.f; });
+ substitute(expr2, to_handle(counter<float>()));
+ CHECK_EXPRESSION(expr2, infinite_size, [](size_t i) { return 100.f * i; });
+}
+
+TEST(placeholders_handle)
+{
+ expression_handle<float> expr = to_handle(10 * placeholder<float>());
+ CHECK_EXPRESSION(expr, infinite_size, [](size_t) { return 0.f; });
+ substitute(expr, to_handle(counter<float>()));
+ CHECK_EXPRESSION(expr, infinite_size, [](size_t i) { return 10.f * i; });
+}
+
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/tests/unit/base/random.cpp b/tests/unit/base/random.cpp
@@ -14,15 +14,15 @@ inline namespace CMT_ARCH_NAME
{
template <typename T, size_t N>
-static void test_random(kfr::random_bit_generator& gen, const vec<T, N>& value)
+static void test_random(random_state& state, const vec<T, N>& value)
{
- const vec<T, N> r = kfr::random_uniform<T, N>(gen);
+ const vec<T, N> r = kfr::random_uniform<T, N>(state);
CHECK(r == value);
}
TEST(random_bit_generator)
{
- kfr::random_bit_generator gen(1, 2, 3, 4);
+ random_state gen = random_init(1, 2, 3, 4);
test_random(gen, pack<u8>(21, 62, 88, 30, 46, 234, 205, 29, 41, 190, 212, 81, 217, 135, 218, 227));
test_random(gen, pack<u16>(48589, 33814, 55928, 14799, 26904, 18521, 20808, 50888));
test_random(gen, pack<u32>(1554764222, 1538765785, 2072590063, 2837641155));
@@ -66,11 +66,35 @@ TEST(random_bit_generator)
TEST(gen_random_range)
{
- random_bit_generator gen(1, 2, 3, 4);
- univector<fbase, 1000> v = kfr::gen_random_range<fbase>(std::ref(gen), -1.0, 1.0);
- CHECK(kfr::minof(v) >= fbase(-1.0));
- CHECK(kfr::maxof(v) <= fbase(1.0));
- println(kfr::mean(v));
+ random_state gen = random_init(1, 2, 3, 4);
+ univector<fbase, 1000> v = gen_random_range<fbase>(std::ref(gen), -1.0, 1.0);
+ CHECK(minof(v) >= fbase(-1.0));
+ CHECK(maxof(v) <= fbase(1.0));
+ // println(mean(v));
+}
+
+TEST(random_normal)
+{
+ random_state gen = random_init(1, 2, 3, 4);
+ vec<fbase, 12> r = random_normal<12, fbase>(gen, 0.0, 1.0);
+ println(r);
+ r = random_normal<12, fbase>(gen, 0.0, 1.0);
+ vec<fbase, 11> r2 = random_normal<11, fbase>(gen, 0.0, 1.0);
+ println(r2);
+
+ expression_histogram h = histogram_expression<20>(gen_random_normal<double>(std::ref(gen)) * 0.15 + 0.5);
+ sink(truncate(h, 1000));
+ println(h.data.below());
+ println(h.data.values());
+ println(h.data.above());
+ sink(truncate(h, 10000));
+ println(h.data.below());
+ println(h.data.values());
+ println(h.data.above());
+ auto hh = histogram(truncate(h, 100000), 20);
+ println(hh.below());
+ println(hh.values());
+ println(hh.above());
}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/tests/unit/base/reduce.cpp b/tests/unit/base/reduce.cpp
@@ -5,6 +5,8 @@
*/
#include <kfr/base/reduce.hpp>
+#include <kfr/base/simd_expressions.hpp>
+#include <kfr/base/univector.hpp>
namespace kfr
{
@@ -50,5 +52,12 @@ TEST(reduce)
CHECK(product(a) == -1080);
}
}
+
+TEST(dotproduct)
+{
+ univector<float, 177> v1 = counter();
+ univector<float, 177> v2 = counter() * 2 + 10;
+ CHECK(dotproduct(v1, v2) == 3821312);
+}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/tests/unit/base/shape.cpp b/tests/unit/base/shape.cpp
@@ -0,0 +1,76 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/base/shape.hpp>
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+TEST(shape)
+{
+ using internal_generic::increment_indices_return;
+ using internal_generic::null_index;
+ CHECK(size_of_shape(shape{ 4, 3 }) == 12);
+ CHECK(size_of_shape(shape{ 1 }) == 1);
+ CHECK(size_of_shape<1>(1) == 1);
+ shape<1> sh1 = 1;
+ sh1 = 2;
+
+ CHECK(internal_generic::strides_for_shape(shape{ 2, 3, 4 }) == shape{ 12, 4, 1 });
+
+ CHECK(internal_generic::strides_for_shape(shape{ 2, 3, 4 }, 10) == shape{ 120, 40, 10 });
+
+ CHECK(increment_indices_return(shape{ 0, 0, 0 }, shape{ 0, 0, 0 }, shape{ 2, 3, 4 }) == shape{ 0, 0, 1 });
+ CHECK(increment_indices_return(shape{ 0, 0, 3 }, shape{ 0, 0, 0 }, shape{ 2, 3, 4 }) == shape{ 0, 1, 0 });
+ CHECK(increment_indices_return(shape{ 0, 2, 0 }, shape{ 0, 0, 0 }, shape{ 2, 3, 4 }) == shape{ 0, 2, 1 });
+ CHECK(increment_indices_return(shape{ 0, 2, 3 }, shape{ 0, 0, 0 }, shape{ 2, 3, 4 }) == shape{ 1, 0, 0 });
+ CHECK(increment_indices_return(shape{ 1, 2, 3 }, shape{ 0, 0, 0 }, shape{ 2, 3, 4 }) ==
+ shape{ null_index, null_index, null_index });
+
+ CHECK(shape{ 3, 4, 5 }.to_flat(shape{ 0, 0, 0 }) == 0);
+ CHECK(shape{ 3, 4, 5 }.to_flat(shape{ 2, 3, 4 }) == 59);
+
+ CHECK(shape{ 3, 4, 5 }.from_flat(0) == shape{ 0, 0, 0 });
+ CHECK(shape{ 3, 4, 5 }.from_flat(59) == shape{ 2, 3, 4 });
+}
+TEST(shape_broadcast)
+{
+ using internal_generic::can_assign_from;
+ using internal_generic::common_shape;
+ using internal_generic::same_layout;
+
+ CHECK(common_shape(shape{ 1, 5 }, shape{ 5, 1 }) == shape{ 5, 5 });
+ CHECK(common_shape(shape{ 5 }, shape{ 5, 1 }) == shape{ 5, 5 });
+ CHECK(common_shape(shape{ 1, 1, 1 }, shape{ 2, 5, 1 }) == shape{ 2, 5, 1 });
+ CHECK(common_shape(shape{ 1 }, shape{ 2, 5, 7 }) == shape{ 2, 5, 7 });
+
+ CHECK(common_shape(shape{}, shape{ 0 }) == shape{ 0 });
+ CHECK(common_shape(shape{}, shape{ 0, 0 }) == shape{ 0, 0 });
+ CHECK(common_shape(shape{ 0 }, shape{ 0, 0 }) == shape{ 0, 0 });
+
+ CHECK(common_shape<true>(shape{}, shape{ 0 }) == shape{ 0 });
+ CHECK(common_shape<true>(shape{}, shape{ 0, 0 }) == shape{ 0, 0 });
+ CHECK(common_shape<true>(shape{ 0 }, shape{ 0, 0 }) == shape{ 0, 0 });
+
+ CHECK(can_assign_from(shape{ 1, 4 }, shape{ 1, 4 }));
+ CHECK(!can_assign_from(shape{ 1, 4 }, shape{ 4, 1 }));
+ CHECK(can_assign_from(shape{ 1, 4 }, shape{ 1, 1 }));
+ CHECK(can_assign_from(shape{ 1, 4 }, shape{ 1 }));
+ CHECK(can_assign_from(shape{ 1, 4 }, shape{}));
+
+ CHECK(same_layout(shape{ 2, 3, 4 }, shape{ 2, 3, 4 }));
+ CHECK(same_layout(shape{ 1, 2, 3, 4 }, shape{ 2, 3, 4 }));
+ CHECK(same_layout(shape{ 2, 3, 4 }, shape{ 2, 1, 1, 3, 4 }));
+ CHECK(same_layout(shape{ 2, 3, 4 }, shape{ 2, 3, 4, 1 }));
+ CHECK(same_layout(shape{ 2, 1, 3, 4 }, shape{ 1, 2, 3, 4, 1 }));
+
+ CHECK(!same_layout(shape{ 2, 1, 3, 4 }, shape{ 1, 2, 4, 3, 1 }));
+ CHECK(!same_layout(shape{ 2, 1, 3, 4 }, shape{ 1, 2, 4, 3, 0 }));
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/tests/unit/base/std_ambiguities.cpp b/tests/unit/base/std_ambiguities.cpp
@@ -0,0 +1,12 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <type_traits>
+#include <utility>
+
+using namespace std;
+
+#include <kfr/all.hpp>
diff --git a/tests/unit/base/tensor.cpp b/tests/unit/base/tensor.cpp
@@ -0,0 +1,845 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/base/basic_expressions.hpp>
+#include <kfr/base/math_expressions.hpp>
+#include <kfr/base/reduce.hpp>
+#include <kfr/base/simd_expressions.hpp>
+#include <kfr/base/tensor.hpp>
+#include <kfr/io/tostring.hpp>
+#include <kfr/simd.hpp>
+
+CMT_PRAGMA_MSVC(warning(push))
+CMT_PRAGMA_MSVC(warning(disable : 5051))
+
+namespace kfr
+{
+
+inline namespace CMT_ARCH_NAME
+{
+
+TEST(tensor_base)
+{
+ tensor<float, 2> t{ shape{ 20, 40 } };
+ CHECK(t.shape() == shape{ 20, 40 });
+ CHECK(t.strides() == shape{ 40, 1 });
+ CHECK(t.size() == 800);
+ CHECK(t.is_contiguous());
+
+ t(0, 0) = 123;
+ t(1, 1) = 456;
+
+ tensor<float, 2> t2 = t(tstop(10), tstop(10));
+ CHECK(t2.shape() == shape{ 10, 10 });
+ CHECK(t2.strides() == shape{ 40, 1 });
+ CHECK(t2.size() == 100);
+ CHECK(!t2.is_contiguous());
+
+ CHECK(t2(0, 0) == 123);
+ CHECK(t2.data() == t.data());
+ CHECK(t2.finalizer() == t.finalizer());
+
+ tensor<float, 2> t3 = t(tstart(1), tstart(1));
+ CHECK(t3.shape() == shape{ 19, 39 });
+ CHECK(t3.strides() == shape{ 40, 1 });
+ CHECK(t3.size() == 741);
+ CHECK(!t3.is_contiguous());
+
+ CHECK(t3(0, 0) == 456);
+ CHECK(t3.data() == t.data() + 40 + 1);
+ CHECK(t3.finalizer() == t.finalizer());
+}
+
+TEST(tensor_memory)
+{
+ // reference
+ std::vector<float> vector{ 1.23f };
+ tensor<float, 1> t{ vector.data(), shape{ 1 }, nullptr };
+ CHECK(t.shape() == shape{ 1 });
+ CHECK(t(0) == 1.23f);
+
+ // adapt
+ std::vector<float> vector2{ 2.34f };
+ tensor<float, 1> t2 = tensor_from_container(std::move(vector2));
+ CHECK(t2.shape() == shape{ 1 });
+ CHECK(t2(0) == 2.34f);
+
+ struct Container
+ {
+ std::array<double, 1> arr;
+ int* refs;
+ double* data() { return arr.data(); }
+ size_t size() const { return arr.size(); }
+ using value_type = double;
+ Container(std::array<double, 1> arr, int* refs) : arr(arr), refs(refs) {}
+ Container() { ++*refs; }
+ Container(Container&& p) : arr(p.arr), refs(p.refs) { ++*refs; }
+ Container(const Container&) = delete;
+ ~Container() { --*refs; }
+ };
+
+ int refs = 0;
+ Container cont{ { 3.45 }, &refs };
+ {
+ tensor<double, 1> t3 = tensor_from_container(std::move(cont));
+ CHECK(t3.shape() == shape{ 1 });
+ CHECK(t3(0) == 3.45);
+ CHECK(refs == 1);
+ }
+ CHECK(refs == 0);
+}
+
+TEST(tensor_expression)
+{
+ tensor<float, 1> t1{ shape{ 32 }, 0.f };
+ tensor<float, 1> t2{ shape{ 32 }, 100.f };
+ tensor<float, 1> t3{ shape{ 32 }, 0.f };
+
+ t1 = counter();
+
+ CHECK(t1.size() == 32);
+ CHECK(t1(0) == 0.f);
+ CHECK(t1(1) == 1.f);
+ CHECK(t1(31) == 31.f);
+
+ t3 = t1 + t2;
+
+ CHECK(t3.size() == 32);
+ CHECK(t3(0) == 100.f);
+ CHECK(t3(1) == 101.f);
+ CHECK(t3(31) == 131.f);
+
+ tensor<float, 2> t4{ shape{ 6, 6 }, 0.f };
+
+ t4 = 1.f;
+ CHECK(t4(0, 0) == 1.f);
+ CHECK(t4(5, 5) == 1.f);
+ CHECK(minof(t4) == 1);
+ CHECK(maxof(t4) == 1);
+ CHECK(sum(t4) == 36);
+
+ t4(trange(2, 4), trange(2, 4)) = scalar(10);
+
+ CHECK(t4(0, 0) == 1.f);
+ CHECK(t4(1, 1) == 1.f);
+ CHECK(t4(2, 2) == 10.f);
+ CHECK(t4(3, 3) == 10.f);
+ CHECK(t4(5, 5) == 1.f);
+ CHECK(sum(t4) == 72);
+
+ t4(trange(2, 4), trange(2, 4)) = 10 + counter(0, 2, 1);
+
+ CHECK(t4(2, 2) == 10.f);
+ CHECK(t4(2, 3) == 11.f);
+ CHECK(t4(3, 2) == 12.f);
+ CHECK(t4(3, 3) == 13.f);
+ CHECK(sum(t4) == 78);
+}
+
+TEST(tensor_broadcast)
+{
+ tensor<float, 2> t1{ shape{ 1, 5 }, { 1.f, 2.f, 3.f, 4.f, 5.f } };
+ tensor<float, 2> t2{ shape{ 5, 1 }, { 10.f, 20.f, 30.f, 40.f, 50.f } };
+ tensor<float, 1> t4{ shape{ 5 }, { 1.f, 2.f, 3.f, 4.f, 5.f } };
+ tensor<float, 2> tresult{ shape{ 5, 5 }, { 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33,
+ 34, 35, 41, 42, 43, 44, 45, 51, 52, 53, 54, 55 } };
+
+ tensor<float, 2> t3 = t1 + t2;
+
+ CHECK(t3.shape() == shape{ 5, 5 });
+ CHECK(t3 == tresult);
+
+ tensor<float, 2> t5 = t4 + t2;
+ // tensor<float, 2> t5 = t4 + t2;
+ CHECK(t5 == tresult);
+}
+} // namespace CMT_ARCH_NAME
+
+template <typename T, size_t N1>
+struct expression_traits<std::array<T, N1>> : expression_traits_defaults
+{
+ using value_type = T;
+ constexpr static size_t dims = 1;
+
+ constexpr static shape<1> get_shape(const std::array<T, N1>& self) { return shape<1>{ N1 }; }
+ constexpr static shape<1> get_shape() { return shape<1>{ N1 }; }
+};
+
+template <typename T, size_t N1, size_t N2>
+struct expression_traits<std::array<std::array<T, N1>, N2>> : expression_traits_defaults
+{
+ using value_type = T;
+ constexpr static size_t dims = 2;
+
+ constexpr static shape<2> get_shape(const std::array<std::array<T, N1>, N2>& self)
+ {
+ return shape<2>{ N2, N1 };
+ }
+ constexpr static shape<2> get_shape() { return shape<2>{ N2, N1 }; }
+};
+
+inline namespace CMT_ARCH_NAME
+{
+
+template <typename T, size_t N1, index_t Axis, size_t N>
+KFR_INTRINSIC vec<T, N> get_elements(const std::array<T, N1>& CMT_RESTRICT self, const shape<1>& index,
+ const axis_params<Axis, N>&)
+{
+ const T* CMT_RESTRICT const data = self.data();
+ return read<N>(data + index[0]);
+}
+
+template <typename T, size_t N1, index_t Axis, size_t N>
+KFR_INTRINSIC void set_elements(std::array<T, N1>& CMT_RESTRICT self, const shape<1>& index,
+ const axis_params<Axis, N>&, const identity<vec<T, N>>& val)
+{
+ T* CMT_RESTRICT const data = self.data();
+ write(data + index[0], val);
+}
+
+template <typename T, size_t N1, size_t N2, index_t Axis, size_t N>
+KFR_INTRINSIC vec<T, N> get_elements(const std::array<std::array<T, N1>, N2>& CMT_RESTRICT self,
+ const shape<2>& index, const axis_params<Axis, N>&)
+{
+ const T* CMT_RESTRICT const data = self.front().data() + index.front() * N1 + index.back();
+ if constexpr (Axis == 1)
+ {
+ return read<N>(data);
+ }
+ else
+ {
+ return gather_stride<N>(data, N1);
+ }
+}
+
+template <typename T, size_t N1, size_t N2, index_t Axis, size_t N>
+KFR_INTRINSIC void set_elements(std::array<std::array<T, N1>, N2>& CMT_RESTRICT self, const shape<2>& index,
+ const axis_params<Axis, N>&, const identity<vec<T, N>>& val)
+{
+ T* CMT_RESTRICT data = self.front().data() + index.front() * N1 + index.back();
+ if constexpr (Axis == 1)
+ {
+ write(data, val);
+ }
+ else
+ {
+ scatter_stride(data, val, N1);
+ }
+}
+
+TEST(tensor_slice)
+{
+ tensor<double, 3> t1{
+ { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 } },
+ { { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 } },
+ { { 18, 19, 20 }, { 21, 22, 23 }, { 24, 25, 26 } },
+ };
+ CHECK(t1 == trender(truncate(counter(0.0, 9, 3, 1), shape{ 3, 3, 3 })));
+
+ CHECK(trender(slice(t1, shape{ 1, 1, 1 }, shape{ 2, 2, 2 })) ==
+ trender(truncate(counter(13.0, 9, 3, 1), shape{ 2, 2, 2 })));
+}
+
+TEST(scalars)
+{
+ CHECK(trender(scalar(3)) == tensor<int, 0>{});
+ CHECK(trender(scalar(3)).to_string() == "3");
+}
+
+TEST(tensor_lambda)
+{
+ CHECK(trender(lambda<float, 2>([](shape<2> idx) -> float { return 1 + idx[1] + 3 * idx[0]; }),
+ shape{ 3, 3 }) ==
+ tensor<float, 2>{
+ { 1, 2, 3 },
+ { 4, 5, 6 },
+ { 7, 8, 9 },
+ });
+
+ CHECK(trender(truncate(lambda<float, 2>([](shape<2> idx) -> float { return 1 + idx[1] + 3 * idx[0]; }),
+ shape{ 3, 3 })) ==
+ tensor<float, 2>{
+ { 1, 2, 3 },
+ { 4, 5, 6 },
+ { 7, 8, 9 },
+ });
+}
+
+TEST(tensor_expressions2)
+{
+ auto aa = std::array<std::array<double, 2>, 2>{ { { { 1, 2 } }, { { 3, 4 } } } };
+ static_assert(expression_traits<decltype(aa)>::dims == 2);
+ CHECK(expression_traits<decltype(aa)>::get_shape(aa) == shape{ 2, 2 });
+ CHECK(get_elements(aa, { 1, 1 }, axis_params<1, 1>{}) == vec{ 4. });
+ CHECK(get_elements(aa, { 1, 0 }, axis_params<1, 2>{}) == vec{ 3., 4. });
+
+ static_assert(expression_traits<decltype(1234.f)>::dims == 0);
+ CHECK(expression_traits<decltype(1234.f)>::get_shape(1234.f) == shape{});
+ CHECK(get_elements(1234.f, {}, axis_params<0, 3>{}) == vec{ 1234.f, 1234.f, 1234.f });
+
+ process(aa, 123.45f);
+
+ CHECK(aa ==
+ std::array<std::array<double, 2>, 2>{ { { { 123.45f, 123.45f } }, { { 123.45f, 123.45f } } } });
+
+ auto a = std::array<double, 2>{ { -5.f, +5.f } };
+
+ process(aa, a);
+
+ CHECK(aa == std::array<std::array<double, 2>, 2>{ { { { -5., +5. } }, { { -5., +5. } } } });
+}
+
+TEST(tensor_counter)
+{
+ std::array<double, 6> x;
+
+ process(x, counter(0.0, 0.5));
+
+ CHECK(x == std::array<double, 6>{ { 0.0, 0.5, 1.0, 1.5, 2.0, 2.5 } });
+
+ std::array<std::array<double, 4>, 3> y;
+
+ process(y, counter(100.0, 1.0, 10.0));
+
+ CHECK(y == std::array<std::array<double, 4>, 3>{ {
+ { { 100.0, 110.0, 120.0, 130.0 } },
+ { { 101.0, 111.0, 121.0, 131.0 } },
+ { { 102.0, 112.0, 122.0, 132.0 } },
+ } });
+}
+namespace tests
+{
+TEST(tensor_dims)
+{
+ tensor<double, 6> t12{ shape{ 2, 3, 4, 5, 6, 7 } };
+
+ process(t12, counter(0, 1, 10, 100, 1000, 10000, 100000));
+
+ auto t1 = t12(1, 2, 3, tall(), 5, 6);
+ CHECK(render(t1) == univector<double>{ 650321, 651321, 652321, 653321, 654321 });
+
+ CHECK(t12.reduce(std::plus<>{}, 0) == 1648888920);
+}
+} // namespace tests
+
+TEST(vec_from_cvals)
+{
+ CHECK(make_vector(csizes<1, 2, 3, 4>) == make_vector<size_t>(1, 2, 3, 4));
+ CHECK(make_vector(cconcat(cvalseq<index_t, 2, 0, 0>, cvalseq<index_t, 1, 1>,
+ cvalseq<index_t, 2, 0, 0>)) == make_vector<size_t>(0, 0, 1, 0, 0));
+}
+
+TEST(xfunction_test)
+{
+ auto f = expression_function{ expression_with_arguments{ 3.f, 4.f }, std::plus<>{} };
+ float v;
+ process(v, f);
+ CHECK(v == 7.f);
+ static_assert(std::is_same_v<decltype(f), expression_function<std::plus<>, float, float>>);
+
+ auto f2 = expression_function{ expression_with_arguments{ 10.f, std::array{ 1.f, 2.f, 3.f, 4.f, 5.f } },
+ std::plus<>{} };
+ std::array<float, 5> v2;
+ process(v2, f2);
+ CHECK(v2 == std::array{ 11.f, 12.f, 13.f, 14.f, 15.f });
+
+ auto f3 = scalar(10.f) + std::array{ 1.f, 2.f, 3.f, 4.f, 5.f };
+ std::array<float, 5> v3;
+ process(v3, f3);
+ CHECK(v3 == std::array{ 11.f, 12.f, 13.f, 14.f, 15.f });
+
+ auto f4 = scalar(0) +
+ std::array<std::array<float, 1>, 5>{
+ { { { 100.f } }, { { 200.f } }, { { 300.f } }, { { 400.f } }, { { 500.f } } }
+ } +
+ std::array{ 1.f, 2.f, 3.f, 4.f, 5.f };
+ std::array<std::array<float, 5>, 5> v4;
+
+ CHECK(expression_traits<decltype(f4)>::get_shape(f4) == shape{ 5, 5 });
+ process(v4, f4);
+ CHECK(v4 == std::array<std::array<float, 5>, 5>{ { { { 101.f, 102.f, 103.f, 104.f, 105.f } },
+ { { 201.f, 202.f, 203.f, 204.f, 205.f } },
+ { { 301.f, 302.f, 303.f, 304.f, 305.f } },
+ { { 401.f, 402.f, 403.f, 404.f, 405.f } },
+ { { 501.f, 502.f, 503.f, 504.f, 505.f } } } });
+}
+
+TEST(xfunction_test2)
+{
+ CHECK(trender(abs(tensor<float, 2>{ { 1, -2 }, { -1, 3 } })) == tensor<float, 2>{ { 1, 2 }, { 1, 3 } });
+ CHECK(trender(min(tensor<float, 2>{ { 1, -2 }, { -1, 3 } }, tensor<float, 2>{ { 0, 3 }, { 2, 1 } })) ==
+ tensor<float, 2>{ { 0, -2 }, { -1, 1 } });
+}
+
+template <typename Type, index_t Dims>
+KFR_FUNCTION expression_counter<Type, Dims> debug_counter(uint64_t scale = 10)
+{
+ expression_counter<Type, Dims> result;
+ result.start = 0;
+ uint64_t val = 1;
+ for (size_t i = 0; i < Dims; i++)
+ {
+ result.steps[Dims - 1 - i] = val;
+ val *= scale;
+ }
+ return result;
+}
+
+static std::string nl = R"(
+)";
+
+TEST(tensor_tostring)
+{
+ CHECK(as_string(shape{}) == "shape{}");
+ CHECK(as_string(shape{ 1, 2, 3 }) == "shape{1, 2, 3}");
+
+ tensor<f32x2, 1> t0(shape<1>{ 3 });
+ t0(0) = vec{ 1, 2 };
+ t0(1) = vec{ 3, 4 };
+ t0(2) = vec{ -1, 1000 };
+ CHECK(t0.to_string<fmt_t<f32x2, 'f', 0, 2>>() == "{{1, 2}, {3, 4}, {-1, 1000}}");
+
+ tensor<float, 1> t1(shape<1>{ 60 });
+ t1 = debug_counter<float, 1>();
+ CHECK(nl + t1.to_string<fmt_t<float, 'f', 2, 0>>(12, 0) + nl == R"(
+{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59}
+)");
+
+ tensor<float, 2> t2(shape<2>{ 12, 5 });
+ t2 = debug_counter<float, 2>();
+ CHECK(nl + t2.to_string<fmt_t<float, 'f', 3, 0>>(16, 0) + nl == R"(
+{{ 0, 1, 2, 3, 4},
+ { 10, 11, 12, 13, 14},
+ { 20, 21, 22, 23, 24},
+ { 30, 31, 32, 33, 34},
+ { 40, 41, 42, 43, 44},
+ { 50, 51, 52, 53, 54},
+ { 60, 61, 62, 63, 64},
+ { 70, 71, 72, 73, 74},
+ { 80, 81, 82, 83, 84},
+ { 90, 91, 92, 93, 94},
+ {100, 101, 102, 103, 104},
+ {110, 111, 112, 113, 114}}
+)");
+
+ tensor<float, 3> t3(shape<3>{ 3, 4, 5 });
+ t3 = debug_counter<float, 3>();
+ CHECK(nl + t3.to_string<fmt_t<float, 'f', 4, 0>>(16, 0) + nl == R"(
+{{{ 0, 1, 2, 3, 4},
+ { 10, 11, 12, 13, 14},
+ { 20, 21, 22, 23, 24},
+ { 30, 31, 32, 33, 34}},
+ {{ 100, 101, 102, 103, 104},
+ { 110, 111, 112, 113, 114},
+ { 120, 121, 122, 123, 124},
+ { 130, 131, 132, 133, 134}},
+ {{ 200, 201, 202, 203, 204},
+ { 210, 211, 212, 213, 214},
+ { 220, 221, 222, 223, 224},
+ { 230, 231, 232, 233, 234}}}
+)");
+
+ tensor<float, 4> t4(shape<4>{ 3, 2, 2, 5 });
+ t4 = debug_counter<float, 4>();
+ CHECK(nl + t4.to_string<fmt_t<float, 'f', 5, 0>>(16, 0) + nl == R"(
+{{{{ 0, 1, 2, 3, 4},
+ { 10, 11, 12, 13, 14}},
+ {{ 100, 101, 102, 103, 104},
+ { 110, 111, 112, 113, 114}}},
+ {{{ 1000, 1001, 1002, 1003, 1004},
+ { 1010, 1011, 1012, 1013, 1014}},
+ {{ 1100, 1101, 1102, 1103, 1104},
+ { 1110, 1111, 1112, 1113, 1114}}},
+ {{{ 2000, 2001, 2002, 2003, 2004},
+ { 2010, 2011, 2012, 2013, 2014}},
+ {{ 2100, 2101, 2102, 2103, 2104},
+ { 2110, 2111, 2112, 2113, 2114}}}}
+)");
+
+ tensor<float, 2> t5(shape<2>{ 10, 1 });
+ t5 = debug_counter<float, 2>();
+ CHECK(nl + t5.to_string<fmt_t<float, 'f', -1, 0>>(12, 1) + nl == R"(
+{{0}, {10}, {20}, {30}, {40}, {50}, {60}, {70}, {80}, {90}}
+)");
+}
+
+template <typename T, index_t dims1, index_t dims2>
+static void test_reshape_body(const tensor<T, dims1>& t1, const tensor<T, dims2>& t2)
+{
+ CHECK(t1.reshape_may_copy(t2.shape(), true) == t2);
+
+ cforeach(csizeseq<dims2>,
+ [&](auto x)
+ {
+ constexpr index_t axis = val_of(decltype(x)());
+ ::testo::scope s(
+ as_string("axis = ", axis, " shape = (", t1.shape(), ") -> (", t2.shape(), ")"));
+ CHECK(trender<1, axis>(reshape(t1, t2.shape())) == t2);
+ CHECK(trender<2, axis>(reshape(t1, t2.shape())) == t2);
+ CHECK(trender<4, axis>(reshape(t1, t2.shape())) == t2);
+ CHECK(trender<8, axis>(reshape(t1, t2.shape())) == t2);
+ });
+}
+
+static void test_reshape() {}
+
+template <typename T, index_t dims1, index_t... dims>
+static void test_reshape(const tensor<T, dims1>& t1, const tensor<T, dims>&... ts)
+{
+ cforeach(std::make_tuple((&ts)...),
+ [&](auto t2)
+ {
+ test_reshape_body(t1, *t2);
+ test_reshape_body(*t2, t1);
+ });
+
+ test_reshape(ts...);
+}
+
+TEST(expression_reshape)
+{
+ std::array<float, 12> x;
+ process(reshape(x, shape{ 3, 4 }), expression_counter<float, 2>{ 0, { 10, 1 } });
+ CHECK(x == std::array<float, 12>{ { 0, 1, 2, 3, 10, 11, 12, 13, 20, 21, 22, 23 } });
+
+ test_reshape(tensor<float, 1>{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }, //
+ tensor<float, 2>{ { 0, 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10, 11 } },
+ tensor<float, 2>{ { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 8, 9, 10, 11 } },
+ tensor<float, 2>{ { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 } },
+ tensor<float, 2>{ { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 }, { 8, 9 }, { 10, 11 } },
+ tensor<float, 2>{
+ { 0 }, { 1 }, { 2 }, { 3 }, { 4 }, { 5 }, { 6 }, { 7 }, { 8 }, { 9 }, { 10 }, { 11 } });
+
+ test_reshape(tensor<float, 1>{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }, //
+ tensor<float, 3>{ { { 0, 1 }, { 2, 3 }, { 4, 5 } }, { { 6, 7 }, { 8, 9 }, { 10, 11 } } },
+ tensor<float, 4>{ { { { 0 }, { 1 } }, { { 2 }, { 3 } }, { { 4 }, { 5 } } },
+ { { { 6 }, { 7 } }, { { 8 }, { 9 } }, { { 10 }, { 11 } } } });
+
+ test_reshape(
+ tensor<float, 1>{
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }, //
+ tensor<float, 3>{ { { 0, 1 }, { 2, 3 }, { 4, 5 } },
+ { { 6, 7 }, { 8, 9 }, { 10, 11 } },
+ { { 12, 13 }, { 14, 15 }, { 16, 17 } },
+ { { 18, 19 }, { 20, 21 }, { 22, 23 } } },
+ tensor<float, 4>{
+ { { { 0, 1 }, { 2, 3 } }, { { 4, 5 }, { 6, 7 } }, { { 8, 9 }, { 10, 11 } } },
+ { { { 12, 13 }, { 14, 15 } }, { { 16, 17 }, { 18, 19 } }, { { 20, 21 }, { 22, 23 } } } });
+}
+
+} // namespace CMT_ARCH_NAME
+
+#if 0
+shape<4> sh{ 2, 3, 4, 5 };
+
+extern "C" __declspec(dllexport) bool assembly_test1(shape<4>& x)
+{
+ return kfr::internal_generic::increment_indices(x, shape<4>(0), sh);
+}
+
+extern "C" __declspec(dllexport) bool assembly_test2(std::array<std::array<double, 2>, 2>& aa,
+ std::array<double, 2>& a)
+{
+ return process(aa, a).front() > 0;
+}
+
+extern "C" __declspec(dllexport) bool assembly_test3(std::array<double, 16>& x)
+{
+ return process(x, 0.5).front() > 0;
+}
+
+extern "C" __declspec(dllexport) bool assembly_test4(std::array<double, 16>& x)
+{
+ return process(x, counter(1000.0, 1.0)).front() > 0;
+}
+
+extern "C" __declspec(dllexport) bool assembly_test5(const tensor<double, 3>& x)
+{
+ return process(x, counter(1000.0, 1.0, 2.0, 3.0)).front() > 0;
+}
+
+extern "C" __declspec(dllexport) bool assembly_test6(const tensor<double, 2>& x)
+{
+ return process(x, counter(1000.0, 1.0, 2.0)).front() > 0;
+}
+
+extern "C" __declspec(dllexport) bool assembly_test7(const tensor<double, 2>& x)
+{
+ return process(x, 12345.).front() > 0;
+}
+
+extern "C" __declspec(dllexport) index_t assembly_test8_2(const shape<2>& x, const shape<2>& y)
+{
+ return x.dot(y);
+}
+
+extern "C" __declspec(dllexport) index_t assembly_test8_4(const shape<4>& x, const shape<4>& y)
+{
+ return x.dot(y);
+}
+
+extern "C" __declspec(dllexport) void assembly_test9(int64_t* dst, size_t stride)
+{
+ scatter_stride(dst, enumerate(vec_shape<int64_t, 8>()), stride);
+}
+constexpr inline index_t rank = 1;
+extern "C" __declspec(dllexport) void assembly_test10(tensor<double, rank>& t12,
+ const expression_counter<double, rank>& ctr)
+{
+ process(t12, ctr);
+}
+extern "C" __declspec(dllexport) void assembly_test11(f64x2& x, u64x2 y) { x = y; }
+
+extern "C" __declspec(dllexport) void assembly_test12(
+ std::array<std::array<uint32_t, 4>, 4>& x,
+ const expression_function<std::plus<>, std::array<std::array<uint32_t, 1>, 4>&,
+ std::array<std::array<uint32_t, 4>, 1>&>& y)
+{
+ process(x, y);
+}
+
+extern "C" __declspec(dllexport) void assembly_test13(const tensor<float, 1>& x, const tensor<float, 1>& y)
+{
+ process(x, y * 0.5f);
+}
+
+template <typename T, size_t N1, size_t N2>
+using array2d = std::array<std::array<T, N2>, N1>;
+
+extern "C" __declspec(dllexport) void assembly_test14(std::array<float, 32>& x,
+ const std::array<float, 32>& y)
+{
+ process(x, reverse(y));
+}
+
+extern "C" __declspec(dllexport) void assembly_test15(array2d<float, 32, 32>& x,
+ const array2d<float, 32, 32>& y)
+{
+ process(x, reverse(y));
+}
+
+extern "C" __declspec(dllexport) void assembly_test16a(array2d<double, 8, 2>& x,
+ const array2d<double, 8, 2>& y)
+{
+ process<8, 0>(x, y * y);
+}
+extern "C" __declspec(dllexport) void assembly_test16b(array2d<double, 8, 2>& x,
+ const array2d<double, 8, 2>& y)
+{
+ process<2, 1>(x, y * y);
+}
+
+extern "C" __declspec(dllexport) void assembly_test17a(const tensor<double, 2>& x, const tensor<double, 2>& y)
+{
+ expression_function ysqr = expression_function{ expression_with_arguments{ y }, fn::sqr{} };
+ process<8, 0>(x, ysqr);
+}
+extern "C" __declspec(dllexport) void assembly_test17b(const tensor<double, 2>& x, const tensor<double, 2>& y)
+{
+ expression_function ysqr = expression_function{ expression_with_arguments{ y }, fn::sqr{} };
+ process<2, 1>(x, ysqr);
+}
+
+extern "C" __declspec(dllexport) void assembly_test18a(const tensor<double, 2>& x, const tensor<double, 2>& y)
+{
+ expression_function ysqr = expression_function{ expression_with_arguments{ y }, fn::sqr{} };
+ process<8, 0>(fixshape(x, fixed_shape<8, 2>), fixshape(ysqr, fixed_shape<8, 2>));
+}
+extern "C" __declspec(dllexport) void assembly_test18b(const tensor<double, 2>& x, const tensor<double, 2>& y)
+{
+ expression_function ysqr = expression_function{ expression_with_arguments{ y }, fn::sqr{} };
+ process<2, 1>(fixshape(x, fixed_shape<8, 2>), fixshape(ysqr, fixed_shape<8, 2>));
+}
+
+extern "C" __declspec(dllexport) void assembly_test19(const tensor<double, 2>& x,
+ const expression_reshape<tensor<double, 2>, 2>& y)
+{
+ process(x, y);
+}
+
+extern "C" __declspec(dllexport) shape<2> assembly_test20_2(const shape<2>& x, size_t fl)
+{
+ return x.from_flat(fl);
+}
+extern "C" __declspec(dllexport) shape<4> assembly_test20_4(const shape<4>& x, size_t fl)
+{
+ return x.from_flat(fl);
+}
+
+extern "C" __declspec(dllexport) shape<4> assembly_test21(const shape<4>& x, size_t fl)
+{
+ return x.from_flat(fl);
+}
+extern "C" __declspec(dllexport) float assembly_test22(const std::array<float, 440>& x,
+ const std::array<float, 440>& y)
+{
+ return dotproduct(x, y);
+}
+extern "C" __declspec(dllexport) float assembly_test23(const std::array<float, 440>& x) { return rms(x); }
+#endif
+
+struct val
+{
+};
+template <>
+struct expression_traits<val> : expression_traits_defaults
+{
+ using value_type = float;
+ constexpr static size_t dims = 0;
+ constexpr static shape<dims> get_shape(const val&) { return {}; }
+ constexpr static shape<dims> get_shape() { return {}; }
+};
+
+inline namespace CMT_ARCH_NAME
+{
+val rvint_func() { return val{}; }
+val& lvint_func()
+{
+ static val v;
+ return v;
+}
+TEST(expression_with_arguments)
+{
+ expression_function fn1 = expression_function{ expression_with_arguments{ rvint_func() }, fn::add{} };
+ static_assert(std::is_same_v<decltype(fn1)::nth<0>, val>);
+
+ expression_function fn2 = expression_function{ expression_with_arguments{ lvint_func() }, fn::add{} };
+ static_assert(std::is_same_v<decltype(fn2)::nth<0>, val&>);
+
+ expression_function fn3 =
+ expression_function{ expression_with_arguments{ std::as_const(lvint_func()) }, fn::add{} };
+ static_assert(std::is_same_v<decltype(fn3)::nth<0>, const val&>);
+}
+
+TEST(slices)
+{
+ const auto _ = std::nullopt;
+ tensor<float, 1> t1{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+ CHECK(t1(tstart(3)) == tensor<float, 1>{ 3, 4, 5, 6, 7, 8, 9 });
+ CHECK(t1(tstop(3)) == tensor<float, 1>{ 0, 1, 2 });
+ CHECK(t1(trange(3, 7)) == tensor<float, 1>{ 3, 4, 5, 6 });
+
+ CHECK(t1(tstart(10)) == tensor<float, 1>{});
+ CHECK(t1(tstop(0)) == tensor<float, 1>{});
+ CHECK(t1(trange(7, 3)) == tensor<float, 1>{});
+
+ CHECK(t1(tstart(-2)) == tensor<float, 1>{ 8, 9 });
+ CHECK(t1(trange(-7, -4)) == tensor<float, 1>{ 3, 4, 5 });
+ CHECK(t1(tall()) == tensor<float, 1>{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });
+
+ CHECK(t1(trange(3, _)) == tensor<float, 1>{ 3, 4, 5, 6, 7, 8, 9 });
+ CHECK(t1(trange(_, 7)) == tensor<float, 1>{ 0, 1, 2, 3, 4, 5, 6 });
+
+ CHECK(t1(trange(_, _, 2)) == tensor<float, 1>{ 0, 2, 4, 6, 8 });
+ CHECK(t1(trange(_, _, 5)) == tensor<float, 1>{ 0, 5 });
+ CHECK(t1(trange(_, _, 12)) == tensor<float, 1>{ 0 });
+ CHECK(t1(trange(1, _, 2)) == tensor<float, 1>{ 1, 3, 5, 7, 9 });
+ CHECK(t1(trange(1, _, 5)) == tensor<float, 1>{ 1, 6 });
+ CHECK(t1(trange(1, _, 12)) == tensor<float, 1>{ 1 });
+
+ CHECK(t1(tstep(2))(tstep(2)) == tensor<float, 1>{ 0, 4, 8 });
+ CHECK(t1(tstep(2))(tstep(2))(tstep(2)) == tensor<float, 1>{ 0, 8 });
+ CHECK(t1(tstep(2))(tstep(3)) == tensor<float, 1>{ 0, 6 });
+
+ CHECK(t1(trange(_, _, -1)) == tensor<float, 1>{ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 });
+ CHECK(t1(trange(5, _, -1)) == tensor<float, 1>{ 5, 4, 3, 2, 1, 0 });
+ CHECK(t1(trange(1, 0, -1)) == tensor<float, 1>{ 1 });
+
+ CHECK(t1(trange(3, 3 + 12, 0)) == tensor<float, 1>{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 });
+}
+
+TEST(complex_tensors)
+{
+ tensor<complex<float>, 1> t1{
+ complex<float>(0, -1),
+ };
+ CHECK(trender(expression_function{ expression_with_arguments{ t1, complex<float>(0, 1) }, fn::mul{} }) ==
+ tensor<complex<float>, 1>{ complex<float>(1, 0) });
+ CHECK(trender(expression_function{ expression_with_arguments{ t1, complex<float>(1, 0) }, fn::mul{} }) ==
+ tensor<complex<float>, 1>{ complex<float>(0, -1) });
+ CHECK(trender(expression_function{ expression_with_arguments{ t1, complex<float>(0, -1) }, fn::mul{} }) ==
+ tensor<complex<float>, 1>{ complex<float>(-1, 0) });
+ CHECK(trender(expression_function{ expression_with_arguments{ t1, complex<float>(-1, 0) }, fn::mul{} }) ==
+ tensor<complex<float>, 1>{ complex<float>(0, 1) });
+}
+
+TEST(from_ilist)
+{
+ tensor<float, 1> t1{ 10, 20, 30, 40 };
+ CHECK(t1 == tensor<float, 1>(shape{ 4 }, { 10, 20, 30, 40 }));
+
+ tensor<float, 2> t2{ { 10, 20 }, { 30, 40 } };
+ CHECK(t2 == tensor<float, 2>(shape{ 2, 2 }, { 10, 20, 30, 40 }));
+
+ tensor<float, 2> t3{ { 10, 20 } };
+ CHECK(t3 == tensor<float, 2>(shape{ 1, 2 }, { 10, 20 }));
+
+ tensor<float, 3> t4{ { { 10, 20 }, { 30, 40 } }, { { 50, 60 }, { 70, 80 } } };
+ CHECK(t4 == tensor<float, 3>(shape{ 2, 2, 2 }, { 10, 20, 30, 40, 50, 60, 70, 80 }));
+}
+
+TEST(sharing_data)
+{
+ tensor<int, 2> t{ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
+ auto t2 = t; // share data
+ t2(0, 0) = 10;
+ CHECK(t == tensor<int, 2>{ { 10, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } });
+ auto t3 = t(0, tall());
+ CHECK(t3 == tensor<int, 1>{ 10, 2, 3 });
+ t3 *= 10;
+ CHECK(t3 == tensor<int, 1>{ 100, 20, 30 });
+ CHECK(t == tensor<int, 2>{ { 100, 20, 30 }, { 4, 5, 6 }, { 7, 8, 9 } });
+ t(trange(0, 2), trange(0, 2)) = 0;
+ CHECK(t == tensor<int, 2>{ { 0, 0, 30 }, { 0, 0, 6 }, { 7, 8, 9 } });
+}
+
+TEST(tensor_from_container)
+{
+ std::vector<int> a{ 1, 2, 3 };
+ auto t = tensor_from_container(a);
+ CHECK(t.shape() == shape{ 3 });
+ CHECK(t == tensor<int, 1>{ 1, 2, 3 });
+}
+
+} // namespace CMT_ARCH_NAME
+
+template <typename T, index_t Size>
+struct identity_matrix
+{
+};
+
+template <typename T, index_t Size>
+struct expression_traits<identity_matrix<T, Size>> : expression_traits_defaults
+{
+ using value_type = T;
+ constexpr static size_t dims = 2;
+ constexpr static shape<2> get_shape(const identity_matrix<T, Size>& self) { return { Size, Size }; }
+ constexpr static shape<2> get_shape() { return { Size, Size }; }
+};
+
+template <typename T, index_t Size, index_t Axis, size_t N>
+vec<T, N> get_elements(const identity_matrix<T, Size>& self, const shape<2>& index,
+ const axis_params<Axis, N>& sh)
+{
+ return select(indices<0>(index, sh) == indices<1>(index, sh), 1, 0);
+}
+
+inline namespace CMT_ARCH_NAME
+{
+
+TEST(identity_matrix)
+{
+ CHECK(trender(identity_matrix<float, 3>{}) == tensor<float, 2>{ { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } });
+}
+
+} // namespace CMT_ARCH_NAME
+
+} // namespace kfr
+CMT_PRAGMA_MSVC(warning(pop))
diff --git a/tests/unit/dsp/biquad.cpp b/tests/unit/dsp/biquad.cpp
@@ -0,0 +1,113 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/base/reduce.hpp>
+#include <kfr/base/simd_expressions.hpp>
+#include <kfr/base/univector.hpp>
+#include <kfr/dsp/biquad.hpp>
+#include <kfr/dsp/biquad_design.hpp>
+#include <kfr/dsp/special.hpp>
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+template <typename T, typename... Ts, univector_tag Tag>
+inline const univector<T, Tag>& choose_array(const univector<T, Tag>& array, const univector<Ts, Tag>&...)
+{
+ return array;
+}
+
+template <typename T, typename T2, typename... Ts, univector_tag Tag, KFR_ENABLE_IF(!std::is_same_v<T, T2>)>
+inline const univector<T, Tag>& choose_array(const univector<T2, Tag>&, const univector<Ts, Tag>&... arrays)
+{
+ return choose_array<T>(arrays...);
+}
+
+TEST(biquad_lowpass1)
+{
+ testo::matrix(named("type") = ctypes_t<float, double>{},
+ [](auto type)
+ {
+ using T = typename decltype(type)::type;
+
+ const biquad_params<T> bq = biquad_lowpass<T>(0.1, 0.7);
+
+ constexpr size_t size = 32;
+
+ const univector<float, size> test_vector_f32{
+ +0x8.9bce2p-7, +0xd.8383ep-6, +0x8.f908dp-5, +0xe.edc21p-6, +0x9.ae104p-6,
+ +0x9.dcc24p-7, +0xd.50584p-9, -0xf.2668p-13, -0xd.09ca1p-10, -0xe.15995p-10,
+ -0xa.b90d2p-10, -0xc.edea4p-11, -0xb.f14eap-12, -0xc.2cb44p-14, +0xb.4a4dep-15,
+ +0xb.685dap-14, +0xa.b181fp-14, +0xf.0cb2bp-15, +0x8.695d6p-15, +0xd.bedd4p-17,
+ +0xf.5474p-20, -0xd.bb266p-19, -0x9.63ca1p-18, -0xf.ca567p-19, -0xa.5231p-19,
+ -0xa.9e934p-20, -0xe.ab52p-22, +0xa.3c4cp-26, +0xd.721ffp-23, +0xe.ccc1ap-23,
+ +0xb.5f248p-23, +0xd.d2c9ap-24,
+ };
+
+ const univector<double, size> test_vector_f64{
+ +0x8.9bce2bf3663e8p-7, +0xd.8384010fdf1dp-6, +0x8.f908e7a36df6p-5,
+ +0xe.edc2332a6d0bp-6, +0x9.ae104af1da9ap-6, +0x9.dcc235ef68e7p-7,
+ +0xd.5057ee425e05p-9, -0xf.266e42a99aep-13, -0xd.09cad73642208p-10,
+ -0xe.1599f32a83dp-10, -0xa.b90d8910a117p-10, -0xc.edeaabb890948p-11,
+ -0xb.f14edbb55383p-12, -0xc.2cb39b86f2dap-14, +0xb.4a506ecff055p-15,
+ +0xb.685edfdb55358p-14, +0xa.b182e32f8e298p-14, +0xf.0cb3dfd894b2p-15,
+ +0x8.695df725b4438p-15, +0xd.beddc3606b9p-17, +0xf.547004d20874p-20,
+ -0xd.bb29b25b49b6p-19, -0x9.63cb9187da1dp-18, -0xf.ca588634fc618p-19,
+ -0xa.52322d320da78p-19, -0xa.9e9420154e4p-20, -0xe.ab51f7b0335ap-22,
+ +0xa.3c6479980e1p-26, +0xd.7223836599fp-23, +0xe.ccc47ddd18678p-23,
+ +0xb.5f265b1be1728p-23, +0xd.d2cb83f8483f8p-24,
+ };
+
+ const univector<T, size> ir = biquad(bq, unitimpulse<T>());
+
+ CHECK(absmaxof(choose_array<T>(test_vector_f32, test_vector_f64) - ir) == 0);
+ });
+}
+
+TEST(biquad_lowpass2)
+{
+ testo::matrix(named("type") = ctypes_t<float, double>{},
+ [](auto type)
+ {
+ using T = typename decltype(type)::type;
+
+ const biquad_params<T> bq = biquad_lowpass<T>(0.45, 0.2);
+
+ constexpr size_t size = 32;
+
+ const univector<float, size> test_vector_f32{
+ +0x8.ce416p-4, +0x8.2979p-4, -0x8.a9d04p-7, +0xe.aeb3p-11, +0x8.204f8p-13,
+ -0x8.20d78p-12, +0x8.3379p-12, -0xf.83d81p-13, +0xe.8b5c4p-13, -0xd.9ddadp-13,
+ +0xc.bedfcp-13, -0xb.ee123p-13, +0xb.2a9e5p-13, -0xa.73ac4p-13, +0x9.c86f6p-13,
+ -0x9.2828p-13, +0x8.92229p-13, -0x8.05b7p-13, +0xf.048ffp-14, -0xe.0e849p-14,
+ +0xd.28384p-14, -0xc.50a9p-14, +0xb.86e56p-14, -0xa.ca0b6p-14, +0xa.19476p-14,
+ -0x9.73d38p-14, +0x8.d8f64p-14, -0x8.48024p-14, +0xf.80aa2p-15, -0xe.82ad8p-15,
+ +0xd.94f22p-15, -0xc.b66d9p-15,
+ };
+
+ const univector<double, size> test_vector_f64{
+ +0x8.ce416c0d31e88p-4, +0x8.2978efe51dafp-4, -0x8.a9d088b81da6p-7,
+ +0xe.aeb56c029358p-11, +0x8.20492639873ap-13, -0x8.20d4e21aab538p-12,
+ +0x8.3376b2d53b4a8p-12, -0xf.83d3d1c17343p-13, +0xe.8b584f0dd5ac8p-13,
+ -0xd.9dd740ceaacf8p-13, +0xc.bedc85e7a621p-13, -0xb.ee0f472bf8968p-13,
+ +0xb.2a9baed1fe6cp-13, -0xa.73a9d1670f4ep-13, +0x9.c86d29d297798p-13,
+ -0x9.2825f4d894088p-13, +0x8.9220a956d651p-13, -0x8.05b539fdd79e8p-13,
+ +0xf.048cb5194cfa8p-14, -0xe.0e819fa128938p-14, +0xd.2835957d684cp-14,
+ -0xc.50a69c2a8dc18p-14, +0xb.86e33bbaf3cbp-14, -0xa.ca097058af2cp-14,
+ +0xa.1945ad1703dcp-14, -0x9.73d1eef7d8b68p-14, +0x8.d8f4df1bb3efp-14,
+ -0x8.48010323c6f7p-14, +0xf.80a7f5baeeb2p-15, -0xe.82ab94bb68a8p-15,
+ +0xd.94f05f80af008p-15, -0xc.b66c0799b21a8p-15,
+ };
+
+ const univector<T, size> ir = biquad(bq, unitimpulse<T>());
+
+ CHECK(absmaxof(choose_array<T>(test_vector_f32, test_vector_f64) - ir) == 0);
+ });
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/tests/unit/dsp/biquad_design.cpp b/tests/unit/dsp/biquad_design.cpp
@@ -0,0 +1,7 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/dsp/biquad_design.hpp>
diff --git a/tests/unit/dsp/dsp.cpp b/tests/unit/dsp/dsp.cpp
@@ -0,0 +1,7 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/dsp.hpp>
diff --git a/tests/unit/dsp/ebu.cpp b/tests/unit/dsp/ebu.cpp
@@ -0,0 +1,270 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/dsp/ebu.hpp>
+#include <kfr/dsp/oscillators.hpp>
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+struct TestFragment
+{
+ float gain; // dB
+ float duration; // seconds
+ float frequency; // Hz
+};
+
+struct TestFragmentMultichannel
+{
+ float gain_L_R; // dB
+ float gain_C; // dB
+ float gain_Ls_Rs; // dB
+ float duration; // seconds
+ float frequency; // Hz
+};
+
+template <typename T>
+static void ebu_test_stereo(int sample_rate, const std::initializer_list<TestFragment>& fragments, T refM,
+ T refS, T refI, T refLRA)
+{
+ ebu_r128<T> loudness(sample_rate, { Speaker::Left, Speaker::Right });
+
+ size_t total_length = 0;
+ for (const TestFragment& f : fragments)
+ {
+ total_length += static_cast<size_t>(f.duration * sample_rate);
+ }
+
+ univector<T> left_right(total_length);
+ size_t pos = 0;
+ for (const TestFragment& f : fragments)
+ {
+ const size_t len = static_cast<size_t>(f.duration * sample_rate);
+ left_right.slice(pos, len) = dB_to_amp(f.gain) * sinenorm(phasor<float>(f.frequency, sample_rate));
+ pos += len;
+ }
+
+ for (size_t i = 0; i < total_length / loudness.packet_size(); i++)
+ {
+ loudness.process_packet({ left_right.slice(i * loudness.packet_size(), loudness.packet_size()),
+ left_right.slice(i * loudness.packet_size(), loudness.packet_size()) });
+ }
+ T M, S, I, RL, RH;
+ loudness.get_values(M, S, I, RL, RH);
+ if (!std::isnan(refM))
+ {
+ testo::scope s(as_string("M = ", fmt<'f', -1, 2>(M)));
+ CHECK(std::abs(M - refM) < 0.05f);
+ }
+ if (!std::isnan(refS))
+ {
+ testo::scope s(as_string("S = ", fmt<'f', -1, 2>(S)));
+ CHECK(std::abs(S - refS) < 0.05f);
+ }
+ if (!std::isnan(refI))
+ {
+ testo::scope s(as_string("I = ", fmt<'f', -1, 2>(I)));
+ CHECK(std::abs(I - refI) < 0.05f);
+ }
+ if (!std::isnan(refLRA))
+ {
+ testo::scope s(as_string("LRA = ", fmt<'f', -1, 2>((RH - RL))));
+ CHECK(std::abs((RH - RL) - refLRA) < 0.05f);
+ }
+}
+
+template <typename T>
+static void ebu_test_multichannel(int sample_rate,
+ const std::initializer_list<TestFragmentMultichannel>& fragments, T refM,
+ T refS, T refI, T refLRA)
+{
+ ebu_r128<T> loudness(sample_rate, { Speaker::Left, Speaker::Right, Speaker::Center, Speaker::LeftSurround,
+ Speaker::RightSurround });
+
+ size_t total_length = 0;
+ for (const TestFragmentMultichannel& f : fragments)
+ {
+ total_length += static_cast<size_t>(f.duration * sample_rate);
+ }
+
+ univector<T> left_right(total_length);
+ univector<T> center(total_length);
+ univector<T> surround(total_length);
+ size_t pos = 0;
+ for (const TestFragmentMultichannel& f : fragments)
+ {
+ const size_t len = static_cast<size_t>(f.duration * sample_rate);
+ left_right.slice(pos, len) =
+ dB_to_amp(f.gain_L_R) * sinenorm(phasor<float>(f.frequency, sample_rate));
+ center.slice(pos, len) = dB_to_amp(f.gain_C) * sinenorm(phasor<float>(f.frequency, sample_rate));
+ surround.slice(pos, len) =
+ dB_to_amp(f.gain_Ls_Rs) * sinenorm(phasor<float>(f.frequency, sample_rate));
+ pos += len;
+ }
+
+ for (size_t i = 0; i < total_length / loudness.packet_size(); i++)
+ {
+ loudness.process_packet({ left_right.slice(i * loudness.packet_size(), loudness.packet_size()),
+ left_right.slice(i * loudness.packet_size(), loudness.packet_size()),
+ center.slice(i * loudness.packet_size(), loudness.packet_size()),
+ surround.slice(i * loudness.packet_size(), loudness.packet_size()),
+ surround.slice(i * loudness.packet_size(), loudness.packet_size()) });
+ }
+ T M, S, I, RL, RH;
+ loudness.get_values(M, S, I, RL, RH);
+ if (!std::isnan(refM))
+ {
+ testo::scope s(as_string("M = ", fmt<'f', -1, 2>(M)));
+ CHECK(std::abs(M - refM) < 0.05f);
+ }
+ if (!std::isnan(refS))
+ {
+ testo::scope s(as_string("S = ", fmt<'f', -1, 2>(S)));
+ CHECK(std::abs(S - refS) < 0.05f);
+ }
+ if (!std::isnan(refI))
+ {
+ testo::scope s(as_string("I = ", fmt<'f', -1, 2>(I)));
+ CHECK(std::abs(I - refI) < 0.05f);
+ }
+ if (!std::isnan(refLRA))
+ {
+ testo::scope s(as_string("LRA = ", fmt<'f', -1, 2>((RH - RL))));
+ CHECK(std::abs((RH - RL) - refLRA) < 0.05f);
+ }
+}
+
+TEST(ebu_stereo_1_and_2)
+{
+ testo::matrix(named("type") = ctypes_t<float, double>{},
+ named("sample_rate") = std::vector<int>{ 44100, 48000 },
+ [](auto type, int sample_rate)
+ {
+ using T = typename decltype(type)::type;
+
+ ebu_test_stereo<T>(sample_rate, { { -23.f, 20.f, 1000.f } }, -23.f, -23.f, -23.f, NAN);
+ ebu_test_stereo<T>(sample_rate, { { -33.f, 20.f, 1000.f } }, -33.f, -33.f, -33.f, NAN);
+ });
+}
+
+TEST(ebu_stereo_3_4_and_5)
+{
+ testo::matrix(
+ named("type") = ctypes_t<float, double>{}, named("sample_rate") = std::vector<int>{ 44100, 48000 },
+ [](auto type, int sample_rate)
+ {
+ using T = typename decltype(type)::type;
+
+ ebu_test_stereo<T>(sample_rate,
+ { { -36.f, 10.f, 1000.f }, { -23.f, 60.f, 1000.f }, { -36.f, 10.f, 1000.f } },
+ NAN, NAN, -23.f, NAN);
+ ebu_test_stereo<T>(sample_rate,
+ { { -72.f, 10.f, 1000.f },
+ { -36.f, 10.f, 1000.f },
+ { -23.f, 60.f, 1000.f },
+ { -36.f, 10.f, 1000.f },
+ { -72.f, 10.f, 1000.f } },
+ NAN, NAN, -23.f, NAN);
+ });
+}
+
+TEST(ebu_multichannel_6)
+{
+ testo::matrix(named("type") = ctypes_t<float, double>{},
+ named("sample_rate") = std::vector<int>{ 44100, 48000 },
+ [](auto type, int sample_rate)
+ {
+ using T = typename decltype(type)::type;
+
+ ebu_test_multichannel<T>(sample_rate, { { -28.f, -24.f, -30.f, 20.f, 1000.f } }, NAN,
+ NAN, -23.f, NAN);
+ });
+}
+
+TEST(ebu_stereo_9)
+{
+ testo::matrix(named("type") = ctypes_t<float, double>{},
+ named("sample_rate") = std::vector<int>{ 44100, 48000 },
+ [](auto type, int sample_rate)
+ {
+ using T = typename decltype(type)::type;
+
+ ebu_test_stereo<T>(sample_rate,
+ { { -20.f, 1.34f, 1000.f },
+ { -30.f, 1.66f, 1000.f },
+ { -20.f, 1.34f, 1000.f },
+ { -30.f, 1.66f, 1000.f },
+ { -20.f, 1.34f, 1000.f },
+ { -30.f, 1.66f, 1000.f },
+ { -20.f, 1.34f, 1000.f },
+ { -30.f, 1.66f, 1000.f },
+ { -20.f, 1.34f, 1000.f },
+ { -30.f, 1.66f, 1000.f } },
+ NAN, -23.f, NAN, NAN);
+ });
+}
+
+TEST(ebu_stereo_12)
+{
+ testo::matrix(
+ named("type") = ctypes_t<float, double>{}, named("sample_rate") = std::vector<int>{ 44100, 48000 },
+ [](auto type, int sample_rate)
+ {
+ using T = typename decltype(type)::type;
+
+ ebu_test_stereo<T>(sample_rate,
+ { { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
+ { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
+ { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
+ { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
+ { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
+ { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
+ { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
+ { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
+ { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
+ { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
+ { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
+ { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
+ { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
+ { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
+ { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f },
+ { -30.f, 0.22f, 1000.f }, { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f },
+ { -20.f, 0.18f, 1000.f }, { -30.f, 0.22f, 1000.f } },
+ -23.f, NAN, NAN, NAN);
+ });
+}
+
+TEST(ebu_lra_1_2_3_and_4)
+{
+ testo::matrix(named("type") = ctypes_t<float, double>{},
+ named("sample_rate") = std::vector<int>{ 44100, 48000 },
+ [](auto type, int sample_rate)
+ {
+ using T = typename decltype(type)::type;
+
+ ebu_test_stereo<T>(sample_rate, { { -20.f, 20.f, 1000.f }, { -30.f, 20.f, 1000.f } },
+ NAN, NAN, NAN, 10.f);
+
+ ebu_test_stereo<T>(sample_rate, { { -20.f, 20.f, 1000.f }, { -15.f, 20.f, 1000.f } },
+ NAN, NAN, NAN, 5.f);
+
+ ebu_test_stereo<T>(sample_rate, { { -40.f, 20.f, 1000.f }, { -20.f, 20.f, 1000.f } },
+ NAN, NAN, NAN, 20.f);
+
+ ebu_test_stereo<T>(sample_rate,
+ { { -50.f, 20.f, 1000.f },
+ { -35.f, 20.f, 1000.f },
+ { -20.f, 20.f, 1000.f },
+ { -35.f, 20.f, 1000.f },
+ { -50.f, 20.f, 1000.f } },
+ NAN, NAN, NAN, 15.f);
+ });
+}
+} // namespace CMT_ARCH_NAME
+
+} // namespace kfr
diff --git a/tests/unit/dsp/fir.cpp b/tests/unit/dsp/fir.cpp
@@ -0,0 +1,234 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <complex>
+#include <kfr/dsp/fir.hpp>
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+TEST(fir)
+{
+#ifdef CMT_COMPILER_IS_MSVC
+ // testo::matrix causes error in MSVC
+ {
+ using T = float;
+
+ const univector<T, 100> data = counter() + sequence(1, 2, -10, 100) + sequence(0, -7, 0.5);
+ const univector<T, 6> taps{ 1, 2, -2, 0.5, 0.0625, 4 };
+
+ CHECK_EXPRESSION(fir(data, taps), 100,
+ [&](size_t index) -> T
+ {
+ T result = 0;
+ for (size_t i = 0; i < taps.size(); i++)
+ result += data.get(index - i, 0) * taps[i];
+ return result;
+ });
+
+ CHECK_EXPRESSION(short_fir(data, taps), 100,
+ [&](size_t index) -> T
+ {
+ T result = 0;
+ for (size_t i = 0; i < taps.size(); i++)
+ result += data.get(index - i, 0) * taps[i];
+ return result;
+ });
+ }
+ {
+ using T = double;
+
+ const univector<T, 100> data = counter() + sequence(1, 2, -10, 100) + sequence(0, -7, 0.5);
+ const univector<T, 6> taps{ 1, 2, -2, 0.5, 0.0625, 4 };
+
+ CHECK_EXPRESSION(fir(data, taps), 100,
+ [&](size_t index) -> T
+ {
+ T result = 0;
+ for (size_t i = 0; i < taps.size(); i++)
+ result += data.get(index - i, 0) * taps[i];
+ return result;
+ });
+
+ CHECK_EXPRESSION(short_fir(data, taps), 100,
+ [&](size_t index) -> T
+ {
+ T result = 0;
+ for (size_t i = 0; i < taps.size(); i++)
+ result += data.get(index - i, 0) * taps[i];
+ return result;
+ });
+ }
+#else
+ testo::matrix(named("type") = ctypes_t<float
+#ifdef CMT_NATIVE_F64
+ ,
+ double
+#endif
+ >{},
+ [](auto type)
+ {
+ using T = typename decltype(type)::type;
+
+ const univector<T, 100> data =
+ counter() + sequence(1, 2, -10, 100) + sequence(0, -7, 0.5);
+ const univector<T, 6> taps{ 1, 2, -2, 0.5, 0.0625, 4 };
+
+ CHECK_EXPRESSION(fir(data, taps), 100,
+ [&](size_t index) -> T
+ {
+ T result = 0;
+ for (size_t i = 0; i < taps.size(); i++)
+ result += data.get(index - i, 0) * taps[i];
+ return result;
+ });
+
+ fir_state<T> state(taps.ref());
+
+ CHECK_EXPRESSION(fir(state, data), 100,
+ [&](size_t index) -> T
+ {
+ T result = 0;
+ for (size_t i = 0; i < taps.size(); i++)
+ result += data.get(index - i, 0) * taps[i];
+ return result;
+ });
+
+ CHECK_EXPRESSION(short_fir(data, taps), 100,
+ [&](size_t index) -> T
+ {
+ T result = 0;
+ for (size_t i = 0; i < taps.size(); i++)
+ result += data.get(index - i, 0) * taps[i];
+ return result;
+ });
+
+ short_fir_state<9, T> state2(taps);
+
+ CHECK_EXPRESSION(short_fir<taps.size()>(state2, data), 100,
+ [&](size_t index) -> T
+ {
+ T result = 0;
+ for (size_t i = 0; i < taps.size(); i++)
+ result += data.get(index - i, 0) * taps[i];
+ return result;
+ });
+
+ CHECK_EXPRESSION(moving_sum<taps.size()>(data), 100,
+ [&](size_t index) -> T
+ {
+ T result = 0;
+ for (size_t i = 0; i < taps.size(); i++)
+ result += data.get(index - i, 0);
+ return result;
+ });
+
+ moving_sum_state<T, 131> msstate1;
+
+ CHECK_EXPRESSION(moving_sum(msstate1, data), 100,
+ [&](size_t index) -> T
+ {
+ T result = 0;
+ for (size_t i = 0; i < msstate1.delayline.size(); i++)
+ result += data.get(index - i, 0);
+ return result;
+ });
+
+ moving_sum_state<T> msstate2(133);
+
+ CHECK_EXPRESSION(moving_sum(msstate2, data), 100,
+ [&](size_t index) -> T
+ {
+ T result = 0;
+ for (size_t i = 0; i < msstate2.delayline.size(); i++)
+ result += data.get(index - i, 0);
+ return result;
+ });
+ });
+#endif
+}
+
+#ifdef CMT_NATIVE_F64
+TEST(fir_different)
+{
+ const univector<float, 100> data = counter() + sequence(1, 2, -10, 100) + sequence(0, -7, 0.5f);
+ // const univector<double, 6> taps{ 1, 2, -2, 0.5, 0.0625, 4 };
+ const univector<double, 4> taps{ 1, 2, 3, 4 };
+
+ CHECK_EXPRESSION(fir(data, taps), 100,
+ [&](size_t index) -> float
+ {
+ double result = 0.0;
+ for (size_t i = 0; i < taps.size(); i++)
+ result += data.get(index - i, 0.0) * taps[i];
+ return float(result);
+ });
+
+ CHECK_EXPRESSION(short_fir(data, taps), 100,
+ [&](size_t index) -> float
+ {
+ double result = 0.0;
+ for (size_t i = 0; i < taps.size(); i++)
+ result += data.get(index - i, 0.0) * taps[i];
+ return float(result);
+ });
+}
+#endif
+
+#ifdef KFR_STD_COMPLEX
+template <typename T>
+inline std::complex<T> to_std(const std::complex<T>& c)
+{
+ return c;
+}
+template <typename T>
+inline std::complex<T> from_std(const std::complex<T>& c)
+{
+ return c;
+}
+#else
+template <typename T>
+inline std::complex<T> to_std(const kfr::complex<T>& c)
+{
+ return { c.real(), c.imag() };
+}
+
+template <typename T>
+inline kfr::complex<T> from_std(const std::complex<T>& c)
+{
+ return { c.real(), c.imag() };
+}
+#endif
+
+TEST(fir_complex)
+{
+ const univector<complex<float>, 100> data =
+ counter() * complex<float>{ 0.f, 1.f } + sequence(1, 2, -10, 100) + sequence(0, -7, 0.5f);
+ const univector<float, 6> taps{ 1, 2, -2, 0.5, 0.0625, 4 };
+
+ CHECK_EXPRESSION(fir(data, taps), 100,
+ [&](size_t index) -> complex<float>
+ {
+ std::complex<float> result = 0.0;
+ for (size_t i = 0; i < taps.size(); i++)
+ result = result + to_std(data.get(index - i, 0.0)) * taps[i];
+ return from_std(result);
+ });
+
+ CHECK_EXPRESSION(short_fir(data, taps), 100,
+ [&](size_t index) -> complex<float>
+ {
+ std::complex<float> result = 0.0;
+ for (size_t i = 0; i < taps.size(); i++)
+ result = result + to_std(data.get(index - i, 0.0)) * taps[i];
+ return from_std(result);
+ });
+}
+} // namespace CMT_ARCH_NAME
+
+} // namespace kfr
diff --git a/tests/unit/dsp/sample_rate_conversion.cpp b/tests/unit/dsp/sample_rate_conversion.cpp
@@ -0,0 +1,51 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/base/math_expressions.hpp>
+#include <kfr/dsp/oscillators.hpp>
+#include <kfr/dsp/sample_rate_conversion.hpp>
+#include <kfr/math/sin_cos.hpp>
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+TEST(resampler_test)
+{
+ const int in_sr = 44100;
+ const int out_sr = 48000;
+ const int freq = 100;
+ auto resampler = sample_rate_converter<fbase>(resample_quality::draft, out_sr, in_sr);
+ double delay = resampler.get_fractional_delay();
+ univector<fbase> out(out_sr / 10);
+ univector<fbase> in = truncate(sin(c_pi<fbase> * phasor<fbase>(freq, in_sr, 0)), in_sr / 10);
+ univector<fbase> ref = truncate(
+ sin(c_pi<fbase> * phasor<fbase>(freq, out_sr, -delay * (static_cast<double>(freq) / out_sr))),
+ out_sr / 10);
+ resampler.process(out, in);
+
+ CHECK(rms(slice(out - ref, static_cast<size_t>(ceil(delay * 2)))) < 0.005f);
+}
+TEST(resampler_test_complex)
+{
+ using type = complex<fbase>;
+ const int in_sr = 44100;
+ const int out_sr = 48000;
+ const int freq = 100;
+ auto resampler = sample_rate_converter<type>(resample_quality::draft, out_sr, in_sr);
+ double delay = resampler.get_fractional_delay();
+ univector<type> out(out_sr / 10);
+ univector<type> in = truncate(sin(c_pi<fbase> * phasor<fbase>(freq, in_sr, 0)), in_sr / 10);
+ univector<type> ref = truncate(
+ sin(c_pi<fbase> * phasor<fbase>(freq, out_sr, -delay * (static_cast<double>(freq) / out_sr))),
+ out_sr / 10);
+ resampler.process(out, in);
+
+ CHECK(rms(cabs(slice(out - ref, static_cast<size_t>(ceil(delay * 2))))) < 0.005f);
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/tests/unit/dsp/units.cpp b/tests/unit/dsp/units.cpp
@@ -0,0 +1,58 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/dsp/units.hpp>
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+TEST(note_to_hertz)
+{
+ testo::eplison_scope<void> eps(2000);
+ CHECK(kfr::note_to_hertz(60) == fbase(261.6255653005986346778499935233));
+ CHECK(kfr::note_to_hertz(pack(60)) == pack(fbase(261.6255653005986346778499935233)));
+
+ CHECK(kfr::note_to_hertz(69) == fbase(440.0));
+ CHECK(kfr::note_to_hertz(pack(69)) == pack(fbase(440)));
+}
+
+TEST(hertz_to_note)
+{
+ testo::eplison_scope<void> eps(1000);
+ CHECK(kfr::hertz_to_note(261.6255653005986346778499935233) == fbase(60));
+ CHECK(kfr::hertz_to_note(pack(261.6255653005986346778499935233)) == pack(fbase(60)));
+
+ CHECK(kfr::hertz_to_note(440) == fbase(69));
+ CHECK(kfr::hertz_to_note(pack(440)) == pack(fbase(69)));
+}
+
+TEST(amp_to_dB)
+{
+ testo::eplison_scope<void> eps(1000);
+
+ CHECK(kfr::amp_to_dB(fbase(2.0)) == fbase(6.0205999132796239042747778944899));
+ CHECK(kfr::amp_to_dB(fbase(-2.0)) == fbase(6.0205999132796239042747778944899));
+ CHECK(kfr::amp_to_dB(fbase(1.0)) == fbase(0));
+ CHECK(kfr::amp_to_dB(fbase(-1.0)) == fbase(0));
+ CHECK(kfr::amp_to_dB(fbase(0.5)) == fbase(-6.0205999132796239042747778944899));
+ CHECK(kfr::amp_to_dB(fbase(-0.5)) == fbase(-6.0205999132796239042747778944899));
+ CHECK(kfr::amp_to_dB(fbase(0.0)) == fbase(-HUGE_VAL));
+}
+
+TEST(dB_to_amp)
+{
+ testo::eplison_scope<void> eps(1000);
+
+ CHECK(kfr::dB_to_amp(fbase(-HUGE_VAL)) == fbase(0.0));
+ CHECK(kfr::dB_to_amp(fbase(0.0)) == fbase(1.0));
+ CHECK(kfr::dB_to_amp(fbase(6.0205999132796239042747778944899)) == fbase(2.0));
+ CHECK(kfr::dB_to_amp(fbase(-6.0205999132796239042747778944899)) == fbase(0.5));
+}
+
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/tests/unit/dsp/window.cpp b/tests/unit/dsp/window.cpp
@@ -0,0 +1,195 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/base/reduce.hpp>
+#include <kfr/base/simd_expressions.hpp>
+#include <kfr/base/tensor.hpp>
+#include <kfr/dsp/window.hpp>
+#include <kfr/io/tostring.hpp>
+
+CMT_PRAGMA_MSVC(warning(push))
+CMT_PRAGMA_MSVC(warning(disable : 4305))
+CMT_PRAGMA_MSVC(warning(disable : 4244))
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+
+const char* wins[] = {
+ "",
+ "rectangular ",
+ "triangular ",
+ "bartlett ",
+ "cosine ",
+ "hann ",
+ "bartlett_hann ",
+ "hamming ",
+ "bohman ",
+ "blackman ",
+ "blackman_harris",
+ "kaiser ",
+ "flattop ",
+ "gaussian ",
+ "lanczos ",
+ "cosine_np ",
+};
+
+template <window_type type, typename T>
+void win(size_t len, T arg, window_symmetry sym, univector<T> ref)
+{
+ univector<T> calc = render(window(len, cval_t<window_type, type>{}, arg, sym, cometa::ctype<T>));
+ testo::scope sc(as_string("win=", wins[static_cast<int>(type)], " len=", len, " sym=",
+ sym == window_symmetry::symmetric, "\n calc=", calc, "\n ref =", ref));
+ CHECK(rms(calc - ref) < 0.00001f);
+}
+
+TEST(window)
+{
+ using w = window_type;
+ using s = window_symmetry;
+ using u = univector<f32>;
+ // clang-format
+ win<w::rectangular, f32>(7, 0.0, s::symmetric, u{ 1, 1, 1, 1, 1, 1, 1 });
+ win<w::triangular, f32>(7, 0.0, s::symmetric, u{ 0.25, 0.5, 0.75, 1., 0.75, 0.5, 0.25 });
+ win<w::bartlett, f32>(7, 0.0, s::symmetric,
+ u{ 0., 0.33333333, 0.66666667, 1., 0.66666667, 0.33333333, 0. });
+ win<w::cosine, f32>(7, 0.0, s::symmetric, u{ 0, 0.5, 0.866025, 1, 0.866025, 0.5, 0 });
+ win<w::hann, f32>(7, 0.0, s::symmetric, u{ 0., 0.25, 0.75, 1., 0.75, 0.25, 0. });
+ win<w::bartlett_hann, f32>(7, 0.0, s::symmetric, u{ 0., 0.27, 0.73, 1., 0.73, 0.27, 0. });
+ win<w::hamming, f32>(7, 0.54, s::symmetric, u{ 0.08, 0.31, 0.77, 1., 0.77, 0.31, 0.08 });
+ win<w::bohman, f32>(7, 0.0, s::symmetric,
+ u{ 0., 0.10899778, 0.60899778, 1., 0.60899778, 0.10899778, 0. });
+ win<w::blackman, f32>(7, 0.16, s::symmetric,
+ u{ -1.38777878e-17, 1.30000000e-01, 6.30000000e-01, 1.00000000e+00, 6.30000000e-01,
+ 1.30000000e-01, -1.38777878e-17 });
+ win<w::blackman_harris, f32>(
+ 7, 0.0, s::symmetric,
+ u{ 6.00000e-05, 5.56450e-02, 5.20575e-01, 1.00000e+00, 5.20575e-01, 5.56450e-02, 6.00000e-05 });
+ win<w::kaiser, f32>(7, 8.0, s::symmetric,
+ u{ 0.00233883, 0.1520107, 0.65247867, 1., 0.65247867, 0.1520107, 0.00233883 });
+ win<w::flattop, f32>(7, 0.0, s::symmetric,
+ u{ -4.2105100e-04, -5.1263156e-02, 1.9821053e-01, 1.0000000e+00, 1.9821053e-01,
+ -5.1263156e-02, -4.2105100e-04 });
+ win<w::gaussian, f32>(7, 2.5, s::symmetric,
+ u{ 0.1006689, 0.36044779, 0.77483743, 1., 0.77483743, 0.36044779, 0.1006689 });
+ win<w::lanczos, f32>(7, 0.0, s::symmetric,
+ u{ -2.8e-08, 0.413497, 0.826993, 1, 0.826993, 0.413497, -2.8e-08 });
+ win<w::cosine_np, f32>(7, 0.0, s::symmetric,
+ u{ 0.22252093, 0.6234898, 0.90096887, 1., 0.90096887, 0.6234898, 0.22252093 });
+
+ win<w::rectangular, f32>(8, 0.0, s::symmetric, u{ 1, 1, 1, 1, 1, 1, 1, 1 });
+ win<w::triangular, f32>(8, 0.0, s::symmetric,
+ u{ 0.125, 0.375, 0.625, 0.875, 0.875, 0.625, 0.375, 0.125 });
+ win<w::bartlett, f32>(
+ 8, 0.0, s::symmetric,
+ u{ 0., 0.28571429, 0.57142857, 0.85714286, 0.85714286, 0.57142857, 0.28571429, 0. });
+ win<w::cosine, f32>(8, 0.0, s::symmetric,
+ u{ 0, 0.433884, 0.781832, 0.974928, 0.974928, 0.781831, 0.433883, 0 });
+ win<w::hann, f32>(8, 0.0, s::symmetric,
+ u{ 0., 0.1882551, 0.61126047, 0.95048443, 0.95048443, 0.61126047, 0.1882551, 0. });
+ win<w::bartlett_hann, f32>(
+ 8, 0.0, s::symmetric,
+ u{ 0., 0.2116453, 0.60170081, 0.92808246, 0.92808246, 0.60170081, 0.2116453, 0. });
+ win<w::hamming, f32>(
+ 8, 0.54, s::symmetric,
+ u{ 0.08, 0.25319469, 0.64235963, 0.95444568, 0.95444568, 0.64235963, 0.25319469, 0.08 });
+ win<w::bohman, f32>(8, 0.0, s::symmetric,
+ u{ 0., 0.07072475, 0.43748401, 0.91036851, 0.91036851, 0.43748401, 0.07072475, 0. });
+ win<w::blackman, f32>(8, 0.16, s::symmetric,
+ u{ -1.38777878e-17, 9.04534244e-02, 4.59182958e-01, 9.20363618e-01, 9.20363618e-01,
+ 4.59182958e-01, 9.04534244e-02, -1.38777878e-17 });
+ win<w::blackman_harris, f32>(8, 0.0, s::symmetric,
+ u{ 6.00000000e-05, 3.33917235e-02, 3.32833504e-01, 8.89369772e-01,
+ 8.89369772e-01, 3.32833504e-01, 3.33917235e-02, 6.00000000e-05 });
+ win<w::kaiser, f32>(
+ 8, 8.0, s::symmetric,
+ u{ 0.00233883, 0.10919581, 0.48711868, 0.92615774, 0.92615774, 0.48711868, 0.10919581, 0.00233883 });
+ win<w::flattop, f32>(8, 0.0, s::symmetric,
+ u{ -4.21051000e-04, -3.68407812e-02, 1.07037167e-02, 7.80873915e-01, 7.80873915e-01,
+ 1.07037167e-02, -3.68407812e-02, -4.21051000e-04 });
+ win<w::gaussian, f32>(
+ 8, 2.5, s::symmetric,
+ u{ 0.09139376, 0.29502266, 0.64438872, 0.9523448, 0.9523448, 0.64438872, 0.29502266, 0.09139376 });
+ win<w::lanczos, f32>(8, 0.0, s::symmetric,
+ u{ -2.8e-08, 0.348411, 0.724101, 0.966766, 0.966766, 0.724101, 0.34841, -2.8e-08 });
+ win<w::cosine_np, f32>(
+ 8, 0.0, s::symmetric,
+ u{ 0.19509032, 0.55557023, 0.83146961, 0.98078528, 0.98078528, 0.83146961, 0.55557023, 0.19509032 });
+
+ win<w::rectangular, f32>(7, 0.0, s::periodic, u{ 1, 1, 1, 1, 1, 1, 1 });
+ win<w::triangular, f32>(7, 0.0, s::periodic, u{ 0.125, 0.375, 0.625, 0.875, 0.875, 0.625, 0.375 });
+ win<w::bartlett, f32>(7, 0.0, s::periodic,
+ u{ 0., 0.28571429, 0.57142857, 0.85714286, 0.85714286, 0.57142857, 0.28571429 });
+ win<w::cosine, f32>(7, 0.0, s::periodic,
+ u{ 0, 0.433884, 0.781832, 0.974928, 0.974928, 0.781831, 0.433883 });
+ win<w::hann, f32>(7, 0.0, s::periodic,
+ u{ 0., 0.1882551, 0.61126047, 0.95048443, 0.95048443, 0.61126047, 0.1882551 });
+ win<w::bartlett_hann, f32>(7, 0.0, s::periodic,
+ u{ 0., 0.2116453, 0.60170081, 0.92808246, 0.92808246, 0.60170081, 0.2116453 });
+ win<w::hamming, f32>(7, 0.54, s::periodic,
+ u{ 0.08, 0.25319469, 0.64235963, 0.95444568, 0.95444568, 0.64235963, 0.25319469 });
+ win<w::bohman, f32>(7, 0.0, s::periodic,
+ u{ 0., 0.07072475, 0.43748401, 0.91036851, 0.91036851, 0.43748401, 0.07072475 });
+ win<w::blackman, f32>(7, 0.16, s::periodic,
+ u{ -1.38777878e-17, 9.04534244e-02, 4.59182958e-01, 9.20363618e-01, 9.20363618e-01,
+ 4.59182958e-01, 9.04534244e-02 });
+ win<w::blackman_harris, f32>(7, 0.0, s::periodic,
+ u{ 6.00000000e-05, 3.33917235e-02, 3.32833504e-01, 8.89369772e-01,
+ 8.89369772e-01, 3.32833504e-01, 3.33917235e-02 });
+ win<w::kaiser, f32>(
+ 7, 8.0, s::periodic,
+ u{ 0.00233883, 0.10919581, 0.48711868, 0.92615774, 0.92615774, 0.48711868, 0.10919581 });
+ win<w::flattop, f32>(7, 0.0, s::periodic,
+ u{ -4.21051000e-04, -3.68407812e-02, 1.07037167e-02, 7.80873915e-01, 7.80873915e-01,
+ 1.07037167e-02, -3.68407812e-02 });
+ win<w::gaussian, f32>(
+ 7, 2.5, s::periodic,
+ u{ 0.09139376, 0.29502266, 0.64438872, 0.9523448, 0.9523448, 0.64438872, 0.29502266 });
+ win<w::lanczos, f32>(7, 0.0, s::periodic,
+ u{ -2.8e-08, 0.348411, 0.724101, 0.966766, 0.966766, 0.724101, 0.34841 });
+ win<w::cosine_np, f32>(
+ 7, 0.0, s::periodic,
+ u{ 0.19509032, 0.55557023, 0.83146961, 0.98078528, 0.98078528, 0.83146961, 0.55557023 });
+
+ win<w::rectangular, f32>(8, 0.0, s::periodic, u{ 1, 1, 1, 1, 1, 1, 1, 1 });
+ win<w::triangular, f32>(8, 0.0, s::periodic, u{ 0.2, 0.4, 0.6, 0.8, 1., 0.8, 0.6, 0.4 });
+ win<w::bartlett, f32>(8, 0.0, s::periodic, u{ 0., 0.25, 0.5, 0.75, 1., 0.75, 0.5, 0.25 });
+ win<w::cosine, f32>(8, 0.0, s::periodic,
+ u{ 0, 0.382683, 0.707107, 0.92388, 1, 0.92388, 0.707107, 0.382683 });
+ win<w::hann, f32>(8, 0.0, s::periodic,
+ u{ 0., 0.14644661, 0.5, 0.85355339, 1., 0.85355339, 0.5, 0.14644661 });
+ win<w::bartlett_hann, f32>(8, 0.0, s::periodic,
+ u{ 0., 0.17129942, 0.5, 0.82870058, 1., 0.82870058, 0.5, 0.17129942 });
+ win<w::hamming, f32>(8, 0.54, s::periodic,
+ u{ 0.08, 0.21473088, 0.54, 0.86526912, 1., 0.86526912, 0.54, 0.21473088 });
+ win<w::bohman, f32>(8, 0.0, s::periodic,
+ u{ 0., 0.04830238, 0.31830989, 0.75540916, 1., 0.75540916, 0.31830989, 0.04830238 });
+ win<w::blackman, f32>(8, 0.16, s::periodic,
+ u{ -1.38777878e-17, 6.64466094e-02, 3.40000000e-01, 7.73553391e-01, 1.00000000e+00,
+ 7.73553391e-01, 3.40000000e-01, 6.64466094e-02 });
+ win<w::blackman_harris, f32>(8, 0.0, s::periodic,
+ u{ 6.00000000e-05, 2.17358370e-02, 2.17470000e-01, 6.95764163e-01,
+ 1.00000000e+00, 6.95764163e-01, 2.17470000e-01, 2.17358370e-02 });
+ win<w::kaiser, f32>(
+ 8, 8.0, s::periodic,
+ u{ 0.00233883, 0.08273982, 0.36897272, 0.78875245, 1., 0.78875245, 0.36897272, 0.08273982 });
+ win<w::flattop, f32>(8, 0.0, s::periodic,
+ u{ -4.21051000e-04, -2.68721933e-02, -5.47368400e-02, 4.44135357e-01, 1.00000000e+00,
+ 4.44135357e-01, -5.47368400e-02, -2.68721933e-02 });
+ win<w::gaussian, f32>(
+ 8, 2.5, s::periodic,
+ u{ 0.08465799, 0.24935221, 0.53940751, 0.85699689, 1., 0.85699689, 0.53940751, 0.24935221 });
+ win<w::lanczos, f32>(8, 0.0, s::periodic,
+ u{ -2.8e-08, 0.300105, 0.63662, 0.900316, 1, 0.900316, 0.63662, 0.300105 });
+ win<w::cosine_np, f32>(8, 0.0, s::periodic,
+ u{ 0.17364818, 0.5, 0.76604444, 0.93969262, 1., 0.93969262, 0.76604444, 0.5 });
+ // clang-format on
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
+
+CMT_PRAGMA_MSVC(warning(pop))
diff --git a/tests/unit/graphics/graphics.cpp b/tests/unit/graphics/graphics.cpp
@@ -0,0 +1,7 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/graphics.hpp>
diff --git a/tests/unit/math/abs.cpp b/tests/unit/math/abs.cpp
@@ -1,22 +0,0 @@
-/**
- * KFR (http://kfrlib.com)
- * Copyright (C) 2016-2022 Fractalium Ltd
- * See LICENSE.txt for details
- */
-
-#include <kfr/math/abs.hpp>
-
-#include <kfr/io.hpp>
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-TEST(abs)
-{
- test_function1(
- test_catogories::all, [](auto x) { return kfr::abs(x); },
- [](auto x) -> decltype(x) { return x >= 0 ? x : -x; });
-}
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/tests/unit/math/math.cpp b/tests/unit/math/math.cpp
@@ -0,0 +1,7 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/math.hpp>
diff --git a/tests/unit/math/min_max.cpp b/tests/unit/math/min_max.cpp
@@ -1,68 +0,0 @@
-/**
- * KFR (http://kfrlib.com)
- * Copyright (C) 2016-2022 Fractalium Ltd
- * See LICENSE.txt for details
- */
-
-#include <kfr/math/min_max.hpp>
-
-#include <kfr/io.hpp>
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-TEST(min)
-{
- test_function2(
- test_catogories::all, [](auto x, auto y) { return kfr::min(x, y); },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> { return x <= y ? x : y; });
-}
-
-TEST(max)
-{
- test_function2(
- test_catogories::all, [](auto x, auto y) { return kfr::max(x, y); },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> { return x >= y ? x : y; });
-}
-
-struct IsNotMinInt
-{
- template <typename T>
- bool operator()(ctype_t<T>, identity<T> x, identity<T> y) const
- {
- return is_floating_point<T> || is_unsigned<T> ||
- (x != std::numeric_limits<T>::min() && y != std::numeric_limits<T>::min());
- }
- template <typename T, size_t N>
- bool operator()(ctype_t<vec<T, N>>, identity<T> x, identity<T> y) const
- {
- return operator()(ctype<T>, x, y);
- }
-};
-
-TEST(absmin)
-{
- test_function2(
- test_catogories::all, [](auto x, auto y) { return kfr::absmin(x, y); },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> {
- x = x >= 0 ? x : -x;
- y = y >= 0 ? y : -y;
- return x <= y ? x : y;
- },
- IsNotMinInt{});
-}
-
-TEST(absmax)
-{
- test_function2(
- test_catogories::all, [](auto x, auto y) { return kfr::absmax(x, y); },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> {
- x = x >= 0 ? x : -x;
- y = y >= 0 ? y : -y;
- return x >= y ? x : y;
- },
- IsNotMinInt{});
-}
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/tests/unit/math/round.cpp b/tests/unit/math/round.cpp
@@ -1,58 +0,0 @@
-/**
- * KFR (http://kfrlib.com)
- * Copyright (C) 2016-2022 Fractalium Ltd
- * See LICENSE.txt for details
- */
-
-#include <kfr/math/round.hpp>
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-TEST(floor)
-{
- test_function1(
- test_catogories::all, [](auto x) { return kfr::floor(x); },
- [](auto x) -> decltype(x) {
- return std::is_integral<decltype(x)>::value ? x : static_cast<decltype(x)>(std::floor(x));
- });
-}
-
-TEST(ceil)
-{
- test_function1(
- test_catogories::all, [](auto x) { return kfr::ceil(x); },
- [](auto x) -> decltype(x) {
- return std::is_integral<decltype(x)>::value ? x : static_cast<decltype(x)>(std::ceil(x));
- });
-}
-
-TEST(trunc)
-{
- test_function1(
- test_catogories::all, [](auto x) { return kfr::trunc(x); },
- [](auto x) -> decltype(x) {
- return std::is_integral<decltype(x)>::value ? x : static_cast<decltype(x)>(std::trunc(x));
- });
-}
-
-TEST(round)
-{
- test_function1(
- test_catogories::all, [](auto x) { return kfr::round(x); },
- [](auto x) -> decltype(x) {
- return std::is_integral<decltype(x)>::value ? x : static_cast<decltype(x)>(std::round(x));
- });
-}
-
-TEST(fract)
-{
- test_function1(
- test_catogories::all, [](auto x) { return kfr::fract(x); },
- [](auto x) -> decltype(x) {
- return std::is_integral<decltype(x)>::value ? 0 : static_cast<decltype(x)>(x - std::floor(x));
- });
-}
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/tests/unit/math/select.cpp b/tests/unit/math/select.cpp
@@ -1,35 +0,0 @@
-/**
- * KFR (http://kfrlib.com)
- * Copyright (C) 2016-2022 Fractalium Ltd
- * See LICENSE.txt for details
- */
-
-#include <kfr/math/select.hpp>
-
-namespace kfr
-{
-inline namespace CMT_ARCH_NAME
-{
-TEST(select_true)
-{
- test_function2(
- test_catogories::vectors,
- [](auto x, auto y) {
- mask<subtype<decltype(x)>, decltype(x)::scalar_size()> m(true);
- return kfr::select(m, x, y);
- },
- [](auto x, auto) { return x; });
-}
-
-TEST(select_false)
-{
- test_function2(
- test_catogories::vectors,
- [](auto x, auto y) {
- mask<subtype<decltype(x)>, decltype(x)::scalar_size()> m(false);
- return kfr::select(m, x, y);
- },
- [](auto, auto y) { return y; });
-}
-} // namespace CMT_ARCH_NAME
-} // namespace kfr
diff --git a/tests/unit/simd/abs.cpp b/tests/unit/simd/abs.cpp
@@ -0,0 +1,22 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/simd/abs.hpp>
+
+#include <kfr/io.hpp>
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+TEST(abs)
+{
+ test_function1(
+ test_catogories::all, [](auto x) { return kfr::abs(x); },
+ [](auto x) -> decltype(x) { return x >= 0 ? x : -x; });
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/tests/unit/simd/min_max.cpp b/tests/unit/simd/min_max.cpp
@@ -0,0 +1,70 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/simd/min_max.hpp>
+
+#include <kfr/io.hpp>
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+TEST(min)
+{
+ test_function2(
+ test_catogories::all, [](auto x, auto y) { return kfr::min(x, y); },
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)> { return x <= y ? x : y; });
+}
+
+TEST(max)
+{
+ test_function2(
+ test_catogories::all, [](auto x, auto y) { return kfr::max(x, y); },
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)> { return x >= y ? x : y; });
+}
+
+struct IsNotMinInt
+{
+ template <typename T>
+ bool operator()(ctype_t<T>, identity<T> x, identity<T> y) const
+ {
+ return std::is_floating_point_v<T> || std::is_unsigned_v<T> ||
+ (x != std::numeric_limits<T>::min() && y != std::numeric_limits<T>::min());
+ }
+ template <typename T, size_t N>
+ bool operator()(ctype_t<vec<T, N>>, identity<T> x, identity<T> y) const
+ {
+ return operator()(cometa::ctype<T>, x, y);
+ }
+};
+
+TEST(absmin)
+{
+ test_function2(
+ test_catogories::all, [](auto x, auto y) { return kfr::absmin(x, y); },
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)>
+ {
+ x = x >= 0 ? x : -x;
+ y = y >= 0 ? y : -y;
+ return x <= y ? x : y;
+ },
+ IsNotMinInt{});
+}
+
+TEST(absmax)
+{
+ test_function2(
+ test_catogories::all, [](auto x, auto y) { return kfr::absmax(x, y); },
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)>
+ {
+ x = x >= 0 ? x : -x;
+ y = y >= 0 ? y : -y;
+ return x >= y ? x : y;
+ },
+ IsNotMinInt{});
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/tests/unit/simd/operators.cpp b/tests/unit/simd/operators.cpp
@@ -4,6 +4,7 @@
* See LICENSE.txt for details
*/
+#include <kfr/io/tostring.hpp>
#include <kfr/simd/horizontal.hpp>
#include <kfr/simd/operators.hpp>
@@ -22,7 +23,8 @@ TEST(bnot)
{
test_function1(
test_catogories::vectors, [](auto x) -> decltype(x) { return ~x; },
- [](auto x) -> decltype(x) {
+ [](auto x) -> decltype(x)
+ {
utype<decltype(x)> u = ~ubitcast(x);
return bitcast<decltype(x)>(u);
});
@@ -32,21 +34,21 @@ TEST(add)
{
test_function2(
test_catogories::vectors, [](auto x, auto y) { return x + y; },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> { return x + y; });
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)> { return x + y; });
}
TEST(sub)
{
test_function2(
test_catogories::vectors, [](auto x, auto y) { return x - y; },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> { return x - y; });
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)> { return x - y; });
}
TEST(mul)
{
test_function2(
test_catogories::vectors, [](auto x, auto y) { return x * y; },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> { return x * y; });
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)> { return x * y; });
}
template <typename T>
@@ -59,20 +61,39 @@ TEST(div)
{
test_function2(
test_catogories::vectors,
- [](auto x, auto y) {
- return is_safe_division<subtype<decltype(x)>>(x.front(), y.front()) ? x / y : 0;
- },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> {
+ [](auto x, auto y)
+ { return is_safe_division<subtype<decltype(x)>>(x.front(), y.front()) ? x / y : 0; },
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)> {
return is_safe_division(x, y) ? x / y : 0;
});
}
+struct not_f
+{
+ template <typename T>
+ constexpr bool operator()(ctype_t<T>) const
+ {
+ return !is_f_class<subtype<T>>;
+ }
+};
+TEST(mod)
+{
+ test_function2(
+ test_catogories::vectors,
+ [](auto x, auto y)
+ { return is_safe_division<subtype<decltype(x)>>(x.front(), y.front()) ? x % y : 0; },
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)> {
+ return is_safe_division(x, y) ? x % y : 0;
+ },
+ fn_return_constant<bool, true>{}, not_f{});
+}
TEST(bor)
{
test_function2(
test_catogories::vectors, [](auto x, auto y) { return x | y; },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> {
- using T = common_type<decltype(x), decltype(y)>;
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)>
+ {
+ using T = std::common_type_t<decltype(x), decltype(y)>;
return bitcast<T>(static_cast<utype<T>>(ubitcast(T(x)) | ubitcast(T(y))));
});
}
@@ -81,8 +102,9 @@ TEST(bxor)
{
test_function2(
test_catogories::vectors, [](auto x, auto y) { return x ^ y; },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> {
- using T = common_type<decltype(x), decltype(y)>;
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)>
+ {
+ using T = std::common_type_t<decltype(x), decltype(y)>;
return bitcast<T>(static_cast<utype<T>>(ubitcast(T(x)) ^ ubitcast(T(y))));
});
}
@@ -91,8 +113,9 @@ TEST(band)
{
test_function2(
test_catogories::vectors, [](auto x, auto y) { return x & y; },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> {
- using T = common_type<decltype(x), decltype(y)>;
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)>
+ {
+ using T = std::common_type_t<decltype(x), decltype(y)>;
return bitcast<T>(static_cast<utype<T>>(ubitcast(T(x)) & ubitcast(T(y))));
});
}
@@ -102,7 +125,8 @@ TEST(shl)
testo::matrix(
named("type") = test_catogories::types(test_catogories::vectors), named("value1") = special_values(),
named("shift") = std::vector<unsigned>{ 1, 2, 7, 8, 9, 15, 16, 31, 32, 63, 64 },
- [&](auto type, special_value value, unsigned shift) {
+ [&](auto type, special_value value, unsigned shift)
+ {
using T = typename decltype(type)::type;
if (shift < sizeof(subtype<T>))
{
@@ -130,7 +154,8 @@ TEST(shr)
testo::matrix(
named("type") = test_catogories::types(test_catogories::vectors), named("value1") = special_values(),
named("shift") = std::vector<unsigned>{ 1, 2, 7, 8, 9, 15, 16, 31, 32, 63, 64 },
- [&](auto type, special_value value, unsigned shift) {
+ [&](auto type, special_value value, unsigned shift)
+ {
using T = typename decltype(type)::type;
if (shift < sizeof(subtype<T>))
{
@@ -157,7 +182,7 @@ TEST(eq)
{
test_function2(
test_catogories::vectors, [](auto x, auto y) { return (x == y).asvec(); },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> {
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)> {
return maskbits<subtype<decltype(x)>>(x == y);
});
}
@@ -166,7 +191,7 @@ TEST(ne)
{
test_function2(
test_catogories::vectors, [](auto x, auto y) { return (x != y).asvec(); },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> {
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)> {
return maskbits<subtype<decltype(x)>>(x != y);
});
}
@@ -175,7 +200,7 @@ TEST(ge)
{
test_function2(
test_catogories::vectors, [](auto x, auto y) { return (x >= y).asvec(); },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> {
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)> {
return maskbits<subtype<decltype(x)>>(x >= y);
});
}
@@ -184,7 +209,7 @@ TEST(le)
{
test_function2(
test_catogories::vectors, [](auto x, auto y) { return (x <= y).asvec(); },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> {
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)> {
return maskbits<subtype<decltype(x)>>(x <= y);
});
}
@@ -193,7 +218,7 @@ TEST(gt)
{
test_function2(
test_catogories::vectors, [](auto x, auto y) { return (x > y).asvec(); },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> {
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)> {
return maskbits<subtype<decltype(x)>>(x > y);
});
}
@@ -202,7 +227,7 @@ TEST(lt)
{
test_function2(
test_catogories::vectors, [](auto x, auto y) { return (x < y).asvec(); },
- [](auto x, auto y) -> common_type<decltype(x), decltype(y)> {
+ [](auto x, auto y) -> std::common_type_t<decltype(x), decltype(y)> {
return maskbits<subtype<decltype(x)>>(x < y);
});
}
@@ -222,6 +247,10 @@ TEST(matrix)
CHECK(m22 * i32x2{ -1, 100 } == i32x2x2{ i32x2{ -1, 200 }, i32x2{ -3, 400 } });
+ CHECK(vec{ vec{ 1, 1 }, vec{ 1, 1 } } * vec{ -1, 100 } == vec{ vec{ -1, 100 }, vec{ -1, 100 } });
+ CHECK(vec{ vec{ 1, 1 }, vec{ 1, 1 }, vec{ 1, 1 } } * vec{ -1, 100 } ==
+ vec{ vec{ -1, 100 }, vec{ -1, 100 }, vec{ -1, 100 } });
+
i32x2 xy{ 10, 20 };
i32x2x2 m{ i32x2{ 1, 2 }, i32x2{ 3, 4 } };
xy = hadd(xy * m);
diff --git a/tests/unit/simd/round.cpp b/tests/unit/simd/round.cpp
@@ -0,0 +1,53 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/simd/round.hpp>
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+TEST(floor)
+{
+ test_function1(
+ test_catogories::all, [](auto x) { return kfr::floor(x); },
+ [](auto x) -> decltype(x)
+ { return std::is_integral<decltype(x)>::value ? x : static_cast<decltype(x)>(std::floor(x)); });
+}
+
+TEST(ceil)
+{
+ test_function1(
+ test_catogories::all, [](auto x) { return kfr::ceil(x); },
+ [](auto x) -> decltype(x)
+ { return std::is_integral<decltype(x)>::value ? x : static_cast<decltype(x)>(std::ceil(x)); });
+}
+
+TEST(trunc)
+{
+ test_function1(
+ test_catogories::all, [](auto x) { return kfr::trunc(x); },
+ [](auto x) -> decltype(x)
+ { return std::is_integral<decltype(x)>::value ? x : static_cast<decltype(x)>(std::trunc(x)); });
+}
+
+TEST(round)
+{
+ test_function1(
+ test_catogories::all, [](auto x) { return kfr::round(x); },
+ [](auto x) -> decltype(x)
+ { return std::is_integral<decltype(x)>::value ? x : static_cast<decltype(x)>(std::round(x)); });
+}
+
+TEST(fract)
+{
+ test_function1(
+ test_catogories::all, [](auto x) { return kfr::fract(x); },
+ [](auto x) -> decltype(x)
+ { return std::is_integral<decltype(x)>::value ? 0 : static_cast<decltype(x)>(x - std::floor(x)); });
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/tests/unit/simd/select.cpp b/tests/unit/simd/select.cpp
@@ -0,0 +1,37 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/simd/select.hpp>
+
+namespace kfr
+{
+inline namespace CMT_ARCH_NAME
+{
+TEST(select_true)
+{
+ test_function2(
+ test_catogories::vectors,
+ [](auto x, auto y)
+ {
+ mask<subtype<decltype(x)>, decltype(x)::scalar_size()> m(true);
+ return kfr::select(m, x, y);
+ },
+ [](auto x, auto) { return x; });
+}
+
+TEST(select_false)
+{
+ test_function2(
+ test_catogories::vectors,
+ [](auto x, auto y)
+ {
+ mask<subtype<decltype(x)>, decltype(x)::scalar_size()> m(false);
+ return kfr::select(m, x, y);
+ },
+ [](auto, auto y) { return y; });
+}
+} // namespace CMT_ARCH_NAME
+} // namespace kfr
diff --git a/tests/unit/simd/shuffle.cpp b/tests/unit/simd/shuffle.cpp
@@ -180,5 +180,11 @@ TEST(low_high)
CHECK(low(vec<u8, 2>(1, 2)) == vec<u8, 1>(1));
CHECK(high(vec<u8, 2>(1, 2)) == vec<u8, 1>(2));
}
+TEST(enumerate)
+{
+ CHECK(enumerate(vec_shape<int, 4>{}, 4) == vec{ 0, 4, 8, 12 });
+ CHECK(enumerate(vec_shape<int, 8>{}, 3) == vec{ 0, 3, 6, 9, 12, 15, 18, 21 });
+ CHECK(enumerate(vec_shape<int, 7>{}, 3) == vec{ 0, 3, 6, 9, 12, 15, 18 });
+}
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/tests/unit/simd/simd.cpp b/tests/unit/simd/simd.cpp
@@ -0,0 +1,7 @@
+/**
+ * KFR (http://kfrlib.com)
+ * Copyright (C) 2016-2022 Fractalium Ltd
+ * See LICENSE.txt for details
+ */
+
+#include <kfr/simd.hpp>
diff --git a/tests/unit/simd/vec.cpp b/tests/unit/simd/vec.cpp
@@ -10,8 +10,15 @@
namespace kfr
{
+
+static_assert(std::is_same_v<i32x4, std::common_type_t<i32x4, i32x4>>);
+static_assert(std::is_same_v<i32x4, std::common_type_t<i32x4>>);
+static_assert(std::is_same_v<u32x4, std::common_type_t<i32x4, u32x4>>);
+static_assert(std::is_same_v<f64x4, std::common_type_t<i32x4, u32x4, f64x4>>);
+
inline namespace CMT_ARCH_NAME
{
+
TEST(mask_op)
{
mask<float, 4> m = make_mask<float>(true, false, true, false);
@@ -53,9 +60,6 @@ bool is_in_range_of(Tin x)
TEST(cast)
{
- testo::assert_is_same<i32x4, kfr::common_type<i32x4>>();
- testo::assert_is_same<u32x4, kfr::common_type<i32x4, u32x4>>();
- testo::assert_is_same<f64x4, kfr::common_type<i32x4, u32x4, f64x4>>();
CHECK(static_cast<i32x4>(u16x4{ 1, 2, 3, 4 }) == i32x4{ 1, 2, 3, 4 });
@@ -63,86 +67,94 @@ TEST(cast)
vec<float, 4>{ 1.f, 2.f, 3.f, 4.f }, vec<float, 4>{ 11.f, 22.f, 33.f, 44.f } }) ==
vec<vec<double, 4>, 2>{ vec<double, 4>{ 1., 2., 3., 4. }, vec<double, 4>{ 11., 22., 33., 44. } });
- static_assert(is_convertible<float, f32x4>, "");
- static_assert(is_convertible<float, f64x8>, "");
- static_assert(is_convertible<float, u8x3>, "");
+ static_assert(std::is_convertible_v<float, f32x4>, "");
+ static_assert(std::is_convertible_v<float, f64x8>, "");
+ static_assert(std::is_convertible_v<float, u8x3>, "");
+
+ static_assert(std::is_convertible_v<u16x4, i32x4>, "");
+ static_assert(!std::is_convertible_v<u16x4, i32x3>, "");
+ static_assert(!std::is_convertible_v<u16x1, u16x16>, "");
+
+ static_assert(std::is_convertible_v<float, vecx<float, 2>>, "");
+ static_assert(std::is_convertible_v<float, vecx<float, 2, 2>>, "");
- static_assert(is_convertible<u16x4, i32x4>, "");
- static_assert(!is_convertible<u16x4, i32x3>, "");
- static_assert(!is_convertible<u16x1, u16x16>, "");
+ static_assert(std::is_same_v<decltype(broadcastto<f64>(f32x4x4(1))), f64x4x4>, "");
+ static_assert(std::is_same_v<decltype(broadcastto<f64>(f32x4(1))), f64x4>, "");
+ static_assert(std::is_same_v<decltype(broadcastto<f64>(f32(1))), f64>, "");
- static_assert(is_same<decltype(innercast<f64>(f32x4x4(1))), f64x4x4>, "");
- static_assert(is_same<decltype(innercast<f64>(f32x4(1))), f64x4>, "");
- static_assert(is_same<decltype(innercast<f64>(f32(1))), f64>, "");
+ // N/A static_assert(std::is_same_v<decltype(broadcastto<f64x4>(f32x4x4(1))), f64x4x4>, "");
+ static_assert(std::is_same_v<decltype(broadcastto<f64x4>(f32x4(1))), f64x4x4>, "");
+ static_assert(std::is_same_v<decltype(broadcastto<f64x4>(f32(1))), f64x4>, "");
- // N/A static_assert(is_same<decltype(innercast<f64x4>(f32x4x4(1))), f64x4x4>, "");
- static_assert(is_same<decltype(innercast<f64x4>(f32x4(1))), f64x4x4>, "");
- static_assert(is_same<decltype(innercast<f64x4>(f32(1))), f64x4>, "");
+ // N/A static_assert(std::is_same_v<decltype(promoteto<f64>(f32x4x4(1))), f64x4>, "");
+ static_assert(std::is_same_v<decltype(promoteto<f64>(f32x4(1))), f64x4>, "");
- // N/A static_assert(is_same<decltype(elemcast<f64>(f32x4x4(1))), f64x4>, "");
- static_assert(is_same<decltype(elemcast<f64>(f32x4(1))), f64x4>, "");
+ static_assert(std::is_same_v<decltype(promoteto<f64x4>(f32x4x4(1))), f64x4x4>, "");
+ static_assert(std::is_same_v<decltype(promoteto<f64x4>(f32x4(1))), f64x4x4>, "");
- static_assert(is_same<decltype(elemcast<f64x4>(f32x4x4(1))), f64x4x4>, "");
- static_assert(is_same<decltype(elemcast<f64x4>(f32x4(1))), f64x4x4>, "");
+ CHECK(cast<vecx<float, 2, 2>>(123.f) == vec{ vec{ 123.f, 123.f }, vec{ 123.f, 123.f } });
+
+ CHECK(promoteto<vecx<float, 2>>(vecx<float, 4>{ 1.f, 2.f, 3.f, 4.f }) ==
+ vec{ vec{ 1.f, 1.f }, vec{ 2.f, 2.f }, vec{ 3.f, 3.f }, vec{ 4.f, 4.f } });
testo::scope s("");
s.text = ("target_type = u8");
test_function1(
- test_catogories::all, [](auto x) { return kfr::innercast<u8>(x); },
+ test_catogories::all, [](auto x) { return kfr::broadcastto<u8>(x); },
[](auto x) -> u8 { return static_cast<u8>(x); },
[](auto t, special_value x)
{ return is_in_range_of<u8>(x.get<subtype<typename decltype(t)::type>>()); });
s.text = ("target_type = i8");
test_function1(
- test_catogories::all, [](auto x) { return kfr::innercast<i8>(x); },
+ test_catogories::all, [](auto x) { return kfr::broadcastto<i8>(x); },
[](auto x) -> i8 { return static_cast<i8>(x); },
[](auto t, special_value x)
{ return is_in_range_of<i8>(x.get<subtype<typename decltype(t)::type>>()); });
s.text = ("target_type = u16");
test_function1(
- test_catogories::all, [](auto x) { return kfr::innercast<u16>(x); },
+ test_catogories::all, [](auto x) { return kfr::broadcastto<u16>(x); },
[](auto x) -> u16 { return static_cast<u16>(x); },
[](auto t, special_value x)
{ return is_in_range_of<u16>(x.get<subtype<typename decltype(t)::type>>()); });
s.text = ("target_type = i16");
test_function1(
- test_catogories::all, [](auto x) { return kfr::innercast<i16>(x); },
+ test_catogories::all, [](auto x) { return kfr::broadcastto<i16>(x); },
[](auto x) -> i16 { return static_cast<i16>(x); },
[](auto t, special_value x)
{ return is_in_range_of<i16>(x.get<subtype<typename decltype(t)::type>>()); });
s.text = ("target_type = u32");
test_function1(
- test_catogories::all, [](auto x) { return kfr::innercast<u32>(x); },
+ test_catogories::all, [](auto x) { return kfr::broadcastto<u32>(x); },
[](auto x) -> u32 { return static_cast<u32>(x); },
[](auto t, special_value x)
{ return is_in_range_of<u32>(x.get<subtype<typename decltype(t)::type>>()); });
s.text = ("target_type = i32");
test_function1(
- test_catogories::all, [](auto x) { return kfr::innercast<i32>(x); },
+ test_catogories::all, [](auto x) { return kfr::broadcastto<i32>(x); },
[](auto x) -> i32 { return static_cast<i32>(x); },
[](auto t, special_value x)
{ return is_in_range_of<i32>(x.get<subtype<typename decltype(t)::type>>()); });
s.text = ("target_type = u64");
test_function1(
- test_catogories::all, [](auto x) { return kfr::innercast<u64>(x); },
+ test_catogories::all, [](auto x) { return kfr::broadcastto<u64>(x); },
[](auto x) -> u64 { return static_cast<u64>(x); },
[](auto t, special_value x)
{ return is_in_range_of<u64>(x.get<subtype<typename decltype(t)::type>>()); });
s.text = ("target_type = i64");
test_function1(
- test_catogories::all, [](auto x) { return kfr::innercast<i64>(x); },
+ test_catogories::all, [](auto x) { return kfr::broadcastto<i64>(x); },
[](auto x) -> i64 { return static_cast<i64>(x); },
[](auto t, special_value x)
{ return is_in_range_of<i64>(x.get<subtype<typename decltype(t)::type>>()); });
s.text = ("target_type = f32");
test_function1(
- test_catogories::all, [](auto x) { return kfr::innercast<f32>(x); },
+ test_catogories::all, [](auto x) { return kfr::broadcastto<f32>(x); },
[](auto x) -> f32 { return static_cast<f32>(x); },
[](auto t, special_value x)
{ return is_in_range_of<f32>(x.get<subtype<typename decltype(t)::type>>()); });
s.text = ("target_type = f64");
test_function1(
- test_catogories::all, [](auto x) { return kfr::innercast<f64>(x); },
+ test_catogories::all, [](auto x) { return kfr::broadcastto<f64>(x); },
[](auto x) -> f64 { return static_cast<f64>(x); },
[](auto t, special_value x)
{ return is_in_range_of<f64>(x.get<subtype<typename decltype(t)::type>>()); });
@@ -198,5 +210,11 @@ TEST(masks)
CHECK(float(v[3]) == maskbits<float>(true));
}
+TEST(vec_deduction)
+{
+ vec v{ 1, 2, 3 };
+ static_assert(std::is_same_v<decltype(v), vec<int, 3>>);
+}
+
} // namespace CMT_ARCH_NAME
} // namespace kfr
diff --git a/update-sources.py b/update-sources.py
@@ -30,7 +30,15 @@ cmake = """
# Use update-sources.py
"""
-list_sources("KFR_SRC", "include", ['*.hpp', '*.h', '*.i', '*.inc'])
+list_sources("KFR_SRC", "include", ['*.hpp', '*.h'])
+list_sources("KFR_SIMD_SRC", "include/kfr/simd", ['*.hpp', '*.h'])
+list_sources("KFR_MATH_SRC", "include/kfr/math", ['*.hpp', '*.h'])
+list_sources("KFR_BASE_SRC", "include/kfr/base", ['*.hpp', '*.h'])
+list_sources("KFR_DSP_SRC", "include/kfr/dsp", ['*.hpp', '*.h'])
+list_sources("KFR_IO_SRC", "include/kfr/io", ['*.hpp', '*.h'])
+list_sources("KFR_RUNTIME_SRC", "include/kfr/runtime", ['*.hpp', '*.h'])
+list_sources("KFR_GRAPHICS_SRC", "include/kfr/graphics", ['*.hpp', '*.h'])
+list_sources("KFR_SRC", "include", ['*.hpp', '*.h'])
list_sources("KFR_DFT_SRC", "include/kfr/dft", ['*.cpp'], ["dft-src.cpp"])
list_sources("KFR_IO_SRC", "include/kfr/io", ['*.cpp'])