diff --git a/Classes/02_etc/Filter.m b/Classes/02_etc/Filter.m index 6145e5b..5eb5e49 100644 --- a/Classes/02_etc/Filter.m +++ b/Classes/02_etc/Filter.m @@ -300,8 +300,8 @@ classdef Filter < handle xline(fcut_,'LineStyle',':','LineWidth',1,'HandleVisibility','off','Color',p.Color); yline([-3, -6, -9],'LineStyle',':','LineWidth',1,'HandleVisibility','off'); - xlim([0 fc.*2].*1e-9); - ylim([ninedB-6, 2]); + % xlim([0 fc.*2].*1e-9); + % ylim([ninedB-6, 2]); legend end diff --git a/Functions/Theory/Dissertation/PD/100ghz_pd.json b/Functions/Theory/Dissertation/PD/100ghz_pd.json new file mode 100644 index 0000000..9e8479f --- /dev/null +++ b/Functions/Theory/Dissertation/PD/100ghz_pd.json @@ -0,0 +1 @@ +{"version":[4,2],"axesColl":[{"name":"XY","page":2,"type":"XYAxes","isLogX":false,"isLogY":false,"noRotation":false,"calibrationPoints":[{"px":672.9764453961457,"py":934.304068522484,"dx":"1280","dy":"0","dz":null},{"px":1031.4346895074948,"py":935.4603854389723,"dx":"1360","dy":"0","dz":null},{"px":629.0364025695932,"py":935.4603854389723,"dx":"1280","dy":"0","dz":null},{"px":627.880085653105,"py":279.82869379014994,"dx":"1360","dy":"0.7","dz":null}]},{"name":"XY 2","page":6,"type":"XYAxes","isLogX":false,"isLogY":false,"noRotation":false,"calibrationPoints":[{"px":633.6616702355461,"py":933.1477516059957,"dx":"0","dy":"-4","dz":null},{"px":1557.558886509636,"py":936.6167023554605,"dx":"110","dy":"-4","dz":null},{"px":634.8179871520343,"py":935.4603854389723,"dx":"0","dy":"-4","dz":null},{"px":635.9743040685225,"py":353.8329764453961,"dx":"110","dy":"0","dz":null}]}],"datasetColl":[{"name":"Default Dataset","axesName":"XY","colorRGB":[200,0,0,255],"metadataKeys":[],"page":2,"data":[{"x":633.3071787182673,"y":577.4647658054452,"value":[1271,0.3822390561953123]},{"x":635.5370776606076,"y":575.6359885961917,"value":[1271.5,0.38419930758242105]},{"x":637.7666286042502,"y":573.6098961255609,"value":[1272,0.3863702270698115]},{"x":639.995976916481,"y":571.4689116443739,"value":[1272.5,0.38866381361008207]},{"x":642.230310421506,"y":572.1545314775148,"value":[1273,0.3879395121421424]},{"x":644.4586984811842,"y":569.4690837989702,"value":[1273.5,0.3908144071258651]},{"x":646.6941500799323,"y":570.7886627730965,"value":[1274,0.38941324484667683]},{"x":648.9285508236536,"y":571.512406946936,"value":[1274.5,0.3886482390643653]},{"x":651.1641223363288,"y":572.8999771177628,"value":[1275,0.3871744844466787]},{"x":653.4059504472857,"y":577.835038514269,"value":[1275.5,0.3819131706099883]},{"x":655.6380030515553,"y":577.227387619106,"value":[1276,0.3825696588771148]},{"x":657.8726711823107,"y":578.1027402413141,"value":[1276.5,0.38164278490690173]},{"x":660.1095441497883,"y":580.2282352850433,"value":[1277,0.3793811681135283]},{"x":662.3398469562757,"y":578.6284490473311,"value":[1277.5,0.3810969321121832]},{"x":664.565515999188,"y":574.4013188626079,"value":[1278,0.38561783928242943]},{"x":666.7929336853695,"y":571.1656694113638,"value":[1278.5,0.38908016962932246]},{"x":669.0145068959898,"y":564.6162023170924,"value":[1279,0.3960805723111348]},{"x":671.2448612190024,"y":563.0456259491555,"value":[1279.5,0.39776514973186317]},{"x":673.4769690455367,"y":562.4692860780015,"value":[1280,0.3983882080762364]},{"x":675.7092148330142,"y":561.9711700617122,"value":[1280.5,0.3989277489532531]},{"x":677.9481888987452,"y":565.2879878151706,"value":[1281,0.3953941895319796]},{"x":680.179519408631,"y":564.2709094043167,"value":[1281.5,0.39648781234375075]},{"x":682.4123484754377,"y":564.1035127677178,"value":[1282,0.3966742531971841]},{"x":684.6395535474367,"y":560.7473110750219,"value":[1282.5,0.4002652938704556]},{"x":686.8616504437625,"y":554.4947737756743,"value":[1283,0.40694867274287283]},{"x":689.0855575314407,"y":549.2686149731427,"value":[1283.5,0.41253621540584107]},{"x":691.3008933005965,"y":539.1825185684439,"value":[1284,0.42331258033724095]},{"x":693.5217012649551,"y":532.1991568437786,"value":[1284.5,0.43077624043193397]},{"x":695.7407195883775,"y":524.2010687082018,"value":[1285,0.4393232961230962]},{"x":697.9634534024354,"y":518.3096637629574,"value":[1285.5,0.44562110387213405]},{"x":700.1916517203498,"y":515.5166325042912,"value":[1286,0.4486108628977331]},{"x":702.4206678529653,"y":513.1873021812339,"value":[1286.5,0.4511055411347422]},{"x":704.6604841880273,"y":516.9816866453501,"value":[1287,0.4470620968166301]},{"x":706.9003719169557,"y":520.8165514317263,"value":[1287.5,0.4429754327671611]},{"x":709.1434192644718,"y":526.4429199573214,"value":[1288,0.4369760292430348]},{"x":711.3858940887421,"y":531.7446678024951,"value":[1288.5,0.4313232143283202]},{"x":713.6216751715987,"y":533.2510642660843,"value":[1289,0.4297225921323986]},{"x":715.8584344210481,"y":535.3120811877865,"value":[1289.5,0.42752981686391456]},{"x":718.0915236974888,"y":535.2922234136461,"value":[1290,0.42755873451486015]},{"x":720.3232940711464,"y":534.5245477614837,"value":[1290.5,0.42838607683209784]},{"x":722.553492886666,"y":532.8657986450761,"value":[1291,0.4301647938813945]},{"x":724.7864845992644,"y":532.7906221722898,"value":[1291.5,0.430252773791754]},{"x":727.0203093954989,"y":533.1878041211265,"value":[1292,0.42983642955282675]},{"x":729.2518141533301,"y":532.2695242953623,"value":[1292.5,0.43082456782130385]},{"x":731.4861421813973,"y":532.9520386934134,"value":[1293,0.43010358194135434]},{"x":733.72166976563,"y":534.3147014373644,"value":[1293.5,0.4286564203011507]},{"x":735.9566322549334,"y":535.3569553563243,"value":[1294,0.427551350387675]},{"x":738.1919657773755,"y":536.6095850648386,"value":[1294.5,0.4262216680056993]},{"x":740.4274410273686,"y":537.9425742948449,"value":[1295,0.4248061879636029]},{"x":742.663168120456,"y":539.418358559426,"value":[1295.5,0.42323824957412115]},{"x":744.8916356629167,"y":536.7779776185341,"value":[1296,0.42606502803639024]},{"x":747.1220479729774,"y":535.2402799069274,"value":[1296.5,0.42771450181627213]},{"x":749.3478364539875,"y":531.0808711235948,"value":[1297,0.4321631047010831]},{"x":751.5763118314034,"y":528.4449326022867,"value":[1297.5,0.43498514011363654]},{"x":753.8047286702423,"y":525.7758027079068,"value":[1298,0.43784261304613636]},{"x":756.0330217646084,"y":523.0365096974746,"value":[1298.5,0.4407749972159394]},{"x":758.2643958929647,"y":522.044162959376,"value":[1299,0.4418422146980885]},{"x":760.4906691522115,"y":518.1596234362873,"value":[1299.5,0.44599734720216344]},{"x":762.722442459314,"y":517.3936110474142,"value":[1300,0.44682291369874283]},{"x":764.9570802901583,"y":518.2517836199469,"value":[1300.5,0.44591438239702175]},{"x":767.1888469805941,"y":517.4820195810245,"value":[1301,0.4467439544276042]},{"x":769.4204504214267,"y":516.6196930170676,"value":[1301.5,0.4476723529309602]},{"x":771.6506350775716,"y":514.9529155351435,"value":[1302,0.44945964164622887]},{"x":773.8807343000518,"y":513.2376971654236,"value":[1302.5,0.451298649370644]},{"x":776.1069091069824,"y":509.29733517898154,"value":[1303,0.4555133819899133]},{"x":778.3337482622815,"y":505.733658717448,"value":[1303.5,0.45932593779132214]},{"x":780.5589524861426,"y":501.2429761306631,"value":[1304,0.4641282326427819]},{"x":782.7889143186826,"y":499.44985766476617,"value":[1304.5,0.4660504121662704]},{"x":785.0200433705628,"y":498.31855256480264,"value":[1305,0.4672659916854359]},{"x":787.2515377576586,"y":497.39439253211754,"value":[1305.5,0.46826040808978875]},{"x":789.486333036007,"y":498.3418378395213,"value":[1306,0.4672565627341473]},{"x":791.7232891249599,"y":500.5144627597905,"value":[1306.5,0.46494462666243797]},{"x":793.9622436968189,"y":503.82022748771874,"value":[1307,0.4614228682537902]},{"x":796.1986556571566,"y":505.6843314831534,"value":[1307.5,0.4594403315234107]},{"x":798.4362589365055,"y":508.2239133579688,"value":[1308,0.4567366055619595]},{"x":800.6733674530286,"y":510.4829647105012,"value":[1308.5,0.4543323943556662]},{"x":802.908397325111,"y":511.5634246650974,"value":[1309,0.4531865329043713]},{"x":805.1416007747247,"y":511.60830308002005,"value":[1309.5,0.4531463334993213]},{"x":807.3717165635488,"y":509.90247782726414,"value":[1310,0.4549753124500232]},{"x":809.6025120571618,"y":508.58204518977936,"value":[1310.5,0.4563928182609638]},{"x":811.8328717679478,"y":507.0145236894091,"value":[1311,0.45807413408326114]},{"x":814.0626846744261,"y":505.1369641465757,"value":[1311.5,0.46008646903182826]},{"x":816.2917151445325,"y":502.81576318076554,"value":[1312,0.4625724677767604]},{"x":818.522067004561,"y":501.24379030085623,"value":[1312.5,0.4642585362150724]},{"x":820.7549072483938,"y":501.08273103801764,"value":[1313,0.46443821082811676]},{"x":822.9882501690086,"y":501.2066895105279,"value":[1313.5,0.46431357981151344]},{"x":825.2241088977514,"y":502.75711119164674,"value":[1314,0.46266595309664715]},{"x":827.4559702754327,"y":502.0410348209122,"value":[1314.5,0.4634382042743632]},{"x":829.6892256712152,"y":502.1153667135227,"value":[1315,0.46336655819789074]},{"x":831.9242883315632,"y":503.2144176146936,"value":[1315.5,0.46220084770212755]},{"x":834.1575349432525,"y":503.28376892648544,"value":[1316,0.4621345192553813]},{"x":836.3909633972692,"y":503.4562248379532,"value":[1316.5,0.4619581088515051]},{"x":838.6236266258398,"y":503.19479792144244,"value":[1317,0.4622449432593938]},{"x":840.8547839787796,"y":502.07953952218605,"value":[1317.5,0.4634433901557192]},{"x":843.0841925617361,"y":499.97272854248524,"value":[1318,0.46570049058443497]},{"x":845.3144206494019,"y":498.330576732939,"value":[1318.5,0.46746148714378144]},{"x":847.5425111953623,"y":495.47643877641394,"value":[1319,0.47051648811702607]},{"x":849.7704842656564,"y":492.5556921171183,"value":[1319.5,0.4736426053778652]},{"x":852.0010385713184,"y":491.0985059114673,"value":[1320,0.4752061192279773]},{"x":854.2316584996324,"y":489.6785277494427,"value":[1320.5,0.47672990706900487]},{"x":856.4606298392823,"y":487.3237998147945,"value":[1321,0.4792517016402914]},{"x":858.6917677442249,"y":486.1975144011823,"value":[1321.5,0.4804619217778243]},{"x":860.9249088727884,"y":486.2070567806597,"value":[1322,0.48045944968999643]},{"x":863.1580706732966,"y":486.2283201527786,"value":[1322.5,0.48044446341935276]},{"x":865.3913889421417,"y":486.338301071864,"value":[1323,0.48033475585370833]},{"x":867.6226058016792,"y":485.2567829136495,"value":[1323.5,0.48149717921878865]},{"x":869.8539668913409,"y":484.2570432356585,"value":[1324,0.4825722899403748]},{"x":872.0887251258886,"y":485.18348470816045,"value":[1324.5,0.4815908698039817]},{"x":874.324961966269,"y":486.9482956878337,"value":[1325,0.47971434550698255]},{"x":876.5586255388644,"y":487.25406383332876,"value":[1325.5,0.47939560128213987]},{"x":878.7919397824558,"y":487.3617624336089,"value":[1326,0.47928833048577313]},{"x":881.027138843913,"y":488.53815276371944,"value":[1326.5,0.4780400467999897]},{"x":883.2628368085855,"y":489.99742121694226,"value":[1327,0.47648974188994153]},{"x":885.4983557963953,"y":491.3552097891069,"value":[1327.5,0.47504778426945493]},{"x":887.7286275202565,"y":489.73779970232835,"value":[1328,0.4767823647690562]},{"x":889.9570279726012,"y":487.0593786657261,"value":[1328.5,0.4796497575996306]},{"x":892.1871120023533,"y":485.3355460191239,"value":[1329,0.48149796255153543]},{"x":894.4178825942668,"y":484.0009941179355,"value":[1329.5,0.48293054311361827]},{"x":896.6463284201018,"y":481.3482998503742,"value":[1330,0.48577046817752123]},{"x":898.8758677046173,"y":479.315596654651,"value":[1330.5,0.4879484457550308]},{"x":901.1072510571479,"y":478.3284800234318,"value":[1331,0.4890100791953129]},{"x":903.3386026396415,"y":477.32334978122515,"value":[1331.5,0.49009094527466934]},{"x":905.5708243871917,"y":476.8116031261484,"value":[1332,0.49064503921138825]},{"x":907.8030248532343,"y":476.28778985621426,"value":[1332.5,0.4912120163422964]},{"x":910.0363010384723,"y":476.37390937008394,"value":[1333,0.49112778494545795]},{"x":912.2699462142465,"y":476.66924651796836,"value":[1333.5,0.49082017761106833]},{"x":914.5059015670739,"y":478.2744540551303,"value":[1334,0.4891140575382411]},{"x":916.7392628633926,"y":478.40883155172185,"value":[1334.5,0.48897830241499407]},{"x":918.9700188049275,"y":477.0659728859581,"value":[1335,0.49041975188209885]},{"x":921.1990679033282,"y":474.75533416309355,"value":[1335.5,0.49289447360952865]},{"x":923.4301943292163,"y":473.62254012559333,"value":[1336,0.4941116428265213]},{"x":925.6629569986421,"y":473.41749617397,"value":[1336.5,0.49433827868707936]},{"x":927.8942550193892,"y":472.3819964214954,"value":[1337,0.49545156946075475]},{"x":930.1258232456028,"y":471.499703168566,"value":[1337.5,0.4964012858510567]},{"x":932.3569738934469,"y":470.38064298015604,"value":[1338,0.4976037918135337]},{"x":934.590222995679,"y":470.45140642965873,"value":[1338.5,0.4975359556660308]},{"x":936.8234029965417,"y":470.4829894027172,"value":[1339,0.49750995144010873]},{"x":939.0558748317719,"y":470.1130424622088,"value":[1339.5,0.4979126497053521]},{"x":941.2897344386427,"y":470.5299620418849,"value":[1340,0.497475232138574]},{"x":943.5226752649866,"y":470.42593306280907,"value":[1340.5,0.49759401707965406]},{"x":945.7569462178558,"y":471.0760858235671,"value":[1341,0.4969075828334858]},{"x":947.9884297086957,"y":470.1457476136995,"value":[1341.5,0.49790859550840155]},{"x":950.2187848499176,"y":468.5756351704737,"value":[1342,0.4995926776094223]},{"x":952.4478262918827,"y":466.260655248653,"value":[1342.5,0.5020720343160757]},{"x":954.6751489911759,"y":462.9711482318112,"value":[1343,0.5055918669106463]},{"x":956.9035024433435,"y":460.26607809484005,"value":[1343.5,0.5084877122557891]},{"x":959.1326152190853,"y":457.99154442430415,"value":[1344,0.5109238856077332]},{"x":961.3617484962223,"y":455.72863504490874,"value":[1344.5,0.5133476480224053]},{"x":963.5936262584344,"y":455.0218487031476,"value":[1345,0.5141099804906323]},{"x":965.8287960008126,"y":456.1816151155393,"value":[1345.5,0.5128794457064829]},{"x":968.0628690928899,"y":456.71958080732367,"value":[1346,0.5123127905211531]},{"x":970.29758110286,"y":457.6198129443388,"value":[1346.5,0.5113593533744085]},{"x":972.5322409074652,"y":458.49044463934695,"value":[1347,0.5104375198088649]},{"x":974.7685016227906,"y":460.2687927127784,"value":[1347.5,0.5085465423276292]},{"x":977.0072287417971,"y":463.44559167345506,"value":[1348,0.5051624771364174]},{"x":979.2443656899641,"y":465.7207637680545,"value":[1348.5,0.5027410542553522]},{"x":981.4780231577097,"y":466.023070463761,"value":[1349,0.5024260057256427]},{"x":983.7140505617132,"y":467.66913101767983,"value":[1349.5,0.5006762680057522]},{"x":985.9494194155128,"y":468.9417936060143,"value":[1350,0.4993251970666754]},{"x":988.1838908003693,"y":469.7055913035608,"value":[1350.5,0.49851742723413256]},{"x":990.4149922036918,"y":468.55860947134323,"value":[1351,0.4997497443709538]},{"x":992.6464936967346,"y":467.6384785106143,"value":[1351.5,0.5007398590455319]},{"x":994.8795340495803,"y":467.59088105810935,"value":[1352,0.5007983935913018]},{"x":997.1147291328091,"y":468.765015732758,"value":[1352.5,0.49955251820707475]},{"x":999.3478629663402,"y":468.7704218287793,"value":[1353,0.4995544623158038]},{"x":1001.5790244813604,"y":467.6575233291851,"value":[1353.5,0.5007503896118954]},{"x":1003.8121835539349,"y":467.67723996284195,"value":[1354,0.500737054751544]},{"x":1006.045264791923,"y":467.65282438606135,"value":[1354.5,0.5007708386435341]},{"x":1008.2799932680945,"y":468.56239285921777,"value":[1355,0.49980743334640554]},{"x":1010.513395617033,"y":468.72004719134,"value":[1355.5,0.49964682618339445]},{"x":1012.7446869532425,"y":467.68075730601,"value":[1356,0.5007641635781113]},{"x":1014.9773199945158,"y":467.402214191901,"value":[1356.5,0.5010692724813779]},{"x":1017.2092836858044,"y":466.744149636511,"value":[1357,0.5017795860327432]},{"x":1019.442378436718,"y":466.72739588842353,"value":[1357.5,0.5018051896000885]},{"x":1021.6755194493097,"y":466.73687251193417,"value":[1358,0.5018027877181053]},{"x":1023.9075129759794,"y":466.09572461754203,"value":[1358.5,0.5024950398138555]},{"x":1026.1386256215371,"y":464.95511713272947,"value":[1359,0.5037205512345401]},{"x":1028.371332401382,"y":464.71838378869865,"value":[1359.5,0.503981020991427]},{"x":1030.606249713807,"y":465.7350224176812,"value":[1360,0.50290329982148]},{"x":1032.84123890281,"y":466.7924150661961,"value":[1360.5,0.5017820667010949]},{"x":1035.0724216471144,"y":465.6915535708706,"value":[1361,0.5029651424174117]},{"x":1037.3068515336258,"y":466.43182170673435,"value":[1361.5,0.5021824944534237]},{"x":1039.5422900703356,"y":467.7439945051046,"value":[1362,0.5007892395452416]},{"x":1041.7771436928322,"y":468.7245209446432,"value":[1362.5,0.4997500743708827]},{"x":1044.008737211135,"y":467.8565683061033,"value":[1363,0.5006844796799776]},{"x":1046.2395433903118,"y":466.5421943833491,"value":[1363.5,0.5020955167671433]},{"x":1048.4663684274187,"y":462.9705129069152,"value":[1364,0.5059166193037108]},{"x":1050.7021494204355,"y":464.47685843138987,"value":[1364.5,0.5043160514940865]},{"x":1052.9429914994628,"y":468.8528397238435,"value":[1365,0.4996516521717823]}],"autoDetectionData":{"fgColor":[0,0,255],"bgColor":[255,255,255],"mask":[[959996,12],[962148,22],[964307,27],[966467,29],[968624,35],[970784,38],[972944,37],[975104,37],[977264,37],[979422,39],[981580,44],[981673,5],[981679,2],[981682,12],[983740,45],[983811,44],[985899,116],[988057,118],[990213,122],[992372,123],[994523,132],[996683,132],[998843,132],[1001003,132],[1003151,144],[1005299,156],[1007458,157],[1009618,157],[1011778,63],[1011842,93],[1013938,60],[1014002,93],[1016093,63],[1016162,93],[1018252,63],[1018322,1],[1018332,83],[1020403,72],[1020494,81],[1022563,71],[1022654,81],[1024699,16],[1024723,70],[1024816,75],[1024892,3],[1026855,20],[1026883,65],[1026978,42],[1029012,28],[1029042,65],[1031169,96],[1031266,1],[1033326,99],[1035485,99],[1037644,100],[1039804,100],[1041964,89],[1044124,84],[1044209,1],[1046284,76],[1048444,69],[1050604,68],[1052764,65],[1054922,1],[1054924,62],[1057014,28],[1057076,1],[1057078,67],[1059174,29],[1059231,72],[1061329,1],[1061334,29],[1061382,1],[1061384,79],[1063489,34],[1063541,82],[1065642,41],[1065700,83],[1067802,41],[1067858,85],[1069960,42],[1070017,75],[1072115,49],[1072175,73],[1074274,51],[1074333,62],[1076433,53],[1076491,58],[1078592,55],[1078649,58],[1080695,12],[1080751,116],[1082854,14],[1082910,117],[1085013,17],[1085067,118],[1087172,19],[1087227,115],[1089331,21],[1089387,113],[1091490,22],[1091547,111],[1093649,24],[1093707,111],[1095809,25],[1095863,113],[1097969,26],[1098023,105],[1098135,1],[1100128,27],[1100183,102],[1102288,28],[1102343,93],[1102437,1],[1104448,28],[1104503,44],[1104549,43],[1106607,29],[1106663,42],[1106711,38],[1108767,32],[1108823,41],[1108871,36],[1110927,32],[1110983,40],[1111031,34],[1113087,32],[1113143,35],[1113181,1],[1113191,32],[1115246,33],[1115303,34],[1115352,30],[1117406,33],[1117463,33],[1117515,26],[1119566,33],[1119622,32],[1119678,22],[1121725,34],[1121782,30],[1121841,14],[1123885,34],[1123941,31],[1126045,34],[1126100,30],[1128205,34],[1128240,1],[1128260,29],[1130365,52],[1130420,27],[1132525,53],[1132579,27],[1134685,79],[1136845,79],[1139004,79],[1141163,80],[1143324,79],[1145483,80],[1147642,81],[1149801,82],[1151961,82],[1154121,81],[1156281,81],[1158441,81],[1160601,80],[1162761,80],[1164921,80],[1167080,23],[1167109,51],[1169241,21],[1169271,49],[1171400,22],[1171435,45],[1173560,22],[1173596,43],[1175720,22],[1175773,19],[1177879,23],[1177936,13],[1180038,23],[1182197,23],[1184356,24],[1186516,24],[1188675,25],[1190834,26],[1192992,27],[1195151,28],[1197310,28],[1199467,31],[1201627,31],[1203787,30],[1205946,31],[1208074,29],[1208106,31],[1210234,30],[1210265,31],[1212394,30],[1212425,31],[1214554,60],[1216713,60],[1218873,59],[1221031,60],[1223189,61],[1225349,60],[1227506,62],[1229665,62],[1231824,62],[1233983,61],[1236142,61],[1238302,60],[1240462,59],[1242623,57],[1244784,54],[1246945,52],[1249106,50],[1251267,48],[1253428,45],[1255590,42],[1257751,13],[1257767,25],[1259911,12],[1259927,24],[1262071,11],[1262087,24],[1264231,10],[1264246,25],[1266391,9],[1266408,22],[1268551,8],[1268575,15],[1270711,1]],"colorDetectionMode":"fg","colorDistance":5,"algorithm":{"algoType":"XStepWithInterpolationAlgo","xmin":1270,"delx":0.5,"xmax":1370,"ymin":0,"ymax":0.7,"smoothing":0},"name":0,"imageWidth":2160,"imageHeight":1215}},{"name":"Default Dataset 2","axesName":"XY 2","colorRGB":[49,151,128,255],"metadataKeys":[],"page":6,"data":[{"x":637.351298149261,"y":344.6933711981962,"value":[0.29999999999999716,0.06289048304646494]},{"x":638.1901056732626,"y":345.2493400223443,"value":[0.4000000000000057,0.05908863173059098]},{"x":639.0279987558453,"y":346.2652728801483,"value":[0.5,0.05212349046968612]},{"x":639.8654062308897,"y":347.5254663296683,"value":[0.5999999999999801,0.04347850683588783]},{"x":640.7036599268921,"y":348.3600106374097,"value":[0.6999999999999886,0.03776082088577315]},{"x":641.5414220093063,"y":349.44183657999133,"value":[0.7999999999999972,0.030342516078868176]},{"x":642.3775917676404,"y":351.3246015348834,"value":[0.8999999999999915,0.017415949453996937]},{"x":643.2141930834335,"y":352.9902930878259,"value":[1,0.0059822519655732265]},{"x":644.0503742132693,"y":354.8673381773527,"value":[1.09999999999998,-0.006904977686680525]},{"x":644.8858556824333,"y":357.0963125848006,"value":[1.2000000000000028,-0.02221251499623733]},{"x":645.7259260849772,"y":357.0170535021886,"value":[1.3000000000000114,-0.02164574202145575]},{"x":646.5651924840515,"y":357.3422081647538,"value":[1.4000000000000057,-0.023860225493147258]},{"x":647.4042744381528,"y":357.7601386486821,"value":[1.5,-0.026712751945128232]},{"x":648.2427603034536,"y":358.4779017993264,"value":[1.5999999999999943,-0.03162730410002412]},{"x":649.0814730436817,"y":359.08154686150385,"value":[1.7000000000000028,-0.03575703706172284]},{"x":649.921484358092,"y":359.03200911005337,"value":[1.7999999999999972,-0.035394665259939284]},{"x":650.7604889991683,"y":359.48882804564147,"value":[1.9000000000000057,-0.03851463751009643]},{"x":651.5994632224573,"y":359.9609471281465,"value":[2,-0.04173983277196358]},{"x":652.4391978806135,"y":360.0505674724504,"value":[2.0999999999999943,-0.042334486678409444]},{"x":653.2791775583266,"y":360.01694297970164,"value":[2.200000000000003,-0.04208155441441708]},{"x":654.1190597873252,"y":360.03233519033114,"value":[2.299999999999983,-0.042165722518257454]},{"x":654.958972586503,"y":360.0323506008434,"value":[2.4000000000000057,-0.04214414044678261]},{"x":655.7988781586652,"y":360.03600120020445,"value":[2.5,-0.04214755849595253]},{"x":656.6387845990647,"y":360.0392150761029,"value":[2.59999999999998,-0.04214797308650997]},{"x":657.4786913195759,"y":360.04228805598,"value":[2.700000000000003,-0.042147418699202355]},{"x":658.318597886571,"y":360.04543825439487,"value":[2.8000000000000114,-0.04214739536346901]},{"x":659.1585041847594,"y":360.04872366256546,"value":[2.9000000000000057,-0.04214830189970309]},{"x":659.9984113890305,"y":360.05155331110166,"value":[3,-0.04214607406071735]},{"x":660.8383172515864,"y":360.05505784240745,"value":[3.1000000000000085,-0.042148487562625014]},{"x":661.6782216359944,"y":360.059305882096,"value":[3.200000000000003,-0.04215601436126759]},{"x":662.5181455738826,"y":360.0537185211828,"value":[3.299999999999997,-0.04209590060205759]},{"x":663.3579794074836,"y":360.09345361683336,"value":[3.3999999999999915,-0.04234748093334462]},{"x":664.198116696851,"y":359.98055046194196,"value":[3.499999999999986,-0.04154932909464337]},{"x":665.0374388075238,"y":360.2776821905103,"value":[3.5999999999999943,-0.04357109170371043]},{"x":665.8756951033639,"y":361.1109187798179,"value":[3.6999999999999886,-0.049279784140702]},{"x":666.7156767893595,"y":361.076284120965,"value":[3.799999999999997,-0.04901990470683071]},{"x":667.5549185965036,"y":361.41380852440994,"value":[3.9000000000000057,-0.05131945804069549]},{"x":668.3937868987414,"y":361.93920589569996,"value":[4,-0.0549110616798929]},{"x":669.2333338232827,"y":362.12325624845215,"value":[4.1000000000000085,-0.05615513483301182]},{"x":670.0733322249724,"y":362.08021359542573,"value":[4.200000000000017,-0.05583743147926645]},{"x":670.9132171535546,"y":362.0942479154591,"value":[4.299999999999997,-0.055912261023230325]},{"x":671.7531262683752,"y":362.09611655762205,"value":[4.400000000000006,-0.055903424098370014]},{"x":672.5930337929533,"y":362.09878509179595,"value":[4.5,-0.05590008823483261]},{"x":673.4329395050991,"y":362.10236527937036,"value":[4.599999999999994,-0.05590302204419162]},{"x":674.2728464413419,"y":362.105329746159,"value":[4.700000000000003,-0.05590172138470528]},{"x":675.112752879095,"y":362.10854495327743,"value":[4.799999999999997,-0.05590214513040248]},{"x":675.9526594663209,"y":362.1116849754942,"value":[4.8999999999999915,-0.055902051810359676]},{"x":676.7925660244391,"y":362.1148396389884,"value":[5,-0.05590205918211577]},{"x":677.6324726124797,"y":362.11797925153775,"value":[5.099999999999994,-0.05590196304468531]},{"x":678.4723790000238,"y":362.1212197137857,"value":[5.200000000000003,-0.05590256047634856]},{"x":679.3122862287807,"y":362.12403704591696,"value":[5.299999999999983,-0.05590024793430537]},{"x":680.1521907993869,"y":362.1281914279492,"value":[5.3999999999999915,-0.05590713062536423]},{"x":680.9921017459457,"y":362.1291387058644,"value":[5.5,-0.05589195724363494]},{"x":681.8320037068818,"y":362.13460575188157,"value":[5.599999999999994,-0.055907867459632055]},{"x":682.6718951686181,"y":362.1453538954632,"value":[5.699999999999989,-0.05596009713019923]},{"x":683.5119201407359,"y":362.08894631711485,"value":[5.799999999999997,-0.05555047977711158]},{"x":684.3511636856623,"y":362.4255966160485,"value":[5.8999999999999915,-0.057844021671365375]},{"x":685.1905305344534,"y":362.70022507109474,"value":[6,-0.05971102353034308]},{"x":686.0305692753117,"y":362.6368918162565,"value":[6.09999999999998,-0.05925377653406594]},{"x":686.8704477565757,"y":362.6541691373835,"value":[6.199999999999989,-0.05935090902347895]},{"x":687.7103560874064,"y":362.6564321264806,"value":[6.299999999999983,-0.059344784123038785]},{"x":688.550264972359,"y":362.6584163922351,"value":[6.3999999999999915,-0.05933674237110065]},{"x":689.3901694014605,"y":362.66264195102275,"value":[6.499999999999972,-0.059344114562855044]},{"x":690.2300788455893,"y":362.6643449512234,"value":[6.599999999999994,-0.059334138475983345]},{"x":691.0699792586341,"y":362.67059058655474,"value":[6.699999999999989,-0.05935540324922561]},{"x":691.9098960774988,"y":362.6685840946022,"value":[6.799999999999997,-0.059319916038937937]},{"x":692.7498038028806,"y":362.67115162450926,"value":[6.8999999999999915,-0.059315885543302915]},{"x":693.5896156289831,"y":362.72195649186233,"value":[7,-0.05964359551725362]},{"x":694.4302623709057,"y":362.3527987017226,"value":[7.099999999999994,-0.05708311520994247]},{"x":695.270612934723,"y":362.13261849855735,"value":[7.199999999999989,-0.055547191755839]},{"x":696.110389024998,"y":362.2013984871713,"value":[7.299999999999997,-0.055998521222151876]},{"x":696.9503284860368,"y":362.1880029815038,"value":[7.399999999999977,-0.05588470886047858]},{"x":697.7902300846246,"y":362.1936522887888,"value":[7.499999999999986,-0.05590187253368928]},{"x":698.6301378095379,"y":362.1962200543199,"value":[7.599999999999994,-0.05589784365850026]},{"x":699.4700339094532,"y":362.20463519384475,"value":[7.699999999999989,-0.05593402866528008]},{"x":700.3099840125188,"y":362.185886748747,"value":[7.799999999999983,-0.055783402774205904]},{"x":701.149760201951,"y":362.2546168612514,"value":[7.899999999999977,-0.056234389229795845]},{"x":701.9899600990154,"y":362.1102220347682,"value":[7.999999999999972,-0.055219661135540665]},{"x":702.8306610743861,"y":361.7137848202586,"value":[8.09999999999998,-0.0524715732708958]},{"x":703.6696971858104,"y":362.15477417076613,"value":[8.199999999999989,-0.05548268142809043]},{"x":704.5094062323352,"y":362.25727716568264,"value":[8.299999999999969,-0.05616593260772795]},{"x":705.3494130677715,"y":362.20999233824057,"value":[8.399999999999991,-0.055819054738820206]},{"x":706.189308247214,"y":362.2188704756015,"value":[8.499999999999986,-0.05585842389977769]},{"x":707.0291551992368,"y":362.2520070049824,"value":[8.599999999999994,-0.056064624208270075]},{"x":707.8691595571669,"y":362.20596836313985,"value":[8.700000000000003,-0.055726316675493326]},{"x":708.7099460820857,"y":361.76649972582743,"value":[8.799999999999983,-0.05268229074371167]},{"x":709.5499686501515,"y":361.711301385675,"value":[8.899999999999991,-0.05228098963003891]},{"x":710.3897998663253,"y":361.75235304717233,"value":[8.999999999999986,-0.05254162432036491]},{"x":711.2297349190615,"y":361.7411749177867,"value":[9.09999999999998,-0.052443061420786474]},{"x":712.0696377890558,"y":361.746184707568,"value":[9.199999999999974,-0.05245582696905471]},{"x":712.9095366583042,"y":361.75320687251974,"value":[9.299999999999983,-0.052482432134502766]},{"x":713.7494413808768,"y":361.75728481541773,"value":[9.399999999999963,-0.05248878913414412]},{"x":714.5894420739979,"y":361.71308957247646,"value":[9.499999999999986,-0.05216315912565728]},{"x":715.4286172695423,"y":362.08411961049995,"value":[9.599999999999966,-0.05469313925207242]},{"x":716.2680529840687,"y":362.32410860061157,"value":[9.69999999999996,-0.05632191667802644]},{"x":717.1081570099574,"y":362.2279369756533,"value":[9.799999999999983,-0.05563883183702423]},{"x":717.9478966953299,"y":362.3150286301922,"value":[9.899999999999991,-0.05621609529916949]},{"x":718.7869112061042,"y":362.766883107657,"value":[9.999999999999986,-0.05930192570493231]},{"x":719.6258976800781,"y":363.23284009570756,"value":[10.09999999999998,-0.06248474267197279]},{"x":720.4657427076163,"y":363.26694464086717,"value":[10.199999999999974,-0.06269760027180782]},{"x":721.3052417275264,"y":363.4750910230355,"value":[10.299999999999983,-0.06410738796343418]},{"x":722.1440866396092,"y":364.01225364226104,"value":[10.399999999999977,-0.06777990421268809]},{"x":722.9834203453007,"y":364.30355307639365,"value":[10.499999999999986,-0.06976155664575234]},{"x":723.8233455129152,"y":364.29734716319484,"value":[10.599999999999966,-0.06969718894474974]},{"x":724.6624329810352,"y":364.7125040957737,"value":[10.699999999999974,-0.07253064097687689]},{"x":725.5013982415265,"y":365.1891314655419,"value":[10.799999999999983,-0.07578684087981546]},{"x":726.3409260219834,"y":365.38281129269785,"value":[10.899999999999977,-0.07709713838381482]},{"x":727.181359513484,"y":365.12091846471463,"value":[10.999999999999957,-0.07527434657259491]},{"x":728.0220523471345,"y":364.7285765355415,"value":[11.09999999999998,-0.07255442302946014]},{"x":728.8629533181045,"y":364.23154153456585,"value":[11.199999999999974,-0.06911449853600082]},{"x":729.7054281170351,"y":362.94287106933626,"value":[11.299999999999969,-0.06023029509685829]},{"x":730.5471422343146,"y":362.0368234747175,"value":[11.399999999999977,-0.053977486703372435]},{"x":731.3884510119298,"y":361.33466173119103,"value":[11.499999999999972,-0.049126853296412865]},{"x":732.2274209424249,"y":361.80894008905074,"value":[11.599999999999966,-0.052366898445485255]},{"x":733.0644384196269,"y":363.26530245338824,"value":[11.69999999999996,-0.06236098572731841]},{"x":733.9019042774127,"y":364.4961293840453,"value":[11.799999999999969,-0.07080400832276945]},{"x":734.7392897780919,"y":365.76737593932637,"value":[11.899999999999963,-0.07952500698330311]},{"x":735.5774610734425,"y":366.64336777488904,"value":[11.999999999999957,-0.08552773815089099]},{"x":736.4157472972518,"y":367.4615505957792,"value":[12.09999999999998,-0.09113290198393686]},{"x":737.2539809990309,"y":368.30615199778066,"value":[12.19999999999996,-0.09691975313572154]},{"x":738.0921671755481,"y":369.17465860655375,"value":[12.299999999999969,-0.10287100649003023]},{"x":738.9305188709043,"y":369.9599092393006,"value":[12.399999999999963,-0.10824968726788198]},{"x":739.7696589934612,"y":370.3485809900608,"value":[12.499999999999957,-0.1109009939512231]},{"x":740.6094775678447,"y":370.39599147213175,"value":[12.599999999999966,-0.1112053598720597]},{"x":741.4500894268433,"y":370.0443797928197,"value":[12.699999999999974,-0.10876554864296839]},{"x":742.2908787753736,"y":369.6034908789723,"value":[12.799999999999969,-0.10571175510730146]},{"x":743.1316400687045,"y":369.1767137303996,"value":[12.899999999999977,-0.10275501177976754]},{"x":743.9722907553863,"y":368.8055717263931,"value":[12.999999999999972,-0.10018088552774262]},{"x":744.8120444282504,"y":368.8856276726751,"value":[13.099999999999966,-0.10070976263017961]},{"x":745.6503279106474,"y":369.7051894239173,"value":[13.199999999999974,-0.10632440971886759]},{"x":746.488250499,"y":370.7062808794854,"value":[13.299999999999955,-0.11318748287220792]},{"x":747.3278967437597,"y":370.84037316229416,"value":[13.399999999999963,-0.11408798163958833]},{"x":748.167012198113,"y":371.24145301952444,"value":[13.499999999999972,-0.11682462203504951]},{"x":749.0054973929344,"y":371.9595534212268,"value":[13.599999999999966,-0.12174149355146646]},{"x":749.8455236212444,"y":371.9025139782491,"value":[13.69999999999996,-0.12132753070420499]},{"x":750.6845383886756,"y":372.35423935726135,"value":[13.799999999999969,-0.1244124732669909]},{"x":751.5243142548196,"y":372.4231320836923,"value":[13.899999999999949,-0.12486457806001816]},{"x":752.3642740366226,"y":372.3995152337732,"value":[13.999999999999972,-0.12468047090760015]},{"x":753.20426320368,"y":372.3611176008496,"value":[14.099999999999966,-0.124394712541529]},{"x":754.0438582406512,"y":372.520967401255,"value":[14.19999999999996,-0.12547235232529497]},{"x":754.8829454165078,"y":372.93627134228143,"value":[14.299999999999969,-0.12830681537200128]},{"x":755.7228983364515,"y":372.91610600749334,"value":[14.399999999999949,-0.12814644516923623]},{"x":756.5628261440562,"y":372.90857217924537,"value":[14.499999999999957,-0.12807294505783773]},{"x":757.4027173364562,"y":372.91945579898044,"value":[14.599999999999952,-0.12812610643245703]},{"x":758.2426230116453,"y":372.92305457584075,"value":[14.69999999999996,-0.12812916808507513]},{"x":759.0825508034428,"y":372.9155286985809,"value":[14.799999999999955,-0.12805572265464926]},{"x":759.9224121795264,"y":372.94140992543726,"value":[14.899999999999949,-0.12821202639766094]},{"x":760.7623395209264,"y":372.9341105981601,"value":[14.999999999999957,-0.12814013900923316]},{"x":761.6031001736874,"y":372.5076556563177,"value":[15.099999999999952,-0.1251856115795431]},{"x":762.4432744203589,"y":372.376162977452,"value":[15.199999999999946,-0.12425961484435444]},{"x":763.282863416901,"y":372.53905111370796,"value":[15.299999999999955,-0.1253581500385046]},{"x":764.1235302926826,"y":372.15976599251746,"value":[15.399999999999963,-0.12272802149320317]},{"x":764.9651936207434,"y":371.27926537484205,"value":[15.499999999999957,-0.11665090617434393]},{"x":765.8057625771111,"y":370.9492337188654,"value":[15.599999999999966,-0.11435950626838975]},{"x":766.6455727335767,"y":371.000878413534,"value":[15.69999999999996,-0.11469299194893656]},{"x":767.4869031791783,"y":370.28781767287467,"value":[15.799999999999955,-0.10976740335957436]},{"x":768.3284819143834,"y":369.4498672616588,"value":[15.899999999999963,-0.10398291666035409]},{"x":769.170521212214,"y":368.3802538497595,"value":[15.999999999999957,-0.09660522443401298]},{"x":770.0127163144684,"y":367.2322708126941,"value":[16.09999999999995,-0.08868856431204453]},{"x":770.8543479139825,"y":366.3677296540653,"value":[16.199999999999946,-0.08272120626252821]},{"x":771.6976476284327,"y":364.66412668254463,"value":[16.29999999999997,-0.07098340617456911]},{"x":772.5403372777428,"y":363.26738647647096,"value":[16.39999999999995,-0.06135597957109207]},{"x":773.3817094527465,"y":362.5333358465533,"value":[16.499999999999957,-0.056286038161118324]},{"x":774.2212810050628,"y":362.70499842839246,"value":[16.599999999999966,-0.05744491745492786]},{"x":775.0585899921808,"y":364.0147313049779,"value":[16.69999999999996,-0.06643059636064441]},{"x":775.8952823584409,"y":365.6346244730725,"value":[16.79999999999997,-0.07754932667840375]},{"x":776.733611236494,"y":366.4313522092914,"value":[16.899999999999977,-0.08300693842336315]},{"x":777.5710984019471,"y":367.6514613833092,"value":[16.99999999999997,-0.0913762522735011]},{"x":778.4087631821506,"y":368.7822303379458,"value":[17.09999999999998,-0.09913115065421785]},{"x":779.248311009079,"y":368.9658267898617,"value":[17.199999999999974,-0.10037210221554593]},{"x":780.0876193206312,"y":369.26989947592983,"value":[17.299999999999955,-0.10244159955920384]},{"x":780.9259574404647,"y":370.06197859668646,"value":[17.399999999999977,-0.10786724159028616]},{"x":781.7659810618683,"y":370.0062504276306,"value":[17.499999999999986,-0.10746229670814467]},{"x":782.6049959890724,"y":370.4578954408161,"value":[17.59999999999998,-0.11054668657464761]},{"x":783.4452648485119,"y":370.2788125396965,"value":[17.699999999999974,-0.10929339974605501]},{"x":784.2864265695447,"y":369.65062025712155,"value":[17.79999999999997,-0.10495147318342735]},{"x":785.1263516569018,"y":369.6444547134742,"value":[17.899999999999977,-0.10488738311412371]},{"x":785.9653993351517,"y":370.0796259506916,"value":[17.999999999999986,-0.10785847862266973]},{"x":786.8043544475927,"y":370.5613577897928,"value":[18.09999999999998,-0.11114978326279257]},{"x":787.6408583104962,"y":372.2760681462983,"value":[18.19999999999999,-0.12292059556255452]},{"x":788.4786897934366,"y":373.32298562419635,"value":[18.299999999999997,-0.13009882595657052]},{"x":789.3172497088572,"y":374.00350156457984,"value":[18.39999999999999,-0.13475721954888842]},{"x":790.1549704284092,"y":375.106133026768,"value":[18.49999999999997,-0.14231860921929806]},{"x":790.9924495130441,"y":376.33030685237276,"value":[18.59999999999998,-0.15071587671483888]},{"x":791.830855651512,"y":377.0881725999839,"value":[18.700000000000003,-0.15590622465477955]},{"x":792.6699370109714,"y":377.50640218886525,"value":[18.799999999999997,-0.15876080812779136]},{"x":793.5090206390997,"y":377.92349063716534,"value":[18.89999999999999,-0.1616075436860478]},{"x":794.3481066570441,"y":378.3393770081092,"value":[19,-0.16444601225180966]},{"x":795.1870984110167,"y":378.80267815682845,"value":[19.099999999999994,-0.16761056433456023]},{"x":796.0264016077566,"y":379.1093235935451,"value":[19.19999999999999,-0.16969775514044994]},{"x":796.866432051823,"y":379.05016362507456,"value":[19.299999999999997,-0.16926920889866404]},{"x":797.7063415881576,"y":379.0518202458086,"value":[19.40000000000002,-0.169258913848374]},{"x":798.5454052261983,"y":379.4789637082571,"value":[19.50000000000003,-0.17217480030284316]},{"x":799.3850165823786,"y":379.63060494645913,"value":[19.60000000000001,-0.17319598771124634]},{"x":800.2251624466035,"y":379.51338863822826,"value":[19.700000000000003,-0.17236817321722508]},{"x":801.064644471534,"y":379.7300834951323,"value":[19.80000000000001,-0.17383675094937168]},{"x":801.9038133004102,"y":380.1043159673593,"value":[19.90000000000002,-0.17638875503238927]},{"x":802.7437665887549,"y":380.08396532689574,"value":[20.000000000000014,-0.17622711043524308]},{"x":803.582823389458,"y":380.5145479701232,"value":[20.10000000000001,-0.1791666490128807]},{"x":804.4224997994852,"y":380.63346712340297,"value":[20.200000000000017,-0.17996279829951556]},{"x":805.2625146649394,"y":380.5821431968943,"value":[20.300000000000026,-0.17958814251640298]},{"x":806.1023786230611,"y":380.6067256585945,"value":[20.40000000000002,-0.17973551432026502]},{"x":806.9423075215569,"y":380.59864311207684,"value":[20.500000000000014,-0.17965824053340862]},{"x":807.7822010059757,"y":380.60837384635283,"value":[20.60000000000001,-0.17970347322075364]},{"x":808.6220558000138,"y":380.6375658422708,"value":[20.70000000000003,-0.17988254596681008]},{"x":809.4626737559705,"y":380.28288739290196,"value":[20.800000000000026,-0.1774216437780467]},{"x":810.3034412991619,"y":379.8529665645113,"value":[20.90000000000002,-0.17444328056280245]},{"x":811.1442941018673,"y":379.3801602006643,"value":[21.00000000000003,-0.17116998258490268]},{"x":811.9847106259034,"y":379.1268020074371,"value":[21.100000000000023,-0.1694058856331342]},{"x":812.8246928137129,"y":379.09191493617953,"value":[21.200000000000017,-0.16914427029479429]},{"x":813.6663229757418,"y":378.2280968325814,"value":[21.300000000000026,-0.16318188487909469]},{"x":814.5072904420326,"y":377.69761468522023,"value":[21.400000000000034,-0.15951193583130197]},{"x":815.3474507806023,"y":377.5731177816211,"value":[21.500000000000043,-0.15863405082646365]},{"x":816.186886765211,"y":377.8129709202879,"value":[21.600000000000023,-0.160261893967391]},{"x":817.0258687661398,"y":378.2811778501071,"value":[21.70000000000003,-0.1634601843576835]},{"x":817.8649622136911,"y":378.69332712869647,"value":[21.80000000000004,-0.16627295198640812]},{"x":818.7040325193476,"y":379.1171167804663,"value":[21.900000000000034,-0.16916577342965633]},{"x":819.543085447572,"y":379.5496472805056,"value":[22.000000000000043,-0.17211870791527062]},{"x":820.382244758509,"y":379.92866727609425,"value":[22.100000000000037,-0.1747036370172097]},{"x":821.2209147252698,"y":380.5538273923349,"value":[22.200000000000045,-0.17898133449179365]},{"x":822.0588868832821,"y":381.52998530914203,"value":[22.300000000000054,-0.1856729333413072]},{"x":822.8974586821903,"y":382.20452385524806,"value":[22.400000000000063,-0.19029021886901187]},{"x":823.7374509949677,"y":382.1645439250583,"value":[22.500000000000043,-0.18999357864117394]},{"x":824.5765820554319,"y":382.5577739085345,"value":[22.60000000000005,-0.1926762334532004]},{"x":825.4155878966645,"y":383.01398916549135,"value":[22.70000000000006,-0.19579205405147881]},{"x":826.2546840065424,"y":383.42479929376987,"value":[22.80000000000004,-0.19859561200204778]},{"x":827.0937665458771,"y":383.8424354053923,"value":[22.90000000000005,-0.2014461139806194]},{"x":827.9327947016645,"y":384.2874264412134,"value":[23.000000000000043,-0.2044847427480998]},{"x":828.7719068096204,"y":384.690189536363,"value":[23.10000000000005,-0.2072329591999389]},{"x":829.6118078678534,"y":384.696110642123,"value":[23.20000000000006,-0.20725199210056733]},{"x":830.4516995915642,"y":384.70672701250476,"value":[23.300000000000054,-0.20730331553323866]},{"x":831.2917920315318,"y":384.6163831057483,"value":[23.400000000000063,-0.2066603093963124]},{"x":832.1309641221943,"y":384.988974899486,"value":[23.50000000000007,-0.20920103011500402]},{"x":832.9689740073982,"y":385.9461560388551,"value":[23.60000000000008,-0.21576212082721513]},{"x":833.8072757420307,"y":386.75653691558284,"value":[23.70000000000006,-0.22131362870084903]},{"x":834.6455513462003,"y":387.580061415259,"value":[23.800000000000068,-0.22695552862097346]},{"x":835.4829782608407,"y":388.83047674805334,"value":[23.900000000000077,-0.2355332656527418]},{"x":836.3208360903446,"y":389.8641419044731,"value":[24.00000000000007,-0.2426203564527607]},{"x":837.159482014646,"y":390.50139537778756,"value":[24.10000000000005,-0.24698122302761005]},{"x":837.9989514263353,"y":390.7244346949934,"value":[24.200000000000074,-0.24849343323101758]},{"x":838.838803165408,"y":390.7551633384176,"value":[24.300000000000068,-0.24868307389380195]},{"x":839.6778234126391,"y":391.20413237803183,"value":[24.400000000000063,-0.25174906040771283]},{"x":840.5176359737554,"y":391.25456753345,"value":[24.50000000000007,-0.25207422777841515]},{"x":841.3576167952672,"y":391.2203677100607,"value":[24.600000000000094,-0.25181733881890533]},{"x":842.1974838510083,"y":391.2433920691721,"value":[24.700000000000074,-0.25195399515396577]},{"x":843.0374243528198,"y":391.22947305491437,"value":[24.800000000000082,-0.25183658249022844]},{"x":843.8772834161997,"y":391.25651757170704,"value":[24.900000000000077,-0.2520008864747574]},{"x":844.717204807408,"y":391.25221119089235,"value":[25.0000000000001,-0.2519495823423199]},{"x":845.557973456491,"y":390.8217340991089,"value":[25.100000000000094,-0.24896739356188258]},{"x":846.398093450785,"y":390.7175303660993,"value":[25.200000000000088,-0.2482290698657157]},{"x":847.2379237119933,"y":390.75906237523606,"value":[25.300000000000068,-0.24849300802924024]},{"x":848.0777952485425,"y":390.77983288793627,"value":[25.40000000000009,-0.24861416408782588]},{"x":848.9178446672968,"y":390.7111286514958,"value":[25.500000000000085,-0.24811997948153186]},{"x":849.7586692011722,"y":390.252541509075,"value":[25.600000000000094,-0.24494447071511916]},{"x":850.5994965758865,"y":389.79252542467236,"value":[25.700000000000088,-0.24175913475033362]},{"x":851.4393241139395,"y":389.83542718098334,"value":[25.800000000000082,-0.2420324930144453]},{"x":852.2803071011366,"y":389.29713801785584,"value":[25.90000000000012,-0.2383088531285269]},{"x":853.1218619346394,"y":388.4712101628381,"value":[26.0000000000001,-0.23260704861389625]},{"x":853.9621229026197,"y":388.2960966656313,"value":[26.100000000000094,-0.23138106038816453]},{"x":854.8021193697087,"y":388.25402711680084,"value":[26.200000000000102,-0.23107004932010566]},{"x":855.6437170157241,"y":387.4065645680655,"value":[26.30000000000011,-0.2252201452256779]},{"x":856.4853523699418,"y":386.54013479345986,"value":[26.40000000000012,-0.21923979868251342]},{"x":857.326894750965,"y":385.7204705356431,"value":[26.5000000000001,-0.21358107052297903]},{"x":858.1684773993211,"y":384.8805518094688,"value":[26.600000000000094,-0.2077830472198925]},{"x":859.0100696162496,"y":384.0358200914458,"value":[26.700000000000117,-0.20195192374460413]},{"x":859.851614925607,"y":383.214682881514,"value":[26.80000000000011,-0.19628306571778875]},{"x":860.6931747080172,"y":382.38626572609905,"value":[26.900000000000105,-0.1905641416495829]},{"x":861.5355790467488,"y":381.13303674105845,"value":[27.000000000000114,-0.18192367830687362]},{"x":862.377494523329,"y":380.12570541817377,"value":[27.100000000000122,-0.17497431588790802]},{"x":863.2187178781567,"y":379.46651133680524,"value":[27.200000000000117,-0.17041918204987194]},{"x":864.0610382577349,"y":378.2555138058211,"value":[27.300000000000097,-0.16206915518524756]},{"x":864.9042122903643,"y":376.61512879025116,"value":[27.400000000000134,-0.1507661211002187]},{"x":865.7456615797998,"y":375.8422896011207,"value":[27.500000000000128,-0.14542942087789834]},{"x":866.5871244485536,"y":375.0626200148813,"value":[27.600000000000122,-0.14004574627298672]},{"x":867.4294857179758,"y":373.83105489236107,"value":[27.700000000000102,-0.13155427083686755]},{"x":868.2714840488937,"y":372.78204783763624,"value":[27.80000000000014,-0.12431829378320103]},{"x":869.1128807995589,"y":372.03563565000536,"value":[27.90000000000012,-0.11916333878877738]},{"x":869.9546068110367,"y":371.1236052735813,"value":[28.000000000000128,-0.11286938527927459]},{"x":870.7960804046196,"y":370.3385410982329,"value":[28.100000000000122,-0.10744861070950185]},{"x":871.6358854332642,"y":370.3927650869524,"value":[28.200000000000117,-0.10779983485292677]},{"x":872.4772882695398,"y":369.6432918372782,"value":[28.300000000000125,-0.10262382815429527]},{"x":873.318020136278,"y":369.23131626486867,"value":[28.40000000000012,-0.09976887904026865]},{"x":874.1574562868606,"y":369.47108591880726,"value":[28.500000000000128,-0.10139614803543218]},{"x":874.9961062149663,"y":370.1063254786082,"value":[28.600000000000136,-0.10574316441352405]},{"x":875.8333345850799,"y":371.4566087083791,"value":[28.70000000000013,-0.1150077184379743]},{"x":876.6706910942573,"y":372.74243798903524,"value":[28.800000000000125,-0.12382900621934079]},{"x":877.5089742335912,"y":373.56217230102106,"value":[28.90000000000012,-0.1294448400522641]},{"x":878.346476193103,"y":374.7748400635533,"value":[29.000000000000142,-0.1377629774181406]},{"x":879.1845923852513,"y":375.6785488098507,"value":[29.100000000000136,-0.14395632484834664]},{"x":880.0238944311187,"y":375.98577313544854,"value":[29.200000000000145,-0.1460474968206822]},{"x":880.8629324010215,"y":376.4258276713057,"value":[29.30000000000014,-0.149052176019159]},{"x":881.7020209597389,"y":376.8404360333828,"value":[29.400000000000134,-0.15188185539206644]},{"x":882.5403926891196,"y":377.61560955182443,"value":[29.500000000000142,-0.1571912332852925]},{"x":883.3780628675396,"y":378.74366320347946,"value":[29.60000000000015,-0.1649274578350335]},{"x":884.2149309810927,"y":380.2751554831266,"value":[29.70000000000013,-0.1754382327017221]},{"x":885.0514614986549,"y":381.97645854637614,"value":[29.800000000000153,-0.18711683962705639]},{"x":885.8879614097066,"y":383.69315668433114,"value":[29.900000000000162,-0.19890132240670777]},{"x":886.7245474826269,"y":385.36651540233913,"value":[30.00000000000017,-0.21038774894432644]},{"x":887.5628339418008,"y":386.18457983471995,"value":[30.10000000000015,-0.21599209858940638]},{"x":888.3998419174217,"y":387.64572149440676,"value":[30.20000000000016,-0.22601905430402258]},{"x":889.236242024931,"y":389.4126208141573,"value":[30.300000000000168,-0.23814878341161094]},{"x":890.0727740908683,"y":391.1131450446318,"value":[30.400000000000162,-0.24982203410535675]},{"x":890.9095449074218,"y":392.6935777150887,"value":[30.500000000000156,-0.26066938451888566]},{"x":891.746969120869,"y":393.94535174808044,"value":[30.600000000000165,-0.26925646567836425]},{"x":892.5835011883123,"y":395.6458752210977,"value":[30.700000000000173,-0.2809297111628841]},{"x":893.4207317716194,"y":396.9950452145115,"value":[30.800000000000168,-0.2901866091770442]},{"x":894.2581548231082,"y":398.2474037125782,"value":[30.900000000000162,-0.2987777098518758]},{"x":895.095805019345,"y":399.3855084024095,"value":[31.00000000000017,-0.3065830579540547]},{"x":895.9343574147066,"y":400.06980693251217,"value":[31.100000000000193,-0.31126746538038885]},{"x":896.7734853602841,"y":400.4646037039076,"value":[31.200000000000173,-0.3139608953924493]},{"x":897.6125601775722,"y":400.88612400491985,"value":[31.300000000000182,-0.3168381099318789]},{"x":898.4515843001617,"y":401.333143739335,"value":[31.400000000000162,-0.31989069057688546]},{"x":899.2910281311752,"y":401.5690501365125,"value":[31.500000000000185,-0.3214913909702166]},{"x":900.1318409120104,"y":401.1163747733355,"value":[31.60000000000018,-0.3183565390170999]},{"x":900.9736098875755,"y":400.1827334609439,"value":[31.700000000000173,-0.31191396159040696]},{"x":901.8151285853826,"y":399.37498186097037,"value":[31.800000000000182,-0.3063371598164526]},{"x":902.656697647472,"y":398.54189702692526,"value":[31.90000000000019,-0.3005861349321024]},{"x":903.4984826130902,"y":397.6002127178463,"value":[32.000000000000185,-0.2940882437663177]},{"x":904.338612564033,"y":397.4910007905228,"value":[32.10000000000018,-0.29331547744082176]},{"x":905.1792636316724,"y":397.11966716486563,"value":[32.20000000000017,-0.2907400333578436]},{"x":906.0210613972154,"y":396.17154449369644,"value":[32.30000000000018,-0.28419786393425595]},{"x":906.8626507622193,"y":395.3282472936856,"value":[32.40000000000019,-0.2783766060051227]},{"x":907.7042192627191,"y":394.4954449391902,"value":[32.500000000000185,-0.2726275238046645]},{"x":908.5441489773035,"y":394.48695190015735,"value":[32.60000000000019,-0.2725474269561108]},{"x":909.3846210711467,"y":394.20564209400953,"value":[32.700000000000216,-0.2705910996349452]},{"x":910.2254604500287,"y":393.73958791327215,"value":[32.800000000000196,-0.26736423814202004]},{"x":911.066235649071,"y":393.3058161918818,"value":[32.90000000000019,-0.264359391353683]},{"x":911.9068257846911,"y":392.9651313719273,"value":[33.0000000000002,-0.26199472692261816]},{"x":912.746665655753,"y":393.0018296247548,"value":[33.10000000000021,-0.26222542211145106]},{"x":913.5865567093459,"y":393.01278306440736,"value":[33.20000000000019,-0.2622790636554462]},{"x":914.426542913901,"y":392.97587557010786,"value":[33.300000000000196,-0.2620035533526619]},{"x":915.2660209844505,"y":393.1945594806654,"value":[33.400000000000205,-0.26348581031397034]},{"x":916.1046076756064,"y":393.8616072261637,"value":[33.5000000000002,-0.2680515796958267]},{"x":916.942821678397,"y":394.71611721942253,"value":[33.60000000000019,-0.27390657475626634]},{"x":917.7810092719634,"y":395.58391105248944,"value":[33.7000000000002,-0.27985292617029334]},{"x":918.6184001125081,"y":396.8524716554632,"value":[33.80000000000021,-0.28855545285192274]},{"x":919.4558131869602,"y":398.1098486029926,"value":[33.90000000000022,-0.2971810666833563]},{"x":920.2928685632775,"y":399.5471477123205,"value":[34.00000000000023,-0.307044051099576]},{"x":921.1285186246317,"y":401.6913202479999,"value":[34.10000000000021,-0.3217683843134713]},{"x":921.963242332362,"y":404.3014486566262,"value":[34.200000000000216,-0.339697214879052]},{"x":922.7981706137597,"y":406.8086765105761,"value":[34.300000000000225,-0.356918372091656]},{"x":923.6330585192158,"y":409.3362134630722,"value":[34.40000000000022,-0.37427920015355065]},{"x":924.4680567468826,"y":411.80825834352027,"value":[34.5000000000002,-0.3912583950861257]},{"x":925.3022363046692,"y":414.6920941737726,"value":[34.60000000000021,-0.41106958138249716]},{"x":926.1366642897851,"y":417.45097105747885,"value":[34.70000000000023,-0.43002139314036647]},{"x":926.971679850115,"y":419.91429760842965,"value":[34.800000000000225,-0.4469406298979144]},{"x":927.8065700763798,"y":422.44066719411967,"value":[34.900000000000205,-0.46429342968061826]},{"x":928.6414670402556,"y":424.9636477616082,"value":[35.00000000000023,-0.4816229223209896]},{"x":929.476169587853,"y":427.58441971707583,"value":[35.100000000000236,-0.4996249512721809]},{"x":930.3126740999253,"y":429.2988035416134,"value":[35.20000000000023,-0.5113935179283375]},{"x":931.1480504523493,"y":431.58065166925763,"value":[35.300000000000225,-0.5270646812938797]},{"x":931.9838546443459,"y":433.6472964918644,"value":[35.40000000000023,-0.5412558366562923]},{"x":932.8211989727394,"y":434.93925270694666,"value":[35.50000000000024,-0.5501192609280054]},{"x":933.6568195029674,"y":437.09827939911486,"value":[35.60000000000022,-0.5649457499637145]},{"x":934.494237271655,"y":438.35329514615717,"value":[35.700000000000216,-0.5735551252173194]},{"x":935.3309538162546,"y":439.9610266095587,"value":[35.80000000000024,-0.5845902163908083]},{"x":936.1679507996056,"y":441.42769738094626,"value":[35.90000000000025,-0.5946551972164511]},{"x":937.0054174424899,"y":442.6581294070042,"value":[36.00000000000024,-0.6030955039522778]},{"x":937.8429696503545,"y":443.8455222480699,"value":[36.100000000000236,-0.6112398192384125]},{"x":938.6813003042997,"y":444.64135671054567,"value":[36.200000000000244,-0.616691287712066]},{"x":939.5195606850328,"y":445.47253859876145,"value":[36.30000000000025,-0.6223858494457244]},{"x":940.3575671917495,"y":446.4314191172381,"value":[36.40000000000026,-0.6289586272213792]},{"x":941.1971234165139,"y":446.61079145759624,"value":[36.50000000000024,-0.6301705284904244]},{"x":942.0366000142446,"y":446.830216195999,"value":[36.60000000000025,-0.6316578803137278]},{"x":942.8760633355862,"y":447.0563189581593,"value":[36.70000000000026,-0.6331911586092303]},{"x":943.7168978137552,"y":446.5927298360304,"value":[36.80000000000024,-0.6299812499529174]},{"x":944.5567440038428,"y":446.626249618878,"value":[36.90000000000025,-0.6301900859932252]},{"x":945.3973437265287,"y":446.28074250483434,"value":[37.000000000000256,-0.627792257416079]},{"x":946.2382986778496,"y":445.7565553874004,"value":[37.100000000000264,-0.6241656008942562]},{"x":947.0784636705106,"y":445.629717475764,"value":[37.20000000000026,-0.6232716161802152]},{"x":947.9185555689386,"y":445.5396459634267,"value":[37.30000000000025,-0.6226304833691674]},{"x":948.7594128371825,"y":445.0645934336758,"value":[37.40000000000025,-0.6193417379355997]},{"x":949.6001392631919,"y":444.65535454790296,"value":[37.500000000000256,-0.6165056097133976]},{"x":950.440880420079,"y":444.2387060306139,"value":[37.600000000000264,-0.6136185235658869]},{"x":951.2816043111808,"y":443.8307422033288,"value":[37.70000000000026,-0.61079116424603]},{"x":952.1224237362143,"y":443.37472480844366,"value":[37.80000000000028,-0.6076333282886766]},{"x":952.9629040141309,"y":443.08929841331434,"value":[37.90000000000026,-0.6056486901354021]},{"x":953.8025889540862,"y":443.20392701270885,"value":[38.00000000000027,-0.606415332188925]},{"x":954.641587678223,"y":443.6637221687983,"value":[38.100000000000264,-0.6095557726663725]},{"x":955.4798578006163,"y":444.49000400191625,"value":[38.20000000000027,-0.6152166354716644]},{"x":956.317958198385,"y":445.4016573212194,"value":[38.30000000000027,-0.6214646197562064]},{"x":957.1567693672569,"y":445.95579277559483,"value":[38.400000000000276,-0.6252538625206658]},{"x":957.9957973733384,"y":446.40085911344204,"value":[38.50000000000027,-0.6282930091593801]},{"x":958.8333810982512,"y":447.5723988793156,"value":[38.60000000000028,-0.6363282988050654]},{"x":959.6699728714344,"y":449.2428903650459,"value":[38.70000000000027,-0.647795006655199]},{"x":960.5082973350958,"y":450.04183854027946,"value":[38.80000000000027,-0.6532678889254493]},{"x":961.3451619616883,"y":451.5750847612289,"value":[38.90000000000029,-0.6637907260937084]},{"x":962.1815679985906,"y":453.3390015963135,"value":[39.000000000000284,-0.6758999438937496]},{"x":963.0181601031818,"y":455.0093263839128,"value":[39.10000000000029,-0.6873655053183305]},{"x":963.854810043295,"y":456.65055990388066,"value":[39.20000000000029,-0.6986309986774679]},{"x":964.6912260883047,"y":458.40944266090065,"value":[39.30000000000028,-0.7107055958390265]},{"x":965.5268789699322,"y":460.55219659921283,"value":[39.400000000000304,-0.7254201729971008]},{"x":966.3647693538034,"y":461.5694869089674,"value":[39.5000000000003,-0.7323946498012046]},{"x":967.2037985899793,"y":462.01393450934256,"value":[39.60000000000028,-0.7354295412245531]},{"x":968.04289266944,"y":462.42576593754717,"value":[39.70000000000029,-0.738240122915133]},{"x":968.8819303351836,"y":462.865973465426,"value":[39.800000000000296,-0.7412458542787541]},{"x":969.7210574351576,"y":463.2611955754646,"value":[39.90000000000029,-0.7439422094531198]},{"x":970.5601236199715,"y":463.687058010989,"value":[40.000000000000284,-0.7468492859587843]},{"x":971.3982297642865,"y":464.5958208174282,"value":[40.10000000000029,-0.7530773914493136]},{"x":972.2379199031933,"y":464.7078343443113,"value":[40.2000000000003,-0.7538260489823623]},{"x":973.0770334382763,"y":465.10987959451785,"value":[40.30000000000031,-0.7565693286314858]},{"x":973.9150203456205,"y":466.078618597303,"value":[40.400000000000304,-0.7632099057175314]},{"x":974.7532917596644,"y":466.90425073008834,"value":[40.5000000000003,-0.7688663003679701]},{"x":975.5915412898062,"y":467.7408904657797,"value":[40.60000000000031,-0.7745983971104065]},{"x":976.4305545928044,"y":468.1933524546526,"value":[40.700000000000315,-0.777688405527031]},{"x":977.2698878555457,"y":468.4848746926607,"value":[40.80000000000031,-0.7796715902391593]},{"x":978.1079325785328,"y":469.4245324270557,"value":[40.90000000000032,-0.7861121680270946]},{"x":978.9477138365108,"y":469.49071306098614,"value":[41.00000000000031,-0.7865456210684432]},{"x":979.7892535448336,"y":468.6723931716119,"value":[41.10000000000032,-0.7808961384734867]},{"x":980.6290211051066,"y":468.7454637511752,"value":[41.200000000000315,-0.7813769754278108]},{"x":981.4705486144946,"y":467.9332799259045,"value":[41.30000000000031,-0.775769692110321]},{"x":982.3130555684148,"y":466.628435501021,"value":[41.400000000000304,-0.7667742562264634]},{"x":983.1547760567842,"y":465.71918324824196,"value":[41.50000000000033,-0.7604994085816577]},{"x":983.9968273675302,"y":464.6435273398987,"value":[41.60000000000032,-0.7530801605665038]},{"x":984.8408919874093,"y":462.5551769375859,"value":[41.700000000000315,-0.738696354290783]},{"x":985.6857590748886,"y":460.0631853325176,"value":[41.800000000000324,-0.7215366045398133]},{"x":986.5289561607009,"y":458.4112045658199,"value":[41.90000000000032,-0.7101538235174947]},{"x":987.3720226688347,"y":456.8249043714555,"value":[42.00000000000033,-0.6992227445389081]},{"x":988.216120001858,"y":454.7200992576115,"value":[42.10000000000032,-0.6847257750162239]},{"x":989.0593951066949,"y":453.028874921638,"value":[42.20000000000033,-0.6730731059613335]},{"x":989.9015629444192,"y":451.89460594325726,"value":[42.30000000000034,-0.6652507609178677]},{"x":990.7440502834819,"y":450.59962779160355,"value":[42.40000000000032,-0.656323177910799]},{"x":991.5864534056169,"y":449.34701075455877,"value":[42.50000000000031,-0.6476869230904962]},{"x":992.4281747158515,"y":448.43734510352283,"value":[42.60000000000032,-0.6414092324004659]},{"x":993.268936390071,"y":448.010376368118,"value":[42.70000000000033,-0.6384511714814352]},{"x":994.1101736651897,"y":447.34418038034056,"value":[42.80000000000034,-0.6338478837476189]},{"x":994.9516333793681,"y":446.56609754550595,"value":[42.90000000000035,-0.6284751216367215]},{"x":995.7920881368096,"y":446.2935079493601,"value":[43.00000000000034,-0.6265787654232935]},{"x":996.6319556544794,"y":446.31629995841797,"value":[43.10000000000035,-0.6267138238277892]},{"x":997.4718550570425,"y":446.3230538660724,"value":[43.20000000000033,-0.6267385841194009]},{"x":998.3117872515853,"y":446.3133134079197,"value":[43.300000000000324,-0.6266499084514816]},{"x":999.1516172382879,"y":446.3549834934918,"value":[43.40000000000036,-0.6269147962018602]},{"x":999.9917919157751,"y":446.22327411438766,"value":[43.500000000000355,-0.6259873091638757]},{"x":1000.8328435190411,"y":445.6504710684798,"value":[43.60000000000035,-0.622026308505431]},{"x":1001.6744577616088,"y":444.79466045382645,"value":[43.700000000000344,-0.616118992633023]},{"x":1002.5159895485964,"y":443.98032499599515,"value":[43.80000000000034,-0.6104969119897725]},{"x":1003.3579285922187,"y":442.9611394509554,"value":[43.90000000000036,-0.6034660250623549]},{"x":1004.1972461523779,"y":443.26056008776453,"value":[44.000000000000355,-0.6055035290770392]},{"x":1005.035102977442,"y":444.29473047753345,"value":[44.100000000000364,-0.6125940944956292]},{"x":1005.8734518274821,"y":445.0814123042967,"value":[44.20000000000036,-0.6179826179596701]},{"x":1006.7116645971071,"y":445.93654257988334,"value":[44.30000000000038,-0.6238418788598432]},{"x":1007.549903424506,"y":446.7785657950961,"value":[44.40000000000036,-0.629610999163674]},{"x":1008.3881378647876,"y":447.62279573035175,"value":[44.500000000000355,-0.6353952956439284]},{"x":1009.2263922865941,"y":448.45697495864187,"value":[44.60000000000035,-0.6411104708495645]},{"x":1010.0645654655938,"y":449.3320193187437,"value":[44.70000000000036,-0.6471066859868122]},{"x":1010.9029705427268,"y":450.09041891769476,"value":[44.80000000000035,-0.6523007053585443]},{"x":1011.7409075842486,"y":451.0842404291976,"value":[44.90000000000036,-0.659113781252795]},{"x":1012.577390548441,"y":452.80946283736637,"value":[45.00000000000037,-0.6709568876122982]},{"x":1013.4149626198138,"y":453.98686433378276,"value":[45.100000000000364,-0.6790324898736007]},{"x":1014.2503264002723,"y":456.2750361600125,"value":[45.20000000000036,-0.6947471429267864]},{"x":1015.0858248783336,"y":458.4954550921464,"value":[45.30000000000035,-0.7099958420510597]},{"x":1015.9229499786555,"y":459.89768302720046,"value":[45.400000000000375,-0.7196176330590491]},{"x":1016.7604845950385,"y":461.093924383539,"value":[45.500000000000384,-0.7278228018409854]},{"x":1017.5988047021107,"y":461.89506392315167,"value":[45.60000000000038,-0.7333107546828432]},{"x":1018.4378740853534,"y":462.3193175488879,"value":[45.70000000000037,-0.7362067669933672]},{"x":1019.276870210365,"y":462.78042006506,"value":[45.80000000000038,-0.7393561985194643]},{"x":1020.1164768672376,"y":462.93442505512445,"value":[45.900000000000404,-0.7403936420521555]},{"x":1020.9564064088928,"y":462.9260189993874,"value":[46.000000000000384,-0.7403141434099059]},{"x":1021.7964742207438,"y":462.84806303526364,"value":[46.100000000000364,-0.7397563323132483]},{"x":1022.6372953118238,"y":462.3912076190067,"value":[46.20000000000039,-0.7365927330692355]},{"x":1023.4780410199543,"y":461.97226982630485,"value":[46.300000000000395,-0.7336899029909714]},{"x":1024.3187398140199,"y":461.5769298081734,"value":[46.400000000000375,-0.7309493608255924]},{"x":1025.159627719635,"y":461.0864666807161,"value":[46.500000000000384,-0.7275546327820712]},{"x":1025.9998541812688,"y":460.9287098759209,"value":[46.600000000000406,-0.7264480109558122]},{"x":1026.8399562651168,"y":460.83351509727305,"value":[46.7000000000004,-0.7257716441359721]},{"x":1027.680702595644,"y":460.4142642388875,"value":[46.80000000000038,-0.7228666610251735]},{"x":1028.520562719012,"y":460.4407755817286,"value":[46.900000000000375,-0.7230272982364845]},{"x":1029.3611050820698,"y":460.1241203607473,"value":[47.00000000000041,-0.7208278914848316]},{"x":1030.2025195601982,"y":459.36879125906637,"value":[47.10000000000039,-0.7156116125987739]},{"x":1031.0441844380307,"y":458.48751110618224,"value":[47.2000000000004,-0.7095291362175118]},{"x":1031.8856599531177,"y":457.701480414282,"value":[47.30000000000038,-0.7041017146669608]},{"x":1032.7273870067384,"y":456.7889258401179,"value":[47.400000000000404,-0.6978041561159358]},{"x":1033.5698400027493,"y":455.51122224361166,"value":[47.500000000000426,-0.6889953746294304]},{"x":1034.4115048769247,"y":454.62994393029425,"value":[47.60000000000042,-0.6829129108993377]},{"x":1035.2529218665359,"y":453.87335155277947,"value":[47.700000000000415,-0.67768794414325]},{"x":1036.0949835486372,"y":452.7924788527095,"value":[47.800000000000395,-0.6702328189211695]},{"x":1036.93754931134,"y":451.4580536102052,"value":[47.90000000000043,-0.6610339482117631]},{"x":1037.7798108954669,"y":450.2766301912853,"value":[48.00000000000041,-0.6528873100568653]},{"x":1038.621316468201,"y":449.47548050291044,"value":[48.100000000000406,-0.647355911312387]},{"x":1039.462735591047,"y":448.7178151082416,"value":[48.2000000000004,-0.6421235651437245]},{"x":1040.3058695746993,"y":447.0975747282076,"value":[48.30000000000044,-0.6309590708539279]},{"x":1041.1482490947137,"y":445.8568295578016,"value":[48.40000000000042,-0.6224044618876907]},{"x":1041.9894892771474,"y":445.18917119059125,"value":[48.50000000000041,-0.6177911169976245]},{"x":1042.831331308645,"y":444.2187827441089,"value":[48.60000000000039,-0.6110958201596892]},{"x":1043.6737938296335,"y":442.93628808401866,"value":[48.70000000000043,-0.6022540893072503]},{"x":1044.5161813924067,"y":441.6914974060295,"value":[48.80000000000044,-0.5936716583538053]},{"x":1045.3587781515735,"y":440.34148094201765,"value":[48.90000000000042,-0.5843655628385083]},{"x":1046.2000437767986,"y":439.66102485081456,"value":[49.00000000000044,-0.57966420473727]},{"x":1047.040680143992,"y":439.2970855494191,"value":[49.100000000000435,-0.577139613307708]},{"x":1047.8812545678952,"y":438.96430372298516,"value":[49.20000000000043,-0.5748292997782571]},{"x":1048.7210596773632,"y":439.0184870574811,"value":[49.30000000000042,-0.5751802443322203]},{"x":1049.560965800327,"y":439.02186060367796,"value":[49.400000000000446,-0.5751817570161348]},{"x":1050.4009687270325,"y":438.9765418676516,"value":[49.500000000000426,-0.5748484004592238]},{"x":1051.2402491930018,"y":439.2946208820556,"value":[49.60000000000042,-0.5770142228943014]},{"x":1052.0793019501773,"y":439.7272374196468,"value":[49.700000000000415,-0.5799677490820985]},{"x":1052.9182005151147,"y":440.2374126532001,"value":[49.80000000000045,-0.5834546661986093]},{"x":1053.7562219151062,"y":441.18880185446073,"value":[49.900000000000446,-0.5899759242755698]},{"x":1054.5935947849548,"y":442.46640171744144,"value":[50.000000000000426,-0.5987406162531745]},{"x":1055.4309988485793,"y":443.7283111112281,"value":[50.100000000000435,-0.6073974008732415]},{"x":1056.268342452271,"y":445.0206318511944,"value":[50.20000000000044,-0.616263332075532]},{"x":1057.1059839389472,"y":446.1631174500859,"value":[50.30000000000045,-0.6240988088064001]},{"x":1057.9426435306905,"y":447.7994962001507,"value":[50.400000000000446,-0.6353309146750039]},{"x":1058.7784364022207,"y":449.871835217308,"value":[50.50000000000044,-0.6495612304652947]},{"x":1059.6150294370732,"y":451.5416920834964,"value":[50.60000000000045,-0.6610235738750183]},{"x":1060.4498340804516,"y":454.1111098610612,"value":[50.70000000000046,-0.6786724270500426]},{"x":1061.2862311714887,"y":455.8795264663453,"value":[50.80000000000044,-0.6908125909171354]},{"x":1062.1217768486033,"y":458.07620427461285,"value":[50.900000000000446,-0.7058980162788648]},{"x":1062.9570445249708,"y":460.4127164586644,"value":[51.00000000000044,-0.7219451182990304]},{"x":1063.7940160111098,"y":461.8922123277188,"value":[51.10000000000045,-0.7320983005915815]},{"x":1064.6303985153354,"y":463.6679660991644,"value":[51.20000000000046,-0.7442889240212605]},{"x":1065.4651994453848,"y":466.23925168122116,"value":[51.30000000000045,-0.7619506225640453]},{"x":1066.3015636224952,"y":468.0242239916317,"value":[51.40000000000046,-0.774204644236808]},{"x":1067.1377045217534,"y":469.9215050617266,"value":[51.50000000000047,-0.7872310418873729]},{"x":1067.9733899153382,"y":472.0479054854292,"value":[51.60000000000045,-0.8018331517555182]},{"x":1068.80888492844,"y":474.27006729219045,"value":[51.70000000000046,-0.817093837073017]},{"x":1069.6437720130602,"y":476.7980171251926,"value":[51.800000000000466,-0.8344575046194316]},{"x":1070.479531260026,"y":478.8872692982343,"value":[51.900000000000446,-0.8488041364954015]},{"x":1071.3152732936808,"y":480.9851797668515,"value":[52.000000000000455,-0.8632103136778109]},{"x":1072.1510809676995,"y":483.05007313237905,"value":[52.10000000000046,-0.8773894238232884]},{"x":1072.9864162604354,"y":485.352574283193,"value":[52.20000000000047,-0.8932026232954535]},{"x":1073.821134805784,"y":487.9652993698159,"value":[52.30000000000048,-0.9111493118777401]},{"x":1074.6561810914404,"y":490.41317108143096,"value":[52.400000000000446,-0.9279622617643688]},{"x":1075.491950879729,"y":492.4971209691659,"value":[52.50000000000047,-0.9422724284722621]},{"x":1076.3271048835772,"y":494.89081043056467,"value":[52.60000000000046,-0.9587127532082977]},{"x":1077.1604879054635,"y":498.17530381874855,"value":[52.700000000000486,-0.9812793636936687]},{"x":1077.9944192676655,"y":501.1839820280822,"value":[52.80000000000051,-1.0019491228643647]},{"x":1078.8298935374937,"y":503.4165777013358,"value":[52.900000000000475,-1.0172815645422486]},{"x":1079.6656208679171,"y":505.5218838954125,"value":[53.0000000000005,-1.0317386040144685]},{"x":1080.501368869718,"y":507.6167923864549,"value":[53.10000000000046,-1.0461241358316258]},{"x":1081.3379023750854,"y":509.31659258358206,"value":[53.200000000000514,-1.0577924071634226]},{"x":1082.1745275185424,"y":510.9702988215808,"value":[53.30000000000048,-1.0691436785848594]},{"x":1083.0111488522248,"y":512.6259213762625,"value":[53.400000000000475,-1.0805081290047638]},{"x":1083.8501394102339,"y":513.0898240946342,"value":[53.5000000000005,-1.083676818235408]},{"x":1084.6910461562045,"y":512.5898842683719,"value":[53.60000000000049,-1.0802169165177546]},{"x":1085.5308407543394,"y":512.6493548034645,"value":[53.700000000000514,-1.0806042224983967]},{"x":1086.3715060177467,"y":512.2708807065237,"value":[53.80000000000051,-1.077979671573663]},{"x":1087.2131932883444,"y":511.3783369927801,"value":[53.9000000000005,-1.0718197328122905]},{"x":1088.053873427301,"y":510.9923804945684,"value":[54.0000000000005,-1.0691437235060897]},{"x":1088.89588144363,"y":509.9385016778471,"value":[54.10000000000049,-1.0618742421029297]},{"x":1089.7389392990833,"y":508.3565537818028,"value":[54.20000000000046,-1.050973094989677]},{"x":1090.5803996553345,"y":507.57814798450505,"value":[54.30000000000054,-1.0455981117835687]},{"x":1091.4228957986318,"y":506.2787413028753,"value":[54.4000000000005,-1.0366400726466298]},{"x":1092.263872503112,"y":505.7436123462148,"value":[54.50000000000047,-1.0329381663064021]},{"x":1093.104424793927,"y":505.4219634633205,"value":[54.60000000000052,-1.0307044168684465]},{"x":1093.9453638040618,"y":504.90579476235246,"value":[54.700000000000514,-1.0271329050412645]},{"x":1094.785710440259,"y":504.68759015207803,"value":[54.80000000000048,-1.0256105682432248]},{"x":1095.6257257181835,"y":504.6360587528778,"value":[54.900000000000475,-1.0252344856175086]},{"x":1096.4673843197188,"y":503.7579355775114,"value":[55.00000000000047,-1.0191737205756293]},{"x":1097.3097604078582,"y":502.51891664060486,"value":[55.10000000000052,-1.0106309833573377]},{"x":1098.1522492693477,"y":501.223172708251,"value":[55.20000000000054,-1.001698133881129]},{"x":1098.9944468446822,"y":500.07394571190565,"value":[55.30000000000054,-0.9937729187339968]},{"x":1099.837488853023,"y":498.4999689135051,"value":[55.40000000000053,-0.982926590891779]},{"x":1100.681722760164,"y":496.3264670185629,"value":[55.500000000000554,-0.9679571760885874]},{"x":1101.5257956836779,"y":494.2339398878799,"value":[55.60000000000052,-0.953544645386847]},{"x":1102.3706940285895,"y":491.7262257942814,"value":[55.70000000000054,-0.9362767680731996]},{"x":1103.215547331224,"y":489.2411679659773,"value":[55.80000000000051,-0.9191647036730708]},{"x":1104.0609965776416,"y":486.45635041488976,"value":[55.90000000000053,-0.8999911152240521]},{"x":1104.9067284332884,"y":483.5293804214225,"value":[56.000000000000526,-0.8798399081815376]},{"x":1105.7527348388949,"y":480.4643117982953,"value":[56.10000000000052,-0.8587389616492773]},{"x":1106.5992936390112,"y":477.12138873676986,"value":[56.20000000000054,-0.8357271392944421]},{"x":1107.444195492544,"y":474.61190980671586,"value":[56.30000000000054,-0.818447124750477]},{"x":1108.2895989256722,"y":471.85013634010556,"value":[56.4000000000005,-0.7994320163463868]},{"x":1109.1362211300188,"y":468.4753209507256,"value":[56.500000000000526,-0.776200862320716]},{"x":1109.9820957360753,"y":465.4765475011908,"value":[56.60000000000052,-0.7555558446017634]},{"x":1110.8267717707358,"y":463.08065546396745,"value":[56.70000000000054,-0.7390569960831566]},{"x":1111.6717566234497,"y":460.52942794577774,"value":[56.80000000000054,-0.7214898658531688]},{"x":1112.516699097429,"y":457.99951693108716,"value":[56.90000000000053,-0.7040693346532092]},{"x":1113.3608510563274,"y":455.86723500216976,"value":[57.000000000000554,-0.689383400066991]},{"x":1114.2049583649843,"y":453.75741214457804,"value":[57.10000000000052,-0.6748519222410865]},{"x":1115.0487030917927,"y":451.82996795691986,"value":[57.200000000000514,-0.6615747090327937]},{"x":1115.8916611634386,"y":450.2982113159847,"value":[57.30000000000054,-0.6510187399791243]},{"x":1116.7352326846296,"y":448.45788955375156,"value":[57.40000000000053,-0.638340689905704]},{"x":1117.5802368735428,"y":445.8969359274434,"value":[57.500000000000526,-0.6207066707501392]},{"x":1118.4234334734908,"y":444.2451995504658,"value":[57.60000000000055,-0.6093255704582421]},{"x":1119.2680870182326,"y":441.8606199422576,"value":[57.700000000000514,-0.5929045203985122]},{"x":1120.1120590486241,"y":439.8188420524311,"value":[57.800000000000566,-0.5788410051666188]},{"x":1120.955717702441,"y":437.93469257950693,"value":[57.90000000000059,-0.56586154075121]},{"x":1121.800719015894,"y":435.3751853094911,"value":[58.000000000000554,-0.548237468556672]},{"x":1122.6447225281331,"y":433.3175720501438,"value":[58.10000000000055,-0.5340650494507457]},{"x":1123.4895731835088,"y":430.8338457930162,"value":[58.20000000000054,-0.5169621426051338]},{"x":1124.3346507462002,"y":428.2359851563224,"value":[58.300000000000566,-0.4990743045282797]},{"x":1125.1790284888984,"y":425.9901339759869,"value":[58.40000000000056,-0.48360732524119676]},{"x":1126.0230099411538,"y":423.9436168884844,"value":[58.50000000000058,-0.46951121733844436]},{"x":1126.8671364391532,"y":421.82414179171894,"value":[58.60000000000058,-0.4549133586025311]},{"x":1127.711192395748,"y":419.7401490215182,"value":[58.7000000000006,-0.4405595208739914]},{"x":1128.5545425402202,"y":418.0111797488142,"value":[58.800000000000566,-0.42864727026467664]},{"x":1129.396325482201,"y":417.07051332938016,"value":[58.90000000000059,-0.42215637938553074]},{"x":1130.2378545052209,"y":416.2575681472859,"value":[59.000000000000554,-0.41654386002302823]},{"x":1131.0791897053425,"y":415.5421158831565,"value":[59.10000000000058,-0.41160182431695125]},{"x":1131.9195698559276,"y":415.3070535356372,"value":[59.20000000000054,-0.4099635525613481]},{"x":1132.7594541232597,"y":415.32142046450974,"value":[59.30000000000054,-0.4100406695411096]},{"x":1133.599412284295,"y":415.29861886080226,"value":[59.40000000000059,-0.4098621690447679]},{"x":1134.4379432476699,"y":415.9936976801804,"value":[59.50000000000058,-0.4146207152693]},{"x":1135.2754072784062,"y":417.22544361670623,"value":[59.60000000000058,-0.4230700581024469]},{"x":1136.11295437594,"y":418.41540695410333,"value":[59.70000000000057,-0.43123205134729936]},{"x":1136.9498525281658,"y":419.93178978139986,"value":[59.800000000000566,-0.4416389146574349]},{"x":1137.7854005669635,"y":422.12727966309825,"value":[59.90000000000056,-0.45671617034524026]},{"x":1138.62115221211,"y":424.2203555513062,"value":[60.000000000000554,-0.4710890988854124]},{"x":1139.456902228524,"y":426.3142506919949,"value":[60.10000000000055,-0.48546766163379473]},{"x":1140.292337538402,"y":428.56644322036175,"value":[60.2000000000006,-0.5009348758812671]},{"x":1141.1256377810867,"y":431.89257454699185,"value":[60.300000000000594,-0.523787841086532]},{"x":1141.9580864336822,"y":435.64705568838286,"value":[60.40000000000062,-0.5495866771922215]},{"x":1142.7913998069453,"y":438.96658233400126,"value":[60.50000000000061,-0.5723942203220513]},{"x":1143.6236856775604,"y":442.80294281140283,"value":[60.60000000000058,-0.5987561614997818]},{"x":1144.4545543791114,"y":447.35213932825485,"value":[60.7000000000006,-0.6300204578858675]},{"x":1145.284384331428,"y":452.4238267098512,"value":[60.800000000000594,-0.6648780571780075]},{"x":1146.1149442052294,"y":457.12836358474954,"value":[60.90000000000059,-0.697210668816397]},{"x":1146.9450920894371,"y":462.0401312252161,"value":[61.00000000000061,-0.7309684592710779]},{"x":1147.7739343153542,"y":467.60864498586767,"value":[61.10000000000058,-0.7692428602570374]},{"x":1148.603006942639,"y":473.0612668584575,"value":[61.2000000000006,-0.8067202431776868]},{"x":1149.4319692688753,"y":478.56937015852407,"value":[61.300000000000594,-0.8445791860222251]},{"x":1150.2623912911645,"y":483.3432463439513,"value":[61.40000000000059,-0.8773886617798543]},{"x":1151.0935550419367,"y":487.74403310255826,"value":[61.50000000000061,-0.9076323064156946]},{"x":1151.9260541838364,"y":491.4731181239131,"value":[61.600000000000605,-0.9332564869281748]},{"x":1152.7591465472874,"y":494.9038127049149,"value":[61.7000000000006,-0.9568285602961906]},{"x":1153.5915706386895,"y":498.67064812670145,"value":[61.800000000000594,-0.9827123599383607]},{"x":1154.425675044323,"y":501.59228548995213,"value":[61.90000000000062,-1.002783517016122]},{"x":1155.2597281643843,"y":504.5397194960239,"value":[62.00000000000061,-1.023032084184413]},{"x":1156.0942681601714,"y":507.2422550119654,"value":[62.10000000000058,-1.0415964219897575]},{"x":1156.9295903112795,"y":509.551366401559,"value":[62.2000000000006,-1.0574550817595458]},{"x":1157.7656823804275,"y":511.47320901707894,"value":[62.30000000000062,-1.0706503954209126]},{"x":1158.6022695404263,"y":513.1460209346059,"value":[62.40000000000062,-1.0821330614721951]},{"x":1159.4388127851173,"y":514.8409222518835,"value":[62.50000000000061,-1.0937676419581082]},{"x":1160.2768805863832,"y":515.7689716121771,"value":[62.600000000000605,-1.100128385997345]},{"x":1161.1153977037773,"y":516.4710149598567,"value":[62.7000000000006,-1.1049348290588816]},{"x":1161.9528797349235,"y":517.6937066902258,"value":[62.800000000000594,-1.1133219038075697]},{"x":1162.7909431596954,"y":518.6239574267846,"value":[62.90000000000059,-1.1196977872727083]},{"x":1163.6314352964155,"y":518.332566053616,"value":[63.00000000000058,-1.117672126444456]},{"x":1164.4730749979894,"y":517.463949558928,"value":[63.100000000000634,-1.1116767412696968]},{"x":1165.314712127523,"y":516.5966268005006,"value":[63.20000000000063,-1.1056902534490898]},{"x":1166.1559867861447,"y":515.9116269106947,"value":[63.30000000000065,-1.1009576464862434]},{"x":1166.9990417243775,"y":514.3311463765309,"value":[63.400000000000645,-1.0900665907948035]},{"x":1167.8436039992507,"y":511.9924755121983,"value":[63.50000000000061,-1.073961266872912]},{"x":1168.6888891532897,"y":509.2901964276161,"value":[63.600000000000634,-1.055355316504417]},{"x":1169.5356115737513,"y":505.8649723322513,"value":[63.70000000000063,-1.0317774889540443]},{"x":1170.3822233006651,"y":502.4954270914864,"value":[63.80000000000062,-1.0085825790842269]},{"x":1171.2286406049445,"y":499.22367643594396,"value":[63.900000000000645,-0.9860602275134878]},{"x":1172.0760081211822,"y":495.47396916528464,"value":[64.00000000000064,-0.9602508464271082]},{"x":1172.9227121109632,"y":492.0580157024057,"value":[64.10000000000063,-0.9367367753802456]},{"x":1173.7683495419196,"y":489.1785413281721,"value":[64.20000000000063,-0.9169122078220417]},{"x":1174.613988206382,"y":486.2984465005347,"value":[64.30000000000062,-0.8970833732475718]},{"x":1175.4580146246433,"y":484.2293115119274,"value":[64.40000000000059,-0.8828317162716148]},{"x":1176.302306116167,"y":482.02684467243125,"value":[64.50000000000061,-0.8676631021589958]},{"x":1177.1446425763957,"y":480.8077585743381,"value":[64.6000000000006,-0.8592574481558701]},{"x":1177.9859862537933,"y":480.08804224022106,"value":[64.70000000000057,-0.8542860873531986]},{"x":1178.8274891494182,"y":479.28823913778075,"value":[64.80000000000057,-0.8487639494235566]},{"x":1179.6679683044183,"y":479.00337756967116,"value":[64.90000000000059,-0.8467831957297212]},{"x":1180.5070024336794,"y":479.4453639482203,"value":[65.00000000000058,-0.8498011607029885]},{"x":1181.344501412993,"y":480.65953075041665,"value":[65.10000000000058,-0.8581296073468727]},{"x":1182.1818556687367,"y":481.94649350819475,"value":[65.20000000000054,-0.8669586903394308]},{"x":1183.0191707758572,"y":483.25314802350385,"value":[65.30000000000057,-0.8759231985697031]},{"x":1183.856922668097,"y":484.34009962378315,"value":[65.40000000000056,-0.8833767538315791]},{"x":1184.695127692987,"y":485.1991255009362,"value":[65.50000000000053,-0.889262805777058]},{"x":1185.5324600402664,"y":486.4971082162652,"value":[65.60000000000052,-0.8981676758276569]},{"x":1186.3697961226815,"y":487.7932121584296,"value":[65.70000000000051,-0.9070596250761369]},{"x":1187.2078055201046,"y":488.7506386515388,"value":[65.80000000000054,-0.9136224031485805]},{"x":1188.0465099687217,"y":489.3584543940521,"value":[65.90000000000053,-0.9177808189424246]},{"x":1188.8860122542503,"y":489.56495817003304,"value":[66.00000000000053,-0.9191793100124541]},{"x":1189.7259591384586,"y":489.5478288101571,"value":[66.10000000000052,-0.9190398189832991]},{"x":1190.5658879238797,"y":489.5398031402064,"value":[66.20000000000051,-0.9189629363510967]},{"x":1191.4065967343738,"y":489.1394248586945,"value":[66.30000000000054,-0.9161877447637496]},{"x":1192.2475231470596,"y":488.62959267461036,"value":[66.40000000000053,-0.9126598107789179]},{"x":1193.0874883522054,"y":488.6032478832636,"value":[66.5000000000005,-0.9124569428777076]},{"x":1193.9280692196924,"y":488.2672249341413,"value":[66.60000000000049,-0.9101243393210798]},{"x":1194.7698548990456,"y":487.3251816163254,"value":[66.70000000000049,-0.9036239791606677]},{"x":1195.6114147141875,"y":486.4967479969225,"value":[66.80000000000051,-0.897904941865419]},{"x":1196.4530458574523,"y":485.63243633161005,"value":[66.90000000000047,-0.8919391620999577]},{"x":1197.2932730686275,"y":485.47430250733595,"value":[67.00000000000047,-0.8908299474146069]},{"x":1198.1323476889067,"y":485.8959219037612,"value":[67.10000000000046,-0.8937078434584604]},{"x":1198.9718448808865,"y":486.1049877349305,"value":[67.20000000000049,-0.8951239544353151]},{"x":1199.8117459897362,"y":486.1108833803845,"value":[67.30000000000045,-0.895142812238928]},{"x":1200.651826715682,"y":486.02643162654334,"value":[67.40000000000047,-0.8945403279400317]},{"x":1201.4934703559281,"y":485.15583397958443,"value":[67.50000000000044,-0.888531317875934]},{"x":1202.3351326461157,"y":484.2758554121523,"value":[67.60000000000043,-0.8824577928297148]},{"x":1203.176443929449,"y":483.5724332924447,"value":[67.70000000000043,-0.8775984914943762]},{"x":1204.0190521747818,"y":482.21663928698774,"value":[67.80000000000045,-0.8682526623533535]},{"x":1204.8622081587928,"y":480.58533272629154,"value":[67.90000000000042,-0.8570120631173936]},{"x":1205.7044757205472,"y":479.40090256078474,"value":[68.00000000000041,-0.8488447467995321]},{"x":1206.5469069584562,"y":478.13414328933743,"value":[68.1000000000004,-0.8401112322271351]},{"x":1207.3893046752694,"y":476.884245129226,"value":[68.2000000000004,-0.8314936758167857]},{"x":1208.2318125973743,"y":475.5789137073445,"value":[68.3000000000004,-0.8224948907303946]},{"x":1209.0735968795252,"y":474.6375731824148,"value":[68.40000000000039,-0.815999363855866]},{"x":1209.91292891982,"y":474.9297103110108,"value":[68.50000000000038,-0.8179867773273566]},{"x":1210.751368292105,"y":475.6708594484731,"value":[68.60000000000038,-0.8230621608767588]},{"x":1211.5913581576012,"y":475.63211050087625,"value":[68.70000000000037,-0.8227739864300991]},{"x":1212.4289309626577,"y":476.8091429543336,"value":[68.80000000000034,-0.8308470506888699]},{"x":1213.264649670648,"y":478.9187862321069,"value":[68.90000000000033,-0.8453339173915784]},{"x":1214.1009292456267,"y":480.74631341471496,"value":[69.00000000000033,-0.8578805997714505]},{"x":1214.9345044710367,"y":483.9341284303642,"value":[69.10000000000032,-0.8797823284370194]},{"x":1215.7662905163656,"y":488.0219010267774,"value":[69.20000000000034,-0.9078732948644146]},{"x":1216.600537528063,"y":490.8718075399937,"value":[69.30000000000034,-0.9274511405959407]},{"x":1217.4328590094342,"y":494.6902558071215,"value":[69.40000000000033,-0.9536898949362098]},{"x":1218.2659234965865,"y":498.13497216638535,"value":[69.5000000000003,-0.9773583996487267]},{"x":1219.0991540262694,"y":501.4961691328249,"value":[69.60000000000032,-1.0004525202002994]},{"x":1219.9327786930933,"y":504.6591151173415,"value":[69.70000000000032,-1.02218321819745]},{"x":1220.7668922522491,"y":507.57614825882195,"value":[69.80000000000031,-1.042222710868073]},{"x":1221.601036374188,"y":510.47780832053047,"value":[69.9000000000003,-1.0621564789491447]},{"x":1222.435971858027,"y":512.9814133463651,"value":[70.0000000000003,-1.0793527210490201]},{"x":1223.2708025301956,"y":515.5377386425853,"value":[70.10000000000029,-1.0969115338914044]},{"x":1224.1063443187145,"y":517.7363724144067,"value":[70.20000000000029,-1.1120104109132414]},{"x":1224.9420371200638,"y":519.859046732648,"value":[70.30000000000028,-1.1265868954040155]},{"x":1225.7781237233607,"y":521.7836386711468,"value":[70.40000000000028,-1.139801116860553]},{"x":1226.6146134939092,"y":523.5054374822048,"value":[70.50000000000027,-1.1516206782697473]},{"x":1227.4502954585603,"y":525.6335626595637,"value":[70.60000000000026,-1.1662346497085796]},{"x":1228.2868770993693,"y":527.3091507294824,"value":[70.70000000000026,-1.177736408067748]},{"x":1229.1228288225059,"y":529.3015873888061,"value":[70.80000000000028,-1.1914172149690274]},{"x":1229.9585121356552,"y":531.4290342716058,"value":[70.90000000000025,-1.2060265216032189]},{"x":1230.7940723637992,"y":533.618392912035,"value":[71.00000000000027,-1.2210616111814194]},{"x":1231.6285962878526,"y":536.3290125100812,"value":[71.10000000000024,-1.2396815452807464]},{"x":1232.4626912104259,"y":539.2554198525645,"value":[71.20000000000023,-1.2597855067219808]},{"x":1233.2984074512851,"y":541.3663040973177,"value":[71.30000000000022,-1.2742809078710415]},{"x":1234.1341154795302,"y":543.4813192869436,"value":[71.40000000000022,-1.288804718581337]},{"x":1234.9703761815758,"y":545.3183395548389,"value":[71.50000000000021,-1.301416687329358]},{"x":1235.8069649018605,"y":546.990366648511,"value":[71.60000000000018,-1.31289395594687]},{"x":1236.6437214494651,"y":548.5779766002823,"value":[71.70000000000017,-1.3237906663541223]},{"x":1237.4811911532875,"y":549.806868974649,"value":[71.8000000000002,-1.3322203845126745]},{"x":1238.3192756963335,"y":550.7264972192836,"value":[71.90000000000019,-1.3385232143922363]},{"x":1239.1606760823408,"y":549.9782564545749,"value":[72.00000000000018,-1.3333556838069818]},{"x":1240.0011422016244,"y":549.6999518518282,"value":[72.10000000000018,-1.3314200240358987]},{"x":1240.8415296213773,"y":549.4612331129618,"value":[72.20000000000014,-1.3297566063446635]},{"x":1241.6835869492354,"y":548.3825505972812,"value":[72.30000000000017,-1.3223165435791002]},{"x":1242.5261165037834,"y":547.0663380565413,"value":[72.40000000000016,-1.3132429262637588]},{"x":1243.369390418991,"y":545.3757121039288,"value":[72.50000000000016,-1.3015943724438221]},{"x":1244.2126816907044,"y":543.6763558290692,"value":[72.60000000000015,-1.2898857779716604]},{"x":1245.0557823300535,"y":542.072887633393,"value":[72.70000000000014,-1.278836630270408]},{"x":1245.8995878604924,"y":540.1148592195436,"value":[72.80000000000014,-1.2653490815399704]},{"x":1246.743481442267,"y":538.1125409837733,"value":[72.90000000000013,-1.2515569404107834]},{"x":1247.5866109615897,"y":536.4945461612793,"value":[73.0000000000001,-1.2404078893927815]},{"x":1248.4298727596315,"y":534.8100151432309,"value":[73.10000000000012,-1.2288012519919809]},{"x":1249.2730963377874,"y":533.1447087276507,"value":[73.20000000000009,-1.2173268270844089]},{"x":1250.1164860002723,"y":531.3958618947116,"value":[73.30000000000011,-1.2052778734248069]},{"x":1250.9590639191165,"y":530.0553221128964,"value":[73.40000000000008,-1.1960369514694218]},{"x":1251.8019082941187,"y":528.5807548836942,"value":[73.50000000000007,-1.185874288582887]},{"x":1252.6448374677084,"y":527.0635339649951,"value":[73.60000000000007,-1.1754182853974782]},{"x":1253.48635138013,"y":526.2581894138563,"value":[73.70000000000006,-1.1698580375121295]},{"x":1254.3296440953056,"y":524.558107077354,"value":[73.80000000000005,-1.1581444497289133]},{"x":1255.171724097738,"y":523.4680192507825,"value":[73.90000000000005,-1.1506259497321296]},{"x":1256.012449786363,"y":523.0591512694218,"value":[74.0000000000001,-1.147792372314146]},{"x":1256.8535780154482,"y":522.4478054364522,"value":[74.10000000000007,-1.1435663030811067]},{"x":1257.6951545714637,"y":521.6109511576072,"value":[74.20000000000009,-1.1377893547637026]},{"x":1258.5356775852244,"y":521.3040286327906,"value":[74.30000000000005,-1.1356568822453008]},{"x":1259.374759512001,"y":521.7219728610833,"value":[74.40000000000005,-1.1385095032207802]},{"x":1260.2131565699249,"y":522.4844061223728,"value":[74.50000000000007,-1.1437312631169512]},{"x":1261.0507304870023,"y":523.6608792293349,"value":[74.60000000000007,-1.1518004806072475]},{"x":1261.8881405052468,"y":524.9197934491793,"value":[74.70000000000006,-1.1604366666523784]},{"x":1262.7232948842898,"y":527.3132941875025,"value":[74.80000000000003,-1.1768756934917008]},{"x":1263.5554356608586,"y":531.2226369702763,"value":[74.90000000000005,-1.2037395525931314]},{"x":1264.388771117059,"y":534.531055898432,"value":[75.00000000000004,-1.2264707051176287]},{"x":1265.219848996396,"y":538.9750359887194,"value":[75.09999999999998,-1.2570114013092413]},{"x":1266.0497145136642,"y":544.0288341997364,"value":[75.2,-1.2917459722137727]},{"x":1266.8797391173057,"y":549.0026119649784,"value":[75.3,-1.32593022210841]},{"x":1267.7092266694124,"y":554.2465266522009,"value":[75.40000000000002,-1.3619722724973387]},{"x":1268.5384005612418,"y":559.6482124589148,"value":[75.50000000000001,-1.3990993551048438]},{"x":1269.3683281997626,"y":564.6707636797871,"value":[75.59999999999995,-1.4336190324905242]},{"x":1270.196528617057,"y":570.5621071775574,"value":[75.69999999999997,-1.4741136158965475]},{"x":1271.0258611171623,"y":575.8840130215906,"value":[75.8,-1.5106920313577175]},{"x":1271.85641059127,"y":580.5937809422517,"value":[75.89999999999996,-1.543060618231674]},{"x":1272.6873253240326,"y":585.1198237595438,"value":[75.99999999999993,-1.5741656807219568]},{"x":1273.5193276673142,"y":589.0987984858173,"value":[76.09999999999992,-1.6015084164541857]},{"x":1274.352651705459,"y":592.4129606958736,"value":[76.19999999999995,-1.6242790669927851]},{"x":1275.185798508206,"y":595.8162723110861,"value":[76.29999999999994,-1.647662820722724]},{"x":1276.0202655066705,"y":598.5555254803356,"value":[76.39999999999993,-1.666479675192451]},{"x":1276.8561264934358,"y":600.5936025342257,"value":[76.49999999999993,-1.6804743627249445]},{"x":1277.6937398495693,"y":601.7502377959865,"value":[76.59999999999992,-1.688407150295367]},{"x":1278.5317416806681,"y":602.7114701502185,"value":[76.69999999999992,-1.6949961022452023]},{"x":1279.3692759564622,"y":603.9078828226752,"value":[76.79999999999991,-1.7032024492117666]},{"x":1280.2100219381077,"y":603.4888074518694,"value":[76.89999999999988,-1.700298672973802]},{"x":1281.0515382397468,"y":602.6822611242741,"value":[76.99999999999987,-1.6947301601653235]},{"x":1281.893625639295,"y":601.588452548493,"value":[77.09999999999987,-1.687186071627476]},{"x":1282.7363813457916,"y":600.1584855775715,"value":[77.19999999999989,-1.6773301360896937]},{"x":1283.58014020794,"y":598.223931313798,"value":[77.29999999999988,-1.6640040250749681]},{"x":1284.4252902294843,"y":595.5896238739232,"value":[77.39999999999985,-1.645865533039121]},{"x":1285.2718484246918,"y":592.2470050814859,"value":[77.49999999999987,-1.6228558032203892]},{"x":1286.1216477915227,"y":587.2740769623942,"value":[77.59999999999984,-1.588634020451984]},{"x":1286.9708449968925,"y":582.6040360583121,"value":[77.69999999999986,-1.5564952702939832]},{"x":1287.8211162999678,"y":577.3937240084017,"value":[77.79999999999986,-1.5206409377031451]},{"x":1288.6730835186318,"y":571.3303664173271,"value":[77.89999999999985,-1.478919993408843]},{"x":1289.5245820216,"y":565.5027728212458,"value":[77.99999999999987,-1.438820458225238]},{"x":1290.3771008624212,"y":559.1619492850739,"value":[78.09999999999984,-1.3951913098758526]},{"x":1291.2321760657762,"y":551.5352753944378,"value":[78.19999999999983,-1.342719040761652]},{"x":1292.0846983209951,"y":545.1927344162286,"value":[78.29999999999986,-1.2990780811254488]},{"x":1292.9355036223367,"y":539.7138212382788,"value":[78.39999999999982,-1.2613765100868615]},{"x":1293.7860202778131,"y":534.380096930507,"value":[78.49999999999982,-1.2246734399299926]},{"x":1294.6357229446423,"y":529.4558089123674,"value":[78.59999999999981,-1.1907861675385054]},{"x":1295.4847302017572,"y":524.8813119804042,"value":[78.6999999999998,-1.159304497639389]},{"x":1296.3323584720763,"y":521.0004454068086,"value":[78.7999999999998,-1.1325931005825907]},{"x":1297.1769133972048,"y":518.6654714641182,"value":[78.89999999999979,-1.1165132013335057]},{"x":1298.0161911258672,"y":518.9849273438452,"value":[78.99999999999982,-1.118688492822494]},{"x":1298.8526717092175,"y":520.7113473154849,"value":[79.09999999999975,-1.1305398351313523]},{"x":1299.6892558125387,"y":522.3856967418418,"value":[79.19999999999978,-1.1420330750229057]},{"x":1300.5247051455844,"y":524.630835616764,"value":[79.29999999999977,-1.1574517794970376]},{"x":1301.3578962344204,"y":528.011871329121,"value":[79.39999999999974,-1.1806823361629388]},{"x":1302.1912244162568,"y":531.3239492623683,"value":[79.49999999999976,-1.203438652598455]},{"x":1303.0233573935905,"y":535.2372150604432,"value":[79.59999999999975,-1.2303294912764353]},{"x":1303.85468352336,"y":539.5563251831406,"value":[79.69999999999975,-1.260011424860516]},{"x":1304.6863679964981,"y":543.6951885916716,"value":[79.79999999999974,-1.2884537558304183]},{"x":1305.5178105276357,"y":547.9557488263546,"value":[79.89999999999974,-1.3177330269050702]},{"x":1306.3485012059184,"y":552.5944910470488,"value":[79.99999999999973,-1.3496131519296108]},{"x":1307.1797539973247,"y":556.9504903665897,"value":[80.09999999999972,-1.3795487819267085]},{"x":1308.012823376487,"y":560.3927460448126,"value":[80.19999999999972,-1.4032003639082617]},{"x":1308.8452795418955,"y":564.143448241249,"value":[80.29999999999971,-1.4289732112459106]},{"x":1309.676632755316,"y":568.4489352877127,"value":[80.39999999999974,-1.4585614554610031]},{"x":1310.5081606920835,"y":572.6665364905177,"value":[80.4999999999997,-1.4875452863193668]},{"x":1311.3397262967799,"y":576.8651907250578,"value":[80.59999999999967,-1.5163988140457123]},{"x":1312.1730465472965,"y":580.1812581121002,"value":[80.69999999999966,-1.5391825669722432]},{"x":1313.0045229389357,"y":584.4247865145497,"value":[80.79999999999968,-1.5683447057937023]},{"x":1313.8344436266389,"y":589.4508339967788,"value":[80.89999999999968,-1.6028884278602407]},{"x":1314.6643969892668,"y":594.4604459917003,"value":[80.99999999999967,-1.6373191188897023]},{"x":1315.4941357970094,"y":599.5779790940984,"value":[81.09999999999964,-1.6724920108939312]},{"x":1316.3231167132951,"y":605.0767315993256,"value":[81.19999999999966,-1.7102866459380133]},{"x":1317.152103338463,"y":610.5726125367788,"value":[81.29999999999966,-1.748061532478296]},{"x":1317.9818903684882,"y":615.6658898310548,"value":[81.39999999999962,-1.783067611105115]},{"x":1318.8117063704806,"y":620.7445942257324,"value":[81.49999999999964,-1.817973468185473]},{"x":1319.642043421608,"y":625.5612109055271,"value":[81.59999999999961,-1.8510768812212053]},{"x":1320.4726240323714,"y":630.2553170885847,"value":[81.69999999999963,-1.8833377583320976]},{"x":1321.3036231438584,"y":634.7389174075107,"value":[81.79999999999963,-1.9141509329387656]},{"x":1322.137837459057,"y":637.6052702594478,"value":[81.89999999999962,-1.933841884335303]},{"x":1322.97008083383,"y":641.4630061455799,"value":[81.99999999999962,-1.960350829649359]},{"x":1323.805297814564,"y":643.825018233219,"value":[82.09999999999961,-1.9765733010086803]},{"x":1324.6418147529764,"y":645.53315160869,"value":[82.1999999999996,-1.9882988817328133]},{"x":1325.477783776402,"y":647.5168862225472,"value":[82.2999999999996,-2.0019198424484985]},{"x":1326.3153746024398,"y":648.6848541224999,"value":[82.39999999999962,-2.0099305674614607]},{"x":1327.1527260795576,"y":649.9732145290184,"value":[82.49999999999959,-2.01876926244079]},{"x":1327.9915347888693,"y":650.5285871421897,"value":[82.59999999999958,-2.0225670134617504]},{"x":1328.8311552405203,"y":650.6756533586511,"value":[82.69999999999958,-2.0235567372790637]},{"x":1329.6683598771529,"y":652.0378745293139,"value":[82.79999999999954,-2.032903391567067]},{"x":1330.5037676790168,"y":654.3039035886486,"value":[82.89999999999957,-2.0484657631661625]},{"x":1331.3394551716956,"y":656.4292481681977,"value":[82.99999999999956,-2.0630606117248353]},{"x":1332.1733986689371,"y":659.4318224525017,"value":[83.09999999999953,-2.083688392646671]},{"x":1333.004990880926,"y":663.6170932189881,"value":[83.19999999999952,-2.1124498788505797]},{"x":1333.83714649246,"y":667.5189740143463,"value":[83.29999999999954,-2.139262419961831]},{"x":1334.6693300343195,"y":671.4068058559633,"value":[83.39999999999954,-2.1659783428358823]},{"x":1335.5002548744433,"y":675.9277646705331,"value":[83.4999999999995,-2.1970484413430817]},{"x":1336.3296642751993,"y":681.2109894871377,"value":[83.59999999999953,-2.233360837515405]},{"x":1337.158796226193,"y":686.6337715341765,"value":[83.69999999999952,-2.2706330043469256]},{"x":1337.9910497025635,"y":690.4864263168237,"value":[83.79999999999951,-2.2971070056166916]},{"x":1338.8242541197571,"y":693.860757865272,"value":[83.89999999999951,-2.320291456037908]},{"x":1339.6577584297083,"y":697.0842433567144,"value":[83.9999999999995,-2.3424384996610703]},{"x":1340.4927597638166,"y":699.5547256972155,"value":[84.0999999999995,-2.359406948608001]},{"x":1341.328407041071,"y":701.7002986350732,"value":[84.19999999999949,-2.374140912744762]},{"x":1342.164409327238,"y":703.6673020899963,"value":[84.29999999999949,-2.3876468090142025]},{"x":1343.005051400388,"y":703.300492692375,"value":[84.39999999999948,-2.385102479201054]},{"x":1343.8485478765872,"y":701.4979185611054,"value":[84.49999999999945,-2.372684029210985]},{"x":1344.6946657158724,"y":698.3767987975575,"value":[84.59999999999944,-2.3511976046936507]},{"x":1345.5408545951955,"y":695.2199458949685,"value":[84.69999999999946,-2.329465434267588]},{"x":1346.3869989314103,"y":692.0854981757974,"value":[84.79999999999946,-2.3078873500009562]},{"x":1347.2344897907278,"y":688.2737493360121,"value":[84.89999999999945,-2.2816512932238044]},{"x":1348.0809944634173,"y":684.9580523701196,"value":[84.99999999999942,-2.258826711670981]},{"x":1348.9290533494093,"y":680.8605861129543,"value":[85.09999999999941,-2.2306257033598262]},{"x":1349.7774454658227,"y":676.5955049540321,"value":[85.19999999999943,-2.201271964629403]},{"x":1350.6256519478095,"y":672.4237979115172,"value":[85.29999999999943,-2.1725603835068465]},{"x":1351.4739027594587,"y":668.2297930488762,"value":[85.39999999999942,-2.1436954545895937]},{"x":1352.3221951560804,"y":664.0148709450323,"value":[85.49999999999939,-2.1146866724709303]},{"x":1353.1704471717678,"y":659.8202604512243,"value":[85.59999999999941,-2.085817578473712]},{"x":1354.0178473172575,"y":656.0541406668934,"value":[85.69999999999943,-2.05989532434581]},{"x":1354.8658668659805,"y":651.9764610561041,"value":[85.79999999999943,-2.0318303938471525]},{"x":1355.7142283826408,"y":647.7267715728585,"value":[85.89999999999942,-2.0025825075950587]},{"x":1356.5624421407326,"y":643.5514046495231,"value":[85.99999999999936,-1.9738457565388723]},{"x":1357.41072103069,"y":639.3432763978815,"value":[86.09999999999938,-1.9448836974741583]},{"x":1358.2589651570931,"y":635.152634214065,"value":[86.1999999999994,-1.916041894556626]},{"x":1359.1071467705287,"y":630.9934360528333,"value":[86.29999999999937,-1.8874163402002768]},{"x":1359.9561931747749,"y":626.3992481138536,"value":[86.39999999999934,-1.8557992502249245]},{"x":1360.8047990984107,"y":622.0266219219367,"value":[86.49999999999936,-1.8257058968798416]},{"x":1361.653023065396,"y":617.8461199252894,"value":[86.59999999999935,-1.796933830615103]},{"x":1362.5010937097,"y":613.7427392373103,"value":[86.69999999999935,-1.7686921472551305]},{"x":1363.34846097196,"y":609.9931597173344,"value":[86.79999999999934,-1.7428836447427747]},{"x":1364.1959546551182,"y":606.1799904856667,"value":[86.89999999999934,-1.716637819568465]},{"x":1365.042016500317,"y":603.0870357475372,"value":[86.9999999999993,-1.6953450931126932]},{"x":1365.8871496387226,"y":600.4612205264806,"value":[87.0999999999993,-1.6772650042310762]},{"x":1366.7316788790072,"y":598.1391660602136,"value":[87.19999999999929,-1.6612739555156733]},{"x":1367.575518009321,"y":596.164236909256,"value":[87.29999999999932,-1.6476701761066481]},{"x":1368.4185727624858,"y":594.5838494643002,"value":[87.39999999999931,-1.636779760613428]},{"x":1369.2601492078488,"y":593.7470508435996,"value":[87.4999999999993,-1.6310031950712753]},{"x":1370.1001447775573,"y":593.7054326771178,"value":[87.5999999999993,-1.6306952882747243]},{"x":1370.9403537860999,"y":593.5564547770532,"value":[87.69999999999929,-1.6296490412148188]},{"x":1371.7821354480284,"y":592.6164322239947,"value":[87.79999999999929,-1.623162578368916]},{"x":1372.624633115927,"y":591.3162586677724,"value":[87.89999999999925,-1.6141992652398605]},{"x":1373.4671527348069,"y":590.0050437681973,"value":[87.99999999999928,-1.605160017977151]},{"x":1374.3104458756804,"y":588.3047473056308,"value":[88.09999999999924,-1.5934449575943912]},{"x":1375.1534777623435,"y":586.7358617110579,"value":[88.19999999999926,-1.5826336432590948]},{"x":1375.9987208993537,"y":584.0547171918142,"value":[88.29999999999926,-1.5641730406855068]},{"x":1376.8444544043655,"y":581.1269175677644,"value":[88.39999999999925,-1.54401612806193]},{"x":1377.6909822375073,"y":577.7995708943587,"value":[88.49999999999925,-1.521111428499995]},{"x":1378.5397279406982,"y":573.356635586164,"value":[88.59999999999921,-1.4905345414342466]},{"x":1379.388816685542,"y":568.7411503266605,"value":[88.69999999999924,-1.4587709843550791]},{"x":1380.2378293238712,"y":564.1639466439824,"value":[88.7999999999992,-1.427270699441105]},{"x":1381.0877313205917,"y":559.1393956904471,"value":[88.8999999999992,-1.392693893276998]},{"x":1381.9370817740455,"y":554.392271000091,"value":[88.99999999999922,-1.3600250182653046]},{"x":1382.7864692639678,"y":549.6265169660725,"value":[89.09999999999921,-1.327228024506975]},{"x":1383.6363740428553,"y":544.6005665825762,"value":[89.1999999999992,-1.2926415941061875]},{"x":1384.4853250493704,"y":540.0543637023288,"value":[89.29999999999917,-1.2613545096153804]},{"x":1385.3336243167928,"y":535.8359855859411,"value":[89.39999999999922,-1.2323219596172095]},{"x":1386.181118384831,"y":532.0226227595607,"value":[89.49999999999919,-1.2060748030426955]},{"x":1387.0285862426194,"y":528.2224436888669,"value":[89.59999999999918,-1.1799183145177454]},{"x":1387.875636873451,"y":524.6321297775256,"value":[89.69999999999918,-1.1552051222068833]},{"x":1388.7220954640886,"y":521.3396120836611,"value":[89.79999999999917,-1.132539950418245]},{"x":1389.5687294808813,"y":517.9588550338739,"value":[89.89999999999917,-1.1092679340788982]},{"x":1390.4153365581349,"y":514.5916485722435,"value":[89.99999999999916,-1.0860891085895505]},{"x":1391.2611522618038,"y":511.6225030237122,"value":[90.09999999999918,-1.065647849500576]},{"x":1392.1069291833005,"y":508.67286490766116,"value":[90.19999999999915,-1.0453407479989405]},{"x":1392.9523369971869,"y":505.9088879197877,"value":[90.29999999999914,-1.026310485417251]},{"x":1393.796926406829,"y":503.5565682666654,"value":[90.39999999999914,-1.0101112952945672]},{"x":1394.6408394556731,"y":501.54445809498503,"value":[90.49999999999913,-0.9962518125252946]},{"x":1395.4840508747834,"y":499.88526767937384,"value":[90.59999999999913,-0.9848194489090196]},{"x":1396.326624463067,"y":498.54690616965445,"value":[90.69999999999912,-0.9755935074862716]},{"x":1397.1675803239857,"y":498.02226152448765,"value":[90.79999999999912,-0.9719637044295659]},{"x":1398.0047332477263,"y":499.4104942798094,"value":[90.89999999999911,-0.9814892470179251]},{"x":1398.8379341862696,"y":502.78657558944,"value":[90.9999999999991,-1.0046857309929602]},{"x":1399.6690414893249,"y":507.2157555495441,"value":[91.0999999999991,-1.0351246429154388]},{"x":1400.4987785178078,"y":512.3341836195048,"value":[91.1999999999991,-1.0703036898398022]},{"x":1401.3262632074652,"y":518.5855381187231,"value":[91.29999999999909,-1.1132741607014798]},{"x":1402.1530161154917,"y":525.2049787783079,"value":[91.39999999999908,-1.1587760539457679]},{"x":1402.978652616608,"y":532.3859721136905,"value":[91.49999999999908,-1.2081398881310408]},{"x":1403.8028271791502,"y":540.30232055185,"value":[91.59999999999907,-1.2625609468652685]},{"x":1404.6271907001626,"y":548.1236228795066,"value":[91.69999999999906,-1.3163283492618945]},{"x":1405.4530735508401,"y":555.1807023855988,"value":[91.79999999999903,-1.3648399964465252]},{"x":1406.2795061811487,"y":561.9612427372856,"value":[91.89999999999903,-1.4114498133519815]},{"x":1407.1081187554437,"y":567.645271263841,"value":[91.99999999999905,-1.450518638838008]},{"x":1407.937943278296,"y":572.7196896660046,"value":[92.09999999999901,-1.485395020054968]},{"x":1408.767866958035,"y":577.7442321542263,"value":[92.19999999999904,-1.5199283918939615]},{"x":1409.5996683657265,"y":581.8242774822521,"value":[92.29999999999903,-1.5479662159262904]},{"x":1410.4339562372347,"y":584.6536315105316,"value":[92.39999999999903,-1.5674027169782572]},{"x":1411.2679063088272,"y":587.6528988964448,"value":[92.49999999999899,-1.588007755516637]},{"x":1412.1049151135928,"y":589.1136234962269,"value":[92.59999999999899,-1.5980318430039429]},{"x":1412.942684883177,"y":590.1915827922332,"value":[92.69999999999898,-1.6054235558964]},{"x":1413.7795826865279,"y":591.7081411037276,"value":[92.799999999999,-1.615831626056111]},{"x":1414.6181554027676,"y":592.3822182320663,"value":[92.89999999999897,-1.6204457382961728]},{"x":1415.4591512147392,"y":591.8374782071405,"value":[92.99999999999896,-1.6166777341887713]},{"x":1416.2989728508992,"y":591.8833486155902,"value":[93.09999999999899,-1.6169715086306136]},{"x":1417.1387559965033,"y":591.948579773599,"value":[93.19999999999895,-1.6173984318839443]},{"x":1417.9794346142783,"y":591.5633884298612,"value":[93.29999999999897,-1.6147276847401653]},{"x":1418.8197653807142,"y":591.3531663094033,"value":[93.39999999999897,-1.6132602455600376]},{"x":1419.6595515069862,"y":591.4168981915439,"value":[93.49999999999896,-1.6136768579109235]},{"x":1420.499478862547,"y":591.4095917414131,"value":[93.59999999999899,-1.6136049215368153]},{"x":1421.3393873795385,"y":591.411761091474,"value":[93.69999999999892,-1.6135981526568468]},{"x":1422.1793581649783,"y":591.382609412225,"value":[93.79999999999895,-1.6133759810718082]},{"x":1423.0185555753633,"y":591.742465385484,"value":[93.89999999999894,-1.6158291143055798]},{"x":1423.857673397585,"y":592.1423542048774,"value":[93.99999999999893,-1.6185575636301355]},{"x":1424.6963623142315,"y":592.7579825285568,"value":[94.09999999999893,-1.6227697085367785]},{"x":1425.534625816401,"y":593.5875943341616,"value":[94.19999999999895,-1.6284534724119677]},{"x":1426.3738471493712,"y":593.9354172470869,"value":[94.29999999999892,-1.630823851221531]},{"x":1427.213766790985,"y":593.9319909122692,"value":[94.39999999999891,-1.6307785993898154]},{"x":1428.0535807690972,"y":593.9817133186871,"value":[94.4999999999989,-1.6310988650039002]},{"x":1428.894122724342,"y":593.6652632274861,"value":[94.5999999999989,-1.6289008689820523]},{"x":1429.73462869264,"y":593.3669145704525,"value":[94.6999999999989,-1.6268273611386332]},{"x":1430.574248036529,"y":593.5145379911352,"value":[94.79999999999889,-1.6278209169914586]},{"x":1431.4131578404558,"y":594.019060012885,"value":[94.89999999999888,-1.631268955528891]},{"x":1432.2505856222358,"y":595.2690391744045,"value":[94.99999999999885,-1.6398436928995848]},{"x":1433.0862451410244,"y":597.4084546206669,"value":[95.09999999999887,-1.6545353103965557]},{"x":1433.9230452758527,"y":598.9741401989193,"value":[95.19999999999884,-1.6652812412966531]},{"x":1434.7574484535103,"y":601.7454952340292,"value":[95.29999999999883,-1.684318868483511]},{"x":1435.5895774872272,"y":605.660744671376,"value":[95.39999999999885,-1.7112233491545705]},{"x":1436.4215805568767,"y":609.6393540344964,"value":[95.49999999999885,-1.7385635721912314]},{"x":1437.2504516606296,"y":615.1933422437644,"value":[95.59999999999881,-1.7767380772564758]},{"x":1438.0804701562126,"y":620.17019236236,"value":[95.69999999999884,-1.8109434565085394]},{"x":1438.908379597399,"y":626.2078968425244,"value":[95.79999999999883,-1.8524446017108671]},{"x":1439.7361790670104,"y":632.3009170248556,"value":[95.89999999999883,-1.8943261671018687]},{"x":1440.5638731598244,"y":638.4469417363599,"value":[95.99999999999882,-1.9365722581555431]},{"x":1441.3903984065737,"y":645.1808960183906,"value":[96.09999999999881,-1.9828616907810588]},{"x":1442.2188144605307,"y":650.963774274847,"value":[96.19999999999878,-2.0226103310651675]},{"x":1443.0486526994757,"y":656.0312934823893,"value":[96.29999999999878,-2.057439264761501]},{"x":1443.878978269719,"y":660.8536850469684,"value":[96.3999999999988,-2.090582393152425]},{"x":1444.7112831079069,"y":664.6805048353839,"value":[96.49999999999879,-2.1168787205792317]},{"x":1445.5449033092618,"y":667.84569695076,"value":[96.59999999999879,-2.1386248657910416]},{"x":1446.3795383445633,"y":670.5004275909098,"value":[96.69999999999875,-2.156860437275869]},{"x":1447.216329763232,"y":672.0704973975223,"value":[96.79999999999875,-2.1676365196323273]},{"x":1448.0536142978265,"y":673.3925298934148,"value":[96.89999999999874,-2.1767067861562808]},{"x":1448.89303000738,"y":673.6425813848429,"value":[96.99999999999874,-2.178404765969611]},{"x":1449.7338428167614,"y":673.1898916630334,"value":[97.09999999999876,-2.1752698152685177]},{"x":1450.574075698672,"y":673.0289054589089,"value":[97.19999999999878,-2.174140984039611]},{"x":1451.4142170545724,"y":672.9139568378991,"value":[97.29999999999878,-2.1733287650088444]},{"x":1452.2548949166014,"y":672.5291456342351,"value":[97.39999999999874,-2.1706606321852844]},{"x":1453.0939117176688,"y":672.9798480941572,"value":[97.49999999999874,-2.1737385398726543]},{"x":1453.933037407886,"y":673.3757793117612,"value":[97.59999999999873,-2.1764397717605615]},{"x":1454.7714345899594,"y":674.1381501257629,"value":[97.69999999999872,-2.1816611021908106]},{"x":1455.6100275027234,"y":674.8020684024797,"value":[97.79999999999875,-2.186205349417878]},{"x":1456.449141728158,"y":675.2037664056154,"value":[97.89999999999871,-2.1889462409603517]},{"x":1457.286959583358,"y":676.2575386370161,"value":[97.99999999999874,-2.1961716132420888]},{"x":1458.123454308001,"y":677.9768455384354,"value":[98.0999999999987,-2.2079740371532894]},{"x":1458.9616167964018,"y":678.8572672698069,"value":[98.19999999999872,-2.214007233843928]},{"x":1459.7996239724127,"y":679.8158111331774,"value":[98.29999999999869,-2.2205776963565746]},{"x":1460.6393881852396,"y":679.8905654782338,"value":[98.39999999999868,-2.221070112995535]},{"x":1461.4799853888408,"y":679.5463254637305,"value":[98.49999999999868,-2.2186809985850235]},{"x":1462.320044345252,"y":679.4728237857926,"value":[98.5999999999987,-2.218153820750258]},{"x":1463.1617418524868,"y":678.5751310435588,"value":[98.69999999999867,-2.2119584708070157]},{"x":1464.0025499805583,"y":678.1247960204115,"value":[98.79999999999866,-2.208839713969043]},{"x":1464.8431223961766,"y":677.7930243613025,"value":[98.89999999999866,-2.2065363476178668]},{"x":1465.684413900602,"y":677.0995510322032,"value":[98.99999999999862,-2.201745466652369]},{"x":1466.5260782928126,"y":676.218515147177,"value":[99.09999999999862,-2.1956646701634517]},{"x":1467.3676306939374,"y":675.3938107783487,"value":[99.19999999999864,-2.189971279875321]},{"x":1468.209211423878,"y":674.5548570150457,"value":[99.29999999999863,-2.184179892867954]},{"x":1469.0507875193612,"y":673.7182343840294,"value":[99.39999999999863,-2.178404537651736]},{"x":1469.892365960879,"y":672.8804316974574,"value":[99.49999999999862,-2.1726210668925603]},{"x":1470.733931700966,"y":672.0490178305513,"value":[99.59999999999862,-2.1668815336753013]},{"x":1471.5755424084723,"y":671.1949853517659,"value":[99.69999999999858,-2.160986446496663]},{"x":1472.4170361762178,"y":670.3997735727054,"value":[99.7999999999986,-2.155495884268638]},{"x":1473.258728341243,"y":669.5047679618835,"value":[99.8999999999986,-2.1493190144133028]},{"x":1474.10120360456,"y":668.215863910389,"value":[99.9999999999986,-2.1404332045418544]},{"x":1474.9426643044844,"y":667.4372852452999,"value":[100.09999999999859,-2.1350570324798666]},{"x":1475.7856304675176,"y":665.9014586364938,"value":[100.19999999999858,-2.1244730732193533]},{"x":1476.628014581505,"y":664.6584026976226,"value":[100.29999999999855,-2.115902572509161]},{"x":1477.4699064861793,"y":663.6629280434919,"value":[100.39999999999857,-2.109034751424532]},{"x":1478.3132882872517,"y":661.9180355009056,"value":[100.49999999999856,-2.0970129924279846]},{"x":1479.1556333991784,"y":660.6945975986969,"value":[100.59999999999853,-2.0885774099582957]},{"x":1479.998002064364,"y":659.4593124072406,"value":[100.69999999999852,-2.0800603506595285]},{"x":1480.8405125576307,"y":658.152687690961,"value":[100.79999999999855,-2.071052671257786]},{"x":1481.6825391369598,"y":657.0894716853331,"value":[100.89999999999851,-2.0637189756256387]},{"x":1482.5237141456398,"y":656.4545957162971,"value":[100.99999999999854,-2.0593310836469554]},{"x":1483.3643798923856,"y":656.0758785000435,"value":[101.09999999999853,-2.056704860728714]},{"x":1484.2051342075883,"y":655.652611349982,"value":[101.19999999999852,-2.053772256555951]},{"x":1485.045898288492,"y":655.2244320523773,"value":[101.29999999999855,-2.0508058702919927]},{"x":1485.8865123282544,"y":654.8717234487016,"value":[101.39999999999851,-2.048358515234349]},{"x":1486.7278661354796,"y":654.1469118113897,"value":[101.49999999999854,-2.0433521127323626]},{"x":1487.5692110498476,"y":653.4265732812016,"value":[101.5999999999985,-2.0383764729286584]},{"x":1488.4097945307697,"y":653.0892357743079,"value":[101.6999999999985,-2.0360348288230385]},{"x":1489.250588871016,"y":652.6458360272625,"value":[101.79999999999849,-2.032963767647235]},{"x":1490.0920931987912,"y":651.8453125532623,"value":[101.89999999999849,-2.027436675538689]},{"x":1490.9345638156615,"y":650.5587456643786,"value":[101.99999999999848,-2.0185669389304657]},{"x":1491.7762178790636,"y":649.6829051699794,"value":[102.09999999999845,-2.012521872467655]},{"x":1492.6185971964585,"y":648.4422619172697,"value":[102.19999999999847,-2.003967964415403]},{"x":1493.4617246819973,"y":646.8252900881721,"value":[102.29999999999849,-1.9928259487838398]},{"x":1494.3041961356037,"y":645.5383023210168,"value":[102.39999999999846,-1.9839533176884228]},{"x":1495.1483688695964,"y":643.3955705195673,"value":[102.49999999999845,-1.969195516664204]},{"x":1495.991511270758,"y":641.7710961321513,"value":[102.59999999999845,-1.9580019040260188]},{"x":1496.8362302804544,"y":639.3535876518586,"value":[102.69999999999844,-1.9413543937164768]},{"x":1497.6798495176097,"y":637.4892647596145,"value":[102.79999999999843,-1.9285112817519563]},{"x":1498.5225205762486,"y":636.1018756611525,"value":[102.89999999999843,-1.91894816509995]},{"x":1499.3666662430041,"y":633.9727586799686,"value":[102.9999999999984,-1.9042839966663214]},{"x":1500.2089757012805,"y":632.7672545638995,"value":[103.09999999999842,-1.8959717494168258]},{"x":1501.0511948571477,"y":631.6071725595808,"value":[103.19999999999841,-1.887971881611957]},{"x":1501.894880031882,"y":629.7096830651695,"value":[103.2999999999984,-1.874900674467229]},{"x":1502.7393263042125,"y":627.4293614798463,"value":[103.3999999999984,-1.8591966334154852]},{"x":1503.5850627066882,"y":624.5001044314288,"value":[103.4999999999984,-1.8390296977129053]},{"x":1504.431506255924,"y":621.2151525627003,"value":[103.59999999999836,-1.816416558032926]},{"x":1505.2772624964425,"y":618.2759169788021,"value":[103.69999999999838,-1.7961809973974328]},{"x":1506.1263740410934,"y":613.6489634163115,"value":[103.79999999999838,-1.7643385698743375]},{"x":1506.9740699407873,"y":609.7340792671739,"value":[103.89999999999837,-1.7373932252764428]},{"x":1507.822427448802,"y":605.4864061326299,"value":[103.99999999999837,-1.7081592059685162]},{"x":1508.6712941639375,"y":600.9826018163126,"value":[104.09999999999836,-1.6771637072130057]},{"x":1509.519748230539,"y":596.6863597126334,"value":[104.19999999999835,-1.6475956667198028]},{"x":1510.369829624606,"y":591.571571893938,"value":[104.29999999999832,-1.6123982786246192]},{"x":1511.2197013020595,"y":586.5622715316622,"value":[104.39999999999831,-1.5779263546653302]},{"x":1512.0703934837422,"y":581.1402575421591,"value":[104.49999999999831,-1.540616093854335]},{"x":1512.9207297436012,"y":575.8972722300024,"value":[104.59999999999833,-1.5045370589077192]},{"x":1513.770323605694,"y":571.027712994142,"value":[104.6999999999983,-1.4710261703071819]},{"x":1514.6188974569793,"y":566.6712191947803,"value":[104.79999999999832,-1.4410437635392759]},{"x":1515.4661850392383,"y":562.9617187154084,"value":[104.89999999999834,-1.4155108948088526]},{"x":1516.313634525554,"y":559.170780495382,"value":[104.99999999999831,-1.3894179579702532]},{"x":1517.1604148998103,"y":555.7164056413877,"value":[105.0999999999983,-1.3656396532196742]},{"x":1518.0061357618215,"y":552.7949654467183,"value":[105.19999999999833,-1.3455264760135281]},{"x":1518.849215903064,"y":551.2018077986238,"value":[105.29999999999832,-1.334548236577068]},{"x":1519.6882371818615,"y":551.6502579603905,"value":[105.39999999999829,-1.337610654635713]},{"x":1520.5243825617717,"y":553.545285262421,"value":[105.49999999999828,-1.3506215525486138]},{"x":1521.3601220071941,"y":555.6444976118742,"value":[105.59999999999827,-1.3650366830974967]},{"x":1522.1950940612815,"y":558.1297078028756,"value":[105.69999999999827,-1.3821064192277515]},{"x":1523.0298831843288,"y":560.7069323068741,"value":[105.79999999999826,-1.3998089612510873]},{"x":1523.8650008047373,"y":563.1189226383092,"value":[105.89999999999826,-1.416375145736875]},{"x":1524.6992886900396,"y":565.948269728176,"value":[105.99999999999825,-1.4358115990716085]},{"x":1525.5323350919339,"y":569.4020829722588,"value":[106.09999999999825,-1.4595426653806274]},{"x":1526.366540215509,"y":572.2730592108671,"value":[106.19999999999827,-1.4792654129862144]},{"x":1527.2031419274626,"y":573.9385514951498,"value":[106.29999999999824,-1.4906977400532533]},{"x":1528.038796838812,"y":576.0802844832825,"value":[106.39999999999823,-1.5054052958766135]},{"x":1528.8762632005742,"y":577.31085791379,"value":[106.49999999999822,-1.5138465750868955]},{"x":1529.7163262436873,"y":577.2353006247963,"value":[106.59999999999822,-1.5133052602907426]},{"x":1530.5557620159416,"y":577.4752605778025,"value":[106.69999999999821,-1.5149338380211184]},{"x":1531.3939543380397,"y":578.3406759593504,"value":[106.7999999999982,-1.5208638322175716]},{"x":1532.2338412982663,"y":578.3536883622631,"value":[106.89999999999817,-1.5209316337769199]},{"x":1533.0738220243472,"y":578.31953654046,"value":[106.9999999999982,-1.5206750749365576]},{"x":1533.9137327990281,"y":578.3205702727822,"value":[107.09999999999819,-1.52066049612383]},{"x":1534.7534396971942,"y":578.4241538922038,"value":[107.19999999999816,-1.521351179033736]},{"x":1535.5919903765857,"y":579.1093155551994,"value":[107.29999999999818,-1.5260415224450639]},{"x":1536.4292241101311,"y":580.4569009786517,"value":[107.39999999999817,-1.5352875229675504]},{"x":1537.2658494972895,"y":582.11048463498,"value":[107.49999999999817,-1.546637951363584]},{"x":1538.1008503326427,"y":584.5812178491857,"value":[107.59999999999816,-1.5636081256329497]},{"x":1538.9361742214328,"y":586.8894551846716,"value":[107.69999999999816,-1.5794607743097657]},{"x":1539.7722077685273,"y":588.840734392963,"value":[107.79999999999812,-1.592858530925617]},{"x":1540.607439137392,"y":591.1955092509832,"value":[107.89999999999814,-1.6090312300114382]},{"x":1541.4412414583298,"y":594.2690952161821,"value":[107.99999999999814,-1.6301473763699565]},{"x":1542.2744562255807,"y":597.638220685835,"value":[108.0999999999981,-1.6532960232598048]},{"x":1543.1075093568609,"y":601.0886490488859,"value":[108.19999999999813,-1.6770038108788619]},{"x":1543.9420573509656,"y":603.7871614110626,"value":[108.2999999999981,-1.6955404804299077]},{"x":1544.776924469699,"y":606.3251540850957,"value":[108.39999999999812,-1.7129732151549018]},{"x":1545.6123639163575,"y":608.575265812735,"value":[108.49999999999808,-1.7284261192051904]},{"x":1546.4491309245589,"y":610.1576140843309,"value":[108.59999999999808,-1.7392866436962082]},{"x":1547.28567034873,"y":611.8544371232899,"value":[108.69999999999813,-1.7509344403521405]},{"x":1548.122833529631,"y":613.2375105270212,"value":[108.7999999999981,-1.760424500764037]},{"x":1548.9623037893318,"y":613.4601232942853,"value":[108.89999999999809,-1.761933777474729]},{"x":1549.8023496769458,"y":613.3931952214136,"value":[108.99999999999808,-1.7614518079982]},{"x":1550.6424294698588,"y":613.3092127830897,"value":[109.0999999999981,-1.7608525513017854]},{"x":1551.483494929144,"y":612.7294401595399,"value":[109.1999999999981,-1.7568436190807342]},{"x":1552.3250930086936,"y":611.8817595430143,"value":[109.29999999999806,-1.7509922152785071]},{"x":1553.1665664479372,"y":611.0967730003157,"value":[109.39999999999806,-1.7455719746082625]},{"x":1554.0095875721531,"y":609.5333009166498,"value":[109.49999999999805,-1.7347978903678571]},{"x":1554.8524677270768,"y":608.0407363869107,"value":[109.59999999999808,-1.7245114554564243]}],"autoDetectionData":{"fgColor":[0,0,255],"bgColor":[255,255,255],"mask":[[732874,4],[735033,9],[737193,10],[739353,12],[741513,15],[743673,19],[745833,23],[747992,34],[750150,45],[752308,47],[754466,71],[756625,72],[758784,73],[760943,74],[763104,96],[763202,1],[765265,122],[767425,123],[769585,132],[769729,23],[771746,131],[771888,24],[773906,131],[774047,25],[776067,1],[776074,123],[776205,27],[778235,157],[778468,12],[780397,156],[780627,14],[782557,1],[782559,155],[782785,19],[784721,1],[784723,151],[784945,20],[786887,148],[787104,22],[789051,144],[789262,24],[791217,140],[791422,25],[793378,1],[793386,133],[793581,26],[795547,134],[795740,28],[797710,134],[797899,29],[799876,139],[800057,32],[802049,126],[802216,33],[804211,124],[804375,35],[806392,2],[806396,99],[806533,37],[808563,1],[808577,78],[808692,39],[810736,79],[810852,39],[812897,80],[813011,41],[815057,103],[815164,48],[817228,144],[819390,24],[819417,115],[821577,115],[821710,1],[821719,1],[823740,112],[823870,12],[825901,111],[826028,16],[828061,112],[828187,19],[830226,108],[830346,20],[832387,108],[832503,25],[834548,140],[836709,81],[836791,58],[838875,74],[838951,58],[841035,73],[841112,58],[843195,73],[843272,59],[845355,73],[845433,59],[847524,64],[847594,58],[849685,63],[849754,59],[851847,61],[851914,59],[854009,57],[854076,58],[856173,53],[856236,58],[858335,1],[858355,31],[858397,58],[860517,27],[860557,58],[862679,15],[862719,57],[862976,1],[864840,12],[864880,56],[865135,3],[867041,55],[867294,5],[869203,54],[869453,7],[871364,53],[871612,9],[873525,27],[873555,23],[873771,11],[875686,24],[875715,23],[875928,15],[877846,20],[877876,23],[878087,17],[880006,19],[880036,23],[880246,19],[882197,23],[882405,21],[884358,22],[884565,22],[886518,22],[886724,23],[888679,21],[888882,26],[890839,22],[891037,32],[893000,21],[893197,32],[895160,21],[895357,33],[897319,22],[897517,35],[899480,21],[899677,34],[901641,20],[901837,34],[903800,21],[903997,34],[905960,21],[906157,34],[908120,21],[908315,36],[910280,21],[910475,36],[912440,21],[912635,36],[914600,21],[914795,36],[916760,21],[916955,36],[918920,22],[919115,36],[921080,22],[921274,37],[923240,22],[923434,37],[925400,22],[925592,39],[927560,22],[927681,13],[927752,39],[929721,22],[929829,25],[929912,39],[931882,21],[931987,28],[932071,40],[934042,21],[934147,28],[934231,40],[936202,22],[936307,29],[936391,40],[938363,21],[938467,29],[938551,40],[940523,22],[940627,30],[940711,40],[942683,23],[942707,12],[942787,31],[942870,41],[944844,36],[944947,32],[945029,42],[947004,37],[947072,1],[947107,33],[947188,43],[949164,38],[949229,1],[949231,21],[949267,34],[949347,44],[951324,39],[951387,25],[951427,35],[951507,44],[953485,39],[953543,29],[953587,36],[953666,45],[953843,1],[955645,40],[955702,31],[955747,37],[955825,47],[956003,2],[957805,43],[957861,40],[957907,37],[957985,47],[958163,2],[959965,43],[960020,42],[960067,38],[960145,48],[960323,3],[962126,42],[962179,44],[962225,41],[962304,26],[962331,21],[962483,2],[964287,42],[964338,46],[964385,42],[964464,25],[964492,21],[964643,3],[966446,43],[966497,91],[966623,25],[966652,21],[966803,3],[968607,43],[968657,91],[968783,25],[968812,21],[968963,4],[970768,43],[970817,93],[970943,24],[970972,22],[971123,3],[972928,143],[973103,23],[973132,23],[973283,4],[975087,145],[975262,23],[975292,23],[975443,4],[977248,144],[977422,23],[977452,23],[977603,5],[979408,145],[979582,23],[979612,23],[979763,4],[981568,118],[981687,27],[981742,22],[981773,22],[981923,5],[983729,117],[983848,27],[983901,22],[983933,22],[984083,5],[985888,118],[986008,28],[986061,22],[986094,22],[986243,6],[988048,118],[988170,27],[988220,23],[988255,22],[988403,5],[990209,115],[990330,28],[990379,23],[990415,22],[990563,6],[992369,113],[992491,28],[992537,24],[992575,22],[992723,6],[994530,15],[994551,44],[994598,43],[994652,28],[994698,23],[994735,23],[994883,7],[996711,43],[996763,36],[996812,29],[996858,23],[996895,23],[997043,6],[998871,43],[998928,30],[998973,29],[999017,24],[999056,22],[999203,7],[1001031,43],[1001091,26],[1001134,29],[1001176,25],[1001216,23],[1001363,7],[1003191,43],[1003251,25],[1003296,28],[1003336,25],[1003377,23],[1003523,8],[1005357,36],[1005411,23],[1005457,28],[1005495,25],[1005538,23],[1005683,7],[1007516,36],[1007571,22],[1007617,28],[1007654,26],[1007698,24],[1007843,8],[1009677,35],[1009731,21],[1009778,28],[1009814,25],[1009858,24],[1010003,8],[1011838,34],[1011891,21],[1011939,27],[1011973,24],[1012018,25],[1012049,1],[1012062,1],[1012079,1],[1012098,7],[1012163,9],[1013997,35],[1014051,20],[1014099,27],[1014133,24],[1014178,25],[1014209,16],[1014239,26],[1014323,8],[1016157,35],[1016230,1],[1016261,25],[1016292,24],[1016339,24],[1016368,17],[1016398,27],[1016483,9],[1018324,28],[1018421,25],[1018452,23],[1018500,23],[1018527,21],[1018558,29],[1018643,9],[1020486,26],[1020583,23],[1020611,24],[1020660,23],[1020686,23],[1020718,29],[1020803,10],[1022647,25],[1022743,23],[1022771,24],[1022821,22],[1022845,26],[1022877,30],[1022963,9],[1024904,22],[1024930,24],[1024981,22],[1025004,28],[1025035,34],[1025123,10],[1027065,21],[1027089,24],[1027142,87],[1027283,10],[1029225,21],[1029248,25],[1029302,88],[1029443,11],[1031385,21],[1031408,24],[1031463,88],[1031603,10],[1033545,21],[1033567,24],[1033623,88],[1033763,11],[1035705,21],[1035727,24],[1035783,88],[1035923,11],[1037865,21],[1037887,23],[1037944,88],[1038083,12],[1040025,21],[1040047,23],[1040103,90],[1040243,11],[1042185,21],[1042207,22],[1042264,90],[1042403,12],[1044345,21],[1044367,22],[1044424,90],[1044563,12],[1044676,2],[1046505,21],[1046527,21],[1046584,90],[1046723,13],[1046835,4],[1048665,21],[1048687,21],[1048745,90],[1048883,12],[1048994,5],[1050825,43],[1050904,92],[1051043,13],[1051153,7],[1052985,43],[1053065,92],[1053203,13],[1053311,9],[1055145,43],[1055225,92],[1055363,14],[1055470,11],[1057305,43],[1057385,66],[1057453,24],[1057523,13],[1057629,12],[1059465,43],[1059545,65],[1059614,25],[1059683,14],[1059789,13],[1061625,43],[1061705,62],[1061774,25],[1061843,14],[1061945,17],[1063785,42],[1063865,35],[1063902,24],[1063935,25],[1064003,15],[1064104,19],[1065945,43],[1066025,35],[1066064,19],[1066096,25],[1066163,14],[1066264,19],[1068105,42],[1068185,34],[1068226,13],[1068256,25],[1068323,15],[1068423,21],[1070265,42],[1070346,33],[1070387,7],[1070417,25],[1070483,15],[1070583,21],[1072425,42],[1072506,32],[1072548,2],[1072569,34],[1072643,16],[1072742,23],[1074586,41],[1074666,32],[1074729,34],[1074803,15],[1074902,23],[1076746,40],[1076826,32],[1076889,35],[1076963,16],[1077062,24],[1078906,41],[1078986,32],[1079049,36],[1079123,16],[1079221,25],[1081066,40],[1081146,31],[1081209,36],[1081283,16],[1081381,25],[1083226,40],[1083306,31],[1083369,37],[1083443,16],[1083541,25],[1085386,40],[1085467,29],[1085529,37],[1085603,17],[1085698,28],[1087546,39],[1087626,30],[1087689,38],[1087763,17],[1087859,27],[1089706,39],[1089787,29],[1089849,38],[1089923,18],[1090019,27],[1091866,39],[1091947,29],[1092009,39],[1092083,17],[1092179,27],[1094028,36],[1094107,29],[1094169,39],[1094243,18],[1094339,27],[1096188,36],[1096267,29],[1096330,39],[1096403,18],[1096499,27],[1098348,35],[1098427,29],[1098490,39],[1098563,18],[1098659,27],[1100508,35],[1100587,29],[1100651,39],[1100723,18],[1100819,27],[1102668,35],[1102747,28],[1102811,39],[1102883,19],[1102979,27],[1104828,34],[1104907,28],[1104971,40],[1105043,19],[1105139,27],[1106988,33],[1107067,27],[1107132,39],[1107203,20],[1107299,27],[1109148,31],[1109227,26],[1109292,39],[1109363,19],[1109459,27],[1111308,30],[1111388,25],[1111452,40],[1111523,20],[1111619,27],[1113468,29],[1113548,24],[1113613,40],[1113683,20],[1113779,27],[1115628,28],[1115710,22],[1115773,40],[1115844,20],[1115939,27],[1117799,16],[1117870,21],[1117934,41],[1118001,22],[1118099,27],[1119963,11],[1120030,21],[1120094,42],[1120161,23],[1120258,28],[1122190,20],[1122254,43],[1122308,2],[1122321,23],[1122418,28],[1124350,20],[1124415,55],[1124481,23],[1124578,28],[1126510,19],[1126575,56],[1126640,24],[1126737,29],[1128670,19],[1128736,55],[1128800,25],[1128897,29],[1130829,20],[1130896,56],[1130960,25],[1131057,29],[1133057,55],[1133120,25],[1133217,28],[1135217,56],[1135280,25],[1135377,28],[1137378,55],[1137440,26],[1137537,28],[1139538,56],[1139600,26],[1139697,28],[1141698,56],[1141760,26],[1141857,28],[1143858,56],[1143920,27],[1144017,28],[1146018,56],[1146080,27],[1146177,28],[1148178,57],[1148240,28],[1148336,29],[1150339,56],[1150400,28],[1150496,29],[1152499,56],[1152560,28],[1152655,33],[1154659,57],[1154720,28],[1154815,33],[1156819,57],[1156880,29],[1156974,34],[1158979,57],[1159040,29],[1159134,34],[1161139,57],[1161200,29],[1161294,34],[1163300,56],[1163360,29],[1163454,34],[1165461,56],[1165520,30],[1165614,34],[1167622,55],[1167680,30],[1167774,34],[1169782,56],[1169839,32],[1169933,35],[1171942,56],[1171999,32],[1172093,35],[1174102,56],[1174159,32],[1174253,35],[1176262,90],[1176413,35],[1176552,18],[1178422,90],[1178572,36],[1178711,19],[1180582,91],[1180732,36],[1180870,20],[1182742,35],[1182778,55],[1182891,37],[1183029,21],[1184902,35],[1184938,56],[1185052,37],[1185188,22],[1187062,33],[1187098,57],[1187211,38],[1187347,23],[1189222,33],[1189259,56],[1189371,39],[1189506,24],[1191382,32],[1191419,57],[1191531,39],[1191665,26],[1193543,30],[1193579,58],[1193690,41],[1193825,26],[1195704,28],[1195739,58],[1195850,41],[1195984,28],[1197864,27],[1197899,59],[1198009,43],[1198143,29],[1200024,26],[1200059,59],[1200169,43],[1200303,30],[1202184,25],[1202219,59],[1202329,44],[1202463,31],[1204355,10],[1204379,60],[1204489,44],[1204623,32],[1206539,60],[1206648,46],[1206783,34],[1208699,61],[1208807,47],[1208943,34],[1210859,61],[1210967,22],[1210991,24],[1211103,35],[1213019,37],[1213058,23],[1213127,22],[1213151,24],[1213262,36],[1215179,37],[1215218,23],[1215287,22],[1215312,23],[1215422,36],[1217339,37],[1217379,22],[1217446,22],[1217473,22],[1217582,36],[1219499,37],[1219539,22],[1219606,22],[1219634,22],[1219741,37],[1221659,37],[1221699,22],[1221766,22],[1221794,23],[1221901,37],[1223819,37],[1223859,23],[1223925,23],[1223954,23],[1224061,37],[1225979,37],[1226020,22],[1226085,24],[1226115,23],[1226220,38],[1228140,36],[1228180,22],[1228245,23],[1228276,22],[1228380,39],[1230300,36],[1230341,21],[1230405,21],[1230436,22],[1230540,39],[1232461,35],[1232501,22],[1232564,22],[1232596,23],[1232700,40],[1234621,36],[1234661,22],[1234722,24],[1234757,22],[1234860,40],[1236781,36],[1236822,21],[1236881,24],[1236917,22],[1237019,42],[1238941,36],[1238982,22],[1239041,24],[1239077,22],[1239179,42],[1241101,36],[1241142,22],[1241201,24],[1241238,22],[1241339,43],[1243261,36],[1243303,21],[1243361,23],[1243399,21],[1243498,44],[1245422,35],[1245463,21],[1245521,23],[1245559,22],[1245658,46],[1247582,35],[1247623,21],[1247681,22],[1247719,22],[1247817,47],[1249743,34],[1249784,20],[1249840,23],[1249879,23],[1249977,22],[1250001,24],[1251903,34],[1251944,21],[1252000,23],[1252039,23],[1252138,21],[1252161,24],[1254063,34],[1254104,21],[1254159,23],[1254199,23],[1254297,22],[1254321,26],[1256223,34],[1256264,21],[1256320,22],[1256359,23],[1256456,22],[1256482,25],[1258383,34],[1258425,21],[1258479,23],[1258520,22],[1258617,21],[1258642,26],[1260543,34],[1260584,22],[1260638,23],[1260681,27],[1260776,22],[1260803,25],[1262703,34],[1262745,22],[1262799,21],[1262841,35],[1262936,22],[1262963,26],[1264863,34],[1264905,22],[1264958,22],[1265001,36],[1265096,22],[1265125,24],[1267023,34],[1267065,23],[1267117,23],[1267161,36],[1267256,21],[1267285,25],[1269183,34],[1269226,21],[1269277,23],[1269321,36],[1269415,22],[1269446,24],[1271343,34],[1271386,22],[1271437,23],[1271481,36],[1271575,21],[1271607,24],[1273503,34],[1273546,22],[1273596,23],[1273641,36],[1273735,21],[1273768,23],[1275663,34],[1275707,22],[1275757,21],[1275802,35],[1275895,21],[1275928,24],[1277823,34],[1277867,22],[1277917,21],[1277962,36],[1278055,21],[1278089,23],[1279983,34],[1280027,22],[1280077,21],[1280123,35],[1280215,21],[1280249,23],[1282143,34],[1282188,22],[1282237,21],[1282283,36],[1282375,21],[1282411,21],[1284303,34],[1284348,23],[1284396,21],[1284444,36],[1284535,21],[1284571,21],[1286463,34],[1286509,22],[1286556,21],[1286604,36],[1286695,21],[1286731,21],[1288624,33],[1288669,22],[1288716,21],[1288764,37],[1288855,21],[1288891,21],[1290784,33],[1290829,22],[1290875,22],[1290924,38],[1291015,21],[1291051,22],[1292944,32],[1292989,23],[1293035,21],[1293084,39],[1293175,21],[1293212,21],[1295104,31],[1295150,23],[1295194,22],[1295244,39],[1295335,21],[1295372,22],[1297265,28],[1297310,22],[1297354,22],[1297404,39],[1297495,21],[1297532,26],[1299425,28],[1299470,23],[1299514,21],[1299564,39],[1299655,21],[1299693,24],[1301585,26],[1301631,22],[1301673,22],[1301733,1],[1301735,28],[1301815,21],[1301853,24],[1303746,24],[1303791,23],[1303833,22],[1303896,27],[1303975,21],[1304013,24],[1305906,24],[1305952,22],[1305992,22],[1306056,27],[1306135,21],[1306174,23],[1308066,23],[1308113,21],[1308152,22],[1308215,28],[1308295,21],[1308333,24],[1310226,22],[1310272,22],[1310311,23],[1310376,27],[1310455,22],[1310494,24],[1312386,20],[1312432,23],[1312471,22],[1312539,26],[1312615,22],[1312654,26],[1314546,18],[1314592,23],[1314631,22],[1314699,27],[1314775,22],[1314814,25],[1316706,15],[1316752,23],[1316788,1],[1316791,22],[1316862,24],[1316935,22],[1316975,24],[1318866,13],[1318912,23],[1318949,24],[1319023,24],[1319095,22],[1319134,24],[1321026,10],[1321073,22],[1321109,25],[1321183,24],[1321255,22],[1321294,34],[1323186,6],[1323235,21],[1323269,24],[1323344,23],[1323415,22],[1323454,35],[1325346,3],[1325395,21],[1325429,23],[1325504,23],[1325575,22],[1325615,34],[1327555,21],[1327589,22],[1327665,22],[1327736,21],[1327775,34],[1329715,21],[1329749,22],[1329825,22],[1329897,20],[1329936,33],[1331875,21],[1331909,22],[1331985,22],[1332057,20],[1332097,32],[1334035,21],[1334069,22],[1334145,22],[1334217,20],[1334257,31],[1336195,21],[1336229,22],[1336306,21],[1336377,20],[1336417,30],[1338355,21],[1338389,22],[1338466,21],[1338537,20],[1338577,30],[1340515,21],[1340549,21],[1340626,21],[1340697,20],[1340737,30],[1342675,21],[1342709,21],[1342786,21],[1342857,20],[1342897,30],[1344835,21],[1344869,21],[1344946,22],[1345017,20],[1345057,30],[1346995,21],[1347029,21],[1347106,22],[1347177,20],[1347225,22],[1349155,21],[1349189,21],[1349266,23],[1349337,20],[1349387,20],[1351315,21],[1351349,21],[1351427,23],[1351497,20],[1351550,17],[1353475,21],[1353507,23],[1353587,23],[1353656,21],[1353711,1],[1353718,10],[1355635,21],[1355667,23],[1355748,22],[1355816,21],[1357795,21],[1357827,23],[1357907,23],[1357975,22],[1359955,21],[1359987,23],[1360068,22],[1360135,22],[1362115,21],[1362147,22],[1362228,22],[1362295,22],[1364275,21],[1364307,22],[1364389,21],[1364454,22],[1366435,21],[1366467,21],[1366548,22],[1366612,24],[1368595,21],[1368627,21],[1368709,21],[1368772,24],[1370755,21],[1370787,21],[1370869,21],[1370930,26],[1372915,21],[1372947,21],[1373029,21],[1373089,27],[1375075,21],[1375107,21],[1375189,22],[1375248,28],[1377235,21],[1377267,21],[1377349,22],[1377407,29],[1379395,21],[1379427,21],[1379509,22],[1379566,30],[1381555,21],[1381587,21],[1381669,22],[1381725,31],[1383715,21],[1383747,21],[1383829,22],[1383884,31],[1385875,21],[1385907,21],[1385989,22],[1386043,31],[1388035,21],[1388066,22],[1388150,21],[1388198,34],[1390195,21],[1390226,22],[1390311,20],[1390357,34],[1392355,21],[1392386,22],[1392471,20],[1392515,35],[1394515,21],[1394546,22],[1394631,20],[1394673,36],[1396675,21],[1396705,23],[1396791,20],[1396831,37],[1398835,21],[1398864,24],[1398951,20],[1398989,39],[1400995,21],[1401024,24],[1401111,20],[1401142,44],[1403155,23],[1403184,24],[1403271,20],[1403302,43],[1405315,23],[1405344,24],[1405431,20],[1405462,42],[1407475,23],[1407504,23],[1407591,21],[1407622,40],[1409635,23],[1409663,23],[1409751,22],[1409782,40],[1411795,23],[1411823,23],[1411911,22],[1411942,40],[1413955,23],[1413982,23],[1414070,24],[1414102,40],[1416115,23],[1416142,23],[1416231,23],[1416262,39],[1418275,23],[1418302,22],[1418392,24],[1418421,38],[1420435,24],[1420462,22],[1420552,24],[1420581,36],[1422595,24],[1422622,21],[1422713,23],[1422741,35],[1424756,23],[1424782,21],[1424873,24],[1424900,34],[1426916,23],[1426942,21],[1427033,24],[1427060,33],[1429076,24],[1429102,21],[1429194,24],[1429220,33],[1431236,24],[1431262,21],[1431355,23],[1431380,25],[1433396,24],[1433422,21],[1433515,24],[1433540,24],[1435556,25],[1435583,20],[1435676,46],[1437716,25],[1437742,21],[1437836,45],[1439876,47],[1439996,45],[1442036,47],[1442157,44],[1444196,46],[1444318,43],[1446358,44],[1446479,42],[1448519,43],[1448639,42],[1450680,42],[1450800,41],[1452841,40],[1452961,40],[1455002,40],[1455121,40],[1457162,39],[1457282,38],[1459323,38],[1459442,39],[1461482,39],[1461603,37],[1463643,38],[1463763,37],[1465803,38],[1465925,35],[1467964,37],[1468086,33],[1470124,37],[1470246,33],[1472284,37],[1472407,32],[1474445,36],[1474568,31],[1476605,36],[1476728,30],[1478765,35],[1478889,27],[1480925,36],[1481050,24],[1483085,35],[1483212,20],[1485246,34],[1485373,17],[1487406,34],[1487534,14],[1489567,33],[1491728,32],[1493888,32],[1496049,31],[1498208,32],[1500369,31],[1502529,31],[1504689,31],[1506849,31],[1509009,31],[1511169,31],[1513329,30],[1515489,29],[1517649,28],[1519810,26],[1521970,25],[1524130,25],[1526291,24],[1528453,22],[1530614,19],[1532775,17],[1534936,14],[1537097,11]],"colorDetectionMode":"fg","colorDistance":120,"algorithm":{"algoType":"XStepWithInterpolationAlgo","xmin":0,"delx":0.1,"xmax":110,"ymin":-4,"ymax":1,"smoothing":0},"name":1,"imageWidth":2160,"imageHeight":1215}}],"measurementColl":[]} \ No newline at end of file diff --git a/Functions/Theory/Dissertation/PD/100ghz_pd_bandwidth.csv b/Functions/Theory/Dissertation/PD/100ghz_pd_bandwidth.csv new file mode 100644 index 0000000..2ad0acd --- /dev/null +++ b/Functions/Theory/Dissertation/PD/100ghz_pd_bandwidth.csv @@ -0,0 +1,1094 @@ +0,29999999999999716; 0,06289048304646494 +0,4000000000000057; 0,05908863173059098 +0,5; 0,05212349046968612 +0,5999999999999801; 0,04347850683588783 +0,6999999999999886; 0,03776082088577315 +0,7999999999999972; 0,030342516078868176 +0,8999999999999915; 0,017415949453996937 +1; 0,0059822519655732265 +1,09999999999998; -0,006904977686680525 +1,2000000000000028; -0,02221251499623733 +1,3000000000000114; -0,02164574202145575 +1,4000000000000057; -0,023860225493147258 +1,5; -0,026712751945128232 +1,5999999999999943; -0,03162730410002412 +1,7000000000000028; -0,03575703706172284 +1,7999999999999972; -0,035394665259939284 +1,9000000000000057; -0,03851463751009643 +2; -0,04173983277196358 +2,0999999999999943; -0,042334486678409444 +2,200000000000003; -0,04208155441441708 +2,299999999999983; -0,042165722518257454 +2,4000000000000057; -0,04214414044678261 +2,5; -0,04214755849595253 +2,59999999999998; -0,04214797308650997 +2,700000000000003; -0,042147418699202355 +2,8000000000000114; -0,04214739536346901 +2,9000000000000057; -0,04214830189970309 +3; -0,04214607406071735 +3,1000000000000085; -0,042148487562625014 +3,200000000000003; -0,04215601436126759 +3,299999999999997; -0,04209590060205759 +3,3999999999999915; -0,04234748093334462 +3,499999999999986; -0,04154932909464337 +3,5999999999999943; -0,04357109170371043 +3,6999999999999886; -0,049279784140702 +3,799999999999997; -0,04901990470683071 +3,9000000000000057; -0,05131945804069549 +4; -0,0549110616798929 +4,1000000000000085; -0,05615513483301182 +4,200000000000017; -0,05583743147926645 +4,299999999999997; -0,055912261023230325 +4,400000000000006; -0,055903424098370014 +4,5; -0,05590008823483261 +4,599999999999994; -0,05590302204419162 +4,700000000000003; -0,05590172138470528 +4,799999999999997; -0,05590214513040248 +4,8999999999999915; -0,055902051810359676 +5; -0,05590205918211577 +5,099999999999994; -0,05590196304468531 +5,200000000000003; -0,05590256047634856 +5,299999999999983; -0,05590024793430537 +5,3999999999999915; -0,05590713062536423 +5,5; -0,05589195724363494 +5,599999999999994; -0,055907867459632055 +5,699999999999989; -0,05596009713019923 +5,799999999999997; -0,05555047977711158 +5,8999999999999915; -0,057844021671365375 +6; -0,05971102353034308 +6,09999999999998; -0,05925377653406594 +6,199999999999989; -0,05935090902347895 +6,299999999999983; -0,059344784123038785 +6,3999999999999915; -0,05933674237110065 +6,499999999999972; -0,059344114562855044 +6,599999999999994; -0,059334138475983345 +6,699999999999989; -0,05935540324922561 +6,799999999999997; -0,059319916038937937 +6,8999999999999915; -0,059315885543302915 +7; -0,05964359551725362 +7,099999999999994; -0,05708311520994247 +7,199999999999989; -0,055547191755839 +7,299999999999997; -0,055998521222151876 +7,399999999999977; -0,05588470886047858 +7,499999999999986; -0,05590187253368928 +7,599999999999994; -0,05589784365850026 +7,699999999999989; -0,05593402866528008 +7,799999999999983; -0,055783402774205904 +7,899999999999977; -0,056234389229795845 +7,999999999999972; -0,055219661135540665 +8,09999999999998; -0,0524715732708958 +8,199999999999989; -0,05548268142809043 +8,299999999999969; -0,05616593260772795 +8,399999999999991; -0,055819054738820206 +8,499999999999986; -0,05585842389977769 +8,599999999999994; -0,056064624208270075 +8,700000000000003; -0,055726316675493326 +8,799999999999983; -0,05268229074371167 +8,899999999999991; -0,05228098963003891 +8,999999999999986; -0,05254162432036491 +9,09999999999998; -0,052443061420786474 +9,199999999999974; -0,05245582696905471 +9,299999999999983; -0,052482432134502766 +9,399999999999963; -0,05248878913414412 +9,499999999999986; -0,05216315912565728 +9,599999999999966; -0,05469313925207242 +9,69999999999996; -0,05632191667802644 +9,799999999999983; -0,05563883183702423 +9,899999999999991; -0,05621609529916949 +9,999999999999986; -0,05930192570493231 +10,09999999999998; -0,06248474267197279 +10,199999999999974; -0,06269760027180782 +10,299999999999983; -0,06410738796343418 +10,399999999999977; -0,06777990421268809 +10,499999999999986; -0,06976155664575234 +10,599999999999966; -0,06969718894474974 +10,699999999999974; -0,07253064097687689 +10,799999999999983; -0,07578684087981546 +10,899999999999977; -0,07709713838381482 +10,999999999999957; -0,07527434657259491 +11,09999999999998; -0,07255442302946014 +11,199999999999974; -0,06911449853600082 +11,299999999999969; -0,06023029509685829 +11,399999999999977; -0,053977486703372435 +11,499999999999972; -0,049126853296412865 +11,599999999999966; -0,052366898445485255 +11,69999999999996; -0,06236098572731841 +11,799999999999969; -0,07080400832276945 +11,899999999999963; -0,07952500698330311 +11,999999999999957; -0,08552773815089099 +12,09999999999998; -0,09113290198393686 +12,19999999999996; -0,09691975313572154 +12,299999999999969; -0,10287100649003023 +12,399999999999963; -0,10824968726788198 +12,499999999999957; -0,1109009939512231 +12,599999999999966; -0,1112053598720597 +12,699999999999974; -0,10876554864296839 +12,799999999999969; -0,10571175510730146 +12,899999999999977; -0,10275501177976754 +12,999999999999972; -0,10018088552774262 +13,099999999999966; -0,10070976263017961 +13,199999999999974; -0,10632440971886759 +13,299999999999955; -0,11318748287220792 +13,399999999999963; -0,11408798163958833 +13,499999999999972; -0,11682462203504951 +13,599999999999966; -0,12174149355146646 +13,69999999999996; -0,12132753070420499 +13,799999999999969; -0,1244124732669909 +13,899999999999949; -0,12486457806001816 +13,999999999999972; -0,12468047090760015 +14,099999999999966; -0,124394712541529 +14,19999999999996; -0,12547235232529497 +14,299999999999969; -0,12830681537200128 +14,399999999999949; -0,12814644516923623 +14,499999999999957; -0,12807294505783773 +14,599999999999952; -0,12812610643245703 +14,69999999999996; -0,12812916808507513 +14,799999999999955; -0,12805572265464926 +14,899999999999949; -0,12821202639766094 +14,999999999999957; -0,12814013900923316 +15,099999999999952; -0,1251856115795431 +15,199999999999946; -0,12425961484435444 +15,299999999999955; -0,1253581500385046 +15,399999999999963; -0,12272802149320317 +15,499999999999957; -0,11665090617434393 +15,599999999999966; -0,11435950626838975 +15,69999999999996; -0,11469299194893656 +15,799999999999955; -0,10976740335957436 +15,899999999999963; -0,10398291666035409 +15,999999999999957; -0,09660522443401298 +16,09999999999995; -0,08868856431204453 +16,199999999999946; -0,08272120626252821 +16,29999999999997; -0,07098340617456911 +16,39999999999995; -0,06135597957109207 +16,499999999999957; -0,056286038161118324 +16,599999999999966; -0,05744491745492786 +16,69999999999996; -0,06643059636064441 +16,79999999999997; -0,07754932667840375 +16,899999999999977; -0,08300693842336315 +16,99999999999997; -0,0913762522735011 +17,09999999999998; -0,09913115065421785 +17,199999999999974; -0,10037210221554593 +17,299999999999955; -0,10244159955920384 +17,399999999999977; -0,10786724159028616 +17,499999999999986; -0,10746229670814467 +17,59999999999998; -0,11054668657464761 +17,699999999999974; -0,10929339974605501 +17,79999999999997; -0,10495147318342735 +17,899999999999977; -0,10488738311412371 +17,999999999999986; -0,10785847862266973 +18,09999999999998; -0,11114978326279257 +18,19999999999999; -0,12292059556255452 +18,299999999999997; -0,13009882595657052 +18,39999999999999; -0,13475721954888842 +18,49999999999997; -0,14231860921929806 +18,59999999999998; -0,15071587671483888 +18,700000000000003; -0,15590622465477955 +18,799999999999997; -0,15876080812779136 +18,89999999999999; -0,1616075436860478 +19; -0,16444601225180966 +19,099999999999994; -0,16761056433456023 +19,19999999999999; -0,16969775514044994 +19,299999999999997; -0,16926920889866404 +19,40000000000002; -0,169258913848374 +19,50000000000003; -0,17217480030284316 +19,60000000000001; -0,17319598771124634 +19,700000000000003; -0,17236817321722508 +19,80000000000001; -0,17383675094937168 +19,90000000000002; -0,17638875503238927 +20,000000000000014; -0,17622711043524308 +20,10000000000001; -0,1791666490128807 +20,200000000000017; -0,17996279829951556 +20,300000000000026; -0,17958814251640298 +20,40000000000002; -0,17973551432026502 +20,500000000000014; -0,17965824053340862 +20,60000000000001; -0,17970347322075364 +20,70000000000003; -0,17988254596681008 +20,800000000000026; -0,1774216437780467 +20,90000000000002; -0,17444328056280245 +21,00000000000003; -0,17116998258490268 +21,100000000000023; -0,1694058856331342 +21,200000000000017; -0,16914427029479429 +21,300000000000026; -0,16318188487909469 +21,400000000000034; -0,15951193583130197 +21,500000000000043; -0,15863405082646365 +21,600000000000023; -0,160261893967391 +21,70000000000003; -0,1634601843576835 +21,80000000000004; -0,16627295198640812 +21,900000000000034; -0,16916577342965633 +22,000000000000043; -0,17211870791527062 +22,100000000000037; -0,1747036370172097 +22,200000000000045; -0,17898133449179365 +22,300000000000054; -0,1856729333413072 +22,400000000000063; -0,19029021886901187 +22,500000000000043; -0,18999357864117394 +22,60000000000005; -0,1926762334532004 +22,70000000000006; -0,19579205405147881 +22,80000000000004; -0,19859561200204778 +22,90000000000005; -0,2014461139806194 +23,000000000000043; -0,2044847427480998 +23,10000000000005; -0,2072329591999389 +23,20000000000006; -0,20725199210056733 +23,300000000000054; -0,20730331553323866 +23,400000000000063; -0,2066603093963124 +23,50000000000007; -0,20920103011500402 +23,60000000000008; -0,21576212082721513 +23,70000000000006; -0,22131362870084903 +23,800000000000068; -0,22695552862097346 +23,900000000000077; -0,2355332656527418 +24,00000000000007; -0,2426203564527607 +24,10000000000005; -0,24698122302761005 +24,200000000000074; -0,24849343323101758 +24,300000000000068; -0,24868307389380195 +24,400000000000063; -0,25174906040771283 +24,50000000000007; -0,25207422777841515 +24,600000000000094; -0,25181733881890533 +24,700000000000074; -0,25195399515396577 +24,800000000000082; -0,25183658249022844 +24,900000000000077; -0,2520008864747574 +25,0000000000001; -0,2519495823423199 +25,100000000000094; -0,24896739356188258 +25,200000000000088; -0,2482290698657157 +25,300000000000068; -0,24849300802924024 +25,40000000000009; -0,24861416408782588 +25,500000000000085; -0,24811997948153186 +25,600000000000094; -0,24494447071511916 +25,700000000000088; -0,24175913475033362 +25,800000000000082; -0,2420324930144453 +25,90000000000012; -0,2383088531285269 +26,0000000000001; -0,23260704861389625 +26,100000000000094; -0,23138106038816453 +26,200000000000102; -0,23107004932010566 +26,30000000000011; -0,2252201452256779 +26,40000000000012; -0,21923979868251342 +26,5000000000001; -0,21358107052297903 +26,600000000000094; -0,2077830472198925 +26,700000000000117; -0,20195192374460413 +26,80000000000011; -0,19628306571778875 +26,900000000000105; -0,1905641416495829 +27,000000000000114; -0,18192367830687362 +27,100000000000122; -0,17497431588790802 +27,200000000000117; -0,17041918204987194 +27,300000000000097; -0,16206915518524756 +27,400000000000134; -0,1507661211002187 +27,500000000000128; -0,14542942087789834 +27,600000000000122; -0,14004574627298672 +27,700000000000102; -0,13155427083686755 +27,80000000000014; -0,12431829378320103 +27,90000000000012; -0,11916333878877738 +28,000000000000128; -0,11286938527927459 +28,100000000000122; -0,10744861070950185 +28,200000000000117; -0,10779983485292677 +28,300000000000125; -0,10262382815429527 +28,40000000000012; -0,09976887904026865 +28,500000000000128; -0,10139614803543218 +28,600000000000136; -0,10574316441352405 +28,70000000000013; -0,1150077184379743 +28,800000000000125; -0,12382900621934079 +28,90000000000012; -0,1294448400522641 +29,000000000000142; -0,1377629774181406 +29,100000000000136; -0,14395632484834664 +29,200000000000145; -0,1460474968206822 +29,30000000000014; -0,149052176019159 +29,400000000000134; -0,15188185539206644 +29,500000000000142; -0,1571912332852925 +29,60000000000015; -0,1649274578350335 +29,70000000000013; -0,1754382327017221 +29,800000000000153; -0,18711683962705639 +29,900000000000162; -0,19890132240670777 +30,00000000000017; -0,21038774894432644 +30,10000000000015; -0,21599209858940638 +30,20000000000016; -0,22601905430402258 +30,300000000000168; -0,23814878341161094 +30,400000000000162; -0,24982203410535675 +30,500000000000156; -0,26066938451888566 +30,600000000000165; -0,26925646567836425 +30,700000000000173; -0,2809297111628841 +30,800000000000168; -0,2901866091770442 +30,900000000000162; -0,2987777098518758 +31,00000000000017; -0,3065830579540547 +31,100000000000193; -0,31126746538038885 +31,200000000000173; -0,3139608953924493 +31,300000000000182; -0,3168381099318789 +31,400000000000162; -0,31989069057688546 +31,500000000000185; -0,3214913909702166 +31,60000000000018; -0,3183565390170999 +31,700000000000173; -0,31191396159040696 +31,800000000000182; -0,3063371598164526 +31,90000000000019; -0,3005861349321024 +32,000000000000185; -0,2940882437663177 +32,10000000000018; -0,29331547744082176 +32,20000000000017; -0,2907400333578436 +32,30000000000018; -0,28419786393425595 +32,40000000000019; -0,2783766060051227 +32,500000000000185; -0,2726275238046645 +32,60000000000019; -0,2725474269561108 +32,700000000000216; -0,2705910996349452 +32,800000000000196; -0,26736423814202004 +32,90000000000019; -0,264359391353683 +33,0000000000002; -0,26199472692261816 +33,10000000000021; -0,26222542211145106 +33,20000000000019; -0,2622790636554462 +33,300000000000196; -0,2620035533526619 +33,400000000000205; -0,26348581031397034 +33,5000000000002; -0,2680515796958267 +33,60000000000019; -0,27390657475626634 +33,7000000000002; -0,27985292617029334 +33,80000000000021; -0,28855545285192274 +33,90000000000022; -0,2971810666833563 +34,00000000000023; -0,307044051099576 +34,10000000000021; -0,3217683843134713 +34,200000000000216; -0,339697214879052 +34,300000000000225; -0,356918372091656 +34,40000000000022; -0,37427920015355065 +34,5000000000002; -0,3912583950861257 +34,60000000000021; -0,41106958138249716 +34,70000000000023; -0,43002139314036647 +34,800000000000225; -0,4469406298979144 +34,900000000000205; -0,46429342968061826 +35,00000000000023; -0,4816229223209896 +35,100000000000236; -0,4996249512721809 +35,20000000000023; -0,5113935179283375 +35,300000000000225; -0,5270646812938797 +35,40000000000023; -0,5412558366562923 +35,50000000000024; -0,5501192609280054 +35,60000000000022; -0,5649457499637145 +35,700000000000216; -0,5735551252173194 +35,80000000000024; -0,5845902163908083 +35,90000000000025; -0,5946551972164511 +36,00000000000024; -0,6030955039522778 +36,100000000000236; -0,6112398192384125 +36,200000000000244; -0,616691287712066 +36,30000000000025; -0,6223858494457244 +36,40000000000026; -0,6289586272213792 +36,50000000000024; -0,6301705284904244 +36,60000000000025; -0,6316578803137278 +36,70000000000026; -0,6331911586092303 +36,80000000000024; -0,6299812499529174 +36,90000000000025; -0,6301900859932252 +37,000000000000256; -0,627792257416079 +37,100000000000264; -0,6241656008942562 +37,20000000000026; -0,6232716161802152 +37,30000000000025; -0,6226304833691674 +37,40000000000025; -0,6193417379355997 +37,500000000000256; -0,6165056097133976 +37,600000000000264; -0,6136185235658869 +37,70000000000026; -0,61079116424603 +37,80000000000028; -0,6076333282886766 +37,90000000000026; -0,6056486901354021 +38,00000000000027; -0,606415332188925 +38,100000000000264; -0,6095557726663725 +38,20000000000027; -0,6152166354716644 +38,30000000000027; -0,6214646197562064 +38,400000000000276; -0,6252538625206658 +38,50000000000027; -0,6282930091593801 +38,60000000000028; -0,6363282988050654 +38,70000000000027; -0,647795006655199 +38,80000000000027; -0,6532678889254493 +38,90000000000029; -0,6637907260937084 +39,000000000000284; -0,6758999438937496 +39,10000000000029; -0,6873655053183305 +39,20000000000029; -0,6986309986774679 +39,30000000000028; -0,7107055958390265 +39,400000000000304; -0,7254201729971008 +39,5000000000003; -0,7323946498012046 +39,60000000000028; -0,7354295412245531 +39,70000000000029; -0,738240122915133 +39,800000000000296; -0,7412458542787541 +39,90000000000029; -0,7439422094531198 +40,000000000000284; -0,7468492859587843 +40,10000000000029; -0,7530773914493136 +40,2000000000003; -0,7538260489823623 +40,30000000000031; -0,7565693286314858 +40,400000000000304; -0,7632099057175314 +40,5000000000003; -0,7688663003679701 +40,60000000000031; -0,7745983971104065 +40,700000000000315; -0,777688405527031 +40,80000000000031; -0,7796715902391593 +40,90000000000032; -0,7861121680270946 +41,00000000000031; -0,7865456210684432 +41,10000000000032; -0,7808961384734867 +41,200000000000315; -0,7813769754278108 +41,30000000000031; -0,775769692110321 +41,400000000000304; -0,7667742562264634 +41,50000000000033; -0,7604994085816577 +41,60000000000032; -0,7530801605665038 +41,700000000000315; -0,738696354290783 +41,800000000000324; -0,7215366045398133 +41,90000000000032; -0,7101538235174947 +42,00000000000033; -0,6992227445389081 +42,10000000000032; -0,6847257750162239 +42,20000000000033; -0,6730731059613335 +42,30000000000034; -0,6652507609178677 +42,40000000000032; -0,656323177910799 +42,50000000000031; -0,6476869230904962 +42,60000000000032; -0,6414092324004659 +42,70000000000033; -0,6384511714814352 +42,80000000000034; -0,6338478837476189 +42,90000000000035; -0,6284751216367215 +43,00000000000034; -0,6265787654232935 +43,10000000000035; -0,6267138238277892 +43,20000000000033; -0,6267385841194009 +43,300000000000324; -0,6266499084514816 +43,40000000000036; -0,6269147962018602 +43,500000000000355; -0,6259873091638757 +43,60000000000035; -0,622026308505431 +43,700000000000344; -0,616118992633023 +43,80000000000034; -0,6104969119897725 +43,90000000000036; -0,6034660250623549 +44,000000000000355; -0,6055035290770392 +44,100000000000364; -0,6125940944956292 +44,20000000000036; -0,6179826179596701 +44,30000000000038; -0,6238418788598432 +44,40000000000036; -0,629610999163674 +44,500000000000355; -0,6353952956439284 +44,60000000000035; -0,6411104708495645 +44,70000000000036; -0,6471066859868122 +44,80000000000035; -0,6523007053585443 +44,90000000000036; -0,659113781252795 +45,00000000000037; -0,6709568876122982 +45,100000000000364; -0,6790324898736007 +45,20000000000036; -0,6947471429267864 +45,30000000000035; -0,7099958420510597 +45,400000000000375; -0,7196176330590491 +45,500000000000384; -0,7278228018409854 +45,60000000000038; -0,7333107546828432 +45,70000000000037; -0,7362067669933672 +45,80000000000038; -0,7393561985194643 +45,900000000000404; -0,7403936420521555 +46,000000000000384; -0,7403141434099059 +46,100000000000364; -0,7397563323132483 +46,20000000000039; -0,7365927330692355 +46,300000000000395; -0,7336899029909714 +46,400000000000375; -0,7309493608255924 +46,500000000000384; -0,7275546327820712 +46,600000000000406; -0,7264480109558122 +46,7000000000004; -0,7257716441359721 +46,80000000000038; -0,7228666610251735 +46,900000000000375; -0,7230272982364845 +47,00000000000041; -0,7208278914848316 +47,10000000000039; -0,7156116125987739 +47,2000000000004; -0,7095291362175118 +47,30000000000038; -0,7041017146669608 +47,400000000000404; -0,6978041561159358 +47,500000000000426; -0,6889953746294304 +47,60000000000042; -0,6829129108993377 +47,700000000000415; -0,67768794414325 +47,800000000000395; -0,6702328189211695 +47,90000000000043; -0,6610339482117631 +48,00000000000041; -0,6528873100568653 +48,100000000000406; -0,647355911312387 +48,2000000000004; -0,6421235651437245 +48,30000000000044; -0,6309590708539279 +48,40000000000042; -0,6224044618876907 +48,50000000000041; -0,6177911169976245 +48,60000000000039; -0,6110958201596892 +48,70000000000043; -0,6022540893072503 +48,80000000000044; -0,5936716583538053 +48,90000000000042; -0,5843655628385083 +49,00000000000044; -0,57966420473727 +49,100000000000435; -0,577139613307708 +49,20000000000043; -0,5748292997782571 +49,30000000000042; -0,5751802443322203 +49,400000000000446; -0,5751817570161348 +49,500000000000426; -0,5748484004592238 +49,60000000000042; -0,5770142228943014 +49,700000000000415; -0,5799677490820985 +49,80000000000045; -0,5834546661986093 +49,900000000000446; -0,5899759242755698 +50,000000000000426; -0,5987406162531745 +50,100000000000435; -0,6073974008732415 +50,20000000000044; -0,616263332075532 +50,30000000000045; -0,6240988088064001 +50,400000000000446; -0,6353309146750039 +50,50000000000044; -0,6495612304652947 +50,60000000000045; -0,6610235738750183 +50,70000000000046; -0,6786724270500426 +50,80000000000044; -0,6908125909171354 +50,900000000000446; -0,7058980162788648 +51,00000000000044; -0,7219451182990304 +51,10000000000045; -0,7320983005915815 +51,20000000000046; -0,7442889240212605 +51,30000000000045; -0,7619506225640453 +51,40000000000046; -0,774204644236808 +51,50000000000047; -0,7872310418873729 +51,60000000000045; -0,8018331517555182 +51,70000000000046; -0,817093837073017 +51,800000000000466; -0,8344575046194316 +51,900000000000446; -0,8488041364954015 +52,000000000000455; -0,8632103136778109 +52,10000000000046; -0,8773894238232884 +52,20000000000047; -0,8932026232954535 +52,30000000000048; -0,9111493118777401 +52,400000000000446; -0,9279622617643688 +52,50000000000047; -0,9422724284722621 +52,60000000000046; -0,9587127532082977 +52,700000000000486; -0,9812793636936687 +52,80000000000051; -1,0019491228643647 +52,900000000000475; -1,0172815645422486 +53,0000000000005; -1,0317386040144685 +53,10000000000046; -1,0461241358316258 +53,200000000000514; -1,0577924071634226 +53,30000000000048; -1,0691436785848594 +53,400000000000475; -1,0805081290047638 +53,5000000000005; -1,083676818235408 +53,60000000000049; -1,0802169165177546 +53,700000000000514; -1,0806042224983967 +53,80000000000051; -1,077979671573663 +53,9000000000005; -1,0718197328122905 +54,0000000000005; -1,0691437235060897 +54,10000000000049; -1,0618742421029297 +54,20000000000046; -1,050973094989677 +54,30000000000054; -1,0455981117835687 +54,4000000000005; -1,0366400726466298 +54,50000000000047; -1,0329381663064021 +54,60000000000052; -1,0307044168684465 +54,700000000000514; -1,0271329050412645 +54,80000000000048; -1,0256105682432248 +54,900000000000475; -1,0252344856175086 +55,00000000000047; -1,0191737205756293 +55,10000000000052; -1,0106309833573377 +55,20000000000054; -1,001698133881129 +55,30000000000054; -0,9937729187339968 +55,40000000000053; -0,982926590891779 +55,500000000000554; -0,9679571760885874 +55,60000000000052; -0,953544645386847 +55,70000000000054; -0,9362767680731996 +55,80000000000051; -0,9191647036730708 +55,90000000000053; -0,8999911152240521 +56,000000000000526; -0,8798399081815376 +56,10000000000052; -0,8587389616492773 +56,20000000000054; -0,8357271392944421 +56,30000000000054; -0,818447124750477 +56,4000000000005; -0,7994320163463868 +56,500000000000526; -0,776200862320716 +56,60000000000052; -0,7555558446017634 +56,70000000000054; -0,7390569960831566 +56,80000000000054; -0,7214898658531688 +56,90000000000053; -0,7040693346532092 +57,000000000000554; -0,689383400066991 +57,10000000000052; -0,6748519222410865 +57,200000000000514; -0,6615747090327937 +57,30000000000054; -0,6510187399791243 +57,40000000000053; -0,638340689905704 +57,500000000000526; -0,6207066707501392 +57,60000000000055; -0,6093255704582421 +57,700000000000514; -0,5929045203985122 +57,800000000000566; -0,5788410051666188 +57,90000000000059; -0,56586154075121 +58,000000000000554; -0,548237468556672 +58,10000000000055; -0,5340650494507457 +58,20000000000054; -0,5169621426051338 +58,300000000000566; -0,4990743045282797 +58,40000000000056; -0,48360732524119676 +58,50000000000058; -0,46951121733844436 +58,60000000000058; -0,4549133586025311 +58,7000000000006; -0,4405595208739914 +58,800000000000566; -0,42864727026467664 +58,90000000000059; -0,42215637938553074 +59,000000000000554; -0,41654386002302823 +59,10000000000058; -0,41160182431695125 +59,20000000000054; -0,4099635525613481 +59,30000000000054; -0,4100406695411096 +59,40000000000059; -0,4098621690447679 +59,50000000000058; -0,4146207152693 +59,60000000000058; -0,4230700581024469 +59,70000000000057; -0,43123205134729936 +59,800000000000566; -0,4416389146574349 +59,90000000000056; -0,45671617034524026 +60,000000000000554; -0,4710890988854124 +60,10000000000055; -0,48546766163379473 +60,2000000000006; -0,5009348758812671 +60,300000000000594; -0,523787841086532 +60,40000000000062; -0,5495866771922215 +60,50000000000061; -0,5723942203220513 +60,60000000000058; -0,5987561614997818 +60,7000000000006; -0,6300204578858675 +60,800000000000594; -0,6648780571780075 +60,90000000000059; -0,697210668816397 +61,00000000000061; -0,7309684592710779 +61,10000000000058; -0,7692428602570374 +61,2000000000006; -0,8067202431776868 +61,300000000000594; -0,8445791860222251 +61,40000000000059; -0,8773886617798543 +61,50000000000061; -0,9076323064156946 +61,600000000000605; -0,9332564869281748 +61,7000000000006; -0,9568285602961906 +61,800000000000594; -0,9827123599383607 +61,90000000000062; -1,002783517016122 +62,00000000000061; -1,023032084184413 +62,10000000000058; -1,0415964219897575 +62,2000000000006; -1,0574550817595458 +62,30000000000062; -1,0706503954209126 +62,40000000000062; -1,0821330614721951 +62,50000000000061; -1,0937676419581082 +62,600000000000605; -1,100128385997345 +62,7000000000006; -1,1049348290588816 +62,800000000000594; -1,1133219038075697 +62,90000000000059; -1,1196977872727083 +63,00000000000058; -1,117672126444456 +63,100000000000634; -1,1116767412696968 +63,20000000000063; -1,1056902534490898 +63,30000000000065; -1,1009576464862434 +63,400000000000645; -1,0900665907948035 +63,50000000000061; -1,073961266872912 +63,600000000000634; -1,055355316504417 +63,70000000000063; -1,0317774889540443 +63,80000000000062; -1,0085825790842269 +63,900000000000645; -0,9860602275134878 +64,00000000000064; -0,9602508464271082 +64,10000000000063; -0,9367367753802456 +64,20000000000063; -0,9169122078220417 +64,30000000000062; -0,8970833732475718 +64,40000000000059; -0,8828317162716148 +64,50000000000061; -0,8676631021589958 +64,6000000000006; -0,8592574481558701 +64,70000000000057; -0,8542860873531986 +64,80000000000057; -0,8487639494235566 +64,90000000000059; -0,8467831957297212 +65,00000000000058; -0,8498011607029885 +65,10000000000058; -0,8581296073468727 +65,20000000000054; -0,8669586903394308 +65,30000000000057; -0,8759231985697031 +65,40000000000056; -0,8833767538315791 +65,50000000000053; -0,889262805777058 +65,60000000000052; -0,8981676758276569 +65,70000000000051; -0,9070596250761369 +65,80000000000054; -0,9136224031485805 +65,90000000000053; -0,9177808189424246 +66,00000000000053; -0,9191793100124541 +66,10000000000052; -0,9190398189832991 +66,20000000000051; -0,9189629363510967 +66,30000000000054; -0,9161877447637496 +66,40000000000053; -0,9126598107789179 +66,5000000000005; -0,9124569428777076 +66,60000000000049; -0,9101243393210798 +66,70000000000049; -0,9036239791606677 +66,80000000000051; -0,897904941865419 +66,90000000000047; -0,8919391620999577 +67,00000000000047; -0,8908299474146069 +67,10000000000046; -0,8937078434584604 +67,20000000000049; -0,8951239544353151 +67,30000000000045; -0,895142812238928 +67,40000000000047; -0,8945403279400317 +67,50000000000044; -0,888531317875934 +67,60000000000043; -0,8824577928297148 +67,70000000000043; -0,8775984914943762 +67,80000000000045; -0,8682526623533535 +67,90000000000042; -0,8570120631173936 +68,00000000000041; -0,8488447467995321 +68,1000000000004; -0,8401112322271351 +68,2000000000004; -0,8314936758167857 +68,3000000000004; -0,8224948907303946 +68,40000000000039; -0,815999363855866 +68,50000000000038; -0,8179867773273566 +68,60000000000038; -0,8230621608767588 +68,70000000000037; -0,8227739864300991 +68,80000000000034; -0,8308470506888699 +68,90000000000033; -0,8453339173915784 +69,00000000000033; -0,8578805997714505 +69,10000000000032; -0,8797823284370194 +69,20000000000034; -0,9078732948644146 +69,30000000000034; -0,9274511405959407 +69,40000000000033; -0,9536898949362098 +69,5000000000003; -0,9773583996487267 +69,60000000000032; -1,0004525202002994 +69,70000000000032; -1,02218321819745 +69,80000000000031; -1,042222710868073 +69,9000000000003; -1,0621564789491447 +70,0000000000003; -1,0793527210490201 +70,10000000000029; -1,0969115338914044 +70,20000000000029; -1,1120104109132414 +70,30000000000028; -1,1265868954040155 +70,40000000000028; -1,139801116860553 +70,50000000000027; -1,1516206782697473 +70,60000000000026; -1,1662346497085796 +70,70000000000026; -1,177736408067748 +70,80000000000028; -1,1914172149690274 +70,90000000000025; -1,2060265216032189 +71,00000000000027; -1,2210616111814194 +71,10000000000024; -1,2396815452807464 +71,20000000000023; -1,2597855067219808 +71,30000000000022; -1,2742809078710415 +71,40000000000022; -1,288804718581337 +71,50000000000021; -1,301416687329358 +71,60000000000018; -1,31289395594687 +71,70000000000017; -1,3237906663541223 +71,8000000000002; -1,3322203845126745 +71,90000000000019; -1,3385232143922363 +72,00000000000018; -1,3333556838069818 +72,10000000000018; -1,3314200240358987 +72,20000000000014; -1,3297566063446635 +72,30000000000017; -1,3223165435791002 +72,40000000000016; -1,3132429262637588 +72,50000000000016; -1,3015943724438221 +72,60000000000015; -1,2898857779716604 +72,70000000000014; -1,278836630270408 +72,80000000000014; -1,2653490815399704 +72,90000000000013; -1,2515569404107834 +73,0000000000001; -1,2404078893927815 +73,10000000000012; -1,2288012519919809 +73,20000000000009; -1,2173268270844089 +73,30000000000011; -1,2052778734248069 +73,40000000000008; -1,1960369514694218 +73,50000000000007; -1,185874288582887 +73,60000000000007; -1,1754182853974782 +73,70000000000006; -1,1698580375121295 +73,80000000000005; -1,1581444497289133 +73,90000000000005; -1,1506259497321296 +74,0000000000001; -1,147792372314146 +74,10000000000007; -1,1435663030811067 +74,20000000000009; -1,1377893547637026 +74,30000000000005; -1,1356568822453008 +74,40000000000005; -1,1385095032207802 +74,50000000000007; -1,1437312631169512 +74,60000000000007; -1,1518004806072475 +74,70000000000006; -1,1604366666523784 +74,80000000000003; -1,1768756934917008 +74,90000000000005; -1,2037395525931314 +75,00000000000004; -1,2264707051176287 +75,09999999999998; -1,2570114013092413 +75,2; -1,2917459722137727 +75,3; -1,32593022210841 +75,40000000000002; -1,3619722724973387 +75,50000000000001; -1,3990993551048438 +75,59999999999995; -1,4336190324905242 +75,69999999999997; -1,4741136158965475 +75,8; -1,5106920313577175 +75,89999999999996; -1,543060618231674 +75,99999999999993; -1,5741656807219568 +76,09999999999992; -1,6015084164541857 +76,19999999999995; -1,6242790669927851 +76,29999999999994; -1,647662820722724 +76,39999999999993; -1,666479675192451 +76,49999999999993; -1,6804743627249445 +76,59999999999992; -1,688407150295367 +76,69999999999992; -1,6949961022452023 +76,79999999999991; -1,7032024492117666 +76,89999999999988; -1,700298672973802 +76,99999999999987; -1,6947301601653235 +77,09999999999987; -1,687186071627476 +77,19999999999989; -1,6773301360896937 +77,29999999999988; -1,6640040250749681 +77,39999999999985; -1,645865533039121 +77,49999999999987; -1,6228558032203892 +77,59999999999984; -1,588634020451984 +77,69999999999986; -1,5564952702939832 +77,79999999999986; -1,5206409377031451 +77,89999999999985; -1,478919993408843 +77,99999999999987; -1,438820458225238 +78,09999999999984; -1,3951913098758526 +78,19999999999983; -1,342719040761652 +78,29999999999986; -1,2990780811254488 +78,39999999999982; -1,2613765100868615 +78,49999999999982; -1,2246734399299926 +78,59999999999981; -1,1907861675385054 +78,6999999999998; -1,159304497639389 +78,7999999999998; -1,1325931005825907 +78,89999999999979; -1,1165132013335057 +78,99999999999982; -1,118688492822494 +79,09999999999975; -1,1305398351313523 +79,19999999999978; -1,1420330750229057 +79,29999999999977; -1,1574517794970376 +79,39999999999974; -1,1806823361629388 +79,49999999999976; -1,203438652598455 +79,59999999999975; -1,2303294912764353 +79,69999999999975; -1,260011424860516 +79,79999999999974; -1,2884537558304183 +79,89999999999974; -1,3177330269050702 +79,99999999999973; -1,3496131519296108 +80,09999999999972; -1,3795487819267085 +80,19999999999972; -1,4032003639082617 +80,29999999999971; -1,4289732112459106 +80,39999999999974; -1,4585614554610031 +80,4999999999997; -1,4875452863193668 +80,59999999999967; -1,5163988140457123 +80,69999999999966; -1,5391825669722432 +80,79999999999968; -1,5683447057937023 +80,89999999999968; -1,6028884278602407 +80,99999999999967; -1,6373191188897023 +81,09999999999964; -1,6724920108939312 +81,19999999999966; -1,7102866459380133 +81,29999999999966; -1,748061532478296 +81,39999999999962; -1,783067611105115 +81,49999999999964; -1,817973468185473 +81,59999999999961; -1,8510768812212053 +81,69999999999963; -1,8833377583320976 +81,79999999999963; -1,9141509329387656 +81,89999999999962; -1,933841884335303 +81,99999999999962; -1,960350829649359 +82,09999999999961; -1,9765733010086803 +82,1999999999996; -1,9882988817328133 +82,2999999999996; -2,0019198424484985 +82,39999999999962; -2,0099305674614607 +82,49999999999959; -2,01876926244079 +82,59999999999958; -2,0225670134617504 +82,69999999999958; -2,0235567372790637 +82,79999999999954; -2,032903391567067 +82,89999999999957; -2,0484657631661625 +82,99999999999956; -2,0630606117248353 +83,09999999999953; -2,083688392646671 +83,19999999999952; -2,1124498788505797 +83,29999999999954; -2,139262419961831 +83,39999999999954; -2,1659783428358823 +83,4999999999995; -2,1970484413430817 +83,59999999999953; -2,233360837515405 +83,69999999999952; -2,2706330043469256 +83,79999999999951; -2,2971070056166916 +83,89999999999951; -2,320291456037908 +83,9999999999995; -2,3424384996610703 +84,0999999999995; -2,359406948608001 +84,19999999999949; -2,374140912744762 +84,29999999999949; -2,3876468090142025 +84,39999999999948; -2,385102479201054 +84,49999999999945; -2,372684029210985 +84,59999999999944; -2,3511976046936507 +84,69999999999946; -2,329465434267588 +84,79999999999946; -2,3078873500009562 +84,89999999999945; -2,2816512932238044 +84,99999999999942; -2,258826711670981 +85,09999999999941; -2,2306257033598262 +85,19999999999943; -2,201271964629403 +85,29999999999943; -2,1725603835068465 +85,39999999999942; -2,1436954545895937 +85,49999999999939; -2,1146866724709303 +85,59999999999941; -2,085817578473712 +85,69999999999943; -2,05989532434581 +85,79999999999943; -2,0318303938471525 +85,89999999999942; -2,0025825075950587 +85,99999999999936; -1,9738457565388723 +86,09999999999938; -1,9448836974741583 +86,1999999999994; -1,916041894556626 +86,29999999999937; -1,8874163402002768 +86,39999999999934; -1,8557992502249245 +86,49999999999936; -1,8257058968798416 +86,59999999999935; -1,796933830615103 +86,69999999999935; -1,7686921472551305 +86,79999999999934; -1,7428836447427747 +86,89999999999934; -1,716637819568465 +86,9999999999993; -1,6953450931126932 +87,0999999999993; -1,6772650042310762 +87,19999999999929; -1,6612739555156733 +87,29999999999932; -1,6476701761066481 +87,39999999999931; -1,636779760613428 +87,4999999999993; -1,6310031950712753 +87,5999999999993; -1,6306952882747243 +87,69999999999929; -1,6296490412148188 +87,79999999999929; -1,623162578368916 +87,89999999999925; -1,6141992652398605 +87,99999999999928; -1,605160017977151 +88,09999999999924; -1,5934449575943912 +88,19999999999926; -1,5826336432590948 +88,29999999999926; -1,5641730406855068 +88,39999999999925; -1,54401612806193 +88,49999999999925; -1,521111428499995 +88,59999999999921; -1,4905345414342466 +88,69999999999924; -1,4587709843550791 +88,7999999999992; -1,427270699441105 +88,8999999999992; -1,392693893276998 +88,99999999999922; -1,3600250182653046 +89,09999999999921; -1,327228024506975 +89,1999999999992; -1,2926415941061875 +89,29999999999917; -1,2613545096153804 +89,39999999999922; -1,2323219596172095 +89,49999999999919; -1,2060748030426955 +89,59999999999918; -1,1799183145177454 +89,69999999999918; -1,1552051222068833 +89,79999999999917; -1,132539950418245 +89,89999999999917; -1,1092679340788982 +89,99999999999916; -1,0860891085895505 +90,09999999999918; -1,065647849500576 +90,19999999999915; -1,0453407479989405 +90,29999999999914; -1,026310485417251 +90,39999999999914; -1,0101112952945672 +90,49999999999913; -0,9962518125252946 +90,59999999999913; -0,9848194489090196 +90,69999999999912; -0,9755935074862716 +90,79999999999912; -0,9719637044295659 +90,89999999999911; -0,9814892470179251 +90,9999999999991; -1,0046857309929602 +91,0999999999991; -1,0351246429154388 +91,1999999999991; -1,0703036898398022 +91,29999999999909; -1,1132741607014798 +91,39999999999908; -1,1587760539457679 +91,49999999999908; -1,2081398881310408 +91,59999999999907; -1,2625609468652685 +91,69999999999906; -1,3163283492618945 +91,79999999999903; -1,3648399964465252 +91,89999999999903; -1,4114498133519815 +91,99999999999905; -1,450518638838008 +92,09999999999901; -1,485395020054968 +92,19999999999904; -1,5199283918939615 +92,29999999999903; -1,5479662159262904 +92,39999999999903; -1,5674027169782572 +92,49999999999899; -1,588007755516637 +92,59999999999899; -1,5980318430039429 +92,69999999999898; -1,6054235558964 +92,799999999999; -1,615831626056111 +92,89999999999897; -1,6204457382961728 +92,99999999999896; -1,6166777341887713 +93,09999999999899; -1,6169715086306136 +93,19999999999895; -1,6173984318839443 +93,29999999999897; -1,6147276847401653 +93,39999999999897; -1,6132602455600376 +93,49999999999896; -1,6136768579109235 +93,59999999999899; -1,6136049215368153 +93,69999999999892; -1,6135981526568468 +93,79999999999895; -1,6133759810718082 +93,89999999999894; -1,6158291143055798 +93,99999999999893; -1,6185575636301355 +94,09999999999893; -1,6227697085367785 +94,19999999999895; -1,6284534724119677 +94,29999999999892; -1,630823851221531 +94,39999999999891; -1,6307785993898154 +94,4999999999989; -1,6310988650039002 +94,5999999999989; -1,6289008689820523 +94,6999999999989; -1,6268273611386332 +94,79999999999889; -1,6278209169914586 +94,89999999999888; -1,631268955528891 +94,99999999999885; -1,6398436928995848 +95,09999999999887; -1,6545353103965557 +95,19999999999884; -1,6652812412966531 +95,29999999999883; -1,684318868483511 +95,39999999999885; -1,7112233491545705 +95,49999999999885; -1,7385635721912314 +95,59999999999881; -1,7767380772564758 +95,69999999999884; -1,8109434565085394 +95,79999999999883; -1,8524446017108671 +95,89999999999883; -1,8943261671018687 +95,99999999999882; -1,9365722581555431 +96,09999999999881; -1,9828616907810588 +96,19999999999878; -2,0226103310651675 +96,29999999999878; -2,057439264761501 +96,3999999999988; -2,090582393152425 +96,49999999999879; -2,1168787205792317 +96,59999999999879; -2,1386248657910416 +96,69999999999875; -2,156860437275869 +96,79999999999875; -2,1676365196323273 +96,89999999999874; -2,1767067861562808 +96,99999999999874; -2,178404765969611 +97,09999999999876; -2,1752698152685177 +97,19999999999878; -2,174140984039611 +97,29999999999878; -2,1733287650088444 +97,39999999999874; -2,1706606321852844 +97,49999999999874; -2,1737385398726543 +97,59999999999873; -2,1764397717605615 +97,69999999999872; -2,1816611021908106 +97,79999999999875; -2,186205349417878 +97,89999999999871; -2,1889462409603517 +97,99999999999874; -2,1961716132420888 +98,0999999999987; -2,2079740371532894 +98,19999999999872; -2,214007233843928 +98,29999999999869; -2,2205776963565746 +98,39999999999868; -2,221070112995535 +98,49999999999868; -2,2186809985850235 +98,5999999999987; -2,218153820750258 +98,69999999999867; -2,2119584708070157 +98,79999999999866; -2,208839713969043 +98,89999999999866; -2,2065363476178668 +98,99999999999862; -2,201745466652369 +99,09999999999862; -2,1956646701634517 +99,19999999999864; -2,189971279875321 +99,29999999999863; -2,184179892867954 +99,39999999999863; -2,178404537651736 +99,49999999999862; -2,1726210668925603 +99,59999999999862; -2,1668815336753013 +99,69999999999858; -2,160986446496663 +99,7999999999986; -2,155495884268638 +99,8999999999986; -2,1493190144133028 +99,9999999999986; -2,1404332045418544 +100,09999999999859; -2,1350570324798666 +100,19999999999858; -2,1244730732193533 +100,29999999999855; -2,115902572509161 +100,39999999999857; -2,109034751424532 +100,49999999999856; -2,0970129924279846 +100,59999999999853; -2,0885774099582957 +100,69999999999852; -2,0800603506595285 +100,79999999999855; -2,071052671257786 +100,89999999999851; -2,0637189756256387 +100,99999999999854; -2,0593310836469554 +101,09999999999853; -2,056704860728714 +101,19999999999852; -2,053772256555951 +101,29999999999855; -2,0508058702919927 +101,39999999999851; -2,048358515234349 +101,49999999999854; -2,0433521127323626 +101,5999999999985; -2,0383764729286584 +101,6999999999985; -2,0360348288230385 +101,79999999999849; -2,032963767647235 +101,89999999999849; -2,027436675538689 +101,99999999999848; -2,0185669389304657 +102,09999999999845; -2,012521872467655 +102,19999999999847; -2,003967964415403 +102,29999999999849; -1,9928259487838398 +102,39999999999846; -1,9839533176884228 +102,49999999999845; -1,969195516664204 +102,59999999999845; -1,9580019040260188 +102,69999999999844; -1,9413543937164768 +102,79999999999843; -1,9285112817519563 +102,89999999999843; -1,91894816509995 +102,9999999999984; -1,9042839966663214 +103,09999999999842; -1,8959717494168258 +103,19999999999841; -1,887971881611957 +103,2999999999984; -1,874900674467229 +103,3999999999984; -1,8591966334154852 +103,4999999999984; -1,8390296977129053 +103,59999999999836; -1,816416558032926 +103,69999999999838; -1,7961809973974328 +103,79999999999838; -1,7643385698743375 +103,89999999999837; -1,7373932252764428 +103,99999999999837; -1,7081592059685162 +104,09999999999836; -1,6771637072130057 +104,19999999999835; -1,6475956667198028 +104,29999999999832; -1,6123982786246192 +104,39999999999831; -1,5779263546653302 +104,49999999999831; -1,540616093854335 +104,59999999999833; -1,5045370589077192 +104,6999999999983; -1,4710261703071819 +104,79999999999832; -1,4410437635392759 +104,89999999999834; -1,4155108948088526 +104,99999999999831; -1,3894179579702532 +105,0999999999983; -1,3656396532196742 +105,19999999999833; -1,3455264760135281 +105,29999999999832; -1,334548236577068 +105,39999999999829; -1,337610654635713 +105,49999999999828; -1,3506215525486138 +105,59999999999827; -1,3650366830974967 +105,69999999999827; -1,3821064192277515 +105,79999999999826; -1,3998089612510873 +105,89999999999826; -1,416375145736875 +105,99999999999825; -1,4358115990716085 +106,09999999999825; -1,4595426653806274 +106,19999999999827; -1,4792654129862144 +106,29999999999824; -1,4906977400532533 +106,39999999999823; -1,5054052958766135 +106,49999999999822; -1,5138465750868955 +106,59999999999822; -1,5133052602907426 +106,69999999999821; -1,5149338380211184 +106,7999999999982; -1,5208638322175716 +106,89999999999817; -1,5209316337769199 +106,9999999999982; -1,5206750749365576 +107,09999999999819; -1,52066049612383 +107,19999999999816; -1,521351179033736 +107,29999999999818; -1,5260415224450639 +107,39999999999817; -1,5352875229675504 +107,49999999999817; -1,546637951363584 +107,59999999999816; -1,5636081256329497 +107,69999999999816; -1,5794607743097657 +107,79999999999812; -1,592858530925617 +107,89999999999814; -1,6090312300114382 +107,99999999999814; -1,6301473763699565 +108,0999999999981; -1,6532960232598048 +108,19999999999813; -1,6770038108788619 +108,2999999999981; -1,6955404804299077 +108,39999999999812; -1,7129732151549018 +108,49999999999808; -1,7284261192051904 +108,59999999999808; -1,7392866436962082 +108,69999999999813; -1,7509344403521405 +108,7999999999981; -1,760424500764037 +108,89999999999809; -1,761933777474729 +108,99999999999808; -1,7614518079982 +109,0999999999981; -1,7608525513017854 +109,1999999999981; -1,7568436190807342 +109,29999999999806; -1,7509922152785071 +109,39999999999806; -1,7455719746082625 +109,49999999999805; -1,7347978903678571 +109,59999999999808; -1,7245114554564243 diff --git a/Functions/Theory/Dissertation/PD/100ghz_pd_responsivity.csv b/Functions/Theory/Dissertation/PD/100ghz_pd_responsivity.csv new file mode 100644 index 0000000..6e9dd10 --- /dev/null +++ b/Functions/Theory/Dissertation/PD/100ghz_pd_responsivity.csv @@ -0,0 +1,189 @@ +1271; 0,3822390561953123 +1271,5; 0,38419930758242105 +1272; 0,3863702270698115 +1272,5; 0,38866381361008207 +1273; 0,3879395121421424 +1273,5; 0,3908144071258651 +1274; 0,38941324484667683 +1274,5; 0,3886482390643653 +1275; 0,3871744844466787 +1275,5; 0,3819131706099883 +1276; 0,3825696588771148 +1276,5; 0,38164278490690173 +1277; 0,3793811681135283 +1277,5; 0,3810969321121832 +1278; 0,38561783928242943 +1278,5; 0,38908016962932246 +1279; 0,3960805723111348 +1279,5; 0,39776514973186317 +1280; 0,3983882080762364 +1280,5; 0,3989277489532531 +1281; 0,3953941895319796 +1281,5; 0,39648781234375075 +1282; 0,3966742531971841 +1282,5; 0,4002652938704556 +1283; 0,40694867274287283 +1283,5; 0,41253621540584107 +1284; 0,42331258033724095 +1284,5; 0,43077624043193397 +1285; 0,4393232961230962 +1285,5; 0,44562110387213405 +1286; 0,4486108628977331 +1286,5; 0,4511055411347422 +1287; 0,4470620968166301 +1287,5; 0,4429754327671611 +1288; 0,4369760292430348 +1288,5; 0,4313232143283202 +1289; 0,4297225921323986 +1289,5; 0,42752981686391456 +1290; 0,42755873451486015 +1290,5; 0,42838607683209784 +1291; 0,4301647938813945 +1291,5; 0,430252773791754 +1292; 0,42983642955282675 +1292,5; 0,43082456782130385 +1293; 0,43010358194135434 +1293,5; 0,4286564203011507 +1294; 0,427551350387675 +1294,5; 0,4262216680056993 +1295; 0,4248061879636029 +1295,5; 0,42323824957412115 +1296; 0,42606502803639024 +1296,5; 0,42771450181627213 +1297; 0,4321631047010831 +1297,5; 0,43498514011363654 +1298; 0,43784261304613636 +1298,5; 0,4407749972159394 +1299; 0,4418422146980885 +1299,5; 0,44599734720216344 +1300; 0,44682291369874283 +1300,5; 0,44591438239702175 +1301; 0,4467439544276042 +1301,5; 0,4476723529309602 +1302; 0,44945964164622887 +1302,5; 0,451298649370644 +1303; 0,4555133819899133 +1303,5; 0,45932593779132214 +1304; 0,4641282326427819 +1304,5; 0,4660504121662704 +1305; 0,4672659916854359 +1305,5; 0,46826040808978875 +1306; 0,4672565627341473 +1306,5; 0,46494462666243797 +1307; 0,4614228682537902 +1307,5; 0,4594403315234107 +1308; 0,4567366055619595 +1308,5; 0,4543323943556662 +1309; 0,4531865329043713 +1309,5; 0,4531463334993213 +1310; 0,4549753124500232 +1310,5; 0,4563928182609638 +1311; 0,45807413408326114 +1311,5; 0,46008646903182826 +1312; 0,4625724677767604 +1312,5; 0,4642585362150724 +1313; 0,46443821082811676 +1313,5; 0,46431357981151344 +1314; 0,46266595309664715 +1314,5; 0,4634382042743632 +1315; 0,46336655819789074 +1315,5; 0,46220084770212755 +1316; 0,4621345192553813 +1316,5; 0,4619581088515051 +1317; 0,4622449432593938 +1317,5; 0,4634433901557192 +1318; 0,46570049058443497 +1318,5; 0,46746148714378144 +1319; 0,47051648811702607 +1319,5; 0,4736426053778652 +1320; 0,4752061192279773 +1320,5; 0,47672990706900487 +1321; 0,4792517016402914 +1321,5; 0,4804619217778243 +1322; 0,48045944968999643 +1322,5; 0,48044446341935276 +1323; 0,48033475585370833 +1323,5; 0,48149717921878865 +1324; 0,4825722899403748 +1324,5; 0,4815908698039817 +1325; 0,47971434550698255 +1325,5; 0,47939560128213987 +1326; 0,47928833048577313 +1326,5; 0,4780400467999897 +1327; 0,47648974188994153 +1327,5; 0,47504778426945493 +1328; 0,4767823647690562 +1328,5; 0,4796497575996306 +1329; 0,48149796255153543 +1329,5; 0,48293054311361827 +1330; 0,48577046817752123 +1330,5; 0,4879484457550308 +1331; 0,4890100791953129 +1331,5; 0,49009094527466934 +1332; 0,49064503921138825 +1332,5; 0,4912120163422964 +1333; 0,49112778494545795 +1333,5; 0,49082017761106833 +1334; 0,4891140575382411 +1334,5; 0,48897830241499407 +1335; 0,49041975188209885 +1335,5; 0,49289447360952865 +1336; 0,4941116428265213 +1336,5; 0,49433827868707936 +1337; 0,49545156946075475 +1337,5; 0,4964012858510567 +1338; 0,4976037918135337 +1338,5; 0,4975359556660308 +1339; 0,49750995144010873 +1339,5; 0,4979126497053521 +1340; 0,497475232138574 +1340,5; 0,49759401707965406 +1341; 0,4969075828334858 +1341,5; 0,49790859550840155 +1342; 0,4995926776094223 +1342,5; 0,5020720343160757 +1343; 0,5055918669106463 +1343,5; 0,5084877122557891 +1344; 0,5109238856077332 +1344,5; 0,5133476480224053 +1345; 0,5141099804906323 +1345,5; 0,5128794457064829 +1346; 0,5123127905211531 +1346,5; 0,5113593533744085 +1347; 0,5104375198088649 +1347,5; 0,5085465423276292 +1348; 0,5051624771364174 +1348,5; 0,5027410542553522 +1349; 0,5024260057256427 +1349,5; 0,5006762680057522 +1350; 0,4993251970666754 +1350,5; 0,49851742723413256 +1351; 0,4997497443709538 +1351,5; 0,5007398590455319 +1352; 0,5007983935913018 +1352,5; 0,49955251820707475 +1353; 0,4995544623158038 +1353,5; 0,5007503896118954 +1354; 0,500737054751544 +1354,5; 0,5007708386435341 +1355; 0,49980743334640554 +1355,5; 0,49964682618339445 +1356; 0,5007641635781113 +1356,5; 0,5010692724813779 +1357; 0,5017795860327432 +1357,5; 0,5018051896000885 +1358; 0,5018027877181053 +1358,5; 0,5024950398138555 +1359; 0,5037205512345401 +1359,5; 0,503981020991427 +1360; 0,50290329982148 +1360,5; 0,5017820667010949 +1361; 0,5029651424174117 +1361,5; 0,5021824944534237 +1362; 0,5007892395452416 +1362,5; 0,4997500743708827 +1363; 0,5006844796799776 +1363,5; 0,5020955167671433 +1364; 0,5059166193037108 +1364,5; 0,5043160514940865 +1365; 0,4996516521717823 diff --git a/Functions/Theory/Dissertation/PD/70ghz_pd.json b/Functions/Theory/Dissertation/PD/70ghz_pd.json new file mode 100644 index 0000000..a105f06 --- /dev/null +++ b/Functions/Theory/Dissertation/PD/70ghz_pd.json @@ -0,0 +1 @@ +{"version":[4,2],"axesColl":[{"name":"XY","page":2,"type":"XYAxes","isLogX":false,"isLogY":false,"noRotation":false,"calibrationPoints":[{"px":672.9764453961457,"py":935.4603854389723,"dx":"1280","dy":"0","dz":null},{"px":1031.4346895074948,"py":935.4603854389723,"dx":"1360","dy":"0","dz":null},{"px":629.0364025695932,"py":935.4603854389723,"dx":"1280","dy":"0","dz":null},{"px":629.0364025695932,"py":283.2976445396146,"dx":"1360","dy":"0,7","dz":null}]},{"name":"XY 2","page":6,"type":"XYAxes","isLogX":false,"isLogY":false,"noRotation":false,"calibrationPoints":[{"px":634.8179871520343,"py":935.4603854389723,"dx":"0","dy":"-4","dz":null},{"px":1555.2462526766599,"py":933.1477516059957,"dx":"70","dy":"-4","dz":null},{"px":632.5053533190579,"py":934.304068522484,"dx":"0","dy":"-4","dz":null},{"px":634.8179871520343,"py":356.1456102783726,"dx":"70","dy":"0","dz":null}]}],"datasetColl":[{"name":"Default Dataset","axesName":"XY","colorRGB":[200,0,0,255],"metadataKeys":[],"page":2,"data":[{"x":633,"y":440.75,"value":[1271.0781362007167,0]},{"x":632.5,"y":444,"value":[1270.9665471923536,0]},{"x":634,"y":437,"value":[1271.3013142174432,0]},{"x":635,"y":433.75,"value":[1271.5244922341694,0]},{"x":636,"y":429.75,"value":[1271.747670250896,0]},{"x":637,"y":426,"value":[1271.9708482676224,0]},{"x":638.5,"y":423.1666666666667,"value":[1272.305615292712,0]},{"x":641.5,"y":424.5,"value":[1272.9751493428912,0]},{"x":644,"y":425.75,"value":[1273.5330943847073,0]},{"x":645,"y":428.5,"value":[1273.7562724014335,0]},{"x":645.5,"y":432.5,"value":[1273.867861409797,0]},{"x":646.5,"y":434.5,"value":[1274.0910394265231,0]},{"x":647.5,"y":438.1666666666667,"value":[1274.3142174432496,0]},{"x":650,"y":440.75,"value":[1274.8721624850657,0]},{"x":652.5,"y":444.8333333333333,"value":[1275.4301075268816,0]},{"x":655.5,"y":444,"value":[1276.0996415770608,0]},{"x":658.5,"y":442,"value":[1276.76917562724,0]},{"x":661.5,"y":441.1666666666667,"value":[1277.4387096774192,0]},{"x":664.5,"y":439.3333333333333,"value":[1278.1082437275984,0]},{"x":667.5,"y":437,"value":[1278.7777777777776,0]},{"x":670.5,"y":437.5,"value":[1279.4473118279568,0]},{"x":673.5,"y":437.1666666666667,"value":[1280.116845878136,0]},{"x":676,"y":435.25,"value":[1280.674790919952,0]},{"x":678,"y":431.5,"value":[1281.1211469534048,0]},{"x":680,"y":428.75,"value":[1281.5675029868578,0]},{"x":681,"y":426.25,"value":[1281.790681003584,0]},{"x":682.1666666666666,"y":422.8333333333333,"value":[1282.0510553564316,0]},{"x":684.5,"y":418.6666666666667,"value":[1282.5718040621266,0]},{"x":687.5,"y":418.8333333333333,"value":[1283.2413381123058,0]},{"x":690.5,"y":419.8333333333333,"value":[1283.910872162485,0]},{"x":693.5,"y":424,"value":[1284.5804062126642,0]},{"x":696,"y":427.25,"value":[1285.13835125448,0]},{"x":698.5,"y":430,"value":[1285.6962962962962,0]},{"x":701,"y":430.25,"value":[1286.2542413381123,0]},{"x":703.5,"y":426.8333333333333,"value":[1286.8121863799283,0]},{"x":706,"y":423.5,"value":[1287.3701314217442,0]},{"x":707.8333333333334,"y":419.8333333333333,"value":[1287.7792911190759,0]},{"x":709,"y":415.75,"value":[1288.0396654719234,0]},{"x":710,"y":412.25,"value":[1288.2628434886499,0]},{"x":711,"y":408.75,"value":[1288.4860215053764,0]},{"x":712.1666666666666,"y":404.8333333333333,"value":[1288.7463958582237,0]},{"x":714,"y":400.5,"value":[1289.1555555555556,0]},{"x":716.5,"y":396.5,"value":[1289.7135005973714,0]},{"x":719.5,"y":396.8333333333333,"value":[1290.3830346475506,0]},{"x":722,"y":399.5,"value":[1290.9409796893667,0]},{"x":723,"y":403.75,"value":[1291.1641577060932,0]},{"x":724,"y":407,"value":[1291.3873357228194,0]},{"x":725,"y":410,"value":[1291.610513739546,0]},{"x":726.5,"y":413.1666666666667,"value":[1291.9452807646355,0]},{"x":729,"y":417.5,"value":[1292.5032258064516,0]},{"x":731.5,"y":418.6666666666667,"value":[1293.0611708482675,0]},{"x":734.5,"y":416.5,"value":[1293.7307048984467,0]},{"x":737,"y":415,"value":[1294.2886499402628,0]},{"x":739.5,"y":412,"value":[1294.8465949820788,0]},{"x":742,"y":409.5,"value":[1295.4045400238947,0]},{"x":744.5,"y":407,"value":[1295.9624850657108,0]},{"x":747.5,"y":407,"value":[1296.63201911589,0]},{"x":750.5,"y":408.6666666666667,"value":[1297.3015531660692,0]},{"x":753.5,"y":411.1666666666667,"value":[1297.9710872162484,0]},{"x":756.5,"y":412.3333333333333,"value":[1298.6406212664276,0]},{"x":759.5,"y":411.3333333333333,"value":[1299.3101553166068,0]},{"x":762.5,"y":410,"value":[1299.979689366786,0]},{"x":765.5,"y":408.5,"value":[1300.6492234169652,0]},{"x":768.5,"y":408.5,"value":[1301.3187574671445,0]},{"x":771.5,"y":408.8333333333333,"value":[1301.9882915173237,0]},{"x":774.5,"y":412,"value":[1302.6578255675029,0]},{"x":777.5,"y":415.1666666666667,"value":[1303.327359617682,0]},{"x":780.5,"y":417.1666666666667,"value":[1303.9968936678613,0]},{"x":783.5,"y":419,"value":[1304.6664277180405,0]},{"x":786.5,"y":419.3333333333333,"value":[1305.3359617682197,0]},{"x":789,"y":417.5,"value":[1305.8939068100358,0]},{"x":791,"y":414.75,"value":[1306.3402628434885,0]},{"x":793,"y":411.5,"value":[1306.7866188769412,0]},{"x":795,"y":408.5,"value":[1307.2329749103942,0]},{"x":797,"y":405,"value":[1307.679330943847,0]},{"x":799.5,"y":402.3333333333333,"value":[1308.237275985663,0]},{"x":802.5,"y":403.1666666666667,"value":[1308.9068100358422,0]},{"x":805,"y":405.25,"value":[1309.464755077658,0]},{"x":807,"y":408.25,"value":[1309.911111111111,0]},{"x":809,"y":410.5,"value":[1310.3574671445638,0]},{"x":811,"y":413.25,"value":[1310.8038231780165,0]},{"x":813.5,"y":415.6666666666667,"value":[1311.3617682198326,0]},{"x":816.5,"y":415.3333333333333,"value":[1312.0313022700118,0]},{"x":819.5,"y":413.3333333333333,"value":[1312.700836320191,0]},{"x":822.5,"y":411.1666666666667,"value":[1313.3703703703702,0]},{"x":825,"y":409.5,"value":[1313.9283154121863,0]},{"x":827,"y":406.75,"value":[1314.374671445639,0]},{"x":830.5,"y":404,"value":[1315.1557945041816,0]},{"x":833.5,"y":403.6666666666667,"value":[1315.8253285543608,0]},{"x":836.5,"y":403,"value":[1316.49486260454,0]},{"x":839.5,"y":402.3333333333333,"value":[1317.1643966547192,0]},{"x":842.5,"y":401.8333333333333,"value":[1317.8339307048984,0]},{"x":845.5,"y":403,"value":[1318.5034647550776,0]},{"x":848.5,"y":403.3333333333333,"value":[1319.1729988052568,0]},{"x":851.5,"y":405,"value":[1319.842532855436,0]},{"x":854.5,"y":405,"value":[1320.5120669056153,0]},{"x":857.5,"y":405.6666666666667,"value":[1321.1816009557945,0]},{"x":860.5,"y":406.3333333333333,"value":[1321.8511350059737,0]},{"x":863.5,"y":409,"value":[1322.5206690561529,0]},{"x":866.5,"y":409.5,"value":[1323.190203106332,0]},{"x":869.5,"y":408,"value":[1323.8597371565113,0]},{"x":872.5,"y":406,"value":[1324.5292712066905,0]},{"x":875,"y":403.25,"value":[1325.0872162485064,0]},{"x":877.5,"y":400,"value":[1325.6451612903224,0]},{"x":880,"y":397,"value":[1326.2031063321385,0]},{"x":882.5,"y":394,"value":[1326.7610513739544,0]},{"x":885.5,"y":392,"value":[1327.4305854241336,0]},{"x":888.5,"y":389.3333333333333,"value":[1328.100119474313,0]},{"x":891.5,"y":389.6666666666667,"value":[1328.7696535244922,0]},{"x":894.5,"y":392,"value":[1329.4391875746715,0]},{"x":897.5,"y":393,"value":[1330.1087216248507,0]},{"x":900.5,"y":392,"value":[1330.7782556750299,0]},{"x":903.5,"y":392,"value":[1331.447789725209,0]},{"x":906.5,"y":391,"value":[1332.1173237753883,0]},{"x":909.5,"y":388.6666666666667,"value":[1332.7868578255675,0]},{"x":912.5,"y":388,"value":[1333.4563918757467,0]},{"x":915.5,"y":387.3333333333333,"value":[1334.125925925926,0]},{"x":918.5,"y":386.1666666666667,"value":[1334.7954599761051,0]},{"x":921.5,"y":385.6666666666667,"value":[1335.4649940262843,0]},{"x":924.5,"y":387.3333333333333,"value":[1336.1345280764635,0]},{"x":927.5,"y":388.6666666666667,"value":[1336.8040621266427,0]},{"x":930.5,"y":391,"value":[1337.473596176822,0]},{"x":933.5,"y":394,"value":[1338.1431302270012,0]},{"x":936.5,"y":395,"value":[1338.8126642771804,0]},{"x":939.5,"y":394.3333333333333,"value":[1339.4821983273596,0]},{"x":942.5,"y":392.1666666666667,"value":[1340.1517323775388,0]},{"x":945.5,"y":390.5,"value":[1340.821266427718,0]},{"x":948,"y":388.25,"value":[1341.3792114695339,0]},{"x":950.5,"y":385.5,"value":[1341.93715651135,0]},{"x":953.5,"y":384,"value":[1342.6066905615291,0]},{"x":956.5,"y":384,"value":[1343.2762246117084,0]},{"x":959.5,"y":383,"value":[1343.9457586618876,0]},{"x":962.5,"y":382.3333333333333,"value":[1344.6152927120668,0]},{"x":965.5,"y":381.6666666666667,"value":[1345.284826762246,0]},{"x":968.5,"y":380,"value":[1345.9543608124252,0]},{"x":971.5,"y":377,"value":[1346.6238948626044,0]},{"x":973.5,"y":376,"value":[1347.0702508960571,0]},{"x":977.5,"y":376.6666666666667,"value":[1347.9629629629628,0]},{"x":980.5,"y":375.3333333333333,"value":[1348.632497013142,0]},{"x":983.5,"y":373.3333333333333,"value":[1349.3020310633212,0]},{"x":986.5,"y":373.3333333333333,"value":[1349.9715651135004,0]},{"x":989.5,"y":373,"value":[1350.6410991636797,0]},{"x":992.5,"y":371,"value":[1351.3106332138589,0]},{"x":995.5,"y":369.1666666666667,"value":[1351.980167264038,0]},{"x":998.5,"y":367.6666666666667,"value":[1352.6497013142173,0]},{"x":1001.5,"y":366,"value":[1353.3192353643965,0]},{"x":1004.5,"y":365,"value":[1353.9887694145757,0]},{"x":1007.5,"y":365,"value":[1354.658303464755,0]},{"x":1010.5,"y":363.8333333333333,"value":[1355.3278375149341,0]},{"x":1013,"y":360.75,"value":[1355.8857825567502,0]},{"x":1015,"y":357.25,"value":[1356.332138590203,0]},{"x":1017.5,"y":354,"value":[1356.890083632019,0]},{"x":1020.5,"y":352,"value":[1357.5596176821982,0]},{"x":1023.5,"y":353.3333333333333,"value":[1358.2291517323774,0]},{"x":1026.5,"y":355,"value":[1358.8986857825566,0]},{"x":1029,"y":358,"value":[1359.4566308243727,0]},{"x":1031.5,"y":360.5,"value":[1360.0145758661886,0]},{"x":1034.5,"y":360.3333333333333,"value":[1360.6841099163678,0]},{"x":1037.5,"y":360,"value":[1361.353643966547,0]},{"x":1040.5,"y":359.1666666666667,"value":[1362.0231780167262,0]},{"x":1043.5,"y":358.5,"value":[1362.6927120669054,0]},{"x":1045.5,"y":355.5,"value":[1363.1390681003584,0]},{"x":1047.5,"y":352,"value":[1363.585424133811,0]},{"x":1050.5,"y":350,"value":[1364.2549581839903,0]},{"x":1053,"y":348.5,"value":[1364.8129032258064,0]}],"autoDetectionData":{"fgColor":[0,0,255],"bgColor":[255,255,255],"mask":[[733286,9],[735445,10],[737602,13],[739762,13],[741895,11],[741920,15],[744054,12],[744079,16],[746213,14],[746239,16],[746256,1],[748373,15],[748399,19],[750532,16],[750558,20],[752691,19],[752718,20],[754850,20],[754878,20],[757009,24],[757038,20],[759169,24],[759198,20],[761329,25],[761357,21],[763489,44],[765648,45],[767807,46],[769963,49],[772121,50],[774281,50],[776441,47],[778597,50],[780756,51],[782916,22],[782939,26],[785073,24],[785100,24],[787224,1],[787226,31],[787261,21],[789372,45],[789422,19],[791532,45],[793690,47],[795848,1],[795850,46],[798007,47],[800166,43],[802322,47],[804481,48],[806640,49],[808798,44],[810954,45],[813114,36],[815273,32],[815306,1],[817393,14],[817433,26],[817464,1],[819549,19],[819590,27],[821704,24],[821749,26],[823842,47],[823908,26],[826000,49],[826067,25],[828159,50],[828224,24],[830319,50],[830381,26],[832475,54],[832538,28],[834635,54],[834695,30],[836795,54],[836851,32],[838794,10],[838955,87],[840953,12],[841115,86],[843112,12],[843274,84],[845271,14],[845287,1],[845433,85],[847428,20],[847593,85],[849588,20],[849752,44],[849798,35],[849837,1],[851748,20],[851831,18],[851912,44],[851958,32],[853908,20],[853991,18],[854071,34],[854117,31],[856068,20],[856151,18],[856194,17],[856230,31],[856278,26],[858227,21],[858312,17],[858353,20],[858389,15],[858440,24],[860386,22],[860469,21],[860513,22],[860539,1],[860549,15],[860601,23],[862546,22],[862629,23],[862670,30],[862705,19],[862762,22],[864706,23],[864747,9],[864789,23],[864829,35],[864865,19],[864922,1],[864943,1],[866866,23],[866899,19],[866949,23],[866988,55],[869025,24],[869057,37],[869109,23],[869146,56],[871184,25],[871216,39],[871269,23],[871305,56],[873344,25],[873376,41],[873428,24],[873463,58],[875504,25],[875536,43],[875588,24],[875620,61],[877663,26],[877696,44],[877748,25],[877777,1],[877780,60],[879823,26],[879856,44],[879908,25],[879934,66],[881982,27],[882016,44],[882068,90],[884142,14],[884157,13],[884175,45],[884228,57],[884287,31],[886301,14],[886317,13],[886334,46],[886388,49],[886450,28],[888461,14],[888477,65],[888547,49],[888615,23],[890621,14],[890636,119],[890778,14],[892758,1],[892778,1],[892780,15],[892797,84],[892882,32],[894918,18],[894938,17],[894957,33],[894992,1],[895008,33],[895042,28],[897078,19],[897098,16],[897117,30],[897149,1],[897169,31],[897202,27],[899238,19],[899258,15],[899277,30],[899328,31],[899362,26],[901355,14],[901398,35],[901437,28],[901490,29],[901522,24],[903516,13],[903558,34],[903599,26],[903651,28],[903682,22],[905675,14],[905718,33],[905760,23],[905811,27],[905842,16],[907834,15],[907877,34],[907921,21],[907971,26],[909994,15],[910036,35],[910082,20],[910131,26],[912154,15],[912195,36],[912245,15],[912291,26],[914314,15],[914354,37],[914408,10],[914451,26],[916474,16],[916510,41],[916621,1],[916623,14],[918633,17],[918669,42],[920793,18],[920825,43],[922953,19],[922985,43],[925113,20],[925144,44],[927273,21],[927303,45],[929432,23],[929462,46],[931592,23],[931620,48],[933752,23],[933779,45],[935911,24],[935937,46],[938071,72],[940231,72],[942391,70],[944551,68],[946711,65],[948871,63],[951030,61],[953189,61],[955349,15],[955365,21],[955388,17],[955406,1],[957509,15],[957525,19],[959670,14],[959685,18],[961829,1],[961837,24],[964005,14],[966165,13],[968325,12],[970485,10]],"colorDetectionMode":"fg","colorDistance":10,"algorithm":{"algoType":"AveragingWindowAlgo","xStep":2,"yStep":2},"name":2,"imageWidth":2160,"imageHeight":1215}},{"name":"Default Dataset 2","axesName":"XY 2","colorRGB":[200,0,0,255],"metadataKeys":[],"page":6,"data":[{"x":637.5,"y":370.25,"value":[0.03203105428566744,-0.09762908467719589]},{"x":637.5,"y":373.8333333333333,"value":[0.03312113751623258,-0.12242069186376803]},{"x":637,"y":377,"value":[-0.003941692322989354,-0.14432086233511354]},{"x":637,"y":380,"value":[-0.003029064502051426,-0.16507662649131394]},{"x":637,"y":383,"value":[-0.0021164366811134983,-0.18583239064751433]},{"x":637,"y":386,"value":[-0.0012038088601755703,-0.20658815480371473]},{"x":637,"y":389,"value":[-0.0002911810392376424,-0.22734391895991513]},{"x":637,"y":392,"value":[0.0006214467817002856,-0.24809968311611508]},{"x":637,"y":395,"value":[0.0015340746026382135,-0.2688554472723155]},{"x":637,"y":397.5,"value":[0.0022945977867578904,-0.2861519174024827]},{"x":636.5,"y":400.5,"value":[-0.034818933598074864,-0.30689898986515063]},{"x":636.5,"y":403.5,"value":[-0.033906305777136936,-0.3276547540213506]},{"x":636.5,"y":406.5,"value":[-0.03299367795619901,-0.348410518177551]},{"x":636.5,"y":409.5,"value":[-0.03208105013526108,-0.36916628233375137]},{"x":638.7,"y":362.4,"value":[0.12090579358139308,-0.0433390285329498]},{"x":638,"y":366.5,"value":[0.06891642871526216,-0.07169307117547818]},{"x":640.8333333333334,"y":362.5,"value":[0.28318116045337405,-0.044067971897229885]},{"x":642.5,"y":365.375,"value":[0.4108096261343306,-0.06398788485869744]},{"x":644.5,"y":366.5,"value":[0.5632564983902597,-0.0718060631914037]},{"x":645.5,"y":362.8333333333333,"value":[0.638193382798427,-0.04645529038755747]},{"x":646.5,"y":359.6666666666667,"value":[0.7132823718434196,-0.0245638116097453]},{"x":648.7,"y":357.5,"value":[0.8799383522559054,-0.009611780948477477]},{"x":651.5,"y":355.375,"value":[1.09223839910171,0.005041545178380957]},{"x":650.5,"y":358,"value":[1.0169846300334981,-0.013102365071229194]},{"x":652.5,"y":351,"value":[1.1669598019410543,0.03529298451910767]},{"x":654.5,"y":348.8333333333333,"value":[1.3184053186712248,0.05024849185778768]},{"x":656.5,"y":351.875,"value":[1.4714352587016393,0.029169686425286834]},{"x":658.3,"y":356.5,"value":[1.6097363997330234,-0.0028600734122394833]},{"x":659.5,"y":360.8333333333333,"value":[1.7023174220126691,-0.032861481702341155]},{"x":660.75,"y":364,"value":[1.7983461493936375,-0.054792073101051386]},{"x":663.7,"y":358.5,"value":[2.021027337702627,-0.016791119806526922]},{"x":662.5,"y":361.5,"value":[1.9306771834297152,-0.03752602389824844]},{"x":662.5,"y":364.5,"value":[1.931589811250653,-0.058281788054448835]},{"x":665.5,"y":357.5,"value":[2.1576173015697435,-0.009903821851177774]},{"x":666.25,"y":361.5,"value":[2.215873377472981,-0.03759121159974432]},{"x":667.5,"y":363.6666666666667,"value":[2.311597895580306,-0.052603214946387755]},{"x":669.5,"y":359.625,"value":[2.462473019922392,-0.024675355010082]},{"x":672.5,"y":358.3333333333333,"value":[2.6902370381785445,-0.015790995604025415]},{"x":675.5,"y":354.875,"value":[2.9173419363418063,0.008083637914842345]},{"x":674.5,"y":358,"value":[2.8422402719104056,-0.013519566360800983]},{"x":676.7,"y":349.9,"value":[3.00709127729926,0.04248275340939589]},{"x":679.5,"y":349.1666666666667,"value":[3.219814682050888,0.047507711163794486]},{"x":680.5,"y":352.5,"value":[3.296881031374589,0.02442836760317313]},{"x":682.5,"y":354.8333333333333,"value":[3.4496954898361665,0.008250228707553653]},{"x":683.5,"y":352,"value":[3.5248858819723736,0.02783551146801022]},{"x":684.75,"y":349.25,"value":[3.619114704484275,0.04683989937736177]},{"x":687,"y":350,"value":[3.790460577865467,0.04161184571741483]},{"x":687.5,"y":352.5,"value":[3.8292472602553502,0.02430668389371471]},{"x":690.3,"y":351.4,"value":[4.041859121606642,0.03186845726720522]},{"x":692.5,"y":349.25,"value":[4.208520172173692,0.04670517812760444]},{"x":694.5,"y":352.375,"value":[4.361575462976909,0.025049823690764583]},{"x":696.5,"y":354.5,"value":[4.514326544506481,0.010313057305991524]},{"x":699.5,"y":354.25,"value":[4.742407447422686,0.011990554157812028]},{"x":701.5,"y":356.375,"value":[4.895158528952265,-0.002746212226960587]},{"x":702.5,"y":352,"value":[4.969879931791596,0.02750522711376613]},{"x":704.75,"y":350,"value":[5.140389229670262,0.04130329059700211]},{"x":707.5,"y":350.8333333333333,"value":[5.349786613030034,0.03548999623918325]},{"x":709.5,"y":354.125,"value":[5.502892605378861,0.012681543793665373]},{"x":710.5,"y":357.8333333333333,"value":[5.58007303318017,-0.012992270286480867]},{"x":711.75,"y":361.25,"value":[5.676177812879551,-0.036652508698207686]},{"x":714.5,"y":357.25,"value":[5.884104851416701,-0.00902596080437057]},{"x":713.5,"y":361.5,"value":[5.809345422418154,-0.03841257663858899]},{"x":717.5,"y":355.8333333333333,"value":[6.111830843513644,0.0007232221081943102]},{"x":719.5,"y":359,"value":[6.2648988097032685,-0.021220406830815275]},{"x":722.5,"y":360.25,"value":[6.493436026529942,-0.029920792057094747]},{"x":725.75,"y":358.75,"value":[6.740149747456975,-0.019599405986957752]},{"x":728.25,"y":357.125,"value":[6.9297862034161355,-0.008400158870012664]},{"x":731.75,"y":357.125,"value":[7.195969317856523,-0.008461000724742096]},{"x":734.5,"y":358.2,"value":[7.4054402184574215,-0.015946287195144127]},{"x":737.3,"y":356.5,"value":[7.617869554244528,-0.004233360990413715]},{"x":739.1666666666666,"y":359.1666666666667,"value":[7.760645106675788,-0.022715378118447926]},{"x":739.5,"y":362.6666666666667,"value":[7.787060611937399,-0.04693623076303677]},{"x":740.7,"y":366,"value":[7.879337424943401,-0.0700190510010712]},{"x":743.25,"y":364,"value":[8.07266241834553,-0.056226202533954606]},{"x":745,"y":366.75,"value":[8.206590551068246,-0.07528274060450268]},{"x":746.7,"y":370.1,"value":[8.336898593434576,-0.09848956233693817]},{"x":749.5,"y":363.1666666666667,"value":[8.547735900689602,-0.050569358659724895]},{"x":749.1666666666666,"y":367.1666666666667,"value":[8.523601964980337,-0.07823791640563682]},{"x":748.5,"y":369.5,"value":[8.473610241011158,-0.09436969960241548]},{"x":750.5,"y":360.1666666666667,"value":[8.622875591280199,-0.029830977890590304]},{"x":752.5,"y":363.125,"value":[8.775880180537811,-0.050333234318751696]},{"x":753.5,"y":366.6666666666667,"value":[8.853009906793517,-0.0748539503902208]},{"x":755.7,"y":361.1,"value":[9.018631575675606,-0.03637872035192613]},{"x":755,"y":364.5,"value":[8.966429264317924,-0.05988975135800745]},{"x":757.5,"y":360.5,"value":[9.155343223252181,-0.03225885761740388]},{"x":758,"y":364,"value":[9.194434114915715,-0.0564826074931708]},{"x":758.25,"y":367.5,"value":[9.214511926976364,-0.08070201152217038]},{"x":759.75,"y":369.75,"value":[9.329274875459369,-0.09629490971991883]},{"x":761.7,"y":364.9,"value":[9.476101481384688,-0.06277365527217249]},{"x":762.5,"y":367.5,"value":[9.5377342802254,-0.08077589091719872]},{"x":764,"y":365,"value":[9.651052234658593,-0.06350549586763021]},{"x":765.5,"y":368.75,"value":[9.766271497052067,-0.08947627614347864]},{"x":768.5,"y":368.8333333333333,"value":[9.994453803059486,-0.09010497530901418]},{"x":770.5,"y":372,"value":[10.14752176924911,-0.11204860424802332]},{"x":771.5,"y":375.8333333333333,"value":[10.224740223209622,-0.13858724183467785]},{"x":773.7,"y":372.9,"value":[10.39116297651232,-0.118330960333493]},{"x":773.5,"y":376.5,"value":[10.377047666215127,-0.14323440064352067]},{"x":775.8333333333334,"y":372.5,"value":[10.553286238747475,-0.11560060967173946]},{"x":777.5,"y":374.8333333333333,"value":[10.680749924405212,-0.13177295410500411]},{"x":780.5,"y":375.5,"value":[10.909109685822251,-0.1364374963009123]},{"x":783.5,"y":375,"value":[11.137114536420043,-0.1330303524360752]},{"x":786,"y":375,"value":[11.32724533244889,-0.13307381090373882]},{"x":786.5,"y":377.5,"value":[11.366032014838765,-0.15037897272743894]},{"x":789.5,"y":376.8333333333333,"value":[11.593986163890953,-0.14581873085392383]},{"x":792.5,"y":376.9,"value":[11.822163399743815,-0.1463321202185912]},{"x":795.5,"y":370,"value":[12.048221310990264,-0.09864601282052687]},{"x":795,"y":373.5,"value":[12.011259884242257,-0.12285237930922843]},{"x":794.5,"y":376,"value":[11.973994248220606,-0.1401401577458623]},{"x":797.75,"y":367.5,"value":[12.218578504232113,-0.08138865531125772]},{"x":799.8333333333334,"y":368.8333333333333,"value":[12.377426446621016,-0.09064965477039966]},{"x":802.7,"y":370,"value":[12.595798003553341,-0.09877117320739881]},{"x":805.5,"y":367.5,"value":[12.807983971921537,-0.08152337656101505]},{"x":807.5,"y":370.5,"value":[12.96100123656555,-0.10231390749134661]},{"x":807.8333333333334,"y":375.1666666666667,"value":[12.987771652646416,-0.13460644619668027]},{"x":809.5,"y":378.5,"value":[13.115539547577796,-0.15769737868201172]},{"x":812.5,"y":380.8333333333333,"value":[13.344406324450915,-0.17389290096469745]},{"x":815.75,"y":381,"value":[13.591627060834021,-0.175102494981338]},{"x":818,"y":382.5,"value":[13.763201091170451,-0.1855194896803356]},{"x":818.25,"y":385.75,"value":[13.783202850912687,-0.2080092466963186]},{"x":820.5,"y":387.5,"value":[13.95485293356753,-0.22015588840833322]},{"x":821.7,"y":382.9,"value":[14.044716353002606,-0.18835124343330456]},{"x":824.5,"y":380.25,"value":[14.256856689979749,-0.17006565857911093]},{"x":827.25,"y":381.5,"value":[14.46638082720353,-0.1787616979586244]},{"x":828,"y":384.5,"value":[14.524332693833124,-0.19953049965512415]},{"x":828.5,"y":387.5,"value":[14.563271480859832,-0.220294955504857]},{"x":829.5,"y":390.5,"value":[14.640236427092304,-0.2410681030481232]},{"x":831.5,"y":387.75,"value":[14.791504488412855,-0.22207675267907012]},{"x":832.5,"y":384.1666666666667,"value":[14.866466723593831,-0.1973025288795638]},{"x":833.5,"y":381.1666666666667,"value":[14.941606414184434,-0.17656414811042875]},{"x":835.5,"y":384.375,"value":[15.09468705576046,-0.19879605155160673]},{"x":838.3,"y":382.4,"value":[15.30703273399731,-0.18518051363255816]},{"x":840.7,"y":379.5,"value":[15.488676091291431,-0.1651583284105218]},{"x":842.5,"y":378.5,"value":[15.62526605515854,-0.1582710304551731]},{"x":843.3,"y":382.3,"value":[15.68726390512763,-0.18457557176267958]},{"x":846.5,"y":382.5,"value":[15.93069216589928,-0.18601491621170219]},{"x":848.5,"y":386,"value":[16.083861535180127,-0.21026474116806693]},{"x":850.25,"y":390.25,"value":[16.218245981813304,-0.23969916131671543]},{"x":851.5,"y":392,"value":[16.313843746056612,-0.2518284196416638]},{"x":853.5,"y":389.5,"value":[16.465187859695583,-0.2345667162856282]},{"x":856.25,"y":391,"value":[16.67478804923777,-0.24499240267815825]},{"x":858,"y":392.5,"value":[16.808335920368442,-0.2554007056836234]},{"x":859.5,"y":388.1666666666667,"value":[16.921096157799944,-0.22544623253859886]},{"x":860.5,"y":382.5,"value":[16.995424623660817,-0.18625828363061903]},{"x":860,"y":385.5,"value":[16.958311092275984,-0.20700535609328652]},{"x":859.5,"y":391,"value":[16.921958084075264,-0.24504889868612123]},{"x":861.5,"y":379.5,"value":[17.07056431425142,-0.165519902861484]},{"x":863,"y":382.5,"value":[17.185555419689656,-0.18630174209828265]},{"x":863.25,"y":386.5,"value":[17.20578533638713,-0.2139804401533163]},{"x":864,"y":389.5,"value":[17.263737203016724,-0.2347492418498156]},{"x":864.5,"y":391.75,"value":[17.302447833088202,-0.2503247566604987]},{"x":865.5,"y":394.3333333333333,"value":[17.379286025456658,-0.26821515918206984]},{"x":868.3,"y":393.6,"value":[17.592009430208286,-0.26319020142767124]},{"x":870.7,"y":389.2,"value":[17.773196473591945,-0.23279013412753446]},{"x":872.8333333333334,"y":389.5,"value":[17.935532682318645,-0.23490279510222756]},{"x":874.1666666666666,"y":392.8333333333333,"value":[18.03794980444618,-0.2579879331252042]},{"x":874.5,"y":395.8333333333333,"value":[18.064213205070978,-0.2787494917437594]},{"x":876,"y":397,"value":[18.178646593507516,-0.2868472528851025]},{"x":877.5,"y":393.8333333333333,"value":[18.291761741758286,-0.2649644658008228]},{"x":880.5,"y":394.5,"value":[18.520121503175325,-0.2696290079967305]},{"x":883.5,"y":394.3333333333333,"value":[18.748227756864345,-0.268528060149249]},{"x":886,"y":396,"value":[18.938865568349264,-0.28010249870369064]},{"x":886.25,"y":399.75,"value":[18.95901943272832,-0.3060515497457077]},{"x":887.5,"y":402.5,"value":[19.054921406245278,-0.3250993961227229]},{"x":890.5,"y":402.8333333333333,"value":[19.283179764571095,-0.327457742301275]},{"x":892.5,"y":406.125,"value":[19.436285756919936,-0.3502661947467929]},{"x":894.5,"y":407.3333333333333,"value":[19.58875797994866,-0.35866092208383726]},{"x":895.5,"y":404.1666666666667,"value":[19.66384696899366,-0.3367694433060251]},{"x":896.5,"y":401.5,"value":[19.73908806267547,-0.31833725855424566]},{"x":899.5,"y":400.5,"value":[19.96694080863643,-0.31147082066337584]},{"x":902.5,"y":398.8333333333333,"value":[20.194590748414974,-0.2999919907377939]},{"x":903.5,"y":401.6666666666667,"value":[20.271504993101836,-0.3196120402723821]},{"x":905,"y":403.25,"value":[20.386065135402426,-0.33059254643541935]},{"x":906.5,"y":399.625,"value":[20.499040854402757,-0.30553873982727575]},{"x":908.5,"y":395.625,"value":[20.64992865413125,-0.2778991543931393]},{"x":910.5,"y":398.125,"value":[20.802793814138433,-0.2952303912974372]},{"x":911.5,"y":402,"value":[20.88002494348536,-0.3220573033862615]},{"x":912,"y":405,"value":[20.91896373051207,-0.3428217592359948]},{"x":912.5,"y":407.6666666666667,"value":[20.957801114447555,-0.3612800190683725]},{"x":914.5,"y":408.1666666666667,"value":[21.11005785590745,-0.3647740798685364]},{"x":917.7,"y":404.5,"value":[21.352309840821015,-0.3394615505162344]},{"x":916.5,"y":407.5,"value":[21.261959686548103,-0.36019645460795635]},{"x":918.5,"y":400.5,"value":[21.41193485845566,-0.31180110501761993]},{"x":919.5,"y":395.75,"value":[21.486542182817367,-0.27895519515736833]},{"x":920.5,"y":391,"value":[21.56114950717909,-0.2461092852971163]},{"x":921.75,"y":388.5,"value":[21.655454382009403,-0.22883454440078133]},{"x":923.5,"y":389.5,"value":[21.788850148503236,-0.23578355338021284]},{"x":924.5,"y":392.3333333333333,"value":[21.865764393190112,-0.2554036029148006]},{"x":927.3,"y":391.7,"value":[22.0785182188691,-0.2510705039656087]},{"x":930.75,"y":389.875,"value":[22.34034353546452,-0.2385040534559626]},{"x":931.5,"y":386.5,"value":[22.3963560679746,-0.21516685632053623]},{"x":933.5,"y":384.375,"value":[22.54781426009118,-0.2004996234840255]},{"x":935.5,"y":380.875,"value":[22.6988541644565,-0.17631933207592265]},{"x":937.5,"y":378.25,"value":[22.850160251936252,-0.1581928052133783]},{"x":940,"y":378.5,"value":[23.04036710028351,-0.15996591069405852]},{"x":940.5,"y":380.75,"value":[23.079077730354975,-0.17554142550474205]},{"x":941.5,"y":383.6666666666667,"value":[23.156017325814652,-0.1957380240436688]},{"x":943.8333333333334,"y":386.5,"value":[23.334334661716916,-0.2153812514276776]},{"x":945.5,"y":389,"value":[23.46184904892025,-0.23270669386962028]},{"x":948,"y":391,"value":[23.65258826349639,-0.2465873284414175]},{"x":948.5,"y":394,"value":[23.6915270505231,-0.26735178429115036]},{"x":949.5,"y":397.6666666666667,"value":[23.768694802938008,-0.29273732386912776]},{"x":950.5,"y":401.5,"value":[23.84591325689852,-0.3192759614557823]},{"x":951.5,"y":403,"value":[23.922421889220537,-0.3296712269209481]},{"x":954.5,"y":403.1666666666667,"value":[24.15062954600075,-0.33087647509082263]},{"x":955,"y":406.5,"value":[24.189669736118667,-0.3539471269579111]},{"x":955.5,"y":409.5,"value":[24.228608523145375,-0.37471158280764394]},{"x":956.3,"y":414.5,"value":[24.290971424242834,-0.40931842977763067]},{"x":957.75,"y":417.75,"value":[24.402235966078912,-0.43182904685809254]},{"x":960.5,"y":412.75,"value":[24.609858795342426,-0.3972839109121886]},{"x":959.8333333333334,"y":416.5,"value":[24.5602980345109,-0.4232170271827287]},{"x":963.25,"y":413.75,"value":[24.8193068802478,-0.4042503032786855]},{"x":964.5,"y":416.5,"value":[24.915208853764746,-0.4232981496557011]},{"x":966.5,"y":413.8333333333333,"value":[25.066502265858098,-0.4048833482909875]},{"x":967.5,"y":416.5,"value":[25.143365808999356,-0.42335029981689765]},{"x":969.5,"y":420.25,"value":[25.29661123059862,-0.449329771786279]},{"x":971.5,"y":423.5,"value":[25.449704547561034,-0.4718499497296267]},{"x":974.25,"y":422.25,"value":[25.658468161600716,-0.4632495189789734]},{"x":977.7,"y":419.7,"value":[25.92007292647272,-0.44566709213157907]},{"x":979.5,"y":419.5,"value":[26.056906257758747,-0.44431466461788416]},{"x":980,"y":422.5,"value":[26.095845044785456,-0.465079120467617]},{"x":980.5,"y":426.1666666666667,"value":[26.134986637994594,-0.4904559683520615]},{"x":981.5,"y":429.5,"value":[26.212052987318295,-0.5135353119126824]},{"x":982.5,"y":432,"value":[26.28886582891395,-0.5308491654299154]},{"x":984.5,"y":428.25,"value":[26.439829680960848,-0.5049392270087956]},{"x":987.5,"y":429.25,"value":[26.66829084546911,-0.5119099652220589]},{"x":990.5,"y":430.25,"value":[26.89675200997737,-0.5188807034353222]},{"x":992.7,"y":432.6,"value":[27.064782002275827,-0.5351776288092234]},{"x":994.5,"y":428.125,"value":[27.20031483891703,-0.5042482373729422]},{"x":994.5,"y":432,"value":[27.201493649852402,-0.5310577660747011]},{"x":996.5,"y":425.8333333333333,"value":[27.35172232948799,-0.4884279065277535]},{"x":997.5,"y":429.1666666666667,"value":[27.428788678811678,-0.5115072500883753]},{"x":998.5,"y":431.3333333333333,"value":[27.505500117316124,-0.5265149075882514]},{"x":1000.5,"y":429,"value":[27.656894932500684,-0.5104063022408938]},{"x":1002.1666666666666,"y":431.1666666666667,"value":[27.784307916612825,-0.5254255486654809]},{"x":1002.5,"y":435.1666666666667,"value":[27.81087552651126,-0.5531056953361033]},{"x":1003.5,"y":439.1,"value":[27.888124401399132,-0.580336191727965]},{"x":1004,"y":442,"value":[27.92703276749848,-0.6004087887724912]},{"x":1005.5,"y":434,"value":[28.038677570926616,-0.545086159436555]},{"x":1006.7,"y":429.1,"value":[28.1284497275796,-0.5112059380459066]},{"x":1005.5,"y":438.5,"value":[28.040046512658016,-0.5762198056708554]},{"x":1009.5,"y":429.8333333333333,"value":[28.341619305932575,-0.5163282427678721]},{"x":1009.25,"y":432.625,"value":[28.32345547721861,-0.5356382885664588]},{"x":1011.8333333333334,"y":431.1666666666667,"value":[28.519480327924363,-0.5255935880737805]},{"x":1013,"y":433.5,"value":[28.608917854376337,-0.5417572408135127]},{"x":1013.5,"y":437.1666666666667,"value":[28.64805944758546,-0.5671340886979572]},{"x":1014.5,"y":440.3333333333333,"value":[28.725075095363543,-0.5890603342499006]},{"x":1016.5,"y":442.75,"value":[28.877914904597937,-0.6058150221498599]},{"x":1018.5,"y":446.5,"value":[29.03116032619719,-0.6317944941192408]},{"x":1019.25,"y":451.5,"value":[29.08972061137407,-0.6664004719198742]},{"x":1020.5,"y":453.6666666666667,"value":[29.1854451294814,-0.6814124752665176]},{"x":1022.5,"y":450,"value":[29.33643433230109,-0.6560790858497372]},{"x":1023.5,"y":446.5,"value":[29.41142191825488,-0.6318814110545685]},{"x":1025.8333333333333,"y":446.5,"value":[29.588877327881796,-0.6319219722910545]},{"x":1027.5,"y":450.25,"value":[29.7167719766772,-0.657895649798081]},{"x":1028.5,"y":454.1666666666667,"value":[29.794015781410515,-0.6850108363890746]},{"x":1031.25,"y":453.5,"value":[30.00295685085981,-0.6804462486687934]},{"x":1032.5,"y":449.1666666666667,"value":[30.09670400868844,-0.6504874296770033]},{"x":1035.5,"y":449.5,"value":[30.324962367014273,-0.6528457758555546]},{"x":1036.5,"y":452,"value":[30.401775208609926,-0.6701596293727876]},{"x":1038,"y":453.5,"value":[30.5163100001377,-0.6805635865314859]},{"x":1039.5,"y":449.875,"value":[30.629285719138032,-0.6555097799233423]},{"x":1040.5,"y":445.25,"value":[30.703931069658957,-0.6235286935695985]},{"x":1041.5,"y":440.6666666666667,"value":[30.778589095566296,-0.5918358817180245]},{"x":1044.5,"y":439.8333333333333,"value":[31.00649254307286,-0.5861225418358318]},{"x":1046.5,"y":443.125,"value":[31.1595985354217,-0.6089309942813497]},{"x":1047.5,"y":448,"value":[31.237133874042264,-0.6426764944222407]},{"x":1048.3,"y":453.5,"value":[31.299648879776534,-0.6807426354182602]},{"x":1049.5,"y":457.6666666666667,"value":[31.392179200510576,-0.7095909456996843]},{"x":1051.8333333333333,"y":459.8333333333333,"value":[31.570293730230397,-0.7246217810489815]},{"x":1053.5,"y":463.375,"value":[31.698125002093796,-0.7491540860451606]},{"x":1056.75,"y":465.875,"value":[31.946055560115404,-0.7665070521832904]},{"x":1059.7,"y":457.3,"value":[32.16780130490793,-0.7072314406286608]},{"x":1059,"y":461.5,"value":[32.115842360969175,-0.7362773420763955]},{"x":1058.5,"y":463.5,"value":[32.07842462031069,-0.7501058264869962]},{"x":1058.5,"y":466,"value":[32.079185143494804,-0.767402296617163]},{"x":1060.75,"y":453.375,"value":[32.24646221784098,-0.6800942350807175]},{"x":1062.5,"y":452.5,"value":[32.37928759194674,-0.6740708914625237]},{"x":1063,"y":455.5,"value":[32.41822637897345,-0.6948353473122566]},{"x":1063.5,"y":458.8333333333333,"value":[32.45726656909137,-0.7179059991793455]},{"x":1064.5,"y":461.3333333333333,"value":[32.53407941068702,-0.7352198526965776]},{"x":1066.5,"y":455.5,"value":[32.68440949341383,-0.694896189166986]},{"x":1066,"y":458.5,"value":[32.647295962029,-0.7156432616296535]},{"x":1067.5,"y":452.5,"value":[32.759549184004435,-0.674157808397851]},{"x":1069.5,"y":454.875,"value":[32.91237631785241,-0.6906242217956406]},{"x":1070.5,"y":450.625,"value":[32.98713574685096,-0.6612376059614222]},{"x":1073,"y":450.5,"value":[33.1772285167206,-0.6604162409225776]},{"x":1073.5,"y":453.5,"value":[33.21616730374729,-0.6811806967723109]},{"x":1074,"y":456.5,"value":[33.255106090774,-0.7019451526220442]},{"x":1074.5,"y":459.3333333333333,"value":[33.293994176255104,-0.721556510463099]},{"x":1076.75,"y":461.375,"value":[33.465732986614775,-0.7357210736902999]},{"x":1079,"y":462.5,"value":[33.63719293847357,-0.7435435978697722]},{"x":1078.8333333333333,"y":465.8333333333333,"value":[33.625531582983804,-0.7666026608121501]},{"x":1080.7,"y":469.1,"value":[33.76848966097926,-0.7892358307714242]},{"x":1081,"y":472.5,"value":[33.792339668033115,-0.8127642451645709]},{"x":1083.5,"y":464.125,"value":[33.97992271139517,-0.7548645286961753]},{"x":1082.5,"y":467.5,"value":[33.90489709928219,-0.7781973799848352]},{"x":1085.5,"y":461.8333333333333,"value":[34.13133020196614,-0.7390441978509861]},{"x":1086.5,"y":463.6666666666667,"value":[34.207940237379354,-0.7517456593335079]},{"x":1089.3,"y":461.8,"value":[34.42031887162087,-0.7388796351201004]},{"x":1092.5,"y":461.5,"value":[34.6635950277557,-0.7368596855430898]},{"x":1093.5,"y":464.6666666666667,"value":[34.74061067553378,-0.7587859310950331]},{"x":1094.5,"y":469,"value":[34.81798123413112,-0.7887838627077213]},{"x":1095.7,"y":473,"value":[34.910460853319556,-0.8164790749804673]},{"x":1098.5,"y":465,"value":[35.120973670682694,-0.761179044047716]},{"x":1098,"y":469,"value":[35.0841643485715,-0.7888447045624507]},{"x":1097.5,"y":472.5,"value":[35.04720292182349,-0.8130510710511514]},{"x":1099.5,"y":460,"value":[35.19550494272598,-0.7266034871744478]},{"x":1101.5,"y":458.3333333333333,"value":[35.347102564092985,-0.7151072738618005]},{"x":1104.5,"y":460.5,"value":[35.5759186394205,-0.7301496981358087]},{"x":1106.5,"y":462.8333333333333,"value":[35.72873309788209,-0.7463278370314286]},{"x":1107.7,"y":458.9,"value":[35.8187993234996,-0.7191355840911111]},{"x":1110,"y":457.5,"value":[35.993293762863026,-0.7094895426084684]},{"x":1110.25,"y":461.5,"value":[36.0135236795605,-0.7371682406635021]},{"x":1111,"y":464.5,"value":[36.071475546190094,-0.7579370423600018]},{"x":1111,"y":467.5,"value":[36.07238817401103,-0.7786928065162018]},{"x":1111,"y":470.5,"value":[36.07330080183197,-0.7994485706724022]},{"x":1111.5,"y":473.8333333333333,"value":[36.112340991949885,-0.8225192225394906]},{"x":1112.5,"y":477.3333333333333,"value":[36.189458042819176,-0.84675166410879]},{"x":1115.3,"y":476.3,"value":[36.402090184788726,-0.8396511299387708]},{"x":1117.5,"y":471.875,"value":[36.56805915925822,-0.8090746212599198]},{"x":1119.5,"y":468.5,"value":[36.719137089782755,-0.7857591533583252]},{"x":1121.5,"y":464.875,"value":[36.870138967988844,-0.7607140384437141]},{"x":1122.5,"y":460.8333333333333,"value":[36.94496177391941,-0.7327687951203434]},{"x":1123.5,"y":457.6666666666667,"value":[37.020050762964395,-0.7108773163425308]},{"x":1125.5,"y":455.8333333333333,"value":[37.17159768278578,-0.6982280050212055]},{"x":1126.5,"y":459,"value":[37.24861333056388,-0.7201542505731493]},{"x":1128.5,"y":462.5,"value":[37.40178269984471,-0.744404075529514]},{"x":1130,"y":464,"value":[37.51631749137248,-0.7548080326882123]},{"x":1131.5,"y":458.1666666666667,"value":[37.62862141489352,-0.7144756774650878]},{"x":1131,"y":461.25,"value":[37.59153323428149,-0.7357992989320947]},{"x":1132.5,"y":454.5,"value":[37.7035582993017,-0.689124904661242]},{"x":1133.7,"y":448.7,"value":[37.793056667608404,-0.6490179540237331]},{"x":1132.5,"y":451.5,"value":[37.70264567148076,-0.6683691405050416]},{"x":1136.5,"y":449.3333333333333,"value":[38.006195825034006,-0.6534483999404923]},{"x":1139.5,"y":451.1666666666667,"value":[38.2349104972703,-0.6661846281971449]},{"x":1140.75,"y":453.25,"value":[38.33060966460483,-0.6806200825394488]},{"x":1143,"y":451.5,"value":[38.5011950148019,-0.668551666069229]},{"x":1143.5,"y":454.6666666666667,"value":[38.54018450337421,-0.6904692199276403]},{"x":1144.5,"y":457,"value":[38.616946643424264,-0.7066299754361944]},{"x":1146,"y":458.75,"value":[38.73155748727046,-0.7187635796079097]},{"x":1147.5,"y":452,"value":[38.84358255229065,-0.6720891853370574]},{"x":1147,"y":456,"value":[38.806773230179466,-0.6997548458517917]},{"x":1148.5,"y":446.875,"value":[38.91807579817475,-0.6366488049572805]},{"x":1149.5,"y":441.75,"value":[38.99256904405886,-0.601208424577504]},{"x":1151.7,"y":437.2,"value":[39.15849999236915,-0.5697670923921438]},{"x":1154,"y":436,"value":[39.33305527358731,-0.5615047685199146]},{"x":1154.5,"y":438.6666666666667,"value":[39.3718926575228,-0.5799630283522923]},{"x":1155.7,"y":442.5,"value":[39.464321575165634,-0.6065051426163603]},{"x":1155.25,"y":446.75,"value":[39.43139092129342,-0.6359013193134646]},{"x":1157.5,"y":434,"value":[39.598629969480406,-0.5477284342705104]},{"x":1157,"y":438,"value":[39.56182064736921,-0.5753940947852443]},{"x":1158.5,"y":423.625,"value":[39.67152611667786,-0.4759654666173829]},{"x":1158,"y":427.5,"value":[39.634678768407476,-0.5027663036256089]},{"x":1158,"y":430.5,"value":[39.63559139622841,-0.5235220677818093]},{"x":1157.5,"y":441,"value":[39.60075943439592,-0.5961585506349776]},{"x":1159.7,"y":415.9,"value":[39.760438882132796,-0.4225402339796456]},{"x":1159,"y":420,"value":[39.708449517266665,-0.4508942766221735]},{"x":1160.5,"y":411.8333333333333,"value":[39.82004361914918,-0.3944185492775598]},{"x":1162.5,"y":414.625,"value":[39.9729975068612,-0.4137677076970441]},{"x":1164.5,"y":416,"value":[40.125520431435525,-0.4233155330427665]},{"x":1165.5,"y":413.1666666666667,"value":[40.20071082357175,-0.4037302502823099]},{"x":1167.5,"y":417.25,"value":[40.354057648262206,-0.43201591826904684]},{"x":1168.5,"y":421.8333333333333,"value":[40.43150425917795,-0.46374349689475114]},{"x":1168.8333333333333,"y":425.5,"value":[40.45797046598516,-0.489117447548018]},{"x":1170,"y":429.25,"value":[40.54783895557481,-0.5150824333615116]},{"x":1171.1666666666667,"y":433.1666666666667,"value":[40.63775814671005,-0.5422005171836832]},{"x":1171.5,"y":437.5,"value":[40.66442715969969,-0.5721868598716608]},{"x":1172,"y":441,"value":[40.703518051363226,-0.5964106097474273]},{"x":1172.5,"y":443.6666666666667,"value":[40.74235543529871,-0.614868869579805]},{"x":1173.1666666666667,"y":447.8333333333333,"value":[40.79432451954661,-0.6437079087214599]},{"x":1173.5,"y":450.25,"value":[40.82041046476176,-0.6604336243096434]},{"x":1174,"y":453,"value":[40.85927319947006,-0.6794684331463601]},{"x":1174.25,"y":456.25,"value":[40.87927495921229,-0.7019581901623431]},{"x":1175.75,"y":458.625,"value":[40.99407593385451,-0.7184159118665998]},{"x":1177.5,"y":454.375,"value":[41.1258746016617,-0.6890423335726807]},{"x":1180.25,"y":455.25,"value":[41.33528466040787,-0.6951439024326693]},{"x":1181.5,"y":456.8333333333333,"value":[41.43083172310556,-0.7061200627489401]},{"x":1183.5,"y":453.75,"value":[41.581998381334905,-0.6848225163625319]},{"x":1184.75,"y":449.75,"value":[41.67584694225474,-0.657169893388097]},{"x":1187.25,"y":449.75,"value":[41.86597773828358,-0.6572133518557606]},{"x":1188.75,"y":451.25,"value":[41.98051252981137,-0.6676173090144588]},{"x":1190.5,"y":446.5,"value":[42.112159092981734,-0.6347844366945061]},{"x":1191.5,"y":441.8333333333333,"value":[42.18679176811626,-0.6025150758385931]},{"x":1190.5,"y":450.5,"value":[42.11337593007631,-0.6624587889027733]},{"x":1192.75,"y":438.625,"value":[42.28088116137773,-0.5803396684053777]},{"x":1195.75,"y":437.5,"value":[42.508695881179484,-0.5726084070079991]},{"x":1195.5,"y":441.1666666666667,"value":[42.49079823557998,-0.5979722173521447]},{"x":1195.5,"y":444,"value":[42.4916601618553,-0.617574883499667]},{"x":1198,"y":435.5,"value":[42.679205179058165,-0.5588103435247631]},{"x":1198.25,"y":439,"value":[42.699282991118814,-0.5830297475537631]},{"x":1199.7,"y":441.7,"value":[42.81038021785438,-0.6017351412055882]},{"x":1202,"y":439,"value":[42.98447918516208,-0.5830949352552586]},{"x":1202.5,"y":441.8333333333333,"value":[43.023367270643185,-0.6027062930963138]},{"x":1203.5,"y":446,"value":[43.100687127694904,-0.6315511267003244]},{"x":1204.3,"y":451.5,"value":[43.16320213342919,-0.6696172676963439]},{"x":1205,"y":455.5,"value":[43.217655593411855,-0.6973037882755571]},{"x":1205,"y":458.5,"value":[43.21856822123279,-0.7180595524317575]},{"x":1205.5,"y":461.3333333333333,"value":[43.257456306713884,-0.7376709102728127]},{"x":1206,"y":464.5,"value":[43.29644579528621,-0.7595884641312236]},{"x":1206.5,"y":468.1666666666667,"value":[43.33558738849535,-0.7849653120156681]},{"x":1206,"y":470.25,"value":[43.29819499860967,-0.7993703454306074]},{"x":1207.5,"y":474.25,"value":[43.41349031332155,-0.8270707727194728]},{"x":1207.5,"y":477.8333333333333,"value":[43.41458039655212,-0.8518623799060454]},{"x":1207.5,"y":480.1666666666667,"value":[43.41529021819063,-0.8680057520275346]},{"x":1210.5,"y":474.5,"value":[43.6417233208746,-0.8288525698936859]},{"x":1209.5,"y":478.5,"value":[43.56688783955763,-0.8565095387148878]},{"x":1213.5,"y":469.1666666666667,"value":[43.86825782664976,-0.7920055837771933]},{"x":1213,"y":472.5,"value":[43.831245698356135,-0.815058852257216]},{"x":1212.5,"y":475,"value":[43.79398006233448,-0.8323466306938507]},{"x":1214.75,"y":466.25,"value":[43.96243594761605,-0.7718480978591633]},{"x":1217.5,"y":466.75,"value":[44.1717319278846,-0.775355196199627]},{"x":1217.5,"y":469.5,"value":[44.17256850338712,-0.7943813133428104]},{"x":1219.5,"y":460.1666666666667,"value":[44.32183385365618,-0.7298425916309852]},{"x":1219,"y":463.5,"value":[44.284821725362555,-0.7528958601110083]},{"x":1220.75,"y":457.5,"value":[44.41608802694086,-0.7114147527259722]},{"x":1223.7,"y":452.7,"value":[44.6389821617414,-0.6782568110678948]},{"x":1223,"y":456,"value":[44.58674942945637,-0.7010759832687694]},{"x":1222.5,"y":459.5,"value":[44.54978800270835,-0.7252823497574705]},{"x":1226.5,"y":452.5,"value":[44.851867811438986,-0.6769217669412648]},{"x":1227.5,"y":454.6666666666667,"value":[44.92857924994342,-0.6919294244411418]},{"x":1229.5,"y":452.1666666666667,"value":[45.079923363582374,-0.6746677210851058]},{"x":1230,"y":455.5,"value":[45.118963553700304,-0.6977383729521942]},{"x":1230,"y":458.5,"value":[45.11987618152124,-0.7184941371083946]},{"x":1230.5,"y":460.25,"value":[45.158434706955894,-0.7306103578930445]},{"x":1231,"y":463,"value":[45.19729744166418,-0.7496451667297608]},{"x":1230.8333333333333,"y":466.5,"value":[45.18568678772002,-0.7738573276808172]},{"x":1232.1666666666667,"y":469.8333333333333,"value":[45.28810390984757,-0.7969424657037933]},{"x":1232,"y":473.5,"value":[45.276543957449014,-0.8223077246635273]},{"x":1232,"y":476.5,"value":[45.27745658526995,-0.8430634888197277]},{"x":1232.5,"y":478.25,"value":[45.316015110704605,-0.8551797096043776]},{"x":1233,"y":481,"value":[45.354877845412894,-0.8742145184410934]},{"x":1233.5,"y":483.5,"value":[45.39366452780278,-0.8915196802647936]},{"x":1235.5,"y":486.125,"value":[45.546567713969175,-0.9097157406755998]},{"x":1236.5,"y":490,"value":[45.6237988433161,-0.936542652764424]},{"x":1237.5,"y":493.1666666666667,"value":[45.70081449109417,-0.9584688983163678]},{"x":1238.75,"y":496.125,"value":[45.796779841543135,-0.9789581172042303]},{"x":1241,"y":496.5,"value":[45.968011636446725,-0.9815917003446528]},{"x":1241,"y":499.5,"value":[45.96892426426766,-1.0023474645008532]},{"x":1241.25,"y":503,"value":[45.9890020763283,-1.0265668685298532]},{"x":1242,"y":506.5,"value":[46.0471060475947,-1.0507949642523862]},{"x":1242,"y":509.5,"value":[46.04801867541564,-1.0715507284085866]},{"x":1242.5,"y":512.5,"value":[46.08695746244235,-1.0923151842583194]},{"x":1243.75,"y":516,"value":[46.18308759291454,-1.1165519716743852]},{"x":1243,"y":518,"value":[46.126656772653185,-1.1303761102382195]},{"x":1246.5,"y":513.75,"value":[46.39154699768056,-1.1010329528716651]},{"x":1248.5,"y":508.1666666666667,"value":[46.54195313272579,-1.0624389363550897]},{"x":1248,"y":511.25,"value":[46.504864952113756,-1.0837625578220962]},{"x":1251.5,"y":508.5,"value":[46.77021149105162,-1.0647972825336418]},{"x":1253.5,"y":511,"value":[46.923076651058814,-1.0821285194379398]},{"x":1254.5,"y":507.6666666666667,"value":[46.99811493855818,-1.0590839426514491]},{"x":1255.5,"y":501.1666666666667,"value":[47.07218989669102,-1.014130503700081]},{"x":1255,"y":504.5,"value":[47.03517776839741,-1.037183772180104]},{"x":1256.75,"y":498.5,"value":[47.16644406997573,-0.995702664795068]},{"x":1258.7,"y":503.1,"value":[47.31614545353701,-1.0275620674393529]},{"x":1259.8333333333333,"y":499.8333333333333,"value":[47.40134433077616,-1.0049810476412753]},{"x":1261,"y":503.25,"value":[47.49111141727459,-1.0286398374374137]},{"x":1262.5,"y":497,"value":[47.603288586931605,-0.9854247371925946]},{"x":1261.5,"y":499.5,"value":[47.52799679170419,-1.0027038239356956]},{"x":1265.5,"y":497.5,"value":[47.83159764680304,-0.9889361813798243]},{"x":1266.5,"y":501.1666666666667,"value":[47.90876539921795,-1.0143217209578013]},{"x":1267,"y":504.5,"value":[47.94780558933588,-1.0373923728248897]},{"x":1267.5,"y":508.1666666666667,"value":[47.986947182545,-1.0627692207093342]},{"x":1267.5,"y":511.1666666666667,"value":[47.98785981036594,-1.0835249848655346]},{"x":1268.75,"y":514.25,"value":[48.083863186974106,-1.1048790272599054]},{"x":1268.25,"y":518,"value":[48.04697781254452,-1.1308150407616235]},{"x":1269.5,"y":521.75,"value":[48.143183995335114,-1.1567814751907055]},{"x":1271.7,"y":502.7,"value":[48.30470390917754,-1.0250206162503774]},{"x":1271,"y":506.5,"value":[48.25262328152932,-1.0512990824772857]},{"x":1271,"y":509.5,"value":[48.253535909350255,-1.072054846633486]},{"x":1271,"y":512.25,"value":[48.25437248485279,-1.0910809637766694]},{"x":1270.5,"y":514.5,"value":[48.217030796512724,-1.1066390952002867]},{"x":1270.5,"y":517.5,"value":[48.21794342433366,-1.127394859356487]},{"x":1272.75,"y":492.125,"value":[48.38134183044084,-0.9518748001561899]},{"x":1272,"y":495.5,"value":[48.32532929793074,-0.9752119972916162]},{"x":1272,"y":498.5,"value":[48.32624192575168,-0.9959677614478166]},{"x":1273.7,"y":485.9,"value":[48.451697830203365,-0.9088231037497865]},{"x":1272.5,"y":489.5,"value":[48.36153020149464,-0.9337091606727488]},{"x":1276.3,"y":484.6,"value":[48.649038386017615,-0.8998741360884703]},{"x":1277.5,"y":479.5,"value":[48.738749700815866,-0.864610197087408]},{"x":1278.5,"y":475.5,"value":[48.81358518213282,-0.8369532282662062]},{"x":1280.5,"y":478.5,"value":[48.966602446776825,-0.8577437591965378]},{"x":1280.5,"y":475.5,"value":[48.96568981895589,-0.8369879950403374]},{"x":1281.5,"y":481.6666666666667,"value":[49.04361809455492,-0.8796700047484816]},{"x":1282.5,"y":484.1666666666667,"value":[49.120430936150576,-0.8969838582657141]},{"x":1283.5,"y":488.125,"value":[49.19768741627029,-0.924387319358877]},{"x":1284.75,"y":492,"value":[49.29393162522009,-0.9512185772944677]},{"x":1287,"y":493.5,"value":[49.46550565555652,-0.9616355719934648]},{"x":1287.5,"y":495.75,"value":[49.504216285628,-0.9772110868041479]},{"x":1288.5,"y":498.5,"value":[49.58110517954207,-0.9962545873343971]},{"x":1289.75,"y":501.5,"value":[49.67708320537742,-1.0170320807244297]},{"x":1292.3,"y":500,"value":[49.87056030341636,-1.0066985262833468]},{"x":1294.5,"y":502,"value":[50.038483822469054,-1.0205739458390237]},{"x":1296.5,"y":505.5,"value":[50.1916531917499,-1.044823770795389]},{"x":1297,"y":509.5,"value":[50.230896188050245,-1.072506814697189]},{"x":1297.5,"y":512.5,"value":[50.26983497507694,-1.0932712705469214]},{"x":1298,"y":515.5,"value":[50.30877376210365,-1.1140357263966547]},{"x":1298,"y":518.5,"value":[50.309686389924586,-1.134791490552855]},{"x":1298,"y":521.5,"value":[50.310599017745524,-1.1555472547090555]},{"x":1298.5,"y":524.5,"value":[50.34953780477225,-1.1763117105587884]},{"x":1299.5,"y":527.8333333333334,"value":[50.42660415409593,-1.1993910541194102]},{"x":1299.5,"y":530.8333333333334,"value":[50.42751678191687,-1.2201468182756106]},{"x":1299.5,"y":533.8333333333334,"value":[50.42842940973781,-1.240902582431811]},{"x":1299.5,"y":536.6666666666666,"value":[50.429291336013144,-1.2605052485793329]},{"x":1300.75,"y":539.125,"value":[50.52510458182528,-1.2775351734411626]},{"x":1302.7,"y":516.8,"value":[50.66661513069362,-1.123111592783549]},{"x":1302,"y":520.5,"value":[50.61450408211804,-1.1486982002052506]},{"x":1302,"y":523.5,"value":[50.61541670993898,-1.169453964361451]},{"x":1302,"y":526.5,"value":[50.616329337759915,-1.1902097285176514]},{"x":1302,"y":529.25,"value":[50.61716591326245,-1.2092358456608348]},{"x":1301.5,"y":531.5,"value":[50.57982422492238,-1.2247939770844525]},{"x":1301.5,"y":534.5,"value":[50.58073685274332,-1.2455497412406524]},{"x":1303.5,"y":509.3333333333333,"value":[50.72518555617963,-1.0714667087044365]},{"x":1303,"y":512.5,"value":[50.6881227263404,-1.0933668791757816]},{"x":1304.5,"y":505.8333333333333,"value":[50.80017314213341,-1.0472690339092678]},{"x":1305.5,"y":502.8333333333333,"value":[50.87531283272401,-1.0265306531401337]},{"x":1307,"y":501,"value":[50.98883359333963,-1.013872650125276]},{"x":1307.5,"y":506.75,"value":[51.02860895586887,-1.0536632231181926]},{"x":1307,"y":509.75,"value":[50.991495424484036,-1.07441029558086]},{"x":1308.1666666666667,"y":513.1666666666666,"value":[51.08126251098246,-1.098069085376998]},{"x":1308,"y":517,"value":[51.06975326012951,-1.12458744234541]},{"x":1308.5,"y":519.8333333333334,"value":[51.108641345610614,-1.1441988001864654]},{"x":1309.7,"y":523.9,"value":[51.20114124541728,-1.1723552516626818]},{"x":1308.5,"y":526,"value":[51.110517302798094,-1.1868634265075433]},{"x":1310.5,"y":528.8333333333334,"value":[51.2634838658965,-1.2065008594291973]},{"x":1312.5,"y":517.125,"value":[51.412026719140634,-1.1255304910937132]},{"x":1312,"y":521,"value":[51.37517937087025,-1.1523313281019392]},{"x":1311.5,"y":523.5,"value":[51.33791373484859,-1.169619106538573]},{"x":1314.5,"y":515.25,"value":[51.56356096357562,-1.1125929052702186]},{"x":1316.5,"y":518.75,"value":[51.716730332856464,-1.1368427302265833]},{"x":1316,"y":521.75,"value":[51.67961680147163,-1.1575898026892508]},{"x":1317.5,"y":525.75,"value":[51.79491211618353,-1.1852902299781163]},{"x":1317,"y":528.75,"value":[51.7577985847987,-1.2060373024407842]},{"x":1318.75,"y":530.75,"value":[51.89149856056617,-1.219904899472282]},{"x":1320.7,"y":526.9,"value":[52.03862937576513,-1.1933022330766025]},{"x":1322.5,"y":531.75,"value":[52.1769989638831,-1.2268886752258448]},{"x":1322,"y":534.75,"value":[52.13988543249827,-1.2476357476885123]},{"x":1322.5,"y":526.5,"value":[52.175401865196456,-1.1905660879524942]},{"x":1323.1666666666667,"y":538.1666666666666,"value":[52.22965251899668,-1.2712945374846498]},{"x":1323.5,"y":542.5,"value":[52.25632153198632,-1.3012808801726279]},{"x":1323,"y":544.75,"value":[52.218979843646274,-1.3168390115962452]},{"x":1324.1666666666667,"y":548.1666666666666,"value":[52.308746930144686,-1.3404978013923827]},{"x":1324.25,"y":552.25,"value":[52.316326811213024,-1.3687501512205777]},{"x":1325.7,"y":555.9,"value":[52.42771303675857,-1.394028203521867]},{"x":1325.5,"y":558.75,"value":[52.41336956950615,-1.4137427027928444]},{"x":1327.5,"y":551.5,"value":[52.56326868909529,-1.363617706189491]},{"x":1328.5,"y":554.6,"value":[52.64026405625513,-1.3850827125379634]},{"x":1331.25,"y":556,"value":[52.84983382486997,-1.3948165401252872]},{"x":1334.25,"y":557,"value":[53.07829498937823,-1.40178727833855]},{"x":1335.75,"y":559,"value":[53.19298188554283,-1.415650529523282]},{"x":1337.7,"y":554.3,"value":[53.33985412285919,-1.3831670632833455]},{"x":1340,"y":554.5,"value":[53.514835297060465,-1.38459076268401]},{"x":1340,"y":557.5,"value":[53.5157479248814,-1.4053465268402099]},{"x":1340.5,"y":560.5,"value":[53.5546867119081,-1.4261109826899432]},{"x":1341.7,"y":564.5,"value":[53.647166331096535,-1.4538061949626888]},{"x":1344,"y":565.5,"value":[53.82239087271672,-1.4607647648050066]},{"x":1344.5,"y":567.75,"value":[53.861101502788195,-1.4763402796156893]},{"x":1345.5,"y":570.3333333333334,"value":[53.937939695156636,-1.4942306821372613]},{"x":1348.3,"y":569.8,"value":[54.150723941763,-1.4905894419932748]},{"x":1349.5,"y":565,"value":[54.240526519343355,-1.4574010794078336]},{"x":1350.5,"y":560,"value":[54.31505779138666,-1.422825522534565]},{"x":1351.7,"y":555,"value":[54.40479952711228,-1.3882534423387094]},{"x":1352.5,"y":550.5,"value":[54.4642724401101,-1.3571337028140618]},{"x":1354.1666666666667,"y":553.8333333333334,"value":[54.592040335041496,-1.3802246352993932]},{"x":1354,"y":557.5,"value":[54.580480382642925,-1.4055898942591272]},{"x":1354.5,"y":560.5,"value":[54.619419169669634,-1.42635435010886]},{"x":1354.5,"y":562.75,"value":[54.62010364053534,-1.4419211732260102]},{"x":1355.5,"y":565.5,"value":[54.6969925344494,-1.4609646737562598]},{"x":1355.5,"y":568.3333333333334,"value":[54.697854460724734,-1.4805673399037826]},{"x":1357.5,"y":560.5,"value":[54.84757612490424,-1.4264065002700566]},{"x":1357.5,"y":563.5,"value":[54.84848875272518,-1.447162264426257]},{"x":1357.5,"y":566.5,"value":[54.84940138054612,-1.4679180285824573]},{"x":1357.5,"y":569,"value":[54.85016190373023,-1.4852144987126241]},{"x":1358.5,"y":553.5,"value":[54.92149897840026,-1.3779937672926548]},{"x":1359.5,"y":549.5,"value":[54.996334459717225,-1.3503367984714534]},{"x":1360.5,"y":547,"value":[55.07162625494464,-1.3330577117283515]},{"x":1362,"y":542.5,"value":[55.18433579083054,-1.3019501405746494]},{"x":1363.5,"y":535.125,"value":[55.2961707250547,-1.2509516287712552]},{"x":1363,"y":539,"value":[55.259323376784316,-1.2777524657794812]},{"x":1364.5,"y":527.625,"value":[55.369941473913904,-1.1990796017678198]},{"x":1364,"y":531.5,"value":[55.333094125643505,-1.2258804387760462]},{"x":1365.5,"y":522.75,"value":[55.44451077211642,-1.16536886840106]},{"x":1367.5,"y":518.5,"value":[55.59532251952648,-1.1359996359539069]},{"x":1368.25,"y":522.5,"value":[55.65357859542973,-1.1636870257024734]},{"x":1369.5,"y":524.25,"value":[55.74917635967304,-1.1758162840274222]},{"x":1371.75,"y":526.25,"value":[55.92090249464628,-1.189692572752453]},{"x":1373.5,"y":525.5,"value":[56.053765894911244,-1.1845340526407675]},{"x":1374,"y":528.5,"value":[56.09270468193795,-1.2052985084905008]},{"x":1374.25,"y":532.5,"value":[56.11293459863543,-1.232977206545534]},{"x":1375.5,"y":535.5,"value":[56.20891262447078,-1.2537546999355662]},{"x":1375.5,"y":537.75,"value":[56.209597095336484,-1.2693215230527168]},{"x":1376.5,"y":539.8333333333334,"value":[56.286283183068115,-1.2837526315482548]},{"x":1378.5,"y":530.125,"value":[56.43543445485955,-1.2166194393169034]},{"x":1378,"y":534,"value":[56.398587106589154,-1.2434202763251299]},{"x":1378,"y":536.75,"value":[56.39942368209169,-1.2624463934683137]},{"x":1379.5,"y":525.75,"value":[56.510155857698884,-1.1863679999761771]},{"x":1381.7,"y":527.8,"value":[56.67809458721525,-1.2005893489344577]},{"x":1383.5,"y":531.5,"value":[56.81611433466849,-1.2262194148238232]},{"x":1384.5,"y":535.3333333333334,"value":[56.89333278862902,-1.2527580524104782]},{"x":1385.5,"y":539.1666666666666,"value":[56.97055124258953,-1.2792966899971328]},{"x":1386.5,"y":542.8333333333334,"value":[57.04771899500444,-1.3046822295751102]},{"x":1387.5,"y":546.8333333333334,"value":[57.12498815051057,-1.3323739651704427]},{"x":1388,"y":550,"value":[57.163977639082866,-1.3542915190288531]},{"x":1388.5,"y":553.1666666666666,"value":[57.20296712765519,-1.3762090728872636]},{"x":1389,"y":556.5,"value":[57.24200731777311,-1.399279724754353]},{"x":1389.5,"y":559.3333333333334,"value":[57.28089540325421,-1.4188910825954082]},{"x":1390,"y":562.5,"value":[57.319884891826526,-1.4408086364538186]},{"x":1390.25,"y":566.5,"value":[57.340114808524,-1.4684873345088523]},{"x":1391,"y":569.5,"value":[57.39806667515359,-1.489256136205352]},{"x":1391.25,"y":573,"value":[57.41814448721424,-1.513475540234352]},{"x":1392.75,"y":576.25,"value":[57.53321164497088,-1.5359870264841669]},{"x":1393.5,"y":578.8333333333334,"value":[57.59103675773647,-1.553873083158972]},{"x":1394.5,"y":571.125,"value":[57.66474412966365,-1.5005596836446893]},{"x":1395.7,"y":563.3,"value":[57.753626474191215,-1.4464425922017456]},{"x":1395,"y":567.5,"value":[57.70166753025246,-1.4754884936494803]},{"x":1394.5,"y":575.5,"value":[57.66607504523585,-1.5308285063724818]},{"x":1396.7,"y":556.9,"value":[57.82773185325143,-1.4021810120555838]},{"x":1396.5,"y":560.5,"value":[57.81361654295423,-1.427084452365611]},{"x":1398.5,"y":556.5,"value":[57.96450434268272,-1.399444866931475]},{"x":1399,"y":560.5,"value":[58.00374733898308,-1.4271279108332746]},{"x":1399,"y":563.5,"value":[58.00465996680402,-1.447883674989475]},{"x":1399,"y":566.5,"value":[58.00557259462496,-1.4686394391456754]},{"x":1399.25,"y":569.75,"value":[58.02557435436719,-1.4911291961616588]},{"x":1400.5,"y":574.25,"value":[58.12200869411301,-1.522284571629791]},{"x":1400.5,"y":577.8333333333334,"value":[58.12309877734358,-1.5470761788163645]},{"x":1401.75,"y":580,"value":[58.21882329545091,-1.562088182163007]},{"x":1403.5,"y":575.5,"value":[58.350545910939694,-1.5309849568560714]},{"x":1404.5,"y":578.3333333333334,"value":[58.42746015562657,-1.55060500639066]},{"x":1405.5,"y":582.1666666666666,"value":[58.50467860958707,-1.5771436439773132]},{"x":1406.5,"y":585.1666666666666,"value":[58.58164355581955,-1.5979167915205799]},{"x":1406.5,"y":587.8333333333334,"value":[58.58245478054928,-1.6163663596594247]},{"x":1408,"y":588.5,"value":[58.69673606434902,-1.6210048267747337]},{"x":1409.5,"y":582.8333333333334,"value":[58.80909068941565,-1.5818255695602876]},{"x":1409.5,"y":585.8333333333334,"value":[58.8100033172366,-1.6025813337164876]},{"x":1411.1666666666667,"y":589.1666666666666,"value":[58.93777121216798,-1.625672266201819]},{"x":1411,"y":593,"value":[58.92626196131504,-1.6521906231702306]},{"x":1411.5,"y":595.8333333333334,"value":[58.96515004679613,-1.6718019810112863]},{"x":1412.1666666666667,"y":599.8333333333334,"value":[59.017068429498416,-1.699487922144264]},{"x":1412,"y":603.5,"value":[59.00550847709986,-1.7248531811039975]},{"x":1412,"y":606.5,"value":[59.0064211049208,-1.7456089452601984]},{"x":1412,"y":609.5,"value":[59.007333732741735,-1.7663647094163983]},{"x":1412.5,"y":612.1666666666666,"value":[59.046171116677236,-1.784822969248776]},{"x":1413.1666666666667,"y":616.1666666666666,"value":[59.098089499379505,-1.8125089103817538]},{"x":1413.25,"y":620.75,"value":[59.10582148508468,-1.844220554235981]},{"x":1414.25,"y":624.25,"value":[59.18293853595397,-1.868452995805281]},{"x":1415.75,"y":625.875,"value":[59.297511353640964,-1.8797217764704874]},{"x":1417,"y":621.5,"value":[59.39124583608318,-1.8494746829765272]},{"x":1418,"y":625.5,"value":[59.468514991589295,-1.8771664185718602]},{"x":1418,"y":628.5,"value":[59.46942761941023,-1.8979221827280601]},{"x":1418.5,"y":631.5,"value":[59.50836640643694,-1.9186866385777939]},{"x":1418.5,"y":634.5,"value":[59.50927903425788,-1.9394424027339938]},{"x":1418.25,"y":637.75,"value":[59.49125463479435,-1.9619234680564444]},{"x":1419.5,"y":640.6666666666666,"value":[59.587207309856915,-1.9821244124421367]},{"x":1421.7,"y":622.4,"value":[59.7489655209637,-1.8557831141425951]},{"x":1421,"y":626,"value":[59.696824051460744,-1.8806778627590899]},{"x":1421,"y":629,"value":[59.69773667928168,-1.9014336269152898]},{"x":1421,"y":632,"value":[59.69864930710262,-1.9221893910714907]},{"x":1421,"y":635,"value":[59.69956193492356,-1.9429451552276906]},{"x":1420.5,"y":637.5,"value":[59.6622962989019,-1.9602329336643245]},{"x":1422.7,"y":608.4,"value":[59.82075890954419,-1.7589402648007257]},{"x":1422,"y":612,"value":[59.76861744004122,-1.7838350134172205]},{"x":1422,"y":615,"value":[59.769530067862156,-1.8045907775734213]},{"x":1422,"y":618,"value":[59.77044269568311,-1.8253465417296213]},{"x":1423.7,"y":597.3,"value":[59.89343450501824,-1.68216132080985]},{"x":1423,"y":601,"value":[59.84132345644266,-1.707747928231551]},{"x":1423,"y":604,"value":[59.8422360842636,-1.728503692387751]},{"x":1424.5,"y":591.875,"value":[59.952626024437954,-1.6446418873370408]},{"x":1425.7,"y":583.9,"value":[60.04146273757447,-1.589487007686286]},{"x":1425,"y":588,"value":[59.98947337270834,-1.6178410503288139]},{"x":1426.75,"y":577,"value":[60.11921862791842,-1.5417670026834442]},{"x":1426,"y":579.5,"value":[60.06293991229389,-1.559050435273312]},{"x":1427.5,"y":573.5,"value":[60.175193134269314,-1.5175649820415096]},{"x":1429.7,"y":577.1,"value":[60.34360338815983,-1.5425101424804937]},{"x":1429,"y":580,"value":[60.29124897216533,-1.5625618794605418]},{"x":1430.5,"y":572.125,"value":[60.402931801752665,-1.508104073631114]},{"x":1431.7,"y":562.1,"value":[60.49114488587821,-1.4387660884736233]},{"x":1431,"y":565.5,"value":[60.43894257452052,-1.4622771194797046]},{"x":1431,"y":568.5,"value":[60.439855202341455,-1.483032883635905]},{"x":1432.7,"y":551,"value":[60.56382048135227,-1.3619871444827476]},{"x":1432,"y":555,"value":[60.51180069555878,-1.3896493283200688]},{"x":1432,"y":558,"value":[60.51271332337972,-1.4104050924762692]},{"x":1433.75,"y":540.125,"value":[60.640367139833494,-1.2867657519729403]},{"x":1433,"y":543.5,"value":[60.584354607323384,-1.3101029491083662]},{"x":1433,"y":546.5,"value":[60.58526723514432,-1.3308587132645666]},{"x":1434.5,"y":531,"value":[60.69463046902012,-1.2236466735381297]},{"x":1434,"y":535,"value":[60.65782114690894,-1.2513123340528645]},{"x":1433.5,"y":537.5,"value":[60.62055551088728,-1.2686001124894983]},{"x":1435.7,"y":526.3,"value":[60.784463467527836,-1.1911501697578943]},{"x":1436.5,"y":519.75,"value":[60.84331275151468,-1.1458473247265095]},{"x":1435.5,"y":522.5,"value":[60.76809700860566,-1.164856058482628]},{"x":1437.5,"y":515,"value":[60.9179200758764,-1.113001414866258]},{"x":1439.5,"y":509,"value":[61.068199457057595,-1.0715246533279883]},{"x":1439,"y":512.5,"value":[61.03123803030959,-1.095731019816689]},{"x":1441.75,"y":506,"value":[61.23840454566261,-1.050808001792685]},{"x":1442.5,"y":502.8333333333333,"value":[61.294480455104726,-1.0289121771681065]},{"x":1444,"y":507,"value":[61.409826471362216,-1.0577657024656495]},{"x":1444,"y":510,"value":[61.410739099183154,-1.07852146662185]},{"x":1444.5,"y":513.5,"value":[61.44982999084669,-1.102745216497616]},{"x":1444.5,"y":516.5,"value":[61.450742618667626,-1.1235009806538163]},{"x":1445,"y":520,"value":[61.48983351033116,-1.1477247305295832]},{"x":1445,"y":523,"value":[61.4907461381521,-1.1684804946857836]},{"x":1445.5,"y":526.5,"value":[61.52983702981563,-1.19270424456155]},{"x":1445.5,"y":529.5,"value":[61.53074965763657,-1.2134600087177505]},{"x":1445,"y":531.75,"value":[61.493407969296506,-1.2290181401413678]},{"x":1446.1666666666667,"y":535.1666666666666,"value":[61.58317505579492,-1.2526769299375053]},{"x":1446,"y":539,"value":[61.57166580494198,-1.2791952869059173]},{"x":1446.5,"y":542.5,"value":[61.61075669660551,-1.3034190367816838]},{"x":1446.5,"y":545.5,"value":[61.61166932442645,-1.3241748009378842]},{"x":1447,"y":549,"value":[61.650760216089985,-1.3483985508136507]},{"x":1447.25,"y":552.75,"value":[61.67091408046904,-1.3743476018556673]},{"x":1448,"y":556,"value":[61.728941999417025,-1.3968460505651836]},{"x":1448,"y":559,"value":[61.72985462723796,-1.417601814721384]},{"x":1448.5,"y":562.1666666666666,"value":[61.76884411581029,-1.4395193685797945]},{"x":1449.5,"y":566.1666666666666,"value":[61.846113271316405,-1.467211104175127]},{"x":1450.5,"y":567.75,"value":[61.922647254411224,-1.4781829186446318]},{"x":1451.75,"y":571,"value":[62.01870133256501,-1.5006900590476806]},{"x":1451,"y":573.5,"value":[61.962422616940465,-1.517973491637549]},{"x":1453.7,"y":558.4,"value":[62.16317031661955,-1.413549747196417]},{"x":1453,"y":562,"value":[62.11102884711659,-1.4384444958129117]},{"x":1453,"y":565,"value":[62.111941474937545,-1.459200259969112]},{"x":1453,"y":567.75,"value":[62.11277805044006,-1.4782263771122954]},{"x":1454.7,"y":550.1,"value":[62.236697698059835,-1.3561428497513286]},{"x":1454.5,"y":554.1666666666666,"value":[62.222724352090346,-1.3842749644856531]},{"x":1457,"y":552,"value":[62.412196028026294,-1.369328148840506]},{"x":1457,"y":555,"value":[62.41310865584723,-1.3900839129967064]},{"x":1457,"y":558,"value":[62.41402128366817,-1.4108396771529068]},{"x":1457,"y":561,"value":[62.41493391148911,-1.4315954413091072]},{"x":1457.5,"y":564.1666666666666,"value":[62.45392340006142,-1.4535129951675176]},{"x":1457.5,"y":567,"value":[62.454785326336754,-1.4731156613150405]},{"x":1458,"y":570.5,"value":[62.49387621800029,-1.497339411190807]},{"x":1458,"y":573.5,"value":[62.494788845821226,-1.5180951753470073]},{"x":1458,"y":576.5,"value":[62.495701473642164,-1.5388509395032073]},{"x":1458.5,"y":579.5,"value":[62.53464026066887,-1.559615395352941]},{"x":1458.5,"y":582.3333333333334,"value":[62.53550218694421,-1.5792180615004638]},{"x":1459,"y":585.5,"value":[62.57449167551652,-1.6011356153588747]},{"x":1459,"y":588.5,"value":[62.57540430333746,-1.6218913795150747]},{"x":1459.5,"y":592.1666666666666,"value":[62.614545896546595,-1.6472682273995178]},{"x":1459.5,"y":595.1666666666666,"value":[62.61545852436753,-1.6680239915557187]},{"x":1459,"y":597,"value":[62.577990082163446,-1.6806993779576422]},{"x":1462.5,"y":589.5,"value":[62.84189162705149,-1.6288708094218705]},{"x":1462,"y":593.5,"value":[62.80508230494029,-1.6565364699366047]},{"x":1461.8333333333333,"y":596.6666666666666,"value":[62.793370247904924,-1.678442434870305]},{"x":1463.75,"y":579.5,"value":[62.93391493232945,-1.5597066581350343]},{"x":1463,"y":582.5,"value":[62.87778832134173,-1.5804493847509353]},{"x":1463,"y":585.5,"value":[62.87870094916267,-1.6012051489071362]},{"x":1464.5,"y":570.5,"value":[62.98821628767529,-1.4974524032067325]},{"x":1464,"y":574.5,"value":[62.9514069655641,-1.5251180637214667]},{"x":1463.5,"y":576.5,"value":[62.91398922490563,-1.5389465481320674]},{"x":1465.5,"y":563.1666666666666,"value":[63.06203773808007,-1.446733474211975]},{"x":1465,"y":566.5,"value":[63.025025609786475,-1.4697867426919982]},{"x":1466.75,"y":559.875,"value":[63.156101780568754,-1.4239815177744206]},{"x":1469.5,"y":554.75,"value":[63.36368658367304,-1.3885715583220084]},{"x":1469.75,"y":558.25,"value":[63.383764395733685,-1.4127909623510084]},{"x":1468.5,"y":560.5,"value":[63.28938346858498,-1.4283360562343268]},{"x":1471.5,"y":555.5,"value":[63.516019377451364,-1.3937952661351893]},{"x":1472,"y":559,"value":[63.555110269114884,-1.4180190160109558]},{"x":1472,"y":562,"value":[63.55602289693582,-1.4387747801671562]},{"x":1472.25,"y":565.75,"value":[63.57617676131489,-1.4647238312091728]},{"x":1473.5,"y":569.1666666666666,"value":[63.67228154101428,-1.4883840696208992]},{"x":1473.5,"y":571.3333333333334,"value":[63.67294066110717,-1.5033743437337113]},{"x":1476,"y":571.5,"value":[63.86312215868161,-1.5045709002100525]},{"x":1476.5,"y":573.25,"value":[63.901680684116265,-1.516687120994702]},{"x":1477,"y":576,"value":[63.94054341882457,-1.5357219298314182]},{"x":1477.5,"y":579.5,"value":[63.9796343104881,-1.5599456797071851]},{"x":1477,"y":581.75,"value":[63.94229262214804,-1.5755038111308024]},{"x":1478.1666666666667,"y":585.1666666666666,"value":[64.03205970864644,-1.5991626009269404]},{"x":1478,"y":589,"value":[64.02055045779349,-1.625680957895352]},{"x":1478.25,"y":592.5,"value":[64.04062826985415,-1.649900361924352]},{"x":1479,"y":595.5,"value":[64.09858013648375,-1.6706691636208517]},{"x":1479.5,"y":599.1666666666666,"value":[64.13772172969288,-1.6960460115052949]},{"x":1479.5,"y":602.1666666666666,"value":[64.13863435751381,-1.7168017756614957]},{"x":1479.5,"y":605.1666666666666,"value":[64.13954698533476,-1.7375575398176957]},{"x":1479,"y":607.25,"value":[64.10215459544906,-1.7519625732326367]},{"x":1480.7,"y":610.9,"value":[64.23255390059751,-1.7772449713806915]},{"x":1480.5,"y":614.3333333333334,"value":[64.2183878887547,-1.8009953136820411]},{"x":1482.7,"y":597.9,"value":[64.38070381686319,-1.6873380934779543]},{"x":1482.5,"y":601.8333333333334,"value":[64.3666899096572,-1.714547729805337]},{"x":1482.5,"y":604.8333333333334,"value":[64.36760253747815,-1.735303493961537]},{"x":1482.5,"y":607.8333333333334,"value":[64.36851516529907,-1.7560592581177379]},{"x":1483.5,"y":610.8333333333334,"value":[64.44548011153157,-1.7768324056610036]},{"x":1484.1666666666667,"y":614.8333333333334,"value":[64.49739849423383,-1.8045183467939814]},{"x":1484,"y":618.5,"value":[64.48583854183528,-1.829883605753715]},{"x":1484.5,"y":621.5,"value":[64.524777328862,-1.8506480616034486]},{"x":1484.5,"y":624.5,"value":[64.52568995668292,-1.8714038257596486]},{"x":1484.5,"y":601.5,"value":[64.51869314338907,-1.7122763005621127]},{"x":1484.5,"y":604.5,"value":[64.51960577121002,-1.7330320647183135]},{"x":1484.5,"y":607.5,"value":[64.52051839903095,-1.7537878288745135]},{"x":1485.1666666666667,"y":628.8333333333334,"value":[64.57770974247643,-1.9013959629099815]},{"x":1485,"y":632.5,"value":[64.56614979007787,-1.926761221869715]},{"x":1485,"y":635.5,"value":[64.56706241789882,-1.947516986025915]},{"x":1485.5,"y":638.5,"value":[64.60600120492552,-1.9682814418756487]},{"x":1485.5,"y":641.5,"value":[64.60691383274647,-1.9890372060318486]},{"x":1486.1666666666667,"y":645.8333333333334,"value":[64.65893361853995,-2.0190293431821824]},{"x":1486.5,"y":649.1666666666666,"value":[64.68529842225595,-2.042097097818093]},{"x":1486.5,"y":652.1666666666666,"value":[64.6862110500769,-2.0628528619742936]},{"x":1486.75,"y":655.5,"value":[64.70623816059191,-2.0859191679946156]},{"x":1485.5,"y":657,"value":[64.61162907648799,-2.0962753208388842]},{"x":1489,"y":650.5,"value":[64.87583483064967,-2.0513653403551797]},{"x":1489.5,"y":653.8333333333334,"value":[64.9148750207676,-2.0744359922222686]},{"x":1489.5,"y":656.3333333333334,"value":[64.91563554395171,-2.0917324623524354]},{"x":1492.3,"y":655.1,"value":[65.12820684406651,-2.0832482105720023]},{"x":1493.5,"y":658.75,"value":[65.22057999000916,-2.108521917026526]},{"x":1494.1666666666667,"y":663.1666666666666,"value":[65.27262512657546,-2.1390906031811965]},{"x":1494.5,"y":667.1666666666666,"value":[65.29919273647388,-2.166770749851819]},{"x":1494.25,"y":670.5,"value":[65.28119368778317,-2.189828364178609]},{"x":1495.75,"y":673.25,"value":[65.39610874090297,-2.208880556402391]},{"x":1495.5,"y":677.25,"value":[65.37831249839468,-2.2365505627638913]},{"x":1497.5,"y":656.5,"value":[65.52410479278961,-2.093024627457637]},{"x":1497.5,"y":659.5,"value":[65.52501742061054,-2.113780391613837]},{"x":1497,"y":662.5,"value":[65.48790388922572,-2.134527464076504]},{"x":1497,"y":665.5,"value":[65.48881651704664,-2.155283228232705]},{"x":1497,"y":668.5,"value":[65.4897291448676,-2.176038992388905]},{"x":1498.75,"y":635.25,"value":[65.61270574373904,-1.9460263605850492]},{"x":1498.5,"y":638.6666666666666,"value":[65.59473204582113,-1.9696605239161777]},{"x":1498,"y":641.5,"value":[65.55756781289068,-1.9892544983701677]},{"x":1498,"y":644.5,"value":[65.55848044071163,-2.0100102625263685]},{"x":1498,"y":647.5,"value":[65.55939306853256,-2.0307660266825684]},{"x":1498,"y":650.5,"value":[65.56030569635351,-2.0515217908387693]},{"x":1498,"y":653.5,"value":[65.56121832417443,-2.0722775549949692]},{"x":1497.5,"y":671.5,"value":[65.52866793189429,-2.1968034482386387]},{"x":1497.5,"y":674.5,"value":[65.52958055971524,-2.2175592123948387]},{"x":1497.5,"y":677.5,"value":[65.53049318753617,-2.2383149765510395]},{"x":1499.7,"y":623,"value":[65.68122888262786,-1.8612901711649443]},{"x":1499,"y":627,"value":[65.62920909683436,-1.888952355002265]},{"x":1499,"y":630,"value":[65.63012172465531,-1.909708119158466]},{"x":1498.5,"y":632.5,"value":[65.59285608863365,-1.9269958975950998]},{"x":1500.75,"y":612.25,"value":[65.75781356726827,-1.786933602161644]},{"x":1500,"y":615.5,"value":[65.70176300859896,-1.8094059757905625]},{"x":1500,"y":618.5,"value":[65.70267563641988,-1.8301617399467625]},{"x":1501.7,"y":600.4,"value":[65.82645838986653,-1.7049648479623651]},{"x":1501,"y":604,"value":[65.77431692036356,-1.72985959657886]},{"x":1501,"y":607,"value":[65.77522954818451,-1.7506153607350607]},{"x":1500.5,"y":609.5,"value":[65.73796391216285,-1.7679031391716946]},{"x":1502.5,"y":582.875,"value":[65.8819689770751,-1.583730499059547]},{"x":1502.75,"y":586.75,"value":[65.90216086761336,-1.610544373608073]},{"x":1502,"y":590,"value":[65.84611030894405,-1.6330167472369914]},{"x":1502,"y":593,"value":[65.847022936765,-1.6537725113931914]},{"x":1502,"y":596,"value":[65.84793556458595,-1.6745282755493922]},{"x":1503.7,"y":563.7,"value":[65.9673985463468,-1.4510874332256463]},{"x":1503,"y":567,"value":[65.91516581406174,-1.4739066054265204]},{"x":1503,"y":570,"value":[65.91607844188269,-1.4946623695827204]},{"x":1503,"y":573,"value":[65.91699106970361,-1.5154181337389208]},{"x":1503,"y":576,"value":[65.91790369752457,-1.5361738978951212]},{"x":1503,"y":579,"value":[65.91881632534549,-1.556929662051321]},{"x":1504.7,"y":552.9,"value":[66.04016540460296,-1.3763840656503898]},{"x":1504.5,"y":556.6666666666666,"value":[66.02610079585136,-1.4024406039690946]},{"x":1504,"y":559.5,"value":[65.98893656292091,-1.422034578423085]},{"x":1505.5,"y":548.8333333333334,"value":[66.09977014161933,-1.3482623809483045]},{"x":1506.5,"y":552.5,"value":[66.17693789403427,-1.3736479205262815]},{"x":1507,"y":555.5,"value":[66.21587668106096,-1.3944123763760148]},{"x":1507,"y":558.5,"value":[66.21678930888191,-1.4151681405322147]},{"x":1507,"y":561.5,"value":[66.21770193670284,-1.4359239046884151]},{"x":1507,"y":564.5,"value":[66.21861456452379,-1.4566796688446155]},{"x":1507.5,"y":568.1666666666666,"value":[66.25775615773293,-1.4820565167290591]},{"x":1507.25,"y":571.5,"value":[66.23975710904219,-1.5051141310558491]},{"x":1508,"y":574.5,"value":[66.29770897567178,-1.5258829327523489]},{"x":1508,"y":577.5,"value":[66.29862160349273,-1.5466386969085488]},{"x":1508,"y":580.5,"value":[66.29953423131366,-1.5673944610647488]},{"x":1508.5,"y":583.5,"value":[66.33847301834035,-1.5881589169144825]},{"x":1508.25,"y":586.75,"value":[66.32044861887681,-1.610639982236933]},{"x":1509.75,"y":589,"value":[66.43521156735983,-1.626232880434681]},{"x":1511.5,"y":581.5,"value":[66.56602155502767,-1.5743738909715455]},{"x":1511.5,"y":584.5,"value":[66.56693418284863,-1.5951296551277454]},{"x":1512,"y":578.5,"value":[66.60313508641252,-1.5536268185088775]},{"x":1512.5,"y":587.3333333333334,"value":[66.64384842753549,-1.614749704662334]},{"x":1513.5,"y":590.3333333333334,"value":[66.72081337376795,-1.6355228522056007]},{"x":1514.75,"y":581.25,"value":[66.81311553754676,-1.5727007399664923]},{"x":1514.5,"y":584.8333333333334,"value":[66.79519254117446,-1.597488001306298]},{"x":1514,"y":592.75,"value":[66.75957470538503,-1.65225146502496]},{"x":1515,"y":588,"value":[66.83418202974676,-1.6194055551647089]},{"x":1516.5,"y":561.5,"value":[66.94019896161245,-1.4360890468655372]},{"x":1516.5,"y":564.5,"value":[66.9411115894334,-1.4568448110217376]},{"x":1516,"y":567.5,"value":[66.90399805804856,-1.477591883484405]},{"x":1516,"y":570.5,"value":[66.90491068586951,-1.4983476476406055]},{"x":1516,"y":573.5,"value":[66.90582331369043,-1.5191034117968059]},{"x":1516,"y":576.5,"value":[66.90673594151139,-1.5398591759530063]},{"x":1517,"y":546.5,"value":[66.97366198171352,-1.3323189177780685]},{"x":1517,"y":549.5,"value":[66.97457460953447,-1.353074681934269]},{"x":1517,"y":552.5,"value":[66.9754872373554,-1.3738304460904693]},{"x":1517,"y":555.5,"value":[66.97639986517635,-1.3945862102466697]},{"x":1517,"y":558.5,"value":[66.97731249299727,-1.4153419744028697]},{"x":1516.5,"y":579.5,"value":[66.94567472853808,-1.560623631802739]},{"x":1516.5,"y":582,"value":[66.94643525172219,-1.5779201019329059]}],"autoDetectionData":{"fgColor":[0,0,255],"bgColor":[255,255,255],"mask":[[730724,24],[730750,1],[732884,24],[732910,34],[735041,65],[735108,1],[737201,77],[739361,80],[741521,83],[743681,85],[743772,1],[745841,93],[748001,95],[750160,98],[752314,111],[754474,115],[756634,134],[758794,134],[760954,134],[761089,2],[763114,140],[763255,1],[765274,145],[767434,152],[769592,158],[771752,159],[773912,161],[776071,165],[778231,168],[780391,173],[782551,49],[782613,113],[784711,46],[784758,1],[784779,1],[784781,108],[784890,1],[786871,44],[786949,1],[786951,101],[789031,43],[789116,102],[791190,43],[791277,107],[793350,42],[793441,104],[795510,41],[795608,99],[797670,40],[797769,104],[797874,1],[799830,40],[799931,111],[801990,25],[802101,105],[804150,25],[804264,111],[804460,23],[806310,25],[806425,111],[806537,1],[806615,29],[808470,25],[808584,118],[808773,31],[810629,25],[810764,103],[810931,33],[812788,25],[812930,103],[813086,38],[814947,26],[815094,109],[815238,46],[817107,26],[817255,111],[817398,46],[819268,25],[819419,115],[819558,46],[821428,25],[821580,125],[821718,45],[823588,25],[823741,124],[823878,46],[825747,26],[825910,115],[826026,1],[826038,47],[827907,26],[828072,115],[828196,49],[830068,24],[830239,109],[830353,52],[832227,25],[832401,107],[832512,54],[834388,23],[834562,106],[834671,55],[836547,24],[836723,163],[838707,24],[838885,162],[840866,25],[841053,154],[843026,25],[843218,149],[845187,23],[845382,145],[847347,23],[847546,2],[847550,137],[849507,23],[849715,132],[851667,23],[851878,1],[851882,126],[853827,23],[854045,124],[855986,24],[856210,119],[858146,24],[858378,84],[858463,26],[860305,25],[860543,79],[860624,25],[862466,24],[862707,75],[862784,25],[864625,25],[864876,66],[864945,24],[865151,24],[866785,25],[867039,63],[867105,25],[867310,25],[868945,24],[869202,49],[869265,26],[869470,25],[871105,24],[871363,47],[871425,26],[871630,25],[873265,24],[873523,47],[873585,27],[873790,25],[875425,24],[875683,46],[875746,27],[875950,25],[877585,24],[877843,45],[877907,37],[878107,28],[879745,24],[880008,36],[880067,37],[880267,28],[881905,24],[882169,34],[882227,37],[882426,29],[884065,24],[884331,31],[884387,39],[884586,29],[886225,23],[886494,27],[886547,41],[886746,29],[888655,22],[888707,43],[888906,29],[890818,18],[890867,46],[891066,29],[893027,47],[893226,29],[895187,48],[895386,29],[897347,50],[897546,30],[899507,58],[899706,30],[901667,59],[901866,30],[903829,58],[904026,31],[905990,58],[906186,31],[908150,60],[908345,32],[910310,65],[910504,34],[912470,68],[912664,34],[914631,68],[914823,35],[916792,69],[916983,35],[918956,66],[919143,35],[919187,13],[921118,65],[921303,35],[921346,16],[923281,63],[923463,35],[923506,17],[925441,64],[925623,35],[925665,19],[927601,68],[927782,36],[927820,32],[929773,57],[929942,36],[929980,32],[931935,1],[931938,60],[932102,37],[932140,32],[934099,59],[934262,38],[934301,31],[936261,57],[936421,71],[938422,56],[938581,71],[940583,55],[940741,71],[942745,53],[942901,71],[944908,50],[945061,71],[947070,52],[947218,74],[949235,51],[949377,75],[949456,20],[951397,50],[951534,78],[951616,20],[953558,50],[953614,1],[953693,80],[953775,21],[955721,57],[955842,114],[957883,60],[958002,114],[960045,60],[960162,114],[962208,58],[962322,114],[964369,58],[964482,114],[966530,59],[966642,114],[968691,60],[968802,114],[970852,69],[970962,114],[973015,66],[973123,113],[975176,65],[975282,114],[977338,68],[977440,117],[979499,72],[979600,117],[981660,83],[981759,118],[983821,82],[983918,120],[985983,215],[988144,214],[990305,213],[992467,126],[992604,74],[994629,123],[994764,74],[996792,117],[996910,1],[996924,25],[996950,49],[998954,113],[999084,24],[999109,51],[1001116,107],[1001244,23],[1001269,51],[1003282,101],[1003404,22],[1003429,51],[1005452,91],[1005564,20],[1005589,52],[1007615,88],[1007749,52],[1009776,87],[1009909,52],[1011937,86],[1012069,52],[1014098,85],[1014229,53],[1016258,85],[1016389,53],[1016471,2],[1018418,84],[1018549,53],[1018630,3],[1018648,3],[1020578,79],[1020709,54],[1020789,5],[1020806,6],[1022751,65],[1022869,54],[1022948,8],[1022965,7],[1024913,62],[1025029,55],[1025108,24],[1027075,59],[1027189,55],[1027268,25],[1029236,1],[1029241,52],[1029349,55],[1029427,27],[1031402,50],[1031509,56],[1031586,29],[1033573,38],[1033669,56],[1033746,29],[1035829,56],[1035906,29],[1037990,55],[1038065,32],[1040151,54],[1040224,33],[1042312,53],[1042384,34],[1044473,52],[1044544,34],[1046634,51],[1046704,34],[1048795,50],[1048863,35],[1050956,24],[1050981,24],[1051022,37],[1053117,21],[1053141,24],[1053183,37],[1055278,19],[1055301,79],[1057443,13],[1057461,80],[1059604,1],[1059615,1],[1059621,81],[1061781,82],[1061944,1],[1063942,82],[1064104,1],[1066102,82],[1066264,1],[1068263,81],[1068424,2],[1070422,84],[1070584,2],[1072582,85],[1072744,2],[1072784,24],[1074743,85],[1074904,3],[1074944,24],[1076903,86],[1077064,3],[1077104,24],[1079063,93],[1079224,3],[1079264,24],[1081223,93],[1081384,4],[1081424,25],[1083383,93],[1083544,4],[1083585,24],[1085543,93],[1085704,4],[1085745,25],[1087703,93],[1087864,5],[1087905,26],[1089863,93],[1090024,5],[1090065,27],[1092023,59],[1092084,45],[1092184,5],[1092225,27],[1094183,58],[1094244,45],[1094344,6],[1094385,26],[1096343,57],[1096405,45],[1096504,6],[1096546,27],[1098503,57],[1098565,45],[1098642,1],[1098664,6],[1098706,26],[1100663,57],[1100726,45],[1100793,18],[1100812,1],[1100824,6],[1100866,26],[1102823,56],[1102886,45],[1102952,39],[1103027,25],[1104984,55],[1105047,45],[1105111,40],[1105187,26],[1107144,55],[1107208,44],[1107270,41],[1107347,27],[1109304,55],[1109369,44],[1109429,43],[1109507,26],[1111464,54],[1111530,43],[1111588,44],[1111668,26],[1113624,53],[1113690,44],[1113747,45],[1113828,26],[1115784,52],[1115850,44],[1115906,47],[1115989,25],[1117944,52],[1118010,45],[1118066,47],[1118149,25],[1120104,51],[1120170,46],[1120225,48],[1120309,25],[1122264,50],[1122330,46],[1122384,50],[1122469,25],[1124427,46],[1124490,46],[1124544,50],[1124629,25],[1126587,33],[1126621,10],[1126650,47],[1126704,50],[1126789,26],[1128759,21],[1128782,8],[1128810,47],[1128863,52],[1128949,26],[1130921,19],[1130943,7],[1130970,47],[1131024,51],[1131109,26],[1133104,5],[1133130,47],[1133184,51],[1133269,26],[1135265,3],[1135290,47],[1135344,52],[1135429,26],[1137426,1],[1137450,48],[1137504,52],[1137589,26],[1139610,48],[1139664,52],[1139749,26],[1141770,49],[1141823,54],[1141909,26],[1143930,49],[1143983,54],[1144069,26],[1146090,49],[1146142,55],[1146229,26],[1148250,49],[1148302,56],[1148389,27],[1150411,49],[1150462,56],[1150549,27],[1152571,48],[1152621,57],[1152708,29],[1154732,48],[1154781,25],[1154807,32],[1154868,29],[1156892,74],[1156968,31],[1157028,29],[1159052,74],[1159128,31],[1159188,30],[1159257,18],[1161213,72],[1161289,31],[1161348,30],[1161394,1],[1161417,18],[1163373,72],[1163450,30],[1163508,31],[1163553,3],[1163577,18],[1165534,70],[1165610,30],[1165668,31],[1165712,4],[1165737,18],[1167693,71],[1167770,31],[1167828,31],[1167871,5],[1167897,18],[1169853,70],[1169931,30],[1169987,33],[1170030,7],[1170057,18],[1172013,70],[1172092,29],[1172147,32],[1172189,8],[1172217,18],[1174174,68],[1174253,29],[1174307,32],[1174348,9],[1174377,18],[1176333,69],[1176413,29],[1176466,33],[1176507,11],[1176537,18],[1178493,68],[1178574,29],[1178608,1],[1178626,34],[1178666,12],[1178697,30],[1180653,68],[1180734,34],[1180786,34],[1180825,13],[1180857,31],[1182813,23],[1182837,44],[1182895,34],[1182944,37],[1182984,15],[1183016,32],[1184973,67],[1185056,32],[1185103,38],[1185143,16],[1185176,32],[1187133,23],[1187157,43],[1187216,32],[1187262,57],[1187335,33],[1189293,23],[1189319,41],[1189377,31],[1189422,58],[1189495,33],[1191453,23],[1191480,39],[1191537,31],[1191582,58],[1191655,33],[1193613,23],[1193640,39],[1193698,32],[1193742,58],[1193815,31],[1195773,23],[1195800,39],[1195858,35],[1195901,60],[1195975,31],[1197933,23],[1197961,38],[1198020,33],[1198061,60],[1198135,30],[1200093,23],[1200122,36],[1200180,33],[1200221,60],[1200295,29],[1202254,22],[1202282,36],[1202340,33],[1202381,61],[1202455,28],[1204414,22],[1204443,35],[1204501,32],[1204541,61],[1204615,26],[1206573,23],[1206604,34],[1206662,31],[1206700,62],[1206775,26],[1208733,23],[1208766,32],[1208822,31],[1208859,63],[1208935,25],[1210893,23],[1210926,32],[1210983,31],[1211018,65],[1211095,24],[1213053,23],[1213088,30],[1213143,32],[1213177,66],[1213255,24],[1215213,23],[1215248,30],[1215304,31],[1215338,66],[1215415,24],[1217373,23],[1217410,28],[1217464,31],[1217498,66],[1217575,24],[1219533,23],[1219571,27],[1219624,32],[1219658,67],[1219735,24],[1221693,23],[1221732,26],[1221784,33],[1221818,67],[1221895,24],[1223853,23],[1223892,26],[1223944,33],[1223978,67],[1224055,24],[1226013,23],[1226052,26],[1226104,101],[1226215,24],[1228173,23],[1228212,26],[1228264,102],[1228375,24],[1230333,23],[1230372,26],[1230424,58],[1230483,43],[1230535,24],[1232493,23],[1232532,26],[1232584,57],[1232643,44],[1232695,24],[1234653,23],[1234692,26],[1234744,57],[1234803,44],[1234855,24],[1236813,23],[1236877,1],[1236904,57],[1236963,44],[1237015,24],[1238973,23],[1239064,56],[1239123,45],[1239175,24],[1241134,13],[1241148,8],[1241224,56],[1241290,38],[1241335,24],[1243293,23],[1243384,56],[1243450,39],[1243495,24],[1245453,14],[1245468,8],[1245544,56],[1245610,39],[1245655,24],[1247613,13],[1247629,7],[1247704,56],[1247770,39],[1247815,24],[1249773,14],[1249789,7],[1249864,56],[1249930,39],[1249975,24],[1251933,13],[1251950,6],[1252025,54],[1252090,39],[1252135,24],[1254093,12],[1254110,6],[1254184,55],[1254250,39],[1254295,24],[1256253,13],[1256270,6],[1256345,54],[1256411,38],[1256455,23],[1258413,12],[1258431,5],[1258506,53],[1258571,39],[1258614,24],[1260573,11],[1260591,5],[1260666,53],[1260731,39],[1260774,24],[1262733,12],[1262752,4],[1262826,53],[1262892,38],[1262934,24],[1264893,11],[1264912,4],[1264987,52],[1265052,38],[1265092,26],[1267053,10],[1267072,4],[1267147,52],[1267212,39],[1267252,25],[1269213,11],[1269233,3],[1269307,52],[1269372,39],[1269412,26],[1271373,10],[1271393,3],[1271467,51],[1271532,65],[1273533,9],[1273554,2],[1273628,50],[1273692,65],[1275693,10],[1275714,2],[1275788,50],[1275852,65],[1277853,9],[1277874,2],[1277949,48],[1278012,65],[1280013,8],[1280035,1],[1280110,47],[1280173,64],[1282173,9],[1282271,46],[1282333,64],[1284333,8],[1284432,45],[1284493,64],[1286493,7],[1286593,44],[1286653,64],[1288653,8],[1288754,43],[1288813,63],[1290813,7],[1290915,42],[1290974,62],[1292973,6],[1293075,42],[1293148,48],[1295133,7],[1295236,42],[1295308,47],[1297293,6],[1297396,41],[1297468,47],[1299453,5],[1299557,40],[1299628,47],[1301613,6],[1301717,40],[1301788,46],[1303773,5],[1303878,39],[1303948,46],[1305933,4],[1306038,39],[1306108,46],[1308093,4],[1308199,37],[1308268,46],[1310253,4],[1310359,36],[1310428,45],[1312413,3],[1312520,34],[1312588,45],[1314573,3],[1314680,34],[1314748,45],[1316733,3],[1316841,33],[1316908,44],[1318893,2],[1319001,33],[1319068,44],[1321053,2],[1321162,32],[1321229,43],[1323213,2],[1323322,32],[1323388,43],[1325373,1],[1325483,31],[1325548,43],[1327643,31],[1327709,42],[1329803,31],[1329869,42],[1331963,31],[1332029,42],[1334123,31],[1334189,43],[1336283,31],[1336349,41],[1338443,31],[1338509,42],[1340603,31],[1340670,41],[1342763,31],[1342830,41],[1344923,32],[1344990,41],[1347083,32],[1347150,41],[1349243,32],[1349310,41],[1351403,32],[1351470,41],[1353563,32],[1353630,41],[1355723,32],[1355791,40],[1357884,31],[1357951,40],[1360044,31],[1360110,41],[1362204,31],[1362271,40],[1364365,30],[1364431,40],[1366524,31],[1366592,39],[1368685,30],[1368753,38],[1370851,24],[1370913,38],[1373011,24],[1373073,38],[1375171,24],[1375233,38],[1377331,13],[1377394,37],[1379491,13],[1379554,37],[1381651,13],[1381715,36],[1383811,13],[1383875,36],[1385971,13],[1386035,36],[1388131,13],[1388196,35],[1390291,13],[1390357,34],[1392451,13],[1392517,34],[1394623,1],[1394677,34],[1396838,33],[1398997,34],[1401157,34],[1403317,34],[1405477,34],[1407637,34],[1409797,34],[1411957,34],[1414117,34],[1416277,34],[1418437,34],[1420597,34],[1422757,34],[1424918,33],[1427079,32],[1429239,32],[1431399,32],[1433561,30],[1435722,29],[1437882,29],[1440042,29],[1442202,29],[1444362,29],[1446522,28],[1448682,17],[1450842,17],[1453002,17],[1455163,16],[1457323,16],[1459484,15],[1461645,14],[1463804,15],[1465966,13]],"colorDetectionMode":"fg","colorDistance":120,"algorithm":{"algoType":"AveragingWindowAlgo","xStep":2,"yStep":2},"name":3,"imageWidth":2160,"imageHeight":1215}}],"measurementColl":[]} \ No newline at end of file diff --git a/Functions/Theory/Dissertation/PD/70ghz_pd_bandwidth.csv b/Functions/Theory/Dissertation/PD/70ghz_pd_bandwidth.csv new file mode 100644 index 0000000..87a54da --- /dev/null +++ b/Functions/Theory/Dissertation/PD/70ghz_pd_bandwidth.csv @@ -0,0 +1,336 @@ +-7,105427357601002e-15; -0,20522295068752294 +0,19999999999999574; -0,030254119194939477 +0,39999999999998437; -0,06262230958084825 +0,5999999999999943; -0,044750988038462225 +0,79999999999999; -0,010697832675218066 +0,9999999999999929; -0,007716070877040071 +1,1999999999999886; -0,0034636603575668445 +1,3999999999999915; -0,0031910951680633737 +1,5999999999999943; -0,018902533473217353 +1,79999999999999; -0,053402356238265725 +1,9999999999999858; -0,016020039340308045 +2,1999999999999957; -0,03803455116762944 +2,3999999999999915; -0,027441706124275544 +2,5999999999999943; -0,011772163020613569 +2,799999999999997; -0,009307744420832709 +2,999999999999993; -0,004522003719798828 +3,1999999999999957; -0,004428713345979496 +3,3999999999999986; -0,004366538233070205 +3,6000000000000014; -0,004332966081604717 +3,8000000000000043; -0,004325484592115458 +3,999999999999993; -0,00434158146513397 +4,200000000000003; -0,004378744401192236 +4,3999999999999915; -0,004434461100823572 +4,599999999999994; -0,004506219264559075 +4,800000000000004; -0,004691539083670371 +5; -0,003991004145723398 +5,200000000000003; -0,003246645775397461 +5,3999999999999915; -0,0037896250865734338 +5,599999999999994; -0,023040865733948923 +5,799999999999997; -0,01989208568211387 +5,999999999999993; -0,0010096736725997424 +6,199999999999996; -0,013640471154773515 +6,399999999999999; -0,022016055829107817 +6,599999999999994; -0,02380673595648508 +6,799999999999997; -0,010201242210113204 +7; -0,004611668103098321 +7,200000000000003; -0,006761186983221812 +7,399999999999999; -0,014690649105665976 +7,600000000000001; -0,00390457347586759 +7,799999999999997; -0,045710767178201106 +8; -0,051072792534853306 +8,199999999999996; -0,07115209529133537 +8,399999999999991; -0,08208254896261469 +8,599999999999994; -0,03145294469160209 +8,799999999999997; -0,05983935104068827 +8,999999999999993; -0,03242609227466575 +9,199999999999996; -0,08006336213732856 +9,399999999999999; -0,07616115793078393 +9,599999999999994; -0,06914618045986609 +9,79999999999999; -0,0980170516533656 +9,999999999999979; -0,09444267414680585 +10,199999999999996; -0,1296597291950028 +10,399999999999999; -0,11722924677565816 +10,599999999999987; -0,1261332014641745 +10,799999999999983; -0,14295450195563753 +10,999999999999986; -0,13583779081780678 +11,199999999999989; -0,13655730701500968 +11,399999999999991; -0,1528394332576566 +11,59999999999998; -0,1455635480829094 +11,799999999999983; -0,15279717820688443 +11,999999999999986; -0,10865677433838528 +12,199999999999982; -0,08239755649864788 +12,39999999999997; -0,09832039720463737 +12,59999999999998; -0,09759344817184923 +12,799999999999983; -0,08609094120940997 +12,999999999999986; -0,13125303885294937 +13,199999999999982; -0,17127202835872835 +13,399999999999977; -0,17693756228526825 +13,599999999999987; -0,17588170560175698 +13,799999999999976; -0,21097131291045912 +13,999999999999979; -0,19723442280681303 +14,199999999999974; -0,17157649801758756 +14,399999999999977; -0,18397126413186138 +14,599999999999973; -0,22900338921732688 +14,799999999999969; -0,2093816161727191 +14,999999999999972; -0,19030766934459553 +15,199999999999974; -0,1930304944542227 +15,39999999999997; -0,16656555782418714 +15,599999999999959; -0,17578057654064638 +15,799999999999962; -0,18022738188194465 +15,999999999999964; -0,20411747466271102 +16,199999999999967; -0,24005694593094873 +16,39999999999997; -0,2409966294337953 +16,59999999999996; -0,23769655914941312 +16,79999999999996; -0,2461254200795704 +16,999999999999964; -0,18731174872333556 +17,199999999999967; -0,2088294036646947 +17,39999999999997; -0,26222359684914354 +17,59999999999996; -0,2627551021676209 +17,799999999999976; -0,23263650093640598 +17,99999999999995; -0,25096659518845055 +18,199999999999967; -0,28136295333973704 +18,399999999999956; -0,26386838346721 +18,599999999999945; -0,2697397873853724 +18,79999999999996; -0,27151761208872793 +18,99999999999995; -0,30006432628995094 +19,199999999999953; -0,32687710754417765 +19,39999999999997; -0,34133822014109505 +19,599999999999945; -0,35107178825199314 +19,79999999999996; -0,3207896032858475 +19,999999999999964; -0,3126066108279488 +20,199999999999953; -0,3015988268627865 +20,399999999999956; -0,32309268875395514 +20,59999999999996; -0,29037807883314093 +20,79999999999996; -0,2922929925308506 +20,99999999999995; -0,34985423889611633 +21,199999999999953; -0,36118780832491426 +21,399999999999956; -0,3251998242712628 +21,599999999999945; -0,2462767056035915 +21,799999999999933; -0,24441110825428503 +21,99999999999995; -0,2563960865160375 +22,19999999999994; -0,2437759650962339 +22,399999999999956; -0,22035942863831393 +22,59999999999996; -0,18593789159821306 +22,799999999999947; -0,1580165418909094 +22,99999999999995; -0,16755721915183486 +23,19999999999994; -0,20252844881319776 +23,399999999999913; -0,22661159302112166 +23,599999999999945; -0,24267584629923267 +23,799999999999933; -0,29043098079506846 +23,999999999999936; -0,32759458048731993 +24,19999999999994; -0,35261052927411507 +24,39999999999994; -0,4205920563168606 +24,599999999999945; -0,40505099517955756 +24,799999999999947; -0,39978925053876324 +24,999999999999936; -0,4143117703519099 +25,19999999999994; -0,4219338489372779 +25,399999999999928; -0,4610014796748456 +25,59999999999993; -0,47018850098853804 +25,799999999999947; -0,4491839028784197 +25,999999999999936; -0,4458017205576206 +26,199999999999925; -0,5003597628349712 +26,39999999999994; -0,5150256066968306 +26,599999999999916; -0,5045451019191436 +26,799999999999933; -0,5133285112874519 +26,999999999999922; -0,527155709897416 +27,19999999999994; -0,5140685424201781 +27,399999999999928; -0,49851201964752834 +27,599999999999916; -0,5137853037079538 +27,79999999999992; -0,5372179267072128 +27,999999999999936; -0,5680498018750453 +28,199999999999925; -0,5098792124208722 +28,399999999999928; -0,5261932637134765 +28,59999999999993; -0,5420533092094892 +28,799999999999933; -0,5905815675266202 +28,999999999999936; -0,6278889530493021 +29,19999999999991; -0,6751232569663901 +29,399999999999913; -0,6417648030574505 +29,599999999999916; -0,6296852646307589 +29,79999999999992; -0,6731708512242238 +29,999999999999908; -0,6766999836256802 +30,199999999999925; -0,6439858043186271 +30,399999999999928; -0,6626801183278261 +30,599999999999916; -0,6575261415486628 +30,79999999999992; -0,5997705615017357 +30,999999999999908; -0,5811412251277055 +31,19999999999994; -0,6232767821070331 +31,399999999999913; -0,6936652252154754 +31,599999999999902; -0,7251977840976562 +31,79999999999992; -0,756817987398668 +31,999999999999908; -0,7626095276161258 +32,199999999999925; -0,6998981751538662 +32,39999999999991; -0,6934363825152801 +32,599999999999916; -0,7182913332333944 +32,79999999999992; -0,6821687933338616 +32,99999999999992; -0,6663845829793131 +33,19999999999991; -0,6790941839387248 +33,399999999999956; -0,7261666896639514 +33,59999999999993; -0,7451168856292525 +33,79999999999995; -0,7934809742704192 +33,999999999999936; -0,7510223153439268 +34,19999999999994; -0,7443418303903386 +34,39999999999994; -0,7371085317015025 +34,599999999999945; -0,7272823230638554 +34,79999999999995; -0,7718051044043159 +34,99999999999995; -0,8073906768142964 +35,19999999999994; -0,7385956882940454 +35,399999999999956; -0,7160082880884686 +35,59999999999996; -0,7288095360695297 +35,79999999999996; -0,7236002865254121 +35,999999999999964; -0,7334442970172868 +36,19999999999997; -0,8346252066934827 +36,39999999999997; -0,8358944542314521 +36,59999999999996; -0,8009380638643022 +36,79999999999995; -0,7673865510270743 +36,99999999999998; -0,7199971905956084 +37,19999999999997; -0,7007463840971893 +37,399999999999984; -0,7387659310023729 +37,59999999999997; -0,721690739663293 +37,799999999999976; -0,657816129243038 +37,999999999999964; -0,6495576293842058 +38,20000000000001; -0,6597731574058532 +38,399999999999984; -0,672563855947323 +38,6; -0,6904033318178788 +38,79999999999999; -0,689336430830561 +39,00000000000002; -0,6117300762411118 +39,199999999999996; -0,5639205810793819 +39,40000000000001; -0,5983607766144563 +39,6; -0,5559212159038944 +39,80000000000002; -0,42213980065065204 +40,00000000000001; -0,41577016450588733 +40,20000000000004; -0,41077502582773695 +40,40000000000001; -0,4494641339488026 +40,600000000000044; -0,5314018055872878 +40,80000000000002; -0,641785834906464 +41,00000000000005; -0,7108648438969745 +41,200000000000024; -0,6859741311599707 +41,400000000000055; -0,7017068191441105 +41,60000000000003; -0,6791477498478518 +41,80000000000005; -0,653540590898162 +42,00000000000005; -0,6660836110606962 +42,20000000000007; -0,6129974635842999 +42,400000000000055; -0,5886674503992548 +42,60000000000007; -0,5864375705241724 +42,80000000000006; -0,5934101604542863 +43,000000000000064; -0,5971640717600168 +43,20000000000005; -0,687945370263789 +43,400000000000084; -0,826010895068702 +43,60000000000007; -0,8402202033545532 +43,80000000000009; -0,8155286496095027 +44,00000000000008; -0,7732529679765467 +44,20000000000008; -0,7804047850500297 +44,400000000000084; -0,7186911944635885 +44,6000000000001; -0,6952708619187691 +44,80000000000009; -0,6796908471847463 +45,00000000000011; -0,6791911674601883 +45,20000000000008; -0,750294196595163 +45,400000000000084; -0,8751930740148532 +45,6000000000001; -0,9276382447045544 +45,800000000000104; -0,9719742530818682 +46,00000000000011; -1,036079323202311 +46,20000000000011; -1,1181471052790317 +46,4000000000001; -1,0958490215727856 +46,60000000000013; -1,0625635604160188 +46,80000000000012; -1,0681184335495777 +47,00000000000011; -1,0491794786564261 +47,20000000000011; -1,0004949273189419 +47,40000000000013; -1,0264013117471569 +47,600000000000115; -0,9884102239645856 +47,80000000000013; -0,9894223247725593 +48,00000000000012; -1,0796700017398213 +48,20000000000014; -1,099628578912291 +48,40000000000011; -0,9509643943244526 +48,60000000000016; -0,9037231717547249 +48,80000000000013; -0,8528339219613446 +49,000000000000135; -0,858999004045224 +49,20000000000014; -0,9168300378510152 +49,400000000000155; -0,9577590379052632 +49,60000000000013; -0,999788695384078 +49,80000000000016; -1,0093627559760772 +50,00000000000015; -1,0138490875975479 +50,200000000000166; -1,0664495148931095 +50,400000000000155; -1,2154632152797502 +50,60000000000017; -1,1788818515429793 +50,800000000000146; -1,050269845638372 +51,00000000000019; -1,0622383145312964 +51,200000000000166; -1,1841450735158365 +51,4000000000002; -1,139376215918372 +51,60000000000017; -1,119440531745798 +51,8000000000002; -1,187468605994586 +52,00000000000018; -1,1953550362808736 +52,20000000000021; -1,269604124857581 +52,40000000000018; -1,3849421747096078 +52,6000000000002; -1,3718481353189649 +52,80000000000019; -1,3954600140641764 +53,00000000000022; -1,3942562465749204 +53,20000000000021; -1,4042931940245014 +53,400000000000226; -1,3795400304760106 +53,600000000000215; -1,4371475323268652 +53,80000000000023; -1,4680470055475139 +54,00000000000022; -1,4956152610708555 +54,20000000000024; -1,4599173760734971 +54,400000000000226; -1,3804207925357423 +54,60000000000023; -1,4209447553401664 +54,80000000000023; -1,4696589593832408 +55,00000000000025; -1,3473971465483299 +55,20000000000024; -1,2804811618109628 +55,40000000000024; -1,1931187716667573 +55,60000000000023; -1,1499753811035252 +55,80000000000026; -1,1787726888220313 +56,000000000000234; -1,1932811246412953 +56,20000000000025; -1,259756294621234 +56,40000000000024; -1,2340584671567725 +56,60000000000027; -1,1917426282230785 +56,800000000000246; -1,2255018834858493 +57,00000000000026; -1,2903085954845714 +57,200000000000266; -1,3799715177434764 +57,40000000000027; -1,4961435623060653 +57,60000000000026; -1,5184418601914111 +57,800000000000274; -1,4156967177433764 +58,00000000000025; -1,4701539637874377 +58,200000000000266; -1,545782763600434 +58,40000000000027; -1,5486404166502283 +58,600000000000286; -1,607511180291636 +58,80000000000026; -1,5918971528251729 +59,00000000000028; -1,7420918696456886 +59,20000000000028; -1,8688832280161232 +59,4000000000003; -1,9018553915656242 +59,600000000000286; -1,9313949044976835 +59,8000000000003; -1,7488759443354804 +60,000000000000306; -1,5879219632492743 +60,20000000000031; -1,5322688722554756 +60,40000000000028; -1,4779441671503282 +60,600000000000314; -1,3053954056727393 +60,8000000000003; -1,161200232220056 +61,00000000000032; -1,0852609076693227 +61,20000000000031; -1,039861302109443 +61,400000000000325; -1,0938817679702129 +61,600000000000314; -1,2827795990288489 +61,80000000000032; -1,4418988356213176 +62,000000000000306; -1,4887272875332065 +62,20000000000034; -1,3858016155912871 +62,400000000000325; -1,4386165299344782 +62,60000000000034; -1,623474266607849 +62,800000000000345; -1,6269465129654068 +63,00000000000035; -1,4835041232913464 +63,20000000000034; -1,4192369875578938 +63,40000000000037; -1,393348402668435 +63,60000000000036; -1,46529616679921 +63,800000000000374; -1,500508185495117 +64,00000000000037; -1,6190473360126991 +64,20000000000036; -1,7519875508476201 +64,40000000000035; -1,7562809083561022 +64,60000000000036; -1,969973816098435 +64,80000000000035; -2,0604805496803844 +65,00000000000037; -2,0818983868245247 +65,20000000000036; -2,096459467198311 +65,40000000000038; -2,2014641556121233 +65,60000000000039; -1,996828898735267 +65,80000000000038; -1,6692235197112448 +66,00000000000037; -1,4111710117485514 +66,20000000000039; -1,4616886686912545 +66,40000000000038; -1,6079210184093582 +66,60000000000039; -1,5839852165659427 +66,80000000000038; -1,583493358599156 +67,0000000000004; -1,3918025284299995 diff --git a/Functions/Theory/Dissertation/PD/70ghz_pd_responsivity.csv b/Functions/Theory/Dissertation/PD/70ghz_pd_responsivity.csv new file mode 100644 index 0000000..bf119e2 --- /dev/null +++ b/Functions/Theory/Dissertation/PD/70ghz_pd_responsivity.csv @@ -0,0 +1,166 @@ +1270,8549581839902; 0,5258998226950353 +1270,743369175627; 0,5221430916732335 +1271,0781362007167; 0,5309982433674809 +1271,3013142174432; 0,5350233123194115 +1271,5244922341694; 0,5385117054110848 +1271,747670250896; 0,5428051122931441 +1271,9708482676224; 0,5468301812450749 +1272,305615292712; 0,5498713444532002 +1272,9751493428912; 0,5484402088258471 +1273,5330943847073; 0,5470985191752036 +1273,7562724014335; 0,5441468019437876 +1273,867861409797; 0,5398533950617284 +1274,0910394265231; 0,5377066916206987 +1274,3142174432496; 0,5337710686454775 +1274,8721624850657; 0,5309982433674809 +1275,4301075268816; 0,526615390508712 +1276,0996415770608; 0,5275098502758077 +1276,76917562724; 0,5296565537168374 +1277,4387096774192; 0,5305510134839331 +1278,1082437275984; 0,5325188249715436 +1278,7777777777776; 0,5350233123194115 +1279,4473118279568; 0,5344866364591541 +1280,116845878136; 0,5348444203659923 +1280,674790919952; 0,5369016778303125 +1281,1211469534048; 0,5409267467822432 +1281,5675029868578; 0,5438784640136589 +1281,790681003584; 0,5465618433149462 +1282,0510553564316; 0,5502291283600385 +1282,5718040621266; 0,554701427195517 +1283,2413381123058; 0,5545225352420978 +1283,910872162485; 0,553449183521583 +1284,5804062126642; 0,5489768846861045 +1285,13835125448; 0,5454884915944312 +1285,6962962962962; 0,5425367743630154 +1286,2542413381123; 0,5422684364328867 +1286,8121863799283; 0,5459357214779792 +1287,3701314217442; 0,5495135605463619 +1287,7792911190759; 0,553449183521583 +1288,0396654719234; 0,557832036380352 +1288,2628434886499; 0,5615887674021538 +1288,4860215053764; 0,5653454984239559 +1288,7463958582237; 0,5695494593293056 +1289,1555555555556; 0,5742006501182033 +1289,7135005973714; 0,5784940570002626 +1290,3830346475506; 0,5781362730934243 +1290,9409796893667; 0,5752740018387181 +1291,1641577060932; 0,57071225702653 +1291,3873357228194; 0,5672238639348568 +1291,610513739546; 0,5640038087733122 +1291,9452807646355; 0,5606048616583486 +1292,5032258064516; 0,555953670869451 +1293,0611708482675; 0,554701427195517 +1293,7307048984467; 0,5570270225899658 +1294,2886499402628; 0,5586370501707381 +1294,8465949820788; 0,5618571053322825 +1295,4045400238947; 0,5645404846335697 +1295,9624850657108; 0,5672238639348568 +1296,63201911589; 0,5672238639348568 +1297,3015531660692; 0,5654349444006653 +1297,9710872162484; 0,5627515650993782 +1298,6406212664276; 0,5614993214254442 +1299,3101553166068; 0,5625726731459592 +1299,979689366786; 0,5640038087733122 +1300,6492234169652; 0,5656138363540846 +1301,3187574671445; 0,5656138363540846 +1301,9882915173237; 0,5652560524472463 +1302,6578255675029; 0,5618571053322825 +1303,327359617682; 0,5584581582173189 +1303,9968936678613; 0,5563114547762892 +1304,6664277180405; 0,5543436432886787 +1305,3359617682197; 0,5539858593818404 +1305,8939068100358; 0,555953670869451 +1306,3402628434885; 0,5589053881008668 +1306,7866188769412; 0,56239378119254 +1307,2329749103942; 0,5656138363540846 +1307,679330943847; 0,5693705673758864 +1308,237275985663; 0,5722328386305927 +1308,9068100358422; 0,5713383788634969 +1309,464755077658; 0,5691022294457577 +1309,911111111111; 0,5658821742842133 +1310,3574671445638; 0,5634671329130548 +1310,8038231780165; 0,560515415681639 +1311,3617682198326; 0,5579214823570615 +1312,0313022700118; 0,5582792662638998 +1312,700836320191; 0,5604259697049294 +1313,3703703703702; 0,5627515650993782 +1313,9283154121863; 0,5645404846335697 +1314,374671445639; 0,5674922018649855 +1315,1557945041816; 0,5704439190964012 +1315,8253285543608; 0,5708017030032395 +1316,49486260454; 0,5715172708169162 +1317,1643966547192; 0,5722328386305927 +1317,8339307048984; 0,5727695144908501 +1318,5034647550776; 0,5715172708169162 +1319,1729988052568; 0,5711594869100779 +1319,842532855436; 0,5693705673758864 +1320,5120669056153; 0,5693705673758864 +1321,1816009557945; 0,5686549995622099 +1321,8511350059737; 0,5679394317485333 +1322,5206690561529; 0,5650771604938272 +1323,190203106332; 0,5645404846335697 +1323,8597371565113; 0,566150512214342 +1324,5292712066905; 0,5682972156553716 +1325,0872162485064; 0,5712489328867874 +1325,6451612903224; 0,5747373259784607 +1326,2031063321385; 0,5779573811400052 +1326,7610513739544; 0,5811774363015497 +1327,4305854241336; 0,5833241397425795 +1328,100119474313; 0,5861864109972856 +1328,7696535244922; 0,5858286270904474 +1329,4391875746715; 0,5833241397425795 +1330,1087216248507; 0,5822507880220645 +1330,7782556750299; 0,5833241397425795 +1331,447789725209; 0,5833241397425795 +1332,1173237753883; 0,5843974914630943 +1332,7868578255675; 0,5869019788109622 +1333,4563918757467; 0,5876175466246387 +1334,125925925926; 0,5883331144383153 +1334,7954599761051; 0,5895853581122492 +1335,4649940262843; 0,5901220339725066 +1336,1345280764635; 0,5883331144383153 +1336,8040621266427; 0,5869019788109622 +1337,473596176822; 0,5843974914630943 +1338,1431302270012; 0,5811774363015497 +1338,8126642771804; 0,5801040845810348 +1339,4821983273596; 0,5808196523947114 +1340,1517323775388; 0,5831452477891602 +1340,821266427718; 0,5849341673233517 +1341,3792114695339; 0,58734920869451 +1341,93715651135; 0,5903009259259259 +1342,6066905615291; 0,5919109535066981 +1343,2762246117084; 0,5919109535066981 +1343,9457586618876; 0,592984305227213 +1344,6152927120668; 0,5936998730408896 +1345,284826762246; 0,5944154408545661 +1345,9543608124252; 0,5962043603887575 +1346,6238948626044; 0,599424415550302 +1347,0702508960571; 0,6004977672708168 +1347,9629629629628; 0,5997821994571403 +1348,632497013142; 0,6012133350844935 +1349,3020310633212; 0,6033600385255231 +1349,9715651135004; 0,6033600385255231 +1350,6410991636797; 0,6037178224323614 +1351,3106332138589; 0,605864525873391 +1351,980167264038; 0,6078323373610015 +1352,6497013142173; 0,6094423649417738 +1353,3192353643965; 0,6112312844759653 +1353,9887694145757; 0,6123046361964801 +1354,658303464755; 0,6123046361964801 +1355,3278375149341; 0,6135568798704141 +1355,8857825567502; 0,6168663810086681 +1356,332138590203; 0,6206231120304702 +1356,890083632019; 0,6241115051221433 +1357,5596176821982; 0,626258208563173 +1358,2291517323774; 0,6248270729358198 +1358,8986857825566; 0,6230381534016285 +1359,4566308243727; 0,619818098240084 +1360,0145758661886; 0,6171347189387969 +1360,6841099163678; 0,617313610892216 +1361,353643966547; 0,6176713947990543 +1362,0231780167262; 0,61856585456615 +1362,6927120669054; 0,6192814223798266 +1363,1390681003584; 0,6225014775413711 +1363,585424133811; 0,626258208563173 +1364,2549581839903; 0,6284049120042028 +1364,8129032258064; 0,630014939584975 diff --git a/Functions/Theory/Dissertation/PD/plot_pd_specs.m b/Functions/Theory/Dissertation/PD/plot_pd_specs.m new file mode 100644 index 0000000..376e324 --- /dev/null +++ b/Functions/Theory/Dissertation/PD/plot_pd_specs.m @@ -0,0 +1,66 @@ +opts = delimitedTextImportOptions("NumVariables", 2); + +% Specify range and delimiter +opts.DataLines = [1, Inf]; +opts.Delimiter = ";"; + +% Specify column names and types +opts.VariableNames = ["x0_03203105428566744", "x_0_09762908467719589"]; +opts.VariableTypes = ["double", "double"]; + +% Specify file level properties +opts.ExtraColumnsRule = "ignore"; +opts.EmptyLineRule = "read"; + +% Specify variable properties +opts = setvaropts(opts, ["x0_03203105428566744", "x_0_09762908467719589"], "DecimalSeparator", ","); +opts = setvaropts(opts, ["x0_03203105428566744", "x_0_09762908467719589"], "ThousandsSeparator", "."); + +% Import the data +x70ghz_pd_resp = readtable("C:\Users\Silas\Documents\MATLAB\imdd_simulation\Functions\Theory\Dissertation\PD\70ghz_pd_responsivity.csv", opts); +x70ghz_pd_bandwidth = readtable("C:\Users\Silas\Documents\MATLAB\imdd_simulation\Functions\Theory\Dissertation\PD\70ghz_pd_bandwidth.csv", opts); +x100ghz_pd_resp = readtable("C:\Users\Silas\Documents\MATLAB\imdd_simulation\Functions\Theory\Dissertation\PD\100ghz_pd_responsivity.csv", opts); +x100ghz_pd_bandwidth = readtable("C:\Users\Silas\Documents\MATLAB\imdd_simulation\Functions\Theory\Dissertation\PD\100ghz_pd_bandwidth.csv", opts); + +% sort bandwidth based on first table column +x70ghz_pd_bandwidth = sortrows(x70ghz_pd_bandwidth, "x0_03203105428566744"); + +x70ghz_pd_bandwidth.(2) = movmean(x70ghz_pd_bandwidth.(2),3); +%smooth data for plotting + +x100ghz_pd_bandwidth = sortrows(x100ghz_pd_bandwidth, "x0_03203105428566744"); + + + +%% + +figure(); hold on +plot(x100ghz_pd_resp.(1),x100ghz_pd_resp.(2)) +plot(x70ghz_pd_resp.(1),x70ghz_pd_resp.(2)) +% beautify +xlabel('Frequency (GHz)'); +ylabel('Responsivity (A/W)'); +legend('100GHz PD', '70GHz PD'); +grid on; + +%% +% mat2tikz_improved('C:\Users\Silas\Documents\6971e0b65b380ca6d71c837f\02_IMDD_System\tikz\pd\responsivity.tikz') + +%% + +figure(); hold on +plot(x100ghz_pd_bandwidth.(1),x100ghz_pd_bandwidth.(2)) +plot(x70ghz_pd_bandwidth.(1),x70ghz_pd_bandwidth.(2)) +% beautify +xlabel('Frequency (GHz)'); +ylabel('Relative S21'); +legend('100GHz PD', '70GHz PD'); +grid on; + +ylim([-3.5, 0.1]) +xlim([0 100]); + +%% +mat2tikz_improved('C:\Users\Silas\Documents\6971e0b65b380ca6d71c837f\02_IMDD_System\tikz\pd\bandwidth_.tikz') + + diff --git a/Functions/Theory/Dissertation/loss_curve_digitized.m b/Functions/Theory/Dissertation/loss_curve_digitized.m new file mode 100644 index 0000000..71e05cc --- /dev/null +++ b/Functions/Theory/Dissertation/loss_curve_digitized.m @@ -0,0 +1,120 @@ +function loss_curve_digitized(filename) +% PLOT_WPD_DATASETS Reads and plots scattering data from a CSV file. +% filename: String containing the path to the CSV file (e.g., 'wpd_datasets.csv') +% +% This function expects a CSV with the following structure: +% Row 1: Dataset Names (every 2nd column) +% Row 2: Variable Names (X, Y, X, Y...) +% Row 3+: Numeric Data (potentially with NaNs for unequal lengths) + + % --- 1. Import Data --- + if nargin < 1 + filename = 'wpd_datasets.csv'; % Default filename + end + + % Read the numeric data, skipping the first 2 header lines + % 'TreatAsMissing' ensures empty cells become NaNs + raw_data = readmatrix(filename, 'NumHeaderLines', 2); + + % Read the first line separately to parse Dataset Names + fid = fopen(filename, 'r'); + if fid == -1 + error('Could not open file: %s', filename); + end + header_line = fgetl(fid); + fclose(fid); + + % Split header by comma to get names + raw_names = split(header_line, ','); + + % Extract non-empty names (assuming names are in col 1, 3, 5...) + dataset_names = raw_names(~cellfun('isempty', raw_names)); + + % --- 2. Setup Plot --- + figure('Color', 'w', 'Position', [100, 100, 800, 600]); + ax = gca; + hold(ax, 'on'); + + + line_styles = {'-', '-', '-', '-'}; + + % --- 3. Iterate and Plot Each Dataset --- + num_datasets = length(dataset_names); + + for i = 1:num_datasets + % Calculate column indices for X and Y + % Dataset 1: Cols 1,2 | Dataset 2: Cols 3,4 | etc. + col_x = (i-1)*2 + 1; + col_y = (i-1)*2 + 2; + + % Extract data + if col_y > size(raw_data, 2) + warning('Data columns missing for dataset %d', i); + break; + end + + X = raw_data(:, col_x); + Y = raw_data(:, col_y); + + + + % Remove NaNs (missing data due to unequal lengths) + valid_mask = ~isnan(X) & ~isnan(Y); + X = X(valid_mask); + Y = Y(valid_mask); + + [X, sortIdx] = sort(X); + Y = Y(sortIdx); + + % 3. Smooth the Data + + if numel(X) > 20 + if 1 + Y = smoothdata(Y, 'sgolay', 15); + else + Y = movmean(Y, 15); + end + end + + + % Plotting + % Using semilogy because scattering data often spans orders of magnitude + % (Adjust to 'plot' if linear scale is preferred) + p = plot(ax, X, Y, ... + 'LineStyle', line_styles{mod(i-1, length(line_styles)) + 1}, ... + 'Marker', 'none', ... + 'Color', 'black', ... + 'LineWidth', 1.5, ... + 'MarkerSize', 6, ... + 'DisplayName', dataset_names{i}); + + % Optional: Fill marker faces for better visibility + % p.MarkerFaceColor = p.Color; + % p.MarkerFaceAlpha = 0.3; % Semi-transparent fill + end + + % --- 4. Styling and Formatting --- + + % Axis Labels (Inferred from typical scattering plots) + xlabel(ax, 'Wavelength (\mu m)', 'FontSize', 12, 'FontWeight', 'bold'); + ylabel(ax, 'Intensity / Cross-Section (a.u.)', 'FontSize', 12, 'FontWeight', 'bold'); + + % Title + title(ax, 'Dataset Comparison', 'FontSize', 14); + + % Legend + legend(ax, 'Location', 'best', 'Interpreter', 'none', 'Box', 'on'); + + % Grid + grid(ax, 'on'); + ax.GridAlpha = 0.3; + ax.MinorGridAlpha = 0.1; + + % Set Log Scale for Y (likely required for this data type) + set(ax, 'YScale', 'log'); + + % Enhance axis appearance + set(ax, 'Box', 'on', 'LineWidth', 1.2, 'FontSize', 10); + + hold(ax, 'off'); +end \ No newline at end of file diff --git a/Functions/Theory/Dissertation/mach_zehnder_nonlinearities.m b/Functions/Theory/Dissertation/mach_zehnder_nonlinearities.m new file mode 100644 index 0000000..1712471 --- /dev/null +++ b/Functions/Theory/Dissertation/mach_zehnder_nonlinearities.m @@ -0,0 +1,191 @@ + + +%MZM demo -> sinus als eingang in MZM intensity TF: 2nd and 3rd roder +%nonlinearities in PSD visible + +clear; close all; clc; + +set(groot,'defaultLegendInterpreter','tex'); +set(groot,'defaultAxesTickLabelInterpreter','tex'); +set(groot,'defaultTextInterpreter','tex'); + +%% Fixed parameters +Vpi = 5.2; % [V] +f0 = 10e9; % [Hz] +fs = 400e9; % [Hz] +Nper = 500; % periods for PSD quality + +t = (0:1/fs:(Nper/f0 - 1/fs)).'; +w = 2*pi*f0; + +% PSD settings +nfft = 2^(nextpow2(min(length(t), 2^18))-1); +win = hann(2^12); +ovl = round(0.5*numel(win)); + +N_bessel = 10; + +%% UI defaults (normalized) +vb0 = 1.0; % Vbias/Vpi +vpp0 = 0.5; % Vpp/Vpi + +%% Figure + layout +fig = figure('Color','w','Name','MZM Nonlinearity: Bias & Drive','NumberTitle','off'); +tl = tiledlayout(fig,1,2,'TileSpacing','compact','Padding','compact'); + +axTF = nexttile(tl,1); hold(axTF,'on'); grid(axTF,'on'); +axPSD = nexttile(tl,2); hold(axPSD,'on'); grid(axPSD,'on'); + +% Scatter placeholders +hEx = scatter(axTF, nan, nan, 6, '.', 'DisplayName','Exact'); +hTa = scatter(axTF, nan, nan, 6, '.', 'DisplayName','Taylor (3rd order)'); +hJa = scatter(axTF, nan, nan, 6, '.', 'DisplayName',sprintf('Jacobi--Anger (N=%d)',N_bessel)); +hBias = plot(axTF, nan, nan, 'ko', 'MarkerFaceColor','k', 'DisplayName','Bias'); + +xlabel(axTF,'v/V_\pi'); ylabel(axTF,'P_{out}/P_0'); % <-- TeX (no $...$) +title(axTF,'Transfer characteristic (scatter)'); +ylim(axTF,[-0.1 1.1]); +xlim(axTF,[0 2]); +legend(axTF,'Location','best'); + +% PSD placeholders +hPex = plot(axPSD, nan, nan, 'LineWidth',2.0, 'DisplayName','Exact'); +hPta = plot(axPSD, nan, nan, '-', 'LineWidth',1.5, 'DisplayName','Taylor (3rd order)'); +hPja = plot(axPSD, nan, nan, '--', 'LineWidth',0.1, 'DisplayName',sprintf('Jacobi--Anger (N=%d)',N_bessel)); + +xlabel(axPSD,'Frequency [GHz]'); ylabel(axPSD,'PSD [dB/Hz]'); +title(axPSD,'Output spectrum (PSD)'); +xlim(axPSD,[0 10*f0/1e9]); +legend(axPSD,'Location','best'); + +%% Sliders + labels +sH = 0.05; mL = 0.08; wS = 0.38; y1 = 0.04; dy = 0.06; + +uicontrol(fig,'Style','text','Units','normalized', ... + 'Position',[mL, y1+dy, wS, 0.03], ... + 'String','v_{bias}/V_{\pi}','HorizontalAlignment','left'); + +sBias = uicontrol(fig,'Style','slider','Units','normalized', ... + 'Position',[mL, y1+dy-0.02, wS, sH], ... + 'Min',0,'Max',2,'Value',vb0); + +tBiasVal = uicontrol(fig,'Style','text','Units','normalized', ... + 'Position',[mL+wS+0.01, y1+dy, 0.08, 0.03], ... + 'String',sprintf('%.3f',vb0),'HorizontalAlignment','left'); + +uicontrol(fig,'Style','text','Units','normalized', ... + 'Position',[mL, y1, wS, 0.03], ... + 'String','v_{pp}/V_{\pi}','HorizontalAlignment','left'); + +sVpp = uicontrol(fig,'Style','slider','Units','normalized', ... + 'Position',[mL, y1-0.02, wS, sH], ... + 'Min',0,'Max',2,'Value',vpp0); + +tVppVal = uicontrol(fig,'Style','text','Units','normalized', ... + 'Position',[mL+wS+0.01, y1, 0.08, 0.03], ... + 'String',sprintf('%.3f',vpp0),'HorizontalAlignment','left'); + +%% Store handles in fig.UserData (so callback can always access them) +S = struct(); +S.Vpi = Vpi; S.f0 = f0; S.fs = fs; S.w = w; S.t = t; +S.win = win; S.ovl = ovl; S.nfft = nfft; +S.N_bessel = N_bessel; + +S.axTF = axTF; S.axPSD = axPSD; +S.hEx = hEx; S.hTa = hTa; S.hJa = hJa; S.hBias = hBias; +S.hPex = hPex; S.hPta = hPta; S.hPja = hPja; + +S.sBias = sBias; S.sVpp = sVpp; +S.tBiasVal = tBiasVal; S.tVppVal = tVppVal; + +fig.UserData = S; + +%% Continuous update while dragging +addlistener(sBias,'Value','PostSet',@(~,~)updatePlots(fig)); +addlistener(sVpp ,'Value','PostSet',@(~,~)updatePlots(fig)); + +% Initial draw +updatePlots(fig); + +%% ===== Callback (separate function at end of script) ===== +function updatePlots(fig) + S = fig.UserData; + + % Read slider values (normalized) + vb_n = S.sBias.Value; % Vbias/Vpi + vpp_n = S.sVpp.Value; % Vpp/Vpi + + % Update value labels + S.tBiasVal.String = sprintf('%.3f', vb_n); + S.tVppVal.String = sprintf('%.3f', vpp_n); + + % Convert to volts / amplitude + Vpi = S.Vpi; + Vbias = vb_n * Vpi; + Vpp = vpp_n * Vpi; + Vm = Vpp/2; + + t = S.t; w = S.w; + + % Drive + v = Vbias + Vm*cos(w*t); + x = v./Vpi; + + % Exact intensity + P_exact = cos((pi/2)*x).^2; + + % Taylor 3rd order around Vbias + k = (pi/2)/Vpi; + vb = Vbias; + g0 = cos(k*vb)^2; + g1 = -k*sin(2*k*vb); + g2 = -2*k^2*cos(2*k*vb); + g3 = 4*k^3*sin(2*k*vb); + dv = v - vb; + P_taylor = g0 + g1*dv + 0.5*g2*dv.^2 + (1/6)*g3*dv.^3; + + % Jacobi–Anger / Bessel series (truncated) + a = pi*(Vbias/Vpi); + b = pi*(Vm/Vpi); + N = S.N_bessel; + + P_ja = 0.5*ones(size(t)); + P_ja = P_ja + 0.5*cos(a)*besselj(0,b); + + for m = 0:floor((N-1)/2) + n = 2*m + 1; + P_ja = P_ja - (0.5*2)*sin(a)*besselj(n,b).*cos(n*w*t); + end + for m = 1:floor(N/2) + n = 2*m; + P_ja = P_ja - (0.5*2)*cos(a)*besselj(n,b).*cos(n*w*t); + end + + % Update TF scatter + S.hEx.XData = x; S.hEx.YData = P_exact; + S.hTa.XData = x; S.hTa.YData = P_taylor; + S.hJa.XData = x; S.hJa.YData = P_ja; + + xb = Vbias/Vpi; + pb = cos((pi/2)*xb)^2; + S.hBias.XData = xb; S.hBias.YData = pb; + + xpad = 0.05*(max(x)-min(x) + eps); + % xlim(S.axTF,[min(x)-xpad, max(x)+xpad]); + ylim(S.axTF,[-0.1 1.1]); + + % PSDs + fs = S.fs; + [Se,f] = pwelch(P_exact-mean(P_exact), S.win, S.ovl, S.nfft, fs, 'onesided'); + [St,~] = pwelch(P_taylor-mean(P_taylor), S.win, S.ovl, S.nfft, fs, 'onesided'); + [Sj,~] = pwelch(P_ja-mean(P_ja), S.win, S.ovl, S.nfft, fs, 'onesided'); + + S.hPex.XData = f/1e9; S.hPex.YData = 10*log10(Se + realmin); + S.hPta.XData = f/1e9; S.hPta.YData = 10*log10(St + realmin); + S.hPja.XData = f/1e9; S.hPja.YData = 10*log10(Sj + realmin); + + xlim(S.axPSD,[0 10*(S.f0)/1e9]); + ylim(S.axPSD,[-180 -80]); + + drawnow limitrate; +end diff --git a/Functions/Theory/Dissertation/mach_zehnder_nonlinearities_taylor.m b/Functions/Theory/Dissertation/mach_zehnder_nonlinearities_taylor.m new file mode 100644 index 0000000..ba3cb83 --- /dev/null +++ b/Functions/Theory/Dissertation/mach_zehnder_nonlinearities_taylor.m @@ -0,0 +1,66 @@ +% MZM bias sweep (physical coefficients) + field & power transfer functions +% Uses your notation: +% Pout/Pin = cos^2( (pi/2)*(v/Vpi) ), v = Vbias + Δv +% Taylor around Vbias: +% Pout/Pin ≈ a0 + a1 Δv + a2 Δv^2 + a3 Δv^3 +% +% Coefficients (physical units): +% a0 [-], a1 [1/V], a2 [1/V^2], a3 [1/V^3] +% +% Also plots: +% Field TF amplitude: Eout/Ein = cos( (pi/2)*(Vbias/Vpi) ) +% Power TF: Pout/Pin = cos^2( (pi/2)*(Vbias/Vpi) ) + +clear; close all; clc; + +set(groot,'defaultLegendInterpreter','tex'); +set(groot,'defaultAxesTickLabelInterpreter','tex'); +set(groot,'defaultTextInterpreter','tex'); + +%% Parameters +Vpi = 3; % [V] device half-wave voltage +xb = linspace(0, 2, 2001); % x_b = Vbias/Vpi +Vbias = xb * Vpi; % [V] + +%% Static transfer functions (at Vbias) +H_field = cos((pi/2)*xb); % field amplitude TF (balanced MZM) +T_power = H_field.^2; % intensity TF + +%% Taylor coefficients (physical units) +a0 = T_power; +a1 = -(pi/(2*Vpi)) .* sin(pi*xb); % [1/V] +a2 = -(pi^2/(4*Vpi^2)) .* cos(pi*xb); % [1/V^2] +a3 = +(pi^3/(12*Vpi^3)) .* sin(pi*xb); % [1/V^3] +A0 = a0; +A1 = a1 * Vpi; +A2 = a2 * Vpi^2; +A3 = a3 * Vpi^3; + +%% Plot +figure('Color','w'); clf; +% --- (1) Field + power TF vs bias --- +hold on; grid on; +plot(xb, H_field, 'LineWidth', 1.4, 'DisplayName','Field','Color','black','LineStyle','--'); +% plot(xb, T_power, 'LineWidth', 1.4, 'DisplayName','Intensity','Color','black','LineStyle','-'); + + +% --- (2) Physical Taylor coefficients vs bias --- +% nexttile; hold on; grid on; +plot(xb, a0, 'LineWidth', 1.4, 'DisplayName','Intensity','Color','black','LineStyle','-'); +plot(xb, a1, 'LineWidth', 1.4, 'DisplayName','Linear'); +plot(xb, a2, 'LineWidth', 1.4, 'DisplayName','Even'); +plot(xb, a3, 'LineWidth', 1.4, 'DisplayName','Odd'); + +xlabel('$V/V_\pi$','Interpreter','latex'); +ylabel('Transfer'); +title('Static transfer functions vs bias'); +xlim([min(xb) max(xb)]); +ylim([-1.05 1.05]); +legend('Location','best'); + +% Optional: tighten y-limits to avoid a0 dominating the view +% Comment out if you prefer auto-scaling. +yl = ylim; +ylim([min(yl(1), -max(abs([a1 a2 a3]))*1.1), max(yl(2), max(abs([a1 a2 a3]))*1.1)]); + +xticks([0:0.5:2]); \ No newline at end of file diff --git a/Functions/Theory/Dissertation/wpd_datasets.csv b/Functions/Theory/Dissertation/wpd_datasets.csv new file mode 100644 index 0000000..f204cff --- /dev/null +++ b/Functions/Theory/Dissertation/wpd_datasets.csv @@ -0,0 +1,189 @@ +Rayleigh,,Experimental,,Infrared Absorption, +X,Y,X,Y,X,Y +0.7066005680911753,3.651009696525016,0.7072188355785799,4.848577786727532,1.4943918372804705,0.009324755400827079 +0.7362740977034739,3.1008424465551374,0.7104385926007812,5.059236053617898,1.5870823136443164,0.04795688074913024 +0.7704634954089999,2.559836201011587,0.7143024334187478,5.3165954733738054,1.6443739975494367,0.12666181795273013 +0.8246453070916075,1.9963763545469397,0.7194723146571098,4.679249634272495,1.6900695253042852,0.3029389206853443 +0.8846384359818439,1.4197559292837703,0.7194729766137344,4.646181068667172,1.7344762235109785,0.7194296259968607 +0.9375334039861705,1.0762856922437043,0.7227053108118038,4.236869693191961,1.7975573800551148,2.1896107578891244 +0.9929980876073115,0.9010620061822204,0.7272205169484065,4.147543538340177,, +1.0420225952274251,0.6977835411732736,0.7291487965959542,4.420849736815974,, +1.0845923638007697,0.5842349714248559,0.7310784001567514,4.645798669234298,, +1.129741777340298,0.4856980392071641,0.7355902965102309,4.71201487210429,, +1.1981066716622326,0.3841608204561696,0.738821306795051,4.358286713153517,, +1.24841405122088,0.31935666463679646,0.7414069093708566,4.059822180897163,, +1.289688370679823,0.2850148847474179,0.742705668268381,3.676053825899206,, +1.3541801567910463,0.23691184007300667,0.7440031032526563,3.376112267508452,, +1.4083573347772815,0.19416797258075097,0.7452965664971838,3.235432943532804,, +1.4618851333147547,0.16723647350379714,0.7459426361628229,3.1898499103097238,, +1.50315548103395,0.15574103754742674,0.7549743723492774,3.0137121806723157,, +1.5386251028515106,0.1419883611511702,0.7620678995388148,2.971117042589562,, +1.596665459699088,0.12316075278891304,0.765291628300764,2.971049114206588,, +1.6437444767994136,0.10759838849626362,0.7756075603390012,2.9708317538173317,, +1.683725994970454,0.09949510555249974,0.7762523060913911,2.9708181693210105,, +1.717258069747722,0.09398483395032568,0.7839919029465676,2.8875658983600925,, +1.7636903552257834,0.08387517688001396,0.7885090949530442,2.767180560538318,, +1.7940013490676008,0.07701567091052414,0.7917348095848672,2.7088647150205,, +,,0.7936723566251598,2.6144535948583694,, +,,0.7962546494178423,2.5233214143921474,, +,,0.8085087904529968,2.417989089048743,, +,,0.8104423657535417,2.435165393892523,, +,,0.8201175237791369,2.3335556930105406,, +,,0.8285065000830756,2.158298098247211,, +,,0.8317335386281479,2.083056634772393,, +,,0.8356046609689853,2.024737963659226,, +,,0.8407639509013534,1.996148150112612,, +,,0.8459232408337212,1.967962031984024,, +,,0.854951005280428,1.9401206794865944,, +,,0.8601116191260452,1.8857864945455538,, +,,0.8691446792257491,1.7565635929668848,, +,,0.8743052930713663,1.7073700288086895,, +,,0.8788211611645935,1.6595617469926904,, +,,0.8826916215488064,1.624580544751916,, +,,0.8891397410293294,1.6130257674984603,, +,,0.896234592132116,1.5678305544227285,, +,,0.903974850943917,1.5131252291764425,, +,,0.90784531132813,1.4812307005435945,, +,,0.9155829223134326,1.470682044636039,, +,,0.9220303798373308,1.4706147972609174,, +,,0.9310574823274131,1.460128389693264,, +,,0.9349259568417521,1.4600883304432553,, +,,0.9433056657529459,1.4913980336424177,, +,,0.9516853746641398,1.5233791328756299,, +,,0.956844002639883,1.512557980118849,, +,,0.9671632444612435,1.4597545460975296,, +,,0.9710370146285795,1.379199997932108,, +,,0.9736206313345113,1.3123773159521164,, +,,0.9774937395452226,1.2487807938448074,, +,,0.9826543533908398,1.213807976266501,, +,,0.9903926263327669,1.1966468122906808,, +,,0.9942630867169798,1.171423198750918,, +,,1.0045796807118417,1.1630595787371243,, +,,1.0097376467309604,1.163017033545686,, +,,1.0219851681998686,1.1963787227370668,, +,,1.0290753856062829,1.2220446908209617,, +,,1.0348774354211667,1.2306917801168409,, +,,1.0471421677623152,1.052809309517664,, +,,1.0510159379296513,0.9947114748787712,, +,,1.0445565651865096,1.1302083245776995,, +,,1.0458487045177878,1.0985863367418764,, +,,1.0542449623445975,0.9398239868494617,, +,,1.0613444471437565,0.8692481092753317,, +,,1.0690886776953055,0.8039684355922487,, +,,1.0768322462902296,0.7488836107091129,, +,,1.0800586228786773,0.7279206840193796,, +,,1.0858633205200596,0.7125673758820761,, +,,1.1013418522737881,0.677981252075927,, +,,1.105210326788127,0.6779626513688453,, +,,1.1193973811672016,0.6589337368401503,, +,,1.1206888585418553,0.6450561487842132,, +,,1.123272475247787,0.613802971613336,, +,,1.129077834845794,0.5966103416145675,, +,,1.1335910551125228,0.5965912453535225,, +,,1.1413266802279516,0.6050805792103379,, +,,1.147134687652457,0.5716821968068484,, +,,1.1581006610960811,0.5401075330241505,, +,,1.167774495208427,0.524964710284852,, +,,1.17357786893656,0.521233298948351,, +,,1.1890511050372914,0.5248855006959243,, +,,1.1974327998183592,0.5248543002000403,, +,,1.2051671010205385,0.5399272739697006,, +,,1.2161264548979165,0.5475977747039503,, +,,1.2225739124218147,0.5475727356323816,, +,,1.2232186581742046,0.5475702317881956,, +,,1.2257923455307669,0.5795255128326332,, +,,1.2264284858470365,0.635494312878344,, +,,1.2264218662807902,0.6822012488404363,, +,,1.2322133247896798,0.7695840678419278,, +,,1.2354304339853828,0.8261273126225834,, +,,1.2386382757883407,0.9793976812064772,, +,,1.2399224716401234,1.0365631680970249,, +,,1.2405632456527655,1.0816189618908738,, +,,1.2457119442791393,1.1944819289049535,, +,,1.2508619668187624,1.3005429730851226,, +,,1.2521488104970433,1.3379536598639075,, +,,1.2586068593269357,1.1943726953174758,, +,,1.2605516878900995,1.0662340854711274,, +,,1.263782036218295,0.9932116176633944,, +,,1.267659116168754,0.9057092045091463,, +,,1.2721796179583538,0.8377104911187728,, +,,1.277345527456968,0.7693377754021644,, +,,1.2818653672899432,0.7166420946785479,, +,,1.2954156193961235,0.639704291832398,, +,,1.298640672071322,0.6306801565443763,, +,,1.3018657247465204,0.6217833222901857,, +,,1.3147579919678183,0.6396165438362177,, +,,1.3179764250767705,0.6769403979817149,, +,,1.3244132912946747,0.7582491296621654,, +,,1.3295613279644238,0.8433295073010272,, +,,1.336000180052202,0.9247376324361347,, +,,1.3430738485430005,1.1278180580973283,, +,,1.3449988184074253,1.2455302076050567,, +,,1.3482112939067554,1.4050952527481475,, +,,1.351423769406086,1.585102197634859,, +,,1.3533487392705106,1.7505418140103943,, +,,1.3565618767264658,1.9608478952847546,, +,,1.3604177740649368,2.243642151072621,, +,,1.3681421459177467,2.5671506730013776,, +,,1.3720059867357133,2.6977396395227498,, +,,1.3700631440424236,2.9583331848749403,, +,,1.3745670969164077,3.267039328784058,, +,,1.3758446732019438,3.711862721055264,, +,,1.377124897313979,4.099294432098773,, +,,1.381620906708467,4.929210899363566,, +,,1.381610315402473,5.521521237053952,, +,,1.382885243861511,6.453816707451638,, +,,1.3828733286422676,7.332602493027707,, +,,1.3835048352621646,8.450022001983974,, +,,1.3847837354609505,9.465318121186383,, +,,1.3892850405084358,10.753821633797266,, +,,1.3950817946703227,11.46214012981349,, +,,1.406041810504325,11.542823048802346,, +,,1.4086254272102567,10.983569572223233,, +,,1.4125144223799593,8.815541223987582,, +,,1.4138145051907332,7.8697993951128655,, +,,1.4164106990725327,6.544455667464655,, +,,1.4170686839574151,5.678973743658009,, +,,1.419664877839215,4.722584406045411,, +,,1.422267691287261,3.6583795017467264,, +,,1.4274475018749921,2.894876829955794,, +,,1.4293982880477776,2.4244991059437035,, +,,1.4319891862765801,2.133892660567146,, +,,1.4365249130685465,1.6766244945281037,, +,,1.442346821582169,1.3648832144532748,, +,,1.44946086942707,1.0800176935856405,, +,,1.4539886527395407,0.9239641429706197,, +,,1.4617467843802068,0.7363233849854021,, +,,1.4701536335130105,0.5623407795094862,, +,,1.477900511891058,0.5055620724926202,, +,,1.4856487141823544,0.44811473438788657,, +,,1.4940482817922873,0.3699994982234866,, +,,1.5005089784486785,0.32105511462339426,, +,,1.5089019264923649,0.2845721176091456,, +,,1.5166481429137875,0.2576601983353233,, +,,1.5179396202884412,0.2522337011156551,, +,,1.5359997828782272,0.23327413205434572,, +,,1.5430966198508878,0.22196482072259285,, +,,1.5469697280615993,0.21120862244291763,, +,,1.5501980905199209,0.20097457800069773,, +,,1.565674636403775,0.1953318790229525,, +,,1.5688977032090996,0.19671762962317987,, +,,1.5785662416684487,0.20236426842871638,, +,,1.5837215598610688,0.2081796533603784,, +,,1.5914545371499988,0.21721757235346942,, +,,1.5991901622654274,0.22030852031094905,, +,,1.6088620105078997,0.21873658192521878,, +,,1.61208309144335,0.22502554836218797,, +,,1.6262602164730557,0.2432590831170723,, +,,1.626903638312196,0.2467330049135315,, +,,1.6281904819904773,0.25383038758817866,, +,,1.6410748057322797,0.28430548752659124,, +,,1.660414530477476,0.29244621369149987,, +,,1.6642816810785659,0.29661578287603696,, +,,1.6707152375133467,0.34423590359793155,, +,,1.6739290369259265,0.3828666146961718,, +,,1.6758540067903511,0.4228270071256609,, +,,1.690028483993558,0.4702407837690221,, +,,1.6964732936909575,0.48374976893430716,, +,,1.6996923887565347,0.5083600695634991,, +,,1.7003318388559272,0.5380344919079171,, diff --git a/Libs/Violinplot-Matlab-master/violinplot_community_.m b/Libs/Violinplot-Matlab-master/violinplot_community_.m new file mode 100644 index 0000000..63af839 --- /dev/null +++ b/Libs/Violinplot-Matlab-master/violinplot_community_.m @@ -0,0 +1,193 @@ +function violins = violinplot(data, cats, varargin) +%Violinplots plots violin plots of some data and categories +% VIOLINPLOT(DATA) plots a violin of a double vector DATA +% +% VIOLINPLOT(DATAMATRIX) plots violins for each column in +% DATAMATRIX. +% +% VIOLINPLOT(DATAMATRIX, CATEGORYNAMES) plots violins for each +% column in DATAMATRIX and labels them according to the names in the +% cell-of-strings CATEGORYNAMES. +% +% In the cases above DATA and DATAMATRIX can be a vector or a matrix, +% respectively, either as is or wrapped in a cell. +% To produce violins which have one distribution on one half and another +% one on the other half, DATA and DATAMATRIX have to be cell arrays +% with two elements, each containing a vector or a matrix. The number of +% columns of the two data sets has to be the same. +% +% VIOLINPLOT(DATA, CATEGORIES) where double vector DATA and vector +% CATEGORIES are of equal length; plots violins for each category in +% DATA. +% +% VIOLINPLOT(TABLE), VIOLINPLOT(STRUCT), VIOLINPLOT(DATASET) +% plots violins for each column in TABLE, each field in STRUCT, and +% each variable in DATASET. The violins are labeled according to +% the table/dataset variable name or the struct field name. +% +% violins = VIOLINPLOT(...) returns an object array of +% Violin objects. +% +% VIOLINPLOT(..., 'PARAM1', val1, 'PARAM2', val2, ...) +% specifies optional name/value pairs for all violins: +% 'Width' Width of the violin in axis space. +% Defaults to 0.3 +% 'Bandwidth' Bandwidth of the kernel density estimate. +% Should be between 10% and 40% of the data range. +% 'ViolinColor' Fill color of the violin area and data points. Accepts +% 1x3 color vector or nx3 color vector where n = num +% groups. In case of two data sets being compared it can +% be an array of up to two cells containing nx3 +% matrices. +% Defaults to the next default color cycle. +% 'ViolinAlpha' Transparency of the violin area and data points. +% Can be either a single scalar value or an array of +% up to two cells containing scalar values. +% Defaults to 0.3. +% 'MarkerSize' Size of the data points, if shown. +% Defaults to 24 +% 'MedianMarkerSize' Size of the median indicator, if shown. +% Defaults to 36 +% 'EdgeColor' Color of the violin area outline. +% Defaults to [0.5 0.5 0.5] +% 'BoxColor' Color of the box, whiskers, and the outlines of +% the median point and the notch indicators. +% Defaults to [0.5 0.5 0.5] +% 'MedianColor' Fill color of the median and notch indicators. +% Defaults to [1 1 1] +% 'ShowData' Whether to show data points. +% Defaults to true +% 'ShowNotches' Whether to show notch indicators. +% Defaults to false +% 'ShowMean' Whether to show mean indicator +% Defaults to false +% 'ShowBox' Whether to show the box. +% Defaults to true +% 'ShowMedian' Whether to show the median indicator. +% Defaults to true +% 'ShowWhiskers' Whether to show the whiskers +% Defaults to true +% 'GroupOrder' Cell of category names in order to be plotted. +% Defaults to alphabetical ordering + +% Copyright (c) 2016, Bastian Bechtold +% This code is released under the terms of the BSD 3-clause license + +hascategories = exist('cats','var') && not(isempty(cats)); + +%parse the optional grouporder argument +%if it exists parse the categories order +% but also delete it from the arguments passed to Violin +grouporder = {}; +idx=find(strcmp(varargin, 'GroupOrder')); +if ~isempty(idx) && numel(varargin)>idx + if iscell(varargin{idx+1}) + grouporder = varargin{idx+1}; + varargin(idx:idx+1)=[]; + else + error('Second argument of ''GroupOrder'' optional arg must be a cell of category names') + end +end + +% check and correct the structure of ViolinColor input +idx=find(strcmp(varargin, 'ViolinColor')); +if ~isempty(idx) && iscell(varargin{idx+1}) + if length(varargin{idx+1}(:))>2 + error('ViolinColor input can be at most a two element cell array'); + end +elseif ~isempty(idx) && isnumeric(varargin{idx+1}) + varargin{idx+1} = varargin(idx+1); +end + +% check and correct the structure of ViolinAlpha input +idx=find(strcmp(varargin, 'ViolinAlpha')); +if ~isempty(idx) && iscell(varargin{idx+1}) + if length(varargin{idx+1}(:))>2 + error('ViolinAlpha input can be at most a two element cell array'); + end +elseif ~isempty(idx) && isnumeric(varargin{idx+1}) + varargin{idx+1} = varargin(idx+1); +end + +% tabular data +if isa(data, 'dataset') || isstruct(data) || istable(data) + if isa(data, 'dataset') + colnames = data.Properties.VarNames; + elseif istable(data) + colnames = data.Properties.VariableNames; + elseif isstruct(data) + colnames = fieldnames(data); + end + catnames = {}; + if isempty(grouporder) + for n=1:length(colnames) + if isnumeric(data.(colnames{n})) + catnames = [catnames colnames{n}]; %#ok<*AGROW> + end + end + catnames = sort(catnames); + else + for n=1:length(grouporder) + if isnumeric(data.(grouporder{n})) + catnames = [catnames grouporder{n}]; + end + end + end + + for n=1:length(catnames) + thisData = data.(catnames{n}); + violins(n) = Violin({thisData}, n, varargin{:}); + end + set(gca, 'XTick', 1:length(catnames), 'XTickLabels', catnames); + set(gca,'Box','on'); + return +elseif iscell(data) && length(data(:))==2 % cell input + if not(size(data{1},2)==size(data{2},2)) + error('The two input data matrices have to have the same number of columns'); + end +elseif iscell(data) && length(data(:))>2 % cell input + error('Up to two datasets can be compared'); +elseif isnumeric(data) % numeric input + % 1D data, one category for each data point + if hascategories && numel(data) == numel(cats) + if isempty(grouporder) + cats = categorical(cats); + else + cats = categorical(cats, grouporder); + end + + catnames = (unique(cats)); % this ignores categories without any data + catnames_labels = {}; + for n = 1:length(catnames) + thisCat = catnames(n); + catnames_labels{n} = char(thisCat); + thisData = data(cats == thisCat); + violins(n) = Violin({thisData}, n, varargin{:}); + end + set(gca, 'XTick', 1:length(catnames), 'XTickLabels', catnames_labels); + set(gca,'Box','on'); + return + else + data = {data}; + end +end + +% 1D data, no categories +if not(hascategories) && isvector(data{1}) + violins = Violin(data, 1, varargin{:}); + set(gca, 'XTick', 1); +% 2D data with or without categories +elseif ismatrix(data{1}) + for n=1:size(data{1}, 2) + thisData = cellfun(@(x)x(:,n),data,'UniformOutput',false); + violins(n) = Violin(thisData, n, varargin{:}); + end + set(gca, 'XTick', 1:size(data{1}, 2)); + if hascategories && length(cats) == size(data{1}, 2) + set(gca, 'XTickLabels', cats); + end +end + +set(gca,'Box','on'); + +end diff --git a/projects/IMDD_base_system/imdd_example_live.mlx b/projects/IMDD_base_system/imdd_example_live.mlx deleted file mode 100644 index bf780bb..0000000 Binary files a/projects/IMDD_base_system/imdd_example_live.mlx and /dev/null differ diff --git a/projects/IMDD_base_system/minimal_example.m b/projects/IMDD_base_system/minimal_example.m index 8576e3e..919cd7e 100644 --- a/projects/IMDD_base_system/minimal_example.m +++ b/projects/IMDD_base_system/minimal_example.m @@ -146,7 +146,7 @@ output.ffe_results = ffe(eq_,M,Scpe_sig,Symbols,Tx_bits, ... "precode_mode",duob_mode,'showAnalysis',1,"postFFE",[], ... "eth_style_symbol_mapping",0); -output.ffe_results.metrics.print +output.ffe_results.metrics.print("description",'DFE'); %% @@ -164,7 +164,7 @@ mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels); [output.vnle_results, output.mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Scpe_sig, Symbols, Tx_bits, ... "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", 0); -output.mlse_results.metrics.print +output.mlse_results.metrics.print("description",'MLSE'); %% diff --git a/projects/IMDD_base_system/submit_handle.m b/projects/IMDD_base_system/submit_handle.m index 2c5e710..ae59869 100644 --- a/projects/IMDD_base_system/submit_handle.m +++ b/projects/IMDD_base_system/submit_handle.m @@ -58,11 +58,14 @@ if options.parallel updateWaitbarFutures = afterEach(results, updateWaitbar, 0); afterAll(updateWaitbarFutures, @(~) delete(h), 0); - %%% 7) Fetch final results after all computations - fetchOutputs(results); - - for ridx = 1:length(results) - wh.addValueToStorageByLinIdx(results(ridx).OutputArguments{1}, 'ber', ridx); + %%% 7) Fetch final results iteratively as they finish + for i = 1:length(results) + try + [ridx, result] = fetchNext(results); + wh.addValueToStorageByLinIdx(result, 'ber', ridx); + catch ME + fprintf('A job failed or could not be fetched. Error: %s\n', ME.message); + end end end diff --git a/projects/Messung_Zürich/testSilas.mat b/projects/Messung_Zürich/testSilas.mat new file mode 100644 index 0000000..4361943 Binary files /dev/null and b/projects/Messung_Zürich/testSilas.mat differ diff --git a/tore --source rescue-premerge -- Classes b/tore --source rescue-premerge -- Classes deleted file mode 100644 index 36a0be2..0000000 --- a/tore --source rescue-premerge -- Classes +++ /dev/null @@ -1,6961 +0,0 @@ -diff --git a/Classes/00_signals/Signal.m b/Classes/00_signals/Signal.m -index e06c41f..f09a03e 100644 ---- a/Classes/00_signals/Signal.m -+++ b/Classes/00_signals/Signal.m -@@ -172,11 +172,9 @@ classdef Signal -  - hold on; - if isempty(options.color) -- % plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1); -- plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1); -+ plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1);  - else -- % plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1,'Color',options.color); -- plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Color',options.color); -+ plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1,'Color',options.color);  - end - % 2 c) - % - xlabel if not already here: time in readable format (1 ms and not 1e-3 s) -diff --git a/Classes/02_optical/DP_Fiber.m b/Classes/02_optical/DP_Fiber.m -index a5f3dce..c1f08ea 100644 ---- a/Classes/02_optical/DP_Fiber.m -+++ b/Classes/02_optical/DP_Fiber.m -@@ -24,6 +24,8 @@ classdef DP_Fiber - SS_dzmax % [m] max dz (adaptive SSFM) - SS_dzmin % [m] min dz (adaptive SSFM) - n_waveplates % number of PMD waveplates -+ useGPU % GPU acceleration: true, false, or 'auto' (default) -+ useSingle % Use single precision on GPU (default: false) -  - % ---- Internal state (persistent between calls) ---- - state % struct mirroring legacy 'state' -@@ -56,6 +58,8 @@ classdef DP_Fiber - options.SS_dzmax = 2e4 % m - options.SS_dzmin = 100 % m - options.n_waveplates = 100 -+ options.useGPU = 'auto' % 'auto', true, or false -+ options.useSingle = false % single precision GPU - end -  - % Copy provided options into properties -@@ -208,7 +212,7 @@ classdef DP_Fiber - % Frequency-dependent PMD phase term (legacy form) - st.brf.db0 = (R.rand(st.wave_plates,1)*2*pi - pi) * brf_multiplier; - st.brf.db1 = sqrt(3*pi/8)*(st.dgd/obj.fa)/st.wave_plates .* st.omega; -- st.brf.simdgd = 0;  -+ st.brf.simdgd = 0; - % cumsum used in legacy only for debug; keep compatibility variable: - ~cumsum(st.brf.db0); % no-op to mirror legacy path -  -@@ -228,7 +232,18 @@ classdef DP_Fiber - x_in = signal_in(:,1).'; - y_in = signal_in(:,2).'; -  -- [x_out, y_out, obj.state] = CNLSE_plain(x_in, y_in, obj.state); -+ % Determine GPU usage -+ if ischar(obj.useGPU) || isstring(obj.useGPU) -+ if strcmpi(obj.useGPU, 'auto') -+ gpuFlag = []; % Let CNLSE_plain auto-detect -+ else -+ error('DP_Fiber:InvalidGPU', 'useGPU must be true, false, or ''auto'''); -+ end -+ else -+ gpuFlag = logical(obj.useGPU); -+ end -+ -+ [x_out, y_out, obj.state] = CNLSE_plain(x_in, y_in, obj.state, gpuFlag, obj.useSingle); -  - obj.state.propagated_length = obj.state.propagated_length + obj.state.L; -  -diff --git a/Classes/02_optical/Optical_Demultiplex.m b/Classes/02_optical/Optical_Demultiplex.m -index 7d7c39e..8e272d2 100644 ---- a/Classes/02_optical/Optical_Demultiplex.m -+++ b/Classes/02_optical/Optical_Demultiplex.m -@@ -42,7 +42,7 @@ classdef Optical_Demultiplex < handle -  - function signalclasses_out = process(obj, signalclass_in) -  -- % ---- Infer wavelength: either given or from input total signal  -+ % ---- Infer wavelength: either given or from input total signal - if isempty(obj.wavelengthplan) - obj.wavelengthplan = signalclass_in.lambda; %meter - else -@@ -81,7 +81,7 @@ classdef Optical_Demultiplex < handle - obj - signal_in - end --  -+ - w = obj.fs_out ./ obj.fs_in ; - blocklen_in = length(signal_in); - blocklen_out = w*blocklen_in; -@@ -119,30 +119,31 @@ classdef Optical_Demultiplex < handle - N = size(lo,1); - C = size(lo,2); -  -- x_envelopes = zeros(N, C, 'like', signal_in); -- y_envelopes = zeros(N, C, 'like', signal_in); -+ % ---- VECTORIZED: Process all channels in parallel ---- -+ % Batched FFT operates on each column simultaneously on GPU -  -- s1 = signal_in(:,1); -- s2 = signal_in(:,2); -+ % Extract polarization signals -+ s1 = signal_in(:,1); % X polarization [N×1] -+ s2 = signal_in(:,2); % Y polarization [N×1] -  -- % Reusable work buffers (avoid reallocations) -- wrk_time = zeros(N,1, 'like', signal_in); -- wrk_freq = zeros(N,1, 'like', signal_in); -+ % Broadcast signal to all channels and multiply with LO -+ % s1, s2 are [N×1], lo is [N×C] → result is [N×C] -+ x_mixed = att .* s1 .* lo; % [N×C] -+ y_mixed = att .* s2 .* lo; % [N×C] -+ -+ % Batched FFT: each column computed in parallel -+ x_freq = fft(x_mixed); % [N×C] -+ y_freq = fft(y_mixed); % [N×C] -+ -+ % Apply filter (H is [N×1], broadcasts across columns) -+ x_filtered = x_freq .* H; % [N×C] -+ y_filtered = y_freq .* H; % [N×C] -+ -+ % Batched IFFT -+ x_envelopes = ifft(x_filtered); % [N×C] -+ y_envelopes = ifft(y_filtered); % [N×C] -  -- for c = 1:C -- % ---- X branch ---- -- wrk_time(:) = att .* s1 .* lo(:,c); % N×1 -- wrk_freq(:) = fft(wrk_time); % N×1 -- wrk_freq(:) = wrk_freq .* H; % N×1 -- x_envelopes(:,c) = ifft(wrk_freq); % N×1 -  -- % ---- Y branch ---- -- wrk_time(:) = att .* s2 .* lo(:,c); -- wrk_freq(:) = fft(wrk_time); -- wrk_freq(:) = wrk_freq .* H; -- y_envelopes(:,c) = ifft(wrk_freq); -- end --  - end - end - end -diff --git a/Classes/02_optical/Optical_Multiplex.m b/Classes/02_optical/Optical_Multiplex.m -index 1d722b0..7fc8a33 100644 ---- a/Classes/02_optical/Optical_Multiplex.m -+++ b/Classes/02_optical/Optical_Multiplex.m -@@ -1,10 +1,10 @@ - classdef Optical_Multiplex < handle - % Takes a cell array of signals -- % returns a total field signal  -- % WDM spacing is given in wavelength plan OR via delta_F  --  -+ % returns a total field signal -+ % WDM spacing is given in wavelength plan OR via delta_F -+ - % The grid is stored in the output signal -> the demux will ideally -- % look this up and use this as the demux frequencies...  -+ % look this up and use this as the demux frequencies... -  - % signal_cell = {Opt_sig_1, Opt_sig_2}; - % Opt_sig_wdm = Optical_Multiplex("fs_in",Opt_sig.fs,"fs_out",4*Opt_sig.fs,... -@@ -117,7 +117,7 @@ classdef Optical_Multiplex < handle - % adapt frequency shifts to match the FFT grid! Find nearest grid point - [glitch(o),pos] = min(abs( freqaxis-obj.df_T(o) )); - obj.df_T(o) = freqaxis(pos); --  -+ - polrots = [polrots, data_in{o}.polrot]; - end -  -@@ -139,25 +139,36 @@ classdef Optical_Multiplex < handle -  - x_envelopes = NaN([blocklen_out N]); - y_envelopes = x_envelopes; --  -- for o = 1:N -- -- pha = mod(2*pi*(0:blocklen_out-1)*obj.df_T(o)/obj.fs_out,2*pi).'; -- lo = cos(pha)+1i*sin(pha); -- data_in_resampled = data_in{o}.resample("fs_out",obj.fs_out); -  -- res_env = ifft(fft(data_in_resampled.signal(:,1)).*H); -- x_envelopes(:,o) = att.*res_env.*lo; -+ % ---- OPTIMIZED: Pre-compute all LO phases as [blocklen_out × N] matrix ---- -+ time_idx = (0:blocklen_out-1).'; % [blocklen_out × 1] -+ lo_phases = mod(2*pi * time_idx * obj.df_T / obj.fs_out, 2*pi); % [blocklen_out × N] -+ lo_all = cos(lo_phases) + 1i*sin(lo_phases); % [blocklen_out × N] -  -- res_env = ifft(fft(data_in_resampled.signal(:,2)).*H); -- y_envelopes(:,o) = att.*res_env.*lo; -+ % Collect all resampled signals first (still requires loop due to cell array) -+ x_signals = zeros(blocklen_out, N); -+ y_signals = zeros(blocklen_out, N); -  -+ for o = 1:N -+ data_in_resampled = data_in{o}.resample("fs_out", obj.fs_out); -+ x_signals(:, o) = data_in_resampled.signal(:, 1); -+ y_signals(:, o) = data_in_resampled.signal(:, 2); - end -  -+ % ---- VECTORIZED: Batched FFT/IFFT for all channels ---- -+ % Apply filter to all channels at once -+ x_filtered = ifft(fft(x_signals) .* H); % [blocklen_out × N] -+ y_filtered = ifft(fft(y_signals) .* H); % [blocklen_out × N] -+ -+ % Apply attenuation and LO shift to all channels -+ x_envelopes = att .* x_filtered .* lo_all; % [blocklen_out × N] -+ y_envelopes = att .* y_filtered .* lo_all; % [blocklen_out × N] -+ - data_out = data_in_resampled; - data_out.signal = [sum(x_envelopes,2), sum(y_envelopes,2)]; - data_out.lambda = obj.lambda_T; - data_out.polrot = polrots; -+ - end -  - end -diff --git a/Classes/02_optical/dp_fiber_lib/CNLSE_plain.m b/Classes/02_optical/dp_fiber_lib/CNLSE_plain.m -index cfa7294..463adca 100644 ---- a/Classes/02_optical/dp_fiber_lib/CNLSE_plain.m -+++ b/Classes/02_optical/dp_fiber_lib/CNLSE_plain.m -@@ -1,41 +1,72 @@ -  --function [opt_out_x,opt_out_y,state] = CNLSE_plain(opt_in_x,opt_in_y,state) --  -- -- -- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -- % pre calculations -- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -- -- state.common_beta=struct('X',0,'Y',0); -- -- for n=1:2 -- % get current polarization name and contrary one -- curPol = state.polNames{n}; -+function [opt_out_x,opt_out_y,state] = CNLSE_plain(opt_in_x,opt_in_y,state,useGPU,useSingle) -+ -+% GPU auto-detection if not specified -+if nargin < 4 || isempty(useGPU) -+ useGPU = canUseGPU(); -+end -+if nargin < 5 || isempty(useSingle) -+ useSingle = false; -+end -+ -+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -+% pre calculations -+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -+ -+state.common_beta=struct('X',0,'Y',0); -+ -+for n=1:2 -+ % get current polarization name and contrary one -+ curPol = state.polNames{n}; -+ -+ % extend linear transfer function depending on beta values for the current polarization -+ % Was ist der Sinn dieser komischen beta notation? zB. state.beta.X = [0.3142 0 -9.1105e-28 5.1068e-41] -+ for n_beta = 1:length(state.beta.(curPol)) -+ state.common_beta.(curPol) = state.common_beta.(curPol) + state.beta.(curPol)(n_beta) * (state.omega).^(n_beta-1) / factorial(n_beta-1); -+ end -  -- % extend linear transfer function depending on beta values for the current polarization -- % Was ist der Sinn dieser komischen beta notation? zB. state.beta.X = [0.3142 0 -9.1105e-28 5.1068e-41] -- for n_beta = 1:length(state.beta.(curPol)) -- state.common_beta.(curPol) = state.common_beta.(curPol) + state.beta.(curPol)(n_beta) * (state.omega).^(n_beta-1) / factorial(n_beta-1); -+ %opt_out_struct.(curPol)=opt_in_struct.(curPol).envelope; -+end -+ -+beta_const = state.beta.('X')(1); -+beta_1 = state.beta.('X')(2); -+beta_2 = state.beta.('X')(3); -+beta_3 = state.beta.('X')(4); -+deltaomega = state.omega; -+beta_x = beta_const + beta_1 * deltaomega + 1/2 * beta_2 * deltaomega.^2 + 1/6 *beta_3 * deltaomega.^3; -+ -+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -+% GPU Transfer (if enabled) -+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -+if useGPU -+ % Convert to single precision if requested (faster on most GPUs) -+ if useSingle -+ opt_in_x = gpuArray(single(opt_in_x)); -+ opt_in_y = gpuArray(single(opt_in_y)); -+ state.common_beta.X = gpuArray(single(state.common_beta.X)); -+ state.common_beta.Y = gpuArray(single(state.common_beta.Y)); -+ state.brf.db1 = gpuArray(single(state.brf.db1)); -+ state.brf.db0 = gpuArray(single(state.brf.db0)); -+ for k = 1:numel(state.brf.matR) -+ state.brf.matR{k} = gpuArray(single(state.brf.matR{k})); -+ end -+ else -+ opt_in_x = gpuArray(opt_in_x); -+ opt_in_y = gpuArray(opt_in_y); -+ state.common_beta.X = gpuArray(state.common_beta.X); -+ state.common_beta.Y = gpuArray(state.common_beta.Y); -+ state.brf.db1 = gpuArray(state.brf.db1); -+ state.brf.db0 = gpuArray(state.brf.db0); -+ for k = 1:numel(state.brf.matR) -+ state.brf.matR{k} = gpuArray(state.brf.matR{k}); - end -- -- %opt_out_struct.(curPol)=opt_in_struct.(curPol).envelope;  - end -+end -+ -  -- beta_const = state.beta.('X')(1); -- beta_1 = state.beta.('X')(2); -- beta_2 = state.beta.('X')(3); -- beta_3 = state.beta.('X')(4); -- deltaomega = state.omega; -- beta_x = beta_const + beta_1 * deltaomega + 1/2 * beta_2 * deltaomega.^2 + 1/6 *beta_3 * deltaomega.^3;  --  --% opt_in_x = gpuArray(opt_in_x); --% opt_in_y = gpuArray(opt_in_y); -- --  -- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -- % Split Step Method -- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -+% Split Step Method -+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -  - % [opt_out_x,opt_out_y] = split_step_loop(state.L,opt_in_x,opt_in_y,state.gamma,state.SS_dzmin,state.SS_dzmax,state.SS_dphimax,state.alpha_lin,... - % state.lin_z_test,state.corr_length,state.n_plates_done,state.missing_dz,state.brf,state.common_beta,.... -@@ -44,35 +75,33 @@ function [opt_out_x,opt_out_y,state] = CNLSE_plain(opt_in_x,opt_in_y,state) - % [opt_out_x,opt_out_y] = split_step_loop_mex(state.L,opt_in_x,opt_in_y,state.gamma,state.SS_dzmin,state.SS_dzmax,state.SS_dphimax,state.alpha_lin,... - % state.lin_z_test,state.corr_length,state.n_plates_done,state.missing_dz,state.brf,state.common_beta,.... - % state.chi,state.manakov,state.beat_len); --  -- % get nonlinear step size -- [state.dz] = getNLstepsize(opt_in_x,opt_in_y,state.gamma,state.SS_dzmin,state.SS_dzmax,state.SS_dphimax,state.alpha_lin); -- %[state.dz] = getNLstepsize_original(state,opt_out_struct); --  -- state.n_step = 0; -- state.z_prop = 0; -- state.test_dz = []; -- state.powers = []; -  -- tic -+% get nonlinear step size -+[state.dz] = getNLstepsize(opt_in_x,opt_in_y,state.gamma,state.SS_dzmin,state.SS_dzmax,state.SS_dphimax,state.alpha_lin); -+%[state.dz] = getNLstepsize_original(state,opt_out_struct); -  -- while state.z_prop < state.L  -+state.n_step = 0; -+state.z_prop = 0; -+state.test_dz = []; -+state.powers = []; -  -- % reduce step length (dz) if we are to overshoot the fiber length -- % (L) in the next step -- if state.z_prop + state.dz > state.L -- state.dz = state.L - state.z_prop; -- end --  -- % update step number (n) -- state.n_step=state.n_step+1; -+while state.z_prop < state.L -  -- % append current step length to logbook (dzs) -- state.dzs(state.n_step)=state.dz; -+ % reduce step length (dz) if we are to overshoot the fiber length -+ % (L) in the next step -+ if state.z_prop + state.dz > state.L -+ state.dz = state.L - state.z_prop; -+ end -+ -+ % update step number (n) -+ state.n_step=state.n_step+1; -+ -+ % append current step length to logbook (dzs) -+ state.dzs(state.n_step)=state.dz; -  --  -- % half linear step -- [opt_in_x,opt_in_y,state.z_prop,state.lin_z_test,... -+ -+ % half linear step -+ [opt_in_x,opt_in_y,state.z_prop,state.lin_z_test,... - state.corr_length,state.n_plates_done,state.missing_dz,state.n_step,... - state.test_plates,state.test_plate_numbers,state.brf,state.common_beta.X,... - state.common_beta.Y,state.alpha_lin.X,state.alpha_lin.X]... -@@ -82,12 +111,12 @@ function [opt_out_x,opt_out_y,state] = CNLSE_plain(opt_in_x,opt_in_y,state) - state.test_plates,state.test_plate_numbers,state.brf,state.common_beta.X,... - state.common_beta.Y,state.alpha_lin.X,state.alpha_lin.X); -  -- % complete nonlinear step --  -- [opt_in_x,opt_in_y] = nl_step(opt_in_x,opt_in_y, state.dz, state.gamma, state.chi, state.manakov, state.beat_len ,state.alpha_lin.X, state.alpha_lin.Y); --  -- % half linear step  -- [opt_in_x,opt_in_y,state.z_prop,state.lin_z_test,... -+ % complete nonlinear step -+ -+ [opt_in_x,opt_in_y] = nl_step(opt_in_x,opt_in_y, state.dz, state.gamma, state.chi, state.manakov, state.beat_len ,state.alpha_lin.X, state.alpha_lin.Y); -+ -+ % half linear step -+ [opt_in_x,opt_in_y,state.z_prop,state.lin_z_test,... - state.corr_length,state.n_plates_done,state.missing_dz,state.n_step,... - state.test_plates,state.test_plate_numbers,state.brf,state.common_beta.X,... - state.common_beta.Y,state.alpha_lin.X,state.alpha_lin.X]... -@@ -97,24 +126,34 @@ function [opt_out_x,opt_out_y,state] = CNLSE_plain(opt_in_x,opt_in_y,state) - state.test_plates,state.test_plate_numbers,state.brf,state.common_beta.X,... - state.common_beta.Y,state.alpha_lin.X,state.alpha_lin.X); -  -- % get nonlinear step size -- [state.dz] = getNLstepsize(opt_in_x,opt_in_y,state.gamma,state.SS_dzmin,state.SS_dzmax,state.SS_dphimax,state.alpha_lin); -- %[state.dz] = getNLstepsize_original(state,opt_out_struct); -+ % get nonlinear step size -+ [state.dz] = getNLstepsize(opt_in_x,opt_in_y,state.gamma,state.SS_dzmin,state.SS_dzmax,state.SS_dphimax,state.alpha_lin); -+ %[state.dz] = getNLstepsize_original(state,opt_out_struct); -  -  --  -- end --  -- toc -  --  -+end -+ -  -  -+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -+% GPU Gather (if enabled) -+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -+if useGPU -+ opt_out_x = gather(opt_in_x); -+ opt_out_y = gather(opt_in_y); -  -- opt_out_x = (opt_in_x); -- opt_out_y = (opt_in_y); -+ % Gather state arrays back to CPU -+ state.common_beta.X = gather(state.common_beta.X); -+ state.common_beta.Y = gather(state.common_beta.Y); -+ state.brf.db1 = gather(state.brf.db1); -+ state.brf.db0 = gather(state.brf.db0); -+ for k = 1:numel(state.brf.matR) -+ state.brf.matR{k} = gather(state.brf.matR{k}); -+ end -+else -+ opt_out_x = opt_in_x; -+ opt_out_y = opt_in_y; -+end -  --% opt_out_x = gather(opt_in_x); --% opt_out_y = gather(opt_in_y); --  - end -\ No newline at end of file -diff --git a/Classes/02_optical/dp_fiber_lib/canUseGPU.m b/Classes/02_optical/dp_fiber_lib/canUseGPU.m -new file mode 100644 -index 0000000..84666bb ---- /dev/null -+++ b/Classes/02_optical/dp_fiber_lib/canUseGPU.m -@@ -0,0 +1,20 @@ -+function canUse = canUseGPU() -+%CANUSEGPU Check if a compatible GPU is available for parallel computing -+% Returns true if MATLAB Parallel Computing Toolbox is available and -+% a CUDA-capable GPU is detected. -+ -+canUse = false; -+ -+% Check if Parallel Computing Toolbox is installed -+if ~license('test', 'Distrib_Computing_Toolbox') -+ return; -+end -+ -+% Check for GPU device -+try -+ gpu = gpuDevice(); -+ canUse = gpu.DeviceSupported; -+catch -+ canUse = false; -+end -+end -diff --git a/Classes/02_optical/dp_fiber_lib/getNLstepsize.m b/Classes/02_optical/dp_fiber_lib/getNLstepsize.m -index a70edb9..fd42eba 100644 ---- a/Classes/02_optical/dp_fiber_lib/getNLstepsize.m -+++ b/Classes/02_optical/dp_fiber_lib/getNLstepsize.m -@@ -1,25 +1,25 @@ -  - function [rDZ] = getNLstepsize(ux,uy,gamma,dzmin,dzmax,dphimax,alpha_lin) -  --  -- maxPow = max(gamma.*max(real(ux).^2+imag(ux).^2+real(uy).^2+imag(uy).^2)); --  -- Leff = dphimax/maxPow; -- alpha_lin = max([alpha_lin.X alpha_lin.Y]); -- nl_att_len_ratio = alpha_lin*Leff; --  -- if nl_att_len_ratio >= 1 -- rDZ = dzmax; -+% gather() handles gpuArray inputs - ensures scalar is on CPU for comparisons -+maxPow = gather(max(gamma.*max(real(ux).^2+imag(ux).^2+real(uy).^2+imag(uy).^2))); -+ -+Leff = dphimax/maxPow; -+alpha_lin = max([alpha_lin.X alpha_lin.Y]); -+nl_att_len_ratio = alpha_lin*Leff; -+ -+if nl_att_len_ratio >= 1 -+ rDZ = dzmax; -+else -+ if alpha_lin == 0 -+ step = Leff; - else -- if alpha_lin == 0 -- step = Leff; -- else -- %effective length? -- step = -1/alpha_lin*log(1-nl_att_len_ratio); -- end --  -- rDZ = min([step dzmax]); -- rDZ = max([rDZ dzmin]); -- end  --  -+ %effective length? -+ step = -1/alpha_lin*log(1-nl_att_len_ratio); -+ end -+ -+ rDZ = min([step dzmax]); -+ rDZ = max([rDZ dzmin]); -+end -+ - end -\ No newline at end of file -diff --git a/Classes/02_optical/dp_fiber_lib/lin_step.m b/Classes/02_optical/dp_fiber_lib/lin_step.m -index eea8a1e..cdb3562 100644 ---- a/Classes/02_optical/dp_fiber_lib/lin_step.m -+++ b/Classes/02_optical/dp_fiber_lib/lin_step.m -@@ -22,37 +22,37 @@ n_plates_left = n_plates - n_plates_done; -  - % compute last plate size ( if it fits, it should be 0) - if missing_dz > aStepSize --  -+ - last_plate = aStepSize; - missing_dz = missing_dz-aStepSize; - plate_sizes = last_plate; - plate_numbers = n_plates; --  -+ - else --  -+ - last_plate = aStepSize - missing_dz - (n_plates_left-1)*corr_length; --  -+ - if missing_dz == 0 - missing_dz = []; - end --  -+ - %build vector of plate lengths with missing plate part from prev. - %iterartion , then some normal plates and finally a fraction of a plate - %to fit into the step length - plate_sizes = [missing_dz corr_length*ones(1,n_plates_left-1) last_plate]; --  -+ - if n_plates_done == 0 - plate_numbers =[(n_plates_done+1):(n_plates-1) n_plates]; - else - plate_numbers = [n_plates_done (n_plates_done+1):(n_plates-1) n_plates]; % not wrking yet - end --  -- %remember for next step  -+ -+ %remember for next step - missing_dz = corr_length - last_plate; --  -+ - end -  --plate_steps = repmat(n_step,1,length(plate_sizes)); -+plate_steps = repmat(n_step,1,length(plate_sizes)); %#ok -  - % - %figure;stem(plate_sizes); -@@ -66,50 +66,39 @@ test_plate_numbers = [test_plate_numbers, plate_numbers]; - opt_x=fft(opt_x); - opt_y=fft(opt_y); -  --% db1 = gpuArray(brf.db1); --% db0 = gpuArray(brf.db0); --% common_beta_x = gpuArray(common_beta_x); --% common_beta_y = gpuArray(common_beta_y); -- --db1 = (brf.db1); --db0 = (brf.db0); --common_beta_x = (common_beta_x); --common_beta_y = (common_beta_y); -+% Note: db1, db0, common_beta_x, common_beta_y are already on GPU when -+% useGPU=true (transferred in CNLSE_plain) -+db1 = brf.db1; -+db0 = brf.db0; -  - % process every waveplate with given sizes in plate_sizes - for n=1:length(plate_sizes) - dz = plate_sizes(n); --  -- % figure(87);subplot(2,1,1);plot(real(x(900:1150)));subplot(2,1,2);plot(real(y(900:1150))); -- % MOV1=[MOV1 getframe(87)]; --  -+ - % extract rotation matrix from pre calculated matrices - matR = brf.matR{plate_numbers(n)}; --  -+ - % transform to eigenvalue of of fiber segment - tOpt.X = conj(matR(1,1))*opt_x + conj(matR(2,1))*opt_y; - tOpt.Y = conj(matR(1,2))*opt_x + conj(matR(2,2))*opt_y; --  -+ - % calculate statistical delta beta for pmd - delta_beta = 0.5*(db1+db0(n))/corr_length; -- % build transfer function with delta beta -- %common.beta = beta1+beta2*omega^2 --  -+ - %accumulate delta beta for log... - brf.simdgd = brf.simdgd + (db1(length(db1)/2+1)+db0(n))/corr_length; --  -+ - h.X = exp(-1j*(common_beta_x-delta_beta)*dz); - h.Y = exp(-1j*(common_beta_y+delta_beta)*dz); -- % delta_beta has to be added to the transfer function --  -+ - % process with transfer function - tOpt.X = h.X.*tOpt.X ; - tOpt.Y = h.Y.*tOpt.Y ; --  -+ - % rotate back - opt_x = matR(1,1)*tOpt.X + matR(1,2)*tOpt.Y; - opt_y = matR(2,1)*tOpt.X + matR(2,2)*tOpt.Y; --  -+ - end -  - lin_z_test = lin_z_test + sum(plate_sizes,2); -@@ -117,9 +106,8 @@ lin_z_test = lin_z_test + sum(plate_sizes,2); - %update the number of processed plates so far - n_plates_done = n_plates_done + n_plates_left; -  --% attanuate the signal each linear state with alpha --% ( 0.2dB = 4.6052e-05 ) --rOpt_x=ifft(exp(-alpha_lin_x*aStepSize/2).*opt_x); % /2 not sure why (have to find it in formulas)  --rOpt_y=ifft(exp(-alpha_lin_y*aStepSize/2).*opt_y); % but not relevant for now -+% attenuate the signal each linear step with alpha -+rOpt_x=ifft(exp(-alpha_lin_x*aStepSize/2).*opt_x); -+rOpt_y=ifft(exp(-alpha_lin_y*aStepSize/2).*opt_y); -  --end -\ No newline at end of file -+end -diff --git a/Classes/04_DSP/Equalizer/EQ.m b/Classes/04_DSP/Equalizer/EQ.m -index f9d58d2..a03d66b 100644 ---- a/Classes/04_DSP/Equalizer/EQ.m -+++ b/Classes/04_DSP/Equalizer/EQ.m -@@ -10,10 +10,6 @@ classdef EQ < handle - training_length %Number of training symbols - training_loops %Number of loops through sequence for training mode - ideal_dfe %Error free DFE decisions -- weighted_DFE %Weighted DFE on/off -- weighted_DFE_mode %Weighted DFE mode -- weighted_DFE_d_min %d_min threshold parameter for weighted DFE mode 1 -- weighted_DFE_I_mode %[a_s, b_s, I_max]-parameters for the weighted DFE -  - DB_aim %Aim at duobinary output sequence -  -@@ -72,10 +68,6 @@ classdef EQ < handle - options.training_length = 1024 %Number of training symbols - options.training_loops = 1 %Number of loops through sequence for training mode - options.ideal_dfe = 0 %Error free DFE decisions -- options.weighted_DFE = 0; -- options.weighted_DFE_mode = 'R1'; -- options.weighted_DFE_d_min = 0.5; -- options.weighted_DFE_I_mode = [5,0.5,0.6]; -  - options.DB_aim %Aim at duobinary output sequence -  -@@ -446,43 +438,6 @@ classdef EQ < handle - dd_out(k) = constellation_in_(dd_idx); - end -  -- % Implementation of a weighted DFE in -- % order to prevent error propagation. -- % For further details, study [1], chapter 3.2.2 - -- % Modifications of DFE -- -- if obj.weighted_DFE -- % define new constellations -- const = unique(ref_in); -- -- % determine reliability factor gamma_k -- if output_vec(m) > min(const) && output_vec(m) < max(const) -- gamma_k = 1 - abs(output_vec(m) - dd_out(k)); -- else -- gamma_k = 1; -- end -- -- % select mode -- if strcmp(obj.weighted_DFE_mode,'R1') -- if gamma_k >= obj.weighted_DFE_d_min -- f_gamma_k = 1; -- else -- f_gamma_k = 0; -- end -- elseif strcmp(obj.weighted_DFE_mode,'R2') -- f_gamma_k = gamma_k; -- elseif strcmp(obj.weighted_DFE_mode,'I1') -- nom = 1-exp(-obj.weighted_DFE_I_mode(1)*((gamma_k/obj.weighted_DFE_I_mode(2))-1)); -- denom = 1+exp(-obj.weighted_DFE_I_mode(1)*((gamma_k/obj.weighted_DFE_I_mode(2))-1)); -- f_gamma_k = (1/2)*((nom/denom) - 1); -- elseif strcmp(obj.weighted_DFE_mode,'I2') -- nom = 1-exp(-obj.weighted_DFE_I_mode(1)*((gamma_k/obj.weighted_DFE_I_mode(2))-1)); -- denom = 1+exp(-obj.weighted_DFE_I_mode(1)*((gamma_k/obj.weighted_DFE_I_mode(2))-1)); -- f_gamma_k = (obj.weighted_DFE_I_mode(3)/2)*((nom/denom) - 1); -- end -- % calculate weighted output -- output_vec(m) = f_gamma_k.*dd_out(k)+(1-f_gamma_k).*output_vec(m); -- end -  - if obj.Nb(1) > 0 - dd_DFE(2:end) = dd_DFE(1:end-1); -@@ -784,6 +739,3 @@ classdef EQ < handle - end - end -  --% References --% [1] T. J. Wettlin, “Experimental Evaluation of Advanced Digital Signal Processing for Intra-Datacenter Systems using Direct-Detection,” 2023. [Online]. Available: https://nbn-resolving.org/urn:nbn:de:gbv:8:3-2023-00703-8 -- -diff --git a/Classes/04_DSP/Equalizer/ML_MLSE.m b/Classes/04_DSP/Equalizer/ML_MLSE.m -index 9965525..168b837 100644 ---- a/Classes/04_DSP/Equalizer/ML_MLSE.m -+++ b/Classes/04_DSP/Equalizer/ML_MLSE.m -@@ -597,7 +597,7 @@ classdef ML_MLSE < handle - obj.S = obj.nSym; - obj.Nf = obj.order * obj.sps; - obj.nStates = obj.S^obj.L; -- obj.nFeasible = obj.nStates * obj.S; -+ obj.nFeasible = obj.nStates * obj.S; %feasible state transitions -  - % --- Trellis mapping - obj.trellis_states = reshape(obj.constellation,1,[]); -diff --git a/Classes/04_DSP/Timing Recovery/Godard_Timing_Recovery.m b/Classes/04_DSP/Timing Recovery/Godard_Timing_Recovery.m -new file mode 100644 -index 0000000..12eeeaf ---- /dev/null -+++ b/Classes/04_DSP/Timing Recovery/Godard_Timing_Recovery.m -@@ -0,0 +1,112 @@ -+classdef Godard_Timing_Recovery < handle -+ -+ properties(Access=public) -+ mode -+ num_blocks -+ fft_length -+ sps -+ rolloff -+ mu -+ Ki -+ end -+ -+ methods(Access=public) -+ function obj = Godard_Timing_Recovery(options) -+ arguments(Input) -+ -+ options.mode = 0; -+ options.num_blocks = 1; -+ options.fft_length = 1024; -+ options.sps = 2; -+ options.rolloff = 0; -+ options.mu = 0; -+ options.Ki = 1e-3; -+ -+ end -+ -+ fn = fieldnames(options); -+ for n = 1:numel(fn) -+ obj.(fn{n}) = options.(fn{n}); -+ end -+ -+ %obj-Initialization here% -+ -+ end -+ -+ function [data_out, tau_hat] = process(obj, data_in) -+ -+ data_out = data_in; -+ output_vector = zeros(length(data_in),1); -+ block_length = length(data_in)/obj.num_blocks; -+ for i = 1:obj.num_blocks -+ i_start = ((i-1)*block_length)+1; -+ i_end = i*block_length; -+ x = data_in.signal(i_start:i_end); -+ beta = obj.rolloff; -+ eta = obj.sps; -+ R = fft(x,obj.fft_length); -+ R_full = fft(x); -+  -+ if obj.mode == 0 % Classic Godard -+ % Calculate time shift -+ k0 = (1:obj.fft_length/2).'; -+ idx1 = k0; -+ idx2 = k0+(obj.fft_length/2); -+ tau_hat = sum(imag(R(idx1) .* conj(R(idx2)))); -+ elseif obj.mode == 1 || obj.mode == 2 % Modified Godard 1 -+ % Calculate Shift for the received signal -+ shiftBins = (1 - 1/eta) * obj.fft_length; -+ if abs(shiftBins - round(shiftBins)) > 1e-12 -+ disp('Warning: shiftBins=(1-1/eta)*fft_length is non-integer. Choose compatible values for fft_length and eta.'); -+ end -+ shiftBins = round(shiftBins); -+  -+ % Calculate upper and lower bounds -+ kStart = ((1-beta)/(2*eta)) * obj.fft_length; -+ kEnd = ((1+beta)/(2*eta)) * obj.fft_length - 1; -+ if abs(kStart - round(kStart)) > 1e-12 || abs(kEnd - round(kEnd)) > 1e-12 -+ disp('Warning: kStart/kEnd are non-integer. Choose compatible values for fft_length, eta, and beta.'); -+ end -+ kStart = round(kStart); -+ kEnd = round(kEnd); -+  -+ k0 = (kStart:kEnd).'; -+ idx1 = k0 + 1; -+ idx2 = mod(k0 + shiftBins, obj.fft_length) + 1; -+  -+ % Calculate time shift  -+ if obj.mode == 1 -+ tau_hat = sum(imag(R(idx1) .* conj(R(idx2)))); -+ elseif obj.mode == 2 -+ tau_hat = sum(angle(R(idx1))-angle(R(idx2))); -+ end -+ end -+ -+  -+ % % Normalization -+ % denom = floor(log10(abs(tau_hat))); -+ % tau_hat = tau_hat / 10^denom; -+ -+ % Calculate mu using a first-order loop filter -+ mu_block = obj.mu + obj.Ki * tau_hat; -+ -+ % % Shifting the signal in time domain using interpolation -+ % x_original = linspace(0,length(x)-1,length(x)).'; -+ % x_new = x_original + mu_block; -+ % output_vector(i_start:i_end) = interp1(x_original,x,x_new,'linear','extrap'); -+  -+ % Shifting the signal in frequency domain -+ k = (0:block_length-1).'; -+ phaseRamp = exp(-1j * 2*pi * (k/block_length) * mu_block); -+ R_shifted = R_full .* phaseRamp; -+ -+ output_vector(i_start:i_end) = real(ifft(R_shifted)); -+ -+ end -+ data_out.signal = output_vector; -+ end -+ -+ -+ end -+end -+ -diff --git a/Classes/04_DSP/Timing Recovery/MaxVar_Timing_Recovery.m b/Classes/04_DSP/Timing Recovery/MaxVar_Timing_Recovery.m -new file mode 100644 -index 0000000..d6517d5 ---- /dev/null -+++ b/Classes/04_DSP/Timing Recovery/MaxVar_Timing_Recovery.m -@@ -0,0 +1,111 @@ -+classdef MaxVar_Timing_Recovery < handle -+ -+ properties(Access=public) -+ mode -+ sps -+ fsym -+ fadc -+ num_tau -+ comp_signal -+ comp_mode -+ end -+ -+ methods(Access=public) -+ function obj = MaxVar_Timing_Recovery(options) -+ arguments(Input) -+ -+ options.mode = 0; -+ options.sps = 2; -+ options.fsym = 32e9; -+ options.fadc = 80e9; -+ options.num_tau = 64; -+ options.comp_signal = 0; -+ options.comp_mode = 0; -+ end -+ -+ fn = fieldnames(options); -+ for n = 1:numel(fn) -+ obj.(fn{n}) = options.(fn{n}); -+ end -+ -+ %obj-Initialization here% -+ -+ end -+ -+ function [data_out] = process(obj, data_in) -+ -+ data_out = data_in; -+ x = data_in.signal; -+ -+ if obj.comp_mode -+ our_signal = data_in; -+ their_signal = obj.comp_signal; -+ end -+ -+ if obj.mode == 0 -+ vars = zeros(obj.sps,1); -+ for phi = 1:obj.sps -+ -+ % Test variance for different start samples -+ y_phi = x(phi:obj.sps:end); -+ vars(phi) = var(y_phi); -+ -+ % Comparison to reference signal -+ if obj.comp_mode -+ our_signal.signal = x(phi:obj.sps:end); -+ our_signal.fs = 6e9; -+ our_signal.normalize("mode","rms").plot("displayname",['Our signal, ' num2str(vars(phi))],'fignum',1231+phi); -+ their_signal.normalize("mode","rms").plot("displayname",'Their signal','fignum',1231+phi); -+ end -+ -+ end -+  -+ % Choose signal configuration with the maximum variance -+ [~,phi_opt] = max(vars); -+  -+ y = x(phi_opt:obj.sps:end).';  -+ -+ elseif obj.mode == 1 -+ % Create a grid with different (sub)sample starting points -+ T = 1/obj.fsym; -+ t = (0:length(x)-1)/obj.fadc; -+ tauGrid = linspace(0, T, obj.num_tau); -+  -+ % Interpolate the signal starting from every defined point -+ % and calculate the MMSE/variance -+ vars = zeros(size(tauGrid)); -+ for i = 1:numel(tauGrid) -+ tau = tauGrid(i); -+ % tk = linspace(tau, t(end), length(x)/obj.sps); -+ tk = tau : T : t(end)+tau; -+ xk = interp1(t, x, tk, 'linear', 'extrap'); -+ if obj.comp_mode % MMSE -+ e = xk.' - obj.comp_signal.signal; -+ vars(i) = mean(abs(e).^2); -+ else % Variance -+ vars(i) = var(xk, 1); -+ end -+ end -+  -+ if obj.comp_mode % MMSE -+ [~,idx] = min(vars); -+ else % Variance -+ [~,idx] = max(vars); -+ end -+ tau_opt = tauGrid(idx); -+  -+ % Choosing the signal at optimum -+ % tk = linspace(tau_opt, t(end), length(x)/obj.sps); -+ tk = tau_opt : T : t(end)+tau_opt; -+ y = interp1(t, x, tk, 'linear', 'extrap'); -+ end -+ % if length(y) ~= length(x)/obj.sps -+ % y = [y 0]; -+ % end -+ data_out.signal = y.'; -+ end -+ -+ -+ end -+end -+ -diff --git a/Classes/04_DSP/Timing Recovery/Time_Shifter.m b/Classes/04_DSP/Timing Recovery/Time_Shifter.m -new file mode 100644 -index 0000000..f08e3fe ---- /dev/null -+++ b/Classes/04_DSP/Timing Recovery/Time_Shifter.m -@@ -0,0 +1,39 @@ -+classdef Time_Shifter < handle -+ -+ properties(Access=public) -+ value -+ end -+ -+ methods(Access=public) -+ function obj = Time_Shifter(options) -+ arguments(Input) -+ -+ options.value = 0; -+ -+ end -+ -+ fn = fieldnames(options); -+ for n = 1:numel(fn) -+ obj.(fn{n}) = options.(fn{n}); -+ end -+ -+ %obj-Initialization here% -+ -+ end -+ -+ function [data_out, tau_hat] = process(obj, data_in) -+ -+ data_out = data_in; -+ x = data_in.signal; -+ R = fft(x); -+ k = (0:length(R)-1).'; -+ phaseRamp = exp(-1j * 2*pi * (k/length(R)) * obj.value); -+ R_shifted = R .* phaseRamp; -+ data_out.signal = real(ifft(R_shifted)); -+  -+ end -+ -+ -+ end -+end -+ -diff --git a/Classes/04_DSP/Timing Recovery/Timing_Recovery.m b/Classes/04_DSP/Timing Recovery/Timing_Recovery.m -new file mode 100644 -index 0000000..3999ad7 ---- /dev/null -+++ b/Classes/04_DSP/Timing Recovery/Timing_Recovery.m -@@ -0,0 +1,49 @@ -+classdef Timing_Recovery < handle -+ -+ properties(Access=public) -+ modulation -+ timing_error_detector -+ sps -+ damping_factor -+ normalized_loop_bandwidth -+ detector_gain -+ end -+ -+ methods(Access=public) -+ function obj = Timing_Recovery(options) -+ arguments(Input) -+ -+ options.modulation = 'PAM/PSK/QAM'; -+ options.timing_error_detector = 'Gardner (non-data-aided)'; -+ options.sps = 2; -+ options.damping_factor = 1.0; -+ options.normalized_loop_bandwidth = 0.01; -+ options.detector_gain = 2.7; -+ -+ end -+ -+ fn = fieldnames(options); -+ for n = 1:numel(fn) -+ obj.(fn{n}) = options.(fn{n}); -+ end -+ -+ %obj-Initialization here% -+ -+ end -+ -+ function [data_out, timing_error] = process(obj, data_in) -+ -+ timing_synchronization = comm.SymbolSynchronizer( ... -+ "Modulation", obj.modulation,... -+ "TimingErrorDetector", obj.timing_error_detector, ... -+ "SamplesPerSymbol", obj.sps, ... -+ "DampingFactor", obj.damping_factor, ... -+ "NormalizedLoopBandwidth", obj.normalized_loop_bandwidth, ... -+ "DetectorGain", obj.detector_gain); -+ data_out = data_in; -+ [data_out.signal, timing_error] = timing_synchronization(data_in.signal); -+ -+ end -+ end -+end -+ -diff --git a/Classes/04_DSP/Timing Recovery/Timing_Recovery_GPT.m b/Classes/04_DSP/Timing Recovery/Timing_Recovery_GPT.m -new file mode 100644 -index 0000000..33d0509 ---- /dev/null -+++ b/Classes/04_DSP/Timing Recovery/Timing_Recovery_GPT.m -@@ -0,0 +1,77 @@ -+classdef Timing_Recovery_GPT < handle -+ -+ properties(Access=public) -+ sps -+ muGrid -+ end -+ -+ methods(Access=public) -+ function obj = Timing_Recovery_GPT(options) -+ arguments(Input) -+ -+ options.sps = 2; -+ options.muGrid = 0; -+ -+ end -+ -+ fn = fieldnames(options); -+ for n = 1:numel(fn) -+ obj.(fn{n}) = options.(fn{n}); -+ end -+ -+ %obj-Initialization here% -+ -+ end -+ -+ function [data_out, mu_best, score] = process(obj, data_in) -+ %MAXVARTIMINGSYNC Choose sampling phase mu that maximizes variance of downsampled symbols. -+ % -+ % data_in : matched-filtered samples (complex or real), length N -+ % sps : samples per symbol (here typically 2) -+ % muGrid : candidate fractional offsets in [0,1) -+ % -+ % data_out : symbol-rate samples (length floor(N/sps)) -+ % mu_best: chosen fractional offset -+ % score : variance score for each mu in muGrid -+ -+ data_out = data_in; -+  -+ x = data_in.signal(:); -+ N = length(x); -+ Ns = floor(N/obj.sps); -+  -+ if nargin < 3 || isempty(obj.muGrid) -+ obj.muGrid = linspace(0, 0.99, 101); % 0..0.99 in ~0.01 steps -+ end -+  -+ % Symbol indices (1-based sample positions) -+ n0 = 1; % start sample index -+ k = (0:Ns-1).'; -+ tBase = n0 + k*obj.sps; % integer times (1, 1+sps, ...) -+  -+ score = zeros(numel(obj.muGrid),1); -+  -+ for m = 1:numel(obj.muGrid) -+ mu = obj.muGrid(m); -+ t = tBase + mu; -+  -+ % Linear fractional sampling -+ y = interp1(1:N, x, t, 'linear', 'extrap'); -+  -+ % For PAM, maximize variance of real part (or abs if you prefer) -+ yr = real(y); -+ score(m) = var(yr, 1); % use population variance (normalization doesn't matter for argmax) -+ end -+  -+ % Pick best mu -+ [~, idx] = max(score); -+ mu_best = obj.muGrid(idx); -+  -+ % Resample with best mu -+ t = tBase + mu_best; -+ data_out.signal = interp1(1:N, x, t, 'linear', 'extrap'); -+ -+ end -+ end -+end -+ -diff --git a/Classes/04_DSP/Timing Recovery/Timing_Recovery_Move_It.m b/Classes/04_DSP/Timing Recovery/Timing_Recovery_Move_It.m -new file mode 100644 -index 0000000..bbd0578 ---- /dev/null -+++ b/Classes/04_DSP/Timing Recovery/Timing_Recovery_Move_It.m -@@ -0,0 +1,77 @@ -+classdef Timing_Recovery_Move_It < handle -+ -+ properties(Access=public) -+ f_sim -+ gamma -+ end -+ -+ methods(Access=public) -+ function obj = Timing_Recovery_Move_It(options) -+ arguments(Input) -+ -+ options.f_sim = 14e9; -+ options.gamma = 0.1; -+ -+ end -+ -+ fn = fieldnames(options); -+ for n = 1:numel(fn) -+ obj.(fn{n}) = options.(fn{n}); -+ end -+ -+ %obj-Initialization here% -+ -+ end -+ -+ function data_out = process(obj, data_in) -+ -+ e = NaN(size(data_in.signal)); -+ T = 1/obj.f_sim; -+ t = zeros(size(data_in.signal)); -+ t(2) = T/2; -+ mu = zeros(size(data_in.signal)); -+ -+% n = 2; -+ for k = 3:2:length(data_in.signal) -+ data_in.signal(k-1) = data_in.signal(k-1)*(1-mu(k-2)) + data_in.signal(k)*mu(k-2); -+ data_in.signal(k) = data_in.signal(k)*(1-mu(k-1)) + data_in.signal(k+1)*mu(k-1); -+ -+ % TED -+ e(k) = (data_in.signal(k-2)-data_in.signal(k))*data_in.signal(k-1);  -+ e(k+1) = e(k); -+  -+ % TED Mueller Mueller -+% e(k) = ref_in(n-1)*data_in.signal(k) - ref_in(n)*data_in.signal(k-2); -+% e(k+1) = e(k); -+% n = n+1; -+%  -+ % interpolator control -+% t(k) = t(k-1) + T/2 + obj.gamma/2*e(k); -+% t(k+1) = t(k) + T/2 + obj.gamma/2*e(k+1); -+ t(k) = t(k-1) + T/2 + obj.gamma*e(k)*T/2; -+ t(k+1) = t(k) + T/2 + obj.gamma*e(k+1)*T/2; -+% t(k) = k*T/2 + obj.gamma*e(k)*T/2; -+% t(k+1) = k*T/2 + obj.gamma*e(k+1)*T/2; -+ -+ % interpolator -+ mu(k) = t(k)/(T/2) - round(t(k)/(T/2)); -+ mu(k+1) = t(k+1)/(T/2) - round(t(k+1)/(T/2));  -+  -+ thres = 0.7; -+ if mu(k)-mu(k-1) > thres -+ mu(k) = mu(k) - 1; -+ elseif mu(k) - mu(k-1) < -thres -+ mu(k) = mu(k) + 1; -+ end -+  -+ if mu(k+1)-mu(k) > thres -+ mu(k+1) = mu(k+1) - 1; -+ elseif mu(k+1) - mu(k) < -thres -+ mu(k+1) = mu(k+1) + 1; -+ end -+ end -+ data_out = data_in; -+ end -+ end -+end -+ -diff --git a/Classes/04_DSP/Timing_Recovery.m b/Classes/04_DSP/Timing_Recovery.m -new file mode 100644 -index 0000000..23cc331 ---- /dev/null -+++ b/Classes/04_DSP/Timing_Recovery.m -@@ -0,0 +1,47 @@ -+classdef Timing_Recovery < handle -+ -+ properties(Access=public) -+ timing_error_detector -+ sps -+ damping_factor -+ normalized_loop_bandwidth -+ detector_gain -+ end -+ -+ methods(Access=public) -+ function obj = Timing_Recovery(options) -+ arguments(Input) -+ -+ options.timing_error_detector = 'Gardner'; -+ options.sps = 2; -+ options.damping_factor = 1.0; -+ options.normalized_loop_bandwidth = 0.005; -+ options.detector_gain = 1; -+ -+ end -+ -+ fn = fieldnames(options); -+ for n = 1:numel(fn) -+ obj.(fn{n}) = options.(fn{n}); -+ end -+ -+  -+ -+ end -+ -+ function [data_out,timing_error] = process(obj, data_in) -+ -+ timing_synchronization = comm.SymbolSynchronizer( ... -+ "TimingErrorDetector", obj.timing_error_detector, ... -+ "SamplesPerSymbol", obj.sps, ... -+ "DampingFactor", obj.damping_factor, ... -+ "NormalizedLoopBandwidth", obj.normalized_loop_bandwidth, ... -+ "DetectorGain", obj.detector_gain); -+ -+ data_out = data_in; -+ [data_out.signal,timing_error] = timing_synchronization(data_in.signal); -+ -+ end -+ end -+end -+ -diff --git a/Classes/DataBaseHandler/DBHandler.m b/Classes/DataBaseHandler/DBHandler.m -index 5569746..b7ba026 100644 ---- a/Classes/DataBaseHandler/DBHandler.m -+++ b/Classes/DataBaseHandler/DBHandler.m -@@ -23,6 +23,12 @@ classdef DBHandler < handle - arguments - options.dataBase = ""; % Default value for pathToDB if not provided - options.type = "mysql"; -+ options.server = ""; -+ options.port = 3306; -+ options.user = ""; -+ options.password = ""; -+  -+ - end -  - % Assign values to class properties based on input arguments -@@ -46,12 +52,13 @@ classdef DBHandler < handle -  - obj.conn = database( ... - string(obj.dataBase), ... % Database name -- "silas", ... % Username -- "silas", ... % Password (or getSecret) -+ options.user, ... % Username -+ options.password, ... % Password (or getSecret) - "Vendor", "MySQL", ... -- "Server", "134.245.243.254", ... -+ "Server", options.server, ... - "PortNumber", 3306, ... - "JDBCDriverLocation", "C:\Users\Silas\Documents\mysql-connector-j-9.3.0\mysql-connector-j-9.3.0.jar"); -+  - end -  - catch e -diff --git a/Functions/EQ_structures/ml_mlse.m b/Functions/EQ_structures/ml_mlse.m -index 84ff5cb..04fe317 100644 ---- a/Functions/EQ_structures/ml_mlse.m -+++ b/Functions/EQ_structures/ml_mlse.m -@@ -54,12 +54,6 @@ for k = 1:numel(fn) - end - json_str = jsonencode(eq_small); -  --fn = fieldnames(eq_); --for k = 1:numel(fn) -- if issparse(eq_.(fn{k})) -- eq_.(fn{k}) = full(eq_.(fn{k})); -- end --end - ml_mlse_results.config.eq = jsonencode(eq_); - ml_mlse_results.config.equalizer_structure = int32(equalizer_structure.ml_mlse); - ml_mlse_results.config.comment = 'function: ML-based MLSE'; -@@ -93,7 +87,6 @@ end - function [bits, errors, ber, error_pos, errors_precoded, ber_precoded] = calculateBER(eq_signal_hd, tx_symbols, tx_bits, precode_mode, M, eth_style) - % Calculate BER based on precoding mode - mapper = PAMmapper(M, 0, "eth_style", eth_style); --skip_front = 150; -  - switch precode_mode - case db_mode.no_db -@@ -108,11 +101,11 @@ switch precode_mode - tx_bits_precoded = mapper.demap(tx_symbols_precoded); -  - rx_bits = mapper.demap(eq_signal_hd_precoded); -- [~, errors_precoded, ber_precoded, ~] = calc_ber(rx_bits.signal, tx_bits_precoded.signal, "skip_front", skip_front, "skip_end", 150, "returnErrorLocation", 1); -+ [~, errors_precoded, ber_precoded, ~] = calc_ber(rx_bits.signal, tx_bits_precoded.signal, "skip_front", 30000, "skip_end", 150, "returnErrorLocation", 1); -  - % B) Just determine BER - rx_bits = mapper.demap(eq_signal_hd); -- [bits, errors, ber, error_pos] = calc_ber(rx_bits.signal, tx_bits.signal, "skip_front", skip_front, "skip_end", 150, "returnErrorLocation", 1); -+ [bits, errors, ber, error_pos] = calc_ber(rx_bits.signal, tx_bits.signal, "skip_front", 30000, "skip_end", 150, "returnErrorLocation", 1); -  - case db_mode.db_precoded - % Data is precoded on TX side -@@ -120,12 +113,12 @@ switch precode_mode - eq_signal_hd_decoded = Duobinary().encode(eq_signal_hd, "M", M); - eq_signal_hd_decoded = Duobinary().decode(eq_signal_hd_decoded, "M", M); - rx_bits_decoded = mapper.demap(eq_signal_hd_decoded); -- [~, errors_precoded, ber_precoded, ~] = calc_ber(rx_bits_decoded.signal, tx_bits.signal, "skip_front", skip_front, "skip_end", 150, "returnErrorLocation", 1); -+ [~, errors_precoded, ber_precoded, ~] = calc_ber(rx_bits_decoded.signal, tx_bits.signal, "skip_front", 30000, "skip_end", 150, "returnErrorLocation", 1); -  - % B) Omit the Coding by comparing with demapped TX symbol sequence - tx_bits_demapped = mapper.demap(tx_symbols); - rx_bits = mapper.demap(eq_signal_hd); -- [bits, errors, ber, error_pos] = calc_ber(rx_bits.signal, tx_bits_demapped.signal, "skip_front", skip_front, "skip_end", 150, "returnErrorLocation", 1); -+ [bits, errors, ber, error_pos] = calc_ber(rx_bits.signal, tx_bits_demapped.signal, "skip_front", 30000, "skip_end", 150, "returnErrorLocation", 1); - end - end -  -diff --git a/Functions/Theory/Dissertation/mach_zehnder_modulator.m b/Functions/Theory/Dissertation/mach_zehnder_modulator.m -new file mode 100644 -index 0000000..f9eca58 ---- /dev/null -+++ b/Functions/Theory/Dissertation/mach_zehnder_modulator.m -@@ -0,0 +1,219 @@ -+ -+ -+% Parameters -+c0 = physconst('lightspeed'); % [m/s] -+lambda0 = 1310e-9; % [m] -+omega0 = 2*pi*c0/lambda0; -+ -+L = 5e-3; % [m] effective phase section length (set as needed) -+n_eff = 2.2; % [-] effective index (set as needed) -+ -+E0 = 1; % field amplitude (arbitrary) -+Vpi = 3.2; % [V] half-wave voltage (your V_pi) -+ -+% Drive -+f0 = 1e9; % [Hz] -+fs = 200e9; % [Hz] -+Nper = 2; % number of periods -+Vpp = 0.6*Vpi; % [V] peak-to-peak of v_drive(t) -+ -+biasV = 1.1; % [V] differential bias added to v_drive -+ -+% Time axis + differential drive voltage v_drive(t) -+T = Nper/f0; -+t = (0:1/fs:T-1/fs).'; -+ -+ -+if 1 -+ % SINE -+ v_drive = biasV + (Vpp/2)*sin(2*pi*f0*t); % v_drive(t) (peak = Vpp/2) -+ -+else -+ -+ % --- Generate PAM-4 Sequence --- -+ symbols = linspace(-0.5, 0.5, 4); -+ num_symbols = 12; % Increased slightly for better visual -+ rng(44); -+ random_data = symbols(randi(4, 1, num_symbols)); -+ -+ % Create time axis (Note: T is your period from the sine code) -+ sps = round(T * fs); -+ t = (0:1/fs:(num_symbols*T)-1/fs).'; -+ -+ % Upsample to rectangular waveform -+ v_pam = repelem(random_data, sps).'; -+ -+ % Apply swing and bias: Resulting range is [biasV-Vpp/2, biasV+Vpp/2] -+ v_drive_rect = biasV + (v_pam * Vpp); -+ -+ % --- Round the edges --- -+ filter_span = round(sps/1.5); % Increased span for smoother "rounding" -+ window = gausswin(filter_span); -+ window = window / sum(window); -+ -+ % Apply filter (using 'same' to keep vector length, but be aware of edge transients) -+ v_drive = conv(v_drive_rect, window, 'same'); -+ -+end -+ -+ -+% Analytic -+v_ = linspace(-1,2, 2001); -+% Field transfer function (amplitude) -+Field_mzm_analytic = cos((pi/2)*v_); -+ -+% Power transfer function (intensity) -+P_mzm_analytic = Field_mzm_analytic.^2; -+ -+% Imbalance factor in YOUR notation: -+rho = 1;  -+ -+% Push-pull branch voltages (consistent with v_drive = v1 - v2) -+v1 = +0.5*v_drive; % arm 1 -+v2 = -0.5*v_drive; % arm 2 -+ -+% Phases phi1, phi2 -+phi1 = pi * v1 / Vpi; -+phi2 = pi * v2 / Vpi; -+ -+% Fields: E_in and E_out (exactly your Eq. (mzm_e_field)) -+E_in = E0 .* exp(1i*omega0*t); -+ -+common_phase = exp(-1i * (omega0*L*n_eff/c0)); % exp(-j*omega0*L*n_eff/c0) -+ -+E_out = E0 .* exp(1i*omega0*t) .* common_phase .* 0.5 .* ... -+ ( exp(-1i*phi1) + rho .* exp(-1i*phi2) ); -+ -+% Transfer function (numerical): E_out/E_in -+H_num = E_out ./ E_in; -+ -+% Power (normalized) -+Pnorm_num = abs(H_num).^2; % since |E_out/E_in|^2 -+ -+% Ideal TF (analytic) for comparison (rho=1, push-pull) -+H_ideal = common_phase .* cos( (pi/2) * (v_drive./Vpi) ); -+ -+Pnorm_ideal = abs(H_ideal).^2; -+Pnorm_math = cos( (pi/2) * (v_drive./Vpi) ).^2; -+ -+ -+set(groot, 'defaultLegendInterpreter', 'tex'); -+set(groot, 'defaultAxesTickLabelInterpreter', 'tex'); -+set(groot, 'defaultTextInterpreter', 'tex'); -+ -+% Normalized voltage axis (multiples of Vpi) -+v_norm = v_drive./Vpi; -+ -+colfield = [0,0,0]; %is black -+colpow = linspecer(2); -+colpow = colpow(1,:); -+colvdrive = linspecer(2); -+colvdrive = colvdrive(2,:); -+ -+%% SIGNAL IN -+figure(1); clf -+plot(v_norm,t*1e9, 'LineWidth', 1.0,'Color',colvdrive); grid on; -+ylabel('t [ns]'); xlabel('v_{drive}(t)/V_\pi');  -+title('Drive voltage (normalized)'); -+xlim([min(v_) max(v_)]); -+% mat2tikz_improved('C:\Users\Silas\Documents\6971e0b65b380ca6d71c837f\02_IMDD_System\tikz\linear_casee\mzm_input_signal.tex'); -+ -+ -+%% IN/OUT (static transfer) — normalized x-axis + analytic curve -+if 0 -+figure(2); clf -+plot(v_, Field_mzm_analytic, 'LineWidth', 1.2,'LineStyle','--','Color',colfield); hold on;% analytic power TF -+plot(v_, P_mzm_analytic, 'LineWidth', 1.2, 'Color',colpow); hold on;% analytic power TF -+% show input time signal -+plot(v_norm,-1+t*1e9, 'LineWidth', 1.0,'Color',colvdrive); grid on; -+% show output time signal -+plot(2+t*1e9, Pnorm_num, 'LineWidth', 1.0,'DisplayName','Intensity', 'Color',colvdrive); hold on; -+plot(2+t*1e9, real(H_ideal), '--', 'LineWidth', 1.0,'DisplayName','Field','Color',colfield); hold on; -+scatter(v_norm, Pnorm_num, 12, '.', 'LineWidth', 1,'MarkerEdgeColor',colvdrive);  -+scatter(biasV./Vpi,(cos((pi/2)*biasV./Vpi)^2),10,'Marker','o'); -+line([min(v_drive), min(v_drive)]./Vpi,[(cos((pi/2)*min(v_drive)./Vpi)^2), -2],'linewidth',0.5,'color','black','linestyle','--'); -+line([max(v_drive) max(v_drive)]./Vpi,[(cos((pi/2)*max(v_drive)./Vpi)^2), -2],'linewidth',0.5,'color','black','linestyle','--'); -+xline([min(v_norm) max(v_norm)]) -+ -+grid on; -+xlabel('v_{drive}(t)/V_\pi'); ylabel('|E_{out}/E_{in}|^2'); -+% legend -+xlim([min(v_) max(v_)+1]); -+ylim([-1 1]); -+ -+% mat2tikz_improved('C:\Users\Silas\Documents\6971e0b65b380ca6d71c837f\02_IMDD_System\tikz\mzm.tex'); -+end -+%% -+ -+figure(3); clf -+plot(v_, Field_mzm_analytic, 'LineWidth', 1.2,'LineStyle','--','Color',colfield); hold on;% analytic power TF -+plot(v_, P_mzm_analytic, 'LineWidth', 1.2, 'Color',colpow); hold on;% analytic power TF -+ -+scatter(v_norm, Pnorm_num, 12, '.', 'LineWidth', 1,'MarkerEdgeColor',colvdrive);  -+scatter(biasV./Vpi,(cos((pi/2)*biasV./Vpi)^2),10,'Marker','o'); -+line([min(v_drive), min(v_drive)]./Vpi,[(cos((pi/2)*min(v_drive)./Vpi)^2), -2],'linewidth',0.5,'color','black','linestyle','--'); -+line([max(v_drive) max(v_drive)]./Vpi,[(cos((pi/2)*max(v_drive)./Vpi)^2), -2],'linewidth',0.5,'color','black','linestyle','--'); -+xline([min(v_norm) max(v_norm)]) -+ -+grid on; -+xlabel('v_{drive}(t)/V_\pi'); ylabel('|E_{out}/E_{in}|^2'); -+% legend -+xlim([min(v_) max(v_)]); -+ylim([-1 1]); -+ -+% mat2tikz_improved('C:\Users\Silas\Documents\6971e0b65b380ca6d71c837f\02_IMDD_System\tikz\mzm_tramsfer_function_matlab.tex'); -+ -+ -+%%  -+ -+figure(4); clf -+% plot(v_, Field_mzm_analytic, 'LineWidth', 1.2,'LineStyle','--','Color',colfield); hold on;% analytic power TF -+plot(v_, P_mzm_analytic, 'LineWidth', 1.2, 'Color','black'); hold on;% analytic power TF -+input_dots = linspace(min(v_drive),max(v_drive),4)./Vpi; -+% input_dots = unique(v_drive_rect)./Vpi; -+output_dots = (cos((pi/2)*input_dots).^2); -+scatter(input_dots,output_dots,'Marker','x','LineWidth',1,'MarkerEdgeColor','black'); -+scatter(input_dots,zeros(size(input_dots)),'Marker','^','LineWidth',2,'MarkerEdgeColor','black'); -+% scatter(ones(size(input_dots)),output_dots,'Marker','<','LineWidth',2,'MarkerEdgeColor','black'); -+ -+for i = 1:numel(input_dots) -+ % Draw the dashed projection lines -+ line([input_dots(i), input_dots(i)], [output_dots(i), 0], 'linewidth', 0.5, 'color', 'black', 'linestyle', '--', 'handlevisibility', 'off'); -+ line([input_dots(i), 1], [output_dots(i), output_dots(i)], 'linewidth', 0.5, 'color', 'black', 'linestyle', '--', 'handlevisibility', 'off'); -+  -+ % Add the level annotation boxes near the output (y-axis) -+ % Adjust the '1.05' to move the box further right or 'output_dots(i)' for height -+ j = 3-(i-1)*2; -+ text(1, output_dots(i), sprintf('Level %d', j), ... -+ 'FontSize', 8, ... -+ 'EdgeColor', 'black', ... -+ 'BackgroundColor', 'white', ... -+ 'Margin', 2); -+end -+ -+xlim([0,1.5]); -+ylim([0,1]) -+ -+% line([min(v_drive), min(v_drive)]./Vpi,[(cos((pi/2)*min(v_drive)./Vpi)^2), 0],'linewidth',0.5,'color','black','linestyle','--'); -+% line([max(v_drive), max(v_drive)]./Vpi,[(cos((pi/2)*max(v_drive)./Vpi)^2), 0],'linewidth',0.5,'color','black','linestyle','--'); -+ -+% mat2tikz_improved('C:\Users\Silas\Documents\6971e0b65b380ca6d71c837f\02_IMDD_System\tikz\linear_casee\mzm_tf.tex'); -+% xticks(sort(input_dots)); -+% yticks(sort(output_dots)); -+grid off -+ -+ -+%%  -+% % FIELD TF (only field here; do not mix power into this figure) -+figure(5); clf -+% plot(t*1e9, real(H_num), 'LineWidth', 1.0); hold on; -+% plot(t*1e9, real(H_ideal), '--', 'LineWidth', 1.0,'DisplayName','Field','Color',colfield); hold on; -+plot(t*1e9, Pnorm_num, 'LineWidth', 1.0,'DisplayName','Intensity', 'Color',colpow); hold on; -+grid on; -+xlabel('t [ns]'); ylabel('Re\{E_{out}/E_{in}\}'); -+legend -+yticks(sort(output_dots)); -+% mat2tikz_improved('C:\Users\Silas\Documents\6971e0b65b380ca6d71c837f\02_IMDD_System\tikz\linear_casee\mzm_output_signal.tex'); -+ -+ -+ -diff --git a/Functions/mat2tikz_improved.m b/Functions/mat2tikz_improved.m -new file mode 100644 -index 0000000..a36b1d1 ---- /dev/null -+++ b/Functions/mat2tikz_improved.m -@@ -0,0 +1,23 @@ -+function mat2tikz_improved(filename) -+arguments -+ % Default to the path in your example if no argument is provided -+ filename (1,1) string = 'C:\Users\Silas\Documents\Dissertation\00_Examples\tikz\textfig.tikz'; -+end -+cleanfigure; -+matlab2tikz(char(filename), ... -+ 'width','\fwidth', ... -+ 'height','\fheight', ... -+ 'showInfo',false, ... -+ 'extraAxisOptions',{ ... -+ 'legend style={font=\footnotesize}', ... -+ 'xlabel style={font=\color{white!15!black},font=\small},',... -+ 'ylabel style={font=\color{white!15!black},font=\small},',... -+ 'legend columns=1', ... -+ 'every axis/.append style={font=\scriptsize}',... -+ 'legend columns=1',... -+ 'legend style={at={(0.02,0.98)},font=\footnotesize,draw=black!60,rounded corners=2pt,inner sep=1pt,fill=white,column sep=6pt,anchor= north west}',... -+ 'legend style={at={(0.02,0.98)},draw=white!0!white,font=\scriptsize,inner sep=0.1pt,fill=white,column sep=1pt,anchor= north west}',... -+ 'every axis/.append style={font=\scriptsize}',... -+ }); -+ -+end -\ No newline at end of file -diff --git a/Libs/wesanderson_colors/WesPalette.m b/Libs/wesanderson_colors/WesPalette.m -index 7cd1dcb..13e976f 100644 ---- a/Libs/wesanderson_colors/WesPalette.m -+++ b/Libs/wesanderson_colors/WesPalette.m -@@ -1,10 +1,13 @@ - classdef WesPalette - % WESPALETTE Wes Anderson color palettes with auto-completion - % Usage: -- % cmap = WesPalette.Zissou1.rgb() -- % cmap = WesPalette.Zissou1.rgb(3) -- -- % https://github.com/karthik/wesanderson?tab=readme-ov-file -+ % cmap = WesPalette.Zissou1.rgb() % full palette -+ % cmap = WesPalette.Zissou1.rgb(3) % 3 colors (discrete default) -+ % cmap = WesPalette.Zissou1.rgb(12,"discrete") % any n, no interpolation -+ % cmap = WesPalette.Zissou1.rgb(256,"continuous") % smooth colormap (Lab interpolation) -+ % -+ % Requires: -+ % - colorspace.m (Pascal Getreuer) on MATLAB path for "continuous" mode -  - enumeration - BottleRocket1 -@@ -34,21 +37,33 @@ classdef WesPalette - end -  - methods -- function cmap = rgb(obj, n) -+ function cmap = rgb(obj, n, mode) - % Return palette as Nx3 RGB colormap [0–1] -+ % -+ % n : number of requested colors (optional) -+ % mode : "discrete" (default) or "continuous" -  -- hex = obj.hex(); -+ base_hex = obj.hex(); -+ base_rgb = WesPalette.hex2rgb(base_hex); -  -- rgb = hex2rgb(hex); -+ if nargin < 2 || isempty(n) -+ cmap = base_rgb; -+ return; -+ end -+ if nargin < 3 || isempty(mode) -+ mode = "discrete"; -+ end -+ mode = lower(string(mode)); -  -- if nargin == 2 -- if n > size(rgb,1) -- error('Requested %d colors, but only %d available.', ... -- n, size(rgb,1)) -- end -- cmap = rgb(1:n,:); -+ validateattributes(n, {'numeric'}, {'scalar','integer','positive'}, mfilename, 'n'); -+ if mode ~= "discrete" && mode ~= "continuous" -+ error('mode must be "discrete" or "continuous".'); -+ end -+ -+ if mode == "discrete" -+ cmap = WesPalette.sample_discrete(base_rgb, n); - else -- cmap = rgb; -+ cmap = WesPalette.interpolate_continuous_lab(base_rgb, n); - end - end - end -@@ -56,78 +71,116 @@ classdef WesPalette - methods (Access = private) - function hex = hex(obj) - % Internal HEX storage -- - switch obj - case WesPalette.BottleRocket1 - hex = {'#A42820','#5F5647','#9B110E','#3F5151','#4E2A1E','#550307','#0C1707'}; -- - case WesPalette.BottleRocket2 - hex = {'#FAD510','#CB2314','#273046','#354823','#1E1E1E'}; -- - case {WesPalette.Rushmore1, WesPalette.Rushmore} - hex = {'#E1BD6D','#EABE94','#0B775E','#35274A','#F2300F'}; -- - case WesPalette.Royal1 - hex = {'#899DA4','#C93312','#FAEFD1','#DC863B'}; -- - case WesPalette.Royal2 - hex = {'#9A8822','#F5CDB4','#F8AFA8','#FDDDA0','#74A089'}; -- - case WesPalette.Zissou1 - hex = {'#3B9AB2','#78B7C5','#EBCC2A','#E1AF00','#F21A00'}; -- - case WesPalette.Zissou1Continuous - hex = {'#3A9AB2','#6FB2C1','#91BAB6','#A5C2A3','#BDC881', ... - '#DCCB4E','#E3B710','#E79805','#EC7A05','#EF5703','#F11B00'}; -- - case WesPalette.Darjeeling1 - hex = {'#FF0000','#00A08A','#F2AD00','#F98400','#5BBCD6'}; -- - case WesPalette.Darjeeling2 - hex = {'#ECCBAE','#046C9A','#D69C4E','#ABDDDE','#000000'}; -- - case WesPalette.Chevalier1 - hex = {'#446455','#FDD262','#D3DDDC','#C7B19C'}; -- - case WesPalette.FantasticFox1 - hex = {'#DD8D29','#E2D200','#46ACC8','#E58601','#B40F20'}; -- - case WesPalette.Moonrise1 - hex = {'#F3DF6C','#CEAB07','#D5D5D3','#24281A'}; -- - case WesPalette.Moonrise2 - hex = {'#798E87','#C27D38','#CCC591','#29211F'}; -- - case WesPalette.Moonrise3 - hex = {'#85D4E3','#F4B5BD','#9C964A','#CDC08C','#FAD77B'}; -- - case WesPalette.Cavalcanti1 - hex = {'#D8B70A','#02401B','#A2A475','#81A88D','#972D15'}; -- - case WesPalette.GrandBudapest1 - hex = {'#F1BB7B','#FD6467','#5B1A18','#D67236'}; -- - case WesPalette.GrandBudapest2 - hex = {'#E6A0C4','#C6CDF7','#D8A499','#7294D4'}; -- - case WesPalette.IsleofDogs1 - hex = {'#9986A5','#79402E','#CCBA72','#0F0D0E','#D9D0D3','#8D8680'}; -- - case WesPalette.IsleofDogs2 - hex = {'#EAD3BF','#AA9486','#B6854D','#39312F','#1C1718'}; -- - case WesPalette.FrenchDispatch - hex = {'#90D4CC','#BD3027','#B0AFA2','#7FC0C6','#9D9C85'}; -- - case WesPalette.AsteroidCity1 - hex = {'#0A9F9D','#CEB175','#E54E21','#6C8645','#C18748'}; -- - case WesPalette.AsteroidCity2 - hex = {'#C52E19','#AC9765','#54D8B1','#B67C3B','#175149','#AF4E24'}; -- - case WesPalette.AsteroidCity3 - hex = {'#FBA72A','#D3D4D8','#CB7A5C','#5785C1'}; - end - end - end -+ -+ methods (Static, Access = private) -+ function rgb = hex2rgb(hex) -+ % hex: cellstr like {'#RRGGBB', ...} -+ if isstring(hex), hex = cellstr(hex); end -+ n = numel(hex); -+ rgb = zeros(n,3); -+ for i = 1:n -+ h = char(hex{i}); -+ if startsWith(h,'#'), h = h(2:end); end -+ if numel(h) ~= 6 -+ error('Invalid HEX color: %s', hex{i}); -+ end -+ rgb(i,1) = hex2dec(h(1:2))/255; -+ rgb(i,2) = hex2dec(h(3:4))/255; -+ rgb(i,3) = hex2dec(h(5:6))/255; -+ end -+ end -+ -+ function cmap = sample_discrete(base_rgb, n) -+ % No interpolation; allow any n by sampling/repeating. -+ k = size(base_rgb,1); -+ -+ if n <= k -+ idx = round(linspace(1, k, n)); % spread across palette -+ idx = max(1, min(k, idx)); -+ cmap = base_rgb(idx,:); -+ else -+ reps = floor(n / k); -+ rmd = mod(n, k); -+ cmap = [repmat(base_rgb, reps, 1); base_rgb(1:rmd,:)]; -+ end -+ end -+ -+ function cmap = interpolate_continuous_lab(base_rgb, n) -+ % Smooth interpolation in Lab using colorspace(). -+ % Requires colorspace.m by Pascal Getreuer on MATLAB path. -+ -+ k = size(base_rgb,1); -+ if k == 1 -+ cmap = repmat(base_rgb, n, 1); -+ return; -+ end -+ -+ % Convert to Lab, interpolate each channel, convert back -+ lab = colorspace('Lab<-RGB', base_rgb); -+ -+ t_base = linspace(0, 1, k); -+ t_new = linspace(0, 1, n); -+ -+ lab_new = zeros(n,3); -+ for c = 1:3 -+ lab_new(:,c) = interp1(t_base, lab(:,c), t_new, 'linear'); -+ end -+ -+ rgb_new = colorspace('RGB<-Lab', lab_new); -+ -+ % Clamp to displayable gamut -+ cmap = min(max(rgb_new, 0), 1); -+ end -+ end - end -diff --git a/Libs/wesanderson_colors/minimal_example_wespalette.m b/Libs/wesanderson_colors/minimal_example_wespalette.m -index 9fcd99b..f308f27 100644 ---- a/Libs/wesanderson_colors/minimal_example_wespalette.m -+++ b/Libs/wesanderson_colors/minimal_example_wespalette.m -@@ -5,8 +5,8 @@ y2 = 1e0 ./ (1 + exp(-0.4*(x-12))); % NLPN - y3 = 1e-6 * 10.^(0.45*x); % RP on gamma - y4 = 1e-2 * 10.^(0.18*(x-8)); % RP on beta2 -  --cmap = WesPalette.AsteroidCity1.rgb(4); --cmap = linspecer(4); -+cmap = WesPalette.AsteroidCity1; -+% cmap = linspecer(4); - figure1=figure(202998);clf;hold on - lw = 0.8; ms = 4; - plot(x,y1,'LineWidth',lw,'Color',cmap(1,:),'Marker','o','MarkerEdgeColor',cmap(1,:),'MarkerFaceColor',[1,1,1],'MarkerSize',ms);  -diff --git a/projects/FSO_transmission/Evaluation Scripts/evalscript_FFE_DFE.m b/projects/FSO_transmission/Evaluation Scripts/evalscript_FFE_DFE.m -new file mode 100644 -index 0000000..29069ce ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/evalscript_FFE_DFE.m -@@ -0,0 +1,36 @@ -+taps_ffe = [200, 3, 2]; -+taps_dfe = [5, 2, 1]; -+trlen = 4096*2; -+trloops = 5; -+ddloops = 5; -+K_FFE = 1; -+DCmu = 0.005; -+mu_ffe_values = [0.001, 0.0005, 0.001]; -+mu_dfe_values = 0.0007; -+DDmu = [mu_ffe_values, mu_dfe_values]; -+DFEmu = 0.004; -+FFEmu = 0; -+plot_final = 0; -+idealdfe = 1; -+num_pf_coeffs = 1; -+damp_factor = 1; -+norm_loop_bw = 0.01; -+det_gain = 2.7; -+ -+step_size = 0.0001; -+ -+BER = []; -+taps_ffe_and_dfe = zeros(1,6); -+for i = 1:6 -+ for j = 1:200 -+ taps_ffe_and_dfe(i) = j; -+ BER_run = first_analysis_2(taps_ffe_and_dfe(1:3), taps_ffe_and_dfe(4:6), trlen, trloops, ddloops, ... -+ K_FFE, DCmu, DDmu, DFEmu, FFEmu, plot_final, idealdfe, num_pf_coeffs, ... -+ damp_factor, norm_loop_bw, det_gain); -+ BER = [BER, BER_run]; -+ close all -+ end -+ [~,index_minimum_ber] = min(BER); -+ taps_ffe_and_dfe(i) = index_minimum_ber; -+end -+disp(taps_ffe_and_dfe) -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/evalscript_ffe.m b/projects/FSO_transmission/Evaluation Scripts/evalscript_ffe.m -new file mode 100644 -index 0000000..8b55700 ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/evalscript_ffe.m -@@ -0,0 +1,57 @@ -+%% -+ffe_start = 0; -+ffe_step = 5; -+ffe_end = 30; -+ffe_first_order = ffe_start:ffe_step:ffe_end; -+ -+current = 225:10:285; -+current = string(current); -+power = [28.02, 33.2, 37.5, 42.3, 46.3, 49.3, 53.4]; -+power = string(power); -+num_pf_coeff = 4; -+% taps_ffe = [300, 0, 0]; -+taps_dfe = [0, 0, 0]; -+M = 4; -+trlength = 4096*4; -+x = 225:10:285; -+BER_PAM_4 = []; -+ -+for i = 1:length(ffe_first_order) -+ for eq_method = 2 -+ for j = 4 -+ BER_run = first_analysis_ber(current(j), power(j), num_pf_coeff, [300, 15, ffe_first_order(i)], taps_dfe, M, trlength, eq_method); -+ BER_PAM_4 = [BER_PAM_4, BER_run]; -+ end -+ end -+end -+save('C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\Silas DSP\imdd_simulation\projects\FSO_transmission\BER_PAM_4_FFE_Second_Order_Tap_Sweep.mat', 'ffe_first_order', 'BER_PAM_4') -+BER_PAM_4 = []; -+ -+%% -+BER = load('C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\Silas DSP\imdd_simulation\projects\FSO_transmission\BER_PAM_4_FFE_Second_Order_Tap_Sweep.mat'); -+BER = BER.BER_PAM_4; -+  -+figure(202120) -+plot(ffe_first_order, BER, '-o','LineWidth',1.75); -+hold on -+ -+h1 = yline(2e-2, ':k', 'LineWidth',1.5); -+h2 = yline(3.8e-3,':b', 'LineWidth',1.5); -+h3 = yline(4.85e-3,':g', 'LineWidth',1.5); -+h4 = yline(2.2e-4,':r', 'LineWidth',1.5); -+ -+% FEC Labels direkt im Plot -+text(286,2.2e-2,'o-FEC','Color','k','FontSize', 14, 'Interpreter','latex') -+text(285,3.3e-3,'HD-FEC','Color','b','FontSize', 14, 'Interpreter','latex') -+text(282.5,5.4e-3,'KP4+Hamming','Color','g','FontSize', 14,'Interpreter','latex') -+text(287,2.4e-4,'KP4','Color','r','FontSize', 14,'Interpreter','latex') -+ -+xlabel('Number of DFE First Order Taps', 'Interpreter','latex') -+ylabel('BER', 'Interpreter','latex') -+% title('BER for PAM-4', 'Interpreter','latex') -+ -+grid minor -+% ylim([1e-4 5e-1]) -+set(gca,'YScale','log') -+% beautifyBERplot -+hold off -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/evalscript_optimize_timing_recovery_parameters.m b/projects/FSO_transmission/Evaluation Scripts/evalscript_optimize_timing_recovery_parameters.m -new file mode 100644 -index 0000000..f867c5a ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/evalscript_optimize_timing_recovery_parameters.m -@@ -0,0 +1,68 @@ -+%% Fixe Simulationsparameter -+baud_rate = 6; -+power = 42.3; -+num_pf_coeff = 4; -+M = 4; -+trlength = 4096*2; -+ -+%% === Suchräume für Tap-Werte (selbst bestimmbar) ================= -+% WICHTIG: wähle Grenzen passend zur Skalierung deiner Taps. -+% Beispiel: FFE Taps vielleicht grob im Bereich [-500 .. 500], -+% DFE Taps eher kleiner, z.B. [-50 .. 50] – anpassen! -+ffeRange = [0, 500]; -+dfeRange = [0, 200]; -+ -+vars = [ -+ optimizableVariable('ffe1', ffeRange) -+ optimizableVariable('ffe2', ffeRange) -+ optimizableVariable('ffe3', ffeRange) -+ -+ optimizableVariable('dfe1', dfeRange) -+ optimizableVariable('dfe2', dfeRange) -+ optimizableVariable('dfe3', dfeRange) -+]; -+ -+%% === Objective =================================================== -+objectiveFcn = @(x) objectiveWrapperTaps(x, ... -+ baud_rate, power, num_pf_coeff, M, trlength); -+ -+%% === bayesopt ==================================================== -+results = bayesopt(objectiveFcn, vars, ... -+ 'AcquisitionFunctionName','expected-improvement-plus', ... -+ 'MaxObjectiveEvaluations', 60, ... -+ 'IsObjectiveDeterministic', false, ... -+ 'ExplorationRatio', 0.5, ... -+ 'Verbose', 1, ... -+ 'PlotFcn', {@plotObjectiveModel,@plotMinObjective}); -+ -+%% === Beste Lösung ausgeben ====================================== -+bestX = results.XAtMinObjective; -+bestBER = results.MinObjective; -+ -+bestFFE = [bestX.ffe1, bestX.ffe2, bestX.ffe3]; -+bestDFE = [bestX.dfe1, bestX.dfe2, bestX.dfe3]; -+ -+fprintf('\n=== Bestes Ergebnis ===\n'); -+fprintf('BER : %.3e\n', bestBER); -+fprintf('taps_ffe : [%g %g %g]\n', bestFFE); -+fprintf('taps_dfe : [%g %g %g]\n\n', bestDFE); -+ -+%% ================================================================= -+function ber = objectiveWrapperTaps(x, baud_rate, power, num_pf_coeff, M, trlength) -+ taps_ffe = double([x.ffe1, x.ffe2, x.ffe3]); -+ taps_dfe = double([x.dfe1, x.dfe2, x.dfe3]); -+ -+ % Optional: falls du z.B. Monotonicität / Struktur erzwingen willst, hier. -+ % taps_dfe(1) = 0; % Beispiel: ersten DFE-Tap fixieren -+ -+ try -+ ber = first_analysis_optimize(baud_rate, power, num_pf_coeff, taps_ffe, taps_dfe, M, trlength); -+ -+ if isempty(ber) || ~isscalar(ber) || ~isfinite(ber) || ber < 0 -+ ber = 1; % Penalty -+ end -+ catch ME -+ warning("Objective failed: %s", ME.message); -+ ber = 1; % Penalty -+ end -+end -diff --git a/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_2.m b/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_2.m -new file mode 100644 -index 0000000..b0310bd ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_2.m -@@ -0,0 +1,66 @@ -+%% -+current = 225:10:285; -+current = string(current); -+power = [28.02, 33.2, 37.5, 42.3, 46.3, 49.3, 53.4]; -+power = string(power); -+num_pf_coeff = 4; -+taps_ffe = [200, 0, 0]; -+taps_dfe = [0, 0, 0]; -+M = 2; -+trlength = 4096*2; -+x = 225:10:285; -+BER_PAM_2 = []; -+post_only = 0; -+ -+for eq_method = 2:4 -+ -+ if ~post_only -+ for j = 1:length(current) -+ BER_run = first_analysis_ber(current(j), power(j), num_pf_coeff, taps_ffe, taps_dfe, M, trlength, eq_method); -+ BER_PAM_2 = [BER_PAM_2, BER_run]; -+ end -+ -+ save('C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\Silas DSP\imdd_simulation\projects\FSO_transmission\BER_PAM_2_' + string(eq_method) + '.mat', 'x', 'BER_PAM_2') -+ end -+  -+end -+ -+%% -+x = 225:10:285; -+for k = 1:4 -+ BER = load('C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\Silas DSP\imdd_simulation\projects\FSO_transmission\BER_PAM_2_' + string(k) + '.mat'); -+ BER = BER.BER_PAM_2; -+  -+ figure(202120) -+ plot(x, BER, '-o','LineWidth',1.75); -+ hold on -+end -+old_BER = [-1.5, -1.75, -2, -2.3, -2.6, -2.25, -1.95]; -+old_BER = 10.^(old_BER); -+plot(x, old_BER, '-o','LineWidth',1.75) -+  -+h1 = yline(2e-2, ':k', 'LineWidth',1.5); -+h2 = yline(3.8e-3,':b', 'LineWidth',1.5); -+h3 = yline(4.85e-3,':g', 'LineWidth',1.5); -+h4 = yline(2.2e-4,':r', 'LineWidth',1.5); -+ -+% Legende NUR für Kurven -+legend('FFE', 'FFE+PF+MLSE', 'DB', 'ML-MLSE', 'BER Paper', ... -+ 'Interpreter','latex', ... -+ 'Location','southwest', 'FontSize', 14) -+ -+% FEC Labels direkt im Plot -+text(280,2.2e-2,'o-FEC','Color','k','FontSize', 14, 'Interpreter','latex') -+text(280,3.3e-3,'HD-FEC','Color','b','FontSize', 14, 'Interpreter','latex') -+text(280,5.4e-3,'KP4+Hamming','Color','g','FontSize', 14,'Interpreter','latex') -+text(280,2.4e-4,'KP4','Color','r','FontSize', 14,'Interpreter','latex') -+ -+xlabel('Laser Bias Current [mA]', 'Interpreter','latex') -+ylabel('BER', 'Interpreter','latex') -+% title('BER for PAM-2', 'Interpreter','latex') -+ -+grid minor -+ylim([1e-4 5e-1]) -+set(gca,'YScale','log') -+% beautifyBERplot -+hold off -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_4.m b/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_4.m -new file mode 100644 -index 0000000..cf3b301 ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_4.m -@@ -0,0 +1,61 @@ -+%% -+current = 225:10:285; -+current = string(current); -+power = [28.02, 33.2, 37.5, 42.3, 46.3, 49.3, 53.4]; -+power = string(power); -+num_pf_coeff = 4; -+taps_ffe = [300, 0, 0]; -+taps_dfe = [5, 0, 0]; -+M = 4; -+trlength = 4096*4; -+x = 225:10:285; -+BER_PAM_4 = []; -+ -+for eq_method = 2 -+ for j = 4 -+ BER_run = first_analysis_ber(current(j), power(j), num_pf_coeff, taps_ffe, taps_dfe, M, trlength, eq_method); -+ BER_PAM_4 = [BER_PAM_4, BER_run]; -+ end -+ save('C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\Silas DSP\imdd_simulation\projects\FSO_transmission\BER_PAM_4_DFE_' + string(eq_method) + '.mat', 'x', 'BER_PAM_4') -+ BER_PAM_4 = []; -+end -+ -+%% -+x = 225:10:285; -+for k = 1:4 -+ BER = load('C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\Silas DSP\imdd_simulation\projects\FSO_transmission\BER_PAM_4_' + string(k) + '.mat'); -+ BER = BER.BER_PAM_4; -+  -+ figure(202120) -+ plot(x, BER, '-o','LineWidth',1.75); -+ hold on -+end -+old_BER = [-1.6, -1.85, -2.2, -2.45, -2.3, -2, -1.4]; -+old_BER = 10.^(old_BER); -+plot(x, old_BER, '-o','LineWidth',1.75) -+ -+h1 = yline(2e-2, ':k', 'LineWidth',1.5); -+h2 = yline(3.8e-3,':b', 'LineWidth',1.5); -+h3 = yline(4.85e-3,':g', 'LineWidth',1.5); -+h4 = yline(2.2e-4,':r', 'LineWidth',1.5); -+ -+% Legende NUR für Kurven -+legend('FFE', 'FFE+PF+MLSE', 'DB', 'ML-MLSE', 'BER Paper', ... -+ 'Interpreter','latex', ... -+ 'Location','southwest', 'FontSize', 14) -+ -+% FEC Labels direkt im Plot -+text(286,2.2e-2,'o-FEC','Color','k','FontSize', 14, 'Interpreter','latex') -+text(285,3.3e-3,'HD-FEC','Color','b','FontSize', 14, 'Interpreter','latex') -+text(282.5,5.4e-3,'KP4+Hamming','Color','g','FontSize', 14,'Interpreter','latex') -+text(287,2.4e-4,'KP4','Color','r','FontSize', 14,'Interpreter','latex') -+ -+xlabel('Laser Bias Current [mA]', 'Interpreter','latex') -+ylabel('BER', 'Interpreter','latex') -+% title('BER for PAM-4', 'Interpreter','latex') -+ -+grid minor -+ylim([1e-4 5e-1]) -+set(gca,'YScale','log') -+% beautifyBERplot -+hold off -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_4_baud_rate_sweep.m b/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_4_baud_rate_sweep.m -new file mode 100644 -index 0000000..0575787 ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/evalscript_pam_4_baud_rate_sweep.m -@@ -0,0 +1,77 @@ -+baud_rate = 4:1:8; -+baud_rate = string(baud_rate); -+power = [8.4, 8.4, 42.3, 8.4, 8.4]; -+power = string(power); -+num_pf_coeff = 4; -+taps_ffe = [300, 0, 0]; -+taps_dfe = [0, 0, 0]; -+M = 4; -+trlength = 4096*4; -+x = 4:1:8; -+BER_PAM_4 = []; -+Alpha_PAM_4 = []; -+ -+for method = 1:4 -+ for i = 1:5 -+ [BER_run, ~] = first_analysis_baud_rate_sweep(baud_rate(i), power(i), num_pf_coeff, taps_ffe, taps_dfe, M, trlength, method); -+ BER_PAM_4 = [BER_PAM_4, BER_run]; -+ % Alpha_PAM_4 = [Alpha_PAM_4, Alpha_run]; -+ end -+ save('C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\Silas DSP\imdd_simulation\projects\FSO_transmission\New Baud Rate Sweep Data\BER_PAM_4_' + string(method) + '.mat', 'x', 'BER_PAM_4') -+ BER_PAM_4 = []; -+end -+ -+%% BER -+for k = 1:4 -+ BER = load('C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\Silas DSP\imdd_simulation\projects\FSO_transmission\New Baud Rate Sweep Data\BER_PAM_4_' + string(k) + '.mat'); -+ BER = BER.BER_PAM_4; -+ % x = BER.x; -+ % BER_Alpha = load(filename); -+ % BER = BER_Alpha.BER_PAM_4; -+  -+ % close all -+ figure(239) -+ plot(x, BER, '-o','LineWidth',1.75) -+ hold on -+end -+ -+% old_BER = [-4.4, -4, -3.3, -2.7, -2.5, -2.475]; -+% old_BER = 10.^(old_BER); -+% plot(x, old_BER, '--o','LineWidth',1) -+ -+h1 = yline(2e-2, ':k', 'LineWidth',1.5); -+h2 = yline(3.8e-3,':b', 'LineWidth',1.5); -+h3 = yline(4.85e-3,':g', 'LineWidth',1.5); -+h4 = yline(2.2e-4,':r', 'LineWidth',1.5); -+ -+% Legende NUR für Kurven -+legend('FFE','FFE+PF+MLSE','DB','ML-MLSE',... -+ 'Interpreter','latex', ... -+ 'Location','southwest', 'FontSize', 14) -+ -+% FEC Labels direkt im Plot -+text(8.2,2.3e-2,'o-FEC','Color','k','FontSize', 14, 'Interpreter','latex') -+text(8.2,3e-3,'HD-FEC','Color','b','FontSize', 14, 'Interpreter','latex') -+text(8.2,5.6e-3,'KP4+Hamming','Color','g','FontSize', 14,'Interpreter','latex') -+text(8.2,2.5e-4,'KP4','Color','r','FontSize', 14,'Interpreter','latex') -+ -+xlabel('Symbol Rate [GBd]', 'Interpreter','latex') -+ylabel('BER', 'Interpreter','latex') -+% title('BER for PAM-4', 'Interpreter','latex') -+ -+grid minor -+% ylim([1e-4 5e-2]) -+xlim([3 9]) -+set(gca,'YScale','log') -+hold off -+ -+%% Channel Alpha -+% Alpha = BER_Alpha.Alpha_PAM_4; -+% figure -+% plot(x, Alpha, '--o','LineWidth',1) -+% hold on -+% xlabel('Symbol Rate [GBd]', 'Interpreter','latex') -+% ylabel('Channel Alpha', 'Interpreter','latex') -+% title('Channel Alpha for PAM-4 - 300-Tap-FFE - 1 Postfilter Coefficients - 8192 Training Symbols', 'Interpreter','latex') -+% grid minor -+% hold off -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/evalscript_timing_shift.m b/projects/FSO_transmission/Evaluation Scripts/evalscript_timing_shift.m -new file mode 100644 -index 0000000..435b540 ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/evalscript_timing_shift.m -@@ -0,0 +1,9 @@ -+time_shift = -2:0.1:2; -+BER = zeros(1,length(time_shift)); -+for i = 1:length(time_shift) -+ BER_value = first_analysis_time_shift(time_shift(i)); -+ BER(i) = BER_value; -+ close all -+end -+figure; -+plot(time_shift,BER) -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_2.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_2.m -new file mode 100644 -index 0000000..c3a44f0 ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_2.m -@@ -0,0 +1,190 @@ -+function BER_value = first_analysis_2(taps_ffe, taps_dfe, trlen, trloops, ddloops, K_FFE, DCmu, DDmu, DFEmu, FFEmu, plot_final, idealdfe, num_pf_coeffs, damp_factor, norm_loop_bw, det_gain) -+ %% -+ base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\"; -+ mode = 0; %0 oder 1 -+ M = 2; -+  -+ all_files = dir(fullfile(base, "**/*.mat")); -+  -+ if M == 2 -+ tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat"); -+ filename = fullfile(base, "14G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+ elseif M == 4 -+ tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat"); -+ filename = fullfile(base, "6G_PAM4\M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+ end -+  -+ if mode == 1 -+ [f, p] = uigetfile(fullfile(base, "**/*.mat"));  -+ if f~=0 -+ filename = fullfile(p,f); -+ end -+ end -+  -+ tx_data = load(tx_data_path); -+ datas = load(filename); -+  -+ %% -+ str = filename; -+ M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once')); -+ assert(M==M_); -+ fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once')); -+ fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once')); -+ I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f'); -+ rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f'); -+ L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f'); -+ pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once')); -+ rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once')); -+ mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once')); -+  -+ %% -+ % Tx data -+  -+ Bits = Informationsignal(tx_data.tx_data,"fs",fsym); -+ Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym); -+  -+ mapping_style = M==4; % Pam2 is like move-it; PAM-4 is different, same mapping like ETH peopled used in Zurich... hence the "eth_style" argument here and there -+ PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme -+  -+ Symbols_ = PM.map(Bits) .* PM.scaling; -+ assert(isequal(Symbols.signal,Symbols_.signal)); -+  -+ Bits_ = PM.demap(Symbols); -+ [bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal); -+ assert(ber == 0); -+  -+ %% For comparison, apply pulsef on Tx Symbols -+ Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rc","pulselength",16,"alpha",rolloff); -+ Digi_sig_compare = Pform.process(Symbols); -+ MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+ Rx_sig_compare = MF.process(Digi_sig_compare); -+  -+ %% -+  -+ % Rx Data -+ traceData = datas.tr.lastData(2).trace.ch3; -+  -+ %FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin -+ scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin; -+ demystified = isequal(traceData.YData,scoperead_volts); -+ assert(demystified); -+  -+ Scope_sig = Electricalsignal(traceData.YData,"fs",fs); -+  -+ Scope_sig.plot("displayname",'raw','fignum',100); -+ Scope_sig.spectrum("displayname",'raw','fignum',101) -+  -+ % 1) matched filter -+ % pulse is symmetric, hence we can use pulsef firectly as matched filter. -+ % It feels off (bit I think correct) that the fsym is now the output freq.!! -+ % -> output 2 sps to omit timing recovery!? -+ Matched_Filter = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); -+ Rx_matched = Matched_Filter.process(Scope_sig); -+ Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1); -+  -+ % timing sync -> at this point we still have no symbol timing recovery, we -+ % try to do this with 2sps EQ! -+ [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+ Rx_matched_1 = Rx_synced_cell{1}; -+  -+ % Rx_Time_Rec = Rx_matched; -+ [Rx_Time_Rec, Timing_Error] = Timing_Recovery("modulation", 'PAM/PSK/QAM', "timing_error_detector",'Gardner (non-data-aided)','sps',2, ... -+ 'damping_factor',damp_factor,'normalized_loop_bandwidth',norm_loop_bw,'detector_gain',det_gain).process(Rx_matched_1); -+ figure;plot(Timing_Error); -+ % Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal, 28e9, 14e9); -+  -+ %% not working..  -+ Rx_synced = Rx_Time_Rec; -+ Rx_synced.fs = 14e9; -+ % Rx_synced = Rx_synced_cell{1}; -+ % len_tr = trlen; -+ % mu_ffe1 = mu_ffe_values(1); -+ % mu_ffe2 = mu_ffe_values(2); -+ % mu_ffe3 = mu_ffe_values(3); -+ % mu_dc = 0.005; -+ % mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; -+ % mu_dfe = mu_dfe_values; -+ duob_mode = db_mode.no_db; -+  -+ Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',2); -+  -+ Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',0); -+ Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',0); -+ Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',0); -+  -+ if M == 2 -+ ber_in_paper = 10^(-2.6); %fig 3a) 4 Gb/s MWIR FSO Transmission using Directly Modulated QCL and an Uncooled UTC-PD at Room-Temperature -+ elseif M == 4 -+ ber_in_paper = 10^(-2.5); -+ end -+  -+ %% -------------------- FFE -------------------- -+ % % requires some more digging what is going on :-)  -+ % eq_ffe = EQ("Ne",taps_ffe,"Nb",taps_dfe, ... -+ % "training_length",trlen,"training_loops",trloops,"dd_loops",ddloops, ... -+ % "K",K_FFE,"DCmu",DCmu,"DDmu",DDmu,"DFEmu",DFEmu, ... -+ % "FFEmu",FFEmu,"plotfinal",plot_final,"ideal_dfe",idealdfe); -+ %  -+ % ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ... -+ % "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ... -+ % "eth_style_symbol_mapping",mapping_style); -+ %  -+ % % ffe_results.metrics.print -+ % fprintf('My EQ: %.1e \n',ffe_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % BER_value = ffe_results.metrics.BER; -+ -+ %% -------------------- VNLE + MLSE -------------------- -+ -+ pf_ncoeffs = num_pf_coeffs; -+ eq_v = EQ("Ne",taps_ffe,"Nb",taps_dfe, ... -+ "training_length",trlen,"training_loops",trloops,"dd_loops",ddloops, ... -+ "K",K_FFE,"DCmu",DCmu,"DDmu",DDmu,"DFEmu",DFEmu, ... -+ "FFEmu",FFEmu,"plotfinal",plot_final,"ideal_dfe",idealdfe); -+ pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+ mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels); -+ -+ [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style); -+ -+ mlse_results.metrics.print -+ fprintf('My EQ: %.1e \n',mlse_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ BER_value = mlse_results.metrics.BER; -+ -+ %% -------------------- DB target -------------------- -+ % mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,'trellis_states',PAMmapper(M,0).levels); -+ %  -+ % eq_ = EQ("Ne",taps_ffe,"Nb",taps_dfe, ... -+ % "training_length",trlen,"training_loops",trloops,"dd_loops",ddloops, ... -+ % "K",K_FFE,"DCmu",DCmu,"DDmu",DDmu,"DFEmu",DFEmu, ... -+ % "FFEmu",FFEmu,"plotfinal",plot_final,"ideal_dfe",idealdfe); -+ %  -+ % dbt_results = duobinary_target(eq_,mlse_db_, M, Rx_synced, Symbols, Bits, ... -+ % "precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [],"eth_style_symbol_mapping",mapping_style); -+ %  -+ % dbt_results.metrics.print("description",'Duobinary'); -+ % mlse_results.metrics.print -+ % fprintf('My EQ: %.1e \n',dbt_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+  -+ %% -------------------- ML-based MLSE (L=2) -------------------- -+ % ml_mlse_equalizer = ML_MLSE("epochs_tr",100,"epochs_dd",1, ... -+ % "len_tr",length(Rx_synced)/2,"mu_dd",0.03,"mu_tr",0.03,"order",30,"sps",1, ... -+ % "traceback_depth",256,"L",2,"delta",10,"adaptive_mu",0); -+ %  -+ % [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style); -+ % fprintf('ML-based MLSE:'); -+ % fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ %  -+ % % -------------------- Post-FFE -------------------- -+ % eq_post = FFE("epochs_tr",5,"epochs_dd",5,"len_tr",len_tr,"mu_dd",1e-4,"mu_tr",0,"order",1001,"sps",1,"decide",0); -+ % post_ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ... -+ % "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ... -+ % "eth_style_symbol_mapping",mapping_style); -+ % fprintf('Post-FFE:'); -+ % fprintf('My EQ: %.1e \n',post_ffe_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ -+end -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_baud_rate_sweep.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_baud_rate_sweep.m -new file mode 100644 -index 0000000..0fe859c ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_baud_rate_sweep.m -@@ -0,0 +1,202 @@ -+function [BER, Channel_Alpha] = first_analysis_baud_rate_sweep(baud_rate, power, num_pf_coeff, taps_ffe, taps_dfe, M, trlength, method) -+ %% -+ close all -+ base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\Sweep Data\"; -+ mode = 0; %0 oder 1 -+ % M = 2; -+  -+ all_files = dir(fullfile(base, "**/*.mat")); -+  -+ if M == 2 -+ tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat"); -+ filename = fullfile(base, "14G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=" + current + "mA_RoP=" + power + "mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+ elseif M == 4 -+ tx_data_path = fullfile(base, baud_rate + "G_PAM4\tx_info\tx_info_PAM4_" + baud_rate + "Gbd0.6RRC.mat"); -+ filename = fullfile(base, baud_rate + "G_PAM4\M=4_Rs="+ baud_rate + "e9_Fs=8e10_I=255mA_RoP=" + power + "mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+ end -+  -+ if mode == 1 -+ [f, p] = uigetfile(fullfile(base, "**/*.mat"));  -+ if f~=0 -+ filename = fullfile(p,f); -+ end -+ end -+  -+ tx_data = load(tx_data_path); -+ datas = load(filename); -+  -+ %% -+ str = filename; -+ M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once')); -+ assert(M==M_); -+ fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once')); -+ fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once')); -+ I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f'); -+ rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f'); -+ L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f'); -+ pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once')); -+ rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once')); -+ mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once')); -+  -+ %% -+ % Tx data -+  -+ Bits = Informationsignal(tx_data.tx_data,"fs",fsym); -+ Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym); -+  -+ mapping_style = M==4; % Pam2 is like move-it; PAM-4 is different, same mapping like ETH peopled used in Zurich... hence the "eth_style" argument here and there -+ PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme -+  -+ Symbols_ = PM.map(Bits) .* PM.scaling; -+ assert(isequal(Symbols.signal,Symbols_.signal)); -+  -+ Bits_ = PM.demap(Symbols); -+ [bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal); -+ assert(ber == 0); -+  -+ %% For comparison, apply pulsef on Tx Symbols -+ Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff); -+ Digi_sig_compare = Pform.process(Symbols); -+ MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+ Rx_sig_compare = MF.process(Digi_sig_compare); -+  -+ %% -+  -+ % Rx Data -+ traceData = datas.tr.lastData(2).trace.ch3; -+  -+ %FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin -+ scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin; -+ demystified = isequal(traceData.YData,scoperead_volts); -+ assert(demystified); -+  -+ Scope_sig = Electricalsignal(traceData.YData,"fs",fs); -+  -+ Scope_sig.plot("displayname",'raw','fignum',100); -+ Scope_sig.spectrum("displayname",'raw','fignum',101) -+ -+ Kov = 14; -+ -+ Scope_sig = Scope_sig.resample('fs_in',fs,'fs_out',Kov*fsym); -+  -+ % 1) matched filter -+ % pulse is symmetric, hence we can use pulsef firectly as matched filter. -+ % It feels off (bit I think correct) that the fsym is now the output freq.!! -+ % -> output 2 sps to omit timing recovery!? -+ Matched_Filter = Pulseformer("fsym",fsym,"fdac",Kov*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); -+ Rx_matched = Matched_Filter.process(Scope_sig); -+ Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1); -+  -+ % timing sync -> at this point we still have no symbol timing recovery, we -+ % try to do this with 2sps EQ! -+ [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+ Rx_matched_1 = Rx_synced_cell{1}; -+  -+ % Rx_Time_Rec = Rx_matched; -+ % Rx_Time_Rec = Timing_Recovery_Move_It('f_sim', 28e9, 'gamma', 0.1).process(Rx_matched_1); -+  -+ Time_Rec = 1; -+ if Time_Rec -+ Rx_Time_Rec = MaxVar_Timing_Recovery('mode',0,'fsym',fsym,'fadc',Kov*fsym,'num_tau',Kov*128,'sps',Kov,'comp_signal',0,'comp_mode',0).process(Rx_matched_1); -+ sps = 1; -+ else -+ sps = 2; -+ end -+ -+ Rx_Time_Rec.fs = fsym; -+  -+ % Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal, 12e9, 6e9); -+  -+ % Rx_matched_1.plot("fignum",231231) -+ % Rx_Time_Rec.plot("fignum",231231) -+  -+ %% not working..  -+ Rx_synced = Rx_Time_Rec; -+ % Rx_synced = Rx_synced_cell{1}; -+ len_tr = trlength; -+ mu_ffe1 = 0.0001; -+ mu_ffe2 = 0.0008; -+ mu_ffe3 = 0.001; -+ mu_dc = 0.004; -+ mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; -+ mu_dfe = 0.0004; -+ duob_mode = db_mode.no_db; -+  -+ Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103); -+ Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104); -+  -+ Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1); -+ Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1); -+ Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1); -+  -+ if M == 2 -+ ber_in_paper = 10^(-2.6); %fig 3a) 4 Gb/s MWIR FSO Transmission using Directly Modulated QCL and an Uncooled UTC-PD at Room-Temperature -+ elseif M == 4 -+ ber_in_paper = 10^(-2.5); -+ end -+  -+ if method == 1 -+ %% -------------------- FFE -------------------- -+ % requires some more digging what is going on :-)  -+ eq_ffe = EQ("Ne",[500, 0, 0],"Nb",[0, 0, 0], ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+  -+ ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ... -+ "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ... -+ "eth_style_symbol_mapping",mapping_style); -+  -+ % ffe_results.metrics.print -+ fprintf('My EQ: %.1e \n',ffe_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ BER = ffe_results.metrics.BER; -+  -+ elseif method == 2 -+ %% -------------------- VNLE + MLSE -------------------- -+ pf_ncoeffs = num_pf_coeff; -+ eq_v = EQ("Ne",taps_ffe,"Nb",taps_dfe, ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+ mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels); -+  -+ [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style); -+  -+ mlse_results.metrics.print -+ fprintf('My EQ: %.1e \n',mlse_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ BER = mlse_results.metrics.BER; -+ % Channel_Alpha = mlse_results.metrics.Alpha; -+  -+ elseif method == 3 -+ %% -------------------- ML-based MLSE (L=2) -------------------- -+ ml_mlse_equalizer = ML_MLSE("epochs_tr",150,"epochs_dd",1, ... -+ "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",80,"sps",sps, ... -+ "traceback_depth",256,"L",1,"delta",4,"adaptive_mu",0); -+  -+ [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style); -+ fprintf('ML-based MLSE:\n'); -+ fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ BER = ml_mlse_results.metrics.BER; -+ -+ elseif method == 4 -+ %% -------------------- DB target -------------------- -+ mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,'trellis_states',PAMmapper(M,0).levels); -+  -+ eq_ = EQ("Ne",taps_ffe,"Nb",taps_dfe,"training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+  -+ dbt_results = duobinary_target(eq_,mlse_db_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [],"eth_style_symbol_mapping",mapping_style); -+  -+ dbt_results.metrics.print("description",'Duobinary'); -+ fprintf('My EQ: %.1e \n',dbt_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ BER = dbt_results.metrics.BER; -+ end -+ Channel_Alpha = 0; -+end -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_ber.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_ber.m -new file mode 100644 -index 0000000..bc02b58 ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_ber.m -@@ -0,0 +1,207 @@ -+function BER_value = first_analysis_ber(current, power, num_pf_coeff, taps_ffe, taps_dfe, M, trlength, eq_method) -+ %% -+ close all -+ -+ %% -+ base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\"; -+ mode = 0; %0 oder 1 -+ % M = 2; -+  -+ all_files = dir(fullfile(base, "**/*.mat")); -+  -+ if M == 2 -+ tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat"); -+ filename = fullfile(base, "14G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=" + current + "mA_RoP=" + power + "mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+ elseif M == 4 -+ tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat"); -+ filename = fullfile(base, "6G_PAM4\M=4_Rs=6e9_Fs=8e10_I=" + current + "mA_RoP=" + power + "mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+ end -+  -+ if mode == 1 -+ [f, p] = uigetfile(fullfile(base, "**/*.mat"));  -+ if f~=0 -+ filename = fullfile(p,f); -+ end -+ end -+  -+ tx_data = load(tx_data_path); -+ datas = load(filename); -+  -+ %% -+ str = filename; -+ M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once')); -+ assert(M==M_); -+ fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once')); -+ fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once')); -+ I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f'); -+ rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f'); -+ L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f'); -+ pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once')); -+ rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once')); -+ mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once')); -+  -+ %% -+ % Tx data -+  -+ Bits = Informationsignal(tx_data.tx_data,"fs",fsym); -+ Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym); -+  -+ mapping_style = M==4; % Pam2 is like move-it; PAM-4 is different, same mapping like ETH peopled used in Zurich... hence the "eth_style" argument here and there -+ PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme -+  -+ Symbols_ = PM.map(Bits) .* PM.scaling; -+ assert(isequal(Symbols.signal,Symbols_.signal)); -+  -+ Bits_ = PM.demap(Symbols); -+ [bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal); -+ assert(ber == 0); -+  -+ %% For comparison, apply pulsef on Tx Symbols -+ Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff); -+ Digi_sig_compare = Pform.process(Symbols); -+ MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+ Rx_sig_compare = MF.process(Digi_sig_compare); -+  -+ %% -+  -+ % Rx Data -+ traceData = datas.tr.lastData(2).trace.ch3; -+  -+ %FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin -+ scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin; -+ demystified = isequal(traceData.YData,scoperead_volts); -+ assert(demystified); -+  -+ Scope_sig = Electricalsignal(traceData.YData,"fs",fs); -+  -+ Scope_sig.plot("displayname",'raw','fignum',100); -+ Scope_sig.spectrum("displayname",'raw','fignum',101) -+ -+ Kov = 14; -+ -+ Scope_sig = Scope_sig.resample('fs_in', fs, 'fs_out', Kov*fsym); -+  -+ % 1) matched filter -+ % pulse is symmetric, hence we can use pulsef firectly as matched filter. -+ % It feels off (bit I think correct) that the fsym is now the output freq.!! -+ % -> output 2 sps to omit timing recovery!? -+ Matched_Filter = Pulseformer("fsym",fsym,"fdac",Kov*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); -+ Rx_matched = Matched_Filter.process(Scope_sig); -+ Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1); -+  -+ % timing sync -> at this point we still have no symbol timing recovery, we -+ % try to do this with 2sps EQ! -+ [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+ Rx_matched_1 = Rx_synced_cell{1}; -+  -+ % Rx_Time_Rec = Rx_matched; -+ % Rx_Time_Rec = Timing_Recovery_Move_It('f_sim', 28e9, 'gamma', 0.1).process(Rx_matched_1); -+  -+ Time_Rec = 1; -+ if Time_Rec -+ Rx_Time_Rec = MaxVar_Timing_Recovery('mode',0,'fsym',fsym,'fadc',Kov*fsym,'num_tau',Kov*128,'sps',Kov,'comp_signal',0,'comp_mode',0).process(Rx_matched_1); -+ sps = 1; -+ else -+ sps = Kov; -+ end -+ Rx_Time_Rec.fs = fsym; -+  -+ % Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal, 12e9, 6e9); -+  -+ % Rx_matched_1.plot("fignum",231231) -+ % Rx_Time_Rec.plot("fignum",231231) -+  -+ %% not working..  -+ Rx_synced = Rx_Time_Rec; -+ % Rx_synced = Rx_synced_cell{1}; -+ len_tr = trlength; -+ mu_ffe1 = 0.0001; -+ mu_ffe2 = 0.0008; -+ mu_ffe3 = 0.001; -+ mu_dc = 0.004; -+ mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; -+ mu_dfe = 0.0004; -+ duob_mode = db_mode.no_db; -+  -+ Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103); -+ Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104); -+  -+ Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1); -+ Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1); -+ Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1); -+  -+ if M == 2 -+ ber_in_paper = 10^(-2.6); %fig 3a) 4 Gb/s MWIR FSO Transmission using Directly Modulated QCL and an Uncooled UTC-PD at Room-Temperature -+ elseif M == 4 -+ ber_in_paper = 10^(-2.5); -+ end -+ -+ if eq_method == 1 -+  -+ %% -------------------- FFE -------------------- -+ % requires some more digging what is going on :-)  -+ eq_ffe = EQ("Ne",[500, 0, 0],"Nb",[0,0,0], ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+  -+ ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ... -+ "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ... -+ "eth_style_symbol_mapping",mapping_style); -+  -+ % ffe_results.metrics.print -+ fprintf('My EQ: %.1e \n',ffe_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ BER_value = ffe_results.metrics.BER; -+  -+ elseif eq_method == 2 -+ -+ %% -------------------- VNLE + MLSE -------------------- -+  -+ pf_ncoeffs = num_pf_coeff; -+ eq_v = EQ("Ne",taps_ffe,"Nb",taps_dfe, ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+ mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels); -+  -+ [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style); -+  -+ mlse_results.metrics.print -+ fprintf('My EQ: %.1e \n',mlse_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ BER_value = mlse_results.metrics.BER; -+ -+ elseif eq_method == 3 -+ -+ %% -------------------- DB target -------------------- -+ mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,'trellis_states',PAMmapper(M,0).levels); -+ -+ eq_ = EQ("Ne",taps_ffe,"Nb",taps_dfe,"training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ -+ dbt_results = duobinary_target(eq_,mlse_db_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [],"eth_style_symbol_mapping",mapping_style); -+ -+ dbt_results.metrics.print("description",'Duobinary'); -+ fprintf('My EQ: %.1e \n',dbt_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ BER_value = dbt_results.metrics.BER; -+ -+ elseif eq_method == 4 -+  -+ %% -------------------- ML-based MLSE (L=2) -------------------- -+ ml_mlse_equalizer = ML_MLSE("epochs_tr",150,"epochs_dd",1, ... -+ "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",80,"sps",1, ... -+ "traceback_depth",256,"L",1,"delta",4,"adaptive_mu",0); -+  -+ [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style); -+ fprintf('ML-based MLSE:\n'); -+ fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ BER_value = ml_mlse_results.metrics.BER; -+ -+ end -+end -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_mf.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_mf.m -new file mode 100644 -index 0000000..b2a6027 ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_mf.m -@@ -0,0 +1,293 @@ -+ -+<<<<<<< HEAD -+base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\"; -+======= -+base = "C:\Users\Silas\Nextcloud4\Dokumente\02_Ablage_Office\FSO_FP_QCL_60umUTC"; -+>>>>>>> 719e5508e776c18e3dcf72a954c71bdedda179e0 -+mode = 0; %0 oder 1 -+M = 2; -+ -+all_files = dir(fullfile(base, "**/*.mat")); -+ -+if M == 2 -+<<<<<<< HEAD -+ tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat"); -+ filename = fullfile(base, "14G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+elseif M == 4 -+ tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat"); -+======= -+ tx_data = load("C:\Users\Silas\Nextcloud4\Dokumente\02_Ablage_Office\FSO_FP_QCL_60umUTC\14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat"); -+ filename = fullfile(base, "14G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+elseif M == 4 -+ tx_data = load("C:\Users\Silas\Nextcloud4\Dokumente\02_Ablage_Office\FSO_FP_QCL_60umUTC\6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat"); -+>>>>>>> 719e5508e776c18e3dcf72a954c71bdedda179e0 -+ filename = fullfile(base, "6G_PAM4\M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+end -+ -+if mode == 1 -+ [f, p] = uigetfile(fullfile(base, "**/*.mat"));  -+ if f~=0 -+ filename = fullfile(p,f); -+ end -+end -+ -+tx_data = load(tx_data_path); -+datas = load(filename); -+ -+%% -+str = filename; -+M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once')); -+assert(M==M_); -+fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once')); -+fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once')); -+I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f'); -+rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f'); -+L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f'); -+pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once')); -+rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once')); -+mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once')); -+ -+%% -+% Tx data -+ -+Bits = Informationsignal(tx_data.tx_data,"fs",fsym); -+Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym); -+ -+mapping_style = M==4; % Pam2 is like move-it; PAM-4 is different, same mapping like ETH peopled used in Zurich... hence the "eth_style" argument here and there -+PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme -+ -+Symbols_ = PM.map(Bits) .* PM.scaling; -+assert(isequal(Symbols.signal,Symbols_.signal)); -+ -+Bits_ = PM.demap(Symbols); -+[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal); -+assert(ber == 0); -+ -+%% For comparison, apply pulsef on Tx Symbols -+Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Digi_sig_tx_compare = Pform.process(Symbols); -+ -+Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Digi_sync = Pform.process(Symbols); -+ -+MF = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Rx_sig_compare = MF.process(Digi_sig_tx_compare); -+ -+%% -+ -+% Rx Data -+traceData = datas.tr.lastData(2).trace.ch3; -+ -+%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin -+scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin; -+demystified = isequal(traceData.YData,scoperead_volts); -+assert(demystified); -+ -+timesig_compare = [0:1:datas.tr.lastData(1).trace.ch3.Points-1] ./ fs; -+timesig = datas.tr.lastData(1).trace.ch3.XData; -+assert(isequal(traceData.YData,scoperead_volts)); -+ -+Scope_sig = Electricalsignal(traceData.YData,"fs",fs); -+ -+%% -+% 1) matched filter -+% pulse is symmetric, hence we can use pulsef directly as matched filter. -+% It feels off (bit I think correct) that the fsym is now the output freq.!! -+% -> output 2 sps to omit timing recovery!? -+apply_matched_filter = 0; -+k = 4; -+if apply_matched_filter -+  -+ Pform = Pulseformer("fsym",fsym,"fdac",k*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); -+ Rx_matched = Pform.process(Scope_sig); -+else -+ -+ Rx_matched = Filter('filtdegree',4,"f_cutoff",fsym*0.5,"fs",Scope_sig.fs,"filterType",filtertypes.gaussian,"active",true).process(Scope_sig); -+ Rx_matched = Rx_matched.resample("fs_out",k*fsym); -+end -+Rx_matched.spectrum(); -+ -+<<<<<<< HEAD -+%% -+ -+sys = comm.SymbolSynchronizer('TimingErrorDetector', 'Gardner (non-data-aided)', ... -+ 'SamplesPerSymbol', 2, ... -+ 'DampingFactor', 0.7, ... -+ 'NormalizedLoopBandwidth', 0.01); -+Rx_symbolsync = Rx_matched; -+[Rx_symbolsync.signal, timing_error] = sys(Rx_matched.signal); -+ -+plot(timing_error); % If this is a ramp, you have drift! -+ -+%% timing sync -> at this point we still have no symbol timing recovery, we -+% % try to do this with 2sps EQ! -+ -+[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_symbolsync.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+% Rx_matched_1 = Rx_synced_cell{1}; -+%  -+% % Rx_Time_Rec = Rx_matched; -+% [Rx_Time_Rec, Timing_Error] = Timing_Recovery("modulation", 'PAM/PSK/QAM', "timing_error_detector",'Gardner (non-data-aided)','sps',2,'damping_factor',1,'normalized_loop_bandwidth',0.01,'detector_gain',2.7).process(Rx_matched_1); -+% figure;plot(Timing_Error); -+% % Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal, 28e9, 14e9); -+ -+%% not working..  -+% Rx_synced = Rx_Time_Rec; -+Rx_synced = Rx_synced_cell{1}; -+len_tr = 4096*2; -+mu_ffe1 = 0.0001; -+mu_ffe2 = 0.0008; -+mu_ffe3 = 0.001; -+mu_dc = 0.005; -+mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; -+mu_dfe = 0.0004; -+duob_mode = db_mode.no_db; -+ -+Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',2); -+ -+Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',0); -+Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',0); -+Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',0); -+======= -+%% Timing Rec -+apply_timing_rec = 1; -+if apply_timing_rec -+ [Rx_symbolsync, timing_error] = Timing_Recovery("timing_error_detector",'Gardner (non-data-aided)','sps',k,'damping_factor',0.1,'normalized_loop_bandwidth',0.1,'detector_gain',2.7).process(Rx_matched); -+ figure();plot(timing_error); -+ Rx_symbolsync.fs = fsym; -+ % Tsynch -+ [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_symbolsync.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 0); -+ Rx_synced = Rx_synced_cell{1}; -+ sps = 1; -+else -+ % Tsynch -+ [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 0); -+ Rx_synced = Rx_synced_cell{1}; -+ Rx_synced = Rx_synced.resample("fs_out",2*fsym); -+ sps = 2; -+end -+>>>>>>> 719e5508e776c18e3dcf72a954c71bdedda179e0 -+ -+if M == 2 -+ ber_in_paper = 10^(-2.6); %fig 3a) 4 Gb/s MWIR FSO Transmission using Directly Modulated QCL and an Uncooled UTC-PD at Room-Temperature -+elseif M == 4 -+ ber_in_paper = 10^(-2.5); -+end -+ -+ -+%% -+ -+Rx_synced = Rx_synced_cell{1}; -+ -+ -+% -------------------- FFE -------------------- -+% requires some more digging what is going on :-) -+eq_ffe = EQ("Ne",[50, 1, 1],"Nb",[2,0,0], ... -+ "training_length",512,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ -+vars = logspace(-4,-3,36); -+ -+parfor i = 1:numel(vars) -+ -+ len_tr = 4096; -+ mu_ffe1 = 0.01;% mus(i);%0.0001; -+ mu_ffe2 = 0.0008; -+ mu_ffe3 = 0.001; -+ mu_dc = 0.005; -+ mu_ffe = [mu_ffe1 mu_ffe2 mu_ffe3]; -+ mu_dfe = vars(i); -+ duob_mode = db_mode.no_db; -+ -+ % requires some more digging what is going on :-) -+ eq_ffe_1 = EQ("Ne",[150, 1, 0],"Nb",[50,0,0], ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",0); -+ -+ eq_ffe_2 = FFE("epochs_tr",1,"epochs_dd",vars(i),"len_tr",4096,"mu_dd",vars(i),"mu_tr",vars(i),"order",999,"sps",1,"decide",0, "adaption",adaption_method.nlms,"dd_mode",0); -+ % eq_ffe_2 = FFE_DFE("epochs_tr",5,"epochs_dd",5,"len_tr",4096*2,"ffe_mu_dd",1e-5,"dfe_mu_dd",mus(i),"ffe_mu_tr",0,"dfe_mu_tr",0,"ffe_order",50,"dfe_order",10,"sps",1,"decide",1); -+ -+ -+ ffe_results = ffe(eq_ffe_1,M,Rx_synced,Symbols,Bits, ... -+ "precode_mode",duob_mode,'showAnalysis',1,"postFFE",[], ... -+ "eth_style_symbol_mapping",mapping_style); -+ -+ ffe_results.metrics.BER -+ bers(i) = ffe_results.metrics.BER; -+end -+ -+figure(); -+plot(vars,bers); -+yline(ber_in_paper) -+beautifyBERplot(); -+%  -+fprintf('Paper: %.1e \n \n',ber_in_paper); -+ffe_results.metrics.print("description",'FFE'); -+fprintf('FFE: %.1e \n',ffe_results.metrics.BER); -+ -+ -+%% -------------------- VNLE + MLSE -------------------- -+len_tr = 4096; -+mu_ffe1 = 0.0001;% mus(i);%0.0001; -+mu_ffe2 = 0.0008; -+mu_ffe3 = 0.001; -+mu_dc = 0.005; -+mu_ffe = [mu_ffe1 mu_ffe2 mu_ffe3]; -+mu_dfe = 0.0004; -+duob_mode = db_mode.no_db; -+ -+pf_ncoeffs = 4; -+ -+vars = 1:7; -+bers = zeros(size(vars)); -+parfor i = 1:numel(vars) -+  -+ eqv = EQ("Ne",[200, 1, 0],"Nb",[2, 0, 0], ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ pf_ncoeffs = vars(i); -+ pf = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+ mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels); -+ [vnle_results, mlse_results] = vnle_postfilter_mlse(eqv, pf, mlse_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ vnle_results.metrics.print("description",'VNLE'); -+ mlse_results.metrics.print("description",'MLSE'); -+ bers(i) = mlse_results.metrics.BER; -+end -+%% -+figure();hold on -+plot(vars,bers_ffe,'DisplayName','FFE [200,0,0] + PF + MLSE'); -+plot(vars,bers_vnle,'DisplayName','VNLE [200,1,0] + PF + MLSE'); -+plot(vars,bers_vnledfe,'DisplayName','VNLE [200,1,0] + DFE [2] + PF + MLSE'); -+plot(vars,bers_vnledfe_ideal,'DisplayName','VNLE [200,1,0] + ideal DFE [2] + PF + MLSE'); -+yline(ber_in_paper); -+yline([2e-2, 4.85e-3, 3.8e-3, 2,2e-4],'LineWidth',2,'Color',[0.8,0.8,0.8],'LineStyle',':','HandleVisibility','off'); -+ylim([1e-5,0.1]); -+beautifyBERplot(); -+ -+%% -------------------- DB target -------------------- -+mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,'trellis_states',PAMmapper(M,0).levels); -+ -+eq_ = EQ("Ne",[50, 5, 5],"Nb",[0,0,0],"training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ -+dbt_results = duobinary_target(eq_,mlse_db_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [],"eth_style_symbol_mapping",mapping_style); -+ -+fprintf('Paper: %.1e \n \n',ber_in_paper); -+dbt_results.metrics.print("description",'Duobinary'); -+ -+ -+%% -+ -+%ML-based MLSE (L=2) -+mu_ml = 0.01; training_epochs = 100; -+ml_mlse_equalizer = ML_MLSE("epochs_tr",training_epochs,"epochs_dd",1, ... -+ "len_tr",len_tr,"mu_dd",mu_ml,"mu_tr",mu_ml,"order",11,"sps",1, ... -+ "traceback_depth",128,"L",3,"delta",4,"adaptive_mu",0); -+ -+[ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode); -+ml_mlse_results.metrics.print("description",'ML '); -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_optimize.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_optimize.m -new file mode 100644 -index 0000000..5d5b4f9 ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_optimize.m -@@ -0,0 +1,177 @@ -+function BER = first_analysis_optimize(baud_rate, power, num_pf_coeff, taps_ffe, taps_dfe, M, trlength) -+ %% -+ base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\Sweep Data\"; -+ mode = 0; %0 oder 1 -+ % M = 2; -+  -+ all_files = dir(fullfile(base, "**/*.mat")); -+  -+ if M == 2 -+ tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat"); -+ filename = fullfile(base, "14G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=" + current + "mA_RoP=" + power + "mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+ elseif M == 4 -+ tx_data_path = fullfile(base, baud_rate + "G_PAM4\tx_info\tx_info_PAM4_" + baud_rate + "Gbd0.6RRC.mat"); -+ filename = fullfile(base, baud_rate + "G_PAM4\M=4_Rs="+ baud_rate + "e9_Fs=8e10_I=255mA_RoP=" + power + "mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+ end -+  -+ if mode == 1 -+ [f, p] = uigetfile(fullfile(base, "**/*.mat"));  -+ if f~=0 -+ filename = fullfile(p,f); -+ end -+ end -+  -+ tx_data = load(tx_data_path); -+ datas = load(filename); -+  -+ %% -+ str = filename; -+ M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once')); -+ assert(M==M_); -+ fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once')); -+ fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once')); -+ I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f'); -+ rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f'); -+ L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f'); -+ pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once')); -+ rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once')); -+ mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once')); -+  -+ %% -+ % Tx data -+  -+ Bits = Informationsignal(tx_data.tx_data,"fs",fsym); -+ Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym); -+  -+ mapping_style = M==4; % Pam2 is like move-it; PAM-4 is different, same mapping like ETH peopled used in Zurich... hence the "eth_style" argument here and there -+ PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme -+  -+ Symbols_ = PM.map(Bits) .* PM.scaling; -+ assert(isequal(Symbols.signal,Symbols_.signal)); -+  -+ Bits_ = PM.demap(Symbols); -+ [bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal); -+ assert(ber == 0); -+  -+ %% For comparison, apply pulsef on Tx Symbols -+ Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff); -+ Digi_sig_compare = Pform.process(Symbols); -+ MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+ Rx_sig_compare = MF.process(Digi_sig_compare); -+  -+ %% -+  -+ % Rx Data -+ traceData = datas.tr.lastData(2).trace.ch3; -+  -+ %FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin -+ scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin; -+ demystified = isequal(traceData.YData,scoperead_volts); -+ assert(demystified); -+  -+ Scope_sig = Electricalsignal(traceData.YData,"fs",fs); -+  -+ Scope_sig.plot("displayname",'raw','fignum',100); -+ Scope_sig.spectrum("displayname",'raw','fignum',101) -+  -+ % 1) matched filter -+ % pulse is symmetric, hence we can use pulsef firectly as matched filter. -+ % It feels off (bit I think correct) that the fsym is now the output freq.!! -+ % -> output 2 sps to omit timing recovery!? -+ Matched_Filter = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); -+ Rx_matched = Matched_Filter.process(Scope_sig); -+ Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1); -+  -+ % timing sync -> at this point we still have no symbol timing recovery, we -+ % try to do this with 2sps EQ! -+ [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+ Rx_matched_1 = Rx_synced_cell{1}; -+  -+ % Rx_Time_Rec = Rx_matched; -+ % Rx_Time_Rec = Timing_Recovery_Move_It('f_sim', 28e9, 'gamma', 0.1).process(Rx_matched_1); -+  -+ Time_Rec = 1; -+ if Time_Rec -+ [Rx_Time_Rec, Timing_Error] = Timing_Recovery("modulation", 'PAM/PSK/QAM', "timing_error_detector",'Gardner (non-data-aided)','sps',2,'damping_factor',0.0123793,'normalized_loop_bandwidth',4.50865e-06,'detector_gain',3.33311).process(Rx_matched_1); -+ sps = 1; -+ else -+ sps = 2; -+ end -+ -+ baud_rate_num = str2double(baud_rate); -+ Rx_Time_Rec.fs = baud_rate_num*10^9; -+  -+ % Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal, 12e9, 6e9); -+  -+ % Rx_matched_1.plot("fignum",231231) -+ % Rx_Time_Rec.plot("fignum",231231) -+  -+ %% not working..  -+ Rx_synced = Rx_Time_Rec; -+ % Rx_synced = Rx_synced_cell{1}; -+ len_tr = trlength; -+ mu_ffe1 = 0.0001; -+ mu_ffe2 = 0.0008; -+ mu_ffe3 = 0.001; -+ mu_dc = 0.004; -+ mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; -+ mu_dfe = 0.0004; -+ duob_mode = db_mode.no_db; -+  -+ Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103); -+ Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104); -+  -+ Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1); -+ Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1); -+ Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1); -+  -+ if M == 2 -+ ber_in_paper = 10^(-2.6); %fig 3a) 4 Gb/s MWIR FSO Transmission using Directly Modulated QCL and an Uncooled UTC-PD at Room-Temperature -+ elseif M == 4 -+ ber_in_paper = 10^(-2.5); -+ end -+  -+ %% -------------------- FFE -------------------- -+ % % requires some more digging what is going on :-)  -+ % eq_ffe = EQ("Ne",[400, 0, 0],"Nb",[0,0,0], ... -+ % "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ % "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ % "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ %  -+ % ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ... -+ % "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ... -+ % "eth_style_symbol_mapping",mapping_style); -+ %  -+ % % ffe_results.metrics.print -+ % fprintf('My EQ: %.1e \n',ffe_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % BER_value = ffe_results.metrics.BER; -+  -+ %% -------------------- VNLE + MLSE -------------------- -+  -+ pf_ncoeffs = num_pf_coeff; -+ eq_v = EQ("Ne",taps_ffe,"Nb",taps_dfe, ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+ mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels); -+  -+ [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style); -+  -+ mlse_results.metrics.print -+ fprintf('My EQ: %.1e \n',mlse_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ BER = mlse_results.metrics.BER; -+  -+ %% -------------------- ML-based MLSE (L=2) -------------------- -+ % ml_mlse_equalizer = ML_MLSE("epochs_tr",150,"epochs_dd",1, ... -+ % "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",80,"sps",1, ... -+ % "traceback_depth",256,"L",1,"delta",4,"adaptive_mu",0); -+ %  -+ % [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style); -+ % fprintf('ML-based MLSE:\n'); -+ % fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+end -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_rec.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_rec.m -new file mode 100644 -index 0000000..22622ec ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_rec.m -@@ -0,0 +1,160 @@ -+%% -+base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\"; -+mode = 0; %0 oder 1 -+M = 4; -+ -+all_files = dir(fullfile(base, "**/*.mat")); -+ -+if M == 2 -+ tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat"); -+ filename = fullfile(base, "14G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+elseif M == 4 -+ tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat"); -+ filename = fullfile(base, "6G_PAM4\M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+end -+ -+if mode == 1 -+ [f, p] = uigetfile(fullfile(base, "**/*.mat"));  -+ if f~=0 -+ filename = fullfile(p,f); -+ end -+end -+ -+tx_data = load(tx_data_path); -+datas = load(filename); -+ -+%% -+str = filename; -+M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once')); -+assert(M==M_); -+fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once')); -+fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once')); -+I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f'); -+rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f'); -+L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f'); -+pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once')); -+rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once')); -+mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once')); -+ -+%% -+% Tx data -+ -+Bits = Informationsignal(tx_data.tx_data,"fs",fsym); -+Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym); -+ -+mapping_style = M==4; % Pam2 is like move-it; PAM-4 is different, same mapping like ETH peopled used in Zurich... hence the "eth_style" argument here and there -+PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme -+ -+Symbols_ = PM.map(Bits) .* PM.scaling; -+assert(isequal(Symbols.signal,Symbols_.signal)); -+ -+Bits_ = PM.demap(Symbols); -+[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal); -+assert(ber == 0); -+ -+%% For comparison, apply pulsef on Tx Symbols -+Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Digi_sig_compare = Pform.process(Symbols); -+MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Rx_sig_compare = MF.process(Digi_sig_compare); -+ -+%% -+ -+% Rx Data -+traceData = datas.tr.lastData(2).trace.ch3; -+ -+%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin -+scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin; -+demystified = isequal(traceData.YData,scoperead_volts); -+assert(demystified); -+ -+Scope_sig = Electricalsignal(traceData.YData,"fs",fs); -+ -+Scope_sig.plot("displayname",'raw','fignum',100); -+Scope_sig.spectrum("displayname",'raw','fignum',101) -+ -+% 1) matched filter -+% pulse is symmetric, hence we can use pulsef firectly as matched filter. -+% It feels off (bit I think correct) that the fsym is now the output freq.!! -+% -> output 2 sps to omit timing recovery!? -+Matched_Filter = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); -+Rx_matched = Matched_Filter.process(Scope_sig); -+Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1); -+ -+% timing sync -> at this point we still have no symbol timing recovery, we -+% try to do this with 2sps EQ! -+[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+Rx_matched_1 = Rx_synced_cell{1}; -+ -+% Rx_Time_Rec = Rx_matched; -+% Rx_Time_Rec = Timing_Recovery_Move_It('f_sim', 28e9, 'gamma', 0.1).process(Rx_matched_1); -+[Rx_Time_Rec, Timing_Error] = Timing_Recovery("modulation", 'PAM/PSK/QAM', "timing_error_detector",'Gardner (non-data-aided)','sps',2,'damping_factor',1,'normalized_loop_bandwidth',0.01,'detector_gain',2.7).process(Rx_matched_1); -+ -+%% not working..  -+Rx_synced = Rx_Time_Rec; -+% Rx_synced = Rx_synced_cell{1}; -+len_tr = 4096*2; -+mu_ffe1 = 0.0001; -+mu_ffe2 = 0.0008; -+mu_ffe3 = 0.001; -+mu_dc = 0.004; -+mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; -+mu_dfe = 0.0004; -+duob_mode = db_mode.no_db; -+sps = 1; -+ -+Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103); -+Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104); -+ -+Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1); -+Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1); -+Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1); -+ -+if M == 2 -+ ber_in_paper = 10^(-2.6); %fig 3a) 4 Gb/s MWIR FSO Transmission using Directly Modulated QCL and an Uncooled UTC-PD at Room-Temperature -+elseif M == 4 -+ ber_in_paper = 10^(-2.5); -+end -+ -+%% -------------------- FFE -------------------- -+% % requires some more digging what is going on :-)  -+% eq_ffe = EQ("Ne",[50, 5, 5],"Nb",[2,0,0], ... -+% "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+% "K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+% "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+%  -+% ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ... -+% "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ... -+% "eth_style_symbol_mapping",mapping_style); -+%  -+% % ffe_results.metrics.print -+% fprintf('My EQ: %.1e \n',ffe_results.metrics.BER); -+% fprintf('Paper: %.1e \n \n',ber_in_paper); -+% BER_value = ffe_results.metrics.BER; -+ -+%% -------------------- VNLE + MLSE -------------------- -+ -+pf_ncoeffs = 1; -+eq_v = EQ("Ne",[200, 3, 2],"Nb",[5, 2, 1], ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels); -+ -+[vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style); -+ -+mlse_results.metrics.print -+fprintf('My EQ: %.1e \n',mlse_results.metrics.BER); -+fprintf('Paper: %.1e \n \n',ber_in_paper); -+ -+%% -------------------- ML-based MLSE (L=2) -------------------- -+% ml_mlse_equalizer = ML_MLSE("epochs_tr",150,"epochs_dd",1, ... -+% "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",80,"sps",1, ... -+% "traceback_depth",256,"L",1,"delta",4,"adaptive_mu",0); -+%  -+% [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style); -+% fprintf('ML-based MLSE:\n'); -+% fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER); -+% fprintf('Paper: %.1e \n \n',ber_in_paper); -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_rec_pam2.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_rec_pam2.m -new file mode 100644 -index 0000000..e681f2e ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_rec_pam2.m -@@ -0,0 +1,171 @@ -+%% -+base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\"; -+mode = 0; %0 oder 1 -+M = 2; -+ -+all_files = dir(fullfile(base, "**/*.mat")); -+ -+if M == 2 -+ tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat"); -+ filename = fullfile(base, "14G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+elseif M == 4 -+ tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat"); -+ filename = fullfile(base, "6G_PAM4\M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+end -+ -+if mode == 1 -+ [f, p] = uigetfile(fullfile(base, "**/*.mat"));  -+ if f~=0 -+ filename = fullfile(p,f); -+ end -+end -+ -+tx_data = load(tx_data_path); -+datas = load(filename); -+ -+%% -+str = filename; -+M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once')); -+assert(M==M_); -+fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once')); -+fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once')); -+I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f'); -+rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f'); -+L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f'); -+pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once')); -+rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once')); -+mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once')); -+ -+%% -+% Tx data -+ -+Bits = Informationsignal(tx_data.tx_data,"fs",fsym); -+Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym); -+ -+mapping_style = M==4; % Pam2 is like move-it; PAM-4 is different, same mapping like ETH peopled used in Zurich... hence the "eth_style" argument here and there -+PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme -+ -+Symbols_ = PM.map(Bits) .* PM.scaling; -+assert(isequal(Symbols.signal,Symbols_.signal)); -+ -+Bits_ = PM.demap(Symbols); -+[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal); -+assert(ber == 0); -+ -+%% For comparison, apply pulsef on Tx Symbols -+Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Digi_sig_compare = Pform.process(Symbols); -+MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Rx_sig_compare = MF.process(Digi_sig_compare); -+ -+%% -+ -+% Rx Data -+traceData = datas.tr.lastData(2).trace.ch3; -+ -+%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin -+scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin; -+demystified = isequal(traceData.YData,scoperead_volts); -+assert(demystified); -+ -+Scope_sig = Electricalsignal(traceData.YData,"fs",fs); -+ -+Scope_sig.plot("displayname",'raw','fignum',100); -+Scope_sig.spectrum("displayname",'raw','fignum',101) -+ -+% 1) matched filter -+% pulse is symmetric, hence we can use pulsef firectly as matched filter. -+% It feels off (bit I think correct) that the fsym is now the output freq.!! -+% -> output 2 sps to omit timing recovery!? -+Matched_Filter = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); -+Rx_matched = Matched_Filter.process(Scope_sig); -+Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1); -+ -+% timing sync -> at this point we still have no symbol timing recovery, we -+% try to do this with 2sps EQ! -+[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+Rx_matched_1 = Rx_synced_cell{1}; -+ -+Time_Rec = 1; -+if Time_Rec -+ [Rx_Time_Rec, Timing_Error] = Timing_Recovery("modulation", 'PAM/PSK/QAM', "timing_error_detector",'Gardner (non-data-aided)','sps',2,'damping_factor',1,'normalized_loop_bandwidth',0.01,'detector_gain',2.7).process(Rx_matched_1); -+ sps = 1; -+else -+ sps = 2; -+end -+ -+if Time_Rec == 1 && M == 2  -+ Rx_Time_Rec.fs = 14e9; -+elseif Time_Rec == 1 && M == 4 -+ Rx_Time_Rec.fs = 6e9; -+end -+ -+%% not working..  -+Rx_synced = Rx_Time_Rec; -+% Rx_synced = Rx_synced_cell{1}; -+len_tr = 4096*4; -+mu_ffe1 = 0.0001; -+mu_ffe2 = 0.0008; -+mu_ffe3 = 0.001; -+mu_dc = 0.004; -+mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; -+mu_dfe = 0.0004; -+duob_mode = db_mode.no_db; -+sps = 1; -+ -+Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103); -+Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104); -+ -+Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1); -+Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1); -+Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1); -+ -+if M == 2 -+ ber_in_paper = 10^(-2.6); %fig 3a) 4 Gb/s MWIR FSO Transmission using Directly Modulated QCL and an Uncooled UTC-PD at Room-Temperature -+elseif M == 4 -+ ber_in_paper = 10^(-2.5); -+end -+ -+%% -------------------- FFE -------------------- -+% % requires some more digging what is going on :-)  -+% eq_ffe = EQ("Ne",[200, 0, 0],"Nb",[0,0,0], ... -+% "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+% "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+% "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+%  -+% ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ... -+% "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ... -+% "eth_style_symbol_mapping",mapping_style); -+%  -+% % ffe_results.metrics.print -+% fprintf('My EQ: %.1e \n',ffe_results.metrics.BER); -+% fprintf('Paper: %.1e \n \n',ber_in_paper); -+% BER_value = ffe_results.metrics.BER; -+ -+%% -------------------- VNLE + MLSE -------------------- -+ -+pf_ncoeffs = 4; -+eq_v = EQ("Ne",[250, 0, 0],"Nb",[7, 0, 0], ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",0, ... -+ 'weighted_DFE',1,'weighted_DFE_d_min',0.5,'weighted_DFE_mode','I2','weighted_DFE_I_mode',[5,0.5,0.6]); -+pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels); -+ -+[vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style); -+ -+mlse_results.metrics.print -+fprintf('My EQ: %.1e \n',mlse_results.metrics.BER); -+fprintf('Paper: %.1e \n \n',ber_in_paper); -+ -+%% -------------------- ML-based MLSE (L=2) -------------------- -+% ml_mlse_equalizer = ML_MLSE("epochs_tr",400,"epochs_dd",1, ... -+% "len_tr",len_tr,"mu_dd",0.03,"mu_tr",0.03,"order",100,"sps",sps, ... -+% "traceback_depth",256,"L",2,"delta",4,"adaptive_mu",0); -+%  -+% [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style); -+% fprintf('ML-based MLSE:\n'); -+% fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER); -+% fprintf('Paper: %.1e \n \n',ber_in_paper); -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_rec_pam4.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_rec_pam4.m -new file mode 100644 -index 0000000..2881ccf ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_rec_pam4.m -@@ -0,0 +1,189 @@ -+%% -+base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\Sweep Data\"; -+mode = 0; %0 oder 1 -+M = 4; -+ -+baud_rate = '8'; -+baud_rate_num = str2double(baud_rate); -+ -+all_files = dir(fullfile(base, "**/*.mat")); -+ -+if M == 2 -+ tx_data_path = fullfile(base, baud_rate + "G_PAM2\tx_info\tx_info_PAM2_" + baud_rate + "Gbd0.75RRC.mat"); -+ filename = fullfile(base, baud_rate + "G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+elseif M == 4 -+ tx_data_path = fullfile(base, baud_rate + "G_PAM4\tx_info\tx_info_PAM4_" + baud_rate + "Gbd0.6RRC.mat"); -+ filename = fullfile(base, baud_rate + "G_PAM4\M=4_Rs=" + baud_rate + "e9_Fs=8e10_I=255mA_RoP=8.4mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+end -+ -+if mode == 1 -+ [f, p] = uigetfile(fullfile(base, "**/*.mat"));  -+ if f~=0 -+ filename = fullfile(p,f); -+ end -+end -+ -+tx_data = load(tx_data_path); -+datas = load(filename); -+ -+%% -+str = filename; -+M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once')); -+assert(M==M_); -+fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once')); -+fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once')); -+I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f'); -+rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f'); -+L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f'); -+pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once')); -+rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once')); -+mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once')); -+ -+%% -+% Tx data -+ -+Bits = Informationsignal(tx_data.tx_data,"fs",fsym); -+Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym); -+ -+mapping_style = M==4; % Pam2 is like move-it; PAM-4 is different, same mapping like ETH peopled used in Zurich... hence the "eth_style" argument here and there -+PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme -+ -+Symbols_ = PM.map(Bits) .* PM.scaling; -+assert(isequal(Symbols.signal,Symbols_.signal)); -+ -+Bits_ = PM.demap(Symbols); -+[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal); -+assert(ber == 0); -+ -+%% For comparison, apply pulsef on Tx Symbols -+Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Digi_sig_compare = Pform.process(Symbols); -+MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Rx_sig_compare = MF.process(Digi_sig_compare); -+ -+%% -+ -+% Rx Data -+traceData = datas.tr.lastData(2).trace.ch3; -+ -+%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin -+scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin; -+demystified = isequal(traceData.YData,scoperead_volts); -+assert(demystified); -+ -+Scope_sig = Electricalsignal(traceData.YData,"fs",fs); -+ -+Scope_sig.plot("displayname",'raw','fignum',100); -+Scope_sig.spectrum("displayname",'raw','fignum',101) -+ -+% 1) matched filter -+% pulse is symmetric, hence we can use pulsef firectly as matched filter. -+% It feels off (bit I think correct) that the fsym is now the output freq.!! -+% -> output 2 sps to omit timing recovery!? -+Matched_Filter = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); -+Rx_matched = Matched_Filter.process(Scope_sig); -+Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1); -+ -+% timing sync -> at this point we still have no symbol timing recovery, we -+% try to do this with 2sps EQ! -+[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+Rx_matched_1 = Rx_synced_cell{1}; -+ -+% Rx_Time_Rec = Rx_matched; -+% Rx_Time_Rec = Timing_Recovery_Move_It('f_sim', 28e9, 'gamma', 0.1).process(Rx_matched_1); -+ -+Time_Rec = 1; -+if Time_Rec -+ [Rx_Time_Rec, Timing_Error] = Timing_Recovery("modulation", 'PAM/PSK/QAM', "timing_error_detector",'Gardner (non-data-aided)','sps',2,'damping_factor',1,'normalized_loop_bandwidth',0.01,'detector_gain',2.7).process(Rx_matched_1); -+ sps = 1; -+else -+ sps = 2; -+end -+ -+Rx_Time_Rec.fs = baud_rate_num * 10^9; -+ -+% Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal, 12e9, 6e9); -+ -+% Rx_matched_1.plot("fignum",231231) -+% Rx_Time_Rec.plot("fignum",231231) -+ -+%% not working..  -+Rx_synced = Rx_Time_Rec; -+% Rx_synced = Rx_synced_cell{1}; -+len_tr = 4096*2; -+mu_ffe1 = 0.0001; -+mu_ffe2 = 0.0008; -+mu_ffe3 = 0.001; -+mu_dc = 0.004; -+mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; -+mu_dfe = 0.0004; -+duob_mode = db_mode.no_db; -+ -+Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103); -+Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104); -+ -+Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1); -+Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1); -+Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1); -+ -+if M == 2 -+ ber_in_paper = 10^(-2.6); %fig 3a) 4 Gb/s MWIR FSO Transmission using Directly Modulated QCL and an Uncooled UTC-PD at Room-Temperature -+elseif M == 4 -+ ber_in_paper = 10^(-2.5); -+end -+ -+%% -------------------- FFE -------------------- -+% % requires some more digging what is going on :-)  -+% eq_ffe = EQ("Ne",[400, 0, 0],"Nb",[0,0,0], ... -+% "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+% "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+% "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+%  -+% ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ... -+% "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ... -+% "eth_style_symbol_mapping",mapping_style); -+%  -+% % ffe_results.metrics.print -+% fprintf('My EQ: %.1e \n',ffe_results.metrics.BER); -+% fprintf('Paper: %.1e \n \n',ber_in_paper); -+% BER_value = ffe_results.metrics.BER; -+ -+%% -------------------- VNLE + MLSE -------------------- -+ -+pf_ncoeffs = 4; -+eq_v = EQ("Ne",[300, 0, 0],"Nb",[0, 0, 0], ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels); -+ -+[vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style); -+ -+mlse_results.metrics.print -+fprintf('My EQ: %.1e \n',mlse_results.metrics.BER); -+fprintf('Paper: %.1e \n \n',ber_in_paper); -+ -+%% -------------------- ML-based MLSE (L=2) -------------------- -+% ml_mlse_equalizer = ML_MLSE("epochs_tr",200,"epochs_dd",1, ... -+% "len_tr",length(Rx_synced)/2,"mu_dd",0,"mu_tr",0.03,"order",100,"sps",sps, ... -+% "traceback_depth",256,"L",3,"delta",4,"adaptive_mu",0); -+%  -+% [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style); -+% fprintf('ML-based MLSE:\n'); -+% fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER); -+% fprintf('Paper: %.1e \n \n',ber_in_paper); -+ -+%% -------------------- DB target -------------------- -+% mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,'trellis_states',PAMmapper(M,0).levels); -+%  -+% eq_ = EQ("Ne",[50, 5, 5],"Nb",[0,0,0],"training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+% "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+%  -+% dbt_results = duobinary_target(eq_,mlse_db_, M, Rx_synced, Symbols, Bits, ... -+% "precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [],"eth_style_symbol_mapping",mapping_style); -+%  -+% dbt_results.metrics.print("description",'Duobinary'); -+% fprintf('My EQ: %.1e \n',dbt_results.metrics.BER); -+% fprintf('Paper: %.1e \n \n',ber_in_paper); -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_shift.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_shift.m -new file mode 100644 -index 0000000..162d6a6 ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_time_shift.m -@@ -0,0 +1,221 @@ -+function BER = first_analysis_time_shift(time_shift)  -+ %% -+ base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\"; -+ mode = 0; %0 oder 1 -+ M = 4; -+  -+ all_files = dir(fullfile(base, "**/*.mat")); -+  -+ % data_tr_mf is the already recovered and filtered data -+ if M == 2 -+ tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat"); -+ filename = fullfile(base, "14G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+ data_tr_mf = load("C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\Already Recovered and Filtered\AfterSync_M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+ elseif M == 4 -+ tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat"); -+ filename = fullfile(base, "6G_PAM4\M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+ data_tr_mf = load("C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\Already Recovered and Filtered\AfterSync_M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+ end -+  -+ if mode == 1 -+ [f, p] = uigetfile(fullfile(base, "**/*.mat"));  -+ if f~=0 -+ filename = fullfile(p,f); -+ end -+ end -+  -+ tx_data = load(tx_data_path); -+ datas = load(filename); -+  -+ %% -+ str = filename; -+ M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once')); -+ assert(M==M_); -+ fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once')); -+ fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once')); -+ I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f'); -+ rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f'); -+ L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f'); -+ pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once')); -+ rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once')); -+ mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once')); -+  -+ %% -+ % Tx data -+  -+ Bits = Informationsignal(tx_data.tx_data,"fs",fsym); -+ Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym); -+  -+ mapping_style = M==4; % Pam2 is like move-it; PAM-4 is different, same mapping like ETH peopled used in Zurich... hence the "eth_style" argument here and there -+ PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme -+  -+ Symbols_ = PM.map(Bits) .* PM.scaling; -+ assert(isequal(Symbols.signal,Symbols_.signal)); -+  -+ Bits_ = PM.demap(Symbols); -+ [bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal); -+ assert(ber == 0); -+  -+ %% For comparison, apply pulsef on Tx Symbols -+ Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff); -+ Digi_sig_compare = Pform.process(Symbols); -+ MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+ Rx_sig_compare = MF.process(Digi_sig_compare); -+  -+ %% -+  -+ % Rx Data -+ traceData = datas.tr.lastData(2).trace.ch3; -+  -+ %FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin -+ scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin; -+ demystified = isequal(traceData.YData,scoperead_volts); -+ assert(demystified); -+  -+ Scope_sig = Electricalsignal(traceData.YData,"fs",fs); -+  -+ Scope_sig.plot("displayname",'raw','fignum',100); -+ Scope_sig.spectrum("displayname",'raw','fignum',101) -+  -+ % 1) matched filter -+ % pulse is symmetric, hence we can use pulsef firectly as matched filter. -+ % It feels off (bit I think correct) that the fsym is now the output freq.!! -+ % -> output 2 sps to omit timing recovery!? -+ Matched_Filter = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); -+ Rx_matched = Matched_Filter.process(Scope_sig); -+ Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1); -+  -+ data_tr_mf = Electricalsignal(data_tr_mf.Results, "fs", fsym); -+  -+ % timing sync -> at this point we still have no symbol timing recovery, we -+ % try to do this with 2sps EQ! -+ [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+ Rx_matched_1 = Rx_synced_cell{1}; -+ Rx_matched_original = Rx_synced_cell{1}; -+ Rx_matched_original.signal = resample(Rx_matched_original.signal,1,2); -+  -+ [~,Rx_synced_cell_tr_mf,inverted_tr_mf,sequenceFound_tr_mf,sequenceStarts_tr_mf] = data_tr_mf.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+ Rx_tr_mf = Rx_synced_cell_tr_mf{1}; -+  -+ Time_Rec = 1; -+ if Time_Rec -+ % [Rx_Time_Rec, Timing_Error] = Timing_Recovery("modulation", 'PAM/PSK/QAM', "timing_error_detector",'Gardner (non-data-aided)','sps',2,'damping_factor',1,'normalized_loop_bandwidth',1e-4,'detector_gain',2.7).process(Rx_matched_1); -+ Rx_Time_Rec = Time_Shifter('value',time_shift).process(Rx_matched_1); -+ Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal,1,2); -+ % figure(2222222) -+ % plot(Timing_Error) -+ sps = 1; -+ else -+ sps = 2; -+ end -+  -+ if Time_Rec == 1 && M == 2  -+ Rx_Time_Rec.fs = 14e9; -+ elseif Time_Rec == 1 && M == 4 -+ Rx_Time_Rec.fs = 6e9; -+ end -+  -+ Rx_Time_Rec.spectrum('normalizeTo0dB',1,"displayname",'Our signal','fignum',101111); -+ % Rx_matched_original.spectrum('normalizeTo0dB',1,"displayname",'Our signal','fignum',101111); -+ Rx_tr_mf.spectrum('normalizeTo0dB',1,"displayname",'Their signal','fignum',101111); -+  -+ Rx_Time_Rec_plot = Rx_Time_Rec; -+ % Rx_matched_original_plot = Rx_matched_original; -+ Rx_tr_mf_plot = Rx_tr_mf; -+ Rx_Time_Rec_plot.normalize("mode","rms").plot("displayname",'Our signal','fignum',101311); -+ % Rx_matched_original_plot.normalize("mode","rms").plot("displayname",'Original signal','fignum',101311); -+ Rx_tr_mf_plot.normalize("mode","rms").plot("displayname",'Their signal','fignum',101311); -+  -+ %% not working..  -+ % Use our or their signal -+ for our_signal = 1 -+ if our_signal -+ Rx_synced = Rx_Time_Rec; -+ else -+ Rx_synced = Rx_tr_mf; -+ end -+ % Rx_synced = Rx_Time_Rec; -+ % Rx_synced = Rx_synced_cell{1}; -+ len_tr = 4096*2; -+ mu_ffe1 = 0.0001; -+ mu_ffe2 = 0.0008; -+ mu_ffe3 = 0.001; -+ mu_dc = 0.004; -+ mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; -+ mu_dfe = 0.0004; -+ duob_mode = db_mode.no_db; -+  -+ Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103); -+ Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104); -+  -+ Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1); -+ Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1); -+ Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1); -+  -+ if M == 2 -+ ber_in_paper = 10^(-2.6); %fig 3a) 4 Gb/s MWIR FSO Transmission using Directly Modulated QCL and an Uncooled UTC-PD at Room-Temperature -+ elseif M == 4 -+ ber_in_paper = 10^(-2.5); -+ end -+  -+ %% -------------------- FFE -------------------- -+ % % requires some more digging what is going on :-)  -+ % eq_ffe = EQ("Ne",[500, 0, 0],"Nb",[0,0,0], ... -+ % "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ % "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ % "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ %  -+ % % eq_ffe = FFE_DFE('ffe_order',99,'dfe_order',99,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5,'sps',sps,'decide',0); -+ %  -+ % ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ... -+ % "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ... -+ % "eth_style_symbol_mapping",mapping_style); -+ %  -+ % if our_signal -+ % fprintf('Our signal: %.1e \n',ffe_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % else -+ % fprintf('Their signal: %.1e \n',ffe_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % end -+  -+ %% -------------------- VNLE + MLSE -------------------- -+ pf_ncoeffs = 4; -+ eq_v = EQ("Ne",[100, 0, 0],"Nb",[0, 0, 0], ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1, ... -+ 'weighted_DFE',0,'weighted_DFE_d_min',0.5,'weighted_DFE_mode','R2','weighted_DFE_I_mode',[5,0.5,0.6]); -+ % eq_v = FFE_DFE('ffe_order',200,'dfe_order',0,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5, ... -+ % 'ffe_mu_dd',mu_ffe,'ffe_mu_tr',0,'dfe_mu_dd',mu_dfe,'dfe_mu_tr',0.005,'sps',sps,'decide',0); -+ pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+ mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels); -+  -+ [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style); -+  -+ mlse_results.metrics.print -+ if our_signal -+ fprintf('Our Signal: %.1e \n',mlse_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ else -+ fprintf('Their Signal: %.1e \n',mlse_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ end -+ BER = mlse_results.metrics.BER; -+  -+ %% -------------------- ML-based MLSE (L=2) -------------------- -+ % ml_mlse_equalizer = ML_MLSE("epochs_tr",100,"epochs_dd",1, ... -+ % "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",11,"sps",sps, ... -+ % "traceback_depth",256,"L",4,"delta",4,"adaptive_mu",0); -+ %  -+ % [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style); -+ % if our_signal -+ % fprintf('Our Signal: %.1e \n',ml_mlse_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % else -+ % fprintf('Their EQ: %.1e \n',ml_mlse_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % end -+ end -+end -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_tr_mf.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_tr_mf.m -new file mode 100644 -index 0000000..fe8f371 ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_tr_mf.m -@@ -0,0 +1,271 @@ -+%% -+clear all; -+close all; -+ -+%% -+base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\"; -+mode = 0; %0 oder 1 -+M = 4; -+ -+all_files = dir(fullfile(base, "**/*.mat")); -+ -+% data_tr_mf is the already recovered and filtered data -+if M == 2 -+ tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat"); -+ filename = fullfile(base, "14G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+ data_tr_mf = load("C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\Already Recovered and Filtered\AfterSync_M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+elseif M == 4 -+ tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat"); -+ filename = fullfile(base, "6G_PAM4\M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+ data_tr_mf = load("C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\Already Recovered and Filtered\AfterSync_M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+end -+ -+if mode == 1 -+ [f, p] = uigetfile(fullfile(base, "**/*.mat"));  -+ if f~=0 -+ filename = fullfile(p,f); -+ end -+end -+ -+tx_data = load(tx_data_path); -+datas = load(filename); -+ -+%% -+str = filename; -+M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once')); -+assert(M==M_); -+fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once')); -+fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once')); -+I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f'); -+rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f'); -+L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f'); -+pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once')); -+rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once')); -+mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once')); -+ -+%% -+% Tx data -+ -+Bits = Informationsignal(tx_data.tx_data,"fs",fsym); -+Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym); -+ -+mapping_style = M==4; % Pam2 is like move-it; PAM-4 is different, same mapping like ETH peopled used in Zurich... hence the "eth_style" argument here and there -+PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme -+ -+Symbols_ = PM.map(Bits) .* PM.scaling; -+assert(isequal(Symbols.signal,Symbols_.signal)); -+ -+Bits_ = PM.demap(Symbols); -+[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal); -+assert(ber == 0); -+ -+%% For comparison, apply pulsef on Tx Symbols -+Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Digi_sig_compare = Pform.process(Symbols); -+ -+MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Rx_sig_compare = MF.process(Digi_sig_compare); -+ -+%% -+ -+% Rx Data -+traceData = datas.tr.lastData(2).trace.ch3; -+ -+%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin -+scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin; -+demystified = isequal(traceData.YData,scoperead_volts); -+assert(demystified); -+ -+Scope_sig = Electricalsignal(traceData.YData,"fs",fs); -+ -+Scope_sig.plot("displayname",'raw','fignum',100); -+Scope_sig.spectrum("displayname",'raw','fignum',101) -+ -+%Calculate Transfer Function -+Tx_spectrum = Digi_sig_compare; -+Rx_spectrum = Scope_sig; -+ -+[~,Rx_synced_spectrum,inverted_spectrum,sequenceFound_spectrum,sequenceStarts_spectrum] = Rx_spectrum.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+Rx_spectrum = Rx_synced_spectrum{1}; -+ -+Tx_spectrum = Tx_spectrum.resample("fs_out",fsym); -+Tx_spectrum.signal = fft(Tx_spectrum.signal); -+ -+Rx_spectrum = Rx_spectrum.resample("fs_out",fsym); -+Rx_spectrum.signal = fft(Rx_spectrum.signal); -+ -+H_transfer = Rx_spectrum.signal./Tx_spectrum.signal; -+H_inv = 1./H_transfer; -+ -+%Number of Samples/Symbol after Matched Filter -+Kov = 14; -+ -+Scope_sig = Scope_sig.resample('fs_in',fs,'fs_out',Kov*fsym); -+ -+% 1) matched filter -+% pulse is symmetric, hence we can use pulsef firectly as matched filter. -+% It feels off (bit I think correct) that the fsym is now the output freq.!! -+% -> output 2 sps to omit timing recovery!? -+Matched_Filter = Pulseformer("fsym",fsym,"fdac",Kov*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); -+Rx_matched = Matched_Filter.process(Scope_sig); -+Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1); -+% Rx_matched = Scope_sig; -+% Rx_matched = Rx_matched.resample('fs_out',Kov*fsym); -+ -+data_tr_mf = Electricalsignal(data_tr_mf.Results, "fs", fsym); -+[~,Rx_synced_cell_tr_mf,inverted_tr_mf,sequenceFound_tr_mf,sequenceStarts_tr_mf] = data_tr_mf.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+Rx_tr_mf = Rx_synced_cell_tr_mf{1}; -+ -+% timing sync -> at this point we still have no symbol timing recovery, we -+% try to do this with 2sps EQ! -+ -+% Rx_matched = Scope_sig; -+% Rx_matched = Rx_matched.resample("fs_out",2*fsym); -+ -+[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+Rx_matched_1 = Rx_synced_cell{1}; -+ -+Rx_matched_original = Rx_synced_cell{1}; -+Rx_matched_original.signal = resample(Rx_matched_original.signal,1,Kov); -+Rx_matched_original.fs = fsym; -+ -+% Rx_matched_1 = Rx_matched_1.resample("fs_in",Kov*fsym,'fs_out',2*fsym); -+ -+Time_Rec = 1; -+if Time_Rec -+ % [Rx_Time_Rec, Timing_Error] = Timing_Recovery("modulation", 'PAM/PSK/QAM', "timing_error_detector",'Gardner (non-data-aided)','sps',Kov,'damping_factor',1,'normalized_loop_bandwidth',1e-4,'detector_gain',2.7).process(Rx_matched_1); -+ -+ [Rx_Time_Rec, Timing_Error_MG] = Godard_Timing_Recovery('mode',3,'num_blocks',1,'fft_length',length(Rx_matched_1),'sps',Kov,'rolloff',0.6,'mu',-0.2,'Ki',1e-4).process(Rx_matched_1); -+ Rx_Time_Rec = Rx_Time_Rec.resample('fs_in',Kov*fsym,'fs_out',fsym); -+ -+ % Rx_Time_Rec = MaxVar_Timing_Recovery('mode',0,'fsym',fsym,'fadc',Kov*fsym,'num_tau',Kov*128,'sps',Kov,'comp_signal',Rx_tr_mf,'comp_mode',0).process(Rx_matched_1); -+  -+ sps = 1; -+else -+ Rx_Time_Rec = Rx_matched_1; -+ sps = 1; -+end -+ -+Rx_Time_Rec.fs = fsym; -+ -+% h = gaussdesign(0.4,64,1); -+% Rx_Time_Rec.signal = filtfilt(h,1,Rx_Time_Rec.signal); -+ -+% Rx_com = Rx_Time_Rec; -+% Rx_com = Rx_com.resample('fs_in',fsym,'fs_out',2*fsym); -+% Rx_com.spectrum("displayname",'After TR','normalizeTo0dB',1,'fignum',101114); -+% Rx_matched_1.spectrum("displayname",'Before TR','normalizeTo0dB',1,'fignum',101114); -+% Rx_tr_mf_2sps = Rx_tr_mf; -+% Rx_tr_mf_2sps = Rx_tr_mf_2sps.resample('fs_in',fsym,'fs_out',2*fsym); -+% Rx_tr_mf_2sps.spectrum("displayname",'Their signal after TR','normalizeTo0dB',1,'fignum',101114); -+ -+% Rx_Time_Rec = Rx_Time_Rec.resample('fs_out',6e9); -+% Rx_tr_mf = Rx_tr_mf.resample('fs_out',fsym); -+ -+% Amax = 10; -+% H_inv = min(abs(H_inv), Amax) .* exp(1j*angle(H_inv)); -+% Rx_Time_Rec.signal = fft(Rx_Time_Rec.signal); -+% Rx_Time_Rec.signal = ifft(Rx_Time_Rec.signal .* H_inv); -+ -+Rx_Time_Rec = Rx_Time_Rec.normalize('mode','rms'); -+Rx_tr_mf = Rx_tr_mf.normalize('mode','rms'); -+ -+Rx_Time_Rec.spectrum("displayname",'Our signal','normalizeTo0dB',1,'fignum',101111); -+% Rx_matched_original.spectrum('normalizeTo0dB',1,"displayname",'Our signal','fignum',101111); -+Rx_tr_mf.spectrum("displayname",'Their signal','normalizeTo0dB',1,'fignum',101111); -+ -+Rx_Time_Rec.normalize("mode","rms").plot("displayname",'Our signal','fignum',101311); -+% Rx_matched_original.normalize("mode","rms").plot("displayname",'Original signal','fignum',101311); -+Rx_tr_mf.normalize("mode","rms").plot("displayname",'Their signal','fignum',101311); -+ -+%% not working..  -+% Use our or their signal -+for our_signal = 1 -+ if our_signal -+ Rx_synced = Rx_Time_Rec; -+ else -+ Rx_synced = Rx_tr_mf; -+ end -+ % Rx_synced = Rx_Time_Rec; -+ % Rx_synced = Rx_synced_cell{1}; -+ len_tr = 4096*2; -+ mu_ffe1 = 0.0001; -+ mu_ffe2 = 0.0008; -+ mu_ffe3 = 0.001; -+ mu_dc = 0.004; -+ mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; -+ mu_dfe = 0.0004; -+ duob_mode = db_mode.no_db; -+  -+ Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103); -+ Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104); -+  -+ Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1); -+ Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1); -+ Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1); -+  -+ if M == 2 -+ ber_in_paper = 10^(-2.6); %fig 3a) 4 Gb/s MWIR FSO Transmission using Directly Modulated QCL and an Uncooled UTC-PD at Room-Temperature -+ elseif M == 4 -+ ber_in_paper = 10^(-2.5); -+ end -+  -+ %% -------------------- FFE -------------------- -+ % requires some more digging what is going on :-)  -+ % eq_ffe = EQ("Ne",[150, 0, 0],"Nb",[0,0,0], ... -+ % "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ % "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ % "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ %  -+ % % eq_ffe = FFE_DFE('ffe_order',99,'dfe_order',99,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5,'sps',sps,'decide',0); -+ %  -+ % ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ... -+ % "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ... -+ % "eth_style_symbol_mapping",mapping_style); -+ %  -+ % if our_signal -+ % fprintf('Our signal: %.1e \n',ffe_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % else -+ % fprintf('Their signal: %.1e \n',ffe_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % end -+  -+ %% -------------------- VNLE + MLSE -------------------- -+ pf_ncoeffs = 4; -+ eq_v = EQ("Ne",[300, 0, 0],"Nb",[0, 0, 0], ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1, ... -+ 'weighted_DFE',0,'weighted_DFE_d_min',0.5,'weighted_DFE_mode','R2','weighted_DFE_I_mode',[5,0.5,0.6]); -+ % eq_v = FFE_DFE('ffe_order',300,'dfe_order',5,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5, ... -+ % 'ffe_mu_dd',mu_ffe,'ffe_mu_tr',0,'dfe_mu_dd',mu_dfe,'dfe_mu_tr',0.005,'sps',sps,'decide',0); -+ pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+ mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels); -+ -+ [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style); -+ -+ mlse_results.metrics.print -+ if our_signal -+ fprintf('Our Signal: %.1e \n',mlse_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ else -+ fprintf('Their Signal: %.1e \n',mlse_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ end -+  -+ %% -------------------- ML-based MLSE (L=2) -------------------- -+ % ml_mlse_equalizer = ML_MLSE("epochs_tr",100,"epochs_dd",1, ... -+ % "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",11,"sps",sps, ... -+ % "traceback_depth",256,"L",4,"delta",4,"adaptive_mu",0); -+ %  -+ % [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style); -+ % if our_signal -+ % fprintf('Our Signal: %.1e \n',ml_mlse_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % else -+ % fprintf('Their EQ: %.1e \n',ml_mlse_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % end -+end -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_tr_mf_pam2.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_tr_mf_pam2.m -new file mode 100644 -index 0000000..e6f4c45 ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_tr_mf_pam2.m -@@ -0,0 +1,195 @@ -+%% -+base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\"; -+mode = 0; %0 oder 1 -+M = 2; -+ -+all_files = dir(fullfile(base, "**/*.mat")); -+ -+if M == 2 -+ tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat"); -+ filename = fullfile(base, "14G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+ % Already recovered and filtered data -+ data_tr_mf = load("C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\Already Recovered and Filtered\AfterSync_M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+elseif M == 4 -+ tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat"); -+ filename = fullfile(base, "6G_PAM4\M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+ data_tr_mf = load("C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\Already Recovered and Filtered\AfterSync_M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+end -+ -+if mode == 1 -+ [f, p] = uigetfile(fullfile(base, "**/*.mat"));  -+ if f~=0 -+ filename = fullfile(p,f); -+ end -+end -+ -+tx_data = load(tx_data_path); -+datas = load(filename); -+ -+%% -+str = filename; -+M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once')); -+assert(M==M_); -+fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once')); -+fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once')); -+I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f'); -+rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f'); -+L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f'); -+pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once')); -+rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once')); -+mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once')); -+ -+%% -+% Tx data -+ -+Bits = Informationsignal(tx_data.tx_data,"fs",fsym); -+Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym); -+ -+mapping_style = M==4; % Pam2 is like move-it; PAM-4 is different, same mapping like ETH peopled used in Zurich... hence the "eth_style" argument here and there -+PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme -+ -+Symbols_ = PM.map(Bits) .* PM.scaling; -+assert(isequal(Symbols.signal,Symbols_.signal)); -+ -+Bits_ = PM.demap(Symbols); -+[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal); -+assert(ber == 0); -+ -+%% For comparison, apply pulsef on Tx Symbols -+Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Digi_sig_compare = Pform.process(Symbols); -+MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Rx_sig_compare = MF.process(Digi_sig_compare); -+ -+%% -+ -+% Rx Data -+traceData = datas.tr.lastData(2).trace.ch3; -+ -+%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin -+scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin; -+demystified = isequal(traceData.YData,scoperead_volts); -+assert(demystified); -+ -+Scope_sig = Electricalsignal(traceData.YData,"fs",fs); -+ -+Scope_sig.plot("displayname",'raw','fignum',100); -+Scope_sig.spectrum("displayname",'raw','fignum',101) -+ -+% 1) matched filter -+% pulse is symmetric, hence we can use pulsef firectly as matched filter. -+% It feels off (bit I think correct) that the fsym is now the output freq.!! -+% -> output 2 sps to omit timing recovery!? -+Matched_Filter = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); -+Rx_matched = Matched_Filter.process(Scope_sig); -+Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1); -+ -+data_tr_mf = Electricalsignal(data_tr_mf.Results, "fs", fsym); -+ -+% timing sync -> at this point we still have no symbol timing recovery, we -+% try to do this with 2sps EQ! -+[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+Rx_matched_1 = Rx_synced_cell{1}; -+ -+[~,Rx_synced_cell_tr_mf,inverted_tr_mf,sequenceFound_tr_mf,sequenceStarts_tr_mf] = data_tr_mf.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+Rx_tr_mf = Rx_synced_cell_tr_mf{1}; -+ -+ -+Time_Rec = 1; -+if Time_Rec -+ [Rx_Time_Rec, Timing_Error] = Timing_Recovery("modulation", 'PAM/PSK/QAM', "timing_error_detector",'Gardner (non-data-aided)','sps',2,'damping_factor',1,'normalized_loop_bandwidth',0.01,'detector_gain',2.7).process(Rx_matched_1); -+ sps = 1; -+else -+ sps = 2; -+end -+ -+if Time_Rec == 1 && M == 2  -+ Rx_Time_Rec.fs = 14e9; -+elseif Time_Rec == 1 && M == 4 -+ Rx_Time_Rec.fs = 6e9; -+end -+ -+Rx_Time_Rec.spectrum("displayname",'Signal after matched filter, synchronization, and timing recovery','fignum',101111); -+Rx_tr_mf.spectrum("displayname",'Signal after matched filter, synchronization, and timing recovery','fignum',101111); -+ -+Rx_Time_Rec_plot = Rx_Time_Rec; -+Rx_tr_mf_plot = Rx_tr_mf; -+Rx_Time_Rec_plot.normalize("mode","rms").plot("displayname",'Signal after matched filter, synchronization, and timing recovery','fignum',101311); -+Rx_tr_mf_plot.normalize("mode","rms").plot("displayname",'Signal after matched filter, synchronization, and timing recovery','fignum',101311); -+ -+%% not working..  -+% Use our or their signal -+our_signal = 0; -+if our_signal -+ Rx_synced = Rx_Time_Rec; -+else -+ Rx_synced = Rx_tr_mf; -+end -+% Rx_synced = Rx_Time_Rec; -+% Rx_synced = Rx_synced_cell{1}; -+len_tr = 4096*2; -+mu_ffe1 = 0.0001; -+mu_ffe2 = 0.0008; -+mu_ffe3 = 0.001; -+mu_dc = 0.004; -+mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; -+mu_dfe = 0.0004; -+duob_mode = db_mode.no_db; -+sps = 1; -+ -+Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103); -+Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104); -+ -+Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1); -+Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1); -+Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1); -+ -+if M == 2 -+ ber_in_paper = 10^(-2.6); %fig 3a) 4 Gb/s MWIR FSO Transmission using Directly Modulated QCL and an Uncooled UTC-PD at Room-Temperature -+elseif M == 4 -+ ber_in_paper = 10^(-2.5); -+end -+ -+%% -------------------- FFE -------------------- -+% % requires some more digging what is going on :-)  -+% eq_ffe = EQ("Ne",[200, 0, 0],"Nb",[0,0,0], ... -+% "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+% "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+% "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+%  -+% ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ... -+% "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ... -+% "eth_style_symbol_mapping",mapping_style); -+%  -+% % ffe_results.metrics.print -+% fprintf('My EQ: %.1e \n',ffe_results.metrics.BER); -+% fprintf('Paper: %.1e \n \n',ber_in_paper); -+% BER_value = ffe_results.metrics.BER; -+ -+%% -------------------- VNLE + MLSE -------------------- -+ -+pf_ncoeffs = 4; -+eq_v = EQ("Ne",[200, 0, 0],"Nb",[0, 0, 0], ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1, ... -+ 'weighted_DFE',0,'weighted_DFE_d_min',0.5,'weighted_DFE_mode','I2','weighted_DFE_I_mode',[5,0.5,0.6]); -+pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels); -+ -+[vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style); -+ -+mlse_results.metrics.print -+fprintf('My EQ: %.1e \n',mlse_results.metrics.BER); -+fprintf('Paper: %.1e \n \n',ber_in_paper); -+ -+%% -------------------- ML-based MLSE (L=2) -------------------- -+% ml_mlse_equalizer = ML_MLSE("epochs_tr",400,"epochs_dd",1, ... -+% "len_tr",len_tr,"mu_dd",0.03,"mu_tr",0.03,"order",100,"sps",sps, ... -+% "traceback_depth",256,"L",2,"delta",4,"adaptive_mu",0); -+%  -+% [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style); -+% fprintf('ML-based MLSE:\n'); -+% fprintf('My EQ: %.1e \n',ml_mlse_results.metrics.BER); -+% fprintf('Paper: %.1e \n \n',ber_in_paper); -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/first_analysis_tr_mf_pam_2.m b/projects/FSO_transmission/Evaluation Scripts/first_analysis_tr_mf_pam_2.m -new file mode 100644 -index 0000000..d27d6e1 ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/first_analysis_tr_mf_pam_2.m -@@ -0,0 +1,272 @@ -+%% -+clear all; -+close all; -+ -+%% -+base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\"; -+mode = 0; %0 oder 1 -+M = 2; -+ -+all_files = dir(fullfile(base, "**/*.mat")); -+ -+% data_tr_mf is the already recovered and filtered data -+if M == 2 -+ tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat"); -+ filename = fullfile(base, "14G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+ data_tr_mf = load("C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\Already Recovered and Filtered\AfterSync_M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+elseif M == 4 -+ tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat"); -+ filename = fullfile(base, "6G_PAM4\M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+ data_tr_mf = load("C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\Already Recovered and Filtered\AfterSync_M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+end -+ -+if mode == 1 -+ [f, p] = uigetfile(fullfile(base, "**/*.mat"));  -+ if f~=0 -+ filename = fullfile(p,f); -+ end -+end -+ -+tx_data = load(tx_data_path); -+datas = load(filename); -+ -+%% -+str = filename; -+M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once')); -+assert(M==M_); -+fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once')); -+fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once')); -+I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f'); -+rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f'); -+L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f'); -+pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once')); -+rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once')); -+mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once')); -+ -+%% -+% Tx data -+ -+Bits = Informationsignal(tx_data.tx_data,"fs",fsym); -+Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym); -+ -+mapping_style = M==4; % Pam2 is like move-it; PAM-4 is different, same mapping like ETH peopled used in Zurich... hence the "eth_style" argument here and there -+PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme -+ -+Symbols_ = PM.map(Bits) .* PM.scaling; -+assert(isequal(Symbols.signal,Symbols_.signal)); -+ -+Bits_ = PM.demap(Symbols); -+[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal); -+assert(ber == 0); -+ -+%% For comparison, apply pulsef on Tx Symbols -+Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Digi_sig_compare = Pform.process(Symbols); -+ -+MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Rx_sig_compare = MF.process(Digi_sig_compare); -+ -+%% -+ -+% Rx Data -+traceData = datas.tr.lastData(2).trace.ch3; -+ -+%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin -+scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin; -+demystified = isequal(traceData.YData,scoperead_volts); -+assert(demystified); -+ -+Scope_sig = Electricalsignal(traceData.YData,"fs",fs); -+ -+Scope_sig.plot("displayname",'raw','fignum',100); -+Scope_sig.spectrum("displayname",'raw','fignum',101) -+ -+%Calculate Transfer Function -+Tx_spectrum = Digi_sig_compare; -+Rx_spectrum = Scope_sig; -+ -+[~,Rx_synced_spectrum,inverted_spectrum,sequenceFound_spectrum,sequenceStarts_spectrum] = Rx_spectrum.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+Rx_spectrum = Rx_synced_spectrum{1}; -+ -+Tx_spectrum = Tx_spectrum.resample("fs_out",fsym); -+Tx_spectrum.signal = fft(Tx_spectrum.signal); -+ -+Rx_spectrum = Rx_spectrum.resample("fs_out",fsym); -+Rx_spectrum.signal = fft(Rx_spectrum.signal); -+ -+H_transfer = Rx_spectrum.signal./Tx_spectrum.signal; -+H_inv = 1./H_transfer; -+ -+%Number of Samples/Symbol after Matched Filter -+Kov = 14; -+ -+Scope_sig = Scope_sig.resample('fs_in',fs,'fs_out',Kov*fsym); -+ -+% 1) matched filter -+% pulse is symmetric, hence we can use pulsef firectly as matched filter. -+% It feels off (bit I think correct) that the fsym is now the output freq.!! -+% -> output 2 sps to omit timing recovery!? -+Matched_Filter = Pulseformer("fsym",fsym,"fdac",Kov*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); -+Rx_matched = Matched_Filter.process(Scope_sig); -+Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1); -+% Rx_matched = Scope_sig; -+% Rx_matched = Rx_matched.resample('fs_out',Kov*fsym); -+ -+data_tr_mf = Electricalsignal(data_tr_mf.Results, "fs", fsym); -+[~,Rx_synced_cell_tr_mf,inverted_tr_mf,sequenceFound_tr_mf,sequenceStarts_tr_mf] = data_tr_mf.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+Rx_tr_mf = Rx_synced_cell_tr_mf{1}; -+ -+% timing sync -> at this point we still have no symbol timing recovery, we -+% try to do this with 2sps EQ! -+ -+% Rx_matched = Scope_sig; -+% Rx_matched = Rx_matched.resample("fs_out",2*fsym); -+ -+[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+Rx_matched_1 = Rx_synced_cell{1}; -+ -+Rx_matched_original = Rx_synced_cell{1}; -+Rx_matched_original.signal = resample(Rx_matched_original.signal,1,Kov); -+Rx_matched_original.fs = fsym; -+ -+% Rx_matched_1 = Rx_matched_1.resample("fs_in",Kov*fsym,'fs_out',2*fsym); -+ -+Time_Rec = 1; -+if Time_Rec -+ % [Rx_Time_Rec, Timing_Error] = Timing_Recovery("modulation", 'PAM/PSK/QAM', "timing_error_detector",'Gardner (non-data-aided)','sps',Kov,'damping_factor',1,'normalized_loop_bandwidth',1e-4,'detector_gain',2.7).process(Rx_matched_1); -+ % Rx_matched_1.spectrum('normalizeTo0dB',1,"displayname",'Signal before Timing Recovery','fignum',1023); -+ % [Rx_Time_Rec, Timing_Error_MG] = Godard_Timing_Recovery('mode',3,'num_blocks',1,'fft_length',length(Rx_matched_1),'sps',Kov,'rolloff',0.6,'mu',-0.2,'Ki',1e-4).process(Rx_matched_1); -+ Rx_Time_Rec = MaxVar_Timing_Recovery('mode',0,'fsym',fsym,'fadc',Kov*fsym,'num_tau',Kov*16,'sps',Kov,'comp_signal',Rx_tr_mf,'comp_mode',0).process(Rx_matched_1); -+ % Rx_Time_Rec.spectrum('normalizeTo0dB',1,"displayname",'Signal after Timing Recovery','fignum',1023); -+ % idx = 1:2:length(Rx_Time_Rec); -+ % Rx_Time_Rec.signal = Rx_Time_Rec.signal(idx); -+ % Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal,1,Kov); -+ % Rx_Time_Rec = Rx_matched_1; -+ % Rx_Time_Rec.signal = resample(Rx_Time_Rec.signal,1,Kov); -+ % figure(2222222) -+ % plot(Timing_Error) -+ sps = 1; -+else -+ Rx_Time_Rec = Rx_matched_1; -+ sps = 1; -+end -+Rx_Time_Rec.fs = fsym; -+ -+Rx_com = Rx_Time_Rec; -+Rx_com = Rx_com.resample('fs_in',fsym,'fs_out',2*fsym); -+Rx_com.spectrum("displayname",'After TR','normalizeTo0dB',1,'fignum',101114); -+Rx_matched_1.spectrum("displayname",'Before TR','normalizeTo0dB',1,'fignum',101114); -+Rx_tr_mf_2sps = Rx_tr_mf; -+Rx_tr_mf_2sps = Rx_tr_mf_2sps.resample('fs_in',fsym,'fs_out',2*fsym); -+Rx_tr_mf_2sps.spectrum("displayname",'Their signal after TR','normalizeTo0dB',1,'fignum',101114); -+ -+% Rx_Time_Rec = Rx_Time_Rec.resample('fs_out',6e9); -+% Rx_tr_mf = Rx_tr_mf.resample('fs_out',fsym); -+ -+% Amax = 10; -+% H_inv = min(abs(H_inv), Amax) .* exp(1j*angle(H_inv)); -+% Rx_Time_Rec.signal = fft(Rx_Time_Rec.signal); -+% Rx_Time_Rec.signal = ifft(Rx_Time_Rec.signal .* H_inv); -+ -+Rx_Time_Rec = Rx_Time_Rec.normalize('mode','rms'); -+Rx_tr_mf = Rx_tr_mf.normalize('mode','rms'); -+ -+Rx_Time_Rec.spectrum('normalizeTo0dB',1,"displayname",'Our signal','fignum',101111); -+% Rx_matched_original.spectrum('normalizeTo0dB',1,"displayname",'Our signal','fignum',101111); -+Rx_tr_mf.spectrum('normalizeTo0dB',1,"displayname",'Their signal','fignum',101111); -+ -+Rx_Time_Rec.normalize("mode","rms").plot("displayname",'Our signal','fignum',101311); -+% Rx_matched_original.normalize("mode","rms").plot("displayname",'Original signal','fignum',101311); -+Rx_tr_mf.normalize("mode","rms").plot("displayname",'Their signal','fignum',101311); -+ -+%% not working..  -+% Use our or their signal -+for our_signal = 1 -+ if our_signal -+ Rx_synced = Rx_Time_Rec; -+ else -+ Rx_synced = Rx_tr_mf; -+ end -+ % Rx_synced = Rx_Time_Rec; -+ % Rx_synced = Rx_synced_cell{1}; -+ len_tr = 4096*2; -+ mu_ffe1 = 0.0001; -+ mu_ffe2 = 0.0008; -+ mu_ffe3 = 0.001; -+ mu_dc = 0.004; -+ mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; -+ mu_dfe = 0.0004; -+ duob_mode = db_mode.no_db; -+  -+ Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103); -+ Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104); -+  -+ Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1); -+ Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1); -+ Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1); -+  -+ if M == 2 -+ ber_in_paper = 10^(-2.6); %fig 3a) 4 Gb/s MWIR FSO Transmission using Directly Modulated QCL and an Uncooled UTC-PD at Room-Temperature -+ elseif M == 4 -+ ber_in_paper = 10^(-2.5); -+ end -+  -+ %% -------------------- FFE -------------------- -+ % % requires some more digging what is going on :-)  -+ % eq_ffe = EQ("Ne",[500, 0, 0],"Nb",[0,0,0], ... -+ % "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ % "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ % "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ %  -+ % % eq_ffe = FFE_DFE('ffe_order',99,'dfe_order',99,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5,'sps',sps,'decide',0); -+ %  -+ % ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ... -+ % "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ... -+ % "eth_style_symbol_mapping",mapping_style); -+ %  -+ % if our_signal -+ % fprintf('Our signal: %.1e \n',ffe_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % else -+ % fprintf('Their signal: %.1e \n',ffe_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % end -+  -+ %% -------------------- VNLE + MLSE -------------------- -+ pf_ncoeffs = 4; -+ eq_v = EQ("Ne",[250, 0, 0],"Nb",[0, 0, 0], ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1, ... -+ 'weighted_DFE',0,'weighted_DFE_d_min',0.5,'weighted_DFE_mode','R2','weighted_DFE_I_mode',[5,0.5,0.6]); -+ % eq_v = FFE_DFE('ffe_order',200,'dfe_order',0,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5, ... -+ % 'ffe_mu_dd',mu_ffe,'ffe_mu_tr',0,'dfe_mu_dd',mu_dfe,'dfe_mu_tr',0.005,'sps',sps,'decide',0); -+ pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+ mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels); -+ -+ [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style); -+ -+ mlse_results.metrics.print -+ if our_signal -+ fprintf('Our Signal: %.1e \n',mlse_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ else -+ fprintf('Their Signal: %.1e \n',mlse_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ end -+  -+ %% -------------------- ML-based MLSE (L=2) -------------------- -+ % ml_mlse_equalizer = ML_MLSE("epochs_tr",100,"epochs_dd",1, ... -+ % "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",11,"sps",sps, ... -+ % "traceback_depth",256,"L",4,"delta",4,"adaptive_mu",0); -+ %  -+ % [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style); -+ % if our_signal -+ % fprintf('Our Signal: %.1e \n',ml_mlse_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % else -+ % fprintf('Their EQ: %.1e \n',ml_mlse_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % end -+end -\ No newline at end of file -diff --git a/projects/FSO_transmission/Evaluation Scripts/ml_mlse_complexity_plot.m b/projects/FSO_transmission/Evaluation Scripts/ml_mlse_complexity_plot.m -new file mode 100644 -index 0000000..d30035b ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/ml_mlse_complexity_plot.m -@@ -0,0 +1,11 @@ -+N = 1:4; -+S = 4; -+L = 1:4; -+Complexity_N = (N+1).*S.^(1+1); -+Complexity_L = (1+1).*S.^(L+1); -+ -+figure; -+plot(N,Complexity_N) -+hold on -+plot(L,Complexity_L) -+hold off -diff --git a/projects/FSO_transmission/Evaluation Scripts/plotscript_baud_rate_sweep_method.m b/projects/FSO_transmission/Evaluation Scripts/plotscript_baud_rate_sweep_method.m -new file mode 100644 -index 0000000..ae3a1b5 ---- /dev/null -+++ b/projects/FSO_transmission/Evaluation Scripts/plotscript_baud_rate_sweep_method.m -@@ -0,0 +1,36 @@ -+x = 4:8; -+for method = 1:4 -+ filename = fullfile('C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\Silas DSP\imdd_simulation\projects\FSO_transmission\Data', ['BER_PAM_4_baud_rate_method' num2str(method) '.mat']); -+ data = load(filename); -+ BER = data.BER_PAM_4; -+ figure(22113344) -+ plot(x,BER,'-o','LineWidth',1.75); -+ hold on -+end -+ -+h1 = yline(2e-2, ':k', 'LineWidth',1.5); -+h2 = yline(3.8e-3,':b', 'LineWidth',1.5); -+h3 = yline(4.85e-3,':g', 'LineWidth',1.5); -+h4 = yline(2.2e-4,':r', 'LineWidth',1.5); -+ -+% Legende NUR für Kurven -+legend('FFE - 300 Taps','FFE+PF+MLSE - 300 FFE Taps - 4 PF Coefficients','ML-MLSE - 1000 epochs - 100th order - Memory Length = 2','DB - 300 FFE Taps',... -+ 'Interpreter','latex', ... -+ 'Location','southeast', 'FontSize', 14) -+ -+% FEC Labels direkt im Plot -+text(6.85,2.3e-2,'o-FEC','Color','k','FontSize', 14, 'Interpreter','latex') -+text(7,3e-3,'HD-FEC','Color','b','FontSize', 14, 'Interpreter','latex') -+text(7,5.6e-3,'KP4+Hamming','Color','g','FontSize', 14,'Interpreter','latex') -+text(7,2.5e-4,'KP4','Color','r','FontSize', 14,'Interpreter','latex') -+ -+xlabel('Symbol Rate [GBd]', 'Interpreter','latex') -+ylabel('BER', 'Interpreter','latex') -+% title('BER for PAM-4', 'Interpreter','latex') -+ -+grid minor -+% ylim([1e-4 5e-2]) -+xlim([3 9]) -+set(gca,'YScale','log') -+hold off -+% beautifyBERplot -\ No newline at end of file -diff --git a/projects/FSO_transmission/FSO_timing_recovery_minimal_example.m b/projects/FSO_transmission/FSO_timing_recovery_minimal_example.m -new file mode 100644 -index 0000000..36884ff ---- /dev/null -+++ b/projects/FSO_transmission/FSO_timing_recovery_minimal_example.m -@@ -0,0 +1,251 @@ -+%% -+clear all; -+close all; -+ -+%% Choose a fitting base leading to the FSO Data -+base = "C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\"; -+mode = 0; %0 oder 1 -+M = 4; -+ -+all_files = dir(fullfile(base, "**/*.mat")); -+ -+% data_tr_mf is the already recovered and filtered data -+if M == 2 -+ tx_data_path = fullfile(base, "14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat"); -+ filename = fullfile(base, "14G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+ data_tr_mf = load("C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\Already Recovered and Filtered\AfterSync_M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+elseif M == 4 -+ tx_data_path = fullfile(base, "6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat"); -+ filename = fullfile(base, "6G_PAM4\M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+ data_tr_mf = load("C:\Users\magf\Desktop\Desktop\MATLAB-Zeugs\FSO Equalizer\FSO_FP_QCL_60umUTC\Already Recovered and Filtered\AfterSync_M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+end -+ -+if mode == 1 -+ [f, p] = uigetfile(fullfile(base, "**/*.mat"));  -+ if f~=0 -+ filename = fullfile(p,f); -+ end -+end -+ -+tx_data = load(tx_data_path); -+datas = load(filename); -+ -+%% -+str = filename; -+M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once')); -+assert(M==M_); -+fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once')); -+fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once')); -+I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f'); -+rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f'); -+L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f'); -+pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once')); -+rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once')); -+mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once')); -+ -+%% -+% Tx data -+ -+Bits = Informationsignal(tx_data.tx_data,"fs",fsym); -+Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym); -+ -+mapping_style = M==4; % Pam2 is like move-it; PAM-4 is different, same mapping like ETH peopled used in Zurich... hence the "eth_style" argument here and there -+PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme -+ -+Symbols_ = PM.map(Bits) .* PM.scaling; -+assert(isequal(Symbols.signal,Symbols_.signal)); -+ -+Bits_ = PM.demap(Symbols); -+[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal); -+assert(ber == 0); -+ -+%% For comparison, apply pulsef on Tx Symbols -+Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Digi_sig_compare = Pform.process(Symbols); -+ -+MF = Pulseformer("fsym",fsym,"fdac",2*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Rx_sig_compare = MF.process(Digi_sig_compare); -+ -+%% -+ -+% Rx Data -+traceData = datas.tr.lastData(2).trace.ch3; -+ -+%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin -+scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin; -+demystified = isequal(traceData.YData,scoperead_volts); -+assert(demystified); -+ -+Scope_sig = Electricalsignal(traceData.YData,"fs",fs); -+ -+Scope_sig.plot("displayname",'raw','fignum',100); -+Scope_sig.spectrum("displayname",'raw','fignum',101) -+ -+%Calculate Transfer Function -+Tx_spectrum = Digi_sig_compare; -+Rx_spectrum = Scope_sig; -+ -+[~,Rx_synced_spectrum,inverted_spectrum,sequenceFound_spectrum,sequenceStarts_spectrum] = Rx_spectrum.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+Rx_spectrum = Rx_synced_spectrum{1}; -+ -+Tx_spectrum = Tx_spectrum.resample("fs_out",fsym); -+Tx_spectrum.signal = fft(Tx_spectrum.signal); -+ -+Rx_spectrum = Rx_spectrum.resample("fs_out",fsym); -+Rx_spectrum.signal = fft(Rx_spectrum.signal); -+ -+H_transfer = Rx_spectrum.signal./Tx_spectrum.signal; -+H_inv = 1./H_transfer; -+ -+%Number of Samples/Symbol after Matched Filter -+Kov = 14; -+ -+Scope_sig = Scope_sig.resample('fs_in',fs,'fs_out',Kov*fsym); -+ -+% 1) matched filter -+% pulse is symmetric, hence we can use pulsef firectly as matched filter. -+% It feels off (bit I think correct) that the fsym is now the output freq.!! -+% -> output 2 sps to omit timing recovery!? -+Matched_Filter = Pulseformer("fsym",fsym,"fdac",Kov*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); -+Rx_matched = Matched_Filter.process(Scope_sig); -+Rx_matched.spectrum("displayname",'Signal after matched filter','fignum',1); -+ -+% Loading and synchronizing their matched filtered and timing recovered data -+data_tr_mf = Electricalsignal(data_tr_mf.Results, "fs", fsym); -+[~,Rx_synced_cell_tr_mf,inverted_tr_mf,sequenceFound_tr_mf,sequenceStarts_tr_mf] = data_tr_mf.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+Rx_tr_mf = Rx_synced_cell_tr_mf{1}; -+ -+% Timing sync -> at this point we still have no symbol timing recovery, we -+% try to do this with 2sps EQ! -+[~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 1); -+Rx_matched_1 = Rx_synced_cell{1}; -+ -+% Timing recovery -+Time_Rec = 1; -+Timing_Mode = 3; -+if Time_Rec -+ if Timing_Mode == 1 % Zero-Crossing/Gardner/Early-Late/Müller-Mueller Timing Recovery -+ [Rx_Time_Rec, Timing_Error] = Timing_Recovery("modulation", 'PAM/PSK/QAM', "timing_error_detector",'Gardner (non-data-aided)','sps',Kov,'damping_factor',1,'normalized_loop_bandwidth',1e-4,'detector_gain',2.7).process(Rx_matched_1); -+ elseif Timing_Mode == 2 % Godard Timing Recovery (resampling is required as the Godard timing recovery does not change the number of samples per symbol) -+ [Rx_Time_Rec, Timing_Error_MG] = Godard_Timing_Recovery('mode',3,'num_blocks',1,'fft_length',length(Rx_matched_1),'sps',Kov,'rolloff',0.6,'mu',-0.2,'Ki',1e-4).process(Rx_matched_1); -+ Rx_Time_Rec = Rx_Time_Rec.resample('fs_in',Kov*fsym,'fs_out',fsym); -+ elseif Timing_Mode == 3 % Maximum Variance Timing Recovery -+ Rx_Time_Rec = MaxVar_Timing_Recovery('mode',0,'fsym',fsym,'fadc',Kov*fsym,'num_tau',Kov*128,'sps',Kov,'comp_signal',Rx_tr_mf,'comp_mode',0).process(Rx_matched_1); -+ end -+else -+ Rx_Time_Rec = Rx_matched_1.resample('fs_in',Kov*fsym,'fs_out',fsym); -+end -+sps = 1; -+Rx_Time_Rec.fs = fsym; -+ -+% % Compensate using the inverse transfer function -+% Amax = 10; -+% H_inv = min(abs(H_inv), Amax) .* exp(1j*angle(H_inv)); -+% Rx_Time_Rec.signal = fft(Rx_Time_Rec.signal); -+% Rx_Time_Rec.signal = ifft(Rx_Time_Rec.signal .* H_inv); -+ -+% Normalization -+Rx_Time_Rec = Rx_Time_Rec.normalize('mode','rms'); -+Rx_tr_mf = Rx_tr_mf.normalize('mode','rms'); -+ -+% Compare spectra of our and their time signal -+Rx_Time_Rec.spectrum("displayname",'Our signal','normalizeTo0dB',1,'fignum',101111); -+% Rx_matched_original.spectrum('normalizeTo0dB',1,"displayname",'Our signal','fignum',101111); -+Rx_tr_mf.spectrum("displayname",'Their signal','normalizeTo0dB',1,'fignum',101111); -+ -+% Compare our and their time signal -+Rx_Time_Rec.normalize("mode","rms").plot("displayname",'Our signal','fignum',101311); -+% Rx_matched_original.normalize("mode","rms").plot("displayname",'Original signal','fignum',101311); -+Rx_tr_mf.normalize("mode","rms").plot("displayname",'Their signal','fignum',101311); -+ -+%% -+% Use our or their signal -+for our_signal = 1 -+ if our_signal -+ Rx_synced = Rx_Time_Rec; -+ else -+ Rx_synced = Rx_tr_mf; -+ end -+ % Rx_synced = Rx_Time_Rec; -+ % Rx_synced = Rx_synced_cell{1}; -+ len_tr = 4096*2; -+ mu_ffe1 = 0.0001; -+ mu_ffe2 = 0.0008; -+ mu_ffe3 = 0.001; -+ mu_dc = 0.004; -+ mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; -+ mu_dfe = 0.0004; -+ duob_mode = db_mode.no_db; -+  -+ Rx_synced.plot("displayname",'RX: Matched+Sync+2sps','fignum',103); -+ Rx_synced.spectrum("displayname",'RX: Matched+Sync+2sps','fignum',104); -+  -+ Digi_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped','fignum',1,'normalizeTo0dB',1); -+ Rx_sig_compare.normalize("mode","rms").spectrum("displayname",'Tx: RC-shaped + matched filtered ','fignum',1,'normalizeTo0dB',1); -+ Rx_synced.normalize("mode","rms").spectrum("displayname",'RX: matched filtered + synced','fignum',1,'normalizeTo0dB',1); -+  -+ if M == 2 -+ ber_in_paper = 10^(-2.6); %fig 3a) 4 Gb/s MWIR FSO Transmission using Directly Modulated QCL and an Uncooled UTC-PD at Room-Temperature -+ elseif M == 4 -+ ber_in_paper = 10^(-2.5); -+ end -+  -+ %% -------------------- FFE -------------------- -+ % requires some more digging what is going on :-)  -+ % eq_ffe = EQ("Ne",[150, 0, 0],"Nb",[0,0,0], ... -+ % "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ % "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ % "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ %  -+ % % eq_ffe = FFE_DFE('ffe_order',99,'dfe_order',99,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5,'sps',sps,'decide',0); -+ %  -+ % ffe_results = ffe(eq_ffe,M,Rx_synced,Symbols,Bits, ... -+ % "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ... -+ % "eth_style_symbol_mapping",mapping_style); -+ %  -+ % if our_signal -+ % fprintf('Our signal: %.1e \n',ffe_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % else -+ % fprintf('Their signal: %.1e \n',ffe_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % end -+  -+ %% -------------------- VNLE + MLSE -------------------- -+ pf_ncoeffs = 4; -+ eq_v = EQ("Ne",[300, 0, 0],"Nb",[0, 0, 0], ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1, ... -+ 'weighted_DFE',0,'weighted_DFE_d_min',0.5,'weighted_DFE_mode','R2','weighted_DFE_I_mode',[5,0.5,0.6]); -+ % eq_v = FFE_DFE('ffe_order',300,'dfe_order',5,'len_tr',len_tr,'epochs_tr',5,'epochs_dd',5, ... -+ % 'ffe_mu_dd',mu_ffe,'ffe_mu_tr',0,'dfe_mu_dd',mu_dfe,'dfe_mu_tr',0.005,'sps',sps,'decide',0); -+ pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+ mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels); -+ -+ [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style); -+ -+ mlse_results.metrics.print -+ if our_signal -+ fprintf('Our Signal: %.1e \n',mlse_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ else -+ fprintf('Their Signal: %.1e \n',mlse_results.metrics.BER); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ end -+  -+ %% -------------------- ML-based MLSE (L=2) -------------------- -+ % ml_mlse_equalizer = ML_MLSE("epochs_tr",100,"epochs_dd",1, ... -+ % "len_tr",length(Rx_synced),"mu_dd",0.03,"mu_tr",0.03,"order",11,"sps",sps, ... -+ % "traceback_depth",256,"L",4,"delta",4,"adaptive_mu",0); -+ %  -+ % [ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode,"eth_style_symbol_mapping",mapping_style); -+ % if our_signal -+ % fprintf('Our Signal: %.1e \n',ml_mlse_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % else -+ % fprintf('Their EQ: %.1e \n',ml_mlse_results.metrics.BER); -+ % fprintf('Paper: %.1e \n \n',ber_in_paper); -+ % end -+end -\ No newline at end of file -diff --git a/projects/FSO_transmission/first_analysis.m b/projects/FSO_transmission/first_analysis.m -new file mode 100644 -index 0000000..9a327ab ---- /dev/null -+++ b/projects/FSO_transmission/first_analysis.m -@@ -0,0 +1,252 @@ -+ -+base = "C:\Users\Silas\Nextcloud4\Dokumente\02_Ablage_Office\FSO_FP_QCL_60umUTC"; -+mode = 0; %0 oder 1 -+M = 2; -+ -+all_files = dir(fullfile(base, "**/*.mat")); -+ -+if M == 2 -+ tx_data = load("C:\Users\Silas\Nextcloud4\Dokumente\02_Ablage_Office\FSO_FP_QCL_60umUTC\14G_PAM2\tx_info\tx_info_PAM2_14Gbd0.75RRC.mat"); -+ filename = fullfile(base, "14G_PAM2\M=2_Rs=1.4e10_Fs=8e10_I=265mA_RoP=46.3mW_L=31m_PS=RRC_rolloff=0.75_Mode=Rise.mat"); -+elseif M == 4 -+ tx_data = load("C:\Users\Silas\Nextcloud4\Dokumente\02_Ablage_Office\FSO_FP_QCL_60umUTC\6G_PAM4\tx_info\tx_info_PAM4_6Gbd0.6RRC.mat"); -+ filename = fullfile(base, "6G_PAM4\M=4_Rs=6e9_Fs=8e10_I=255mA_RoP=42.3mW_L=31m_PS=RRC_rolloff=0.6_Mode=Rise.mat"); -+end -+ -+if mode == 1 -+ [f, p] = uigetfile(fullfile(base, "**/*.mat"));  -+ if f~=0 -+ filename = fullfile(p,f); -+ end -+end -+ -+ -+datas = load(filename); -+ -+%% -+str = filename; -+M_ = str2double(regexp(str, 'M=([^_]+)', 'tokens', 'once')); -+assert(M==M_); -+fsym = str2double(regexp(str, 'Rs=([^_]+)', 'tokens', 'once')); -+fs = str2double(regexp(str, 'Fs=([^_]+)', 'tokens', 'once')); -+I = sscanf(char(regexp(str, 'I=([^_]+)', 'tokens', 'once')), '%f'); -+rop = sscanf(char(regexp(str, 'RoP=([^_]+)', 'tokens', 'once')), '%f'); -+L = sscanf(char(regexp(str, 'L=([^_]+)', 'tokens', 'once')), '%f'); -+pulseshape = string( regexp(str, 'PS=([^_]+)', 'tokens', 'once')); -+rolloff = str2double(regexp(str, 'rolloff=([^_]+)', 'tokens', 'once')); -+mode = string( regexp(str, 'Mode=([^\.]+)', 'tokens', 'once')); -+ -+%% -+% Tx data -+ -+Bits = Informationsignal(tx_data.tx_data,"fs",fsym); -+Symbols = Informationsignal(real(tx_data.tx_PAM_sym),"fs",fsym); -+ -+mapping_style = M==4; % Pam2 is like move-it; PAM-4 is different, same mapping like ETH peopled used in Zurich... hence the "eth_style" argument here and there -+PM = PAMmapper(M,0,"eth_style",mapping_style); % one should rename "eth style" as this is simply a different mapping scheme -+ -+Symbols_ = PM.map(Bits) .* PM.scaling; -+assert(isequal(Symbols.signal,Symbols_.signal)); -+ -+Bits_ = PM.demap(Symbols); -+[bits,errors,ber,errorIndice] = calc_ber(Bits_.signal,Bits.signal); -+assert(ber == 0); -+ -+%% For comparison, apply pulsef on Tx Symbols -+Pform = Pulseformer("fsym",fsym,"fdac",fs,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Digi_sig_tx_compare = Pform.process(Symbols); -+ -+Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Digi_sync = Pform.process(Symbols); -+ -+MF = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff); -+Rx_sig_compare = MF.process(Digi_sig_tx_compare); -+ -+%% -+ -+% Rx Data -+traceData = datas.tr.lastData(2).trace.ch3; -+ -+%FYI: Voltage=(RawData−YReference)×YIncrement+YOrigin -+scoperead_volts = (traceData.RawData - traceData.YReference) * traceData.YIncrement + traceData.YOrigin; -+demystified = isequal(traceData.YData,scoperead_volts); -+assert(demystified); -+ -+timesig_compare = [0:1:datas.tr.lastData(1).trace.ch3.Points-1] ./ fs; -+timesig = datas.tr.lastData(1).trace.ch3.XData; -+assert(isequal(traceData.YData,scoperead_volts)); -+ -+Scope_sig = Electricalsignal(traceData.YData,"fs",fs); -+ -+%% -+% 1) matched filter -+% pulse is symmetric, hence we can use pulsef directly as matched filter. -+% It feels off (bit I think correct) that the fsym is now the output freq.!! -+% -> output 2 sps to omit timing recovery!? -+apply_matched_filter = 1; -+k = 1; -+if apply_matched_filter -+  -+ Pform = Pulseformer("fsym",fsym,"fdac",k*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); -+ Rx_matched = Pform.process(Scope_sig); -+else -+ -+ Rx_matched = Filter('filtdegree',4,"f_cutoff",fsym*0.5,"fs",Scope_sig.fs,"filterType",filtertypes.gaussian,"active",true).process(Scope_sig); -+ Rx_matched = Rx_matched.resample("fs_out",k*fsym); -+end -+Rx_matched.spectrum(); -+ -+ -+%% -+ -+coefficients = arburg(Rx_matched.signal,25); -+ -+figure() -+[h,w] = freqz(1,coefficients,Rx_matched.length,"whole",Rx_matched.fs); -+h = h/max(abs(h)); -+hold on -+w_ = (w - Rx_matched.fs/2); -+plot(w_.*1e-9,20*log10(fftshift(abs(h))),'DisplayName',['Burg Coeffs: ', num2str(round(coefficients,2)), ' '],'LineWidth',2); -+ -+%% Timing Rec -+apply_timing_rec = 1; -+if apply_timing_rec -+ [Rx_symbolsync, timing_error] = Timing_Recovery("timing_error_detector",'Gardner (non-data-aided)','sps',k,'damping_factor',0.1,'normalized_loop_bandwidth',0.1,'detector_gain',2.7).process(Rx_matched); -+ figure();plot(timing_error); -+ Rx_symbolsync.fs = fsym; -+ % Tsynch -+ [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_symbolsync.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 0); -+ Rx_synced = Rx_synced_cell{1}; -+ sps = 1; -+else -+ % Tsynch -+ [~,Rx_synced_cell,inverted,sequenceFound,sequenceStarts] = Rx_matched.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", 0); -+ Rx_synced = Rx_synced_cell{1}; -+ Rx_synced = Rx_synced.resample("fs_out",2*fsym); -+ sps = 2; -+end -+ -+if M == 2 -+ ber_in_paper = 10^(-2.6); %fig 3a) 4 Gb/s MWIR FSO Transmission using Directly Modulated QCL and an Uncooled UTC-PD at Room-Temperature -+elseif M == 4 -+ ber_in_paper = 10^(-2.5); -+end -+ -+ -+%% -+ -+Rx_synced = Rx_synced_cell{1}; -+ -+ -+% -------------------- FFE -------------------- -+% requires some more digging what is going on :-) -+eq_ffe = EQ("Ne",[50, 1, 1],"Nb",[2,0,0], ... -+ "training_length",512,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ -+vars = logspace(-4,-3,36); -+ -+parfor i = 1:numel(vars) -+ -+ len_tr = 4096; -+ mu_ffe1 = 0.01;% mus(i);%0.0001; -+ mu_ffe2 = 0.0008; -+ mu_ffe3 = 0.001; -+ mu_dc = 0.005; -+ mu_ffe = [mu_ffe1 mu_ffe2 mu_ffe3]; -+ mu_dfe = vars(i); -+ duob_mode = db_mode.no_db; -+ -+ % requires some more digging what is going on :-) -+ eq_ffe_1 = EQ("Ne",[150, 1, 0],"Nb",[50,0,0], ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",0); -+ -+ eq_ffe_2 = FFE("epochs_tr",1,"epochs_dd",vars(i),"len_tr",4096,"mu_dd",vars(i),"mu_tr",vars(i),"order",999,"sps",1,"decide",0, "adaption",adaption_method.nlms,"dd_mode",0); -+ % eq_ffe_2 = FFE_DFE("epochs_tr",5,"epochs_dd",5,"len_tr",4096*2,"ffe_mu_dd",1e-5,"dfe_mu_dd",mus(i),"ffe_mu_tr",0,"dfe_mu_tr",0,"ffe_order",50,"dfe_order",10,"sps",1,"decide",1); -+ -+ -+ ffe_results = ffe(eq_ffe_1,M,Rx_synced,Symbols,Bits, ... -+ "precode_mode",duob_mode,'showAnalysis',1,"postFFE",[], ... -+ "eth_style_symbol_mapping",mapping_style); -+ -+ ffe_results.metrics.BER -+ bers(i) = ffe_results.metrics.BER; -+end -+ -+figure(); -+plot(vars,bers); -+yline(ber_in_paper) -+beautifyBERplot(); -+%  -+fprintf('Paper: %.1e \n \n',ber_in_paper); -+ffe_results.metrics.print("description",'FFE'); -+fprintf('FFE: %.1e \n',ffe_results.metrics.BER); -+ -+ -+%% -------------------- VNLE + MLSE -------------------- -+len_tr = 4096; -+mu_ffe1 = 0.0001;% mus(i);%0.0001; -+mu_ffe2 = 0.0008; -+mu_ffe3 = 0.001; -+mu_dc = 0.005; -+mu_ffe = [mu_ffe1 mu_ffe2 mu_ffe3]; -+mu_dfe = 0.0004; -+duob_mode = db_mode.no_db; -+ -+pf_ncoeffs = 4; -+ -+vars = 1:7; -+bers = zeros(size(vars)); -+parfor i = 1:numel(vars) -+  -+ eqv = EQ("Ne",[200, 1, 0],"Nb",[2, 0, 0], ... -+ "training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ... -+ "FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ pf_ncoeffs = vars(i); -+ pf = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+ mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0,"eth_style",mapping_style).levels); -+ [vnle_results, mlse_results] = vnle_postfilter_mlse(eqv, pf, mlse_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", mapping_style); -+ fprintf('Paper: %.1e \n \n',ber_in_paper); -+ vnle_results.metrics.print("description",'VNLE'); -+ mlse_results.metrics.print("description",'MLSE'); -+ bers(i) = mlse_results.metrics.BER; -+end -+%% -+figure();hold on -+plot(vars,bers_ffe,'DisplayName','FFE [200,0,0] + PF + MLSE'); -+plot(vars,bers_vnle,'DisplayName','VNLE [200,1,0] + PF + MLSE'); -+plot(vars,bers_vnledfe,'DisplayName','VNLE [200,1,0] + DFE [2] + PF + MLSE'); -+plot(vars,bers_vnledfe_ideal,'DisplayName','VNLE [200,1,0] + ideal DFE [2] + PF + MLSE'); -+yline(ber_in_paper); -+yline([2e-2, 4.85e-3, 3.8e-3, 2,2e-4],'LineWidth',2,'Color',[0.8,0.8,0.8],'LineStyle',':','HandleVisibility','off'); -+ylim([1e-5,0.1]); -+beautifyBERplot(); -+ -+%% -------------------- DB target -------------------- -+mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,'trellis_states',PAMmapper(M,0).levels); -+ -+eq_ = EQ("Ne",[50, 5, 5],"Nb",[0,0,0],"training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",sps,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1); -+ -+dbt_results = duobinary_target(eq_,mlse_db_, M, Rx_synced, Symbols, Bits, ... -+ "precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [],"eth_style_symbol_mapping",mapping_style); -+ -+fprintf('Paper: %.1e \n \n',ber_in_paper); -+dbt_results.metrics.print("description",'Duobinary'); -+ -+ -+%% -+ -+%ML-based MLSE (L=2) -+mu_ml = 0.01; training_epochs = 100; -+ml_mlse_equalizer = ML_MLSE("epochs_tr",training_epochs,"epochs_dd",1, ... -+ "len_tr",len_tr,"mu_dd",mu_ml,"mu_tr",mu_ml,"order",11,"sps",1, ... -+ "traceback_depth",128,"L",3,"delta",4,"adaptive_mu",0); -+ -+[ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Rx_synced, Symbols, Bits,"precode_mode",duob_mode); -+ml_mlse_results.metrics.print("description",'ML '); -\ No newline at end of file -diff --git a/projects/HighSpeedExperiment_2024/Auswertung_JLT/final/Copy_of_FIGURE_WAVELENGTH.m b/projects/HighSpeedExperiment_2024/Auswertung_JLT/final/Copy_of_FIGURE_WAVELENGTH.m -index 21f881f..986fcdb 100644 ---- a/projects/HighSpeedExperiment_2024/Auswertung_JLT/final/Copy_of_FIGURE_WAVELENGTH.m -+++ b/projects/HighSpeedExperiment_2024/Auswertung_JLT/final/Copy_of_FIGURE_WAVELENGTH.m -@@ -6,7 +6,7 @@ db = DBHandler("dataBase", "labor_highspeed", "type", database_type); -  - pam_levels = [4, 6, 8]; % three tiles - bitrate_set = 360e9; --fiberL = 10; -+fiberL = 2; -  - fields = [ - db.getTableFieldNames('power_state_info'); -@@ -96,7 +96,7 @@ end - %% ============================================================ - % PLOT — 1×3 (PAM-4, PAM-6, PAM-8) - % ============================================================ --fig = figure(9110); clf; -+fig = figure(9112); clf; - tiledlayout(1,3,'TileSpacing','compact','Padding','compact'); -  - lw = 1.8; -@@ -223,19 +223,19 @@ ylabel(''); -  - end -  --pos = 1e3.*[2.7770 1.2017 1.4000 0.3200]; --set(fig, 'Position', pos); -+% pos = 1e3.*[2.7770 1.2017 1.4000 0.3200]; -+% set(fig, 'Position', pos); -  - %% === EXPORT === --outfile = 'C:\Users\Silas\Documents\latex\JLT_400G copy\media\matlab2tikz\wavelength_analysis.tikz'; --matlab2tikz(outfile, ... -- 'width','\fwidth', ... -- 'height','\fheight', ... -- 'showInfo',false, ... -- 'extraAxisOptions',{ ... -- 'legend style={font=\footnotesize}', ... -- 'legend columns=1' ... -- }); -+% outfile = 'C:\Users\Silas\Documents\latex\JLT_400G copy\media\matlab2tikz\wavelength_analysis.tikz'; -+% matlab2tikz(outfile, ... -+% 'width','\fwidth', ... -+% 'height','\fheight', ... -+% 'showInfo',false, ... -+% 'extraAxisOptions',{ ... -+% 'legend style={font=\footnotesize}', ... -+% 'legend columns=1' ... -+% }); -  -  -  -diff --git a/projects/HighSpeedExperiment_2024/Auswertung_JLT/final/FIGURE_introduction.m b/projects/HighSpeedExperiment_2024/Auswertung_JLT/final/FIGURE_introduction.m -index 2213c8a..147c7d9 100644 ---- a/projects/HighSpeedExperiment_2024/Auswertung_JLT/final/FIGURE_introduction.m -+++ b/projects/HighSpeedExperiment_2024/Auswertung_JLT/final/FIGURE_introduction.m -@@ -1,83 +1,139 @@ -+tablename = 'C:\Users\Silas\Documents\latex\JLT_400G_submission\HighSpeedExperiments_oneandonly_csv.csv'; -+% Returns a Table -+data = readtable(tablename,"Delimiter",';','DecimalSeparator',','); -+ -+ - %% ============================================================ - % PLOT - % ============================================================ -+%% 1. DATA EXTRACTION & SETUP -+%% 1. DATA EXTRACTION & SETUP -+raw_M = data.M; -+raw_baud = data.BaudRate; -+raw_net = data.NetRate; -+raw_codes = string(data.ZoteroCode);  -+raw_names = string(data.Name); -+raw_band = string(data.Band); -+ -+% Filter Valid Data -+target_M = [2, 4, 6, 8]; -+validIdx = ismember(raw_M, target_M) & ~isnan(raw_baud) & ~isnan(raw_net); -+ -+Mvals = raw_M(validIdx); -+baud = raw_baud(validIdx); -+netrate = raw_net(validIdx); -+codes = raw_codes(validIdx); -+names = raw_names(validIdx); -+bands = raw_band(validIdx); -+ -+pam_list = target_M; -+colors = flip(cbrewer2('SET1',4)); -+ -+%% 2. PLOT (For Visual Check only) - figure; hold on; --ms = 32; % scatter size --lw = 0.8; % line width -- --for k = 1:4 % PAM-2/4/6/8 -+ms = 20;  -+lw = 0.5;  -  -+for k = 1:length(pam_list)  - M = pam_list(k); - idxPam = (Mvals == M); -- -- % Extract for this PAM -+  - x = baud(idxPam); - y = netrate(idxPam); -+ b = bands(idxPam); - n = names(idxPam); -- -- % Get color for this PAM format - col = colors(k,:); -- -- % ----- LEGEND FLAG (only add one entry per PAM) ----- -+  - firstLegend = true; -- -- % ---- PLOT ALL POINTS (marker based on publication) ---- -+  - for i = 1:sum(idxPam) -  -- % marker selection by publication -- pubIdx = find(pub_list == n(i), 1); -- marker = markerlist{mod(pubIdx-1, nMarkers) + 1}; -- -+ % Marker Logic -+ ms = 20;  -+ if strcmpi(b(i), 'O') -+ marker = 'o';  -+ elseif strcmpi(b(i), 'C') -+ marker = 'd';  -+ else -+ marker = 's';  -+ end -+ if strcmpi(n(i), 'THIS WORK') -+ marker = 'pentagram';  -+ ms = 100; -+ end -+  -+ % Plot Scatter - if firstLegend -- h = scatter(x(i), y(i), ms, ... -- 'Marker', marker, ... -- 'MarkerEdgeColor', col, ... -- 'MarkerFaceColor', col, ... -+ scatter(x(i), y(i), ms, 'Marker', marker, ... -+ 'MarkerEdgeColor', col, 'MarkerFaceColor', col, ... - 'DisplayName', sprintf('PAM-%d', M)); - firstLegend = false; - else -- h = scatter(x(i), y(i), ms, ... -- 'Marker', marker, ... -- 'MarkerEdgeColor', col, ... -- 'MarkerFaceColor', col, ... -+ scatter(x(i), y(i), ms, 'Marker', marker, ... -+ 'MarkerEdgeColor', col, 'MarkerFaceColor', col, ... - 'HandleVisibility','off'); - end -- -- % ====== CUSTOM DATATIP CONTENT ====== -- dt = h.DataTipTemplate; -- dt.DataTipRows(1).Label = 'Baud rate'; -- dt.DataTipRows(2).Label = 'Net rate'; -- -- % Add publication name -- dt.DataTipRows(end+1) = dataTipTextRow('Publication', n(i)); -- -- - end -- -- % ---- Fit (PAM-specific) ---- -- valid = ~isnan(x) & ~isnan(y); -- if sum(valid) >= 3 -- p = polyfit(x(valid), y(valid), 2); -- xfit = linspace(min(x(valid)), max(x(valid)), 200); -- yfit = polyval(p, xfit); -- -- plot(xfit, yfit, ':', ... -- 'LineWidth', lw, ... -- 'Color', col, ... -- 'HandleVisibility', 'off'); % do NOT add to legend -+  -+ % Fit lines -+ if length(x) >= 3 -+ [p, S, mu] = polyfit(x, y, 2);  -+ xfit = linspace(min(x), max(x), 200); -+ yfit = polyval(p, xfit, S, mu); -+ plot(xfit, yfit, '-', 'LineWidth', lw, 'Color', col, 'HandleVisibility', 'off');  - end - end -  --grid on; -+grid on; box on; - xlabel('Baud rate [GBd]'); - ylabel('Net rate [Gb/s]'); -- --legend('Location','northwest'); --set(gca,'FontSize',11); -- -+% title('Check Command Window for TikZ Code'); -+% legend('Location','northwest'); -+ -+%% 3. GENERATE TIKZ ANNOTATION CODE -+% This prints the manual \draw commands to the console -+ -+%% GENERATE TIKZ ANNOTATION CODE -+% This prints the manual \draw commands to the console -+ -+%% GENERATE TIKZ ANNOTATION CODE (Colored Borders + Tiny Font) -+%% GENERATE TIKZ ANNOTATION CODE (No Arrow, Close Text) -+fprintf('\n\n%% ===========================================================\n'); -+fprintf('%% COPY THE FOLLOWING LINES INTO YOUR .TEX FILE \n'); -+fprintf('%% (Paste them just before \\end{axis})\n'); -+fprintf('%% ===========================================================\n\n'); -+ -+for i = 1:length(baud) -+ bx = baud(i); -+ by = netrate(i); -+ key = codes(i); -+ M_val = Mvals(i); -+  -+ % --- PLACEMENT LOGIC --- -+ if M_val == 8 -+ % PAM-8: Place Top-Left -+ % 'south east' anchor means the text's bottom-right corner touches the coordinate -+ % shift moves it slightly up and left to clear the marker -+ anchorStr = 'south east'; -+ shiftStr = 'shift={(-3pt, 3pt)}';  -+ else -+ % Others: Place Bottom-Right -+ % 'north west' anchor means the text's top-left corner touches the coordinate -+ % shift moves it slightly down and right -+ anchorStr = 'north west'; -+ shiftStr = 'shift={(3pt, -3pt)}'; -+ end -+  -+ % --- PRINT COMMAND --- -+ % Uses \node directly at the coordinate (axis cs:...) -+ fprintf('\\node[anchor=%s, %s, font=\\tiny, fill=white, inner sep=1pt] at (axis cs:%.2f, %.2f) {\\cite{%s}};\n', ... -+ anchorStr, shiftStr, bx, by, key); -+end -+fprintf('\n') -  - %% === EXPORT === --outfile = 'C:\Users\Silas\Documents\latex\JLT_400G copy\media\matlab2tikz\highspeedresults.tikz'; -+outfile = 'C:\Users\Silas\Documents\latex\JLT_400G_submission\media\matlab2tikz\highspeedresults_test.tikz'; -+ - matlab2tikz(outfile, ... - 'width','\fwidth', ... - 'height','\fheight', ... -diff --git a/projects/HighSpeedExperiment_2024/Auswertung_JLT/run_dsp_from_db.m b/projects/HighSpeedExperiment_2024/Auswertung_JLT/run_dsp_from_db.m -index ab31451..67a2ff8 100644 ---- a/projects/HighSpeedExperiment_2024/Auswertung_JLT/run_dsp_from_db.m -+++ b/projects/HighSpeedExperiment_2024/Auswertung_JLT/run_dsp_from_db.m -@@ -10,10 +10,11 @@ if dsp_options.mode == "load_run_id" -  - if experiment == "highspeed_2024" -  -- dsp_options.database_type = 'mysql'; -+ dsp_options.database_type = "mysql"; - dsp_options.dataBase = 'labor_highspeed';%'C:\Users\Silas\Documents\MATLAB\Datensätze\sioe_labor\silas_labor_newdsp_newstructure.db'; - dsp_options.storage_path = 'Z:\2024\sioe_labor\'; -- db = DBHandler("dataBase", [dsp_options.dataBase], "type", dsp_options.database_type); -+ db = DBHandler("dataBase", [dsp_options.dataBase],... -+ "type", dsp_options.database_type,"server","192.168.178.192","user","silas","password","silas"); -  - elseif experiment == "mpi_ecoc_2025" -  -diff --git a/projects/ML_based_MLSE/analyze_filter_length.m b/projects/ML_based_MLSE/analyze_filter_length.m -index 616b715..1b31d6b 100644 ---- a/projects/ML_based_MLSE/analyze_filter_length.m -+++ b/projects/ML_based_MLSE/analyze_filter_length.m -@@ -5,9 +5,9 @@ M = 4; - randkey = 1; -  - % --- Parameter sweep --order_range = 2:3:11; % FFE order --delta_range = 0:2:4; % delta --SNR_dB = 20; -+order_range = 5:5:50; % FFE order -+delta_range = 0:5:20; % delta -+SNR_dB = 30; -  - % --- Prepare bit sequence - order_bits = 19; -@@ -21,10 +21,14 @@ Symbols = PAMmapper(M,0).map(Bits); - Symbols.fs = 200e9; -  - % --- Channel (minimal ISI + AWGN) --h = [0.3 0.9 0.3]; h = h/norm(h); -+h = abs([0.3 0.9 0.3]); h = h/norm(h); -+ -+% h = [1 -1.67085330039878 1.17918163282514 -0.805210559745616 0.571564213123367 -0.296337147529674 0.00649773445209780 0.0854177610195952 -0.0576009020965258 0.0520994427061551 -0.0624586034913656 0.0553280962699552 -0.00705582559925755 -0.0336399056707792 0.0706903719452810 -0.0334124287931977 0.0131699455037966 0.0587431373842994 -0.0515902976066452 0.00647904355473619 0.0137506750904990 -0.0547974515885928 0.00994735499340592 -0.0135513582534086 -0.00463322575007739 0.0277311946101940]; -+% h = h/norm(h); - symbols_filt = Symbols.filter(h,1); - symbols_noi = symbols_filt; - symbols_noi.signal = awgn(symbols_filt.signal,SNR_dB,'measured'); -+symbols_noi.spectrum(); -  - % --- Generate all parameter pairs - [O,D] = ndgrid(order_range, delta_range); -@@ -38,7 +42,7 @@ ce_vec = nan(size(pairs,1),1); - ce_training = nan(size(pairs,1),training_len); -  - % --- Parallel loop over parameter pairs --parfor k = 1:size(pairs,1) -+for k = 1:size(pairs,1) - order_k = pairs(k,1); - delta_k = pairs(k,2); -  -@@ -89,7 +93,7 @@ end - beautifyBERplot - ylabel('BER'); xlabel('Filter Order [N]'); - title('BER vs. Filter order'); --ylim([1e-4, 0.1]); -+% ylim([1e-4, 0.1]); - yline(3.8e-3,'HandleVisibility','off'); - yline(2.2e-4,'HandleVisibility','off'); -  -diff --git a/projects/ML_based_MLSE/theoretic_channel_evaluation.m b/projects/ML_based_MLSE/theoretic_channel_evaluation.m -index 3e1efcc..3eb6f09 100644 ---- a/projects/ML_based_MLSE/theoretic_channel_evaluation.m -+++ b/projects/ML_based_MLSE/theoretic_channel_evaluation.m -@@ -48,36 +48,36 @@ for i = 1:numel(SNR_dB) - symbols_noi = symbols_filt; - symbols_noi.signal = awgn(symbols_filt.signal, SNR_dB(i), 'measured'); % AWGN with given SNR -  -- % % Sequence Est L=5 -- % mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels,'scale_mode',0,'trellis_exclusion',0,'trellis_state_mode',2,'debug',0,'DIR',h); -- % mlse_.DIR = h; -- % [y_mlse] = mlse_.process(symbols_noi,Symbols); -- % mlse_bits = PAMmapper(M, 0, "eth_style", 0).demap(y_mlse); -- % [~, ~, ber_mlse_l5(i), ~] = calc_ber(mlse_bits.signal, Bits.signal, "skip_front", 10, "skip_end", 10, "returnErrorLocation", 1); -- % fprintf('MLSE L5: %.2e \n',ber_mlse_l5(i)); -- %  -- % % 2nd Approach  -- % mu_lms = 0.0005; -- % pf_ncoeffs = 1; -- % eq_ = FFE("epochs_tr",5,"epochs_dd",5,"len_tr",2^13,"mu_dd",mu_lms,"mu_tr",mu_lms,"order",16,"sps",1,"dd_mode",1,"adaption_technique","lms"); -- % pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -- %  -- % % FFE -- % [y_ffe, ffe_noise] = eq_.process(symbols_noi, Symbols); -- %  -- % Eq_bits = PAMmapper(M, 0, "eth_style", 0).demap(y_ffe); -- % [~, ~, ber_ffe(i), ~] = calc_ber(Eq_bits.signal, Bits.signal, "skip_front", 0, "skip_end", 0, "returnErrorLocation", 1); -- % fprintf('FFE: %.2e \n',ber_ffe(i)); -- %  -- % % Postfilter -- % [y_white,~] = pf_.process(y_ffe, ffe_noise); -- %  -- % % Sequence Est -- % mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels,'scale_mode',0,'trellis_exclusion',0,'trellis_state_mode',2,'debug',0,'DIR',pf_.coefficients); -- % [y_mlse] = mlse_.process(y_white,Symbols); -- % mlse_bits = PAMmapper(M, 0, "eth_style", 0).demap(y_mlse); -- % [~, errors, ber_nwf_mlse_l2(i), errpos] = calc_ber(mlse_bits.signal, Bits.signal, "skip_front", 10, "skip_end", 10, "returnErrorLocation", 1); -- % fprintf('MLSE: %.2e \n',ber_nwf_mlse_l2(i)); -+ % Sequence Est L=5 -+ mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels,'scale_mode',0,'trellis_exclusion',0,'trellis_state_mode',2,'debug',0,'DIR',h); -+ mlse_.DIR = h; -+ [y_mlse] = mlse_.process(symbols_noi,Symbols); -+ mlse_bits = PAMmapper(M, 0, "eth_style", 0).demap(y_mlse); -+ [~, ~, ber_mlse_l5(i), ~] = calc_ber(mlse_bits.signal, Bits.signal, "skip_front", 10, "skip_end", 10, "returnErrorLocation", 1); -+ fprintf('MLSE L5: %.2e \n',ber_mlse_l5(i)); -+ -+ % 2nd Approach  -+ mu_lms = 0.0005; -+ pf_ncoeffs = 1; -+ eq_ = FFE("epochs_tr",5,"epochs_dd",5,"len_tr",2^13,"mu_dd",mu_lms,"mu_tr",mu_lms,"order",16,"sps",1,"dd_mode",1,"adaption_technique","lms"); -+ pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); -+ -+ % FFE -+ [y_ffe, ffe_noise] = eq_.process(symbols_noi, Symbols); -+ -+ Eq_bits = PAMmapper(M, 0, "eth_style", 0).demap(y_ffe); -+ [~, ~, ber_ffe(i), ~] = calc_ber(Eq_bits.signal, Bits.signal, "skip_front", 0, "skip_end", 0, "returnErrorLocation", 1); -+ fprintf('FFE: %.2e \n',ber_ffe(i)); -+ -+ % Postfilter -+ [y_white,~] = pf_.process(y_ffe, ffe_noise); -+ -+ % Sequence Est -+ mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels,'scale_mode',0,'trellis_exclusion',0,'trellis_state_mode',2,'debug',0,'DIR',pf_.coefficients); -+ [y_mlse] = mlse_.process(y_white,Symbols); -+ mlse_bits = PAMmapper(M, 0, "eth_style", 0).demap(y_mlse); -+ [~, errors, ber_nwf_mlse_l2(i), errpos] = calc_ber(mlse_bits.signal, Bits.signal, "skip_front", 10, "skip_end", 10, "returnErrorLocation", 1); -+ fprintf('MLSE: %.2e \n',ber_nwf_mlse_l2(i)); -  - % ML-base MLSE L=2 - adaptive_mu = 0; -diff --git "a/projects/Messung_Z\303\274rich/minimal_matched.m" "b/projects/Messung_Z\303\274rich/minimal_matched.m" -new file mode 100644 -index 0000000..a5dfa33 ---- /dev/null -+++ "b/projects/Messung_Z\303\274rich/minimal_matched.m" -@@ -0,0 +1,60 @@ -+L = 4; % Oversampling factor -+fsym = 1e9/4; -+rollOff = 0.5; % Pulse shaping roll-off factor -+htx = rcosdesign(rollOff,16, L, 'sqrt'); -+hrx = conj(fliplr(htx)); -+ -+signal = zeros(1000,1); -+signal(500) = 1; -+Digi_sig = Informationsignal(signal,"fs",fsym); -+ -+% Digi_sig = Digi_sig.resample("fs_out",L*fsym); -+%  -+% Digi_sig_tx = Digi_sig.filter(htx,1); -+% Digi_sig_rx = Digi_sig_tx.filter(hrx,1); -+%  -+% figure;plot(Digi_sig_tx.signal);hold on;plot(Digi_sig_rx.signal),plot(Digi_sig.signal); -+%  -+%  -+%  -+%  -+pulsef = Pulseformer("alpha",1,"matched",0,"fdac",Digi_sig.fs*L,"fsym",fsym,"pulse","rrc","pulselength",16); -+Digi_sig = pulsef.process(Digi_sig); -+ -+pulsef = Pulseformer("alpha",1,"matched",1,"fdac",Digi_sig.fs,"fsym",fsym,"pulse","rrc","pulselength",16); -+Digi_sig_matched = pulsef.process(Digi_sig); -+ -+% Filter: -+htx = rcosdesign(rollOff,16, L, 'sqrt'); -+% Note half of the target delay is used, because when combined -+% to the matched filter, the total delay will be achieved. -+hrx = conj(fliplr(htx)); -+ -+figure -+plot(htx) -+title('Transmit Filter') -+xlabel('Index') -+ylabel('Amplitude') -+ -+figure -+plot(hrx) -+title('Rx Filter (Matched Filter)') -+xlabel('Index') -+ylabel('Amplitude') -+ -+p = conv(htx,hrx); -+ -+figure -+plot(p) -+title('Combined Tx-Rx = Raised Cosine') -+xlabel('Index') -+ylabel('Amplitude') -+ -+% And let's highlight the zero-crossings -+zeroCrossings = NaN*ones(size(p)); -+zeroCrossings(1:L:end) = 0; -+zeroCrossings((rcDelay)*L + 1) = NaN; % Except for the central index -+hold on -+plot(zeroCrossings, 'o') -+legend('RC Pulse', 'Zero Crossings') -+hold off -\ No newline at end of file -diff --git a/projects/WDM/WDM_model_10km_queue.m b/projects/WDM/WDM_model_10km_queue.m -index a41cb02..8aae2ea 100644 ---- a/projects/WDM/WDM_model_10km_queue.m -+++ b/projects/WDM/WDM_model_10km_queue.m -@@ -312,7 +312,7 @@ for realiz = 1:s.num_realiz - Opt_sig_wdm_fib = DP_Fiber("L",segment_length,"D",Dvec(seg),"Dpmd",s.pmd,"Ds",0.07, ... - "beat_len",10,"corr_len",100,"dz",1,"manakov",0, ... - "gamma",s.gamma,"lambda",zdw,"n_waveplates",10,"SS_dphimax",0.01, ... -- "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1).process(Opt_sig_wdm_fib); -+ "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1,"useGPU",1,"useSingle",1).process(Opt_sig_wdm_fib); -  - % -------- Evaluate at intermediate distance (enqueue jobs) -------- - if eval_ptr <= nEval && seg == eval_seg(eval_ptr) -diff --git a/test/bayesopt_ffe_tuning.m b/test/bayesopt_ffe_tuning.m -new file mode 100644 -index 0000000..adedb3d ---- /dev/null -+++ b/test/bayesopt_ffe_tuning.m -@@ -0,0 +1,219 @@ -+%% Bayesian Optimization for FFE Parameter Tuning -+% This script uses bayesopt to find optimal mu_dd and mu_tr values -+% that minimize BER for the FFE equalizer. -+ -+clear; clc; -+ -+%% Setup - Same as gpu_processing_dpfiber.m -+s.wavelengthplan = calcWavelengthPlan(4, 400e9, 1310); -+link_length = 10; -+s.pmd = 0.1; -+s.gamma = 0.0023; -+ -+s.M = 4; -+fsym = 112e9; -+fdac = 2*fsym; -+fadc = 120000000000; -+s.random_key = 1; -+ -+% Laser / Modulator -+vbias_rel = 0.5; -+u_pi = 4.6; -+vbias = -vbias_rel*u_pi; -+laser_linewidth = 0e6; -+ -+duob_mode = db_mode.no_db; -+rcalpha = 0.05; -+Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rc","pulselength",16,"alpha",rcalpha); -+ -+s.chirpalpha = 0; -+s.p_launch = 3; -+s.p = "co"; -+ -+N = numel(s.wavelengthplan); -+ -+switch s.p -+ case "co" -+ pol_rot = 100.*ones(1,N); -+ d_local = 0; -+end -+ -+f_plan = physconst('lightspeed')./(s.wavelengthplan.*1e-9); -+margin = 25e12; -+f_span = (max(f_plan)+margin)-(min(f_plan)-margin); -+f_nyq = f_span/2; -+ -+kover = 4; -+upsample_required = f_nyq./(fdac*kover/2); -+upsample_pow = 2^nextpow2(upsample_required); -+ -+s.f_opt = fdac*kover*upsample_pow; -+s.f_opt_nyq = s.f_opt/2; -+ -+s.rop = -8; % Fixed ROP for optimization -+ -+%% Generate TX signals (run once) -+fprintf('Generating TX signals...\n'); -+for l = 1:N -+ [Digi_sig,Symbols{l},Tx_bits{l}] = PAMsource( ... -+ "fsym",fsym,"M",s.M,"order",15,"useprbs",0, ... -+ "fs_out",fdac, ... -+ "applyclipping",0,"clipfactor",1.5, ... -+ "applypulseform",1,"pulseformer",Pform, ... -+ "randkey",s.random_key+l, ... -+ "mrds_code",0,"mrds_blocklength",512,"duobinary_mode",duob_mode ... -+ ).process(); -+ -+ Lp_awg = Filter('filtdegree',3,"f_cutoff",56e9,"fs",fdac*kover, ... -+ "filterType",filtertypes.gaussian,"active",true); -+ -+ El_sig = AWG("fdac",fdac,"f_cutoff",fsym,"lpf_active",1,"kover",kover, ... -+ "bit_resolution",6,"upsampling_method","samplehold","precomp_sinc_rolloff",0, ... -+ "H_lpf",Lp_awg,"dac_max",0.6,"dac_min",-0.6).process(Digi_sig); -+ -+ El_sig = El_sig.normalize("mode","oneone"); -+ scaling = 0.6*(u_pi/2-abs(vbias-u_pi/2)); -+ El_sig = El_sig .* scaling; -+ -+ Eml_out = EML("mode",eml_mode.im_cosinus,"power",3,"fsimu",El_sig.fs, ... -+ "lambda",s.wavelengthplan(l),"bias",vbias,"u_pi",u_pi, ... -+ "linewidth",laser_linewidth,"randomkey",s.random_key+l,"alpha",s.chirpalpha).process(El_sig); -+ -+ signal_cell{l} = Polarization_Controller("mode","rot_power","desired_power",pol_rot(l)).process(Eml_out); -+end -+ -+%% WDM mux + launch -+Opt_sig_wdm = Optical_Multiplex("fs_in",fdac*kover,"fs_out",upsample_pow*fdac*kover, ... -+ "lambda_center",1310,"random_key",0,"filtype",1,"B",120e9).process(signal_cell); -+ -+Opt_sig_wdm = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power", ... -+ "amplification_db",s.p_launch+10*log10(N)).process(Opt_sig_wdm); -+ -+%% Fiber propagation -+segment_length = 1; -+nSegments = link_length/segment_length; -+nSegments = round(nSegments); -+ -+zdw = 1310; -+randomize_D = true; -+Dvec = getDispersionVector(nSegments, d_local, zdw, randomize_D, s.random_key); -+ -+Opt_sig_wdm_fib = Opt_sig_wdm; -+fprintf('Running fiber propagation...\n'); -+for seg = 1:nSegments -+ fprintf('Segment %d/%d\n', seg, nSegments); -+ Opt_sig_wdm_fib = DP_Fiber("L",segment_length,"D",Dvec(seg),"Dpmd",s.pmd,"Ds",0.07, ... -+ "beat_len",10,"corr_len",100,"dz",1,"manakov",0, ... -+ "gamma",s.gamma,"lambda",zdw,"n_waveplates",10,"SS_dphimax",0.01, ... -+ "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1,"useGPU",true,"useSingle",true).process(Opt_sig_wdm_fib); -+end -+ -+%% Pre-process to get Rx_sig (do demux once) -+fprintf('Pre-processing receiver chain...\n'); -+l = 1; % Use channel 1 for optimization -+ -+Opt_sig_demux = Optical_Demultiplex("attenuation",0,"B",200e9,"filtype",1, ... -+ "fs_out",fdac*kover,"fs_in",fdac*kover*upsample_pow,"lambda_center",1310).process(Opt_sig_wdm_fib); -+ -+Opt_sig_rx = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power", ... -+ "amplification_db",s.rop).process(Opt_sig_demux{l}); -+ -+PD_sig = Photodiode("fsimu",fdac*kover,"dark_current",2e-08,"responsivity",1,"temperature",20, ... -+ "nep",1.8e-11,"randomkey",s.random_key+l).process(Opt_sig_rx); -+ -+rx_bwl = 100e9; -+PD_sig = Filter('filtdegree',4,"f_cutoff",rx_bwl,"fs",fdac*kover, ... -+ "filterType",filtertypes.butterworth,"active",true).process(PD_sig); -+ -+Lp_scpe = Filter('filtdegree',4,"f_cutoff",80e9,"fs",fadc,"filterType",filtertypes.butterworth,"active",true); -+Scpe_sig = Scope("fsimu",fdac*kover,"fadc",fadc, ... -+ "delay",0,"fixed_delay",0,"filtertype",filtertypes.butterworth, ... -+ "samplingdelay",0,"rand_samplingdelay",0,"freq_offset",0,"samp_jitter",0, ... -+ "adcresolution",8,"quantbuffer",0.1,'block_dc',1,'lpf_active',0,'H_lpf',Lp_scpe).process(PD_sig); -+ -+Scpe_sig_2sps = Scpe_sig.resample("fs_out",2*fsym); -+ -+[~, Scpe_cell, ~, ~] = Scpe_sig_2sps.tsynch("reference", Symbols{l}, "fs_ref", fsym, "debug_plots", 0); -+Rx_sig = Scpe_cell{1}; -+Rx_sig = Rx_sig.normalize("mode","rms"); -+ -+fprintf('Receiver pre-processing complete. Ready for optimization.\n\n'); -+ -+%% Define the objective function for bayesopt -+function ber = ffe_objective(params, Rx_sig, Symbols_l, Tx_bits_l, M, duob_mode) -+mu_dd = params.mu_dd; -+mu_tr = params.mu_tr; -+ -+try -+ eq_ffe = FFE("epochs_tr", 5, "epochs_dd", 2, "len_tr", 2^13, ... -+ "mu_dd", mu_dd, "mu_tr", mu_tr, ... -+ "order", 50, "sps", 2, "decide", 0, ... -+ "adaption", adaption_method.nlms, "dd_mode", 1); -+ -+ ffe_results = ffe(eq_ffe, M, Rx_sig, Symbols_l, Tx_bits_l, ... -+ "precode_mode", duob_mode, ... -+ 'showAnalysis', 0, ... -+ "postFFE", [], ... -+ "eth_style_symbol_mapping", 0); -+ -+ ber = ffe_results.metrics.BER; -+ -+ if ber == 0 -+ ber = 1e-10; -+ end -+ -+ if ~isfinite(ber) -+ ber = 0.5; -+ end -+ -+ fprintf(' mu_dd=%.4e, mu_tr=%.4e -> BER=%.4e\n', mu_dd, mu_tr, ber); -+ -+catch ME -+ fprintf(' mu_dd=%.4e, mu_tr=%.4e -> FAILED (%s)\n', mu_dd, mu_tr, ME.message); -+ ber = 0.5; -+end -+end -+ -+%% Define optimizable variables -+mu_dd_var = optimizableVariable('mu_dd', [1e-5, 0.1], 'Transform', 'log'); -+mu_tr_var = optimizableVariable('mu_tr', [1e-5, 0.1], 'Transform', 'log'); -+ -+%% Run Bayesian Optimization -+fprintf('========== Starting Bayesian Optimization ==========\n'); -+fprintf('Optimizing mu_dd and mu_tr to minimize BER\n'); -+fprintf('Search range: mu_dd=[1e-5, 0.1], mu_tr=[1e-5, 0.1]\n\n'); -+ -+objective_fn = @(params) ffe_objective(params, Rx_sig, Symbols{l}, Tx_bits{l}, s.M, duob_mode); -+ -+results = bayesopt(objective_fn, [mu_dd_var, mu_tr_var], ... -+ 'MaxObjectiveEvaluations', 30, ... -+ 'AcquisitionFunctionName', 'expected-improvement-plus', ... -+ 'IsObjectiveDeterministic', false, ... -+ 'ExplorationRatio', 0.5, ... -+ 'Verbose', 1, ... -+ 'PlotFcn', []); -+ -+%% Display Results -+fprintf('\n========== FFE Optimization Complete ==========\n'); -+fprintf('Best FFE parameters found:\n'); -+fprintf(' mu_dd = %.6e\n', results.XAtMinObjective.mu_dd); -+fprintf(' mu_tr = %.6e\n', results.XAtMinObjective.mu_tr); -+fprintf(' BER = %.6e\n', results.MinObjective); -+ -+%% Verify with optimal parameters -+fprintf('\nVerifying optimal FFE parameters...\n'); -+best_mu_dd = results.XAtMinObjective.mu_dd; -+best_mu_tr = results.XAtMinObjective.mu_tr; -+ -+eq_ffe_best = FFE("epochs_tr", 5, "epochs_dd", 2, "len_tr", 2^13, ... -+ "mu_dd", best_mu_dd, "mu_tr", best_mu_tr, ... -+ "order", 50, "sps", 2, "decide", 0, ... -+ "adaption", adaption_method.nlms, "dd_mode", 1); -+ -+ffe_results_best = ffe(eq_ffe_best, s.M, Rx_sig, Symbols{l}, Tx_bits{l}, ... -+ "precode_mode", duob_mode, ... -+ 'showAnalysis', 1, ... -+ "postFFE", [], ... -+ "eth_style_symbol_mapping", 0); -+ -+fprintf('\nFinal FFE BER with optimal parameters: %.6e\n', ffe_results_best.metrics.BER); -diff --git a/test/bitwise_demapping_pam6.m b/test/bitwise_demapping_pam6.m -new file mode 100644 -index 0000000..6ea0b3d ---- /dev/null -+++ b/test/bitwise_demapping_pam6.m -@@ -0,0 +1,43 @@ -+ -+ -+%%%%% SETTINGS %%%%%% -+useprbs = 1; -+M = 8; -+randkey = 1; -+fsym = 112e9; -+viewresults = 0; -+ -+%%%%% Mapping %%%%% -+M = 6; -+data = 0:M-1; -+bitpersymbol = log2(M); -+ -+s = RandStream('twister','Seed',1); -+bitpattern = randi(s,[0 1], 2^18, 1); -+bitpattern = bitpattern(1:end-mod(length(bitpattern),5)); -+ -+bits_tx = Informationsignal(bitpattern); -+ -+symbols = PAMmapper(M,0).map(bits); -+ -+pam6transitions = combvec(PAMmapper(M,0).levels,PAMmapper(M,0).levels)'; -+ -+pam6bits = PAMmapper(6,0,"eth_style",0).demap(reshape(pam6transitions',[],1)./sqrt(10)); -+symbols_rx = PAMmapper(M,0).map(pam6bits).*sqrt(10); -+ -+pam6bits = reshape(pam6bits',5,[])'; -+ -+figure; hold on -+scatter(pam6transitions(:,1), pam6transitions(:,2), 'x', 'LineWidth', 1); -+n = size(pam6transitions,1); -+labels = cellstr(char(pam6bits + '0')); % -> N x 1 cell array of char rows -+text(pam6transitions(:,1), pam6transitions(:,2), labels, ... -+ 'HorizontalAlignment','left', 'VerticalAlignment','bottom'); -+ -+ -+ -+bits_rx = PAMmapper(M,0).demap(symbols); -+ -+[~,error_num,ber,error_pos] = calc_ber(bits_tx.signal,bits_rx.signal,"skip_front",0,"skip_end",0,"returnErrorLocation",1); -+ -+PAMmapper(8,0).showBitMapping -\ No newline at end of file -diff --git a/test/duobinary_minimal_example.m b/test/duobinary_minimal_example.m -index d61c044..c39183e 100644 ---- a/test/duobinary_minimal_example.m -+++ b/test/duobinary_minimal_example.m -@@ -29,9 +29,6 @@ para.skip =0; - para.bruijn = 0; - para.reset_prms = 0; - para.method = 1; --para.pcs = 0; --para.shape_para = 0; --para.rng_num = 0; -  - data_in = []; - global loop; -diff --git a/test/gpu_cpu_comparison.m b/test/gpu_cpu_comparison.m -new file mode 100644 -index 0000000..02d40ba ---- /dev/null -+++ b/test/gpu_cpu_comparison.m -@@ -0,0 +1,349 @@ -+%% GPU vs CPU Comparison Test for DP_Fiber -+% This script runs the fiber simulation with and without GPU acceleration -+% and compares the numerical results. -+ -+% clear; clc; -+ -+%% Setup (same as gpu_processing_dpfiber.m but simplified) -+s.wavelengthplan = calcWavelengthPlan(4, 400e9, 1310); -+link_length = 10; -+s.pmd = 0.1; -+s.gamma = 0.0023; -+ -+s.M = 4; -+fsym = 112e9; -+fdac = 2*fsym; -+fadc = 120000000000; -+s.random_key = 1; -+ -+% Laser / Modulator -+vbias_rel = 0.5; -+u_pi = 4.6; -+vbias = -vbias_rel*u_pi; -+laser_linewidth = 0e6; -+ -+% DB Stuff -+duob_mode = db_mode.no_db; -+ -+rcalpha = 0.05; -+Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rc","pulselength",16,"alpha",rcalpha); -+ -+s.chirpalpha = 0; -+s.p_launch = 3; -+s.p = "co"; -+ -+N = numel(s.wavelengthplan); -+ -+switch s.p -+ case "co" -+ pol_rot = 100.*ones(1,N); -+ d_local = 0; -+ case "pair" -+ pol_rot = repmat([100,100,0,0],1,N/4); -+ d_local = 0; -+ case "alt" -+ pol_rot = repmat([100,0,100,0],1,N/4); -+ d_local = 0; -+ case "seg" -+ pol_rot = 100.*ones(1,N); -+ d_local = 3; -+ otherwise -+ error('Unknown fwm_mitigation_technique: %s', string(s.p)); -+end -+ -+f_plan = physconst('lightspeed')./(s.wavelengthplan.*1e-9); -+margin = 5e12; -+f_span = (max(f_plan)+margin)-(min(f_plan)-margin); -+f_nyq = f_span/2; -+ -+kover = 4; -+upsample_required = f_nyq./(fdac*kover/2); -+upsample_pow = 2^nextpow2(upsample_required); -+ -+s.f_opt = fdac*kover*upsample_pow; -+s.f_opt_nyq = s.f_opt/2; -+ -+%% TX per channel -+for l = 1:N -+ [Digi_sig,Symbols{l},Tx_bits{l}] = PAMsource( ... -+ "fsym",fsym,"M",s.M,"order",15,"useprbs",0, ... -+ "fs_out",fdac, ... -+ "applyclipping",0,"clipfactor",1.5, ... -+ "applypulseform",1,"pulseformer",Pform, ... -+ "randkey",s.random_key+l, ... -+ "mrds_code",0,"mrds_blocklength",512,"duobinary_mode",duob_mode ... -+ ).process(); -+ -+ Lp_awg = Filter('filtdegree',3,"f_cutoff",56e9,"fs",fdac*kover, ... -+ "filterType",filtertypes.gaussian,"active",true); -+ -+ El_sig = AWG("fdac",fdac,"f_cutoff",fsym,"lpf_active",1,"kover",kover, ... -+ "bit_resolution",6,"upsampling_method","samplehold","precomp_sinc_rolloff",0, ... -+ "H_lpf",Lp_awg,"dac_max",0.6,"dac_min",-0.6).process(Digi_sig); -+ -+ clear Digi_sig -+ -+ El_sig = El_sig.normalize("mode","oneone"); -+ scaling = 0.6*(u_pi/2-abs(vbias-u_pi/2)); -+ El_sig = El_sig .* scaling; -+ -+ Eml_out = EML("mode",eml_mode.im_cosinus,"power",3,"fsimu",El_sig.fs, ... -+ "lambda",s.wavelengthplan(l),"bias",vbias,"u_pi",u_pi, ... -+ "linewidth",laser_linewidth,"randomkey",s.random_key+l,"alpha",s.chirpalpha).process(El_sig); -+ -+ clear El_sig -+ -+ signal_cell{l} = Polarization_Controller("mode","rot_power","desired_power",pol_rot(l)).process(Eml_out); -+ -+ clear Eml_out Lp_awg -+end -+ -+disp('Signal generated for all channels.'); -+ -+%% WDM mux + launch -+Opt_sig_wdm = Optical_Multiplex("fs_in",fdac*kover,"fs_out",upsample_pow*fdac*kover, ... -+ "lambda_center",1310,"random_key",0,"filtype",1,"B",120e9).process(signal_cell); -+ -+Opt_sig_wdm = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power", ... -+ "amplification_db",s.p_launch+10*log10(N)).process(Opt_sig_wdm); -+ -+% Save input for both runs -+Opt_sig_input = Opt_sig_wdm; -+ -+segment_length = 1; -+nSegments = link_length/segment_length; -+if abs(nSegments - round(nSegments)) > 1e-12 -+ error('fiber_length_km=%g must be an integer multiple of segment_length=%g km.', link_length, segment_length); -+end -+nSegments = round(nSegments); -+ -+zdw = 1310; -+randomize_D = true; -+ -+if nSegments > 0 -+ Dvec = getDispersionVector(nSegments, d_local, zdw, randomize_D, s.random_key); -+else -+ Dvec = []; -+end -+ -+%% Run WITHOUT GPU -+fprintf('\n========== Running WITHOUT GPU (CPU) ==========\n'); -+Opt_sig_cpu = Opt_sig_input; -+ -+tic; -+for seg = 1:nSegments -+ fprintf('CPU Segment %d/%d \n',seg, nSegments); -+ -+ Opt_sig_cpu = DP_Fiber("L",segment_length,"D",Dvec(seg),"Dpmd",s.pmd,"Ds",0.07, ... -+ "beat_len",10,"corr_len",100,"dz",1,"manakov",0, ... -+ "gamma",s.gamma,"lambda",zdw,"n_waveplates",10,"SS_dphimax",0.01, ... -+ "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1,"useGPU",false).process(Opt_sig_cpu); -+end -+time_cpu = toc; -+fprintf('CPU Time: %.3f seconds\n', time_cpu); -+ -+%% Run WITH GPU (Double Precision) -+fprintf('\n========== Running WITH GPU (Double Precision) ==========\n'); -+Opt_sig_gpu_double = Opt_sig_input; -+ -+tic; -+for seg = 1:nSegments -+ fprintf('GPU-Double Segment %d/%d \n',seg, nSegments); -+ -+ Opt_sig_gpu_double = DP_Fiber("L",segment_length,"D",Dvec(seg),"Dpmd",s.pmd,"Ds",0.07, ... -+ "beat_len",10,"corr_len",100,"dz",1,"manakov",0, ... -+ "gamma",s.gamma,"lambda",zdw,"n_waveplates",10,"SS_dphimax",0.01, ... -+ "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1,"useGPU",true,"useSingle",false).process(Opt_sig_gpu_double); -+end -+time_gpu_double = toc; -+fprintf('GPU Double Time: %.3f seconds\n', time_gpu_double); -+ -+%% Run WITH GPU (Single Precision) -+fprintf('\n========== Running WITH GPU (Single Precision) ==========\n'); -+Opt_sig_gpu_single = Opt_sig_input; -+ -+tic; -+for seg = 1:nSegments -+ fprintf('GPU-Single Segment %d/%d \n',seg, nSegments); -+ -+ Opt_sig_gpu_single = DP_Fiber("L",segment_length,"D",Dvec(seg),"Dpmd",s.pmd,"Ds",0.07, ... -+ "beat_len",10,"corr_len",100,"dz",1,"manakov",0, ... -+ "gamma",s.gamma,"lambda",zdw,"n_waveplates",10,"SS_dphimax",0.01, ... -+ "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1,"useGPU",true,"useSingle",true).process(Opt_sig_gpu_single); -+end -+time_gpu_single = toc; -+fprintf('GPU Single Time: %.3f seconds\n', time_gpu_single); -+ -+%% Compare Results -+fprintf('\n========== Numerical Comparison ==========\n'); -+ -+sig_cpu = Opt_sig_cpu.signal; -+sig_gpu_double = Opt_sig_gpu_double.signal; -+sig_gpu_single = Opt_sig_gpu_single.signal; -+ -+% Check dimensions -+fprintf('CPU signal size: [%d x %d]\n', size(sig_cpu,1), size(sig_cpu,2)); -+fprintf('GPU Double signal size: [%d x %d]\n', size(sig_gpu_double,1), size(sig_gpu_double,2)); -+fprintf('GPU Single signal size: [%d x %d]\n', size(sig_gpu_single,1), size(sig_gpu_single,2)); -+ -+% CPU vs GPU Double -+fprintf('\n--- CPU vs GPU Double ---\n'); -+diff_cpu_double = abs(sig_cpu - sig_gpu_double); -+max_diff_cpu_double = max(diff_cpu_double(:)); -+mean_diff_cpu_double = mean(diff_cpu_double(:)); -+rel_diff_cpu_double = max_diff_cpu_double / max(abs(sig_cpu(:))); -+fprintf('Max absolute difference: %.6e\n', max_diff_cpu_double); -+fprintf('Mean absolute difference: %.6e\n', mean_diff_cpu_double); -+fprintf('Max relative difference: %.6e\n', rel_diff_cpu_double); -+ -+% CPU vs GPU Single -+fprintf('\n--- CPU vs GPU Single ---\n'); -+diff_cpu_single = abs(sig_cpu - sig_gpu_single); -+max_diff_cpu_single = max(diff_cpu_single(:)); -+mean_diff_cpu_single = mean(diff_cpu_single(:)); -+rel_diff_cpu_single = max_diff_cpu_single / max(abs(sig_cpu(:))); -+fprintf('Max absolute difference: %.6e\n', max_diff_cpu_single); -+fprintf('Mean absolute difference: %.6e\n', mean_diff_cpu_single); -+fprintf('Max relative difference: %.6e\n', rel_diff_cpu_single); -+ -+% GPU Double vs GPU Single -+fprintf('\n--- GPU Double vs GPU Single ---\n'); -+diff_double_single = abs(sig_gpu_double - sig_gpu_single); -+max_diff_double_single = max(diff_double_single(:)); -+mean_diff_double_single = mean(diff_double_single(:)); -+rel_diff_double_single = max_diff_double_single / max(abs(sig_gpu_double(:))); -+fprintf('Max absolute difference: %.6e\n', max_diff_double_single); -+fprintf('Mean absolute difference: %.6e\n', mean_diff_double_single); -+fprintf('Max relative difference: %.6e\n', rel_diff_double_single); -+ -+% Check tolerances -+fprintf('\n--- Tolerance Check ---\n'); -+tol_double = 1e-10; -+tol_single = 1e-5; % Single precision has ~7 significant digits -+ -+if max_diff_cpu_double < tol_double -+ fprintf('✓ CPU vs GPU Double: EQUIVALENT (diff < %.0e)\n', tol_double); -+else -+ fprintf('✗ CPU vs GPU Double: DIFFER beyond tolerance (%.0e)\n', tol_double); -+end -+ -+if max_diff_cpu_single < tol_single -+ fprintf('✓ CPU vs GPU Single: ACCEPTABLE (diff < %.0e)\n', tol_single); -+else -+ fprintf('⚠ CPU vs GPU Single: Precision loss detected (diff = %.2e, tol = %.0e)\n', max_diff_cpu_single, tol_single); -+end -+ -+% Performance comparison -+fprintf('\n========== Performance Summary ==========\n'); -+fprintf('CPU Time: %.3f s\n', time_cpu); -+fprintf('GPU Double Time: %.3f s\n', time_gpu_double); -+fprintf('GPU Single Time: %.3f s\n', time_gpu_single); -+fprintf('\n'); -+fprintf('Speedup (GPU Double vs CPU): %.2fx\n', time_cpu/time_gpu_double); -+fprintf('Speedup (GPU Single vs CPU): %.2fx\n', time_cpu/time_gpu_single); -+fprintf('Speedup (GPU Single vs GPU Double): %.2fx\n', time_gpu_double/time_gpu_single); -+ -+%% ========== BER Comparison ========== -+% Process each fiber output through simplified receiver to check if -+% single-precision affects actual BER performance -+ -+fprintf('\n========== BER Comparison ==========\n'); -+fprintf('Processing signals through receiver chain...\n'); -+ -+% Receiver parameters -+rop = -7; % Received optical power [dBm] -+len_tr = 4096; % Training length -+mu_dc = 0.005; -+mu_ffe = [0.0001 0.0008 0.001]; -+mu_dfe = 0.0004; -+ -+% Helper function to process through receiver and get BER -+function ber = process_receiver(Opt_sig_fib, l, Symbols, Tx_bits, ... -+ fdac, kover, upsample_pow, fsym, fadc, rop, s, len_tr, mu_dc, mu_ffe, mu_dfe, duob_mode) -+ -+% Demux single channel -+Opt_sig_demux = Optical_Demultiplex("attenuation",0,"B",200e9,"filtype",1, ... -+ "fs_out",fdac*kover,"fs_in",fdac*kover*upsample_pow,"lambda_center",1310).process(Opt_sig_fib); -+ -+% ROP amplifier -+Opt_sig_rx = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power", ... -+ "amplification_db",rop).process(Opt_sig_demux{l}); -+ -+% Photodiode -+PD_sig = Photodiode("fsimu",fdac*kover,"dark_current",2e-08,"responsivity",1,"temperature",20, ... -+ "nep",1.8e-11,"randomkey",s.random_key+l).process(Opt_sig_rx); -+ -+% Low-pass filter -+rx_bwl = 100e9; -+PD_sig = Filter('filtdegree',4,"f_cutoff",rx_bwl,"fs",fdac*kover, ... -+ "filterType",filtertypes.butterworth,"active",true).process(PD_sig); -+ -+% Scope -+Lp_scpe = Filter('filtdegree',4,"f_cutoff",80e9,"fs",fadc,"filterType",filtertypes.butterworth,"active",true); -+Scpe_sig = Scope("fsimu",fdac*kover,"fadc",fadc, ... -+ "delay",0,"fixed_delay",0,"filtertype",filtertypes.butterworth, ... -+ "samplingdelay",0,"rand_samplingdelay",0,"freq_offset",0,"samp_jitter",0, ... -+ "adcresolution",8,"quantbuffer",0.1,'block_dc',1,'lpf_active',0,'H_lpf',Lp_scpe).process(PD_sig); -+ -+% Resample to 2 sps -+Scpe_sig_2sps = Scpe_sig.resample("fs_out",2*fsym); -+ -+% Time sync -+[~, Scpe_cell, ~, ~] = Scpe_sig_2sps.tsynch("reference", Symbols{l}, "fs_ref", fsym, "debug_plots", 0); -+Rx_sig = Scpe_cell{1}; -+Rx_sig = Rx_sig.normalize("mode","rms"); -+ -+% FFE Equalizer -+ffe_order = [50, 0, 0]; -+eq_ffe = EQ("Ne",ffe_order,"Nb",[0,0,0],"training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",0); -+ -+ffe_results = ffe(eq_ffe,s.M,Rx_sig,Symbols{l},Tx_bits{l}, ... -+ "precode_mode",duob_mode, ... -+ 'showAnalysis',0, ... -+ "postFFE",[], ... -+ "eth_style_symbol_mapping",0); -+ -+ber = ffe_results.metrics.BER; -+end -+ -+% Process each mode for channel 1 -+l = 4; % Use first channel for comparison -+ -+fprintf('Processing CPU result...\n'); -+ber_cpu = process_receiver(Opt_sig_cpu, l, Symbols, Tx_bits, ... -+ fdac, kover, upsample_pow, fsym, fadc, rop, s, len_tr, mu_dc, mu_ffe, mu_dfe, duob_mode); -+ -+fprintf('Processing GPU Double result...\n'); -+ber_gpu_double = process_receiver(Opt_sig_gpu_double, l, Symbols, Tx_bits, ... -+ fdac, kover, upsample_pow, fsym, fadc, rop, s, len_tr, mu_dc, mu_ffe, mu_dfe, duob_mode); -+ -+fprintf('Processing GPU Single result...\n'); -+ber_gpu_single = process_receiver(Opt_sig_gpu_single, l, Symbols, Tx_bits, ... -+ fdac, kover, upsample_pow, fsym, fadc, rop, s, len_tr, mu_dc, mu_ffe, mu_dfe, duob_mode); -+ -+% Display BER results -+fprintf('\n========== BER Results (Channel %d, ROP = %d dBm) ==========\n', l, rop); -+fprintf('CPU: BER = %.4e\n', ber_cpu); -+fprintf('GPU Double: BER = %.4e\n', ber_gpu_double); -+fprintf('GPU Single: BER = %.4e\n', ber_gpu_single); -+ -+fprintf('\n--- BER Comparison ---\n'); -+if ber_cpu == 0 && ber_gpu_double == 0 && ber_gpu_single == 0 -+ fprintf('✓ All BERs are zero (no errors detected)\n'); -+else -+ ber_diff_double = abs(ber_cpu - ber_gpu_double); -+ ber_diff_single = abs(ber_cpu - ber_gpu_single); -+ fprintf('|BER_cpu - BER_gpu_double| = %.4e\n', ber_diff_double); -+ fprintf('|BER_cpu - BER_gpu_single| = %.4e\n', ber_diff_single); -+ -+ if ber_diff_double < 1e-6 && ber_diff_single < 1e-6 -+ fprintf('✓ BER differences are negligible\n'); -+ elseif ber_diff_single > ber_diff_double * 10 -+ fprintf('⚠ Single precision shows measurable BER impact\n'); -+ else -+ fprintf('✓ BER differences within acceptable range\n'); -+ end -+end -+ -+fprintf('\n========== Test Complete ==========\n'); -diff --git a/test/gpu_processing_dpfiber.m b/test/gpu_processing_dpfiber.m -new file mode 100644 -index 0000000..317833e ---- /dev/null -+++ b/test/gpu_processing_dpfiber.m -@@ -0,0 +1,265 @@ -+ -+ -+s.wavelengthplan = calcWavelengthPlan(16, 400e9, 1310); -+N = numel(s.wavelengthplan); -+link_length = 10; -+s.pmd = 0.1;%0.1; -+s.gamma = 0.0023; -+ -+s.M = 4; -+fsym = 112e9; -+fdac = 2*fsym; -+fadc = 120000000000; -+s.random_key = 1; -+ -+% Laser / s.Modulator -+vbias_rel = 0.5; -+u_pi = 4.6; -+vbias = -vbias_rel*u_pi; -+laser_linewidth = 0e6; -+ -+% DB Stuff -+duob_mode = db_mode.no_db; -+ -+rcalpha = 0.05; -+Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rc","pulselength",16,"alpha",rcalpha); -+ -+s.chirpalpha = 0; -+ -+s.p_launch = 3; -+s.p = "co"; -+ -+switch s.p -+ case "co" -+ pol_rot = 100.*ones(1,N); -+ d_local = 0; -+ case "pair" -+ pol_rot = repmat([100,100,0,0],1,N/4); -+ d_local = 0; -+ case "alt" -+ pol_rot = repmat([100,0,100,0],1,N/4); -+ d_local = 0; -+ case "seg" -+ pol_rot = 100.*ones(1,N); -+ d_local = 3; -+ otherwise -+ error('Unknown fwm_mitigation_technique: %s', string(s.p)); -+end -+ -+f_plan = physconst('lightspeed')./(s.wavelengthplan.*1e-9); -+margin = 25e12; % some THz left and right -+f_span = (max(f_plan)+margin)-(min(f_plan)-margin); -+f_nyq = f_span/2; -+ -+kover = 4; -+upsample_required = f_nyq./(fdac*kover/2); -+upsample_pow = 2^nextpow2(upsample_required); -+ -+s.f_opt = fdac*kover*upsample_pow; -+s.f_opt_nyq = s.f_opt/2; -+ -+s.rop = -10:1:0; -+ -+profile on -+ -+%% ---------- TX per channel ---------- -+for l = 1:N -+ -+ [Digi_sig,Symbols{l},Tx_bits{l}] = PAMsource( ... -+ "fsym",fsym,"M",s.M,"order",17,"useprbs",0, ... -+ "fs_out",fdac, ... -+ "applyclipping",0,"clipfactor",1.5, ... -+ "applypulseform",1,"pulseformer",Pform, ... -+ "randkey",s.random_key+l, ... -+ "mrds_code",0,"mrds_blocklength",512,"duobinary_mode",duob_mode ... -+ ).process(); -+ -+ Lp_awg = Filter('filtdegree',3,"f_cutoff",56e9,"fs",fdac*kover, ... -+ "filterType",filtertypes.gaussian,"active",true); -+ -+ El_sig = AWG("fdac",fdac,"f_cutoff",fsym,"lpf_active",1,"kover",kover, ... -+ "bit_resolution",6,"upsampling_method","samplehold","precomp_sinc_rolloff",0, ... -+ "H_lpf",Lp_awg,"dac_max",0.6,"dac_min",-0.6).process(Digi_sig); -+ -+ % Digi_sig not needed after AWG -+ clear Digi_sig -+ -+ % Electrical Driver Amplifier -+ El_sig = El_sig.normalize("mode","oneone"); -+ scaling = 0.6*(u_pi/2-abs(vbias-u_pi/2)); -+ El_sig = El_sig .* scaling; -+ -+ % E/O Conversion -+ Eml_out = EML("mode",eml_mode.im_cosinus,"power",3,"fsimu",El_sig.fs, ... -+ "lambda",s.wavelengthplan(l),"bias",vbias,"u_pi",u_pi, ... -+ "linewidth",laser_linewidth,"randomkey",s.random_key+l,"alpha",s.chirpalpha).process(El_sig); -+ -+ % El_sig not needed after EML -+ clear El_sig -+ -+ signal_cell{l} = Polarization_Controller("mode","rot_power","desired_power",pol_rot(l)).process(Eml_out); -+ -+ % Eml_out not needed after pol controller -+ clear Eml_out Lp_awg -+end -+ -+disp('Signal generated for all channels.'); -+ -+%% ---------- WDM mux + launch ---------- -+Opt_sig_wdm = Optical_Multiplex("fs_in",fdac*kover,"fs_out",upsample_pow*fdac*kover, ... -+ "lambda_center",1310,"random_key",0,"filtype",1,"B",120e9).process(signal_cell); -+ -+Opt_sig_wdm.spectrum(); -+ -+Opt_sig_wdm = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power", ... -+ "amplification_db",s.p_launch+10*log10(N)).process(Opt_sig_wdm); -+ -+Opt_sig_wdm_fib = Opt_sig_wdm; -+ -+segment_length = 1; -+nSegments = link_length/segment_length; -+if abs(nSegments - round(nSegments)) > 1e-12 -+ error('fiber_length_km=%g must be an integer multiple of segment_length=%g km.', link_length, segment_length); -+end -+nSegments = round(nSegments); -+ -+zdw = 1310; -+randomize_D = true; -+ -+% Guard for 0 km: avoid calling getDispersionVector(0,...) if it doesn't support it -+if nSegments > 0 -+ Dvec = getDispersionVector(nSegments, d_local, zdw, randomize_D, s.random_key); -+else -+ Dvec = []; -+end -+ -+for seg = 1:nSegments -+ -+ fprintf('Segment %d/%d \n',seg, nSegments); -+ -+ Opt_sig_wdm_fib = DP_Fiber("L",segment_length,"D",Dvec(seg),"Dpmd",s.pmd,"Ds",0.07, ... -+ "beat_len",10,"corr_len",100,"dz",1,"manakov",0, ... -+ "gamma",s.gamma,"lambda",zdw,"n_waveplates",10,"SS_dphimax",0.01, ... -+ "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1,"useGPU",true,"useSingle",1).process(Opt_sig_wdm_fib); -+ -+end -+ -+profile off -+profile viewer -+ -+Opt_sig_wdm_fib.spectrum(); -+ -+%% ========== BER Evaluation ========== -+fprintf('\n========== BER Evaluation ==========\n'); -+fprintf('Processing signals through receiver chain...\n'); -+ -+% Receiver parameters -+len_tr = 4096; % Training length -+mu_dc = 0.005; -+mu_ffe = [0.0001 0.0008 0.001]; -+mu_dfe = 0.0004; -+ -+% Helper function to process through receiver and get BER -+function ber = process_receiver(Opt_sig_fib, l, Symbols, Tx_bits, ... -+ fdac, kover, upsample_pow, fsym, fadc, rop, s, len_tr, mu_dc, mu_ffe, mu_dfe, duob_mode) -+ -+% Demux single channel -+Opt_sig_demux = Optical_Demultiplex("attenuation",0,"B",200e9,"filtype",1, ... -+ "fs_out",fdac*kover,"fs_in",fdac*kover*upsample_pow,"lambda_center",1310).process(Opt_sig_fib); -+ -+% ROP amplifier -+Opt_sig_rx = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power", ... -+ "amplification_db",rop).process(Opt_sig_demux{l}); -+ -+% Photodiode -+PD_sig = Photodiode("fsimu",fdac*kover,"dark_current",2e-08,"responsivity",1,"temperature",20, ... -+ "nep",1.8e-11,"randomkey",s.random_key+l).process(Opt_sig_rx); -+ -+% Low-pass filter -+rx_bwl = 100e9; -+PD_sig = Filter('filtdegree',4,"f_cutoff",rx_bwl,"fs",fdac*kover, ... -+ "filterType",filtertypes.butterworth,"active",true).process(PD_sig); -+ -+% Scope -+Lp_scpe = Filter('filtdegree',4,"f_cutoff",80e9,"fs",fadc,"filterType",filtertypes.butterworth,"active",true); -+Scpe_sig = Scope("fsimu",fdac*kover,"fadc",fadc, ... -+ "delay",0,"fixed_delay",0,"filtertype",filtertypes.butterworth, ... -+ "samplingdelay",0,"rand_samplingdelay",0,"freq_offset",0,"samp_jitter",0, ... -+ "adcresolution",8,"quantbuffer",0.1,'block_dc',1,'lpf_active',0,'H_lpf',Lp_scpe).process(PD_sig); -+ -+% Resample to 2 sps -+Scpe_sig_2sps = Scpe_sig.resample("fs_out",2*fsym); -+ -+% Time sync -+[~, Scpe_cell, ~, ~] = Scpe_sig_2sps.tsynch("reference", Symbols{l}, "fs_ref", fsym, "debug_plots", 0); -+Rx_sig = Scpe_cell{1}; -+Rx_sig = Rx_sig.normalize("mode","rms"); -+ -+% FFE Equalizer -+ffe_order = [50, 0, 0]; -+eq_ffe = EQ("Ne",ffe_order,"Nb",[0,0,0],"training_length",len_tr,"training_loops",5,"dd_loops",5, ... -+ "K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",0); -+eq_ffe = FFE("epochs_tr",5,"epochs_dd",2,"len_tr",2^13,"mu_dd",6.624e-05,"mu_tr",0.058136,"order",50,"sps",2,"decide",0, "adaption",adaption_method.nlms,"dd_mode",1); -+ -+ffe_results = ffe(eq_ffe,s.M,Rx_sig,Symbols{l},Tx_bits{l}, ... -+ "precode_mode",duob_mode, ... -+ 'showAnalysis',0, ... -+ "postFFE",[], ... -+ "eth_style_symbol_mapping",0); -+ -+ber = ffe_results.metrics.BER; -+end -+ -+% Process each ROP value for selected channels using parfor -+ber_results = zeros(length(s.rop), N); -+ -+% Flatten loop for parfor: iterate over all (ROP, channel) combinations -+num_rop = length(s.rop); -+rop_vals = s.rop; -+ber_flat = zeros(num_rop * N, 1); -+ -+parfor idx = 1:(num_rop * N) -+ % Convert linear index to (ri, l) subscripts -+ ri = ceil(idx / N); -+ l = mod(idx - 1, N) + 1; -+ -+ fprintf('ROP %d dBm, Channel %d/%d\n', rop_vals(ri), l, N); -+ ber_flat(idx) = process_receiver(Opt_sig_wdm_fib, l, Symbols, Tx_bits, ... -+ fdac, kover, upsample_pow, fsym, fadc, rop_vals(ri), s, len_tr, mu_dc, mu_ffe, mu_dfe, duob_mode); -+end -+ -+% Reshape back to [num_rop × N] matrix -+ber_results = reshape(ber_flat, [N, num_rop]).'; -+ -+ -+%% Display BER Results -+fprintf('\n========== BER Results ==========\n'); -+fprintf('ROP [dBm] | '); -+for l = 1:N -+ fprintf('Ch%d | ', l); -+end -+fprintf('\n'); -+ -+for ri = 1:length(s.rop) -+ fprintf('%8d | ', s.rop(ri)); -+ for l = 1:N -+ fprintf('%.2e | ', ber_results(ri, l)); -+ end -+ fprintf('\n'); -+end -+ -+% Plot BER vs ROP -+figure; -+semilogy(s.rop, mean(ber_results, 2), '-o', 'LineWidth', 2); -+hold on; -+for l = 1:N -+ semilogy(s.rop, ber_results(:, l), '--', 'LineWidth', 1); -+end -+hold off; -+xlabel('ROP [dBm]'); -+ylabel('BER'); -+title('BER vs Received Optical Power (GPU Single Precision)'); -+legend(['Mean', arrayfun(@(x) sprintf('Ch%d', x), 1:N, 'UniformOutput', false)]); -+grid on; -+ -+fprintf('\n========== Test Complete ==========\n'); -diff --git a/test/gpu_processing_test.m b/test/gpu_processing_test.m -new file mode 100644 -index 0000000..b08c03f ---- /dev/null -+++ b/test/gpu_processing_test.m -@@ -0,0 +1,70 @@ -+% 1. Setup Data OUTSIDE the timer -+d = gpuDevice; -+N = 10000; -+ -+fprintf('Preparing data...\n'); -+A_cpu_double = rand(N, N); % Create double on CPU -+A_cpu_single = single(A_cpu_double); % Create single on CPU -+ -+% Warmup run (wakes up the GPU from idle state) -+A_warm = gpuArray.rand(1000, 1000, 'single'); -+B_warm = A_warm * A_warm; -+wait(d);  -+ -+fprintf('------------------------------------------------\n'); -+ -+% TEST 1: Double Precision (The "Slow" way) -+% We move data to GPU first so we only measure calculation time -+A_gpu_double = gpuArray(A_cpu_double);  -+wait(d); % Ensure transfer is done before starting timer -+ -+fprintf('Running DOUBLE precision test... '); -+tic; -+B_gpu = A_gpu_double * A_gpu_double; -+wait(d); % FORCE MATLAB TO WAIT FOR GPU -+time_double = toc; -+fprintf('Done.\n'); -+fprintf('Double Precision Time: %.4f seconds\n', time_double); -+ -+% TEST 2: Single Precision (The "Fast" way) -+A_gpu_single = gpuArray(A_cpu_single); -+wait(d); % Ensure transfer is done -+ -+fprintf('Running SINGLE precision test... '); -+tic; -+B_gpu = A_gpu_single * A_gpu_single; -+wait(d); % FORCE MATLAB TO WAIT FOR GPU -+time_single = toc; -+fprintf('Done.\n'); -+fprintf('Single Precision Time: %.4f seconds\n', time_single); -+ -+% Calculate Speedup -+fprintf('------------------------------------------------\n'); -+fprintf('Speedup Factor using single precision: %.2fx\n', time_double / time_single); -+ -+% -+% Create 10,000 small matrices (10x10) stacked in a 3D array -+A_stack = gpuArray.rand(10, 10, 10000, 'single'); -+B_stack = gpuArray.rand(10, 10, 10000, 'single'); -+ -+% BAD: Looping (GPU overhead kills you) -+tic; -+for i=1:10000 -+ C(:,:,i) = A_stack(:,:,i) * B_stack(:,:,i); -+end -+wait(d); -+loop_time = toc; -+ -+% GOOD: Pagefun (Executes all 10,000 mults simultaneously) -+tic; -+C_stack = pagefun(@mtimes, A_stack, B_stack); -+wait(d); -+pagefun_time = toc; -+ -+fprintf('------------------------------------------------\n'); -+fprintf('Speedup Factor using pagefun: %.2fx\n', loop_time / pagefun_time); -+ -+ -+fprintf('Total VRAM: %.2f GB\n', d.TotalMemory / 1e9); -+fprintf('Available VRAM: %.2f GB\n', d.AvailableMemory / 1e9); -+fprintf('Usage: %.1f%%\n', 100 * (1 - d.AvailableMemory / d.TotalMemory)); -\ No newline at end of file diff --git a/tore --source rescue-premerge -- CUsersmagfDesktopDesktopMATLAB-ZeugsSilas DSPimdd_simulationClasses b/tore --source rescue-premerge -- CUsersmagfDesktopDesktopMATLAB-ZeugsSilas DSPimdd_simulationClasses deleted file mode 100644 index 9cb587a..0000000 --- a/tore --source rescue-premerge -- CUsersmagfDesktopDesktopMATLAB-ZeugsSilas DSPimdd_simulationClasses +++ /dev/null @@ -1,150 +0,0 @@ -diff --git a/Classes/00_signals/Signal.m b/Classes/00_signals/Signal.m -index e06c41f..f09a03e 100644 ---- a/Classes/00_signals/Signal.m -+++ b/Classes/00_signals/Signal.m -@@ -172,11 +172,9 @@ classdef Signal -  - hold on; - if isempty(options.color) -- % plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1); -- plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1); -+ plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1);  - else -- % plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1,'Color',options.color); -- plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Color',options.color); -+ plot(t* 1e6, sig(1:length(t)), 'DisplayName', dn, 'LineWidth', 0.1, 'Marker', '.', 'LineStyle','none', 'MarkerSize', 0.1,'Color',options.color);  - end - % 2 c) - % - xlabel if not already here: time in readable format (1 ms and not 1e-3 s) -diff --git a/Classes/02_optical/DP_Fiber.m b/Classes/02_optical/DP_Fiber.m -index a5f3dce..c1f08ea 100644 ---- a/Classes/02_optical/DP_Fiber.m -+++ b/Classes/02_optical/DP_Fiber.m -@@ -24,6 +24,8 @@ classdef DP_Fiber - SS_dzmax % [m] max dz (adaptive SSFM) - SS_dzmin % [m] min dz (adaptive SSFM) - n_waveplates % number of PMD waveplates -+ useGPU % GPU acceleration: true, false, or 'auto' (default) -+ useSingle % Use single precision on GPU (default: false) -  - % ---- Internal state (persistent between calls) ---- - state % struct mirroring legacy 'state' -@@ -56,6 +58,8 @@ classdef DP_Fiber - options.SS_dzmax = 2e4 % m - options.SS_dzmin = 100 % m - options.n_waveplates = 100 -+ options.useGPU = 'auto' % 'auto', true, or false -+ options.useSingle = false % single precision GPU - end -  - % Copy provided options into properties -@@ -208,7 +212,7 @@ classdef DP_Fiber - % Frequency-dependent PMD phase term (legacy form) - st.brf.db0 = (R.rand(st.wave_plates,1)*2*pi - pi) * brf_multiplier; - st.brf.db1 = sqrt(3*pi/8)*(st.dgd/obj.fa)/st.wave_plates .* st.omega; -- st.brf.simdgd = 0;  -+ st.brf.simdgd = 0; - % cumsum used in legacy only for debug; keep compatibility variable: - ~cumsum(st.brf.db0); % no-op to mirror legacy path -  -@@ -228,7 +232,18 @@ classdef DP_Fiber - x_in = signal_in(:,1).'; - y_in = signal_in(:,2).'; -  -- [x_out, y_out, obj.state] = CNLSE_plain(x_in, y_in, obj.state); -+ % Determine GPU usage -+ if ischar(obj.useGPU) || isstring(obj.useGPU) -+ if strcmpi(obj.useGPU, 'auto') -+ gpuFlag = []; % Let CNLSE_plain auto-detect -+ else -+ error('DP_Fiber:InvalidGPU', 'useGPU must be true, false, or ''auto'''); -+ end -+ else -+ gpuFlag = logical(obj.useGPU); -+ end -+ -+ [x_out, y_out, obj.state] = CNLSE_plain(x_in, y_in, obj.state, gpuFlag, obj.useSingle); -  - obj.state.propagated_length = obj.state.propagated_length + obj.state.L; -  -diff --git a/Classes/02_optical/Optical_Demultiplex.m b/Classes/02_optical/Optical_Demultiplex.m -index 7d7c39e..8e272d2 100644 ---- a/Classes/02_optical/Optical_Demultiplex.m -+++ b/Classes/02_optical/Optical_Demultiplex.m -@@ -42,7 +42,7 @@ classdef Optical_Demultiplex < handle -  - function signalclasses_out = process(obj, signalclass_in) -  -- % ---- Infer wavelength: either given or from input total signal  -+ % ---- Infer wavelength: either given or from input total signal - if isempty(obj.wavelengthplan) - obj.wavelengthplan = signalclass_in.lambda; %meter - else -@@ -81,7 +81,7 @@ classdef Optical_Demultiplex < handle - obj - signal_in - end --  -+ - w = obj.fs_out ./ obj.fs_in ; - blocklen_in = length(signal_in); - blocklen_out = w*blocklen_in; -@@ -119,30 +119,31 @@ classdef Optical_Demultiplex < handle - N = size(lo,1); - C = size(lo,2); -  -- x_envelopes = zeros(N, C, 'like', signal_in); -- y_envelopes = zeros(N, C, 'like', signal_in); -+ % ---- VECTORIZED: Process all channels in parallel ---- -+ % Batched FFT operates on each column simultaneously on GPU -  -- s1 = signal_in(:,1); -- s2 = signal_in(:,2); -+ % Extract polarization signals -+ s1 = signal_in(:,1); % X polarization [N×1] -+ s2 = signal_in(:,2); % Y polarization [N×1] -  -- % Reusable work buffers (avoid reallocations) -- wrk_time = zeros(N,1, 'like', signal_in); -- wrk_freq = zeros(N,1, 'like', signal_in); -+ % Broadcast signal to all channels and multiply with LO -+ % s1, s2 are [N×1], lo is [N×C] → result is [N×C] -+ x_mixed = att .* s1 .* lo; % [N×C] -+ y_mixed = att .* s2 .* lo; % [N×C] -+ -+ % Batched FFT: each column computed in parallel -+ x_freq = fft(x_mixed); % [N×C] -+ y_freq = fft(y_mixed); % [N×C] -+ -+ % Apply filter (H is [N×1], broadcasts across columns) -+ x_filtered = x_freq .* H; % [N×C] -+ y_filtered = y_freq .* H; % [N×C] -+ -+ % Batched IFFT -+ x_envelopes = ifft(x_filtered); % [N×C] -+ y_envelopes = ifft(y_filtered); % [N×C] -  -- for c = 1:C -- % ---- X branch ---- -- wrk_time(:) = att .* s1 .* lo(:,c); % N×1 -- wrk_freq(:) = fft(wrk_time); % N×1 -- wrk_freq(:) = wrk_freq .* H; % N×1 -- x_envelopes(:,c) = ifft(wrk_freq); % N×1 -  -- % ---- Y branch ---- -- wrk_time(:) = att .* s2 .* lo(:,c); -- wrk_freq(:) = fft(wrk_time); -- wrk_freq(:) = wrk_freq .* H; -- y_envelopes(:,c) = ifft(wrk_freq); -- end --  - end - end - end -diff --git a/Classes/02_optical/Optical_Multiplex.m b/Classes/02_optical/Optical_Multiplex.m -index 1d722b0..7fc8a33 100644 ---- a/Classes/02_optical/Optical_Multiplex.m -+++ b/Classes/02_optical/Optical_Multiplex.m -@@ -1,10 +1,10 @@ - classdef Optical_Multiplex < handle - % Ta \ No newline at end of file