Add multichannel LED driver post

This commit is contained in:
jaseg 2018-05-19 14:43:28 +02:00
parent 24ad9ee7a0
commit 7bc656ca2a
109 changed files with 11608 additions and 12101 deletions

View file

@ -0,0 +1,874 @@
<?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 (http://matplotlib.org/) -->
<svg height="345pt" version="1.1" viewBox="0 0 460 345" width="460pt" 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 345.6
L 460.8 345.6
L 460.8 0
L 0 0
z
" style="fill:none;opacity:0;"/>
</g>
<g id="axes_1">
<g id="patch_2">
<path d="M 57.6 307.584
L 414.72 307.584
L 414.72 41.472
L 57.6 41.472
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
<path clip-path="url(#pade65162c6)" d="M 78.607059 307.584
L 78.607059 41.472
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
" id="mc8506604b7" style="stroke:#01769d;stroke-width:0.8;"/>
</defs>
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="78.607059" xlink:href="#mc8506604b7" y="307.584"/>
</g>
</g>
<g id="text_1">
<!-- 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-34"/>
<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
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
" id="DejaVuSans-30"/>
</defs>
<g style="fill:#01769d;" transform="translate(69.063309 322.182437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-34"/>
<use x="63.623047" xlink:href="#DejaVuSans-30"/>
<use x="127.246094" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
<path clip-path="url(#pade65162c6)" d="M 131.124706 307.584
L 131.124706 41.472
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="131.124706" xlink:href="#mc8506604b7" y="307.584"/>
</g>
</g>
<g id="text_2">
<!-- 450 -->
<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-35"/>
</defs>
<g style="fill:#01769d;" transform="translate(121.580956 322.182437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-34"/>
<use x="63.623047" xlink:href="#DejaVuSans-35"/>
<use x="127.246094" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_3">
<g id="line2d_5">
<path clip-path="url(#pade65162c6)" d="M 183.642353 307.584
L 183.642353 41.472
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="183.642353" xlink:href="#mc8506604b7" y="307.584"/>
</g>
</g>
<g id="text_3">
<!-- 500 -->
<g style="fill:#01769d;" transform="translate(174.098603 322.182437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-35"/>
<use x="63.623047" xlink:href="#DejaVuSans-30"/>
<use x="127.246094" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_4">
<g id="line2d_7">
<path clip-path="url(#pade65162c6)" d="M 236.16 307.584
L 236.16 41.472
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_8">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="236.16" xlink:href="#mc8506604b7" y="307.584"/>
</g>
</g>
<g id="text_4">
<!-- 550 -->
<g style="fill:#01769d;" transform="translate(226.61625 322.182437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-35"/>
<use x="63.623047" xlink:href="#DejaVuSans-35"/>
<use x="127.246094" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_5">
<g id="line2d_9">
<path clip-path="url(#pade65162c6)" d="M 288.677647 307.584
L 288.677647 41.472
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_10">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="288.677647" xlink:href="#mc8506604b7" y="307.584"/>
</g>
</g>
<g id="text_5">
<!-- 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
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
" id="DejaVuSans-36"/>
</defs>
<g style="fill:#01769d;" transform="translate(279.133897 322.182437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-36"/>
<use x="63.623047" xlink:href="#DejaVuSans-30"/>
<use x="127.246094" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_6">
<g id="line2d_11">
<path clip-path="url(#pade65162c6)" d="M 341.195294 307.584
L 341.195294 41.472
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_12">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="341.195294" xlink:href="#mc8506604b7" y="307.584"/>
</g>
</g>
<g id="text_6">
<!-- 650 -->
<g style="fill:#01769d;" transform="translate(331.651544 322.182437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-36"/>
<use x="63.623047" xlink:href="#DejaVuSans-35"/>
<use x="127.246094" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_7">
<g id="line2d_13">
<path clip-path="url(#pade65162c6)" d="M 393.712941 307.584
L 393.712941 41.472
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_14">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="393.712941" xlink:href="#mc8506604b7" y="307.584"/>
</g>
</g>
<g id="text_7">
<!-- 700 -->
<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-37"/>
</defs>
<g style="fill:#01769d;" transform="translate(384.169191 322.182437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-37"/>
<use x="63.623047" xlink:href="#DejaVuSans-30"/>
<use x="127.246094" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="text_8">
<!-- $\lambda\;[nm]$ -->
<defs>
<path d="M 36.71875 67.4375
L 48.828125 0
L 39.3125 0
L 31.84375 40.4375
L 5.125 0
L -4.390625 0
L 29.734375 52.4375
L 28.03125 62.109375
Q 26.953125 68.265625 21.734375 68.265625
L 17.046875 68.265625
L 18.5 75.984375
L 24.21875 75.875
Q 35.203125 75.734375 36.71875 67.4375
" id="DejaVuSans-Oblique-3bb"/>
<path d="M 8.59375 75.984375
L 29.296875 75.984375
L 29.296875 69
L 17.578125 69
L 17.578125 -6.203125
L 29.296875 -6.203125
L 29.296875 -13.1875
L 8.59375 -13.1875
z
" id="DejaVuSans-5b"/>
<path d="M 55.71875 33.015625
L 49.3125 0
L 40.28125 0
L 46.6875 32.671875
Q 47.125 34.96875 47.359375 36.71875
Q 47.609375 38.484375 47.609375 39.5
Q 47.609375 43.609375 45.015625 45.890625
Q 42.4375 48.1875 37.796875 48.1875
Q 30.5625 48.1875 25.34375 43.375
Q 20.125 38.578125 18.5 30.328125
L 12.5 0
L 3.515625 0
L 14.109375 54.6875
L 23.09375 54.6875
L 21.296875 46.09375
Q 25.046875 50.828125 30.3125 53.40625
Q 35.59375 56 41.40625 56
Q 48.640625 56 52.609375 52.09375
Q 56.59375 48.1875 56.59375 41.109375
Q 56.59375 39.359375 56.375 37.359375
Q 56.15625 35.359375 55.71875 33.015625
" id="DejaVuSans-Oblique-6e"/>
<path d="M 89.796875 33.015625
L 83.40625 0
L 74.421875 0
L 80.71875 32.71875
Q 81.109375 34.8125 81.296875 36.328125
Q 81.5 37.84375 81.5 38.921875
Q 81.5 43.3125 79.046875 45.75
Q 76.609375 48.1875 72.21875 48.1875
Q 65.671875 48.1875 60.546875 43.28125
Q 55.421875 38.375 53.90625 30.515625
L 47.90625 0
L 38.921875 0
L 45.3125 32.71875
Q 45.703125 34.515625 45.890625 36.046875
Q 46.09375 37.59375 46.09375 38.8125
Q 46.09375 43.265625 43.65625 45.71875
Q 41.21875 48.1875 36.921875 48.1875
Q 30.28125 48.1875 25.140625 43.28125
Q 20.015625 38.375 18.5 30.515625
L 12.5 0
L 3.515625 0
L 14.203125 54.6875
L 23.1875 54.6875
L 21.484375 46.1875
Q 25.140625 50.984375 30.046875 53.484375
Q 34.96875 56 40.578125 56
Q 46.53125 56 50.359375 52.875
Q 54.203125 49.75 54.984375 44.1875
Q 59.078125 49.953125 64.46875 52.96875
Q 69.875 56 75.875 56
Q 82.90625 56 86.734375 51.953125
Q 90.578125 47.90625 90.578125 40.484375
Q 90.578125 38.875 90.375 36.9375
Q 90.1875 35.015625 89.796875 33.015625
" id="DejaVuSans-Oblique-6d"/>
<path d="M 30.421875 75.984375
L 30.421875 -13.1875
L 9.71875 -13.1875
L 9.71875 -6.203125
L 21.390625 -6.203125
L 21.390625 69
L 9.71875 69
L 9.71875 75.984375
z
" id="DejaVuSans-5d"/>
</defs>
<g style="fill:#01769d;" transform="translate(219.86 335.860562)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-Oblique-3bb"/>
<use transform="translate(86.238823 0.015625)" xlink:href="#DejaVuSans-5b"/>
<use transform="translate(125.252495 0.015625)" xlink:href="#DejaVuSans-Oblique-6e"/>
<use transform="translate(188.631401 0.015625)" xlink:href="#DejaVuSans-Oblique-6d"/>
<use transform="translate(286.043511 0.015625)" xlink:href="#DejaVuSans-5d"/>
</g>
</g>
</g>
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_15">
<path clip-path="url(#pade65162c6)" d="M 57.6 295.226473
L 414.72 295.226473
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_16">
<defs>
<path d="M 0 0
L -3.5 0
" id="m3646c9359b" style="stroke:#01769d;stroke-width:0.8;"/>
</defs>
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="57.6" xlink:href="#m3646c9359b" y="295.226473"/>
</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-2e"/>
<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
" id="DejaVuSans-32"/>
</defs>
<g style="fill:#01769d;" transform="translate(34.696875 299.025692)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="ytick_2">
<g id="line2d_17">
<path clip-path="url(#pade65162c6)" d="M 57.6 264.114344
L 414.72 264.114344
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_18">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="57.6" xlink:href="#m3646c9359b" y="264.114344"/>
</g>
</g>
<g id="text_10">
<!-- 0.3 -->
<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
" id="DejaVuSans-33"/>
</defs>
<g style="fill:#01769d;" transform="translate(34.696875 267.913563)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-33"/>
</g>
</g>
</g>
<g id="ytick_3">
<g id="line2d_19">
<path clip-path="url(#pade65162c6)" d="M 57.6 233.002216
L 414.72 233.002216
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_20">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="57.6" xlink:href="#m3646c9359b" y="233.002216"/>
</g>
</g>
<g id="text_11">
<!-- 0.4 -->
<g style="fill:#01769d;" transform="translate(34.696875 236.801435)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-34"/>
</g>
</g>
</g>
<g id="ytick_4">
<g id="line2d_21">
<path clip-path="url(#pade65162c6)" d="M 57.6 201.890087
L 414.72 201.890087
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_22">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="57.6" xlink:href="#m3646c9359b" y="201.890087"/>
</g>
</g>
<g id="text_12">
<!-- 0.5 -->
<g style="fill:#01769d;" transform="translate(34.696875 205.689306)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="ytick_5">
<g id="line2d_23">
<path clip-path="url(#pade65162c6)" d="M 57.6 170.777958
L 414.72 170.777958
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_24">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="57.6" xlink:href="#m3646c9359b" y="170.777958"/>
</g>
</g>
<g id="text_13">
<!-- 0.6 -->
<g style="fill:#01769d;" transform="translate(34.696875 174.577177)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-36"/>
</g>
</g>
</g>
<g id="ytick_6">
<g id="line2d_25">
<path clip-path="url(#pade65162c6)" d="M 57.6 139.66583
L 414.72 139.66583
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_26">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="57.6" xlink:href="#m3646c9359b" y="139.66583"/>
</g>
</g>
<g id="text_14">
<!-- 0.7 -->
<g style="fill:#01769d;" transform="translate(34.696875 143.465048)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-37"/>
</g>
</g>
</g>
<g id="ytick_7">
<g id="line2d_27">
<path clip-path="url(#pade65162c6)" d="M 57.6 108.553701
L 414.72 108.553701
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_28">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="57.6" xlink:href="#m3646c9359b" y="108.553701"/>
</g>
</g>
<g id="text_15">
<!-- 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
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
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
" id="DejaVuSans-38"/>
</defs>
<g style="fill:#01769d;" transform="translate(34.696875 112.35292)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-38"/>
</g>
</g>
</g>
<g id="ytick_8">
<g id="line2d_29">
<path clip-path="url(#pade65162c6)" d="M 57.6 77.441572
L 414.72 77.441572
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_30">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="57.6" xlink:href="#m3646c9359b" y="77.441572"/>
</g>
</g>
<g id="text_16">
<!-- 0.9 -->
<defs>
<path d="M 10.984375 1.515625
L 10.984375 10.5
Q 14.703125 8.734375 18.5 7.8125
Q 22.3125 6.890625 25.984375 6.890625
Q 35.75 6.890625 40.890625 13.453125
Q 46.046875 20.015625 46.78125 33.40625
Q 43.953125 29.203125 39.59375 26.953125
Q 35.25 24.703125 29.984375 24.703125
Q 19.046875 24.703125 12.671875 31.3125
Q 6.296875 37.9375 6.296875 49.421875
Q 6.296875 60.640625 12.9375 67.421875
Q 19.578125 74.21875 30.609375 74.21875
Q 43.265625 74.21875 49.921875 64.515625
Q 56.59375 54.828125 56.59375 36.375
Q 56.59375 19.140625 48.40625 8.859375
Q 40.234375 -1.421875 26.421875 -1.421875
Q 22.703125 -1.421875 18.890625 -0.6875
Q 15.09375 0.046875 10.984375 1.515625
M 30.609375 32.421875
Q 37.25 32.421875 41.125 36.953125
Q 45.015625 41.5 45.015625 49.421875
Q 45.015625 57.28125 41.125 61.84375
Q 37.25 66.40625 30.609375 66.40625
Q 23.96875 66.40625 20.09375 61.84375
Q 16.21875 57.28125 16.21875 49.421875
Q 16.21875 41.5 20.09375 36.953125
Q 23.96875 32.421875 30.609375 32.421875
" id="DejaVuSans-39"/>
</defs>
<g style="fill:#01769d;" transform="translate(34.696875 81.240791)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-39"/>
</g>
</g>
</g>
<g id="ytick_9">
<g id="line2d_31">
<path clip-path="url(#pade65162c6)" d="M 57.6 46.329444
L 414.72 46.329444
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_32">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="57.6" xlink:href="#m3646c9359b" y="46.329444"/>
</g>
</g>
<g id="text_17">
<!-- 1.0 -->
<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-31"/>
</defs>
<g style="fill:#01769d;" transform="translate(34.696875 50.128662)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="text_18">
<!-- $S_{rel,820nm}\;[1]$ -->
<defs>
<path d="M 60.296875 70.515625
L 58.40625 60.890625
Q 53.46875 63.53125 48.609375 64.875
Q 43.75 66.21875 39.203125 66.21875
Q 30.375 66.21875 25.140625 62.359375
Q 19.921875 58.5 19.921875 52.09375
Q 19.921875 48.578125 21.84375 46.703125
Q 23.78125 44.828125 31.78125 42.671875
L 37.703125 41.21875
Q 47.703125 38.625 51.609375 34.640625
Q 55.515625 30.671875 55.515625 23.484375
Q 55.515625 12.453125 46.84375 5.515625
Q 38.1875 -1.421875 24.03125 -1.421875
Q 18.21875 -1.421875 12.359375 -0.265625
Q 6.5 0.875 0.59375 3.21875
L 2.59375 13.375
Q 8.015625 10.015625 13.453125 8.296875
Q 18.890625 6.59375 24.3125 6.59375
Q 33.546875 6.59375 39.109375 10.6875
Q 44.671875 14.796875 44.671875 21.390625
Q 44.671875 25.78125 42.453125 28.046875
Q 40.234375 30.328125 32.90625 32.171875
L 27 33.6875
Q 16.890625 36.328125 13.203125 39.765625
Q 9.515625 43.21875 9.515625 49.421875
Q 9.515625 60.296875 17.890625 67.25
Q 26.265625 74.21875 39.703125 74.21875
Q 44.921875 74.21875 50.046875 73.28125
Q 55.171875 72.359375 60.296875 70.515625
" id="DejaVuSans-Oblique-53"/>
<path d="M 44.578125 46.390625
Q 43.21875 47.125 41.453125 47.515625
Q 39.703125 47.90625 37.703125 47.90625
Q 30.515625 47.90625 25.140625 42.453125
Q 19.78125 37.015625 18.015625 27.875
L 12.5 0
L 3.515625 0
L 14.203125 54.6875
L 23.1875 54.6875
L 21.484375 46.1875
Q 25.046875 50.921875 30 53.453125
Q 34.96875 56 40.578125 56
Q 42.046875 56 43.453125 55.828125
Q 44.875 55.671875 46.296875 55.28125
z
" id="DejaVuSans-Oblique-72"/>
<path d="M 48.09375 32.234375
Q 48.25 33.015625 48.3125 33.84375
Q 48.390625 34.671875 48.390625 35.5
Q 48.390625 41.453125 44.890625 44.921875
Q 41.40625 48.390625 35.40625 48.390625
Q 28.71875 48.390625 23.578125 44.15625
Q 18.453125 39.9375 15.828125 32.171875
z
M 55.90625 25.203125
L 14.109375 25.203125
Q 13.8125 23.34375 13.71875 22.265625
Q 13.625 21.1875 13.625 20.40625
Q 13.625 13.625 17.796875 9.90625
Q 21.96875 6.203125 29.59375 6.203125
Q 35.453125 6.203125 40.671875 7.515625
Q 45.90625 8.84375 50.390625 11.375
L 48.6875 2.484375
Q 43.84375 0.53125 38.6875 -0.4375
Q 33.546875 -1.421875 28.21875 -1.421875
Q 16.84375 -1.421875 10.71875 4.015625
Q 4.59375 9.46875 4.59375 19.484375
Q 4.59375 28.03125 7.640625 35.375
Q 10.6875 42.71875 16.609375 48.484375
Q 20.40625 52.09375 25.65625 54.046875
Q 30.90625 56 36.8125 56
Q 46.09375 56 51.578125 50.4375
Q 57.078125 44.875 57.078125 35.5
Q 57.078125 33.25 56.78125 30.6875
Q 56.5 28.125 55.90625 25.203125
" id="DejaVuSans-Oblique-65"/>
<path d="M 18.3125 75.984375
L 27.296875 75.984375
L 12.5 0
L 3.515625 0
z
" id="DejaVuSans-Oblique-6c"/>
<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-2c"/>
</defs>
<g style="fill:#01769d;" transform="translate(28.196875 204.978)rotate(-90)scale(0.1 -0.1)">
<use transform="translate(0 0.015625)" xlink:href="#DejaVuSans-Oblique-53"/>
<use transform="translate(63.476562 -16.390625)scale(0.7)" xlink:href="#DejaVuSans-Oblique-72"/>
<use transform="translate(92.255859 -16.390625)scale(0.7)" xlink:href="#DejaVuSans-Oblique-65"/>
<use transform="translate(135.322266 -16.390625)scale(0.7)" xlink:href="#DejaVuSans-Oblique-6c"/>
<use transform="translate(154.770508 -16.390625)scale(0.7)" xlink:href="#DejaVuSans-2c"/>
<use transform="translate(190.65918 -16.390625)scale(0.7)" xlink:href="#DejaVuSans-38"/>
<use transform="translate(235.195312 -16.390625)scale(0.7)" xlink:href="#DejaVuSans-32"/>
<use transform="translate(279.731445 -16.390625)scale(0.7)" xlink:href="#DejaVuSans-30"/>
<use transform="translate(324.267578 -16.390625)scale(0.7)" xlink:href="#DejaVuSans-Oblique-6e"/>
<use transform="translate(368.632812 -16.390625)scale(0.7)" xlink:href="#DejaVuSans-Oblique-6d"/>
<use transform="translate(466.6148 0.015625)" xlink:href="#DejaVuSans-5b"/>
<use transform="translate(505.628472 0.015625)" xlink:href="#DejaVuSans-31"/>
<use transform="translate(569.251519 0.015625)" xlink:href="#DejaVuSans-5d"/>
</g>
</g>
</g>
<g id="line2d_33">
<path clip-path="url(#pade65162c6)" d="M 57.6 295.488
L 108.016941 258.421055
L 130.074353 241.875537
L 152.131765 225.042643
L 176.289882 206.308347
L 215.152941 175.819697
L 242.462118 154.525609
L 260.318118 140.872387
L 275.023059 129.893794
L 287.627294 120.736002
L 299.181176 112.591191
L 310.735059 104.726261
L 321.238588 97.853297
L 330.691765 91.919526
L 340.144941 86.247859
L 348.547765 81.444735
L 356.950588 76.882481
L 365.353412 72.576869
L 373.756235 68.543515
L 381.108706 65.249786
L 388.461176 62.186461
L 395.813647 59.363515
L 403.166118 56.790707
L 410.518588 54.477559
L 413.669647 53.568
L 413.669647 53.568
" style="fill:none;stroke:#fe3ea0;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="patch_3">
<path d="M 57.6 307.584
L 57.6 41.472
" style="fill:none;stroke:#08bdf9;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
<path d="M 57.6 307.584
L 414.72 307.584
" style="fill:none;stroke:#08bdf9;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
</g>
<defs>
<clipPath id="pade65162c6">
<rect height="266.112" width="357.12" x="57.6" y="41.472"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 29 KiB

View file

@ -103,14 +103,13 @@ over the problem, there are several sources for imperfections:
<figure class="side-by-side">
<img src="images/driver_ringing_strong.jpg" alt="Strong ringing on the LED voltage waveform edge at about
100% overshoot during about 70% of the cycle time.">
<figcaption>The shift register logic output of the multichannel LED driver directly driving a small mosfet's
gate through an inch or so of PCB trace caused extremely bad ringing at high driving
frequencies.</figcaption>
<figcaption>The LED strip being at the end of a couple meters of wire caused extremely bad ringing at high
driving frequencies.</figcaption>
</figure><figure class="side-by-side">
<img src="images/driver_ringing_weak.jpg" alt="Weak ringing on the LED voltage waveform edge at about 30%
overshoot during about 20% of the cycle time.">
<figcaption>Adding a resistor dampened the ringing somewhat, but ultimately it cannot be eliminated
entirely.</figcaption>
<figcaption>Adding a resistor in front of the MOSFET gate to slow the transition dampened the ringing
somewhat, but ultimately it cannot be eliminated entirely.</figcaption>
</figure>
</figure>
@ -371,6 +370,17 @@ The photodiode's response is strongly wavelength-dependent. In particular in the
gets very poor down to about 20% at the edge to ultraviolet. This effect is strong enough to move the apparent location
of the blue peak towards red.
.. raw:: html
<figure>
<img src="images/photodiode_sensitivity.svg" alt="A plot of photodiode sensitivity against wavelength relative
to peak sensitivity at 820nm. The sensitivity rises from 20% at 380nm approximately linearly to 80% at 620nm,
then the rise rolls off.">
<figcaption>A plot of the photodiode's relative sensitivity in the visible spectrum. The sensitivity is
normalized against its peak at 820nm.
</figcaption>
</figure>
The problem is that in order to remove this non-linearity, we would already have to know the wavelength of the measured
light. Since I don't, I settled for a two-step process. First, a coarse wavelength calibration is done relative to the
red peak and the short-wavelength edge of the blue peak. The photodiode measurements are then sensitivity-corrected
@ -390,7 +400,6 @@ wavelength in nanometers.
</figcaption>
</figure>
.. FIXME re-do these measurements, avoiding clipping
.. FIXME re-do calibration using CCFL
.. FIXME calibration for brightness imbalance due to wedge-shaped projection of spectrum

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 69 KiB

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

View file

@ -0,0 +1,765 @@
<?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 (http://matplotlib.org/) -->
<svg height="288pt" version="1.1" viewBox="0 0 432 288" width="432pt" 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 288
L 432 288
L 432 0
L 0 0
z
" style="fill:none;opacity:0;"/>
</g>
<g id="axes_1">
<g id="patch_2">
<path d="M 54 256.32
L 388.8 256.32
L 388.8 34.56
L 54 34.56
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
<path clip-path="url(#pd6435b8b02)" d="M 54 256.32
L 54 34.56
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
" id="m1925175e85" style="stroke:#01769d;stroke-width:0.8;"/>
</defs>
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="54" xlink:href="#m1925175e85" y="256.32"/>
</g>
</g>
<g id="text_1">
<!-- ${10^{0}}$ -->
<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-31"/>
<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
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
" id="DejaVuSans-30"/>
</defs>
<g style="fill:#01769d;" transform="translate(45.2 270.918437)scale(0.1 -0.1)">
<use transform="translate(0 0.765625)" xlink:href="#DejaVuSans-31"/>
<use transform="translate(63.623047 0.765625)" xlink:href="#DejaVuSans-30"/>
<use transform="translate(128.203125 39.046875)scale(0.7)" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
<path clip-path="url(#pd6435b8b02)" d="M 177.575725 256.32
L 177.575725 34.56
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="177.575725" xlink:href="#m1925175e85" y="256.32"/>
</g>
</g>
<g id="text_2">
<!-- ${10^{1}}$ -->
<g style="fill:#01769d;" transform="translate(168.775725 270.918437)scale(0.1 -0.1)">
<use transform="translate(0 0.684375)" xlink:href="#DejaVuSans-31"/>
<use transform="translate(63.623047 0.684375)" xlink:href="#DejaVuSans-30"/>
<use transform="translate(128.203125 38.965625)scale(0.7)" xlink:href="#DejaVuSans-31"/>
</g>
</g>
</g>
<g id="xtick_3">
<g id="line2d_5">
<path clip-path="url(#pd6435b8b02)" d="M 301.15145 256.32
L 301.15145 34.56
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="301.15145" xlink:href="#m1925175e85" y="256.32"/>
</g>
</g>
<g id="text_3">
<!-- ${10^{2}}$ -->
<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
" id="DejaVuSans-32"/>
</defs>
<g style="fill:#01769d;" transform="translate(292.35145 270.918437)scale(0.1 -0.1)">
<use transform="translate(0 0.765625)" xlink:href="#DejaVuSans-31"/>
<use transform="translate(63.623047 0.765625)" xlink:href="#DejaVuSans-30"/>
<use transform="translate(128.203125 39.046875)scale(0.7)" xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="xtick_4">
<g id="line2d_7">
<defs>
<path d="M 0 0
L 0 2
" id="m2cc6d12e8a" style="stroke:#01769d;stroke-width:0.6;"/>
</defs>
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="91.2" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_5">
<g id="line2d_8">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="112.960605" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_6">
<g id="line2d_9">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="128.4" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_7">
<g id="line2d_10">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="140.375725" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_8">
<g id="line2d_11">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="150.160605" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_9">
<g id="line2d_12">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="158.433603" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_10">
<g id="line2d_13">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="165.6" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_11">
<g id="line2d_14">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="171.92121" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_12">
<g id="line2d_15">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="214.775725" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_13">
<g id="line2d_16">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="236.53633" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_14">
<g id="line2d_17">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="251.975725" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_15">
<g id="line2d_18">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="263.95145" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_16">
<g id="line2d_19">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="273.73633" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_17">
<g id="line2d_20">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="282.009328" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_18">
<g id="line2d_21">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="289.175725" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_19">
<g id="line2d_22">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="295.496935" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_20">
<g id="line2d_23">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="338.35145" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_21">
<g id="line2d_24">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="360.112055" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_22">
<g id="line2d_25">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="375.55145" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_23">
<g id="line2d_26">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="387.527175" xlink:href="#m2cc6d12e8a" y="256.32"/>
</g>
</g>
</g>
</g>
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_27">
<path clip-path="url(#pd6435b8b02)" d="M 54 256.114166
L 388.8 256.114166
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_28">
<defs>
<path d="M 0 0
L -3.5 0
" id="m09fd9014c3" style="stroke:#01769d;stroke-width:0.8;"/>
</defs>
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="54" xlink:href="#m09fd9014c3" y="256.114166"/>
</g>
</g>
<g id="text_4">
<!-- ${10^{-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-2212"/>
</defs>
<g style="fill:#01769d;" transform="translate(23.5 259.913384)scale(0.1 -0.1)">
<use transform="translate(0 0.765625)" xlink:href="#DejaVuSans-31"/>
<use transform="translate(63.623047 0.765625)" xlink:href="#DejaVuSans-30"/>
<use transform="translate(128.203125 39.046875)scale(0.7)" xlink:href="#DejaVuSans-2212"/>
<use transform="translate(186.855469 39.046875)scale(0.7)" xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="ytick_2">
<g id="line2d_29">
<path clip-path="url(#pd6435b8b02)" d="M 54 183.830454
L 388.8 183.830454
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_30">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="54" xlink:href="#m09fd9014c3" y="183.830454"/>
</g>
</g>
<g id="text_5">
<!-- ${10^{-1}}$ -->
<g style="fill:#01769d;" transform="translate(23.5 187.629673)scale(0.1 -0.1)">
<use transform="translate(0 0.684375)" xlink:href="#DejaVuSans-31"/>
<use transform="translate(63.623047 0.684375)" xlink:href="#DejaVuSans-30"/>
<use transform="translate(128.203125 38.965625)scale(0.7)" xlink:href="#DejaVuSans-2212"/>
<use transform="translate(186.855469 38.965625)scale(0.7)" xlink:href="#DejaVuSans-31"/>
</g>
</g>
</g>
<g id="ytick_3">
<g id="line2d_31">
<path clip-path="url(#pd6435b8b02)" d="M 54 111.546743
L 388.8 111.546743
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_32">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="54" xlink:href="#m09fd9014c3" y="111.546743"/>
</g>
</g>
<g id="text_6">
<!-- ${10^{0}}$ -->
<g style="fill:#01769d;" transform="translate(29.4 115.345962)scale(0.1 -0.1)">
<use transform="translate(0 0.765625)" xlink:href="#DejaVuSans-31"/>
<use transform="translate(63.623047 0.765625)" xlink:href="#DejaVuSans-30"/>
<use transform="translate(128.203125 39.046875)scale(0.7)" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="ytick_4">
<g id="line2d_33">
<path clip-path="url(#pd6435b8b02)" d="M 54 39.263032
L 388.8 39.263032
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_34">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="54" xlink:href="#m09fd9014c3" y="39.263032"/>
</g>
</g>
<g id="text_7">
<!-- ${10^{1}}$ -->
<g style="fill:#01769d;" transform="translate(29.4 43.062251)scale(0.1 -0.1)">
<use transform="translate(0 0.684375)" xlink:href="#DejaVuSans-31"/>
<use transform="translate(63.623047 0.684375)" xlink:href="#DejaVuSans-30"/>
<use transform="translate(128.203125 38.965625)scale(0.7)" xlink:href="#DejaVuSans-31"/>
</g>
</g>
</g>
<g id="ytick_5">
<g id="line2d_35">
<defs>
<path d="M 0 0
L -2 0
" id="mcde38ab5e9" style="stroke:#01769d;stroke-width:0.6;"/>
</defs>
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="234.3546"/>
</g>
</g>
</g>
<g id="ytick_6">
<g id="line2d_36">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="221.626071"/>
</g>
</g>
</g>
<g id="ytick_7">
<g id="line2d_37">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="212.595035"/>
</g>
</g>
</g>
<g id="ytick_8">
<g id="line2d_38">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="205.59002"/>
</g>
</g>
</g>
<g id="ytick_9">
<g id="line2d_39">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="199.866505"/>
</g>
</g>
</g>
<g id="ytick_10">
<g id="line2d_40">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="195.027343"/>
</g>
</g>
</g>
<g id="ytick_11">
<g id="line2d_41">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="190.83547"/>
</g>
</g>
</g>
<g id="ytick_12">
<g id="line2d_42">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="187.137976"/>
</g>
</g>
</g>
<g id="ytick_13">
<g id="line2d_43">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="162.070889"/>
</g>
</g>
</g>
<g id="ytick_14">
<g id="line2d_44">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="149.34236"/>
</g>
</g>
</g>
<g id="ytick_15">
<g id="line2d_45">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="140.311324"/>
</g>
</g>
</g>
<g id="ytick_16">
<g id="line2d_46">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="133.306309"/>
</g>
</g>
</g>
<g id="ytick_17">
<g id="line2d_47">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="127.582794"/>
</g>
</g>
</g>
<g id="ytick_18">
<g id="line2d_48">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="122.743632"/>
</g>
</g>
</g>
<g id="ytick_19">
<g id="line2d_49">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="118.551759"/>
</g>
</g>
</g>
<g id="ytick_20">
<g id="line2d_50">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="114.854265"/>
</g>
</g>
</g>
<g id="ytick_21">
<g id="line2d_51">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="89.787178"/>
</g>
</g>
</g>
<g id="ytick_22">
<g id="line2d_52">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="77.058649"/>
</g>
</g>
</g>
<g id="ytick_23">
<g id="line2d_53">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="68.027613"/>
</g>
</g>
</g>
<g id="ytick_24">
<g id="line2d_54">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="61.022598"/>
</g>
</g>
</g>
<g id="ytick_25">
<g id="line2d_55">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="55.299083"/>
</g>
</g>
</g>
<g id="ytick_26">
<g id="line2d_56">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="50.459921"/>
</g>
</g>
</g>
<g id="ytick_27">
<g id="line2d_57">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="46.268048"/>
</g>
</g>
</g>
<g id="ytick_28">
<g id="line2d_58">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#mcde38ab5e9" y="42.570554"/>
</g>
</g>
</g>
</g>
<g id="line2d_59">
<path clip-path="url(#pd6435b8b02)" d="M -1 278.211573
L 54 246.24
L 91.2 218.603412
L 112.960605 207.714295
L 128.4 197.229035
L 140.375725 191.248204
L 150.160605 184.371583
L 158.433603 180.276352
L 165.6 174.141495
L 171.92121 171.132596
L 177.575725 167.322786
L 182.690856 164.879122
L 187.360605 161.849412
L 191.656358 159.784175
L 195.633603 157.082085
L 199.33633 155.299733
L 202.8 152.474945
L 206.053618 150.929999
L 209.12121 148.870742
L 212.022904 147.48974
L 214.775725 145.713065
L 217.394208 144.461619
L 219.890856 142.775715
L 222.276505 141.634047
L 224.560605 139.71538
L 226.75145 138.678024
L 228.856358 137.26953
L 230.881815 136.308751
L 232.833603 135.053978
L 234.716893 134.157744
L 236.53633 132.934508
L 238.296103 132.096012
L 240 129.910697
L 241.651461 129.148272
L 243.253618 128.102487
L 244.809328 127.382252
L 246.32121 126.433394
L 247.791665 125.75005
L 249.222904 124.80997
L 250.616963 124.160712
L 251.975725 123.04673
L 253.300935 122.43259
L 254.594208 121.585525
L 255.857049 120.999056
L 257.090856 120.222645
L 258.296935 119.660871
L 259.476505 118.884512
L 260.630705 118.345981
L 261.760605 117.448109
L 262.867206 116.933468
L 263.95145 116.220985
L 265.014223 115.725919
L 266.056358 115.068312
L 267.078641 114.590958
L 268.081815 113.92917
L 269.066581 113.468704
L 270.033603 112.672236
L 270.983509 112.229715
L 271.916893 111.615413
L 272.834321 111.187442
L 273.73633 110.617556
L 274.623429 110.202887
L 275.496103 109.626643
L 276.354813 109.224777
L 277.2 109.295322
L 278.032083 108.897648
L 278.851461 108.344666
L 279.658518 107.958782
L 282.009328 106.547154
L 282.770593 106.18262
L 283.52121 105.549474
L 284.261474 105.19628
L 284.991665 104.704322
L 287.124459 103.565923
L 287.816963 103.098678
L 288.500644 102.771871
L 289.175725 102.222111
L 289.84242 101.904257
L 291.151467 101.150656
L 293.057049 100.009312
L 293.677498 99.712991
L 294.290856 99.196798
L 296.089961 98.222269
L 297.830705 97.180912
L 298.398629 96.910011
L 298.960605 96.180743
L 300.612066 95.294238
L 302.214223 94.34423
L 302.73782 94.096643
L 303.256358 93.664432
L 304.782572 92.84533
L 306.266581 91.965625
L 306.75227 91.736038
L 307.233603 91.348225
L 308.65223 90.586682
L 310.034321 89.767258
L 310.487221 89.553146
L 310.93633 89.178828
L 312.26154 88.467563
L 313.97907 87.500464
L 314.4 88.186908
L 315.643336 87.497525
L 318.43711 85.759568
L 319.59131 85.131863
L 321.461474 83.944378
L 322.553069 83.351609
L 324.324459 82.218496
L 325.359892 81.657155
L 326.039246 81.259501
L 326.375725 80.814516
L 328.027186 79.896859
L 329.629343 78.879938
L 331.185053 78.016377
L 331.794926 77.619082
L 333.289961 76.730618
L 334.16739 76.201159
L 335.598629 75.351406
L 335.880352 75.215965
L 336.160605 75.239824
L 337.540328 74.46966
L 339.414223 73.311292
L 340.197715 72.88031
L 340.969933 72.367919
L 342.232774 71.664338
L 342.976457 71.164274
L 344.193476 70.486875
L 344.433603 70.170499
L 345.618381 69.513989
L 347.234321 68.522138
L 348.359483 67.86112
L 349.46154 67.207574
L 350.54142 66.567357
L 351.389948 66.082245
L 351.6 66.720126
L 353.047786 65.888213
L 353.656507 65.471636
L 354.655944 64.905575
L 355.246793 64.507405
L 356.217313 63.958318
L 356.79131 63.566425
L 357.734538 63.033416
L 358.107235 62.692817
L 359.753069 61.679732
L 360.646072 61.177566
L 361.174828 60.823731
L 362.044673 60.334968
L 362.559892 59.985558
L 364.737062 58.860761
L 365.227186 58.527296
L 366.353698 57.861658
L 367.76817 56.991094
L 368.538173 56.558119
L 368.843107 56.280724
L 370.489961 55.283376
L 371.512244 54.678333
L 373.220662 53.661782
L 373.360605 53.893698
L 374.330122 53.338366
L 374.876369 52.991801
L 377.13782 51.612576
L 377.527192 51.395928
L 377.785213 51.160437
L 379.182572 50.311178
L 380.299408 49.652865
L 381.513674 48.921946
L 381.753265 48.873818
L 383.285064 47.946437
L 384.320497 47.33543
L 384.887221 46.974453
L 385.448023 46.584031
L 386.879261 45.720998
L 387.848223 45.151429
L 388.37907 44.814583
L 388.695077 44.64
L 388.695077 44.64
" style="fill:none;stroke:#fe3ea0;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="patch_3">
<path d="M 54 256.32
L 54 34.56
" style="fill:none;stroke:#08bdf9;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
<path d="M 54 256.32
L 388.8 256.32
" style="fill:none;stroke:#08bdf9;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
</g>
<defs>
<clipPath id="pd6435b8b02">
<rect height="221.76" width="334.8" x="54" y="34.56"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -0,0 +1,937 @@
<?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 (http://matplotlib.org/) -->
<svg height="288pt" version="1.1" viewBox="0 0 432 288" width="432pt" 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 288
L 432 288
L 432 0
L 0 0
z
" style="fill:none;opacity:0;"/>
</g>
<g id="axes_1">
<g id="patch_2">
<path d="M 54 256.32
L 388.8 256.32
L 388.8 34.56
L 54 34.56
z
" style="fill:#ffffff;"/>
</g>
<g id="LineCollection_1">
<path clip-path="url(#pb2ddf07cb0)" d="M 60.981355 256.32
L 60.981355 256.32
" style="fill:none;stroke:#ffd2e9;stroke-width:1.5;"/>
<path clip-path="url(#pb2ddf07cb0)" d="M 106.91039 238.778387
L 106.91039 238.778387
" style="fill:none;stroke:#ffd2e9;stroke-width:1.5;"/>
<path clip-path="url(#pb2ddf07cb0)" d="M 152.839424 220.494693
L 152.839424 217.757228
" style="fill:none;stroke:#ffd2e9;stroke-width:1.5;"/>
<path clip-path="url(#pb2ddf07cb0)" d="M 198.768458 189.701028
L 198.768458 189.701028
" style="fill:none;stroke:#ffd2e9;stroke-width:1.5;"/>
<path clip-path="url(#pb2ddf07cb0)" d="M 244.697493 156.978572
L 244.697493 156.978572
" style="fill:none;stroke:#ffd2e9;stroke-width:1.5;"/>
<path clip-path="url(#pb2ddf07cb0)" d="M 290.626527 119.358916
L 290.626527 119.358916
" style="fill:none;stroke:#ffd2e9;stroke-width:1.5;"/>
<path clip-path="url(#pb2ddf07cb0)" d="M 336.555562 80.435304
L 336.555562 80.435304
" style="fill:none;stroke:#ffd2e9;stroke-width:1.5;"/>
<path clip-path="url(#pb2ddf07cb0)" d="M 382.484596 40.266375
L 382.484596 40.266375
" style="fill:none;stroke:#ffd2e9;stroke-width:1.5;"/>
</g>
<g id="line2d_1">
<path clip-path="url(#pb2ddf07cb0)" d="M 60.981355 256.32
L 106.91039 238.778387
L 152.839424 219.110317
L 198.768458 189.701028
L 244.697493 156.978572
L 290.626527 119.358916
L 336.555562 80.435304
L 382.484596 40.266375
" style="fill:none;stroke:#ffd2e9;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_2">
<path clip-path="url(#pb2ddf07cb0)" d="M 60.981355 256.32
L 60.981355 34.56
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_3">
<defs>
<path d="M 0 0
L 0 3.5
" id="m894b1b7ca2" style="stroke:#01769d;stroke-width:0.8;"/>
</defs>
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="60.981355" xlink:href="#m894b1b7ca2" y="256.32"/>
</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
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
" id="DejaVuSans-30"/>
</defs>
<g style="fill:#01769d;" transform="translate(57.800105 270.918437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_4">
<path clip-path="url(#pb2ddf07cb0)" d="M 106.91039 256.32
L 106.91039 34.56
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_5">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="106.91039" xlink:href="#m894b1b7ca2" y="256.32"/>
</g>
</g>
<g id="text_2">
<!-- 1 -->
<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-31"/>
</defs>
<g style="fill:#01769d;" transform="translate(103.72914 270.918437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
</g>
</g>
</g>
<g id="xtick_3">
<g id="line2d_6">
<path clip-path="url(#pb2ddf07cb0)" d="M 152.839424 256.32
L 152.839424 34.56
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_7">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="152.839424" xlink:href="#m894b1b7ca2" y="256.32"/>
</g>
</g>
<g id="text_3">
<!-- 2 -->
<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
" id="DejaVuSans-32"/>
</defs>
<g style="fill:#01769d;" transform="translate(149.658174 270.918437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="xtick_4">
<g id="line2d_8">
<path clip-path="url(#pb2ddf07cb0)" d="M 198.768458 256.32
L 198.768458 34.56
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_9">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="198.768458" xlink:href="#m894b1b7ca2" y="256.32"/>
</g>
</g>
<g id="text_4">
<!-- 3 -->
<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
" id="DejaVuSans-33"/>
</defs>
<g style="fill:#01769d;" transform="translate(195.587208 270.918437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-33"/>
</g>
</g>
</g>
<g id="xtick_5">
<g id="line2d_10">
<path clip-path="url(#pb2ddf07cb0)" d="M 244.697493 256.32
L 244.697493 34.56
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_11">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="244.697493" xlink:href="#m894b1b7ca2" y="256.32"/>
</g>
</g>
<g id="text_5">
<!-- 4 -->
<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-34"/>
</defs>
<g style="fill:#01769d;" transform="translate(241.516243 270.918437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-34"/>
</g>
</g>
</g>
<g id="xtick_6">
<g id="line2d_12">
<path clip-path="url(#pb2ddf07cb0)" d="M 290.626527 256.32
L 290.626527 34.56
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_13">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="290.626527" xlink:href="#m894b1b7ca2" y="256.32"/>
</g>
</g>
<g id="text_6">
<!-- 5 -->
<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-35"/>
</defs>
<g style="fill:#01769d;" transform="translate(287.445277 270.918437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-35"/>
</g>
</g>
</g>
<g id="xtick_7">
<g id="line2d_14">
<path clip-path="url(#pb2ddf07cb0)" d="M 336.555562 256.32
L 336.555562 34.56
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_15">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="336.555562" xlink:href="#m894b1b7ca2" y="256.32"/>
</g>
</g>
<g id="text_7">
<!-- 6 -->
<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
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
" id="DejaVuSans-36"/>
</defs>
<g style="fill:#01769d;" transform="translate(333.374312 270.918437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-36"/>
</g>
</g>
</g>
<g id="xtick_8">
<g id="line2d_16">
<path clip-path="url(#pb2ddf07cb0)" d="M 382.484596 256.32
L 382.484596 34.56
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_17">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="382.484596" xlink:href="#m894b1b7ca2" y="256.32"/>
</g>
</g>
<g id="text_8">
<!-- 7 -->
<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-37"/>
</defs>
<g style="fill:#01769d;" transform="translate(379.303346 270.918437)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-37"/>
</g>
</g>
</g>
<g id="xtick_9">
<g id="line2d_18">
<defs>
<path d="M 0 0
L 0 2
" id="m6888e25205" style="stroke:#01769d;stroke-width:0.6;"/>
</defs>
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_10">
<g id="line2d_19">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="106.91039" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_11">
<g id="line2d_20">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="133.777152" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_12">
<g id="line2d_21">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="152.839424" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_13">
<g id="line2d_22">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="167.625271" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_14">
<g id="line2d_23">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="179.706187" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_15">
<g id="line2d_24">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="189.920456" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_16">
<g id="line2d_25">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="198.768458" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_17">
<g id="line2d_26">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="206.57295" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_18">
<g id="line2d_27">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="259.483339" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_19">
<g id="line2d_28">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="286.350102" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_20">
<g id="line2d_29">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="305.412374" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_21">
<g id="line2d_30">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="320.19822" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_22">
<g id="line2d_31">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="332.279137" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_23">
<g id="line2d_32">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="342.493406" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_24">
<g id="line2d_33">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="351.341408" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_25">
<g id="line2d_34">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="359.145899" xlink:href="#m6888e25205" y="256.32"/>
</g>
</g>
</g>
<g id="text_9">
<!-- bit index -->
<defs>
<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
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-62"/>
<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-69"/>
<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-74"/>
<path id="DejaVuSans-20"/>
<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
" id="DejaVuSans-6e"/>
<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
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
" id="DejaVuSans-64"/>
<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
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-65"/>
<path d="M 54.890625 54.6875
L 35.109375 28.078125
L 55.90625 0
L 45.3125 0
L 29.390625 21.484375
L 13.484375 0
L 2.875 0
L 24.125 28.609375
L 4.6875 54.6875
L 15.28125 54.6875
L 29.78125 35.203125
L 44.28125 54.6875
z
" id="DejaVuSans-78"/>
</defs>
<g style="fill:#01769d;" transform="translate(199.520312 284.596563)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-62"/>
<use x="63.476562" xlink:href="#DejaVuSans-69"/>
<use x="91.259766" xlink:href="#DejaVuSans-74"/>
<use x="130.46875" xlink:href="#DejaVuSans-20"/>
<use x="162.255859" xlink:href="#DejaVuSans-69"/>
<use x="190.039062" xlink:href="#DejaVuSans-6e"/>
<use x="253.417969" xlink:href="#DejaVuSans-64"/>
<use x="316.894531" xlink:href="#DejaVuSans-65"/>
<use x="378.402344" xlink:href="#DejaVuSans-78"/>
</g>
</g>
</g>
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_35">
<path clip-path="url(#pb2ddf07cb0)" d="M 54 256.32
L 388.8 256.32
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_36">
<defs>
<path d="M 0 0
L -3.5 0
" id="m57c95a4823" style="stroke:#01769d;stroke-width:0.8;"/>
</defs>
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="54" xlink:href="#m57c95a4823" y="256.32"/>
</g>
</g>
<g id="text_10">
<!-- 1 -->
<g style="fill:#01769d;" transform="translate(40.6375 260.119219)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
</g>
</g>
</g>
<g id="ytick_2">
<g id="line2d_37">
<path clip-path="url(#pb2ddf07cb0)" d="M 54 214.820157
L 388.8 214.820157
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_38">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="54" xlink:href="#m57c95a4823" y="214.820157"/>
</g>
</g>
<g id="text_11">
<!-- 2 -->
<g style="fill:#01769d;" transform="translate(40.6375 218.619375)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="ytick_3">
<g id="line2d_39">
<path clip-path="url(#pb2ddf07cb0)" d="M 54 173.320313
L 388.8 173.320313
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_40">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="54" xlink:href="#m57c95a4823" y="173.320313"/>
</g>
</g>
<g id="text_12">
<!-- 4 -->
<g style="fill:#01769d;" transform="translate(40.6375 177.119532)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-34"/>
</g>
</g>
</g>
<g id="ytick_4">
<g id="line2d_41">
<path clip-path="url(#pb2ddf07cb0)" d="M 54 131.82047
L 388.8 131.82047
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_42">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="54" xlink:href="#m57c95a4823" y="131.82047"/>
</g>
</g>
<g id="text_13">
<!-- 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
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
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
" id="DejaVuSans-38"/>
</defs>
<g style="fill:#01769d;" transform="translate(40.6375 135.619688)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-38"/>
</g>
</g>
</g>
<g id="ytick_5">
<g id="line2d_43">
<path clip-path="url(#pb2ddf07cb0)" d="M 54 90.320626
L 388.8 90.320626
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_44">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="54" xlink:href="#m57c95a4823" y="90.320626"/>
</g>
</g>
<g id="text_14">
<!-- 16 -->
<g style="fill:#01769d;" transform="translate(34.275 94.119845)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-36"/>
</g>
</g>
</g>
<g id="ytick_6">
<g id="line2d_45">
<path clip-path="url(#pb2ddf07cb0)" d="M 54 48.820783
L 388.8 48.820783
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_46">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="54" xlink:href="#m57c95a4823" y="48.820783"/>
</g>
</g>
<g id="text_15">
<!-- 32 -->
<g style="fill:#01769d;" transform="translate(34.275 52.620002)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-33"/>
<use x="63.623047" xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="ytick_7">
<g id="line2d_47">
<defs>
<path d="M 0 0
L -2 0
" id="m401704d485" style="stroke:#01769d;stroke-width:0.6;"/>
</defs>
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m401704d485" y="214.820157"/>
</g>
</g>
</g>
<g id="ytick_8">
<g id="line2d_48">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m401704d485" y="190.544304"/>
</g>
</g>
</g>
<g id="ytick_9">
<g id="line2d_49">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m401704d485" y="173.320313"/>
</g>
</g>
</g>
<g id="ytick_10">
<g id="line2d_50">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m401704d485" y="159.960348"/>
</g>
</g>
</g>
<g id="ytick_11">
<g id="line2d_51">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m401704d485" y="149.044461"/>
</g>
</g>
</g>
<g id="ytick_12">
<g id="line2d_52">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m401704d485" y="139.81521"/>
</g>
</g>
</g>
<g id="ytick_13">
<g id="line2d_53">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m401704d485" y="131.82047"/>
</g>
</g>
</g>
<g id="ytick_14">
<g id="line2d_54">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m401704d485" y="124.768609"/>
</g>
</g>
</g>
<g id="ytick_15">
<g id="line2d_55">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m401704d485" y="76.960661"/>
</g>
</g>
</g>
<g id="ytick_16">
<g id="line2d_56">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m401704d485" y="52.684809"/>
</g>
</g>
</g>
<g id="ytick_17">
<g id="line2d_57">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m401704d485" y="35.460817"/>
</g>
</g>
</g>
</g>
<g id="line2d_58">
<path clip-path="url(#pb2ddf07cb0)" d="M 60.981355 253.94359
L 106.91039 239.555517
L 152.839424 218.25662
L 198.768458 190.165617
L 244.697493 156.695449
L 290.626527 119.654078
L 336.555562 80.514491
L 382.484596 40.23061
" style="fill:none;stroke:#fe3ea0;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="patch_3">
<path d="M 54 256.32
L 54 34.56
" style="fill:none;stroke:#08bdf9;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
<path d="M 54 256.32
L 388.8 256.32
" style="fill:none;stroke:#08bdf9;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
</g>
<defs>
<clipPath id="pb2ddf07cb0">
<rect height="221.76" width="334.8" x="54" y="34.56"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 856 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 KiB

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 58 KiB

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 KiB

View file

@ -0,0 +1,727 @@
<?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 (http://matplotlib.org/) -->
<svg height="288pt" version="1.1" viewBox="0 0 432 288" width="432pt" 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 288
L 432 288
L 432 0
L 0 0
z
" style="fill:none;opacity:0;"/>
</g>
<g id="axes_1">
<g id="patch_2">
<path d="M 54 256.32
L 388.8 256.32
L 388.8 34.56
L 54 34.56
z
" style="fill:#ffffff;"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
<path clip-path="url(#p2822336f64)" d="M 54 256.32
L 54 34.56
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_2">
<defs>
<path d="M 0 0
L 0 3.5
" id="m97f003056d" style="stroke:#01769d;stroke-width:0.8;"/>
</defs>
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="54" xlink:href="#m97f003056d" y="256.32"/>
</g>
</g>
<g id="text_1">
<!-- ${10^{0}}$ -->
<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-31"/>
<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
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
" id="DejaVuSans-30"/>
</defs>
<g style="fill:#01769d;" transform="translate(45.2 270.918437)scale(0.1 -0.1)">
<use transform="translate(0 0.765625)" xlink:href="#DejaVuSans-31"/>
<use transform="translate(63.623047 0.765625)" xlink:href="#DejaVuSans-30"/>
<use transform="translate(128.203125 39.046875)scale(0.7)" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
<path clip-path="url(#p2822336f64)" d="M 193.022691 256.32
L 193.022691 34.56
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_4">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="193.022691" xlink:href="#m97f003056d" y="256.32"/>
</g>
</g>
<g id="text_2">
<!-- ${10^{1}}$ -->
<g style="fill:#01769d;" transform="translate(184.222691 270.918437)scale(0.1 -0.1)">
<use transform="translate(0 0.684375)" xlink:href="#DejaVuSans-31"/>
<use transform="translate(63.623047 0.684375)" xlink:href="#DejaVuSans-30"/>
<use transform="translate(128.203125 38.965625)scale(0.7)" xlink:href="#DejaVuSans-31"/>
</g>
</g>
</g>
<g id="xtick_3">
<g id="line2d_5">
<path clip-path="url(#p2822336f64)" d="M 332.045382 256.32
L 332.045382 34.56
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_6">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="332.045382" xlink:href="#m97f003056d" y="256.32"/>
</g>
</g>
<g id="text_3">
<!-- ${10^{2}}$ -->
<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
" id="DejaVuSans-32"/>
</defs>
<g style="fill:#01769d;" transform="translate(323.245382 270.918437)scale(0.1 -0.1)">
<use transform="translate(0 0.765625)" xlink:href="#DejaVuSans-31"/>
<use transform="translate(63.623047 0.765625)" xlink:href="#DejaVuSans-30"/>
<use transform="translate(128.203125 39.046875)scale(0.7)" xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="xtick_4">
<g id="line2d_7">
<defs>
<path d="M 0 0
L 0 2
" id="m382e56d781" style="stroke:#01769d;stroke-width:0.6;"/>
</defs>
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="95.85" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_5">
<g id="line2d_8">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="120.330681" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_6">
<g id="line2d_9">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="137.7" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_7">
<g id="line2d_10">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="151.172691" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_8">
<g id="line2d_11">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="162.180681" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_9">
<g id="line2d_12">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="171.487803" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_10">
<g id="line2d_13">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="179.55" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_11">
<g id="line2d_14">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="186.661361" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_12">
<g id="line2d_15">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="234.872691" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_13">
<g id="line2d_16">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="259.353371" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_14">
<g id="line2d_17">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="276.722691" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_15">
<g id="line2d_18">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="290.195382" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_16">
<g id="line2d_19">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="301.203371" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_17">
<g id="line2d_20">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="310.510494" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_18">
<g id="line2d_21">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="318.572691" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_19">
<g id="line2d_22">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="325.684052" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
<g id="xtick_20">
<g id="line2d_23">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="373.895382" xlink:href="#m382e56d781" y="256.32"/>
</g>
</g>
</g>
</g>
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_24">
<path clip-path="url(#p2822336f64)" d="M 54 197.74235
L 388.8 197.74235
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_25">
<defs>
<path d="M 0 0
L -3.5 0
" id="mb373a1162c" style="stroke:#01769d;stroke-width:0.8;"/>
</defs>
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="54" xlink:href="#mb373a1162c" y="197.74235"/>
</g>
</g>
<g id="text_4">
<!-- ${10^{1}}$ -->
<g style="fill:#01769d;" transform="translate(29.4 201.541568)scale(0.1 -0.1)">
<use transform="translate(0 0.684375)" xlink:href="#DejaVuSans-31"/>
<use transform="translate(63.623047 0.684375)" xlink:href="#DejaVuSans-30"/>
<use transform="translate(128.203125 38.965625)scale(0.7)" xlink:href="#DejaVuSans-31"/>
</g>
</g>
</g>
<g id="ytick_2">
<g id="line2d_26">
<path clip-path="url(#p2822336f64)" d="M 54 91.371981
L 388.8 91.371981
" style="fill:none;stroke:#08bdf9;stroke-dasharray:2.2,2.2;stroke-dashoffset:0;stroke-width:0.8;"/>
</g>
<g id="line2d_27">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.8;" x="54" xlink:href="#mb373a1162c" y="91.371981"/>
</g>
</g>
<g id="text_5">
<!-- ${10^{2}}$ -->
<g style="fill:#01769d;" transform="translate(29.4 95.171199)scale(0.1 -0.1)">
<use transform="translate(0 0.765625)" xlink:href="#DejaVuSans-31"/>
<use transform="translate(63.623047 0.765625)" xlink:href="#DejaVuSans-30"/>
<use transform="translate(128.203125 39.046875)scale(0.7)" xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="ytick_3">
<g id="line2d_28">
<defs>
<path d="M 0 0
L -2 0
" id="m09a18ae090" style="stroke:#01769d;stroke-width:0.6;"/>
</defs>
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="253.361155"/>
</g>
</g>
</g>
<g id="ytick_4">
<g id="line2d_29">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="240.071375"/>
</g>
</g>
</g>
<g id="ytick_5">
<g id="line2d_30">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="229.763021"/>
</g>
</g>
</g>
<g id="ytick_6">
<g id="line2d_31">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="221.340483"/>
</g>
</g>
</g>
<g id="ytick_7">
<g id="line2d_32">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="214.219328"/>
</g>
</g>
</g>
<g id="ytick_8">
<g id="line2d_33">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="208.050704"/>
</g>
</g>
</g>
<g id="ytick_9">
<g id="line2d_34">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="202.609591"/>
</g>
</g>
</g>
<g id="ytick_10">
<g id="line2d_35">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="165.721678"/>
</g>
</g>
</g>
<g id="ytick_11">
<g id="line2d_36">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="146.990786"/>
</g>
</g>
</g>
<g id="ytick_12">
<g id="line2d_37">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="133.701006"/>
</g>
</g>
</g>
<g id="ytick_13">
<g id="line2d_38">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="123.392652"/>
</g>
</g>
</g>
<g id="ytick_14">
<g id="line2d_39">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="114.970114"/>
</g>
</g>
</g>
<g id="ytick_15">
<g id="line2d_40">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="107.848959"/>
</g>
</g>
</g>
<g id="ytick_16">
<g id="line2d_41">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="101.680335"/>
</g>
</g>
</g>
<g id="ytick_17">
<g id="line2d_42">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="96.239222"/>
</g>
</g>
</g>
<g id="ytick_18">
<g id="line2d_43">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="59.351309"/>
</g>
</g>
</g>
<g id="ytick_19">
<g id="line2d_44">
<g>
<use style="fill:#01769d;stroke:#01769d;stroke-width:0.6;" x="54" xlink:href="#m09a18ae090" y="40.620417"/>
</g>
</g>
</g>
</g>
<g id="line2d_45">
<path clip-path="url(#p2822336f64)" d="M -1 288.398444
L 54 246.24
L 95.85 234.630263
L 120.330681 208.050704
L 137.7 217.642825
L 151.172691 197.74235
L 162.180681 193.339394
L 171.487803 180.577576
L 179.55 195.488436
L 186.661361 182.198657
L 193.022691 179.011457
L 198.777213 169.323194
L 204.030681 173.229413
L 208.863402 164.580976
L 213.337803 162.380748
L 217.503371 155.413324
L 221.4 169.323194
L 225.06032 161.318723
L 228.511361 159.265226
L 231.775766 152.72153
L 234.872691 155.413324
L 237.818484 149.360334
L 240.627213 147.767208
L 243.311068 142.587831
L 245.880681 148.556904
L 248.345382 143.293128
L 250.713402 141.89314
L 252.992042 137.302523
L 255.187803 139.214357
L 257.306505 134.870589
L 259.353371 133.701006
L 261.333116 129.826012
L 263.25 140.534334
L 265.107894 136.070555
L 266.91032 134.870589
L 268.660494 130.900387
L 270.361361 132.560305
L 272.015623 128.776056
L 273.625766 127.749435
L 275.194083 124.325938
L 276.722691 128.259894
L 278.213551 124.799748
L 279.668484 123.856938
L 281.08918 120.700858
L 282.477213 122.027152
L 283.834052 118.989697
L 285.161068 118.157313
L 286.459543 115.356694
L 287.730681 120.700858
L 288.975607 117.746679
L 290.195382 116.936201
L 291.391001 114.206525
L 292.563402 115.356694
L 293.713471 112.716201
L 294.842042 111.988688
L 295.949904 109.529001
L 297.037803 112.351012
L 298.106447 109.872468
L 299.156505 109.188069
L 300.188612 106.869501
L 301.203371 107.848959
L 302.201358 105.595046
L 303.183116 104.970765
L 304.149165 102.849918
L 305.1 110.218508
L 306.036093 107.848959
L 306.957894 107.193685
L 307.865833 104.970765
L 308.76032 105.910379
L 309.641749 103.746957
L 310.510494 103.146999
L 311.366917 101.106463
L 312.211361 103.446004
L 313.044158 101.392508
L 313.865623 100.822179
L 314.676062 98.879716
L 315.475766 99.702219
L 316.265017 97.80534
L 317.044083 97.277379
L 317.813224 95.475633
L 318.572691 98.879716
L 319.322723 97.015645
L 320.063551 96.496582
L 320.7954 94.724461
L 321.518484 95.475633
L 322.233011 93.741529
L 322.93918 93.257796
L 323.637185 91.60354
L 324.327213 93.499029
L 325.009444 91.836267
L 325.684052 91.371981
L 326.351206 89.78277
L 327.011068 90.457177
L 327.663796 88.898608
L 328.309543 88.462793
L 328.948457 86.969026
L 329.580681 90.912315
L 330.206352 89.338574
L 330.825607 88.898608
L 331.438575 87.39091
L 332.045382 88.031051
L 332.646151 86.550959
L 333.241001 86.136641
L 333.830047 84.715112
L 334.413402 86.343336
L 334.991175 84.915529
L 335.563471 84.515561
L 336.130393 83.142328
L 336.692042 83.725865
L 337.248514 82.375571
L 337.799904 81.996912
L 338.346304 80.695529
L 338.887803 83.142328
L 339.42449 81.808741
L 339.956447 81.434682
L 340.483759 80.148823
L 341.006505 80.695529
L 341.524764 79.429804
L 342.038612 79.074448
L 342.548123 77.851796
L 343.053371 79.251784
L 343.554426 78.024492
L 344.051358 77.679744
L 344.544232 76.492991
L 345.033116 76.997871
L 345.518072 75.828288
L 345.999165 75.499489
L 346.476454 74.366779
L 346.95 79.074448
L 347.419861 77.851796
L 347.886093 77.50833
L 348.348753 76.325916
L 348.807894 76.828964
L 349.26357 75.663596
L 349.715833 75.335963
L 350.164733 74.207207
L 350.61032 75.499489
L 351.052643 74.366779
L 351.491749 74.048184
L 351.927684 72.950093
L 352.360494 73.417511
L 352.790224 72.334137
L 353.216917 72.029211
L 353.640615 70.977548
L 354.061361 72.950093
L 354.479195 71.8775
L 354.894158 71.575564
L 355.306288 70.534062
L 355.715623 70.977548
L 356.122203 69.949294
L 356.526062 69.659663
L 356.927238 68.660018
L 357.325766 69.804252
L 357.721681 68.801507
L 358.115017 68.518961
L 358.505806 67.543443
L 358.894083 67.959002
L 359.279878 66.995115
L 359.663224 66.723373
L 360.044152 65.784668
L 360.422691 68.238133
L 360.798871 67.268465
L 361.172723 66.995115
L 361.544273 66.050929
L 361.913551 66.453219
L 362.280585 65.519934
L 362.6454 65.256708
L 363.008025 64.347051
L 363.368484 65.388133
L 363.726804 64.475911
L 364.083011 64.21855
L 364.437128 63.328915
L 364.78918 63.708091
L 365.139191 62.82814
L 365.487185 62.579773
L 365.833185 61.720857
L 366.177213 63.328915
L 366.519292 62.456089
L 366.859444 62.209709
L 367.19769 61.357584
L 367.534052 61.720857
L 367.86855 60.87762
L 368.201206 60.639496
L 368.532038 59.815595
L 368.861068 60.758405
L 369.188314 59.932399
L 369.513796 59.699085
L 369.837533 58.891643
L 370.159543 59.235963
L 370.479845 58.436506
L 370.798457 58.210608
L 371.115396 57.428551
L 371.430681 60.0495
L 371.744327 59.235963
L 372.056352 59.006131
L 372.366774 58.210608
L 372.675607 58.54987
L 372.982869 57.762099
L 373.288575 57.539466
L 373.59274 56.768596
L 373.895382 57.650648
L 374.196513 56.877936
L 374.496151 56.659515
L 374.794308 55.903071
L 375.091001 56.225746
L 375.386242 55.476315
L 375.680047 55.264406
L 375.972429 54.530287
L 376.263402 55.903071
L 376.55298 55.158815
L 376.841175 54.948354
L 377.128001 54.219201
L 377.413471 54.530287
L 377.697598 53.807652
L 377.980393 53.603245
L 378.261871 52.894857
L 378.542042 53.705335
L 378.820919 52.995393
L 379.098514 52.79454
L 379.374838 52.098354
L 379.649904 52.395436
L 379.923722 51.705193
L 380.196304 51.509861
L 380.467661 50.832629
L 380.737803 52.594557
L 381.006743 51.901355
L 381.27449 51.705193
L 381.541054 51.025113
L 381.806447 51.315351
L 382.070679 50.640944
L 382.333759 50.450051
L 382.595697 49.788069
L 382.856505 50.545399
L 383.11619 49.882059
L 383.374764 49.69427
L 383.632234 49.042955
L 383.888612 49.320966
L 384.143905 48.674857
L 384.398123 48.491902
L 384.651276 47.857206
L 384.903371 49.042955
L 385.154419 48.400696
L 385.404426 48.218821
L 385.653403 47.587841
L 385.901358 47.857206
L 386.148298 47.231113
L 386.394232 47.053776
L 386.639169 46.438406
L 386.883116 47.142359
L 387.126081 46.525815
L 387.368072 46.351161
L 387.609098 45.745018
L 387.849165 46.003821
L 388.088281 45.402189
L 388.326454 45.231723
L 388.563691 44.64
L 388.563691 44.64
" style="fill:none;stroke:#fe3ea0;stroke-linecap:square;stroke-width:1.5;"/>
</g>
<g id="patch_3">
<path d="M 54 256.32
L 54 34.56
" style="fill:none;stroke:#08bdf9;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
<g id="patch_4">
<path d="M 54 256.32
L 388.8 256.32
" style="fill:none;stroke:#08bdf9;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
</g>
</g>
</g>
<defs>
<clipPath id="p2822336f64">
<rect height="221.76" width="334.8" x="54" y="34.56"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

View file

@ -1,5 +1,457 @@
---
title: "Multichannel Led Driver"
title: "32-Channel LED tape driver"
date: 2018-05-02T11:31:14+02:00
draft: true
---
Theoretical basics
==================
Together, a friend and I outfitted the small staircase at Berlin's Chaos Computer Club with nice, shiny RGB-WW LED tape
for ambient lighting. This tape is like regular RGB tape but with an additional warm white channel, which makes for much
more natural pastels and whites. There are several variants of RGBW tape. Cheap ones have separate RGB and white LEDs,
which is fine for indirect lighting but does not work for direct lighting. Since we wanted to mount our tape in channels
at the front of the steps, we had to use the slightly more expensive variant with integrated RGBW LEDs. These are LEDs
in the 5050 (5.0mm by 5.0mm) form factor common with RGB LEDs that have a small section divided off for the white
channel. The red, green and blue LED chips sit together in the larger section covered with clear epoxy and the white
channel is made up from the usual blue LED inside a yellow phosphor in the smaller section.
Since we wanted to light up all of 15 steps, and for greatest visual effect we would have liked to be able to control
each step individually we had to find a way to control 60 channels of LED tape with a reasonable amount of hardware.
LED tape has integrated series resistors and runs off a fixed 12V or 24V constant-voltage supply. This means you don't
need a complex constant-current driver as you'd need with high-power LEDs. You can just hook up a section of LED tape
to a beefy MOSFET to control it. Traditionally, you would do *Pulse Width Modulation* (PWM) on the MOSFET's input to
control the LED tape's brightness.
Pulse Width Modulation
----------------------
`Pulse Width Modulation`_ is a technique of controlling the brightness of a load such as an LED with a digital signal.
The basic idea is that if you turn the LED on and off much too fast for anyone to notice, you can control its power by
changing how long you turn it on versus how long you leave it off.
PWM divides each second into a large number of periods. At the beginning of each period, you turn the LED on. After
that, you wait a certain time until you turn it off. Then, you wait for the next period to begin. The periods are always
the same length but you can set when you turn off the LED. If you turn it off right away, it's off almost all the time
and it looks like it's off to your eye. If you turn it off right at the end, it's on almost all the time and it looks
super bright to your eye. Now, if you turn it off halfway into the cycle, it's on half the time and it will look to your
eye as half as bright as before. This means that you can control the LED's brightness with only a digital signal and
good timing.
.. raw:: html
<figure>
<img src="images/pwm_schema.jpg" alt="A visualization of PWM at different duty cycles.">
<figcaption>Waveforms of two PWM cycles at different duty cycles.</figcaption>
</figure>
PWM works great if you have a dedicated PWM output on your microcontroller. It's extremely simple in both hardware and
software. Unfortunately for us, controlling 32 channels with PWM is not that easy. Cheap microcontrollers only have `a
handful of hardware PWM outputs`_, so we'd either have to do everything in software, bit-banging our LED modulation, or
we'd have to use a dedicated chip.
Doing PWM in software is both error-prone and slow. Since the maximum dynamic range of a PWM signal is limited by the
shortest duty cycle it can do, software PWM being slow means it has poor PWM resolution at maybe 8 bits at most. Poor
color resolution is not a problem if all you're doing is to fade around the `HSV rainbow`_, but for ambient lighting
where you *really* want to control the brightness down to a faint shimmer you need all the color resolution you can get.
If you rule out software PWM, what remains are dedicated `hardware PWM controllers`_. Most of these have either of three
issues:
* They're expensive
* They don't have generous PWM resolution either (12 bits if you're lucky)
* They're meant to drive small LEDs such as a 7-segment display directly and you can't just hook up a MOSFET to their
output
This means we're stuck in a dilemma between two poor solutions if we'd want to do PWM. Luckily for us, PWM is not the
only modulation in town.
.. _`Pulse Width Modulation`: https://en.wikipedia.org/wiki/Pulse-width_modulation
.. _`a handful of hardware PWM outputs`: https://www.nxp.com/parametricSearch#/&c=c731_c380_c173_c161_c163&page=1
.. _`HSV rainbow`: https://en.wikipedia.org/wiki/HSL_and_HSV
.. _`hardware PWM controllers`: http://www.ti.com/lit/ds/symlink/tlc5940.pdf
Binary Code Modulation
----------------------
PWM is the bread-and-butter of the maker crowd. Everyone and their cat is doing it and it works really well most of the
time. Unbeknownst to most of the maker crowd, there is however another popular modulation method that's mostly used in
professional LED systems: Enter `*Binary Code Modulation* (BCM) <http://www.batsocks.co.uk/readme/art_bcm_1.htm>`_.
BCM is to PWM sort of what barcodes are to handwriting. While PWM is easy to understand and simple to implement if all
you have is a counter and an IO pin, BCM is more complicated. On the other hand, computers can do complicated and BCM
really shines in multi-channel applications.
Similar to PWM, BCM works by turning on and off the LED in short periods fast enough to make your eye perceive it as
partially on all the time. In PWM the channel's brightness is linearly dependent on its duty cycle, i.e. the percentage
it is turned on. In PWM the duty cycle D is the total period T divided by the on period T_on. The issue with doing PWM
on many channels at once is that you have to turn off each channel at the exact time to match its duty cycle.
Controlling many IO pins at once with precise timing is really hard to do in software.
BCM avoids this by further dividing each period into smaller periods which we'll call *bit periods* and splitting each
channel's duty cycle into chunks the size of these bit periods. The amazingly elegant thing in BCM now is that as you
can guess from the name these bit periods are weighted in powers of two. Say the shortest bit period lasts 1
microsecond. Then the second-shortest bit period is 2 microseconds and the third is 4, the fifth 8, the sixth 16 and so
on.
.. raw:: html
<figure>
<img src="images/bcm_schema.jpg" alt="A visualization of BCM at different duty cycles.">
<figcaption>Waveforms of a single 4-bit BCM cycle at different duty cycles. This BCM can produce 16 different
levels.</figcaption>
</figure>
Staggered like this, you turn on the LED for integer value of microseconds by turning it on in the bit periods
corresponding to the binary bits of that value. If I want my LED to light for 19 microseconds every period, I turn it on
in the 16 microsecond bit period, the 2 microsecond bit period and the 1 microsecond bit period and leave it off for the
4 and 8 mircosecond bit periods.
Now, how this is better instead of just more complicated than plain old PWM might not be clear yet. But consider this:
Turning on and off a large number of channels, each at its own arbitrary time is hard because doing the timing in
software is hard. We can't use hardware timers since we only have two or three of those, and we have 32 channels.
However, we can use one hardware timer to trigger a really cheap external latch to turn on or off the 32 channels all at
once. With this setup, we can only controll all channels at once, but we can do so with very precise timing.
All we need to do is to set our timer to the durations of the BCM bit periods, and we can get the same result as we'd
get with PWM with only one hardware timer and a bit of code that is not timing-critical anymore.
Applications of Binary Code Modulation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BCM is a truly wondrous technique, and outside of hobbyist circles it is in fact very widely known. Though we're using
it to control just 32 channels here, you can do much more channels without any problems. The most common application
where BCM is invariably used is *any* kind of LED screen. Controlling the thousands and thousands of LEDs in an LED
screen with PWM with a dedicated timer for each LED would not be feasible. With BCM, all you need to dedicate to a
single LED is a flipflop (or part of one if you're multiplexing). In fact, there is a whole range of `ICs with no other
purpose than to enable BCM on large LED matrices <http://www.vabolis.lt/stuff/MBI5026.pdf>`_. Basically, these are a
high-speed shift register with latched outputs much like the venerable 74HC595_, only their outputs are constant-current
sinks made so that you can directly connect an LED to them.
.. _74HC595: http://www.ti.com/lit/ds/symlink/sn74hc595.pdf
Running BCM on LED tape
~~~~~~~~~~~~~~~~~~~~~~~
In our case, we don't need any special driver chips to control our LED tape. We just connect the outputs of a 74HC595_
shift register to one MOSFET_ each, and then we directly connect the LED tape to these MOSFETs. The MOSFETs allow us to
drive a couple of amps into the LED tape from the weak outputs of the shift register.
The BCM timing is done by hooking up two timer channels of our microcontroller to the shift registers *strobe* and
*reset* inputs. We set the timer to PWM mode so we can generate pulses with precise timing. At the beginning of each
bit period, a pulse will strobe the data for this bit period that we shifted in previously. At the end of the bit
period, one pulse will reset the shift register and one will strobe the freshly-reset zeros into the outputs.
.. raw:: html
<figure>
<img src="images/olsndot_output_schematic.jpg" alt="From left to right, we see the STM32, one of the shift
registers, and the LEDs and MOSFETs. The LED tape is driven to ground by the MOSFETs, which are in turn directly
driven from the shift register outputs. The shift register is wired up to the STM32 with its clock and data
inputs on SCK and MOSI and its RESET and STROBE inputs on channel 2 and 3 of timer 1.">
<figcaption>
The schematic of a single output of this LED driver. Multiple shift register stages can be cascaded.
</figcaption>
</figure>
Our implementation of this system runs on an STM32F030F4P6_, the smallest, cheapest ARM microcontroller you can get from
ST. This microcontroller has only 16kB of flash and 1kB of RAM, but that's plenty for our use. We use its SPI controller
to feed the modulation data to the shift registers really fast, and we use two timer channels to control the shift
registers' reset and strobe.
We can easily cascade shift registers without any ill side-effects, and even hundreds of channels should be no problem
for this setup. The only reason we chose to stick to a 32-channel board is the mechanics of it. We thought it would be
easier to have several small boards instead of having one huge board with loads of connectors and cables coming off it.
The BOM cost per channel for our system is 3ct for a reasonable MOSFET, about 1ct for one eighth of a shift register
plus less than a cent for one resistor between shift register and MOSFET. In the end, the connectors are more expensive
than the driving circuitry.
.. _MOSFET: https://en.wikipedia.org/wiki/MOSFET
.. _STM32F030F4P6: http://www.st.com/resource/en/datasheet/stm32f030f4.pdf
Hardware design
===============
From this starting point, we made a very prototype-y hardware design for a 32-channel 12V LED tape driver. The design is
based on the STM32F030F4P6_ driving the shift registers as explained above. The system is controlled through an RS485_
bus that is connected up to the microcontroller's UART using an MAX485_-compatible RS485 transceiver. The LED tape is
connected using 9-pin SUB-D_ connectors since they are cheap and good enough for the small current of our short segments
of LED tape. The MOSFETs we use are small SOT-23_ logic-level MOSFETs. In various prototypes we used both International
Rectifier's IRLML6244_ as well as Alpha & Omega Semiconductor's AO3400_. Both are good up to about 30V/5A. Since we're
only driving about 2m of LED tape per channel we're not going above about 0.5A and the MOSFETs don't even get warm.
.. _RS485: https://en.wikipedia.org/wiki/RS-485
.. _MAX485: https://datasheets.maximintegrated.com/en/ds/MAX1487-MAX491.pdf
.. _IRLML6244: https://www.infineon.com/dgdl/?fileId=5546d462533600a4015356686fed261f
.. _AO3400: http://aosmd.com/pdfs/datasheet/AO3400.pdf
.. _SUB-D: https://en.wikipedia.org/wiki/D-subminiature
.. _SOT-23: http://www.nxp.com/documents/outline_drawing/SOT23.pdf
Switching nonlinearities
------------------------
During testing of our initial prototype, we noticed that the brightness seemed to jump around when fading to very low
values. It turned out that our extremely simple LED driving circuit consisting of only the shift register directly
driving a MOSFET, which in turn directly drives the LED tape was maybe a little bit too simple. After some measurements
it turned out that we were looking at about 6Vpp of ringing on the driver's output voltage. The picture below is the
voltrage we saw on our oscilloscope on the LED tape.
.. raw:: html
<figure>
<img src="images/driver_ringing_strong.jpg" alt="Strong ringing on the LED voltage waveform edge at about
100% overshoot during about 70% of the cycle time.">
<figcaption>Bad ringing on the LED output voltage caused by wiring inductance. Note that the effect on the
actual LED current is less bad than this looks since the LED's V/I curve is nonlinear.</figcaption>
</figure>
Dynamic switching behavior: Cause and Effect
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A bit of LTSpice_ action later we found that the inductance of the few metres of cable leading to the LED tape is the
likely culprit. The figure below is the schematic used for the simulations.
.. raw:: html
<figure>
<img src="images/driver_output_ltspice_schematic.jpg" alt="The LTSpice schematic of one output of the driver,
taking into account the shift register's output ESR and the wiring ESL.">
<figcaption>The schematic of the simulation in LTSpice</figcaption>
</figure>
As tested, the driver does not include any per-output smoothing so the ~.5A transient on each BCM cycle hits the cable
in full. Combined with the cable inductance, this works out to a considerable lag of the rising edge of the LED
current, and bad ringing on its falling edge. Below is the voltage on the LED output from an LTSpice simulation of our
driver.
.. raw:: html
<figure>
<img src="images/overshoot_sim_r0.svg" alt="The result of the LTSpice simulation of our driver output. The LED
current shows similar ringing to what we measured using the oscilloscope. Interestingly, the gate voltage shows
strong ringing, too.">
<figcaption>The result of our LTSpice simulation. This simulation assumes 1µH of wiring inductance and 50Ω of
output impedance on the part of the shift register. The ringing at the gate visible in the gate voltage graph is
due to feed-through of the ringing at the output through the MOSFET's parasitic Cgd.</figcaption>
</figure>
We were able to reduce the rining and limit the effect somewhat by
putting a 220Ω series resistor in between the shift register output and the MOSFET gate. This resistor forms an RC
circuit with the MOSFET's nanofarad or two of gate capacitance. The result of this is that the LED current passing the
wire's ESL rises slightly more slowly and thus the series inductance gets excited slightly less, and the overshoot
decreases. Below is a picture of the waveform with the dampening resistor in place and a picture of our measurement for
comparison. The resistor values don't agree perfectly since the estimated ESL and stray capacitance of the wiring is
probably way off.
.. raw:: html
<figure>
<img src="images/driver_ringing_weak.jpg" alt="Weak ringing on the LED voltage waveform edge at about 30%
overshoot during about 20% of the cycle time.">
<figcaption>Adding a resistor in front of the MOSFET gate to slow the transition dampened the ringing somewhat,
but ultimately it cannot be eliminated entirely. Note how you can actually see the miller plateau on the
trailing edge of this signal.
</figcaption>
</figure>
.. raw:: html
<figure>
<img src="images/overshoot_sim_r100.svg" alt="The result of the LTSpice simulation of our driver output with an
extra 100 Ohms between shift register output and MOSFET gate. Similar to the oscilloscope measurement the
ringing is much reduced in its amplitude.">
<figcaption>The LTSpice simulation result with the same parameters as above but with an extra 100Ω between the
shfit register's output and the MOSFET's gate.</figcaption>
</figure>
A side effect of this fix is that now the effective on-time of the LED tape is much longer than the duty cycle at the
shift register's output at very small duty cycles (1µs or less). This is caused by the MOSFET's `miller
plateau`_. For illustration, below is a graph of both the excitation waveform (the boxy line) and the resulting LED
current (the other ones) both without dampening (top) and with 220Ω dampening (bottom). As you can see the effective
duty cycle of the LED current is not at all equal to the 50% duty cycle of the excitation square wave.
.. raw:: html
<figure>
<img src="images/asymmetric_iled.svg" alt="The result of an LTSpice simulation of the LED duty cycle without and
with dampening. Dampening widens the LED current waveform from 50% duty cycle with sharp edges to about 80% duty
cycle with soft edges.">
<figcaption>Simulated LED duty cycle with and without dampening. The dampening resistance used in this
simulation was 220Ω.</figcaption>
</figure>
.. raw:: html
<figure>
<img src="images/asymmetric_vgate.svg" alt="The gate voltages in the spice simulation above. The undampened
response shows sharp edges with the miller plateau being a barely noticeable step, but with strong ringing on
the trailing edge. The dampened response shows RC-like slow-edges, but has wide miller plateaus on both edges
adding up to about 50% of the pulse width.">
<figcaption>The MOSFET gate voltage from the simulation in the figure above. You can clearly see how the miller
plateau (the horizontal part of the trace at about 1V) is getting much wider with added dampening, and how the
resulting gate charge/discharge curve is not at all that of a capacitor anymore.</figcaption>
</figure>
In conclusion, we have three major causes for our calculated LED brightness not matching reality:
* Ringing of the equivalent series inductance of the wiring leading up to the LED tape
* Miller plateau lag
* The dampening resistor and the MOSFET gate forming an RC filter that helps with wire ESL ringing but worsens the
miller plateau issue and deforms the LED current edges.
Added up, these three effects yield a picture that agrees well with our simulations and measurements. The overall effect
is neglegible at long period durations (>10µs), but gets really bad at short period durations (<1µs). The effect is
non-linear, so correcting for it is not as simple as adding an offset.
.. _LTSpice: http://www.analog.com/en/design-center/design-tools-and-calculators/ltspice-simulator.html
.. _`miller plateau`: https://www.vishay.com/docs/68214/turnonprocess.pdf
Measuring LED tape brightness
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In order to correct for the nonlinearities mentioned above, we decided to implement a lookup table mapping BCM period to
actual timer setting. That is, each row of the table contains the actual period length we need to set the
microcontroller's timer to in order to get our intended brightness steps.
To calibrate our driver, we needed a setup for reproducible measurement of the relative brightness of our LED tape at
different settings. Absolute brightness is not of interest to us as the eye can't perceive it. To perform the
calibration, the LED driver is set to enable each single BCM period in turn, i.e. brightness values 1, 2, 4, 8, 16 etc.
The setup we used to measure the LED tape's brightness consists of a bunch of LED tape stuck into a tin can for
shielding against both stray light and electromagnetic interference and a photodiode looking at the LED tape. We used
the venerable BPW34_ photodiode in our setup as I had a bunch leftover from another project and because they are quite
sensitive owing to their physically large die area.
.. raw:: html
<figure>
<img src="images/linearization_setup.jpg" alt="The led measurement setup consists of several PCBs and a
breadboard linked with a bunch of wires and a big tin can to shield the LEDs and the photodiode. A large sub-D
connector is put into the top of the tin can as a feed-through for the LED tape's control signals and the
photodiode signal. In the background the control laptop is visible.">
<figcaption>The LED brighness measurement setup. The big tin can contains a bunch of LED tape and the
photodiode. The breadboard on the right is used for the photodiode preamplifier and for jumpering around the LED
tape's channels. The red board next to it is the buspirate used as ADC. The board on the bottom left is a
TTL-to-RS485 converter and the board in the middle is the unit under test.</figcaption>
</figure>
The photodiode's photocurrent is converted into a voltage using a very simple transimpedance amplifier based around a
MCP6002_ opamp that was dampened into oblivion with a couple nanofarads of capacitance in its feedback loop. The
MCP6002_ is a fine choice here since I had a bunch and because it is a CMOS opamp, meaning it has low bias current that
would mess up our measurements. For many applications, opamp bias current is not a big issue but when using the opamp to
directly measure very small currents at its input it quickly swamps out the signal for most BJT-input types.
The transimpedance amplifier's output is read from the computer using the ADC input of a buspirate USB thinggamajob. In
general I would not recommend the buspirate as a tool for this job since it's ADC is not particularly good and it's
programming interface is positively atrocious, but it was what I had and it beat first wiring up one of the dedicated
ADC chips I had in my parts bin.
The computer runs a small python script cycling the LED tape through all its BCM period settings and taking a brightness
measurement at each step. Later on, these measurements can be plotted to visualize the resulting slope's linearity, and
we can even do a simulation of the resulting brightness for all possible control values by just adding the measured
photocurrents for a certain BCM setpoint just as our retinas would do.
.. raw:: html
<figure>
<img src="images/driver_linearity_raw.svg" alt="">
<figcaption>
A plot of the measured brightness of our LED tape for each BCM period. The brightness values are normalized
to the value measured at the LSB setpoint (brightness=1/65535). Ideally, this plot would show a straight
line with slope 1. Obviously, it doesn't. The bend in the curve is caused by the above-mentioned duty cycle
offset adding an offset to all brightness values. Shown is both the raw data (light), which has essentially zero
measurement error and a linear fit (dark).
The plot is in log-log to approximate how the human eye would perceive brightness, i.e. highly sensitive at
low values but not very sensitive at all at large values.
</figcaption>
</figure>
While it would be possible to fully automate the optimization of BCM driver lookup tables, we needed only one and in the
end I just sat down and manually tweaked the ideal values we initially calculated until I liked the result. You can see
the resulting brightness curve below.
.. raw:: html
<figure>
<figure class="side-by-side">
<img src="images/uncorrected_brightness_sim.svg" alt="">
<figcaption>
Calculated brightness curve for the uncorrected BCM setup. As you can see, at low setpoints the result
is about as smooth as sandpaper, which is well in line with our observations. At high setpoints the
offset gets swamped out and the nonlinearity in the low bits is not visible anymore.
</figcaption>
</figure><figure class="side-by-side">
<img src="images/corrected_brightness_sim.svg" alt="">
<figcaption>
Brightness curve for the corrected BCM setup extrapolated using actual measurements. Looks as buttery
smooth in real life as it does in this plot.
</figcaption>
</figcaption>
</figure>
</figure>
.. _BPW34: http://www.vishay.com/docs/81521/bpw34.pdf
.. _MCP6002: http://ww1.microchip.com/downloads/en/DeviceDoc/21733j.pdf
Controlling the driver
----------------------
Now that our driver was behaving linear enough that you couldn't see it actually wasn't we needed a nice way to control
it from a computer of our choice. In the ultimate application (our staircase) we'll use a raspberry pi for this. Since
we already settled on an RS485_ bus for its robustness and simplicity, we had to device a protocol to control the driver
over this bus. Here, we settled on a simple, COBS_-based protocol for the reasons I wrote about in `How to talk to your
microcontroller over serial <serial-protocols>`_.
To address our driver nodes, we modified the Makefile to build a random 32-bit MAC into each firmware image. The
protocol has only five message types:
1. A 0-byte *ping* packet, to which each node would reply with its own address in the
first 100ms after boot. This can be used to initially discover the addresses of all nodes connected to the bus. You'd
spam the bus with *ping* packets, and then hit reset on each node in turn. The control computer would then receive
each device's MAC address as you hit reset.
2. A 4-byte *address* packet that says which device that the following packet is for. This way of us using the packet
length instead of a packet type field is not particularly elegant, but our system is simple enough and it was easy to
implement.
3. A 64-byte *frame buffer* packet that contains 16 bits of left-aligned brightness data for every channel
4. A one-byte *get status* packet that tells the device to respond with...
5. ...a 27-byte status packet containing a brief description of the firmware (version number, channel count, bit depth
etc.) as well as the device's current life stats (VCC, temperature, uptime, UART frame errors etc.).
Wrapped up in a nice python interface we can now easily enumerate any drivers we connect to a bus, query their status
and control their outputs.
.. _COBS: https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing
Conclusion
----------
.. raw:: html
<figure>
<figure class="side-by-side">
<a href="images/olsndot_schematic.png">
<img src="images/olsndot_schematic.png" alt="A picture of the LED driver schematic">
</a>
<figcaption>The LED driver <a href="images/olsndot_schematic.png">schematic</a></figcaption>
</figure><figure class="side-by-side">
<a href="images/olsndot_pcb.png">
<img src="images/olsndot_pcb.png" alt="A picture of the LED driver PCB layout">
</a>
<figcaption>The LED driver <a href="images/olsndot_pcb.png">PCB layout</a></figcaption>
</figure>
</figure>
Putting some thought into the control circuitry and software, you can easily control large numbers of channels of LEDs
using extremely inexpensive driving hardware without any compromises on dynamic range. The design we settled on can
drive 32 channels of LED tape with a dynamic range of 14bit at a BOM cost of below 10€. All it really takes is a couple
of shift registers and a mildly bored STM32 microcontroller.
Get a PDF file of the schematic and PCB layout `here <olsndot_v02_schematics_and_pcb.pdf>`_ or download the CAD files
and the firmware sources `from github <https://github.com/jaseg/led_drv>`_.

View file

@ -0,0 +1,8 @@
---
title: "How to talk to your microcontroller over serial"
date: 2018-05-19T08:09:46+02:00
draft: true
---