initial commit
9
.vscode/extensions.json
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"recommendations": [
|
||||
"eamodio.gitlens",
|
||||
"mhutchie.git-graph",
|
||||
"ms-python.python",
|
||||
"ms-python.vscode-pylance",
|
||||
"Gruntfuggly.todo-tree"
|
||||
]
|
||||
}
|
34
.vscode/settings.json
vendored
Executable file
|
@ -0,0 +1,34 @@
|
|||
{
|
||||
"editor.rulers": [
|
||||
120
|
||||
],
|
||||
"editor.formatOnSave": true,
|
||||
"python.formatting.provider": "black",
|
||||
"python.linting.lintOnSave": true,
|
||||
"python.linting.flake8Enabled": true,
|
||||
"python.analysis.autoImportCompletions": false,
|
||||
"python.sortImports.args": [
|
||||
"--profile",
|
||||
"black"
|
||||
],
|
||||
"[python]": {
|
||||
"gitlens.codeLens.symbolScopes": [
|
||||
"!Module"
|
||||
],
|
||||
"editor.wordBasedSuggestions": false,
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.organizeImports": true
|
||||
}
|
||||
},
|
||||
"files.exclude": {
|
||||
"**/.git": true,
|
||||
"**/.svn": true,
|
||||
"**/.hg": true,
|
||||
"**/CVS": true,
|
||||
"**/.DS_Store": true,
|
||||
"**/Thumbs.db": true,
|
||||
"**/.venv/bin/*": true,
|
||||
"**/.venv/lib": true,
|
||||
},
|
||||
"outline.showVariables": false,
|
||||
}
|
17
Pipfile
Normal file
|
@ -0,0 +1,17 @@
|
|||
[[source]]
|
||||
url = "https://pypi.org/simple"
|
||||
verify_ssl = true
|
||||
name = "pypi"
|
||||
|
||||
[packages]
|
||||
numpy = "*"
|
||||
scipy = "*"
|
||||
matplotlib = "*"
|
||||
black = "*"
|
||||
flake8 = "*"
|
||||
|
||||
[dev-packages]
|
||||
ipykernel = "*"
|
||||
|
||||
[requires]
|
||||
python_version = "3.8"
|
744
Pipfile.lock
generated
Normal file
|
@ -0,0 +1,744 @@
|
|||
{
|
||||
"_meta": {
|
||||
"hash": {
|
||||
"sha256": "bfc0fe7f13b9b4b8488ceeaf203ddc9241dc0a3c059c65fec6089cf2f2b92fdf"
|
||||
},
|
||||
"pipfile-spec": 6,
|
||||
"requires": {
|
||||
"python_version": "3.8"
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
"name": "pypi",
|
||||
"url": "https://pypi.org/simple",
|
||||
"verify_ssl": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"default": {
|
||||
"black": {
|
||||
"hashes": [
|
||||
"sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411",
|
||||
"sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c",
|
||||
"sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497",
|
||||
"sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e",
|
||||
"sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342",
|
||||
"sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27",
|
||||
"sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41",
|
||||
"sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab",
|
||||
"sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5",
|
||||
"sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16",
|
||||
"sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e",
|
||||
"sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c",
|
||||
"sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe",
|
||||
"sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3",
|
||||
"sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec",
|
||||
"sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3",
|
||||
"sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd",
|
||||
"sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c",
|
||||
"sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4",
|
||||
"sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90",
|
||||
"sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869",
|
||||
"sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747",
|
||||
"sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==22.8.0"
|
||||
},
|
||||
"click": {
|
||||
"hashes": [
|
||||
"sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e",
|
||||
"sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==8.1.3"
|
||||
},
|
||||
"cycler": {
|
||||
"hashes": [
|
||||
"sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3",
|
||||
"sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==0.11.0"
|
||||
},
|
||||
"flake8": {
|
||||
"hashes": [
|
||||
"sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db",
|
||||
"sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==5.0.4"
|
||||
},
|
||||
"fonttools": {
|
||||
"hashes": [
|
||||
"sha256:88d48ef24486137c864dc56707b4b54ef8a97ab9162c2721ec61434baf1c4d13",
|
||||
"sha256:b6d86ffd0a5f83d3da6a34d5f99a90398638e423cd6a8d93c5808af703432c7f"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==4.37.2"
|
||||
},
|
||||
"kiwisolver": {
|
||||
"hashes": [
|
||||
"sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b",
|
||||
"sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166",
|
||||
"sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c",
|
||||
"sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c",
|
||||
"sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0",
|
||||
"sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4",
|
||||
"sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9",
|
||||
"sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286",
|
||||
"sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767",
|
||||
"sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c",
|
||||
"sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6",
|
||||
"sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b",
|
||||
"sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004",
|
||||
"sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf",
|
||||
"sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494",
|
||||
"sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac",
|
||||
"sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626",
|
||||
"sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766",
|
||||
"sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514",
|
||||
"sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6",
|
||||
"sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f",
|
||||
"sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d",
|
||||
"sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191",
|
||||
"sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d",
|
||||
"sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51",
|
||||
"sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f",
|
||||
"sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8",
|
||||
"sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454",
|
||||
"sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb",
|
||||
"sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da",
|
||||
"sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8",
|
||||
"sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de",
|
||||
"sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a",
|
||||
"sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9",
|
||||
"sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008",
|
||||
"sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3",
|
||||
"sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32",
|
||||
"sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938",
|
||||
"sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1",
|
||||
"sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9",
|
||||
"sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d",
|
||||
"sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824",
|
||||
"sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b",
|
||||
"sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd",
|
||||
"sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2",
|
||||
"sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5",
|
||||
"sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69",
|
||||
"sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3",
|
||||
"sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae",
|
||||
"sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597",
|
||||
"sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e",
|
||||
"sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955",
|
||||
"sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca",
|
||||
"sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a",
|
||||
"sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea",
|
||||
"sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede",
|
||||
"sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4",
|
||||
"sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6",
|
||||
"sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686",
|
||||
"sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408",
|
||||
"sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871",
|
||||
"sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29",
|
||||
"sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750",
|
||||
"sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897",
|
||||
"sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0",
|
||||
"sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2",
|
||||
"sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09",
|
||||
"sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==1.4.4"
|
||||
},
|
||||
"matplotlib": {
|
||||
"hashes": [
|
||||
"sha256:0bcdfcb0f976e1bac6721d7d457c17be23cf7501f977b6a38f9d38a3762841f7",
|
||||
"sha256:1e64ac9be9da6bfff0a732e62116484b93b02a0b4d4b19934fb4f8e7ad26ad6a",
|
||||
"sha256:22227c976ad4dc8c5a5057540421f0d8708c6560744ad2ad638d48e2984e1dbc",
|
||||
"sha256:2886cc009f40e2984c083687251821f305d811d38e3df8ded414265e4583f0c5",
|
||||
"sha256:2e6d184ebe291b9e8f7e78bbab7987d269c38ea3e062eace1fe7d898042ef804",
|
||||
"sha256:3211ba82b9f1518d346f6309df137b50c3dc4421b4ed4815d1d7eadc617f45a1",
|
||||
"sha256:339cac48b80ddbc8bfd05daae0a3a73414651a8596904c2a881cfd1edb65f26c",
|
||||
"sha256:35a8ad4dddebd51f94c5d24bec689ec0ec66173bf614374a1244c6241c1595e0",
|
||||
"sha256:3b4fa56159dc3c7f9250df88f653f085068bcd32dcd38e479bba58909254af7f",
|
||||
"sha256:43e9d3fa077bf0cc95ded13d331d2156f9973dce17c6f0c8b49ccd57af94dbd9",
|
||||
"sha256:57f1b4e69f438a99bb64d7f2c340db1b096b41ebaa515cf61ea72624279220ce",
|
||||
"sha256:5c096363b206a3caf43773abebdbb5a23ea13faef71d701b21a9c27fdcef72f4",
|
||||
"sha256:6bb93a0492d68461bd458eba878f52fdc8ac7bdb6c4acdfe43dba684787838c2",
|
||||
"sha256:6ea6aef5c4338e58d8d376068e28f80a24f54e69f09479d1c90b7172bad9f25b",
|
||||
"sha256:6fe807e8a22620b4cd95cfbc795ba310dc80151d43b037257250faf0bfcd82bc",
|
||||
"sha256:73dd93dc35c85dece610cca8358003bf0760d7986f70b223e2306b4ea6d1406b",
|
||||
"sha256:839d47b8ead7ad9669aaacdbc03f29656dc21f0d41a6fea2d473d856c39c8b1c",
|
||||
"sha256:874df7505ba820e0400e7091199decf3ff1fde0583652120c50cd60d5820ca9a",
|
||||
"sha256:879c7e5fce4939c6aa04581dfe08d57eb6102a71f2e202e3314d5fbc072fd5a0",
|
||||
"sha256:94ff86af56a3869a4ae26a9637a849effd7643858a1a04dd5ee50e9ab75069a7",
|
||||
"sha256:99482b83ebf4eb6d5fc6813d7aacdefdd480f0d9c0b52dcf9f1cc3b2c4b3361a",
|
||||
"sha256:9ab29589cef03bc88acfa3a1490359000c18186fc30374d8aa77d33cc4a51a4a",
|
||||
"sha256:9befa5954cdbc085e37d974ff6053da269474177921dd61facdad8023c4aeb51",
|
||||
"sha256:a206a1b762b39398efea838f528b3a6d60cdb26fe9d58b48265787e29cd1d693",
|
||||
"sha256:ab8d26f07fe64f6f6736d635cce7bfd7f625320490ed5bfc347f2cdb4fae0e56",
|
||||
"sha256:b28de401d928890187c589036857a270a032961411934bdac4cf12dde3d43094",
|
||||
"sha256:b428076a55fb1c084c76cb93e68006f27d247169f056412607c5c88828d08f88",
|
||||
"sha256:bf618a825deb6205f015df6dfe6167a5d9b351203b03fab82043ae1d30f16511",
|
||||
"sha256:c995f7d9568f18b5db131ab124c64e51b6820a92d10246d4f2b3f3a66698a15b",
|
||||
"sha256:cd45a6f3e93a780185f70f05cf2a383daed13c3489233faad83e81720f7ede24",
|
||||
"sha256:d2484b350bf3d32cae43f85dcfc89b3ed7bd2bcd781ef351f93eb6fb2cc483f9",
|
||||
"sha256:d62880e1f60e5a30a2a8484432bcb3a5056969dc97258d7326ad465feb7ae069",
|
||||
"sha256:dacddf5bfcec60e3f26ec5c0ae3d0274853a258b6c3fc5ef2f06a8eb23e042be",
|
||||
"sha256:f3840c280ebc87a48488a46f760ea1c0c0c83fcf7abbe2e6baf99d033fd35fd8",
|
||||
"sha256:f814504e459c68118bf2246a530ed953ebd18213dc20e3da524174d84ed010b2"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==3.5.3"
|
||||
},
|
||||
"mccabe": {
|
||||
"hashes": [
|
||||
"sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325",
|
||||
"sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==0.7.0"
|
||||
},
|
||||
"mypy-extensions": {
|
||||
"hashes": [
|
||||
"sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d",
|
||||
"sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"
|
||||
],
|
||||
"version": "==0.4.3"
|
||||
},
|
||||
"numpy": {
|
||||
"hashes": [
|
||||
"sha256:004f0efcb2fe1c0bd6ae1fcfc69cc8b6bf2407e0f18be308612007a0762b4089",
|
||||
"sha256:09f6b7bdffe57fc61d869a22f506049825d707b288039d30f26a0d0d8ea05164",
|
||||
"sha256:0ea3f98a0ffce3f8f57675eb9119f3f4edb81888b6874bc1953f91e0b1d4f440",
|
||||
"sha256:17c0e467ade9bda685d5ac7f5fa729d8d3e76b23195471adae2d6a6941bd2c18",
|
||||
"sha256:1f27b5322ac4067e67c8f9378b41c746d8feac8bdd0e0ffede5324667b8a075c",
|
||||
"sha256:22d43376ee0acd547f3149b9ec12eec2f0ca4a6ab2f61753c5b29bb3e795ac4d",
|
||||
"sha256:2ad3ec9a748a8943e6eb4358201f7e1c12ede35f510b1a2221b70af4bb64295c",
|
||||
"sha256:301c00cf5e60e08e04d842fc47df641d4a181e651c7135c50dc2762ffe293dbd",
|
||||
"sha256:39a664e3d26ea854211867d20ebcc8023257c1800ae89773cbba9f9e97bae036",
|
||||
"sha256:51bf49c0cd1d52be0a240aa66f3458afc4b95d8993d2d04f0d91fa60c10af6cd",
|
||||
"sha256:78a63d2df1d947bd9d1b11d35564c2f9e4b57898aae4626638056ec1a231c40c",
|
||||
"sha256:7cd1328e5bdf0dee621912f5833648e2daca72e3839ec1d6695e91089625f0b4",
|
||||
"sha256:8355fc10fd33a5a70981a5b8a0de51d10af3688d7a9e4a34fcc8fa0d7467bb7f",
|
||||
"sha256:8c79d7cf86d049d0c5089231a5bcd31edb03555bd93d81a16870aa98c6cfb79d",
|
||||
"sha256:91b8d6768a75247026e951dce3b2aac79dc7e78622fc148329135ba189813584",
|
||||
"sha256:94c15ca4e52671a59219146ff584488907b1f9b3fc232622b47e2cf832e94fb8",
|
||||
"sha256:98dcbc02e39b1658dc4b4508442a560fe3ca5ca0d989f0df062534e5ca3a5c1a",
|
||||
"sha256:a64403f634e5ffdcd85e0b12c08f04b3080d3e840aef118721021f9b48fc1460",
|
||||
"sha256:bc6e8da415f359b578b00bcfb1d08411c96e9a97f9e6c7adada554a0812a6cc6",
|
||||
"sha256:bdc9febce3e68b697d931941b263c59e0c74e8f18861f4064c1f712562903411",
|
||||
"sha256:c1ba66c48b19cc9c2975c0d354f24058888cdc674bebadceb3cdc9ec403fb5d1",
|
||||
"sha256:c9f707b5bb73bf277d812ded9896f9512a43edff72712f31667d0a8c2f8e71ee",
|
||||
"sha256:d5422d6a1ea9b15577a9432e26608c73a78faf0b9039437b075cf322c92e98e7",
|
||||
"sha256:e5d5420053bbb3dd64c30e58f9363d7a9c27444c3648e61460c1237f9ec3fa14",
|
||||
"sha256:e868b0389c5ccfc092031a861d4e158ea164d8b7fdbb10e3b5689b4fc6498df6",
|
||||
"sha256:efd9d3abe5774404becdb0748178b48a218f1d8c44e0375475732211ea47c67e",
|
||||
"sha256:f8c02ec3c4c4fcb718fdf89a6c6f709b14949408e8cf2a2be5bfa9c49548fd85",
|
||||
"sha256:ffcf105ecdd9396e05a8e58e81faaaf34d3f9875f137c7372450baa5d77c9a54"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==1.23.3"
|
||||
},
|
||||
"packaging": {
|
||||
"hashes": [
|
||||
"sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb",
|
||||
"sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==21.3"
|
||||
},
|
||||
"pathspec": {
|
||||
"hashes": [
|
||||
"sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93",
|
||||
"sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==0.10.1"
|
||||
},
|
||||
"pillow": {
|
||||
"hashes": [
|
||||
"sha256:0030fdbd926fb85844b8b92e2f9449ba89607231d3dd597a21ae72dc7fe26927",
|
||||
"sha256:030e3460861488e249731c3e7ab59b07c7853838ff3b8e16aac9561bb345da14",
|
||||
"sha256:0ed2c4ef2451de908c90436d6e8092e13a43992f1860275b4d8082667fbb2ffc",
|
||||
"sha256:136659638f61a251e8ed3b331fc6ccd124590eeff539de57c5f80ef3a9594e58",
|
||||
"sha256:13b725463f32df1bfeacbf3dd197fb358ae8ebcd8c5548faa75126ea425ccb60",
|
||||
"sha256:1536ad017a9f789430fb6b8be8bf99d2f214c76502becc196c6f2d9a75b01b76",
|
||||
"sha256:15928f824870535c85dbf949c09d6ae7d3d6ac2d6efec80f3227f73eefba741c",
|
||||
"sha256:17d4cafe22f050b46d983b71c707162d63d796a1235cdf8b9d7a112e97b15bac",
|
||||
"sha256:1802f34298f5ba11d55e5bb09c31997dc0c6aed919658dfdf0198a2fe75d5490",
|
||||
"sha256:1cc1d2451e8a3b4bfdb9caf745b58e6c7a77d2e469159b0d527a4554d73694d1",
|
||||
"sha256:1fd6f5e3c0e4697fa7eb45b6e93996299f3feee73a3175fa451f49a74d092b9f",
|
||||
"sha256:254164c57bab4b459f14c64e93df11eff5ded575192c294a0c49270f22c5d93d",
|
||||
"sha256:2ad0d4df0f5ef2247e27fc790d5c9b5a0af8ade9ba340db4a73bb1a4a3e5fb4f",
|
||||
"sha256:2c58b24e3a63efd22554c676d81b0e57f80e0a7d3a5874a7e14ce90ec40d3069",
|
||||
"sha256:2d33a11f601213dcd5718109c09a52c2a1c893e7461f0be2d6febc2879ec2402",
|
||||
"sha256:336b9036127eab855beec9662ac3ea13a4544a523ae273cbf108b228ecac8437",
|
||||
"sha256:337a74fd2f291c607d220c793a8135273c4c2ab001b03e601c36766005f36885",
|
||||
"sha256:37ff6b522a26d0538b753f0b4e8e164fdada12db6c6f00f62145d732d8a3152e",
|
||||
"sha256:3d1f14f5f691f55e1b47f824ca4fdcb4b19b4323fe43cc7bb105988cad7496be",
|
||||
"sha256:4134d3f1ba5f15027ff5c04296f13328fecd46921424084516bdb1b2548e66ff",
|
||||
"sha256:4ad2f835e0ad81d1689f1b7e3fbac7b01bb8777d5a985c8962bedee0cc6d43da",
|
||||
"sha256:50dff9cc21826d2977ef2d2a205504034e3a4563ca6f5db739b0d1026658e004",
|
||||
"sha256:510cef4a3f401c246cfd8227b300828715dd055463cdca6176c2e4036df8bd4f",
|
||||
"sha256:5aed7dde98403cd91d86a1115c78d8145c83078e864c1de1064f52e6feb61b20",
|
||||
"sha256:69bd1a15d7ba3694631e00df8de65a8cb031911ca11f44929c97fe05eb9b6c1d",
|
||||
"sha256:6bf088c1ce160f50ea40764f825ec9b72ed9da25346216b91361eef8ad1b8f8c",
|
||||
"sha256:6e8c66f70fb539301e064f6478d7453e820d8a2c631da948a23384865cd95544",
|
||||
"sha256:74a04183e6e64930b667d321524e3c5361094bb4af9083db5c301db64cd341f3",
|
||||
"sha256:75e636fd3e0fb872693f23ccb8a5ff2cd578801251f3a4f6854c6a5d437d3c04",
|
||||
"sha256:7761afe0126d046974a01e030ae7529ed0ca6a196de3ec6937c11df0df1bc91c",
|
||||
"sha256:7888310f6214f19ab2b6df90f3f06afa3df7ef7355fc025e78a3044737fab1f5",
|
||||
"sha256:7b0554af24df2bf96618dac71ddada02420f946be943b181108cac55a7a2dcd4",
|
||||
"sha256:7c7b502bc34f6e32ba022b4a209638f9e097d7a9098104ae420eb8186217ebbb",
|
||||
"sha256:808add66ea764ed97d44dda1ac4f2cfec4c1867d9efb16a33d158be79f32b8a4",
|
||||
"sha256:831e648102c82f152e14c1a0938689dbb22480c548c8d4b8b248b3e50967b88c",
|
||||
"sha256:93689632949aff41199090eff5474f3990b6823404e45d66a5d44304e9cdc467",
|
||||
"sha256:96b5e6874431df16aee0c1ba237574cb6dff1dcb173798faa6a9d8b399a05d0e",
|
||||
"sha256:9a54614049a18a2d6fe156e68e188da02a046a4a93cf24f373bffd977e943421",
|
||||
"sha256:a138441e95562b3c078746a22f8fca8ff1c22c014f856278bdbdd89ca36cff1b",
|
||||
"sha256:a647c0d4478b995c5e54615a2e5360ccedd2f85e70ab57fbe817ca613d5e63b8",
|
||||
"sha256:a9c9bc489f8ab30906d7a85afac4b4944a572a7432e00698a7239f44a44e6efb",
|
||||
"sha256:ad2277b185ebce47a63f4dc6302e30f05762b688f8dc3de55dbae4651872cdf3",
|
||||
"sha256:adabc0bce035467fb537ef3e5e74f2847c8af217ee0be0455d4fec8adc0462fc",
|
||||
"sha256:b6d5e92df2b77665e07ddb2e4dbd6d644b78e4c0d2e9272a852627cdba0d75cf",
|
||||
"sha256:bc431b065722a5ad1dfb4df354fb9333b7a582a5ee39a90e6ffff688d72f27a1",
|
||||
"sha256:bdd0de2d64688ecae88dd8935012c4a72681e5df632af903a1dca8c5e7aa871a",
|
||||
"sha256:c79698d4cd9318d9481d89a77e2d3fcaeff5486be641e60a4b49f3d2ecca4e28",
|
||||
"sha256:cb6259196a589123d755380b65127ddc60f4c64b21fc3bb46ce3a6ea663659b0",
|
||||
"sha256:d5b87da55a08acb586bad5c3aa3b86505f559b84f39035b233d5bf844b0834b1",
|
||||
"sha256:dcd7b9c7139dc8258d164b55696ecd16c04607f1cc33ba7af86613881ffe4ac8",
|
||||
"sha256:dfe4c1fedfde4e2fbc009d5ad420647f7730d719786388b7de0999bf32c0d9fd",
|
||||
"sha256:ea98f633d45f7e815db648fd7ff0f19e328302ac36427343e4432c84432e7ff4",
|
||||
"sha256:ec52c351b35ca269cb1f8069d610fc45c5bd38c3e91f9ab4cbbf0aebc136d9c8",
|
||||
"sha256:eef7592281f7c174d3d6cbfbb7ee5984a671fcd77e3fc78e973d492e9bf0eb3f",
|
||||
"sha256:f07f1f00e22b231dd3d9b9208692042e29792d6bd4f6639415d2f23158a80013",
|
||||
"sha256:f3fac744f9b540148fa7715a435d2283b71f68bfb6d4aae24482a890aed18b59",
|
||||
"sha256:fa768eff5f9f958270b081bb33581b4b569faabf8774726b283edb06617101dc",
|
||||
"sha256:fac2d65901fb0fdf20363fbd345c01958a742f2dc62a8dd4495af66e3ff502a4"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==9.2.0"
|
||||
},
|
||||
"platformdirs": {
|
||||
"hashes": [
|
||||
"sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788",
|
||||
"sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==2.5.2"
|
||||
},
|
||||
"pycodestyle": {
|
||||
"hashes": [
|
||||
"sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785",
|
||||
"sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==2.9.1"
|
||||
},
|
||||
"pyflakes": {
|
||||
"hashes": [
|
||||
"sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2",
|
||||
"sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==2.5.0"
|
||||
},
|
||||
"pyparsing": {
|
||||
"hashes": [
|
||||
"sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb",
|
||||
"sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"
|
||||
],
|
||||
"markers": "python_full_version >= '3.6.8'",
|
||||
"version": "==3.0.9"
|
||||
},
|
||||
"python-dateutil": {
|
||||
"hashes": [
|
||||
"sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
|
||||
"sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
|
||||
],
|
||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||
"version": "==2.8.2"
|
||||
},
|
||||
"scipy": {
|
||||
"hashes": [
|
||||
"sha256:0419485dbcd0ed78c0d5bf234c5dd63e86065b39b4d669e45810d42199d49521",
|
||||
"sha256:09412eb7fb60b8f00b328037fd814d25d261066ebc43a1e339cdce4f7502877e",
|
||||
"sha256:26d28c468900e6d5fdb37d2812ab46db0ccd22c63baa095057871faa3a498bc9",
|
||||
"sha256:34441dfbee5b002f9e15285014fd56e5e3372493c3e64ae297bae2c4b9659f5a",
|
||||
"sha256:39ab9240cd215a9349c85ab908dda6d732f7d3b4b192fa05780812495536acc4",
|
||||
"sha256:3bc1ab68b9a096f368ba06c3a5e1d1d50957a86665fc929c4332d21355e7e8f4",
|
||||
"sha256:3c6f5d1d4b9a5e4fe5e14f26ffc9444fc59473bbf8d45dc4a9a15283b7063a72",
|
||||
"sha256:47d1a95bd9d37302afcfe1b84c8011377c4f81e33649c5a5785db9ab827a6ade",
|
||||
"sha256:71487c503e036740635f18324f62a11f283a632ace9d35933b2b0a04fd898c98",
|
||||
"sha256:7a412c476a91b080e456229e413792bbb5d6202865dae963d1e6e28c2bb58691",
|
||||
"sha256:825951b88f56765aeb6e5e38ac9d7d47407cfaaeb008d40aa1b45a2d7ea2731e",
|
||||
"sha256:8cc81ac25659fec73599ccc52c989670e5ccd8974cf34bacd7b54a8d809aff1a",
|
||||
"sha256:8d3faa40ac16c6357aaf7ea50394ea6f1e8e99d75e927a51102b1943b311b4d9",
|
||||
"sha256:90c805f30c46cf60f1e76e947574f02954d25e3bb1e97aa8a07bc53aa31cf7d1",
|
||||
"sha256:96d7cf7b25c9f23c59a766385f6370dab0659741699ecc7a451f9b94604938ce",
|
||||
"sha256:b97b479f39c7e4aaf807efd0424dec74bbb379108f7d22cf09323086afcd312c",
|
||||
"sha256:bc4e2c77d4cd015d739e75e74ebbafed59ba8497a7ed0fd400231ed7683497c4",
|
||||
"sha256:c61b4a91a702e8e04aeb0bfc40460e1f17a640977c04dda8757efb0199c75332",
|
||||
"sha256:d79da472015d0120ba9b357b28a99146cd6c17b9609403164b1a8ed149b4dfc8",
|
||||
"sha256:e8fe305d9d67a81255e06203454729405706907dccbdfcc330b7b3482a6c371d",
|
||||
"sha256:eb954f5aca4d26f468bbebcdc5448348eb287f7bea536c6306f62ea062f63d9a",
|
||||
"sha256:f7c39f7dbb57cce00c108d06d731f3b0e2a4d3a95c66d96bce697684876ce4d4",
|
||||
"sha256:f950a04b33e17b38ff561d5a0951caf3f5b47caa841edd772ffb7959f20a6af0"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==1.9.1"
|
||||
},
|
||||
"six": {
|
||||
"hashes": [
|
||||
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
|
||||
"sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
|
||||
],
|
||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||
"version": "==1.16.0"
|
||||
},
|
||||
"tomli": {
|
||||
"hashes": [
|
||||
"sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
|
||||
"sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"
|
||||
],
|
||||
"markers": "python_full_version < '3.11.0a7'",
|
||||
"version": "==2.0.1"
|
||||
}
|
||||
},
|
||||
"develop": {
|
||||
"asttokens": {
|
||||
"hashes": [
|
||||
"sha256:c61e16246ecfb2cde2958406b4c8ebc043c9e6d73aaa83c941673b35e5d3a76b",
|
||||
"sha256:e3305297c744ae53ffa032c45dc347286165e4ffce6875dc662b205db0623d86"
|
||||
],
|
||||
"version": "==2.0.8"
|
||||
},
|
||||
"backcall": {
|
||||
"hashes": [
|
||||
"sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e",
|
||||
"sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"
|
||||
],
|
||||
"version": "==0.2.0"
|
||||
},
|
||||
"debugpy": {
|
||||
"hashes": [
|
||||
"sha256:34d2cdd3a7c87302ba5322b86e79c32c2115be396f3f09ca13306d8a04fe0f16",
|
||||
"sha256:3c9f985944a30cfc9ae4306ac6a27b9c31dba72ca943214dad4a0ab3840f6161",
|
||||
"sha256:4e255982552b0edfe3a6264438dbd62d404baa6556a81a88f9420d3ed79b06ae",
|
||||
"sha256:5ad571a36cec137ae6ed951d0ff75b5e092e9af6683da084753231150cbc5b25",
|
||||
"sha256:6efc30325b68e451118b795eff6fe8488253ca3958251d5158106d9c87581bc6",
|
||||
"sha256:7c302095a81be0d5c19f6529b600bac971440db3e226dce85347cc27e6a61908",
|
||||
"sha256:84c39940a0cac410bf6aa4db00ba174f973eef521fbe9dd058e26bcabad89c4f",
|
||||
"sha256:86d784b72c5411c833af1cd45b83d80c252b77c3bfdb43db17c441d772f4c734",
|
||||
"sha256:adcfea5ea06d55d505375995e150c06445e2b20cd12885bcae566148c076636b",
|
||||
"sha256:b8deaeb779699350deeed835322730a3efec170b88927debc9ba07a1a38e2585",
|
||||
"sha256:c4b2bd5c245eeb49824bf7e539f95fb17f9a756186e51c3e513e32999d8846f3",
|
||||
"sha256:c4cd6f37e3c168080d61d698390dfe2cd9e74ebf80b448069822a15dadcda57d",
|
||||
"sha256:cca23cb6161ac89698d629d892520327dd1be9321c0960e610bbcb807232b45d",
|
||||
"sha256:d5c814596a170a0a58fa6fad74947e30bfd7e192a5d2d7bd6a12156c2899e13a",
|
||||
"sha256:daadab4403427abd090eccb38d8901afd8b393e01fd243048fab3f1d7132abb4",
|
||||
"sha256:dda8652520eae3945833e061cbe2993ad94a0b545aebd62e4e6b80ee616c76b2",
|
||||
"sha256:e8922090514a890eec99cfb991bab872dd2e353ebb793164d5f01c362b9a40bf",
|
||||
"sha256:fc233a0160f3b117b20216f1169e7211b83235e3cd6749bcdd8dbb72177030c7"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==1.6.3"
|
||||
},
|
||||
"decorator": {
|
||||
"hashes": [
|
||||
"sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330",
|
||||
"sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"
|
||||
],
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==5.1.1"
|
||||
},
|
||||
"entrypoints": {
|
||||
"hashes": [
|
||||
"sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4",
|
||||
"sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==0.4"
|
||||
},
|
||||
"executing": {
|
||||
"hashes": [
|
||||
"sha256:550d581b497228b572235e633599133eeee67073c65914ca346100ad56775349",
|
||||
"sha256:98daefa9d1916a4f0d944880d5aeaf079e05585689bebd9ff9b32e31dd5e1017"
|
||||
],
|
||||
"version": "==1.0.0"
|
||||
},
|
||||
"ipykernel": {
|
||||
"hashes": [
|
||||
"sha256:b81d57b0e171670844bf29cdc11562b1010d3da87115c4513e0ee660a8368765",
|
||||
"sha256:befe3736944b21afec8e832725e9a45f254c8bd9afc40b61d6661c97e45aff5a"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==6.15.3"
|
||||
},
|
||||
"ipython": {
|
||||
"hashes": [
|
||||
"sha256:097bdf5cd87576fd066179c9f7f208004f7a6864ee1b20f37d346c0bcb099f84",
|
||||
"sha256:6f090e29ab8ef8643e521763a4f1f39dc3914db643122b1e9d3328ff2e43ada2"
|
||||
],
|
||||
"markers": "python_version >= '3.8'",
|
||||
"version": "==8.5.0"
|
||||
},
|
||||
"jedi": {
|
||||
"hashes": [
|
||||
"sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d",
|
||||
"sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==0.18.1"
|
||||
},
|
||||
"jupyter-client": {
|
||||
"hashes": [
|
||||
"sha256:3c58466a1b8d55dba0bf3ce0834e4f5b7760baf98d1d73db0add6f19de9ecd1d",
|
||||
"sha256:b33222bdc9dd1714228bd286af006533a0abe2bbc093e8f3d29dc0b91bdc2be4"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==7.3.5"
|
||||
},
|
||||
"jupyter-core": {
|
||||
"hashes": [
|
||||
"sha256:2e5f244d44894c4154d06aeae3419dd7f1b0ef4494dc5584929b398c61cfd314",
|
||||
"sha256:715e22bb6cc7db3718fddfac1f69f1c7e899ca00e42bdfd4bf3705452b9fd84a"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==4.11.1"
|
||||
},
|
||||
"matplotlib-inline": {
|
||||
"hashes": [
|
||||
"sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311",
|
||||
"sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"
|
||||
],
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==0.1.6"
|
||||
},
|
||||
"nest-asyncio": {
|
||||
"hashes": [
|
||||
"sha256:b98e3ec1b246135e4642eceffa5a6c23a3ab12c82ff816a92c612d68205813b2",
|
||||
"sha256:e442291cd942698be619823a17a86a5759eabe1f8613084790de189fe9e16d65"
|
||||
],
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==1.5.5"
|
||||
},
|
||||
"packaging": {
|
||||
"hashes": [
|
||||
"sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb",
|
||||
"sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==21.3"
|
||||
},
|
||||
"parso": {
|
||||
"hashes": [
|
||||
"sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0",
|
||||
"sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==0.8.3"
|
||||
},
|
||||
"pexpect": {
|
||||
"hashes": [
|
||||
"sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937",
|
||||
"sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"
|
||||
],
|
||||
"markers": "sys_platform != 'win32'",
|
||||
"version": "==4.8.0"
|
||||
},
|
||||
"pickleshare": {
|
||||
"hashes": [
|
||||
"sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca",
|
||||
"sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"
|
||||
],
|
||||
"version": "==0.7.5"
|
||||
},
|
||||
"prompt-toolkit": {
|
||||
"hashes": [
|
||||
"sha256:9696f386133df0fc8ca5af4895afe5d78f5fcfe5258111c2a79a1c3e41ffa96d",
|
||||
"sha256:9ada952c9d1787f52ff6d5f3484d0b4df8952787c087edf6a1f7c2cb1ea88148"
|
||||
],
|
||||
"markers": "python_full_version >= '3.6.2'",
|
||||
"version": "==3.0.31"
|
||||
},
|
||||
"psutil": {
|
||||
"hashes": [
|
||||
"sha256:14b29f581b5edab1f133563272a6011925401804d52d603c5c606936b49c8b97",
|
||||
"sha256:256098b4f6ffea6441eb54ab3eb64db9ecef18f6a80d7ba91549195d55420f84",
|
||||
"sha256:39ec06dc6c934fb53df10c1672e299145ce609ff0611b569e75a88f313634969",
|
||||
"sha256:404f4816c16a2fcc4eaa36d7eb49a66df2d083e829d3e39ee8759a411dbc9ecf",
|
||||
"sha256:42638876b7f5ef43cef8dcf640d3401b27a51ee3fa137cb2aa2e72e188414c32",
|
||||
"sha256:4642fd93785a29353d6917a23e2ac6177308ef5e8be5cc17008d885cb9f70f12",
|
||||
"sha256:4fb54941aac044a61db9d8eb56fc5bee207db3bc58645d657249030e15ba3727",
|
||||
"sha256:561dec454853846d1dd0247b44c2e66a0a0c490f937086930ec4b8f83bf44f06",
|
||||
"sha256:5d39e3a2d5c40efa977c9a8dd4f679763c43c6c255b1340a56489955dbca767c",
|
||||
"sha256:614337922702e9be37a39954d67fdb9e855981624d8011a9927b8f2d3c9625d9",
|
||||
"sha256:67b33f27fc0427483b61563a16c90d9f3b547eeb7af0ef1b9fe024cdc9b3a6ea",
|
||||
"sha256:68b35cbff92d1f7103d8f1db77c977e72f49fcefae3d3d2b91c76b0e7aef48b8",
|
||||
"sha256:7cbb795dcd8ed8fd238bc9e9f64ab188f3f4096d2e811b5a82da53d164b84c3f",
|
||||
"sha256:8f024fbb26c8daf5d70287bb3edfafa22283c255287cf523c5d81721e8e5d82c",
|
||||
"sha256:91aa0dac0c64688667b4285fa29354acfb3e834e1fd98b535b9986c883c2ce1d",
|
||||
"sha256:94e621c6a4ddb2573d4d30cba074f6d1aa0186645917df42c811c473dd22b339",
|
||||
"sha256:9770c1d25aee91417eba7869139d629d6328a9422ce1cdd112bd56377ca98444",
|
||||
"sha256:b1928b9bf478d31fdffdb57101d18f9b70ed4e9b0e41af751851813547b2a9ab",
|
||||
"sha256:b2f248ffc346f4f4f0d747ee1947963613216b06688be0be2e393986fe20dbbb",
|
||||
"sha256:b315febaebae813326296872fdb4be92ad3ce10d1d742a6b0c49fb619481ed0b",
|
||||
"sha256:b3591616fa07b15050b2f87e1cdefd06a554382e72866fcc0ab2be9d116486c8",
|
||||
"sha256:b4018d5f9b6651f9896c7a7c2c9f4652e4eea53f10751c4e7d08a9093ab587ec",
|
||||
"sha256:d75291912b945a7351d45df682f9644540d564d62115d4a20d45fa17dc2d48f8",
|
||||
"sha256:dc9bda7d5ced744622f157cc8d8bdd51735dafcecff807e928ff26bdb0ff097d",
|
||||
"sha256:e3ac2c0375ef498e74b9b4ec56df3c88be43fe56cac465627572dbfb21c4be34",
|
||||
"sha256:e4c4a7636ffc47b7141864f1c5e7d649f42c54e49da2dd3cceb1c5f5d29bfc85",
|
||||
"sha256:ed29ea0b9a372c5188cdb2ad39f937900a10fb5478dc077283bf86eeac678ef1",
|
||||
"sha256:f40ba362fefc11d6bea4403f070078d60053ed422255bd838cd86a40674364c9",
|
||||
"sha256:f4cb67215c10d4657e320037109939b1c1d2fd70ca3d76301992f89fe2edb1f1",
|
||||
"sha256:f7929a516125f62399d6e8e026129c8835f6c5a3aab88c3fff1a05ee8feb840d",
|
||||
"sha256:fd331866628d18223a4265371fd255774affd86244fc307ef66eaf00de0633d5",
|
||||
"sha256:feb861a10b6c3bb00701063b37e4afc754f8217f0f09c42280586bd6ac712b5c"
|
||||
],
|
||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||
"version": "==5.9.2"
|
||||
},
|
||||
"ptyprocess": {
|
||||
"hashes": [
|
||||
"sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35",
|
||||
"sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"
|
||||
],
|
||||
"version": "==0.7.0"
|
||||
},
|
||||
"pure-eval": {
|
||||
"hashes": [
|
||||
"sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350",
|
||||
"sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"
|
||||
],
|
||||
"version": "==0.2.2"
|
||||
},
|
||||
"pygments": {
|
||||
"hashes": [
|
||||
"sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1",
|
||||
"sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==2.13.0"
|
||||
},
|
||||
"pyparsing": {
|
||||
"hashes": [
|
||||
"sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb",
|
||||
"sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"
|
||||
],
|
||||
"markers": "python_full_version >= '3.6.8'",
|
||||
"version": "==3.0.9"
|
||||
},
|
||||
"python-dateutil": {
|
||||
"hashes": [
|
||||
"sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
|
||||
"sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
|
||||
],
|
||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||
"version": "==2.8.2"
|
||||
},
|
||||
"pyzmq": {
|
||||
"hashes": [
|
||||
"sha256:0584420cbd2dac77f81bdc4b9da2635a54300563d4632433b08cb1f505341ef0",
|
||||
"sha256:0775b65e79cccfca2b017e80ffe6dbd224b035a47245c4140b08e93996425942",
|
||||
"sha256:0a07fb73ae006a5b565d19232e5a6592fd7c93e57e67c2e592bf0b21f1676767",
|
||||
"sha256:13b008bd142c9f6079ad75a30504eef2291502e9eac90e722b16fcf9ce856147",
|
||||
"sha256:1bdec8988cad1f9a8453b4d00fd11598a91604cd9b205640e98b2f22e0435921",
|
||||
"sha256:1c23568e1581f637b1a1e1fd15dcd5e9165332c94bf8101c562e7c50640d673e",
|
||||
"sha256:1f200cdca2fc842749a3f263ccf9e4b50e732ad14f53b60faf68ef656b75c32a",
|
||||
"sha256:201e4d5733cecfd469d9ceee57500a0f365f85d6f14dd524105e2a0be8cd93c1",
|
||||
"sha256:2e5a398955b1cfdd85dd699f2390661b7bbe9edcbadd70a444c79c69e6c31c91",
|
||||
"sha256:3823e5e613a61948b2e6b85fd91f872772717d24cd1df871836665d4c56d6b34",
|
||||
"sha256:38e9ff2918d50a588e56aa80dae0373ef9f67512fc5691f95db2f59edabc083e",
|
||||
"sha256:40cdb50e82393253d340b6a357474588eb01cfd90b06231d5bfbc14490490b1b",
|
||||
"sha256:44c1dc858b76d2ab28f5ea040dd5e816a71624a8cf38d4ca3208006fd2a9375e",
|
||||
"sha256:452c3d5bfbaf96f32ef20673e6ba238355891884009f0c87e0f97a985293ef42",
|
||||
"sha256:460f0ff945d4b46c2d568941be33cf08954fca1e3239cf6a6ee03b1371de8f64",
|
||||
"sha256:4ec8847ab93200a94fd3e88e2824a6bba9a46d28161f1bf0be24f2237c40c291",
|
||||
"sha256:52d881c33f8db5ffcb0aabc14cc71098453f4700511195cebca846000b44b080",
|
||||
"sha256:5439bef77fd3818c20e1bf5657836e105e4e48e1a7996e24ebb55402a681934e",
|
||||
"sha256:62ee069fe338d0b057b81e752dad2b9b6b206ba8570a878dbbe8b93b7b99ebb1",
|
||||
"sha256:6814a6add1b7cb76e3fdfd961ce4c48c1f0a29e82bdb3d060a669b85bc6db454",
|
||||
"sha256:8361c90701fc6ff5f16c81c969563c6915402fbecb2ddc9c5063fec0238e5e52",
|
||||
"sha256:844040d44cc4320cdffb258fe03768ff0b37e710d56a70dd1f6c2902738f1e28",
|
||||
"sha256:8988209d5efae9b5c9297fb48d153e2528384c1afe2c9fd8eeb474cd6e765199",
|
||||
"sha256:8a93abd67a46c6b91f28a7513b9f8b9a5432fd573c3d6444c083e07209bf96e4",
|
||||
"sha256:99bb8cff279f7d1f516919d82b35ed0796c53ce7da7dca191fabfa4c53f47740",
|
||||
"sha256:9ed10f5a942a2903a722d63806b7a9d2e0a966c038100dc763483d8fbe8ea074",
|
||||
"sha256:a5b9471e5e507f51f4c0acabec60a7ae2ea218ac6134a8e5ec5674845347a63a",
|
||||
"sha256:a5cdbede23aae133e50f786adc4a2cacf60bddde649e3dc122c32368daa2c007",
|
||||
"sha256:aa6d0dfa94ce89d050dca0104389e10c537715bf10e5b0bfe5ece79f17f1719e",
|
||||
"sha256:ae33cb195304ac16996184b115f9e27eb9f0b14062e97fbd1d446e3e4a594ff0",
|
||||
"sha256:b1ef471c62c3d0681cfbaa8bbaf96f22e20cafd391ecad8a43317f6b1598478e",
|
||||
"sha256:b94a3453a18bb914b2cac1ac38c09f980a3c86a8cd0bb744dd6bd03ab8ff958a",
|
||||
"sha256:be67e7f48fce8dbefd602f779c7382c874a1a1a3d08f375366c4d28baaa0bfd4",
|
||||
"sha256:c37c0046d04c0fdd99a9a31d6a9ce7d703cca3b7fdde5738603503dfba58a25f",
|
||||
"sha256:dfde6624d3d99d9a67235b60ae13be1a6ffce2f1de3cd2be9900f011d5d6a6a6",
|
||||
"sha256:e0128c7b723984e31c1b0df5bc532715defd13bf64d8d9eddd7207d093759ae4",
|
||||
"sha256:e24d7bda7a32ff35d0c914a52dd920a408f73d7e4b93d6755d7c67e819a8cd8c",
|
||||
"sha256:e9cd5c7449f297a1b53a4803413db907a8cad1178435e2879c1b92816f2bbe56",
|
||||
"sha256:e9e3fa94fa1e58763a7b824b8e0015d93c9fdd8e449d0218d13d01172e3d1539",
|
||||
"sha256:eadf1d3841c2155b68ef49147253fd4ac1447a972d01c08248114edc4d3ba9d5",
|
||||
"sha256:eb3b8acb5dc33ec812d79f35b85fddc43d8f75b65c00c635ee3c0b527e11c8ea",
|
||||
"sha256:ebdb43e947291c5cb80ef6c7d525f64bc4ed685de43f855ba0cf2b0fd8052e3a",
|
||||
"sha256:ee24b94b5ae22af9148e597f512fae8383908ca07d3b7f99b349679fede4d7d3",
|
||||
"sha256:f969214a9ebf1175a8aba863d6f1220174130188686d4ed475d138a240e60c1c",
|
||||
"sha256:fc21a74f337298840f59f21a12fbf6ec1de798cd69d6b331ef9ed88ac8cb18f0",
|
||||
"sha256:fc2c363f68bbb9fea6b8137c432c6df9d7c8c76b01549c4410c506dac9e30663",
|
||||
"sha256:ff4e510a9509d36359c7af4684e73489cdd53c781dd4bc9b07dc808fab56cc48"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==24.0.0"
|
||||
},
|
||||
"six": {
|
||||
"hashes": [
|
||||
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
|
||||
"sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
|
||||
],
|
||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||
"version": "==1.16.0"
|
||||
},
|
||||
"stack-data": {
|
||||
"hashes": [
|
||||
"sha256:66d2ebd3d7f29047612ead465b6cae5371006a71f45037c7e2507d01367bce3b",
|
||||
"sha256:715c8855fbf5c43587b141e46cc9d9339cc0d1f8d6e0f98ed0d01c6cb974e29f"
|
||||
],
|
||||
"version": "==0.5.0"
|
||||
},
|
||||
"tornado": {
|
||||
"hashes": [
|
||||
"sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca",
|
||||
"sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72",
|
||||
"sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23",
|
||||
"sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8",
|
||||
"sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b",
|
||||
"sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9",
|
||||
"sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13",
|
||||
"sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75",
|
||||
"sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac",
|
||||
"sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e",
|
||||
"sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==6.2"
|
||||
},
|
||||
"traitlets": {
|
||||
"hashes": [
|
||||
"sha256:3f2c4e435e271592fe4390f1746ea56836e3a080f84e7833f0f801d9613fec39",
|
||||
"sha256:93663cc8236093d48150e2af5e2ed30fc7904a11a6195e21bab0408af4e6d6c8"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==5.4.0"
|
||||
},
|
||||
"wcwidth": {
|
||||
"hashes": [
|
||||
"sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784",
|
||||
"sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"
|
||||
],
|
||||
"version": "==0.2.5"
|
||||
}
|
||||
}
|
||||
}
|
BIN
assets/tx_lines/reflection_complex.gif
Normal file
After Width: | Height: | Size: 1.8 MiB |
BIN
assets/tx_lines/reflection_matched.gif
Normal file
After Width: | Height: | Size: 1.4 MiB |
BIN
assets/tx_lines/reflection_open.gif
Normal file
After Width: | Height: | Size: 2.1 MiB |
BIN
assets/tx_lines/reflection_real.gif
Normal file
After Width: | Height: | Size: 1.7 MiB |
BIN
assets/tx_lines/reflection_short.gif
Normal file
After Width: | Height: | Size: 2.1 MiB |
BIN
assets/tx_lines/superposition.gif
Normal file
After Width: | Height: | Size: 1.6 MiB |
BIN
assets/tx_lines/tx_line.gif
Normal file
After Width: | Height: | Size: 1.2 MiB |
37
book/00_background.md
Normal file
|
@ -0,0 +1,37 @@
|
|||
# Background
|
||||
|
||||
## Phasors
|
||||
|
||||
Complex numbers are wonderful creatures. Rather than getting stuck in trig-land with real sinusoidal signals we can instead represent them as complex exponentials.
|
||||
|
||||
$$V(t) = v_0 \cos(\omega t + \theta) = \real\big[v_0e^{j (\omega t + \theta)} \big]$$
|
||||
|
||||
We simply write phasor $V(t) = v_0e^{j (\omega t + \theta)}$ and agree to ignore the imaginary component. That's all there is. Welcome to phasors.
|
||||
|
||||
In some situations we truly have complex signals (for instance in DSP when using a quadrature demodulator) which lets us have negative frequencies. For the encoding/modulation/communication side of radios this is relevant, however in analog RF land we can mostly just ignore the imaginary part.
|
||||
|
||||
Since linear systems don't change the frequency of a signal and time shifts are equivalent to phase shifts (at one frequency), we can often use the following shorthand where time dependence is implied. This is particularly useful for simplifying multivariate functions to be dependent on only one variable.
|
||||
|
||||
$$V(t) = v_0e^{j (\omega t + \theta)} = v_0e^{j \theta}e^{j \omega t}$$
|
||||
|
||||
$$\hat{V} = v_0e^{j \theta}$$
|
||||
|
||||
## Impedance
|
||||
|
||||
$$
|
||||
\begin{align}
|
||||
Z &= R + jX \\
|
||||
Y &= G + jB = 1/Z
|
||||
\end{align}
|
||||
$$
|
||||
|
||||
| Symbol | Name | Unit |
|
||||
|---|---|---|
|
||||
| Z | Impedance | $\Omega$
|
||||
| R | Resistance | $\Omega$
|
||||
| X | Reactance | $\Omega$
|
||||
| Y | Admittance | $S$
|
||||
| G | Conductance | $S$
|
||||
| B | Susceptance | $S$
|
||||
|
||||
Typically we use impedance notation however admittance, conductance, and susceptance are particularly useful when components are placed in parallel
|
182
book/01_tx_lines.md
Normal file
|
@ -0,0 +1,182 @@
|
|||
# Transmission Lines
|
||||
|
||||
![](../assets/tx_lines/tx_line.gif)
|
||||
|
||||
## Superposition
|
||||
|
||||
All solutions to this differential equation have the form
|
||||
|
||||
$$
|
||||
\begin{align}
|
||||
V(t, z) = e^{j (\omega t - vz)} + e^{j (\omega t + vz)}
|
||||
\end{align}
|
||||
$$
|
||||
|
||||
Therefore we can look at a transmission line as having the superposition of two independent waves propagating forward (toward $+z$) and in reverse (toward $-z$).
|
||||
|
||||
$$
|
||||
\begin{align}
|
||||
V_f(t, z) &= e^{j (\omega t - vz)} \\
|
||||
V_r(t, z) &= e^{j (\omega t + vz)}
|
||||
\end{align}
|
||||
$$
|
||||
|
||||
![Superpositition of Vf, Vr](../assets/tx_lines/superposition.gif)
|
||||
|
||||
## Reflections
|
||||
|
||||
At the end of a transmission line, voltage and current are related by the impedance of the load.
|
||||
Assuming the load is situated at $z=0$ the following boundary conditions are imposed:
|
||||
|
||||
$$
|
||||
\begin{align}
|
||||
\hat{I}(z=0) &= \hat{I}_f(z=0) - \hat{I}_r(z=0) \\
|
||||
\hat{V}(z=0) &= \hat{V}_f(z=0) + \hat{V}_r(z=0) \\
|
||||
\hat{V}(z=0) &= Z_L\hat{I}(z=0)
|
||||
\end{align}
|
||||
$$
|
||||
|
||||
We can already relate voltage and current for both forward and reverse propagating waves on the transmission line.
|
||||
|
||||
$$
|
||||
\begin{align}
|
||||
\hat{V}_f(z) &= Z_0\hat{I}_f(z) \\
|
||||
\hat{V}_r(z) &= Z_0\hat{I}_r(z)
|
||||
\end{align}
|
||||
$$
|
||||
|
||||
By combining these constraints we can relate the reverse wave to the forward wave due to the load:
|
||||
|
||||
$$
|
||||
\begin{align}
|
||||
Z_0\hat{I}_f(z=0) + Z_0\hat{I}_r(z=0) &= Z_L\big(\hat{I}_f(z=0) - \hat{I}_r(z=0)\big) \\
|
||||
\hat{I}_r(z=0) &= \frac{Z_L - Z_0}{Z_L + Z_0} \hat{I}_f(z=0) \\
|
||||
\hat{V}_r(z=0) &= \frac{Z_L - Z_0}{Z_L + Z_0} \hat{V}_f(z=0)
|
||||
\end{align}
|
||||
$$
|
||||
|
||||
|
||||
We define the reflection coefficient as this ratio:
|
||||
|
||||
$$
|
||||
\begin{align}
|
||||
\Gamma &= \frac{\hat{V}_r(z=0)}{\hat{V}_f(z=0)} \\
|
||||
&= \frac{Z_L - Z_0}{Z_L + Z_0}
|
||||
\end{align}
|
||||
$$
|
||||
|
||||
Note that if $Z_L = Z_0$ then $\Gamma = 0$ and there is no reflection. This is generally desired since no power is lost to a reflection and resonances need not be considered (we will look at this in a moment).
|
||||
|
||||
| Condition | $\Gamma$
|
||||
|---|---|
|
||||
| Matched | 0
|
||||
| Open | 1
|
||||
| Short | -1
|
||||
|
||||
Also note that this is only valid at $z=0$ since the phase of $\hat{V}_f$ and $\hat{V}_r$ vary with opposite signs as we move along the transmission line so their relationship changes with position.
|
||||
|
||||
A perfectly matched load results in no reflected wave.
|
||||
![Reflection with Z_L = Z0](../assets/tx_lines/reflection_matched.gif)
|
||||
|
||||
Open and short circuits both have locations where no voltage is seen. Note that both of these cases have an equal amplitude reflected wave, they just have different phase. This is actually true of all lossless loads (ideal capacitor and inductor as well).
|
||||
![Reflection with Z_L = inf](../assets/tx_lines/reflection_open.gif)
|
||||
|
||||
![Reflection with Z_L = 0](../assets/tx_lines/reflection_short.gif)
|
||||
|
||||
It is also worth noting that the peak voltage on the line is $2V$ when we only excited it with $1V$. How is this possible? Remember that there is another end of the transmission line on the left which could cause a re-reflection of $V_r$ to combine with $V_f$ however we are assuming no such reflection exists. This means that the impedance seen at the left end of the transmission line must be matched to $Z_0$, meaning that the driver has a series impedance equal to $Z_0$. Therefore $V_f = \frac{1}{2} V_{source}$ and the total voltage $V$ never exceeds $V_{source}$.
|
||||
|
||||
An imperfectly matched but lossy ($R \ne 0$) load results in a reduced amplitude reflected wave
|
||||
![Reflection with arbitrary real Z_L](../assets/tx_lines/reflection_real.gif)
|
||||
|
||||
![Reflection with arbitrary complex Z_L](../assets/tx_lines/reflection_complex.gif)
|
||||
|
||||
|
||||
You should notice that not all locations along the transmission line see the same peak voltages (shaded region in the above plots). This is a useful property for determining how well matched a device is. A peak detector can be physically moved along a transmission line to find the peaks and troughs of this standing wave. This ratio is called the Voltage Standing Wave Ratio (VSWR). These days VSWR is usually calculated from other measurements.
|
||||
|
||||
$$
|
||||
\begin{align}
|
||||
\text{VSWR} &= \frac{1 + |\Gamma|}{1 - |\Gamma|}
|
||||
\end{align}
|
||||
$$
|
||||
TODO: derive VSWR
|
||||
|
||||
VSWR is often reported as $N:1$. I'm not sure why since this carries no additional information than just $N$ but its a convention.
|
||||
For passive networks (no power is added), $0 < |\Gamma| < 1$ so $1 < \text{VSWR} < \infty$ where 1 is perfectly matched. VSWR does a good job of highlihting poorly-matched networks while making well-matched and decently-matched networks appear similar.
|
||||
In general, unless dealing with very high-Q structures (which can be de-tuned by additional resonances) you can consider $\text{VSWR} < 2$ to be well matched.
|
||||
|
||||
TODO: move these comments somewhere else
|
||||
I have mostly seen VSWR used for antenna or system interface specifications. It is particularly useful for worst-case estimates of cascaded performance since it is additive. We will get to this later.
|
||||
|
||||
## Impedance Transformation
|
||||
|
||||
If we were to cut a transmission line at position $z$ and look into the loaded line from the left end, we can determine the input impedance of the combined transmission line + load circuit.
|
||||
|
||||
TODO: derive
|
||||
|
||||
### Quarter Wave Transformer
|
||||
|
||||
Note that if a txline is exactly $\ell = \lambda/4$ in length, this simplifies quite nicely
|
||||
|
||||
$$
|
||||
\begin{align}
|
||||
Z &= \frac{Z_0^2}{Z_L}
|
||||
\end{align}
|
||||
$$
|
||||
|
||||
This property is frequently used in microwave networks for a variety of purposes.
|
||||
|
||||
One of the simplest uses is to provide ESD protection to a system by adding a shorted $\lambda/4$ stub (in parallel) near a connector.
|
||||
$$
|
||||
\begin{align}
|
||||
Z_{stub} &= \frac{Z_0^2}{0} \\
|
||||
&= \infty
|
||||
\end{align}
|
||||
$$
|
||||
So the short looks like an open and the stub disappears at the design frequency, however at much lower frequencies ($\ell << \lambda/4$) where we have most ESD concerns the short protects downstream devices from voltage spikes. This method typically works above a few GHz, I'm not sure exactly how low it'll work though $\lambda/4$ becomes ponderously large and the point becomes moot.
|
||||
|
||||
$\ell = \lambda/2$ has an even simpler result
|
||||
|
||||
$$
|
||||
\begin{align}
|
||||
Z &= Z_L
|
||||
\end{align}
|
||||
$$
|
||||
|
||||
The reason we see this repetition after only $\lambda/2$ rather than a full $\lambda$ is because the wave must travel in both the forward and reverse directions along the txline before we see it again. In other words, the total distance travelled by the wave is $2\ell$.
|
||||
|
||||
I have not found half-wave lines to be very useful in practice since additional line length will result in narrower-band networks, however it can sometimes be useful to escape a particularly tight section in PCB layout.
|
||||
|
||||
## Smith Charts
|
||||
|
||||
A Smith chart is simply a complex plot of $\Gamma$ with grid lines of constant resistance and reactance.
|
||||
Sometimes lines of constant conductance and susceptance are added in place of or in addition to resistance/reactance if we want to work in admittance rather than impedance. Since a Smith chart is merely showing $\Gamma$ which is dependent on $Z_0$, the impedance/admittance lines are often labelled with normalized impedance ($Z_L/Z_0$).
|
||||
|
||||
TODO: make plot
|
||||
|
||||
If an impedance $Z_S$ is placed in series with a load, we can fall back on circuit theory. $Z = Z_S + Z_1$
|
||||
Lets look at cases where $Z_S$ is purely real or purely imaginary.
|
||||
|
||||
* If $Z_S = R_S$, then $Z = R_S + R_1 + j X_1$
|
||||
|
||||
Similarly, if an admittance $Y_P$ is placed in parallel (shunt) with the load, then $Y = Y_P + Y_1$
|
||||
Again if $Y_P$ is purely real or imaginary,
|
||||
|
||||
| Condition | Smith Chart
|
||||
|---|---|
|
||||
| Series transmission line | counter clockwise (VSWR)
|
||||
| Series resistor | right (R)
|
||||
| Series capacitor | down (X)
|
||||
| Series inductor | up (X)
|
||||
| Shunt resistor | left (G)
|
||||
| Shunt capacitor | up (B)
|
||||
| Shunt inductor | down (B)
|
||||
|
||||
TODO: make plots
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
0
book/02_maxwell_eq.md
Normal file
0
book/03_system_cascade.md
Normal file
0
book/04_filters.md
Normal file
0
book/05_frequency_planning.md
Normal file
0
book/06_dsp.md
Normal file
7
book/07_noise.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
## Thermal Noise
|
||||
|
||||
## Phase Noise
|
||||
|
||||
## Quantization Noise
|
||||
|
||||
## Shot Noise
|
0
book/08_antennas.md
Normal file
0
book/09_beamforming.md
Normal file
191
plots/01_tx_lines.py
Normal file
|
@ -0,0 +1,191 @@
|
|||
import logging
|
||||
from abc import ABC, abstractmethod
|
||||
from pathlib import Path
|
||||
from typing import Tuple, Union
|
||||
|
||||
import numpy as np
|
||||
from matplotlib import pyplot as plt
|
||||
from matplotlib.animation import FuncAnimation
|
||||
from matplotlib.axes import Axes
|
||||
from matplotlib.figure import Figure
|
||||
|
||||
dir_ = Path(__file__).parent.resolve()
|
||||
dir_root = dir_ / ".."
|
||||
dir_assets = dir_root / "assets"
|
||||
|
||||
log = logging.Logger(__name__)
|
||||
log.setLevel(logging.INFO)
|
||||
|
||||
|
||||
class AnimatedPlot(ABC):
|
||||
fig: Figure
|
||||
ax: Union[Axes, Tuple[Axes]]
|
||||
|
||||
def __init__(self, frames: int = 100):
|
||||
self.frames = int(frames)
|
||||
self.fig, self.ax = plt.subplots(1, 1)
|
||||
|
||||
def save(self, filename: Union[Path, str], framerate: int = 30):
|
||||
log.info(f"Generating animation: {self.__class__}...")
|
||||
an = FuncAnimation(
|
||||
self.fig,
|
||||
self.update,
|
||||
frames=np.linspace(0, 1, self.frames, endpoint=False),
|
||||
init_func=self.init,
|
||||
blit=False,
|
||||
)
|
||||
an.save(str(filename), writer="pillow", fps=framerate)
|
||||
log.info(f"Generating animation: {self.__class__}...Done")
|
||||
|
||||
def init(self) -> None:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update(self, t: float) -> None:
|
||||
pass
|
||||
|
||||
|
||||
class TxLinePlot(AnimatedPlot):
|
||||
x = np.linspace(-2 * np.pi, 2 * np.pi, 500)
|
||||
|
||||
def update(self, t: float):
|
||||
v = 2 * np.pi
|
||||
self.ax.clear()
|
||||
|
||||
self.ax.plot(self.x, np.real(np.exp(1j * (t * v - self.x))), label="$V$")
|
||||
|
||||
self.ax.autoscale(enable=True, axis="x", tight=True)
|
||||
self.ax.set_ylim(-1.1, 1.1)
|
||||
|
||||
self.ax.set_xlabel("z")
|
||||
self.ax.set_ylabel("V")
|
||||
self.ax.set_title(f"$t={t:0.2f}$")
|
||||
|
||||
def format_func(value, tick_number):
|
||||
# find number of multiples of pi/2
|
||||
N = int(np.round(2 * value / np.pi))
|
||||
if N == 0:
|
||||
return "0"
|
||||
elif np.abs(N) == 1:
|
||||
return r"${0}\pi/2$".format("-" if N < 0 else "")
|
||||
elif np.abs(N) == 2:
|
||||
return r"${0}\pi$".format("-" if N < 0 else "")
|
||||
elif N % 2 > 0:
|
||||
return r"${0}\pi/2$".format(N)
|
||||
else:
|
||||
return r"${0}\pi$".format(N // 2)
|
||||
|
||||
self.ax.xaxis.set_major_locator(plt.MultipleLocator(np.pi / 2))
|
||||
self.ax.xaxis.set_major_formatter(plt.FuncFormatter(format_func))
|
||||
self.ax.grid(True)
|
||||
self.fig.tight_layout()
|
||||
|
||||
|
||||
class SuperpositionPlot(AnimatedPlot):
|
||||
x = np.linspace(-2 * np.pi, 2 * np.pi, 500)
|
||||
|
||||
def update(self, t: float):
|
||||
v = 2 * np.pi
|
||||
self.ax.clear()
|
||||
|
||||
vf = np.real(np.exp(1j * (t * v - self.x)))
|
||||
vr = np.real(np.exp(1j * (t * v + self.x)))
|
||||
|
||||
self.ax.plot(self.x, vf, label="$V_f$")
|
||||
self.ax.plot(self.x, vr, label="$V_r$")
|
||||
self.ax.plot(self.x, vf + vr, color="black", linestyle="dotted", label="$V$")
|
||||
|
||||
self.ax.autoscale(enable=True, axis="x", tight=True)
|
||||
self.ax.set_ylim(-2.2, 2.2)
|
||||
|
||||
self.ax.set_xlabel("z")
|
||||
self.ax.set_ylabel("V")
|
||||
self.ax.set_title(f"$t={t:0.2f}$")
|
||||
|
||||
def pi_ticks(value, tick_number):
|
||||
# find number of multiples of pi/2
|
||||
N = int(np.round(2 * value / np.pi))
|
||||
if N == 0:
|
||||
return "0"
|
||||
elif np.abs(N) == 2:
|
||||
# +/- 1 * pi
|
||||
return "$" + ("-" if N < 0 else "") + r"\pi$"
|
||||
elif N % 2 == 0:
|
||||
return "$" + f"{N // 2}" + r"\pi$"
|
||||
else:
|
||||
return "$" + ("-" if N < 0 else "") + r"\frac{" + f"{np.abs(N)}" + r"}{2}\pi$"
|
||||
|
||||
self.ax.xaxis.set_major_locator(plt.MultipleLocator(np.pi / 2))
|
||||
self.ax.xaxis.set_major_formatter(plt.FuncFormatter(pi_ticks))
|
||||
self.ax.grid(True)
|
||||
self.ax.legend(loc="lower right")
|
||||
self.fig.tight_layout()
|
||||
|
||||
|
||||
class ReflectionPlot(AnimatedPlot):
|
||||
x = np.linspace(-4 * np.pi, 0, 500)
|
||||
|
||||
def __init__(self, zl: complex, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
|
||||
self.zl = zl
|
||||
self.z0 = 1
|
||||
|
||||
def update(self, t: float):
|
||||
v = 2 * np.pi
|
||||
self.ax.clear()
|
||||
|
||||
gamma = 1 if self.zl == np.inf else (self.zl - self.z0) / (self.zl + self.z0)
|
||||
|
||||
vf = np.exp(1j * (t * v - self.x))
|
||||
vr = gamma * np.exp(1j * (t * v + self.x))
|
||||
|
||||
self.ax.plot(self.x, np.real(vf), label="$V_f$")
|
||||
self.ax.plot(self.x, np.real(vr), label="$V_r$")
|
||||
self.ax.plot(self.x, np.real(vf + vr), color="black", linestyle="dotted", label="$V$")
|
||||
envelope = np.abs(vf + vr)
|
||||
self.ax.fill_between(self.x, envelope, -envelope, color="black", alpha=0.1)
|
||||
|
||||
self.ax.autoscale(enable=True, axis="x", tight=True)
|
||||
self.ax.set_ylim(-2.2, 2.2)
|
||||
|
||||
self.ax.set_xlabel("z")
|
||||
self.ax.set_ylabel("V")
|
||||
self.ax.set_title(f"$Z_L/Z_0={self.zl}$, $t={t:0.2f}$")
|
||||
|
||||
def pi_ticks(value, tick_number):
|
||||
# find number of multiples of pi/2
|
||||
N = int(np.round(2 * value / np.pi))
|
||||
if N == 0:
|
||||
return "0"
|
||||
elif np.abs(N) == 2:
|
||||
# +/- 1 * pi
|
||||
return "$" + ("-" if N < 0 else "") + r"\pi$"
|
||||
elif N % 2 == 0:
|
||||
return "$" + f"{N // 2}" + r"\pi$"
|
||||
else:
|
||||
return "$" + ("-" if N < 0 else "") + r"\frac{" + f"{np.abs(N)}" + r"}{2}\pi$"
|
||||
|
||||
self.ax.xaxis.set_major_locator(plt.MultipleLocator(np.pi / 2))
|
||||
self.ax.xaxis.set_major_formatter(plt.FuncFormatter(pi_ticks))
|
||||
self.ax.grid(True)
|
||||
self.ax.legend(loc="lower left")
|
||||
self.fig.tight_layout()
|
||||
|
||||
|
||||
# class SmithPlot:
|
||||
# def __init__(self, )
|
||||
|
||||
|
||||
def generate():
|
||||
TxLinePlot().save(dir_assets / "tx_lines" / "tx_line.gif")
|
||||
SuperpositionPlot().save(dir_assets / "tx_lines" / "superposition.gif")
|
||||
ReflectionPlot(zl=1).save(dir_assets / "tx_lines" / "reflection_matched.gif")
|
||||
ReflectionPlot(zl=np.inf).save(dir_assets / "tx_lines" / "reflection_open.gif")
|
||||
ReflectionPlot(zl=0).save(dir_assets / "tx_lines" / "reflection_short.gif")
|
||||
ReflectionPlot(zl=0.5).save(dir_assets / "tx_lines" / "reflection_real.gif")
|
||||
ReflectionPlot(zl=1 + 1j).save(dir_assets / "tx_lines" / "reflection_complex.gif")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
generate()
|
10
pyproject.toml
Executable file
|
@ -0,0 +1,10 @@
|
|||
[tool.pylint.messages_control]
|
||||
disable = "C0330, C0326"
|
||||
|
||||
[tool.pylint.format]
|
||||
max-line-length = "100"
|
||||
|
||||
[tool.black]
|
||||
line-length = 120
|
||||
organize-imports = true
|
||||
target-version = ['py38']
|